1--- 2#include <stdio.h> 3#include <stdlib.h> 4#include <pthread.h> 5 6typedef struct lock_support { 7 volatile int locked; 8 pthread_mutex_t mutex; 9 pthread_cond_t cond; 10} lock_support_t; 11 12typedef struct mutex_node { 13 lock_support_t* mutex; 14 struct mutex_node* next; 15} mutex_node_t; 16 17lock_support_t* lock_support_init() { 18 lock_support_t * ls = (lock_support_t *) malloc(sizeof(lock_support_t)); 19 ls->locked = 0; 20 pthread_mutex_init(&ls->mutex, NULL); 21 pthread_cond_init(&ls->cond, NULL); 22 return ls; 23} 24 25mutex_node_t* mutex_node_init(mutex_node_t* mutexNode) { 26 mutexNode->mutex = lock_support_init(); 27 mutexNode->next = NULL; 28 return mutexNode; 29} 30 31void lock(lock_support_t* ls) { 32 pthread_mutex_lock(&ls->mutex); 33 while (ls->locked == 1) { // wait till locked are available 34 pthread_cond_wait(&ls->cond, &ls->mutex); 35 } 36 ls->locked = 1; 37 pthread_mutex_unlock(&ls->mutex); 38} 39 40void unlock(lock_support_t* ls) { 41 pthread_mutex_lock(&ls->mutex); 42 ls->locked = 0; 43 pthread_cond_broadcast(&ls->cond); 44 pthread_mutex_unlock(&ls->mutex); 45}