diff options
author | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
commit | 1fd5e000ace55b323124c7e556a7a864b972a5c4 (patch) | |
tree | dc4fcf1e5e22a040716ef92c496b8d94959b2baa /winsup/cygwin/sync.h | |
parent | 369d8a8fd5e887eca547bf34bccfdf755c9e5397 (diff) | |
download | cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.gz cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.bz2 cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.zip |
import winsup-2000-02-17 snapshot
Diffstat (limited to 'winsup/cygwin/sync.h')
-rw-r--r-- | winsup/cygwin/sync.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h new file mode 100644 index 000000000..18cff7800 --- /dev/null +++ b/winsup/cygwin/sync.h @@ -0,0 +1,48 @@ +/* sync.h: Header file for cygwin synchronization primitives. + + Copyright 1999 Cygnus Solutions. + + Written by Christopher Faylor <cgf@cygnus.com> + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +/* FIXME: Note that currently this class cannot be allocated via `new' since + there are issues with malloc and fork. */ +class muto +{ + LONG sync; /* Used to serialize access to this class. */ + LONG visits; /* Count of number of times a thread has called acquire. */ + LONG waiters; /* Number of threads waiting for lock. */ + HANDLE bruteforce; /* event handle used to control waiting for lock. */ + DWORD tid; /* Thread Id of lock owner. */ +public: + void *operator new (size_t, void *p) {return p;} + void *operator new (size_t n) {return ::new muto; } + void operator delete (void *p) {;} /* can't handle allocated mutos + currently */ + + /* This simple constructor is used for cases where no bruteforce + event handling is required. */ + muto(): sync(0), visits(0), waiters(-1), bruteforce(0), tid(0) {;} + /* A more complicated constructor. */ + muto(int inh, const char *name); + ~muto (); + int acquire (DWORD ms = INFINITE); /* Acquire the lock. */ + int release (); /* Release the lock. */ + + /* Return true if caller thread owns the lock. */ + int ismine () {return tid == GetCurrentThreadId ();} +}; + +/* Use a statically allocated buffer as the storage for a muto */ +#define new_muto(__inh, __name) \ +({ \ + static NO_COPY char __mbuf[sizeof(class muto) + 100] = {0}; \ + muto *m; \ + m = new (__mbuf) muto ((__inh), (__name)); \ + m; \ +}) |