libfastcommon/src/locked_list.h

97 lines
2.5 KiB
C

#ifndef _LOCKED_LIST_H
#define _LOCKED_LIST_H
#include "fc_list.h"
#include "pthread_func.h"
typedef struct fc_locked_list {
struct fc_list_head head;
pthread_mutex_t lock;
} FCLockedList;
#ifdef __cplusplus
extern "C" {
#endif
static inline int locked_list_init(FCLockedList *list)
{
int result;
if ((result=init_pthread_lock(&list->lock)) != 0) {
return result;
}
FC_INIT_LIST_HEAD(&list->head);
return 0;
}
static inline void locked_list_destroy(FCLockedList *list)
{
pthread_mutex_destroy(&list->lock);
}
static inline void locked_list_add(struct fc_list_head *_new,
FCLockedList *list)
{
PTHREAD_MUTEX_LOCK(&list->lock);
fc_list_add(_new, &list->head);
PTHREAD_MUTEX_UNLOCK(&list->lock);
}
static inline void locked_list_add_tail(struct fc_list_head *_new,
FCLockedList *list)
{
PTHREAD_MUTEX_LOCK(&list->lock);
fc_list_add_tail(_new, &list->head);
PTHREAD_MUTEX_UNLOCK(&list->lock);
}
static inline void locked_list_del(struct fc_list_head *old,
FCLockedList *list)
{
PTHREAD_MUTEX_LOCK(&list->lock);
fc_list_del_init(old);
PTHREAD_MUTEX_UNLOCK(&list->lock);
}
static inline int locked_list_empty(FCLockedList *list)
{
int empty;
PTHREAD_MUTEX_LOCK(&list->lock);
empty = fc_list_empty(&list->head);
PTHREAD_MUTEX_UNLOCK(&list->lock);
return empty;
}
static inline int locked_list_count(FCLockedList *list)
{
int count;
PTHREAD_MUTEX_LOCK(&list->lock);
count = fc_list_count(&list->head);
PTHREAD_MUTEX_UNLOCK(&list->lock);
return count;
}
#define locked_list_first_entry(list, type, member, var) \
PTHREAD_MUTEX_LOCK(&(list)->lock); \
var = fc_list_first_entry(&(list)->head, type, member); \
PTHREAD_MUTEX_UNLOCK(&(list)->lock)
#define locked_list_last_entry(list, type, member, var) \
PTHREAD_MUTEX_LOCK(&(list)->lock); \
var = fc_list_last_entry(&(list)->head, type, member); \
PTHREAD_MUTEX_UNLOCK(&(list)->lock)
#define locked_list_pop(list, type, member, var) \
PTHREAD_MUTEX_LOCK(&(list)->lock); \
var = fc_list_first_entry(&(list)->head, type, member); \
if (var != NULL) { \
fc_list_del_init(&var->member); \
} \
PTHREAD_MUTEX_UNLOCK(&(list)->lock)
#ifdef __cplusplus
}
#endif
#endif