static inline void _log_pto_fetch_msg(thread_data_t* th_data) { fmbuf* pbuf = th_data->plog_buf; char tmp_buf[LOG_MAX_LEN_PER_MSG]; char* tmsg = NULL; log_msg_head_t header; if ( fmbuf_pop(pbuf, &header, LOG_MSG_HEAD_SIZE) ) { _log_event_notice(FLOG_EVENT_ERROR_ASYNC_POP); return; } tmsg = fmbuf_rawget(pbuf, tmp_buf, (size_t)header.len); if ( !tmsg ) { _log_event_notice(FLOG_EVENT_ERROR_ASYNC_POP); return; } size_t writen_len = _log_write(header.f, tmsg, (size_t)header.len); if ( writen_len < (size_t)header.len) { _log_event_notice(FLOG_EVENT_ERROR_WRITE); } fmbuf_pop(pbuf, NULL, (size_t)header.len); }
static void* base_work(void* arg) { thread_data* th_data = (thread_data*)arg; th_msg_t msg; L: flock_cond_wait(&th_data->cond); do { int ret = fmbuf_pop(th_data->pbuf, &msg, sizeof(th_msg_t)); if ( ret ) break; switch ( msg.ev ) { case TH_TASK: msg.pf( th_data->parg, msg.arg ); break; case TH_RELEASE: return NULL; } } while (1); goto L; return NULL; }
static inline void _log_async_process(thread_data_t* th_data, uint64_t process_num) { unsigned int i; for (i=0; i<process_num; i++) { // first, pop protocol id pto_id_t id = 0; if ( fmbuf_pop(th_data->plog_buf, &id, LOG_PTO_ID_SIZE) ) { break; } // run the protocol registration function from pto_tbl g_pto_tbl[id](th_data); } }
// test fmbuf push and pop void test_mbuf1() { // create a mbuf with size == 0 { fmbuf* pbuf = fmbuf_create(0); FCUNIT_ASSERT(pbuf != NULL); FCUNIT_ASSERT(0 == fmbuf_size(pbuf)); FCUNIT_ASSERT(0 == fmbuf_used(pbuf)); FCUNIT_ASSERT(0 == fmbuf_free(pbuf)); fmbuf_delete(pbuf); } fmbuf* pbuf = fmbuf_create(10); FCUNIT_ASSERT(pbuf!=NULL); char* push_buf[20]; char* pop_buf[20]; // push 1 byte data { int ret = fmbuf_push(pbuf, push_buf, 1); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(1 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(0 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(9 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(9 == total_free); } // push 9 byte data { int ret = fmbuf_push(pbuf, push_buf, 9); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(10 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(0 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(0 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(0 == total_free); } // continue push 1 byte data when mbuf is full { int ret = fmbuf_push(pbuf, push_buf, 1); FCUNIT_ASSERT(1 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(10 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(0 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(0 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(0 == total_free); } // clear and seek mbuf and push 5 bytes { fmbuf_clear(pbuf); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(10 == total_free); fmbuf_head_seek(pbuf, 4, FMBUF_SEEK_RIGHT); fmbuf_tail_seek(pbuf, 6, FMBUF_SEEK_RIGHT); int ret = fmbuf_push(pbuf, push_buf, 5); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(7 == used); total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(3 == total_free); } // push 4 bytes but the mbuf only have 3 bytes left { int ret = fmbuf_push(pbuf, push_buf, 4); FCUNIT_ASSERT(1 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(7 == used); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(3 == total_free); } // push 3 bytes the mbuf is full { int ret = fmbuf_push(pbuf, push_buf, 3); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(10 == used); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(0 == total_free); ret = fmbuf_push(pbuf, push_buf, 1); FCUNIT_ASSERT(1 == ret); } //---------------mbuf pop------------------- //pop 1 bytes { fmbuf_clear(pbuf); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); int ret = fmbuf_pop(pbuf, pop_buf, 1); FCUNIT_ASSERT(1 == ret); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(0 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(0 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(10 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(10 == total_free); } // push 5 bytes and pop 1 bytes { int ret = fmbuf_push(pbuf, push_buf, 5); FCUNIT_ASSERT(0 == ret); ret = fmbuf_pop(pbuf, pop_buf, 1); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(4 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(1 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(5 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(6 == total_free); } // pop 3 bytes and left 1 byte { int ret = fmbuf_pop(pbuf, pop_buf, 3); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(1 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(4 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(5 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(9 == total_free); } // pop 2 bytes { int ret = fmbuf_pop(pbuf, pop_buf, 2); FCUNIT_ASSERT(1 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(1 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(4 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(5 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(9 == total_free); } // clear mbuf and seek tail < head { fmbuf_clear(pbuf); fmbuf_head_seek(pbuf, 4, FMBUF_SEEK_RIGHT); fmbuf_tail_seek(pbuf, 2, FMBUF_SEEK_RIGHT); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(9 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(4 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(8 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(1 == total_free); } // total 9 bytes, pop 7 bytes { int ret = fmbuf_pop(pbuf, pop_buf, 7); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(2 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(0 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(8 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(8 == total_free); } // pop 2 bytes and then the mbuf is empty { int ret = fmbuf_pop(pbuf, pop_buf, 2); FCUNIT_ASSERT(0 == ret); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(0 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(2 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(8 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(10 == total_free); } { fmbuf_clear(pbuf); fmbuf_head_seek(pbuf, 4, FMBUF_SEEK_RIGHT); fmbuf_tail_seek(pbuf, 6, FMBUF_SEEK_RIGHT); int ret = fmbuf_pop(pbuf, NULL, 4); FCUNIT_ASSERT(ret == 1); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(2 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(4 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(4 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(8 == total_free); } // move 2 bytes { fmbuf_pop(pbuf, NULL, 2); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(0 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(6 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(4 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(10 == total_free); } // tail < head, tail_use == 5, but pop 6 bytes { fmbuf_clear(pbuf); fmbuf_head_seek(pbuf, 6, FMBUF_SEEK_RIGHT); fmbuf_tail_seek(pbuf, 4, FMBUF_SEEK_RIGHT); size_t used = fmbuf_used(pbuf); FCUNIT_ASSERT(9 == used); fmbuf_pop(pbuf, NULL, 6); size_t size = fmbuf_size(pbuf); FCUNIT_ASSERT(10 == size); used = fmbuf_used(pbuf); FCUNIT_ASSERT(3 == used); size_t head_free = fmbuf_head_free(pbuf); FCUNIT_ASSERT(1 == head_free); size_t tail_free = fmbuf_tail_free(pbuf); FCUNIT_ASSERT(6 == tail_free); size_t total_free = fmbuf_free(pbuf); FCUNIT_ASSERT(7 == total_free); } fmbuf_delete(pbuf); }