/*
 * \brief   Spin lock
 * \author  Norman Feske
 * \date    2012-01-27
 */

/*
 * Copyright (C) 2012-2013 Genode Labs GmbH
 *
 * This file is part of the Genode OS framework, which is distributed
 * under the terms of the GNU General Public License version 2.
 */

#ifndef _INCLUDE__DDE_KIT__SPIN_LOCK_H_
#define _INCLUDE__DDE_KIT__SPIN_LOCK_H_

/**
 * Private spin lock type
 */
typedef volatile int dde_kit_spin_lock;

enum { DDE_KIT_SPIN_LOCK_LOCKED, DDE_KIT_SPIN_LOCK_UNLOCKED };


/**
 * Initialize spin lock
 *
 * \param   out_lock  lock handle (output parameter)
 *
 * The created lock is free (not acquired) after initialization.
 */
void dde_kit_spin_lock_init(dde_kit_spin_lock *spin_lock);

/**
 * Acquire spin lock
 */
void dde_kit_spin_lock_lock(dde_kit_spin_lock *spin_lock);

/**
 * Try to acquire a lock (non-blocking)
 */
int dde_kit_spin_lock_try_lock(dde_kit_spin_lock *spin_lock);

/**
 * Release spin lock
 */
void dde_kit_spin_lock_unlock(dde_kit_spin_lock *spin_lock);


#endif /* _INCLUDE__DDE_KIT__SPIN_LOCK_H_ */
