| /* 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 __reg2 *init (const char *); |
| |
| #if 0 /* FIXME: See comment in sync.cc */ |
| ~muto () |
| #endif |
| int __reg2 acquire (DWORD ms = INFINITE); /* Acquire the lock. */ |
| int __reg2 release (_cygtls * = &_my_tls); /* Release the lock. */ |
| |
| bool __reg1 acquired (); |
| void upforgrabs () {tls = this;} // just set to an invalid address |
| void __reg1 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; |
| }; |