From 3208cee87389dbe7479e44208f8c0a4f8725fae8 Mon Sep 17 00:00:00 2001 From: rpj Date: Mon, 12 Feb 2001 08:28:05 +0000 Subject: Revamp experimental mutex routines again to make more atomic and cancel-safe. --- implement.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'implement.h') 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 -- cgit v1.2.3