]> gitweb.factorcode.org Git - factor.git/blob - vm/os-windows.cpp
Use C++ namespaces
[factor.git] / vm / os-windows.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 HMODULE hFactorDll;
7
8 void init_ffi(void)
9 {
10         hFactorDll = GetModuleHandle(FACTOR_DLL);
11         if(!hFactorDll)
12                 fatal_error("GetModuleHandle(\"" FACTOR_DLL_NAME "\") failed", 0);
13 }
14
15 void ffi_dlopen(F_DLL *dll)
16 {
17         dll->dll = LoadLibraryEx(alien_offset(dll->path), NULL, 0);
18 }
19
20 void *ffi_dlsym(F_DLL *dll, F_SYMBOL *symbol)
21 {
22         return GetProcAddress(dll ? (HMODULE)dll->dll : hFactorDll, symbol);
23 }
24
25 void ffi_dlclose(F_DLL *dll)
26 {
27         FreeLibrary((HMODULE)dll->dll);
28         dll->dll = NULL;
29 }
30
31 bool windows_stat(F_CHAR *path)
32 {
33         BY_HANDLE_FILE_INFORMATION bhfi;
34         HANDLE h = CreateFileW(path,
35                         GENERIC_READ,
36                         FILE_SHARE_READ,
37                         NULL,
38                         OPEN_EXISTING,
39                         FILE_FLAG_BACKUP_SEMANTICS,
40                         NULL);
41
42         if(h == INVALID_HANDLE_VALUE)
43         {
44                 // FindFirstFile is the only call that can stat c:\pagefile.sys
45                 WIN32_FIND_DATA st;
46                 HANDLE h;
47
48                 if(INVALID_HANDLE_VALUE == (h = FindFirstFile(path, &st)))
49                         return false;
50                 FindClose(h);
51                 return true;
52         }
53         bool ret;
54         ret = GetFileInformationByHandle(h, &bhfi);
55         CloseHandle(h);
56         return ret;
57 }
58
59 void windows_image_path(F_CHAR *full_path, F_CHAR *temp_path, unsigned int length)
60 {
61         snwprintf(temp_path, length-1, L"%s.image", full_path); 
62         temp_path[sizeof(temp_path) - 1] = 0;
63 }
64
65 /* You must free() this yourself. */
66 const F_CHAR *default_image_path(void)
67 {
68         F_CHAR full_path[MAX_UNICODE_PATH];
69         F_CHAR *ptr;
70         F_CHAR temp_path[MAX_UNICODE_PATH];
71
72         if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
73                 fatal_error("GetModuleFileName() failed", 0);
74
75         if((ptr = wcsrchr(full_path, '.')))
76                 *ptr = 0;
77
78         snwprintf(temp_path, sizeof(temp_path)-1, L"%s.image", full_path); 
79         temp_path[sizeof(temp_path) - 1] = 0;
80
81         return safe_strdup(temp_path);
82 }
83
84 /* You must free() this yourself. */
85 const F_CHAR *vm_executable_path(void)
86 {
87         F_CHAR full_path[MAX_UNICODE_PATH];
88         if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
89                 fatal_error("GetModuleFileName() failed", 0);
90         return safe_strdup(full_path);
91 }
92
93
94 PRIMITIVE(existsp)
95 {
96         F_CHAR *path = (F_CHAR *)(untag_check<F_BYTE_ARRAY>(dpop()) + 1);
97         box_boolean(windows_stat(path));
98 }
99
100 F_SEGMENT *alloc_segment(CELL size)
101 {
102         char *mem;
103         DWORD ignore;
104
105         if((mem = (char *)VirtualAlloc(NULL, getpagesize() * 2 + size,
106                 MEM_COMMIT, PAGE_EXECUTE_READWRITE)) == 0)
107                 out_of_memory();
108
109         if (!VirtualProtect(mem, getpagesize(), PAGE_NOACCESS, &ignore))
110                 fatal_error("Cannot allocate low guard page", (CELL)mem);
111
112         if (!VirtualProtect(mem + size + getpagesize(),
113                 getpagesize(), PAGE_NOACCESS, &ignore))
114                 fatal_error("Cannot allocate high guard page", (CELL)mem);
115
116         F_SEGMENT *block = safe_malloc(sizeof(F_SEGMENT));
117
118         block->start = (CELL)mem + getpagesize();
119         block->size = size;
120         block->end = block->start + size;
121
122         return block;
123 }
124
125 void dealloc_segment(F_SEGMENT *block)
126 {
127         SYSTEM_INFO si;
128         GetSystemInfo(&si);
129         if(!VirtualFree((void*)(block->start - si.dwPageSize), 0, MEM_RELEASE))
130                 fatal_error("dealloc_segment failed",0);
131         free(block);
132 }
133
134 long getpagesize(void)
135 {
136         static long g_pagesize = 0;
137         if (! g_pagesize)
138         {
139                 SYSTEM_INFO system_info;
140                 GetSystemInfo (&system_info);
141                 g_pagesize = system_info.dwPageSize;
142         }
143         return g_pagesize;
144 }
145
146 void sleep_micros(u64 usec)
147 {
148         Sleep((DWORD)(usec / 1000));
149 }
150
151 }