summaryrefslogtreecommitdiff
path: root/winsup/cygwin/sync.h
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/sync.h')
-rw-r--r--winsup/cygwin/sync.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h
new file mode 100644
index 00000000000..dfe2c392112
--- /dev/null
+++ b/winsup/cygwin/sync.h
@@ -0,0 +1,73 @@
+/* sync.h: Header file for cygwin synchronization primitives.
+
+ Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+
+ 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. */
+
+#ifndef _SYNC_H
+#define _SYNC_H
+/* FIXME: Note that currently this class cannot be allocated via `new' since
+ there are issues with malloc and fork. */
+class muto
+{
+public:
+ const char *name;
+private:
+ static DWORD exiting_thread;
+ LONG sync; /* Used to serialize access to this class. */
+ LONG waiters; /* Number of threads waiting for lock. */
+ HANDLE bruteforce; /* event handle used to control waiting for lock. */
+public:
+ LONG visits; /* Count of number of times a thread has called acquire. */
+ void *tls; /* Tls of lock owner. */
+ // class muto *next;
+
+ /* The real constructor. */
+ muto *init (const char *) __attribute__ ((regparm (2)));
+
+#if 0 /* FIXME: See comment in sync.cc */
+ ~muto ()
+#endif
+ int acquire (DWORD ms = INFINITE) __attribute__ ((regparm (2))); /* Acquire the lock. */
+ int release () __attribute__ ((regparm (1))); /* Release the lock. */
+
+ bool acquired () __attribute__ ((regparm (1)));
+ void upforgrabs () {tls = this;} // just set to an invalid address
+ void grab () __attribute__ ((regparm (1)));
+ operator int () const {return !!name;}
+ static void set_exiting_thread () {exiting_thread = GetCurrentThreadId ();}
+};
+
+class lock_process
+{
+ bool skip_unlock;
+ static muto locker;
+public:
+ static void init () {locker.init ("lock_process");}
+ void dont_bother () {skip_unlock = true;}
+ lock_process (bool exiting = false)
+ {
+ locker.acquire ();
+ skip_unlock = exiting;
+ if (exiting && exit_state < ES_PROCESS_LOCKED)
+ {
+ exit_state = ES_PROCESS_LOCKED;
+ muto::set_exiting_thread ();
+ }
+ }
+ ~lock_process ()
+ {
+ if (!skip_unlock)
+ locker.release ();
+ }
+ friend class dtable;
+ friend class fhandler_fifo;
+};
+
+#endif /*_SYNC_H*/