void sche_destroy(sche_t *s) { struct double_link_node *dlnode = NULL; while(dlnode = double_link_pop(&(*s)->coros)) { coro_t co = (coro_t)dlnode+sizeof(struct list_node); coro_destroy(&co); } LINK_LIST_DESTROY(&((*s)->active_list_1)); LINK_LIST_DESTROY(&((*s)->active_list_2)); minheap_destroy(&((*s)->_minheap)); coro_destroy(&(*s)->co); free(*s); *s = NULL; }
static inline mq_sync_push(mq_t m,struct per_thread_struct *pts) { mutex_lock(m->mtx); uint8_t empty = link_list_is_empty(m->share_list); link_list_swap(m->share_list,pts->local_push_q); if(empty) { struct double_link_node *l = double_link_pop(&m->blocks); if(l) { //if there is block per_thread_struct wake it up struct per_thread_struct *block_pts = (struct per_thread_struct *)((uint8_t*)l - sizeof(struct list_node)); mutex_unlock(m->mtx); condition_signal(block_pts->cond); return; } } mutex_unlock(m->mtx); }
int32_t epoll_loop(engine_t n,int32_t ms) { assert(n); uint32_t sleep_ms; uint32_t timeout = GetSystemMs() + ms; uint32_t current_tick; do{ while(!double_link_empty(n->actived)) { socket_t s = (socket_t)double_link_pop(n->actived); s->isactived = 0; if(Process(s)) { s->isactived = 1; double_link_push(n->actived,(struct double_link_node*)s); } //if(GetCurrentMs() >= timeout) // break; } current_tick = GetSystemMs(); sleep_ms = timeout > current_tick ? timeout - current_tick:0; int32_t nfds = TEMP_FAILURE_RETRY(epoll_wait(n->poller_fd,n->events,MAX_SOCKET,sleep_ms)); if(nfds < 0) return -1; int32_t i; for(i = 0 ; i < nfds ; ++i) { socket_t sock = (socket_t)n->events[i].data.ptr; if(sock) { if(n->events[i].events & EPOLLIN) on_read_active(sock); if(n->events[i].events & EPOLLOUT) on_write_active(sock); if(n->events[i].events & EPOLLERR) on_read_active(sock); } } current_tick = GetSystemMs(); }while(timeout > current_tick); return 0; }
void *cavan_data_pool_alloc(struct cavan_data_pool *pool) { void *data; struct double_link_node *node; struct cavan_data_pool_node *pool_node; node = double_link_pop(&pool->link); if (node) { return double_link_get_container(&pool->link, node); } data = malloc(pool->node_size); if (data == NULL) { pr_error_info("malloc"); return NULL; } pool_node = cavan_data_pool_to_node(pool, data); pool_node->destroy = cavan_data_pool_node_destroy2; double_link_node_init(&pool_node->node); return data; }