MCPcopy Create free account
hub / github.com/Tencent/libco / co_eventloop

Function co_eventloop

co_routine.cpp:757–833  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

755
756
757void co_eventloop( stCoEpoll_t *ctx,pfn_co_eventloop_t pfn,void *arg )
758{
759 if( !ctx->result )
760 {
761 ctx->result = co_epoll_res_alloc( stCoEpoll_t::_EPOLL_SIZE );
762 }
763 co_epoll_res *result = ctx->result;
764
765
766 for(;;)
767 {
768 int ret = co_epoll_wait( ctx->iEpollFd,result,stCoEpoll_t::_EPOLL_SIZE, 1 );
769
770 stTimeoutItemLink_t *active = (ctx->pstActiveList);
771 stTimeoutItemLink_t *timeout = (ctx->pstTimeoutList);
772
773 memset( timeout,0,sizeof(stTimeoutItemLink_t) );
774
775 for(int i=0;i<ret;i++)
776 {
777 stTimeoutItem_t *item = (stTimeoutItem_t*)result->events[i].data.ptr;
778 if( item->pfnPrepare )
779 {
780 item->pfnPrepare( item,result->events[i],active );
781 }
782 else
783 {
784 AddTail( active,item );
785 }
786 }
787
788
789 unsigned long long now = GetTickMS();
790 TakeAllTimeout( ctx->pTimeout,now,timeout );
791
792 stTimeoutItem_t *lp = timeout->head;
793 while( lp )
794 {
795 //printf("raise timeout %p\n",lp);
796 lp->bTimeout = true;
797 lp = lp->pNext;
798 }
799
800 Join<stTimeoutItem_t,stTimeoutItemLink_t>( active,timeout );
801
802 lp = active->head;
803 while( lp )
804 {
805
806 PopHead<stTimeoutItem_t,stTimeoutItemLink_t>( active );
807 if (lp->bTimeout && now < lp->ullExpireTime)
808 {
809 int ret = AddTimeout(ctx->pTimeout, lp, now);
810 if (!ret)
811 {
812 lp->bTimeout = false;
813 lp = active->head;
814 continue;

Callers 8

mainFunction · 0.85
mainFunction · 0.85
mainFunction · 0.85
mainFunction · 0.85
mainFunction · 0.85
mainFunction · 0.85
routine_funcFunction · 0.85
mainFunction · 0.85

Calls 6

co_epoll_res_allocFunction · 0.85
co_epoll_waitFunction · 0.85
AddTailFunction · 0.85
GetTickMSFunction · 0.85
TakeAllTimeoutFunction · 0.85
AddTimeoutFunction · 0.85

Tested by 1

mainFunction · 0.68