Merge pull request #3806 from BrzVlad/feature-parallel-gc-final
[mono.git] / mono / metadata / w32error-unix.c
1
2 #include "w32error.h"
3
4 #include "utils/mono-lazy-init.h"
5
6 static mono_lazy_init_t error_key_once = MONO_LAZY_INIT_STATUS_NOT_INITIALIZED;
7
8 static pthread_key_t error_key;
9
10 static void
11 error_key_init (void)
12 {
13         gint ret;
14         ret = pthread_key_create (&error_key, NULL);
15         g_assert (ret == 0);
16 }
17
18 guint32
19 mono_w32error_get_last (void)
20 {
21         mono_lazy_initialize (&error_key_once, error_key_init);
22         return GPOINTER_TO_UINT (pthread_getspecific (error_key));
23 }
24
25 void
26 mono_w32error_set_last (guint32 error)
27 {
28         gint ret;
29         mono_lazy_initialize (&error_key_once, error_key_init);
30         ret = pthread_setspecific (error_key, GUINT_TO_POINTER (error));
31         g_assert (ret == 0);
32 }
33
34 guint32
35 mono_w32error_unix_to_win32 (guint32 error)
36 {
37         /* mapping ideas borrowed from wine. they may need some work */
38
39         switch (error) {
40         case EACCES:
41         case EPERM:
42         case EROFS: return ERROR_ACCESS_DENIED;
43         case EAGAIN: return ERROR_SHARING_VIOLATION;
44         case EBUSY: return ERROR_LOCK_VIOLATION;
45         case EEXIST: return ERROR_FILE_EXISTS;
46         case EINVAL:
47         case ESPIPE: return ERROR_SEEK;
48         case EISDIR: return ERROR_CANNOT_MAKE;
49         case ENFILE:
50         case EMFILE: return ERROR_TOO_MANY_OPEN_FILES;
51         case ENOENT:
52         case ENOTDIR: return ERROR_FILE_NOT_FOUND;
53         case ENOSPC: return ERROR_HANDLE_DISK_FULL;
54         case ENOTEMPTY: return ERROR_DIR_NOT_EMPTY;
55         case ENOEXEC: return ERROR_BAD_FORMAT;
56         case ENAMETOOLONG: return ERROR_FILENAME_EXCED_RANGE;
57 #ifdef EINPROGRESS
58         case EINPROGRESS: return ERROR_IO_PENDING;
59 #endif
60         case ENOSYS: return ERROR_NOT_SUPPORTED;
61         case EBADF: return ERROR_INVALID_HANDLE;
62         case EIO: return ERROR_INVALID_HANDLE;
63         case EINTR: return ERROR_IO_PENDING; /* best match I could find */
64         case EPIPE: return ERROR_WRITE_FAULT;
65         default:
66                 g_error ("%s: unknown error (%d) \"%s\"", error, g_strerror (error));
67         }
68 }