1
1
#include " lib.hpp"
2
2
3
3
std::vector<void *> registeredPages = {};
4
+ std::vector<size_t > registeredPageSizes = {};
4
5
bytes globalTable = {};
5
6
bytes globalTypes = {};
6
7
std::vector<int > globalMut = {};
7
8
bytes localTypes = {};
8
9
uint64_t globalTableAddr;
9
10
uint64_t errorPageAddr;
11
+ uint32_t page_size;
10
12
11
13
bytes errorPage = {
12
14
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // successful result struct
@@ -32,17 +34,15 @@ std::vector<T> concat(std::vector<T> v0, std::vector<std::vector<T>> vn)
32
34
void *writePage (bytes data)
33
35
{
34
36
void *buf;
37
+ size_t size = page_size * (1 + data.size () / page_size);
35
38
#ifdef __linux__
36
- size_t size = sysconf (_SC_PAGE_SIZE) * (1 + data.size () / sysconf (_SC_PAGE_SIZE));
37
39
buf = mmap (NULL , size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
38
40
#elif _WIN32
39
- SYSTEM_INFO sysinfo;
40
- GetSystemInfo (&sysinfo);
41
- size_t size = sysinfo.dwPageSize * (1 + data.size () / sysinfo.dwPageSize );
42
41
buf = VirtualAlloc (nullptr , size, MEM_COMMIT, PAGE_READWRITE);
43
42
#endif
44
43
memcpy (buf, data.data (), data.size ());
45
44
registeredPages.push_back (buf);
45
+ registeredPageSizes.push_back (size);
46
46
return buf;
47
47
}
48
48
@@ -51,7 +51,7 @@ void freePages()
51
51
for (size_t i = 0 ; i < registeredPages.size (); i++)
52
52
{
53
53
#ifdef __linux__
54
- munmap (registeredPages.at (i), sysconf (_SC_PAGE_SIZE ));
54
+ munmap (registeredPages.at (i), registeredPageSizes. at (i ));
55
55
#elif _WIN32
56
56
VirtualFree (registeredPages.at (i), 0 , MEM_RELEASE);
57
57
#endif
@@ -217,15 +217,15 @@ bytes regParam64(const char *argbuf, Py_ssize_t arglen)
217
217
return code;
218
218
}
219
219
220
- struct operation
220
+ typedef struct operation
221
221
{
222
222
uint8_t opcode;
223
223
std::vector<wchar_t *> arguments;
224
224
std::vector<wchar_t *> results;
225
225
long consumes;
226
226
bytes code;
227
227
operation (uint8_t opcode, std::vector<wchar_t *> arguments, std::vector<wchar_t *> results) : opcode(opcode), arguments(arguments), results(results), consumes(0 ){};
228
- };
228
+ } operation ;
229
229
230
230
static PyObject *createFunction (PyObject *self, PyObject *args)
231
231
{
@@ -634,6 +634,14 @@ static PyModuleDef module = {
634
634
635
635
PyMODINIT_FUNC PyInit_nativelib ()
636
636
{
637
+ #ifdef __linux__
638
+ page_size = sysconf (_SC_PAGE_SIZE);
639
+ #elif _WIN32
640
+ SYSTEM_INFO sysinfo;
641
+ GetSystemInfo (&sysinfo);
642
+ page_size = sysinfo.dwPageSize ;
643
+ #endif
644
+
637
645
errorPageAddr = (uint64_t )writePage (errorPage);
638
646
Py_AtExit (&freePages);
639
647
return PyModule_Create (&module );
0 commit comments