diff options
| author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 05:56:38 +0100 |
|---|---|---|
| committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 05:56:38 +0100 |
| commit | 19796a75ab8ba43b31e230ea169d5383c6392bfc (patch) | |
| tree | 3041c5678e06133dd7fcbf2ebf34b6506334f677 /libddekit/lock.c | |
| parent | 6b2e5e0d91823c2a6ce5a5cb12ae3d00b82adae7 (diff) | |
| parent | 8df772b3c665e663f6f9d2a70f9c691590bd3f91 (diff) | |
Merge branch 'dde' into upstream-merged
Diffstat (limited to 'libddekit/lock.c')
| -rw-r--r-- | libddekit/lock.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/libddekit/lock.c b/libddekit/lock.c new file mode 100644 index 00000000..e534bebe --- /dev/null +++ b/libddekit/lock.c @@ -0,0 +1,54 @@ +#include <cthreads.h> + +#include "ddekit/lock.h" +#include "ddekit/memory.h" + +#define DDEKIT_DEBUG_LOCKS 0 + +struct ddekit_lock { + struct mutex lock; + cthread_t helder; +}; + +void _ddekit_lock_init(struct ddekit_lock **mtx) { + struct ddekit_lock *lock; + + lock = (struct ddekit_lock *) ddekit_simple_malloc (sizeof *lock); + mutex_init (&lock->lock); + lock->helder = NULL; + *mtx = lock; +} + +void _ddekit_lock_deinit(struct ddekit_lock **mtx) { + mutex_free (*mtx); + *mtx = NULL; +} + +void _ddekit_lock_lock(struct ddekit_lock **mtx) { + mutex_lock (&(*mtx)->lock); + (*mtx)->helder = cthread_self (); +} + +/* returns 0 on success, != 0 if it would block */ +int _ddekit_lock_try_lock(struct ddekit_lock **mtx) { + if (mutex_try_lock (&(*mtx)->lock)) { /* lock succeessfully */ + (*mtx)->helder = cthread_self (); + return 0; + } + return -1; +} + +void _ddekit_lock_unlock(struct ddekit_lock **mtx) { + // TODO I wonder if it can cause any trouble. + (*mtx)->helder = NULL; + mutex_unlock (&(*mtx)->lock); +} + + +int _ddekit_lock_owner(struct ddekit_lock **mtx) { + /* The return value is the address of the holder. + * I hope it will be OK. At least, it is OK + * for the current implementation of DDE Linux/BSD */ + return (int) (*mtx)->helder; +} + |
