/**
 * @file mutex.h
 * @brief Header file for implementation of mutexes, file mutexes.c.
 * 
 * This file is based on Kalisto, Development Kernel copyrighted (c) to 
 * Distributed Systems Research Group MFF UK, Czech republic.
 */
#ifndef MUTEX_H_
#define MUTEX_H_

#include "semaphore.h"

/** Structure to hold information about mutex */ 
struct mutex {
	/** Mutex is implemented as semaphore */
	semaphore_t sem;
	/** owner of the thread, this item is used only if DEBUG_MUTEX > 1 */
	thread_t owner;
};

/** define mutex structure as usual with .._t notation */
typedef struct mutex mutex_t;

//function inplemented and exported
void mutex_init(mutex_t *mtx);
void mutex_destroy(mutex_t *mtx);
/** 
 * @name Macro defined to automaticly get thrue tests. For detail comments follow macro definition 
 * @{
 */
#ifdef DEBUG_MUTEX 
 #define mutex_lock(mtx_ptr) mutex_lock_debug(mtx_ptr)
 #define mutex_lock_timeout(mtx_ptr, msec) mutex_lock_timeout_debug(mtx_ptr, msec)
 #define mutex_unlock(mtx_ptr) mutex_unlock_debug(mtx_ptr)
#else
 #define mutex_lock(mtx_ptr) mutex_lock_nondebug(mtx_ptr)
 #define mutex_lock_timeout(mtx_ptr, msec) mutex_lock_timeout_nondebug(mtx_ptr, msec)
 #define mutex_unlock(mtx_ptr) mutex_unlock_nondebug(mtx_ptr)
#endif
/**@}*/

void mutex_unlock(mutex_t *mtx);
void mutex_lock(mutex_t *mtx);

#endif /*MUTEX_H_*/
