⛏️ index : haiku.git

/*
	Copyright 1999-2001, Be Incorporated.   All Rights Reserved.
	This file may be used under the terms of the Be Sample Code License.
*/

#ifndef _LOCK_H
#define _LOCK_H

#include <BeBuild.h>

#include <OS.h>

#ifdef __cplusplus
	extern "C" {
#else
	typedef struct lock lock;
	typedef struct mlock mlock;
#endif


struct lock {
	sem_id		s;
	long		c;
};

struct mlock {
	sem_id		s;
};

extern _IMPEXP_KERNEL int	new_lock(lock *l, const char *name);
extern _IMPEXP_KERNEL int	free_lock(lock *l);

#define	LOCK(l)		if (atomic_add(&l.c, -1) <= 0) acquire_sem(l.s);
#define	UNLOCK(l)	if (atomic_add(&l.c, 1) < 0) release_sem(l.s);

extern _IMPEXP_KERNEL int	new_mlock(mlock *l, long c, const char *name);
extern _IMPEXP_KERNEL int	free_mlock(mlock *l);

#define		LOCKM(l,cnt)	acquire_sem_etc(l.s, cnt, 0, 0)
#define		UNLOCKM(l,cnt)	release_sem_etc(l.s, cnt, 0)


#ifdef __cplusplus
  } // extern "C"
#endif

#endif