1127111423--4536---Listen on port [8080] 1127111423--4536---Thread #2688 has been created to accept socket --2688---acceptThread AcceptEx 1127111423--4536---[ex@act] Thread #5112 has been created for executor 1127111423--5112---SP_Executor::eventLoop ## executor->mQueue->pop() 1127111423--4536---[ex@work] Thread #4208 has been created for executor 1127111423--4208---SP_Executor::eventLoop ## executor->mQueue->pop() ----------------------------------------------------------------------- client coming... 1127111442--4536---GetQueuedCompletionStatus key:1 >>onAccept /* * doStart is pushing a "start" message into InputResultQueue */ 1127111442--4536---SP_IocpEventHelper::doStart ## eventArg->getInputResultQueue()->push( new SP_SimpleTask( start, session, 1 ) ) --2688---acceptThread AcceptEx pop Start message... 1127111442--4536---SP_IocpServer::start() ## (SP_Task*)eventArg.getInputResultQueue()->pop() /* * this task means "start" */ 1127111442--4536---SP_Executor::execute ## mQueue->push( task ) 4208---[tp@work] create thread#5516 5516---SP_IocpEventHelper::start ## eventArg->getResponseQueue()->push( response ) /* * in push(response) -- PostQueuedCompletionStatus... eKeyMsgQueue * and using OVERLAPPED pass the eventArg->SP_IocpMsgQueue which was got by GetQueuedCompletionStatus in eventloop */| | ?4208---SP_|Executor::eventLoop ## executor->mQueue->pop() //应该在pop后也加log /|/ + 1127111442--4536---GetQueuedCompletionStatus key:2 eKeyMsgQueue //overlapped is also 1127111442--4536---SP_IocpMsgQueue::process() ## queueData = mQueue->pop(); >>onResponse 1127111442--4536---SP_IocpEventCallback::addRecv ## WSARecv 1127111442--4536---SP_IocpEventCallback::addRecv ## eventArg->getEventHeap()->push( recvEvent ) //WSARecv...重叠信号 GetQueuedCompletionStatus接收...! 1127111442--4536---GetQueuedCompletionStatus key:1024 /* * WSARecv using recvEvent->mOverlapped which recvEvent->mType = SP_IocpEvent_t::eEventRecv * pass to GetQueuedCompletionStatus and then >> onRecv >> doDecodeForWork >> dowork */ >>onRecv 1127111442--4536---SP_IocpEventHelper::doWork ## eventArg->getInputResultQueue()->push( new SP_SimpleTask( worker, session, 1 ) ) ?1127111442--4536---SP_IocpEventCallback::addRecv ## WSARecv ?1127111442--4536---SP_IocpEventCallback::addRecv ## eventArg->getEventHeap()->push( recvEvent ) 1127111442--4536---SP_IocpServer::start() ## (SP_Task*)eventArg.getInputResultQueue()->pop() 1127111442--4536---SP_Executor::execute ## mQueue->push( task ) 4208---SP_Executor::eventLoop ## executor->mQueue->pop() >>handle 5516---SP_IocpEventHelper::worker ## eventArg->getResponseQueue()->push( response ) 1127111442--4536---GetQueuedCompletionStatus key:2 1127111442--4536---SP_IocpMsgQueue::process() ## queueData = mQueue->pop(); >>onResponse 1127111442--4536---SP_IocpEventCallback::addSend ## WSASend 1127111442--4536---SP_IocpEventCallback::addSend ## eventArg->getEventHeap()->push( sendEvent ) 1127111442--4536---GetQueuedCompletionStatus key:1024 >>onSend 1127111442--4536---SP_IOChannel::transmit ## eventArg->getOutputResultQueue()->push( msg ) ----------------------1127111442--4536---session(1024.0) normal exit--------------------------------- 1127111442--4536---SP_IocpEventHelper::doClose ## eventArg->getInputResultQueue()->push( new SP_SimpleTask( close, session, 1 ) ) 1127111442--4536---SP_IocpServer::start() ## (SP_Task*)eventArg.getInputResultQueue()->pop() 1127111442--4536---SP_Executor::execute ## mQueue->push( task ) //workerExecutor.execute 1127111442--4536---SP_IocpServer::start() ## (SP_Task*)eventArg.getOutputResultQueue()->pop() 4208---SP_Executor::eventLoop ## executor->mQueue->pop() 1127111442--4536---SP_Executor::execute ## mQueue->push( task ) //actExecutor.execute session(1024.0) close, r 40(1), w 318(0), i 0, o 0, s 0(1024), t 0 1127111442--4536---GetQueuedCompletionStatus key:1024 5112[act]---SP_Executor::eventLoop ## executor->mQueue->pop() 5516---SP_IocpEventHelper::close ## PostQueuedCompletionStatus eKeyFree 1127111442--4536---GetQueuedCompletionStatus key:3 此中奥秘不能言传