[zeromq-dev] Improving latency using futexes?
Steven McCoy
steven.mccoy at miru.hk
Tue Nov 24 18:40:20 CET 2009
Example usage of Futex,
void apc_futex_lock(volatile int* lock)
{
int c;
/* Attempt to obtain a lock if not currently locked. If the previous
* value was not 0 then we did not obtain the lock, and must wait.
* If the previous value was 1 (has no waiting processes) then we
* set the lock to 2 before blocking on the futex wait operation.
* This implementation suffers from the possible difficulty of
* efficently implementing the atomic xchg operation on some
* architectures, and could also cause unecessary wake operations by
* setting the lock to 2 when there are no additional waiters.
*/
if((c = apc_cmpxchg(lock, 0, 1)) != 0) {
if(c != 2) {
c = apc_xchg(lock, 2);
}
while(c != 0) {
apc_futex_wait(lock, 2);
c = apc_xchg(lock, 2);
}
}
}
/* non-blocking lock returns 1 when the lock has been obtained, 0 if it
would bl
ock */
inline zend_bool apc_futex_nonblocking_lock(volatile int* lock)
{
return apc_cmpxchg(lock, 0, 1) == 0;
}
inline void apc_futex_unlock(volatile int* lock)
{
/* set the lock to 0, if it's previous values was not 1 (no waiters)
* then perform a wake operation on one process letting it know the lock
* is available. This is an optimization to save wake calls if there
* are no waiting processes for the lock
*/
if(apc_xchg(lock,0) != 1) {
apc_futex_wake(lock, 1);
}
}
--
Steve-o
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20091124/2f15ddfa/attachment.htm>
More information about the zeromq-dev
mailing list