FIX #1177, partially at least.
[ghc-hetmet.git] / rts / win32 / IOManager.h
1 /* IOManager.h
2  *
3  * Non-blocking / asynchronous I/O for Win32.
4  *
5  * (c) sof, 2002-2003
6  */
7 #ifndef __IOMANAGER_H__
8 #define __IOMANAGER_H__
9 /* On the yucky side..suppress -Wmissing-declarations warnings when
10  * including <windows.h>
11  */
12 extern void* GetCurrentFiber ( void );
13 extern void* GetFiberData ( void );
14 #include <windows.h>
15
16 /*
17  The IOManager subsystem provides a non-blocking view
18  of I/O operations. It lets one (or more) OS thread(s)
19  issue multiple I/O requests, which the IOManager then 
20  handles independently of/concurrent to the thread(s)
21  that issued the request. Upon completion, the issuing
22  thread can inspect the result of the I/O operation &
23  take appropriate action.
24
25  The IOManager is intended used with the GHC RTS to
26  implement non-blocking I/O in Concurrent Haskell.
27  */
28
29 /*
30  * Our WorkQueue holds WorkItems, encoding IO and
31  * delay requests.
32  *
33  */
34 typedef void (*CompletionProc)(unsigned int requestID,
35                                int   fd,
36                                int   len,
37                                void* buf,
38                                int   errCode);
39
40 /* 
41  * Asynchronous procedure calls executed by a worker thread
42  * take a generic state argument pointer and return an int by 
43  * default. 
44  */
45 typedef int (*DoProcProc)(void *param);
46
47 typedef union workData {
48     struct {
49         int   fd;
50         int   len;
51         char *buf; 
52     } ioData;
53     struct { 
54         int   msecs;
55     } delayData;
56     struct { 
57         DoProcProc proc;
58         void* param;
59     } procData;
60 } WorkData;
61
62 typedef struct WorkItem {
63   unsigned int     workKind;
64   WorkData         workData;
65   unsigned int     requestID;
66   CompletionProc   onCompletion;
67   unsigned int     abandonOp;
68   struct WorkItem  *link;
69 } WorkItem;
70
71 extern CompletionProc onComplete;
72
73 /* the kind of operations supported; you could easily imagine
74  * that instead of passing a tag describing the work to be performed,
75  * a function pointer is passed instead. Maybe later.
76  */
77 #define WORKER_READ        1
78 #define WORKER_WRITE       2
79 #define WORKER_DELAY       4
80 #define WORKER_FOR_SOCKET  8
81 #define WORKER_DO_PROC    16
82
83 /*
84  * Starting up and shutting down. 
85  */ 
86 extern BOOL StartIOManager     ( void );
87 extern void ShutdownIOManager  ( rtsBool wait_threads );
88
89 /*
90  * Adding I/O and delay requests. With each request a
91  * completion routine is supplied, which the worker thread
92  * will invoke upon completion.
93  */
94 extern int AddDelayRequest ( unsigned int   msecs,
95                              CompletionProc onCompletion);
96
97 extern int AddIORequest ( int            fd,
98                           BOOL           forWriting,
99                           BOOL           isSocket,
100                           int            len,
101                           char*          buffer,
102                           CompletionProc onCompletion);
103
104 extern int AddProcRequest ( void*          proc,
105                             void*          data,
106                             CompletionProc onCompletion);
107
108 extern void abandonWorkRequest ( int reqID );
109
110 #endif /* __IOMANAGER_H__ */