C: fix compilation on UWP

This commit is contained in:
Alexey Andreev 2019-06-18 19:17:09 +03:00
parent b72e4f01e2
commit 9e4c3010b0
3 changed files with 65 additions and 27 deletions

View File

@ -383,8 +383,12 @@ int32_t teavm_file_isDir(char16_t* name, int32_t nameSize) {
static int32_t teavm_file_checkExistingFileAccess(char16_t* name, int32_t nameSize, DWORD desiredAccess) {
WCHAR* nativeName = teavm_file_convertPath(name, nameSize);
#ifdef _WINDOWS_UWP
HANDLE fileHandle = CreateFile2(nativeName, desiredAccess, FILE_SHARE_READ, OPEN_EXISTING, NULL);
#else
HANDLE fileHandle = CreateFileW(nativeName, desiredAccess, FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
#endif
int32_t result = fileHandle != INVALID_HANDLE_VALUE;
if (fileHandle != INVALID_HANDLE_VALUE) {
CloseHandle(fileHandle);
@ -409,7 +413,11 @@ int32_t teavm_file_createDirectory(char16_t* name, int32_t nameSize) {
int32_t teavm_file_createFile(char16_t* name, int32_t nameSize) {
WCHAR* nativeName = teavm_file_convertPath(name, nameSize);
#ifdef _WINDOWS_UWP
HANDLE fileHandle = CreateFile2(nativeName, GENERIC_WRITE, 0, OPEN_EXISTING, NULL);
#else
HANDLE fileHandle = CreateFileW(nativeName, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
#endif
int32_t result = 2;
free(nativeName);
@ -436,7 +444,7 @@ int32_t teavm_file_delete(char16_t* name, int32_t nameSize) {
int32_t teavm_file_rename(char16_t* name, int32_t nameSize, char16_t* newName, int32_t newNameSize) {
WCHAR* nativeName = teavm_file_convertPath(name, nameSize);
WCHAR* nativeNewName = teavm_file_convertPath(newName, newNameSize);
int32_t result = MoveFileW(nativeName, nativeNewName);
int32_t result = MoveFileExW(nativeName, nativeNewName, 0);
free(nativeName);
free(nativeNewName);
return result;
@ -462,7 +470,11 @@ int32_t teavm_file_setReadonly(char16_t* name, int32_t nameSize, int32_t readonl
int64_t teavm_file_lastModified(char16_t* name, int32_t nameSize) {
WCHAR* nativeName = teavm_file_convertPath(name, nameSize);
FILETIME modified;
#ifdef _WINDOWS_UWP
HANDLE fileHandle = CreateFile2(nativeName, GENERIC_READ, 0, OPEN_EXISTING, NULL);
#else
HANDLE fileHandle = CreateFileW(nativeName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
#endif
free(nativeName);
if (fileHandle == INVALID_HANDLE_VALUE) {
return 0;
@ -481,7 +493,11 @@ int64_t teavm_file_lastModified(char16_t* name, int32_t nameSize) {
int32_t teavm_file_setLastModified(char16_t* name, int32_t nameSize, int64_t lastModified) {
WCHAR* nativeName = teavm_file_convertPath(name, nameSize);
#ifdef _WINDOWS_UWP
HANDLE fileHandle = CreateFile2(nativeName, GENERIC_WRITE, 0, OPEN_EXISTING, NULL);
#else
HANDLE fileHandle = CreateFileW(nativeName, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
#endif
free(nativeName);
if (fileHandle == INVALID_HANDLE_VALUE) {
return 0;
@ -514,7 +530,12 @@ int64_t teavm_file_open(char16_t* name, int32_t nameSize, int32_t mode) {
DWORD desiredAccess = (readable ? GENERIC_READ : 0) | (writable ? GENERIC_WRITE : 0);
WCHAR* nativeName = teavm_file_convertPath(name, nameSize);
HANDLE fileHandle = CreateFileW(nativeName, desiredAccess, 0, 0, creationDisposition, FILE_ATTRIBUTE_NORMAL, 0);
#ifdef _WINDOWS_UWP
HANDLE fileHandle = CreateFile2(nativeName, desiredAccess, 0, creationDisposition, NULL);
#else
HANDLE fileHandle = CreateFileW(nativeName, desiredAccess, 0, 0, creationDisposition,
FILE_ATTRIBUTE_NORMAL, 0);
#endif
free(nativeName);
if (fileHandle == INVALID_HANDLE_VALUE) {

View File

@ -147,6 +147,24 @@ int64_t teavm_currentTimeNano() {
#endif
#ifdef _MSC_VER
static void* teavm_virtualAlloc(int size) {
#ifdef _WINDOWS_UWP
return VirtualAllocFromApp(
NULL,
size,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE
);
#else
return VirtualAlloc(
NULL,
size,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE
);
#endif
}
void teavm_initHeap(int64_t heapSize) {
long workSize = heapSize / 16;
long regionsSize = (long) (heapSize / teavm_gc_regionSize);
@ -158,24 +176,9 @@ void teavm_initHeap(int64_t heapSize) {
int workPages = (int) ((workSize + pageSize + 1) / pageSize * pageSize);
int regionsPages = (int) ((regionsSize * 2 + pageSize + 1) / pageSize * pageSize);
teavm_gc_heapAddress = VirtualAlloc(
NULL,
heapPages,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE
);
teavm_gc_gcStorageAddress = VirtualAlloc(
NULL,
workPages,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE
);
teavm_gc_regionsAddress = VirtualAlloc(
NULL,
regionsPages,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE
);
teavm_gc_heapAddress = teavm_virtualAlloc(heapPages);
teavm_gc_gcStorageAddress = teavm_virtualAlloc(workPages);
teavm_gc_regionsAddress = teavm_virtualAlloc(regionsPages);
teavm_gc_gcStorageSize = (int) workSize;
teavm_gc_regionMaxCount = regionsSize;
@ -202,10 +205,17 @@ int64_t teavm_currentTimeNano() {
}
#endif
#ifdef _MSC_VER
#define gmtime_r(a, b) gmtime_s(b, a)
#define mktime_r(a, b) mktime_s(b, a)
#define localtime_r(a, b) localtime_s(b, a)
#endif
int32_t teavm_timeZoneOffset() {
struct tm tm;
time_t t = time(NULL);
time_t local = mktime(localtime(&t));
time_t utc = mktime(gmtime(&t));
time_t local = mktime(localtime_r(&t, &tm));
time_t utc = mktime(gmtime_r(&t, &tm));
return difftime(utc, local) / 60;
}

View File

@ -12,6 +12,13 @@
#ifdef _MSC_VER
#define alignas(n) __declspec(align(n))
#pragma comment (lib,"uuid.lib")
#ifdef WINAPI_FAMILY
#if WINAPI_FAMILY == 2 || WINAPI_FAMILY == 3 || WINAPI_FAMILY == 5
#define _WINDOWS_UWP 1
#endif
#endif
#endif
typedef struct TeaVM_Object {