Bladeren bron

Add support for simultaneous mapped files in Windows

master
Nathaniel Walizer 11 maanden geleden
bovenliggende
commit
25a4d50e7e
1 gewijzigde bestanden met toevoegingen van 51 en 5 verwijderingen
  1. +51
    -5
      src/win/filemap.c

+ 51
- 5
src/win/filemap.c Bestand weergeven

@@ -9,21 +9,67 @@
#include "filemap.h"


// TODO: Support multiple filemaps
static HANDLE hMap;
// Support multiple filemaps

typedef struct map_handle_t {
const void* mem;
HANDLE hMap;
struct map_handle_t* next;
} map_handle;

static map_handle* map_handle_head = NULL;

static HANDLE take_map_handle(const void* mem) {
HANDLE handle = NULL;
map_handle* last = NULL;
for ( map_handle* node = map_handle_head;
NULL != node;
last = node, node = node->next) {
if (mem == node->mem) {
if (NULL == last) {
map_handle_head = node->next;
} else {
last->next = node->next;
}
handle = node->hMap;
free(node);
}
}
return handle;
}

static void store_map_handle(const void* mem, HANDLE handle) {
map_handle* node = malloc(sizeof(map_handle));
node->mem = mem;
node->hMap = handle;
node->next = map_handle_head;
map_handle_head = node;
}


void* map_file(FILE* file, int size) {
void* mem = NULL;

HANDLE hFile = (HANDLE)_get_osfhandle(fileno(file));

hMap = CreateFileMappingA(
HANDLE hMap = CreateFileMappingA(
hFile, 0, PAGE_READONLY, 0, size, 0
);

return MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, size);
if (NULL != hMap) {
mem = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, size);
if (NULL == mem) {
CloseHandle(hMap);
} else {
store_map_handle(mem, hMap);
}
}

return mem;
}

void unmap_file(void* mem, int size) {
UnmapViewOfFile(mem);
CloseHandle(hMap);
HANDLE handle = take_map_handle(mem);
if (NULL != handle) CloseHandle(handle);
}

Laden…
Annuleren
Opslaan