forked from acouzens/open5gs
109 lines
2.0 KiB
C
109 lines
2.0 KiB
C
#include "core.h"
|
|
#include "core_arch_mutex.h"
|
|
#include "core_errno.h"
|
|
#include "core_param.h"
|
|
#include "core_general.h"
|
|
#include "core_debug.h"
|
|
#include "core_pool.h"
|
|
|
|
pool_declare(mutex_pool, mutex_t, MAX_NUM_OF_MUTEX);
|
|
|
|
status_t mutex_init(void)
|
|
{
|
|
pool_init_wo_lock(&mutex_pool, MAX_NUM_OF_MUTEX);
|
|
return CORE_OK;
|
|
}
|
|
|
|
status_t mutex_final(void)
|
|
{
|
|
pool_final(&mutex_pool);
|
|
return CORE_OK;
|
|
}
|
|
|
|
status_t mutex_create(mutex_id *id, unsigned int flags)
|
|
{
|
|
mutex_t *new_mutex;
|
|
status_t rv;
|
|
|
|
pool_alloc_node(&mutex_pool, &new_mutex);
|
|
d_assert(new_mutex, return CORE_ENOMEM, "mutex_pool(%d) is not enough\n",
|
|
MAX_NUM_OF_MUTEX);
|
|
|
|
if (flags & MUTEX_NESTED)
|
|
{
|
|
return CORE_ENOTIMPL;
|
|
}
|
|
|
|
if (flags & MUTEX_NESTED)
|
|
{
|
|
pthread_mutexattr_t mattr;
|
|
|
|
rv = pthread_mutexattr_init(&mattr);
|
|
if (rv) return rv;
|
|
|
|
rv = pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
|
|
if (rv)
|
|
{
|
|
pthread_mutexattr_destroy(&mattr);
|
|
return rv;
|
|
}
|
|
|
|
rv = pthread_mutex_init(&new_mutex->mutex, &mattr);
|
|
|
|
pthread_mutexattr_destroy(&mattr);
|
|
} else
|
|
rv = pthread_mutex_init(&new_mutex->mutex, NULL);
|
|
|
|
if (rv)
|
|
{
|
|
return rv;
|
|
}
|
|
|
|
*id = (mutex_id)new_mutex;
|
|
return CORE_OK;
|
|
}
|
|
|
|
status_t mutex_lock(mutex_id id)
|
|
{
|
|
status_t rv;
|
|
mutex_t *mutex = (mutex_t *)id;
|
|
|
|
rv = pthread_mutex_lock(&mutex->mutex);
|
|
return rv;
|
|
}
|
|
|
|
status_t mutex_trylock(mutex_id id)
|
|
{
|
|
status_t rv;
|
|
mutex_t *mutex = (mutex_t *)id;
|
|
|
|
rv = pthread_mutex_trylock(&mutex->mutex);
|
|
if (rv)
|
|
{
|
|
return (rv == EBUSY) ? CORE_EBUSY : rv;
|
|
}
|
|
|
|
return CORE_OK;
|
|
}
|
|
|
|
status_t mutex_unlock(mutex_id id)
|
|
{
|
|
status_t rv;
|
|
mutex_t *mutex = (mutex_t *)id;
|
|
|
|
rv = pthread_mutex_unlock(&mutex->mutex);
|
|
|
|
return rv;
|
|
}
|
|
|
|
status_t mutex_delete(mutex_id id)
|
|
{
|
|
status_t rv;
|
|
mutex_t *mutex = (mutex_t *)id;
|
|
|
|
rv = pthread_mutex_destroy(&mutex->mutex);
|
|
pool_free_node(&mutex_pool, mutex);
|
|
|
|
return rv;
|
|
}
|