blob: 159e20c3582b72510b1a5db89c9512557cd03224 [file] [log] [blame]
#ifndef _LOWLEVELLOCK_H
#define _LOWLEVELLOCK_H
#include <atomic.h>
#include <sys/param.h>
#include <parlib/spinlock.h>
/* Akaros doesn't support private vs shared locks. That's probably a problem */
#define LLL_PRIVATE 0
#define LLL_SHARED 1
/* Glibc's locking is a nightmare, and in lieu of rewriting that mess (see
* libc-lock.h) to support something other than an integer for the LLL lock
* (and thus the libc lock, and the libc recursive lock, etc), we'll just use
* an int for storage and cast that to a struct spin_pdr_lock, which happens to
* also be 32 bits. FFS. */
#define LLL_LOCK_INITIALIZER SPINPDR_UNLOCKED
#define lll_lock(l, p) spin_pdr_lock((struct spin_pdr_lock*)&(l))
#define lll_unlock(l, p) spin_pdr_unlock((struct spin_pdr_lock*)&(l))
/* lll_trylock returns 0 on success. spin_pdr_trylock returns TRUE on
* success. */
#define lll_trylock(l) !spin_pdr_trylock((struct spin_pdr_lock*)&l)
#define lll_futex_wait(m,v,p) do { assert("NO FUTEX_WAIT FOR YOU!" == 0); } while(0)
#define lll_futex_wake(m,n,p) do { assert("NO FUTEX_WAKE FOR YOU!" == 0); } while(0)
#endif