summaryrefslogtreecommitdiff
path: root/rts/win32/MIOManager.h
diff options
context:
space:
mode:
authorDuncan Coutts <duncan@well-typed.com>2021-01-03 12:22:37 +0000
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-01-25 05:11:14 -0500
commit083d7aeb5b0f9e47bf34459415367502492c5e06 (patch)
tree8af2ec61e332b11d4571df8345d0139018396639 /rts/win32/MIOManager.h
parentb18d9e97252c9dd12f08d3e6f56bfec6a6d2469a (diff)
downloadhaskell-083d7aeb5b0f9e47bf34459415367502492c5e06.tar.gz
Move win32/IOManager to win32/MIOManager
It is only for MIO, and we want to use the generic name IOManager for the name of the common parts of the interface and dispatch.
Diffstat (limited to 'rts/win32/MIOManager.h')
-rw-r--r--rts/win32/MIOManager.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/rts/win32/MIOManager.h b/rts/win32/MIOManager.h
new file mode 100644
index 0000000000..cb876db9cc
--- /dev/null
+++ b/rts/win32/MIOManager.h
@@ -0,0 +1,109 @@
+/* IOManager.h
+ *
+ * Non-blocking / asynchronous I/O for Win32.
+ *
+ * (c) sof, 2002-2003
+ *
+ * NOTE: This is the MIO manager, only used for --io-manager=posix.
+ * For the WINIO manager see base in the GHC.Event modules.
+ */
+
+#pragma once
+
+#include <windows.h>
+
+/*
+ The IOManager subsystem provides a non-blocking view
+ of I/O operations. It lets one (or more) OS thread(s)
+ issue multiple I/O requests, which the IOManager then
+ handles independently of/concurrent to the thread(s)
+ that issued the request. Upon completion, the issuing
+ thread can inspect the result of the I/O operation &
+ take appropriate action.
+
+ The IOManager is intended used with the GHC RTS to
+ implement non-blocking I/O in Concurrent Haskell.
+ */
+
+/*
+ * Our WorkQueue holds WorkItems, encoding IO and
+ * delay requests.
+ *
+ */
+typedef void (*CompletionProc)(unsigned int requestID,
+ int fd,
+ HsInt len,
+ void* buf,
+ HsInt errCode);
+
+/*
+ * Asynchronous procedure calls executed by a worker thread
+ * take a generic state argument pointer and return an int by
+ * default.
+ */
+typedef int (*DoProcProc)(void *param);
+
+typedef union workData {
+ struct {
+ int fd;
+ HsInt len;
+ char *buf;
+ } ioData;
+ struct {
+ HsInt usecs;
+ } delayData;
+ struct {
+ DoProcProc proc;
+ void* param;
+ } procData;
+} WorkData;
+
+typedef struct WorkItem {
+ unsigned int workKind;
+ WorkData workData;
+ unsigned int requestID;
+ CompletionProc onCompletion;
+ unsigned int abandonOp;
+ struct WorkItem *link;
+} WorkItem;
+
+extern CompletionProc onComplete;
+
+/* the kind of operations supported; you could easily imagine
+ * that instead of passing a tag describing the work to be performed,
+ * a function pointer is passed instead. Maybe later.
+ */
+#define WORKER_READ 1
+#define WORKER_WRITE 2
+#define WORKER_DELAY 4
+#define WORKER_FOR_SOCKET 8
+#define WORKER_DO_PROC 16
+
+/*
+ * Starting up and shutting down.
+ */
+extern bool StartIOManager ( void );
+extern void ShutdownIOManager ( bool wait_threads );
+
+/*
+ * Adding I/O and delay requests. With each request a
+ * completion routine is supplied, which the worker thread
+ * will invoke upon completion.
+ */
+extern int AddDelayRequest ( HsInt usecs,
+ CompletionProc onCompletion);
+
+extern int AddIORequest ( int fd,
+ bool forWriting,
+ bool isSocket,
+ HsInt len,
+ char* buffer,
+ CompletionProc onCompletion);
+
+extern int AddProcRequest ( void* proc,
+ void* data,
+ CompletionProc onCompletion);
+
+extern void abandonWorkRequest ( int reqID );
+
+extern void interruptIOManagerEvent ( void );