summaryrefslogtreecommitdiff
path: root/implement.h
diff options
context:
space:
mode:
Diffstat (limited to 'implement.h')
-rw-r--r--implement.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/implement.h b/implement.h
index 8297a46..bd74d55 100644
--- a/implement.h
+++ b/implement.h
@@ -118,6 +118,31 @@ struct pthread_attr_t_ {
* ====================
*/
+/*
+ * The following macros provide exclusive access to an object's pointer.
+ * See mutex.c:pthread_mutex_lock() for an example.
+ */
+
+#define PTW32_OBJECT_GET(type, ppObject, pDest) \
+ while (((pDest) = (type) InterlockedCompareExchangePointer((PVOID *)(ppObject), \
+ (PVOID)PTW32_OBJECT_IN_USE, \
+ (PVOID)PTW32_OBJECT_IN_USE)) \
+ == (type)PTW32_OBJECT_IN_USE) \
+ { \
+ Sleep(0); \
+ }
+
+#define PTW32_OBJECT_SET(ppObject, value) \
+ (void) InterlockedExchangePointer((PVOID *)(ppObject), (PVOID)(value))
+
+#define PTW32_OBJECT_TRYGET(type, ppObject, pDest) \
+ ((((pDest) = (type) InterlockedExchangePointer((PVOID *)(ppObject), \
+ (PVOID)PTW32_OBJECT_IN_USE)) \
+ == (type)PTW32_OBJECT_IN_USE) ? ((void) InterlockedExchangePointer((PVOID *)(ppObject), \
+ (PVOID)(pDest)) , 0) \
+ : 1)
+
+#define PTW32_OBJECT_IN_USE ((void *) -2)
#define PTW32_OBJECT_AUTO_INIT ((void *) -1)
#define PTW32_OBJECT_INVALID NULL