Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/local_includes/sync.h')
-rw-r--r--winsup/cygwin/local_includes/sync.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/winsup/cygwin/local_includes/sync.h b/winsup/cygwin/local_includes/sync.h
new file mode 100644
index 000000000..d0b48782d
--- /dev/null
+++ b/winsup/cygwin/local_includes/sync.h
@@ -0,0 +1,67 @@
+/* sync.h: Header file for cygwin synchronization primitives.
+
+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. */
+
+#pragma once
+
+/* FIXME: Note that currently this class cannot be allocated via `new' since
+ there are issues with malloc and fork. */
+class muto
+{
+public:
+ char *name;
+private:
+ 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 *);
+
+#if 0 /* FIXME: See comment in sync.cc */
+ ~muto ()
+#endif
+ int acquire (DWORD ms = INFINITE); /* Acquire the lock. */
+ int release (_cygtls * = &_my_tls); /* Release the lock. */
+
+ bool acquired ();
+ void upforgrabs () {tls = this;} // just set to an invalid address
+ void grab ();
+ operator int () const {return !!name;}
+};
+
+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;
+ }
+ void release ()
+ {
+ locker.release ();
+ skip_unlock = true;
+ }
+ ~lock_process ()
+ {
+ if (!skip_unlock)
+ release ();
+ }
+ operator LONG () const {return locker.visits; }
+ static void force_release (_cygtls *tid) {locker.release (tid);}
+ friend class dtable;
+ friend class fhandler_fifo;
+};