source: trunk/include/overlappedio.h@ 10366

Last change on this file since 10366 was 8838, checked in by sandervl, 23 years ago

overlapped io fixes

File size: 4.8 KB
RevLine 
[8838]1/* $Id: overlappedio.h,v 1.3 2002-07-05 17:56:33 sandervl Exp $ */
[7631]2
3/*
4 * Win32 overlapped IO class
5 *
6 * Copyright 2001 Sander van Leeuwen <sandervl@xs4all.nl>
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12#ifndef __OVERLAPPEDIO_H__
13#define __OVERLAPPEDIO_H__
14
15#define NR_ASYNC_OPERATIONS 4
16#define ASYNC_INDEX_READ 0
17#define ASYNC_INDEX_WRITE 1
18#define ASYNC_INDEX_POLL 2
19#define ASYNC_INDEX_BUSY 3
20
21#define ASYNC_TYPE_HALFDUPLEX 0
22#define ASYNC_TYPE_FULLDUPLEX 1
23
24#define ASYNCIO_READ 1
25#define ASYNCIO_WRITE 2
26#define ASYNCIO_READWRITE 4
27#define ASYNCIO_POLL 8
28
29//forward decl
30class OverlappedIOHandler;
31
32typedef struct {
33 DWORD dwOperation;
34 OverlappedIOHandler *lpOverlappedObj;
35} OVERLAPPED_THREAD_PARAM, *LPOVERLAPPED_THREAD_PARAM;
36
37
38class ASYNCIOREQUEST
39{
40public:
41 ASYNCIOREQUEST()
42 {
43 memset(this, 0, sizeof(ASYNCIOREQUEST));
44 };
45
46 DWORD dwAsyncType;
47 HANDLE hHandle;
48 LPCVOID lpBuffer;
49 DWORD nNumberOfBytes;
50 DWORD dwTimeOut;
51 LPOVERLAPPED lpOverlapped;
52 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine;
53 DWORD *lpdwResult;
54 DWORD dwLastError;
55 DWORD dwEventMask;
56 DWORD dwUserData;
57 BOOL fCancelled;
58 ASYNCIOREQUEST *next;
59};
60
61typedef ASYNCIOREQUEST *LPASYNCIOREQUEST;
62
63typedef DWORD (* LPOVERLAPPED_HANDLER)(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
64
65enum OverlappedIOError {
66 InvalidParameter, OutOfMemory, EventCreationFailed, ThreadCreationFailed
67};
68
69class OverlappedIOHandler
70{
71public:
72 OverlappedIOHandler(LPOVERLAPPED_HANDLER lpReadHandler,
73 LPOVERLAPPED_HANDLER lpWriteHandler,
74 LPOVERLAPPED_HANDLER lpPollHandler = NULL,
75 BOOL fFullDuplex = ASYNC_TYPE_HALFDUPLEX);
76 ~OverlappedIOHandler();
77
[8838]78 DWORD AddRef();
79 DWORD Release(BOOL fSignalExit = FALSE);
80
[7631]81 BOOL WriteFile(HANDLE hHandle,
82 LPCVOID lpBuffer,
83 DWORD nNumberOfBytesToWrite,
84 LPDWORD lpNumberOfBytesWritten,
85 LPOVERLAPPED lpOverlapped,
86 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
87 DWORD dwUserData,
88 DWORD dwTimeOut = INFINITE);
89
90 BOOL ReadFile(HANDLE hHandle,
91 LPCVOID lpBuffer,
92 DWORD nNumberOfBytesToRead,
93 LPDWORD lpNumberOfBytesRead,
94 LPOVERLAPPED lpOverlapped,
95 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
96 DWORD dwUserData,
97 DWORD dwTimeOut = INFINITE);
98
99 BOOL WaitForEvent(HANDLE hHandle,
100 DWORD dwEventMask,
101 LPDWORD lpfdwEvtMask,
102 LPOVERLAPPED lpOverlapped,
103 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
104 DWORD dwUserData,
105 DWORD dwTimeOut = INFINITE);
106
107 BOOL CancelIo(HANDLE hHandle);
108
109 BOOL GetOverlappedResult(HANDLE hHandle,
110 LPOVERLAPPED lpoOverlapped,
111 LPDWORD lpcbTransfer,
112 BOOL fWait);
113
114protected:
115
116private:
117 LPASYNCIOREQUEST findAndRemoveRequest(int index, HANDLE hHandle);
[8644]118 void addRequest(int index, LPASYNCIOREQUEST lpRequest);
119 void removeRequest(int index, LPASYNCIOREQUEST lpRequest);
[7631]120
121 DWORD threadHandler(DWORD fEvent);
122
123 HANDLE hThreadPoll;
124 HANDLE hThreadRead;
125 HANDLE hThreadWrite;
126 HANDLE hEventExit;
127 HANDLE hEventCancel;
128 HANDLE hEventPoll;
129 HANDLE hEventRead;
130 HANDLE hEventWrite;
131
132 LPOVERLAPPED_HANDLER lpReadHandler;
133 LPOVERLAPPED_HANDLER lpWriteHandler;
134 LPOVERLAPPED_HANDLER lpPollHandler;
135
136 CRITICAL_SECTION critsect;
137
138 DWORD dwAsyncType;
139 BOOL fFullDuplex;
[8838]140 LONG refCount;
141
[7631]142 //[ASYNC_INDEX_READ] list of pending read (+ write if half-duplex mode) operations
143 //[ASYNC_INDEX_WRITE] list of pending write (full-duplex mode) operations
144 //[ASYNC_INDEX_POLL] list of pending poll operations
145 //[ASYNC_INDEX_BUSY] list of operations that are being handled
146 LPASYNCIOREQUEST pending[NR_ASYNC_OPERATIONS];
147
148 friend DWORD CALLBACK OverlappedIOThread(LPVOID lpThreadParam);
149};
150
151
152#endif // __OVERLAPPEDIO_H__
Note: See TracBrowser for help on using the repository browser.