X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=geekos%2Finclude%2Fgeekos%2Fsynch.h;fp=geekos%2Finclude%2Fgeekos%2Fsynch.h;h=31bad01837f61b34ca1229482217b2f3631928ce;hp=0000000000000000000000000000000000000000;hb=ddc16b0737cf58f7aa90a69c6652cdf4090aec51;hpb=626595465a2c6987606a6bc697df65130ad8c2d3 diff --git a/geekos/include/geekos/synch.h b/geekos/include/geekos/synch.h new file mode 100644 index 0000000..31bad01 --- /dev/null +++ b/geekos/include/geekos/synch.h @@ -0,0 +1,47 @@ +/* + * Synchronization primitives + * Copyright (c) 2001, David H. Hovemeyer + * $Revision: 1.1 $ + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "COPYING". + */ + +#ifndef GEEKOS_SYNCH_H +#define GEEKOS_SYNCH_H + +#include + +/* + * mutex states + */ +enum { MUTEX_UNLOCKED, MUTEX_LOCKED }; + +struct Mutex { + int state; + struct Kernel_Thread* owner; + struct Thread_Queue waitQueue; +}; + +#define MUTEX_INITIALIZER { MUTEX_UNLOCKED, 0, THREAD_QUEUE_INITIALIZER } + +struct Condition { + struct Thread_Queue waitQueue; +}; + +void Mutex_Init(struct Mutex* mutex); +void Mutex_Lock(struct Mutex* mutex); +void Mutex_Unlock(struct Mutex* mutex); +void Mutex_Destroy(struct Mutex *mutex); + +void Cond_Init(struct Condition* cond); +void Cond_Wait(struct Condition* cond, struct Mutex* mutex); +int Cond_Wait_Timeout(struct Condition * cond, struct Mutex * mutex, uint_t ms); +void Cond_Signal(struct Condition* cond); +void Cond_Broadcast(struct Condition* cond); +void Cond_Destroy(struct Condition *cond); + +#define IS_HELD(mutex) \ + ((mutex)->state == MUTEX_LOCKED && (mutex)->owner == g_currentThread) + +#endif /* GEEKOS_SYNCH_H */