summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sync.h
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/sync.h')
-rw-r--r--winsup/cygwin/sync.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h
index 3dcc915da..7215c2bd7 100644
--- a/winsup/cygwin/sync.h
+++ b/winsup/cygwin/sync.h
@@ -20,6 +20,7 @@ class muto
HANDLE bruteforce; /* event handle used to control waiting for lock. */
DWORD tid; /* Thread Id of lock owner. */
public:
+ class muto *next;
void *operator new (size_t, void *p) {return p;}
void *operator new (size_t) {return ::new muto; }
void operator delete (void *) {;} /* can't handle allocated mutos
@@ -27,7 +28,7 @@ public:
/* 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) {;}
+ muto(): sync(0), visits(0), waiters(-1), bruteforce(0), tid(0), next (0) {;}
/* A more complicated constructor. */
muto(int inh, const char *name);
~muto ();
@@ -40,11 +41,14 @@ public:
int unstable () {return !tid && (sync || waiters >= 0);}
};
+extern muto muto_start;
+
/* 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; \
+ muto *m = muto_start.next; \
+ muto_start.next = new (__mbuf) muto ((__inh), (__name)); \
+ muto_start.next->next = m; \
+ muto_start.next; \
})