正在显示
1 个修改的文件
包含
119 行增加
和
0 行删除
src/server/spserver/spiocpevent.hpp
0 → 100644
1 | +/* | |
2 | + * Copyright 2008 Stephen Liu | |
3 | + * For license terms, see the file COPYING along with this library. | |
4 | + */ | |
5 | + | |
6 | +#ifndef __spiocpevent_hpp__ | |
7 | +#define __spiocpevent_hpp__ | |
8 | + | |
9 | +#include "spporting.hpp" | |
10 | + | |
11 | +typedef struct tagSP_IocpEvent { | |
12 | + enum { SP_IOCP_MAX_IOV = 8 }; | |
13 | + enum { eEventUnknown, eEventRecv, eEventSend, eEventTimer }; | |
14 | + | |
15 | + OVERLAPPED mOverlapped; | |
16 | + int mType; | |
17 | + WSABUF mWsaBuf; | |
18 | + | |
19 | + void ( * mOnTimer ) ( void * ); | |
20 | + | |
21 | + int mHeapIndex; | |
22 | + struct timeval mTimeout; | |
23 | +} SP_IocpEvent_t; | |
24 | + | |
25 | +class SP_IocpEventHeap { | |
26 | +public: | |
27 | + SP_IocpEventHeap(); | |
28 | + ~SP_IocpEventHeap(); | |
29 | + | |
30 | + int push( SP_IocpEvent_t * item ); | |
31 | + | |
32 | + SP_IocpEvent_t * top(); | |
33 | + | |
34 | + SP_IocpEvent_t * pop(); | |
35 | + | |
36 | + int erase( SP_IocpEvent_t * item ); | |
37 | + | |
38 | + int getCount(); | |
39 | + | |
40 | +private: | |
41 | + | |
42 | + static int isGreater( SP_IocpEvent_t * item1, SP_IocpEvent_t * item2 ); | |
43 | + | |
44 | + int reserve( int count ); | |
45 | + | |
46 | + void shiftUp( int index, SP_IocpEvent_t * item ); | |
47 | + void shiftDown( int index, SP_IocpEvent_t * item ); | |
48 | + | |
49 | + SP_IocpEvent_t ** mEntries; | |
50 | + int mMaxCount, mCount; | |
51 | +}; | |
52 | + | |
53 | +class SP_CircleQueue; | |
54 | +class SP_BlockingQueue; | |
55 | +class SP_SessionManager; | |
56 | + | |
57 | +class SP_IocpMsgQueue { | |
58 | +public: | |
59 | + typedef void ( * QueueFunc_t ) ( void * queueData, void * arg ); | |
60 | + | |
61 | + SP_IocpMsgQueue( HANDLE completionPort, DWORD completionKey, QueueFunc_t func, void * arg ); | |
62 | + ~SP_IocpMsgQueue(); | |
63 | + | |
64 | + int push( void * queueData ); | |
65 | + | |
66 | + int process(); | |
67 | + | |
68 | +private: | |
69 | + HANDLE mCompletionPort; | |
70 | + DWORD mCompletionKey; | |
71 | + QueueFunc_t mFunc; | |
72 | + void * mArg; | |
73 | + | |
74 | + HANDLE mMutex; | |
75 | + SP_CircleQueue * mQueue; | |
76 | +}; | |
77 | + | |
78 | +class SP_IocpEventArg { | |
79 | +public: | |
80 | + SP_IocpEventArg( int timeout ); | |
81 | + ~SP_IocpEventArg(); | |
82 | + | |
83 | + HANDLE getCompletionPort(); | |
84 | + SP_BlockingQueue * getInputResultQueue(); | |
85 | + SP_BlockingQueue * getOutputResultQueue(); | |
86 | + | |
87 | + void setResponseQueue( SP_IocpMsgQueue * responseQueue ); | |
88 | + SP_IocpMsgQueue * getResponseQueue(); | |
89 | + | |
90 | + SP_SessionManager * getSessionManager(); | |
91 | + | |
92 | + SP_IocpEventHeap * getEventHeap(); | |
93 | + | |
94 | + int loadDisconnectEx( SOCKET fd ); | |
95 | + | |
96 | + BOOL disconnectEx( SOCKET fd, LPOVERLAPPED lpOverlapped, | |
97 | + DWORD dwFlags, DWORD reserved ); | |
98 | + | |
99 | + void setTimeout( int timeout ); | |
100 | + int getTimeout(); | |
101 | + | |
102 | +private: | |
103 | + SP_BlockingQueue * mInputResultQueue; | |
104 | + SP_BlockingQueue * mOutputResultQueue; | |
105 | + SP_IocpMsgQueue * mResponseQueue; | |
106 | + | |
107 | + SP_SessionManager * mSessionManager; | |
108 | + | |
109 | + SP_IocpEventHeap * mEventHeap; | |
110 | + | |
111 | + void * mDisconnectExFunc; | |
112 | + | |
113 | + int mTimeout; | |
114 | + | |
115 | + HANDLE mCompletionPort; | |
116 | +}; | |
117 | + | |
118 | +#endif | |
119 | + | ... | ... |
请
注册
或
登录
后发表评论