source: trunk/src/kernel32/overlappedio.h@ 7603

Last change on this file since 7603 was 7598, checked in by sandervl, 24 years ago

added half or full duplex support

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