mirror of
https://github.com/janishutz/eth-summaries.git
synced 2026-03-14 10:50:05 +01:00
29 lines
641 B
C
29 lines
641 B
C
#include <stdlib.h>
|
|
|
|
struct qnode {
|
|
struct qnode *next;
|
|
int locked;
|
|
};
|
|
typedef struct qnode *lock_t;
|
|
|
|
void acquire( lock_t *lock, struct qnode *local ) {
|
|
local->next = NULL;
|
|
struct qnode *prev = XCHG( lock, local );
|
|
if ( prev ) { // queue was non-empty
|
|
local->locked = 1;
|
|
prev->next = local;
|
|
while ( local->locked )
|
|
; // spin
|
|
}
|
|
}
|
|
|
|
void release( lock_t *lock, struct qnode *local ) {
|
|
if ( local->next == NULL ) {
|
|
if ( CAS( lock, local, NULL ) )
|
|
return;
|
|
while ( local->next == NULL )
|
|
; // spin
|
|
}
|
|
local->next->locked = 0;
|
|
}
|