Copying file contents rather than memory mapping

This commit is contained in:
gingerBill
2021-10-12 11:06:39 +01:00
parent 75e3df6da2
commit 2ad6aa7886
4 changed files with 47 additions and 44 deletions
+4
View File
@@ -223,6 +223,8 @@ struct BuildContext {
bool show_debug_messages; bool show_debug_messages;
bool copy_file_contents;
u32 cmd_doc_flags; u32 cmd_doc_flags;
Array<String> extra_packages; Array<String> extra_packages;
@@ -772,6 +774,8 @@ void init_build_context(TargetMetrics *cross_target) {
bc->ODIN_VERSION = ODIN_VERSION; bc->ODIN_VERSION = ODIN_VERSION;
bc->ODIN_ROOT = odin_root_dir(); bc->ODIN_ROOT = odin_root_dir();
bc->copy_file_contents = true;
TargetMetrics *metrics = nullptr; TargetMetrics *metrics = nullptr;
#if defined(GB_ARCH_64_BIT) #if defined(GB_ARCH_64_BIT)
+25 -25
View File
@@ -883,33 +883,33 @@ ReadDirectoryError read_directory(String path, Array<FileInfo> *fi) {
struct MemoryMappedFile { struct LoadedFile {
void *handle; void *handle;
void *data; void const *data;
i32 size; i32 size;
}; };
enum MemoryMappedFileError { enum LoadedFileError {
MemoryMappedFile_None, LoadedFile_None,
MemoryMappedFile_Empty, LoadedFile_Empty,
MemoryMappedFile_FileTooLarge, LoadedFile_FileTooLarge,
MemoryMappedFile_Invalid, LoadedFile_Invalid,
MemoryMappedFile_NotExists, LoadedFile_NotExists,
MemoryMappedFile_Permission, LoadedFile_Permission,
MemoryMappedFile_COUNT, LoadedFile_COUNT,
}; };
MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile *memory_mapped_file, bool copy_file_contents) { LoadedFileError load_file_32(char const *fullpath, LoadedFile *memory_mapped_file, bool copy_file_contents) {
MemoryMappedFileError err = MemoryMappedFile_None; LoadedFileError err = LoadedFile_None;
if (!copy_file_contents) { if (!copy_file_contents) {
#if defined(GB_SYSTEM_WINDOWS) #if defined(GB_SYSTEM_WINDOWS)
isize w_len = 0; isize w_len = 0;
wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len); wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len);
if (w_str == nullptr) { if (w_str == nullptr) {
return MemoryMappedFile_Invalid; return LoadedFile_Invalid;
} }
i64 file_size = 0; i64 file_size = 0;
LARGE_INTEGER li_file_size = {}; LARGE_INTEGER li_file_size = {};
@@ -930,12 +930,12 @@ MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile
file_size = cast(i64)li_file_size.QuadPart; file_size = cast(i64)li_file_size.QuadPart;
if (file_size > I32_MAX) { if (file_size > I32_MAX) {
CloseHandle(handle); CloseHandle(handle);
return MemoryMappedFile_FileTooLarge; return LoadedFile_FileTooLarge;
} }
if (file_size == 0) { if (file_size == 0) {
CloseHandle(handle); CloseHandle(handle);
err = MemoryMappedFile_Empty; err = LoadedFile_Empty;
memory_mapped_file->handle = nullptr; memory_mapped_file->handle = nullptr;
memory_mapped_file->data = nullptr; memory_mapped_file->data = nullptr;
memory_mapped_file->size = 0; memory_mapped_file->size = 0;
@@ -955,16 +955,16 @@ MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile
{ {
DWORD handle_err = GetLastError(); DWORD handle_err = GetLastError();
CloseHandle(handle); CloseHandle(handle);
err = MemoryMappedFile_Invalid; err = LoadedFile_Invalid;
switch (handle_err) { switch (handle_err) {
case ERROR_FILE_NOT_FOUND: case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND: case ERROR_PATH_NOT_FOUND:
case ERROR_INVALID_DRIVE: case ERROR_INVALID_DRIVE:
err = MemoryMappedFile_NotExists; err = LoadedFile_NotExists;
break; break;
case ERROR_ACCESS_DENIED: case ERROR_ACCESS_DENIED:
case ERROR_INVALID_ACCESS: case ERROR_INVALID_ACCESS:
err = MemoryMappedFile_Permission; err = LoadedFile_Permission;
break; break;
} }
return err; return err;
@@ -975,7 +975,7 @@ MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile
gbFileContents fc = gb_file_read_contents(heap_allocator(), true, fullpath); gbFileContents fc = gb_file_read_contents(heap_allocator(), true, fullpath);
if (fc.size > I32_MAX) { if (fc.size > I32_MAX) {
err = MemoryMappedFile_FileTooLarge; err = LoadedFile_FileTooLarge;
gb_file_free_contents(&fc); gb_file_free_contents(&fc);
} else if (fc.data != nullptr) { } else if (fc.data != nullptr) {
memory_mapped_file->handle = nullptr; memory_mapped_file->handle = nullptr;
@@ -987,13 +987,13 @@ MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile
defer (gb_file_close(&f)); defer (gb_file_close(&f));
switch (file_err) { switch (file_err) {
case gbFileError_Invalid: err = MemoryMappedFile_Invalid; break; case gbFileError_Invalid: err = LoadedFile_Invalid; break;
case gbFileError_NotExists: err = MemoryMappedFile_NotExists; break; case gbFileError_NotExists: err = LoadedFile_NotExists; break;
case gbFileError_Permission: err = MemoryMappedFile_Permission; break; case gbFileError_Permission: err = LoadedFile_Permission; break;
} }
if (err == MemoryMappedFile_None && gb_file_size(&f) == 0) { if (err == LoadedFile_None && gb_file_size(&f) == 0) {
err = MemoryMappedFile_Empty; err = LoadedFile_Empty;
} }
} }
return err; return err;
+1 -2
View File
@@ -4615,8 +4615,7 @@ ParseFileError init_ast_file(AstFile *f, String fullpath, TokenPos *err_pos) {
zero_item(&f->tokenizer); zero_item(&f->tokenizer);
f->tokenizer.curr_file_id = f->id; f->tokenizer.curr_file_id = f->id;
bool copy_file_contents = build_context.command_kind == Command_strip_semicolon; TokenizerInitError err = init_tokenizer_from_fullpath(&f->tokenizer, f->fullpath, build_context.copy_file_contents);
TokenizerInitError err = init_tokenizer_from_fullpath(&f->tokenizer, f->fullpath, copy_file_contents);
if (err != TokenizerInit_None) { if (err != TokenizerInit_None) {
switch (err) { switch (err) {
case TokenizerInit_Empty: case TokenizerInit_Empty:
+17 -17
View File
@@ -723,7 +723,7 @@ struct Tokenizer {
bool insert_semicolon; bool insert_semicolon;
MemoryMappedFile memory_mapped_file; LoadedFile loaded_file;
}; };
@@ -790,7 +790,7 @@ void advance_to_next_rune(Tokenizer *t) {
} }
} }
void init_tokenizer_with_data(Tokenizer *t, String const &fullpath, void *data, isize size) { void init_tokenizer_with_data(Tokenizer *t, String const &fullpath, void const *data, isize size) {
t->fullpath = fullpath; t->fullpath = fullpath;
t->line_count = 1; t->line_count = 1;
@@ -804,29 +804,29 @@ void init_tokenizer_with_data(Tokenizer *t, String const &fullpath, void *data,
} }
} }
TokenizerInitError memory_mapped_file_error_map_to_tokenizer[MemoryMappedFile_COUNT] = { TokenizerInitError loaded_file_error_map_to_tokenizer[LoadedFile_COUNT] = {
TokenizerInit_None, /*MemoryMappedFile_None*/ TokenizerInit_None, /*LoadedFile_None*/
TokenizerInit_Empty, /*MemoryMappedFile_Empty*/ TokenizerInit_Empty, /*LoadedFile_Empty*/
TokenizerInit_FileTooLarge, /*MemoryMappedFile_FileTooLarge*/ TokenizerInit_FileTooLarge, /*LoadedFile_FileTooLarge*/
TokenizerInit_Invalid, /*MemoryMappedFile_Invalid*/ TokenizerInit_Invalid, /*LoadedFile_Invalid*/
TokenizerInit_NotExists, /*MemoryMappedFile_NotExists*/ TokenizerInit_NotExists, /*LoadedFile_NotExists*/
TokenizerInit_Permission, /*MemoryMappedFile_Permission*/ TokenizerInit_Permission, /*LoadedFile_Permission*/
}; };
TokenizerInitError init_tokenizer_from_fullpath(Tokenizer *t, String const &fullpath, bool copy_file_contents) { TokenizerInitError init_tokenizer_from_fullpath(Tokenizer *t, String const &fullpath, bool copy_file_contents) {
MemoryMappedFileError mmf_err = memory_map_file_32( LoadedFileError file_err = load_file_32(
alloc_cstring(temporary_allocator(), fullpath), alloc_cstring(temporary_allocator(), fullpath),
&t->memory_mapped_file, &t->loaded_file,
copy_file_contents copy_file_contents
); );
TokenizerInitError err = memory_mapped_file_error_map_to_tokenizer[mmf_err]; TokenizerInitError err = loaded_file_error_map_to_tokenizer[file_err];
switch (mmf_err) { switch (file_err) {
case MemoryMappedFile_None: case LoadedFile_None:
init_tokenizer_with_data(t, fullpath, t->memory_mapped_file.data, cast(isize)t->memory_mapped_file.size); init_tokenizer_with_data(t, fullpath, t->loaded_file.data, cast(isize)t->loaded_file.size);
break; break;
case MemoryMappedFile_FileTooLarge: case LoadedFile_FileTooLarge:
case MemoryMappedFile_Empty: case LoadedFile_Empty:
t->fullpath = fullpath; t->fullpath = fullpath;
t->line_count = 1; t->line_count = 1;
break; break;