add file src/fc_atomic.h
parent
23d8adf05f
commit
556b7337c4
|
|
@ -43,7 +43,7 @@ HEADER_FILES = common_define.h hash.h chain.h logger.h base64.h \
|
|||
char_convert_loader.h common_blocked_queue.h \
|
||||
multi_socket_client.h skiplist_set.h uniq_skiplist.h \
|
||||
fc_list.h json_parser.h buffered_file_writer.h server_id_func.h \
|
||||
fc_queue.h fc_memory.h shared_buffer.h thread_pool.h
|
||||
fc_queue.h fc_memory.h shared_buffer.h thread_pool.h fc_atomic.h
|
||||
|
||||
ALL_OBJS = $(FAST_STATIC_OBJS) $(FAST_SHARED_OBJS)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,23 +14,11 @@ int common_blocked_queue_init_ex(struct common_blocked_queue *queue,
|
|||
const int64_t alloc_elements_limit = 0;
|
||||
int result;
|
||||
|
||||
if ((result=init_pthread_lock(&queue->lock)) != 0)
|
||||
if ((result=init_pthread_lock_cond_pair(&queue->lc_pair)) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"init_pthread_lock fail, errno: %d, error info: %s",
|
||||
__LINE__, result, STRERROR(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
if ((result=pthread_cond_init(&queue->cond, NULL)) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"pthread_cond_init fail, "
|
||||
"errno: %d, error info: %s",
|
||||
__LINE__, result, STRERROR(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
if ((result=fast_mblock_init_ex1(&queue->mblock, "queue_node",
|
||||
sizeof(struct common_blocked_node),
|
||||
alloc_elements_once, alloc_elements_limit,
|
||||
|
|
@ -47,8 +35,7 @@ int common_blocked_queue_init_ex(struct common_blocked_queue *queue,
|
|||
|
||||
void common_blocked_queue_destroy(struct common_blocked_queue *queue)
|
||||
{
|
||||
pthread_cond_destroy(&queue->cond);
|
||||
pthread_mutex_destroy(&queue->lock);
|
||||
destroy_pthread_lock_cond_pair(&queue->lc_pair);
|
||||
fast_mblock_destroy(&queue->mblock);
|
||||
}
|
||||
|
||||
|
|
@ -58,7 +45,7 @@ int common_blocked_queue_push_ex(struct common_blocked_queue *queue,
|
|||
int result;
|
||||
struct common_blocked_node *node;
|
||||
|
||||
if ((result=pthread_mutex_lock(&(queue->lock))) != 0)
|
||||
if ((result=pthread_mutex_lock(&(queue->lc_pair.lock))) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, " \
|
||||
"call pthread_mutex_lock fail, " \
|
||||
|
|
@ -71,7 +58,7 @@ int common_blocked_queue_push_ex(struct common_blocked_queue *queue,
|
|||
&queue->mblock);
|
||||
if (node == NULL)
|
||||
{
|
||||
pthread_mutex_unlock(&(queue->lock));
|
||||
pthread_mutex_unlock(&(queue->lc_pair.lock));
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
|
|
@ -89,7 +76,7 @@ int common_blocked_queue_push_ex(struct common_blocked_queue *queue,
|
|||
}
|
||||
queue->tail = node;
|
||||
|
||||
if ((result=pthread_mutex_unlock(&(queue->lock))) != 0)
|
||||
if ((result=pthread_mutex_unlock(&(queue->lc_pair.lock))) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, " \
|
||||
"call pthread_mutex_unlock fail, " \
|
||||
|
|
@ -115,14 +102,14 @@ void common_blocked_queue_return_nodes(struct common_blocked_queue *queue,
|
|||
last = last->next;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&(queue->lock));
|
||||
pthread_mutex_lock(&(queue->lc_pair.lock));
|
||||
last->next = queue->head;
|
||||
queue->head = node;
|
||||
if (queue->tail == NULL)
|
||||
{
|
||||
queue->tail = last;
|
||||
}
|
||||
pthread_mutex_unlock(&(queue->lock));
|
||||
pthread_mutex_unlock(&(queue->lc_pair.lock));
|
||||
}
|
||||
|
||||
void *common_blocked_queue_pop_ex(struct common_blocked_queue *queue,
|
||||
|
|
@ -132,7 +119,7 @@ void *common_blocked_queue_pop_ex(struct common_blocked_queue *queue,
|
|||
void *data;
|
||||
int result;
|
||||
|
||||
if ((result=pthread_mutex_lock(&(queue->lock))) != 0)
|
||||
if ((result=pthread_mutex_lock(&(queue->lc_pair.lock))) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, " \
|
||||
"call pthread_mutex_lock fail, " \
|
||||
|
|
@ -151,7 +138,7 @@ void *common_blocked_queue_pop_ex(struct common_blocked_queue *queue,
|
|||
break;
|
||||
}
|
||||
|
||||
pthread_cond_wait(&(queue->cond), &(queue->lock));
|
||||
pthread_cond_wait(&(queue->lc_pair.cond), &(queue->lc_pair.lock));
|
||||
node = queue->head;
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +159,7 @@ void *common_blocked_queue_pop_ex(struct common_blocked_queue *queue,
|
|||
}
|
||||
} while (0);
|
||||
|
||||
if ((result=pthread_mutex_unlock(&(queue->lock))) != 0)
|
||||
if ((result=pthread_mutex_unlock(&(queue->lc_pair.lock))) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, " \
|
||||
"call pthread_mutex_unlock fail, " \
|
||||
|
|
@ -189,7 +176,7 @@ struct common_blocked_node *common_blocked_queue_pop_all_nodes_ex(
|
|||
struct common_blocked_node *node;
|
||||
int result;
|
||||
|
||||
if ((result=pthread_mutex_lock(&(queue->lock))) != 0)
|
||||
if ((result=pthread_mutex_lock(&(queue->lc_pair.lock))) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"call pthread_mutex_lock fail, "
|
||||
|
|
@ -202,13 +189,13 @@ struct common_blocked_node *common_blocked_queue_pop_all_nodes_ex(
|
|||
{
|
||||
if (blocked)
|
||||
{
|
||||
pthread_cond_wait(&(queue->cond), &(queue->lock));
|
||||
pthread_cond_wait(&(queue->lc_pair.cond), &(queue->lc_pair.lock));
|
||||
}
|
||||
}
|
||||
|
||||
node = queue->head;
|
||||
queue->head = queue->tail = NULL;
|
||||
if ((result=pthread_mutex_unlock(&(queue->lock))) != 0)
|
||||
if ((result=pthread_mutex_unlock(&(queue->lc_pair.lock))) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"call pthread_mutex_unlock fail, "
|
||||
|
|
@ -224,11 +211,11 @@ void common_blocked_queue_free_all_nodes(struct common_blocked_queue *queue,
|
|||
{
|
||||
struct common_blocked_node *deleted;
|
||||
|
||||
pthread_mutex_lock(&(queue->lock));
|
||||
pthread_mutex_lock(&(queue->lc_pair.lock));
|
||||
while (node != NULL) {
|
||||
deleted = node;
|
||||
node = node->next;
|
||||
fast_mblock_free_object(&queue->mblock, deleted);
|
||||
}
|
||||
pthread_mutex_unlock(&(queue->lock));
|
||||
pthread_mutex_unlock(&(queue->lc_pair.lock));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,8 +29,7 @@ struct common_blocked_queue
|
|||
struct common_blocked_node *head;
|
||||
struct common_blocked_node *tail;
|
||||
struct fast_mblock_man mblock;
|
||||
pthread_mutex_t lock;
|
||||
pthread_cond_t cond;
|
||||
pthread_lock_cond_pair_t lc_pair;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
@ -48,7 +47,7 @@ void common_blocked_queue_destroy(struct common_blocked_queue *queue);
|
|||
static inline void common_blocked_queue_terminate(
|
||||
struct common_blocked_queue *queue)
|
||||
{
|
||||
pthread_cond_signal(&(queue->cond));
|
||||
pthread_cond_signal(&(queue->lc_pair.cond));
|
||||
}
|
||||
|
||||
static inline void common_blocked_queue_terminate_all(
|
||||
|
|
@ -57,7 +56,7 @@ static inline void common_blocked_queue_terminate_all(
|
|||
int i;
|
||||
for (i=0; i<count; i++)
|
||||
{
|
||||
pthread_cond_signal(&(queue->cond));
|
||||
pthread_cond_signal(&(queue->lc_pair.cond));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -75,7 +74,7 @@ static inline int common_blocked_queue_push(struct common_blocked_queue
|
|||
{
|
||||
if (notify)
|
||||
{
|
||||
pthread_cond_signal(&(queue->cond));
|
||||
pthread_cond_signal(&(queue->lc_pair.cond));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -204,6 +204,12 @@ typedef struct
|
|||
int count;
|
||||
} key_value_array_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
pthread_mutex_t lock;
|
||||
pthread_cond_t cond;
|
||||
} pthread_lock_cond_pair_t;
|
||||
|
||||
typedef void (*FreeDataFunc)(void *ptr);
|
||||
typedef int (*CompareFunc)(void *p1, void *p2);
|
||||
typedef void* (*MallocFunc)(size_t size);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
#ifndef _FC_ATOMIC_H
|
||||
#define _FC_ATOMIC_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define FC_ATOMIC_CAS(var, old_value, new_value) \
|
||||
do { \
|
||||
if (__sync_bool_compare_and_swap(&var, old_value, new_value)) { \
|
||||
break; \
|
||||
} \
|
||||
old_value = __sync_add_and_fetch(&var, 0); \
|
||||
} while (new_value != old_value)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -15,21 +15,11 @@ int fc_queue_init(struct fc_queue *queue, const int next_ptr_offset)
|
|||
{
|
||||
int result;
|
||||
|
||||
if ((result=init_pthread_lock(&queue->lock)) != 0) {
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"init_pthread_lock fail, errno: %d, error info: %s",
|
||||
__LINE__, result, STRERROR(result));
|
||||
if ((result=init_pthread_lock_cond_pair(&queue->lc_pair)) != 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if ((result=pthread_cond_init(&queue->cond, NULL)) != 0) {
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"pthread_cond_init fail, "
|
||||
"errno: %d, error info: %s",
|
||||
__LINE__, result, STRERROR(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
queue->head = NULL;
|
||||
queue->tail = NULL;
|
||||
queue->next_ptr_offset = next_ptr_offset;
|
||||
|
|
@ -38,13 +28,12 @@ int fc_queue_init(struct fc_queue *queue, const int next_ptr_offset)
|
|||
|
||||
void fc_queue_destroy(struct fc_queue *queue)
|
||||
{
|
||||
pthread_cond_destroy(&queue->cond);
|
||||
pthread_mutex_destroy(&queue->lock);
|
||||
destroy_pthread_lock_cond_pair(&queue->lc_pair);
|
||||
}
|
||||
|
||||
void fc_queue_push_ex(struct fc_queue *queue, void *data, bool *notify)
|
||||
{
|
||||
PTHREAD_MUTEX_LOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_LOCK(&queue->lc_pair.lock);
|
||||
FC_QUEUE_NEXT_PTR(queue, data) = NULL;
|
||||
if (queue->tail == NULL) {
|
||||
queue->head = data;
|
||||
|
|
@ -55,14 +44,14 @@ void fc_queue_push_ex(struct fc_queue *queue, void *data, bool *notify)
|
|||
}
|
||||
queue->tail = data;
|
||||
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lc_pair.lock);
|
||||
}
|
||||
|
||||
void *fc_queue_pop_ex(struct fc_queue *queue, const bool blocked)
|
||||
{
|
||||
void *data;
|
||||
|
||||
PTHREAD_MUTEX_LOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_LOCK(&queue->lc_pair.lock);
|
||||
do {
|
||||
data = queue->head;
|
||||
if (data == NULL) {
|
||||
|
|
@ -70,7 +59,7 @@ void *fc_queue_pop_ex(struct fc_queue *queue, const bool blocked)
|
|||
break;
|
||||
}
|
||||
|
||||
pthread_cond_wait(&queue->cond, &queue->lock);
|
||||
pthread_cond_wait(&queue->lc_pair.cond, &queue->lc_pair.lock);
|
||||
data = queue->head;
|
||||
}
|
||||
|
||||
|
|
@ -82,7 +71,7 @@ void *fc_queue_pop_ex(struct fc_queue *queue, const bool blocked)
|
|||
}
|
||||
} while (0);
|
||||
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lc_pair.lock);
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -90,7 +79,7 @@ void *fc_queue_pop_all_ex(struct fc_queue *queue, const bool blocked)
|
|||
{
|
||||
void *data;
|
||||
|
||||
PTHREAD_MUTEX_LOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_LOCK(&queue->lc_pair.lock);
|
||||
do {
|
||||
data = queue->head;
|
||||
if (data == NULL) {
|
||||
|
|
@ -98,7 +87,7 @@ void *fc_queue_pop_all_ex(struct fc_queue *queue, const bool blocked)
|
|||
break;
|
||||
}
|
||||
|
||||
pthread_cond_wait(&queue->cond, &queue->lock);
|
||||
pthread_cond_wait(&queue->lc_pair.cond, &queue->lc_pair.lock);
|
||||
data = queue->head;
|
||||
}
|
||||
|
||||
|
|
@ -107,7 +96,7 @@ void *fc_queue_pop_all_ex(struct fc_queue *queue, const bool blocked)
|
|||
}
|
||||
} while (0);
|
||||
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lc_pair.lock);
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -119,7 +108,7 @@ void fc_queue_push_queue_to_head_ex(struct fc_queue *queue,
|
|||
return;
|
||||
}
|
||||
|
||||
PTHREAD_MUTEX_LOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_LOCK(&queue->lc_pair.lock);
|
||||
FC_QUEUE_NEXT_PTR(queue, qinfo->tail) = queue->head;
|
||||
queue->head = qinfo->head;
|
||||
if (queue->tail == NULL) {
|
||||
|
|
@ -128,13 +117,13 @@ void fc_queue_push_queue_to_head_ex(struct fc_queue *queue,
|
|||
} else {
|
||||
*notify = false;
|
||||
}
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lc_pair.lock);
|
||||
}
|
||||
|
||||
void fc_queue_pop_to_queue(struct fc_queue *queue,
|
||||
struct fc_queue_info *qinfo)
|
||||
{
|
||||
PTHREAD_MUTEX_LOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_LOCK(&queue->lc_pair.lock);
|
||||
if (queue->head != NULL) {
|
||||
qinfo->head = queue->head;
|
||||
qinfo->tail = queue->tail;
|
||||
|
|
@ -142,5 +131,5 @@ void fc_queue_pop_to_queue(struct fc_queue *queue,
|
|||
} else {
|
||||
qinfo->head = qinfo->tail = NULL;
|
||||
}
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lock);
|
||||
PTHREAD_MUTEX_UNLOCK(&queue->lc_pair.lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,7 @@ struct fc_queue
|
|||
{
|
||||
void *head;
|
||||
void *tail;
|
||||
pthread_mutex_t lock;
|
||||
pthread_cond_t cond;
|
||||
pthread_lock_cond_pair_t lc_pair;
|
||||
int next_ptr_offset;
|
||||
};
|
||||
|
||||
|
|
@ -35,7 +34,7 @@ void fc_queue_destroy(struct fc_queue *queue);
|
|||
|
||||
static inline void fc_queue_terminate(struct fc_queue *queue)
|
||||
{
|
||||
pthread_cond_signal(&queue->cond);
|
||||
pthread_cond_signal(&queue->lc_pair.cond);
|
||||
}
|
||||
|
||||
static inline void fc_queue_terminate_all(
|
||||
|
|
@ -43,7 +42,7 @@ static inline void fc_queue_terminate_all(
|
|||
{
|
||||
int i;
|
||||
for (i=0; i<count; i++) {
|
||||
pthread_cond_signal(&(queue->cond));
|
||||
pthread_cond_signal(&(queue->lc_pair.cond));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -56,7 +55,7 @@ static inline void fc_queue_push(struct fc_queue *queue, void *data)
|
|||
|
||||
fc_queue_push_ex(queue, data, ¬ify);
|
||||
if (notify) {
|
||||
pthread_cond_signal(&(queue->cond));
|
||||
pthread_cond_signal(&(queue->lc_pair.cond));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -70,7 +69,7 @@ static inline void fc_queue_push_queue_to_head(struct fc_queue *queue,
|
|||
|
||||
fc_queue_push_queue_to_head_ex(queue, qinfo, ¬ify);
|
||||
if (notify) {
|
||||
pthread_cond_signal(&(queue->cond));
|
||||
pthread_cond_signal(&(queue->lc_pair.cond));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ static SetDirectiveVars *iniGetVars(IniContext *pContext);
|
|||
|
||||
|
||||
#define RETRY_FETCH_GLOBAL(szSectionName, bRetryGlobal) \
|
||||
((szSectionName != NULL && szSectionName != '\0') && bRetryGlobal)
|
||||
((szSectionName != NULL && *szSectionName != '\0') && bRetryGlobal)
|
||||
|
||||
static void iniDoSetAnnotations(AnnotationEntry *src, const int src_count,
|
||||
AnnotationEntry *dest, int *dest_count)
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ int ioevent_loop(struct nio_thread_data *pThreadData,
|
|||
int count;
|
||||
|
||||
memset(&ev_notify, 0, sizeof(ev_notify));
|
||||
ev_notify.fd = pThreadData->pipe_fds[0];
|
||||
ev_notify.fd = FC_NOTIFY_READ_FD(pThreadData);
|
||||
ev_notify.callback = recv_notify_callback;
|
||||
ev_notify.timer.data = pThreadData;
|
||||
if (ioevent_attach(&pThreadData->ev_puller,
|
||||
|
|
|
|||
|
|
@ -257,3 +257,33 @@ int fc_create_thread(pthread_t *tid, void *(*start_func)(void *),
|
|||
pthread_attr_destroy(&thread_attr);
|
||||
return result;
|
||||
}
|
||||
|
||||
int init_pthread_lock_cond_pair(pthread_lock_cond_pair_t *lcp)
|
||||
{
|
||||
int result;
|
||||
|
||||
if ((result=init_pthread_lock(&lcp->lock)) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"init_pthread_lock fail, errno: %d, error info: %s",
|
||||
__LINE__, result, STRERROR(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
if ((result=pthread_cond_init(&lcp->cond, NULL)) != 0)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"pthread_cond_init fail, "
|
||||
"errno: %d, error info: %s",
|
||||
__LINE__, result, STRERROR(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void destroy_pthread_lock_cond_pair(pthread_lock_cond_pair_t *lcp)
|
||||
{
|
||||
pthread_cond_destroy(&lcp->cond);
|
||||
pthread_mutex_destroy(&lcp->lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,9 @@ extern "C" {
|
|||
int init_pthread_lock(pthread_mutex_t *pthread_lock);
|
||||
int init_pthread_attr(pthread_attr_t *pattr, const int stack_size);
|
||||
|
||||
int init_pthread_lock_cond_pair(pthread_lock_cond_pair_t *lcp);
|
||||
void destroy_pthread_lock_cond_pair(pthread_lock_cond_pair_t *lcp);
|
||||
|
||||
#define PTHREAD_MUTEX_LOCK(lock) \
|
||||
do { \
|
||||
int lock_res; \
|
||||
|
|
|
|||
Loading…
Reference in New Issue