服务器架构设计1
发布日期:2019-01-05 11:04 | 文章来源:互联网
服务器周期性
说到服务器,通常可以想象都是一个while无限循环,当某种条件触发之后,则跳出循环。
然而,有些时候,则需要服务器针对某些ses,周期性的执行特定操作,如何实现呢。
一个简单的方法就是,建立session的nodelist,节点信息包括,主线程周期性的访问这个nodelist,如果时间条件满足,执行回调函数。
构造了一个简单nodelist,便于说明。
inlineuint64_tget_current_clock{structtimespectp;clock_gettime;returntp.tv_sec*1e3+;}staticvoidheap_insert_helper{if{return;}uint32_tp=>>1;if{return;}else{timer_event_t*tmp=heapp;heapp=heapidx;heapidx=tmp;heap_insert_helper;}}staticvoidevent_heap_insert{timer_event_t**heap=ctx->heap;uint32_tidx=ctx->nevts++;heapidx=evt;heap_insert_helper;}staticvoidheap_del_helper{if{return;}uint32_tlchild=idx*2+1;uint32_trchild=idx*2+2;uint32_ti=idx;if){i=lchild;}if){i=rchild;}if{timer_event_t*tmp=heapi;heapi=heapidx;heapidx=tmp;heap_del_helper;}}statictimer_event_t*event_heap_pop{timer_event_t*evt=ctx->heap0;ctx->heap0=ctx->heap--ctx->nevts;heap_del_helper;returnevt;}staticvoidevent_re_enqueue{if{evt->time+=evt->interval;if{evt->count--;if{evt->interval=0;}}event_heap_insert;}else{mpool_put;}}voidtimer_run{while){timer_event_t*evt=event_heap_pop;if{evt->cb;}event_re_enqueue;}}timer_ctx_t*timer_init{if{returnNULL;}memset);//makesurempoolislargeenoughctx->mpool=mpool_calloc);//ctx->mpool=mpool_init,//+sizeof)*MAX_EVENT_COUNT+512,//NULL);if{gotoerror;}returnctx;error:mpool_cleanup;returnNULL;}voidtimer_cleanup{if{return;}mpool_cleanup;ctx->mpool=NULL;}inttimer_register{timer_event_t*evt=NULL;if{gotoerr;}evt=mpool_get;if{gotoerr;}memset);intidx=mpool_get_idx;if{gotoerr;}evt->id=idx;evt->time=get_current_clock+delay;evt->cb=cb;evt->data=data;evt->interval=interval;evt->count=count;evt->enable=1;event_heap_insert;returnidx;err:if{mpool_put;}return-1;}voidtimer_cancel{timer_event_t*evt=mpool_get_by_idx;if{evt->enable=0;}}
Tags:服务器周期性,服务器架构设计1
版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。
相关文章
上一篇: