-/* ----------------------------------------------------------------------------\r
- (c) The University of Glasgow 2006\r
- \r
- Useful Win32 bits\r
- ------------------------------------------------------------------------- */\r
-\r
-#include "HsBase.h"\r
-\r
-/* This is the error table that defines the mapping between OS error\r
- codes and errno values */\r
-\r
-struct errentry {\r
- unsigned long oscode; /* OS return value */\r
- int errnocode; /* System V error code */\r
-};\r
-\r
-static struct errentry errtable[] = {\r
- { ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */\r
- { ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */\r
- { ERROR_PATH_NOT_FOUND, ENOENT }, /* 3 */\r
- { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, /* 4 */\r
- { ERROR_ACCESS_DENIED, EACCES }, /* 5 */\r
- { ERROR_INVALID_HANDLE, EBADF }, /* 6 */\r
- { ERROR_ARENA_TRASHED, ENOMEM }, /* 7 */\r
- { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, /* 8 */\r
- { ERROR_INVALID_BLOCK, ENOMEM }, /* 9 */\r
- { ERROR_BAD_ENVIRONMENT, E2BIG }, /* 10 */\r
- { ERROR_BAD_FORMAT, ENOEXEC }, /* 11 */\r
- { ERROR_INVALID_ACCESS, EINVAL }, /* 12 */\r
- { ERROR_INVALID_DATA, EINVAL }, /* 13 */\r
- { ERROR_INVALID_DRIVE, ENOENT }, /* 15 */\r
- { ERROR_CURRENT_DIRECTORY, EACCES }, /* 16 */\r
- { ERROR_NOT_SAME_DEVICE, EXDEV }, /* 17 */\r
- { ERROR_NO_MORE_FILES, ENOENT }, /* 18 */\r
- { ERROR_LOCK_VIOLATION, EACCES }, /* 33 */\r
- { ERROR_BAD_NETPATH, ENOENT }, /* 53 */\r
- { ERROR_NETWORK_ACCESS_DENIED, EACCES }, /* 65 */\r
- { ERROR_BAD_NET_NAME, ENOENT }, /* 67 */\r
- { ERROR_FILE_EXISTS, EEXIST }, /* 80 */\r
- { ERROR_CANNOT_MAKE, EACCES }, /* 82 */\r
- { ERROR_FAIL_I24, EACCES }, /* 83 */\r
- { ERROR_INVALID_PARAMETER, EINVAL }, /* 87 */\r
- { ERROR_NO_PROC_SLOTS, EAGAIN }, /* 89 */\r
- { ERROR_DRIVE_LOCKED, EACCES }, /* 108 */\r
- { ERROR_BROKEN_PIPE, EPIPE }, /* 109 */\r
- { ERROR_DISK_FULL, ENOSPC }, /* 112 */\r
- { ERROR_INVALID_TARGET_HANDLE, EBADF }, /* 114 */\r
- { ERROR_INVALID_HANDLE, EINVAL }, /* 124 */\r
- { ERROR_WAIT_NO_CHILDREN, ECHILD }, /* 128 */\r
- { ERROR_CHILD_NOT_COMPLETE, ECHILD }, /* 129 */\r
- { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, /* 130 */\r
- { ERROR_NEGATIVE_SEEK, EINVAL }, /* 131 */\r
- { ERROR_SEEK_ON_DEVICE, EACCES }, /* 132 */\r
- { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, /* 145 */\r
- { ERROR_NOT_LOCKED, EACCES }, /* 158 */\r
- { ERROR_BAD_PATHNAME, ENOENT }, /* 161 */\r
- { ERROR_MAX_THRDS_REACHED, EAGAIN }, /* 164 */\r
- { ERROR_LOCK_FAILED, EACCES }, /* 167 */\r
- { ERROR_ALREADY_EXISTS, EEXIST }, /* 183 */\r
- { ERROR_FILENAME_EXCED_RANGE, ENOENT }, /* 206 */\r
- { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, /* 215 */\r
- { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } /* 1816 */\r
-};\r
-\r
-/* size of the table */\r
-#define ERRTABLESIZE (sizeof(errtable)/sizeof(errtable[0]))\r
-\r
-/* The following two constants must be the minimum and maximum\r
- values in the (contiguous) range of Exec Failure errors. */\r
-#define MIN_EXEC_ERROR ERROR_INVALID_STARTING_CODESEG\r
-#define MAX_EXEC_ERROR ERROR_INFLOOP_IN_RELOC_CHAIN\r
-\r
-/* These are the low and high value in the range of errors that are\r
- access violations */\r
-#define MIN_EACCES_RANGE ERROR_WRITE_PROTECT\r
-#define MAX_EACCES_RANGE ERROR_SHARING_BUFFER_EXCEEDED\r
-\r
-void maperrno (void)\r
-{\r
- int i;\r
- DWORD dwErrorCode;\r
-\r
- dwErrorCode = GetLastError();\r
-\r
- /* check the table for the OS error code */\r
- for (i = 0; i < ERRTABLESIZE; ++i)\r
- {\r
- if (dwErrorCode == errtable[i].oscode)\r
- {\r
- errno = errtable[i].errnocode;\r
- return;\r
- }\r
- }\r
-\r
- /* The error code wasn't in the table. We check for a range of */\r
- /* EACCES errors or exec failure errors (ENOEXEC). Otherwise */\r
- /* EINVAL is returned. */\r
-\r
- if (dwErrorCode >= MIN_EACCES_RANGE && dwErrorCode <= MAX_EACCES_RANGE)\r
- errno = EACCES;\r
- else\r
- if (dwErrorCode >= MIN_EXEC_ERROR && dwErrorCode <= MAX_EXEC_ERROR)\r
- errno = ENOEXEC;\r
- else\r
- errno = EINVAL;\r
-}\r
-\r
-#define TICKS_PER_SECOND 50\r
-// must match GHC.Conc.tick_freq\r
-\r
-HsInt getTicksOfDay(void)\r
-{\r
- HsInt64 t;\r
- FILETIME ft;\r
- GetSystemTimeAsFileTime(&ft);\r
- t = ((HsInt64)ft.dwHighDateTime << 32) | ft.dwLowDateTime;\r
- t = (t * TICKS_PER_SECOND) / 10000000LL;\r
- /* FILETIMES are in units of 100ns */\r
- return (HsInt)t;\r
-}\r
-\r
+/* ----------------------------------------------------------------------------
+ (c) The University of Glasgow 2006
+
+ Useful Win32 bits
+ ------------------------------------------------------------------------- */
+
+#if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32)
+
+#include "HsBase.h"
+
+/* This is the error table that defines the mapping between OS error
+ codes and errno values */
+
+struct errentry {
+ unsigned long oscode; /* OS return value */
+ int errnocode; /* System V error code */
+};
+
+static struct errentry errtable[] = {
+ { ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */
+ { ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */
+ { ERROR_PATH_NOT_FOUND, ENOENT }, /* 3 */
+ { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, /* 4 */
+ { ERROR_ACCESS_DENIED, EACCES }, /* 5 */
+ { ERROR_INVALID_HANDLE, EBADF }, /* 6 */
+ { ERROR_ARENA_TRASHED, ENOMEM }, /* 7 */
+ { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, /* 8 */
+ { ERROR_INVALID_BLOCK, ENOMEM }, /* 9 */
+ { ERROR_BAD_ENVIRONMENT, E2BIG }, /* 10 */
+ { ERROR_BAD_FORMAT, ENOEXEC }, /* 11 */
+ { ERROR_INVALID_ACCESS, EINVAL }, /* 12 */
+ { ERROR_INVALID_DATA, EINVAL }, /* 13 */
+ { ERROR_INVALID_DRIVE, ENOENT }, /* 15 */
+ { ERROR_CURRENT_DIRECTORY, EACCES }, /* 16 */
+ { ERROR_NOT_SAME_DEVICE, EXDEV }, /* 17 */
+ { ERROR_NO_MORE_FILES, ENOENT }, /* 18 */
+ { ERROR_LOCK_VIOLATION, EACCES }, /* 33 */
+ { ERROR_BAD_NETPATH, ENOENT }, /* 53 */
+ { ERROR_NETWORK_ACCESS_DENIED, EACCES }, /* 65 */
+ { ERROR_BAD_NET_NAME, ENOENT }, /* 67 */
+ { ERROR_FILE_EXISTS, EEXIST }, /* 80 */
+ { ERROR_CANNOT_MAKE, EACCES }, /* 82 */
+ { ERROR_FAIL_I24, EACCES }, /* 83 */
+ { ERROR_INVALID_PARAMETER, EINVAL }, /* 87 */
+ { ERROR_NO_PROC_SLOTS, EAGAIN }, /* 89 */
+ { ERROR_DRIVE_LOCKED, EACCES }, /* 108 */
+ { ERROR_BROKEN_PIPE, EPIPE }, /* 109 */
+ { ERROR_DISK_FULL, ENOSPC }, /* 112 */
+ { ERROR_INVALID_TARGET_HANDLE, EBADF }, /* 114 */
+ { ERROR_INVALID_HANDLE, EINVAL }, /* 124 */
+ { ERROR_WAIT_NO_CHILDREN, ECHILD }, /* 128 */
+ { ERROR_CHILD_NOT_COMPLETE, ECHILD }, /* 129 */
+ { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, /* 130 */
+ { ERROR_NEGATIVE_SEEK, EINVAL }, /* 131 */
+ { ERROR_SEEK_ON_DEVICE, EACCES }, /* 132 */
+ { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, /* 145 */
+ { ERROR_NOT_LOCKED, EACCES }, /* 158 */
+ { ERROR_BAD_PATHNAME, ENOENT }, /* 161 */
+ { ERROR_MAX_THRDS_REACHED, EAGAIN }, /* 164 */
+ { ERROR_LOCK_FAILED, EACCES }, /* 167 */
+ { ERROR_ALREADY_EXISTS, EEXIST }, /* 183 */
+ { ERROR_FILENAME_EXCED_RANGE, ENOENT }, /* 206 */
+ { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, /* 215 */
+ /* Windows returns this when the read end of a pipe is
+ * closed (or closing) and we write to it. */
+ { ERROR_NO_DATA, EPIPE }, /* 232 */
+ { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } /* 1816 */
+};
+
+/* size of the table */
+#define ERRTABLESIZE (sizeof(errtable)/sizeof(errtable[0]))
+
+/* The following two constants must be the minimum and maximum
+ values in the (contiguous) range of Exec Failure errors. */
+#define MIN_EXEC_ERROR ERROR_INVALID_STARTING_CODESEG
+#define MAX_EXEC_ERROR ERROR_INFLOOP_IN_RELOC_CHAIN
+
+/* These are the low and high value in the range of errors that are
+ access violations */
+#define MIN_EACCES_RANGE ERROR_WRITE_PROTECT
+#define MAX_EACCES_RANGE ERROR_SHARING_BUFFER_EXCEEDED
+
+void maperrno (void)
+{
+ int i;
+ DWORD dwErrorCode;
+
+ dwErrorCode = GetLastError();
+
+ /* check the table for the OS error code */
+ for (i = 0; i < ERRTABLESIZE; ++i)
+ {
+ if (dwErrorCode == errtable[i].oscode)
+ {
+ errno = errtable[i].errnocode;
+ return;
+ }
+ }
+
+ /* The error code wasn't in the table. We check for a range of */
+ /* EACCES errors or exec failure errors (ENOEXEC). Otherwise */
+ /* EINVAL is returned. */
+
+ if (dwErrorCode >= MIN_EACCES_RANGE && dwErrorCode <= MAX_EACCES_RANGE)
+ errno = EACCES;
+ else
+ if (dwErrorCode >= MIN_EXEC_ERROR && dwErrorCode <= MAX_EXEC_ERROR)
+ errno = ENOEXEC;
+ else
+ errno = EINVAL;
+}
+
+HsWord64 getUSecOfDay(void)
+{
+ HsWord64 t;
+ FILETIME ft;
+ GetSystemTimeAsFileTime(&ft);
+ t = ((HsWord64)ft.dwHighDateTime << 32) | ft.dwLowDateTime;
+ t = t / 10LL;
+ /* FILETIMES are in units of 100ns,
+ so we divide by 10 to get microseconds */
+ return t;
+}
+
+#endif
+