| 755 | |
| 756 | |
| 757 | void 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; |