summaryrefslogtreecommitdiff
path: root/ptw32_MCS_lock.c
diff options
context:
space:
mode:
Diffstat (limited to 'ptw32_MCS_lock.c')
-rw-r--r--ptw32_MCS_lock.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/ptw32_MCS_lock.c b/ptw32_MCS_lock.c
index 55e4565..bb942ba 100644
--- a/ptw32_MCS_lock.c
+++ b/ptw32_MCS_lock.c
@@ -183,12 +183,8 @@ INLINE void
ptw32_mcs_lock_release (ptw32_mcs_local_node_t * node)
{
ptw32_mcs_lock_t *lock = node->lock;
- ptw32_mcs_local_node_t *next = (ptw32_mcs_local_node_t *)
-#ifndef _WIN64
- PTW32_INTERLOCKED_EXCHANGE_ADD((LPLONG)&node->next, 0); /* MBR fence */
-#else
- PTW32_INTERLOCKED_EXCHANGE_ADD64((LONG64 *)&node->next, 0); /* MBR fence */
-#endif
+ ptw32_mcs_local_node_t *next = (ptw32_mcs_local_node_t *)(size_t)
+ PTW32_INTERLOCKED_EXCHANGE_ADD((LPLONG)&node->next, 0); /* MBR fence */
if (0 == next)
{
@@ -205,12 +201,8 @@ ptw32_mcs_lock_release (ptw32_mcs_local_node_t * node)
/* wait for successor */
ptw32_mcs_flag_wait(&node->nextFlag);
- next = (ptw32_mcs_local_node_t *)
-#ifndef _WIN64
+ next = (ptw32_mcs_local_node_t *)(size_t)
PTW32_INTERLOCKED_EXCHANGE_ADD((LPLONG)&node->next, 0); /* MBR fence */
-#else
- PTW32_INTERLOCKED_EXCHANGE_ADD64((LONG64 *)&node->next, 0); /* MBR fence */
-#endif
}
/* pass the lock */
@@ -228,10 +220,10 @@ ptw32_mcs_lock_try_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * no
node->readyFlag = 0;
node->next = 0; /* initially, no successor */
- return ((PTW32_INTERLOCKED_LPLONG)PTW32_INTERLOCKED_COMPARE_EXCHANGE(
+ return ((PTW32_INTERLOCKED_LPLONG)PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR(
(PTW32_INTERLOCKED_LPLONG)lock,
- (PTW32_INTERLOCKED_LONG)node,
- (PTW32_INTERLOCKED_LONG)0)
+ (PTW32_INTERLOCKED_LPLONG)node,
+ (PTW32_INTERLOCKED_LPLONG)0)
== (PTW32_INTERLOCKED_LPLONG)0) ? 0 : EBUSY;
}
@@ -254,9 +246,13 @@ ptw32_mcs_node_transfer (ptw32_mcs_local_node_t * new_node, ptw32_mcs_local_node
new_node->readyFlag = 0; /* Not needed - we were waiting on this */
new_node->next = 0;
+#if defined(_WIN64)
+ if ((ptw32_mcs_local_node_t *)PTW32_INTERLOCKED_COMPARE_EXCHANGE64((PTW32_INTERLOCKED_LPLONG)new_node->lock,
+#else
if ((ptw32_mcs_local_node_t *)PTW32_INTERLOCKED_COMPARE_EXCHANGE((PTW32_INTERLOCKED_LPLONG)new_node->lock,
- (PTW32_INTERLOCKED_LONG)new_node,
- (PTW32_INTERLOCKED_LONG)old_node) != old_node)
+#endif
+ (size_t)(PTW32_INTERLOCKED_LPLONG)new_node,
+ (size_t)(PTW32_INTERLOCKED_LPLONG)old_node) != old_node)
{
/*
* A successor has queued after us, so wait for them to link to us