forked from LeenkxTeam/LNXRNT
Multithread
This commit is contained in:
69
Sources/data_map.h
Normal file
69
Sources/data_map.h
Normal file
@ -0,0 +1,69 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
#else
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
struct DataMap {
|
||||
void* data = nullptr;
|
||||
size_t size = 0;
|
||||
|
||||
#ifdef _WIN32
|
||||
HANDLE map_handle = nullptr;
|
||||
#endif
|
||||
|
||||
bool map_from_reader(void* reader_data, size_t reader_size) {
|
||||
size = reader_size;
|
||||
if (size == 0) return true;
|
||||
#ifdef _WIN32
|
||||
HANDLE file_handle = reader_data;
|
||||
map_handle = CreateFileMappingA(file_handle, nullptr, PAGE_READONLY, 0, 0, nullptr);
|
||||
if (!map_handle) return false;
|
||||
data = MapViewOfFile(map_handle, FILE_MAP_READ, 0, 0, 0);
|
||||
if (!data) {
|
||||
CloseHandle(map_handle);
|
||||
map_handle = nullptr;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#else
|
||||
int fd = fileno((FILE*)reader_data);
|
||||
if (fd < 0) return false;
|
||||
data = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||||
if (data == MAP_FAILED) {
|
||||
data = nullptr;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
void close() {
|
||||
if (data) {
|
||||
#ifdef _WIN32
|
||||
UnmapViewOfFile(data);
|
||||
#else
|
||||
munmap(data, size);
|
||||
#endif
|
||||
data = nullptr;
|
||||
}
|
||||
#ifdef _WIN32
|
||||
if (map_handle) { CloseHandle(map_handle); map_handle = nullptr; }
|
||||
#endif
|
||||
size = 0;
|
||||
}
|
||||
|
||||
~DataMap() { close(); }
|
||||
};
|
||||
|
||||
inline void delete_map(void* ptr, size_t length, void* deleter_data) {
|
||||
DataMap* dm = static_cast<DataMap*>(deleter_data);
|
||||
if (dm) dm->close();
|
||||
delete dm;
|
||||
}
|
||||
Reference in New Issue
Block a user