Remove TEMP_ALLOCATOR_GUARD wrapper

This commit is contained in:
Lucas Perlind
2025-05-08 17:41:03 +10:00
parent 5292a7f4f3
commit 9f2d008a8a
33 changed files with 113 additions and 116 deletions
+11 -14
View File
@@ -23,12 +23,19 @@ temp_allocator_fini :: proc() {
global_default_temp_allocator_arenas = {} global_default_temp_allocator_arenas = {}
} }
TEMP_ALLOCATOR_GUARD_END :: proc(temp: runtime.Arena_Temp, loc := #caller_location) { Temp_Allocator :: struct {
runtime.arena_temp_end(temp, loc) using arena: ^runtime.Arena,
using allocator: runtime.Allocator,
tmp: runtime.Arena_Temp,
loc: runtime.Source_Code_Location,
}
TEMP_ALLOCATOR_GUARD_END :: proc(temp: Temp_Allocator) {
runtime.arena_temp_end(temp.tmp, temp.loc)
} }
@(deferred_out=TEMP_ALLOCATOR_GUARD_END) @(deferred_out=TEMP_ALLOCATOR_GUARD_END)
TEMP_ALLOCATOR_GUARD :: #force_inline proc(collisions: []runtime.Allocator, loc := #caller_location) -> (runtime.Arena_Temp, runtime.Source_Code_Location) { TEMP_ALLOCATOR_GUARD :: #force_inline proc(collisions: []runtime.Allocator, loc := #caller_location) -> Temp_Allocator {
assert(len(collisions) <= MAX_TEMP_ARENA_COLLISIONS) assert(len(collisions) <= MAX_TEMP_ARENA_COLLISIONS)
good_arena: ^runtime.Arena good_arena: ^runtime.Arena
for i in 0..<MAX_TEMP_ARENA_COUNT { for i in 0..<MAX_TEMP_ARENA_COUNT {
@@ -47,16 +54,7 @@ TEMP_ALLOCATOR_GUARD :: #force_inline proc(collisions: []runtime.Allocator, loc
good_arena.backing_allocator = heap_allocator() good_arena.backing_allocator = heap_allocator()
} }
tmp := runtime.arena_temp_begin(good_arena, loc) tmp := runtime.arena_temp_begin(good_arena, loc)
return tmp, loc return { good_arena, runtime.arena_allocator(good_arena), tmp, loc }
}
Temp_Allocator :: struct {
using arena: ^runtime.Arena,
using allocator: runtime.Allocator,
}
get_temp_allocator :: proc(tmp: runtime.Arena_Temp, _: runtime.Source_Code_Location) -> Temp_Allocator {
return { tmp.arena, runtime.arena_allocator(tmp.arena) }
} }
temp_allocator_begin :: runtime.arena_temp_begin temp_allocator_begin :: runtime.arena_temp_begin
@@ -70,7 +68,6 @@ _temp_allocator_end :: proc(tmp: runtime.Arena_Temp) {
temp_allocator_end(tmp) temp_allocator_end(tmp)
} }
@(init, private) @(init, private)
init_thread_local_cleaner :: proc() { init_thread_local_cleaner :: proc() {
runtime.add_thread_local_cleaner(temp_allocator_fini) runtime.add_thread_local_cleaner(temp_allocator_fini)
+2 -2
View File
@@ -18,7 +18,7 @@ read_directory :: proc(f: ^File, n: int, allocator: runtime.Allocator) -> (files
size = 100 size = 100
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
it := read_directory_iterator_create(f) it := read_directory_iterator_create(f)
defer _read_directory_iterator_destroy(&it) defer _read_directory_iterator_destroy(&it)
@@ -202,7 +202,7 @@ copy_directory :: proc(dst, src: string, dst_perm := 0o755) -> Error {
return err return err
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
file_infos := read_all_directory_by_path(src, temp_allocator) or_return file_infos := read_all_directory_by_path(src, temp_allocator) or_return
for fi in file_infos { for fi in file_infos {
+1 -1
View File
@@ -78,7 +78,7 @@ _read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info
it.impl.prev_fi = fi it.impl.prev_fi = fi
if err != nil { if err != nil {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
path, _ := _get_full_path(entry_fd, temp_allocator) path, _ := _get_full_path(entry_fd, temp_allocator)
read_directory_iterator_set_error(it, path, err) read_directory_iterator_set_error(it, path, err)
} }
+2 -2
View File
@@ -15,7 +15,7 @@ find_data_to_file_info :: proc(base_path: string, d: ^win32.WIN32_FIND_DATAW, al
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
path := concatenate({base_path, `\`, win32_wstring_to_utf8(raw_data(d.cFileName[:]), temp_allocator) or_else ""}, allocator) or_return path := concatenate({base_path, `\`, win32_wstring_to_utf8(raw_data(d.cFileName[:]), temp_allocator) or_else ""}, allocator) or_return
handle := win32.HANDLE(_open_internal(path, {.Read}, 0o666) or_else 0) handle := win32.HANDLE(_open_internal(path, {.Read}, 0o666) or_else 0)
@@ -116,7 +116,7 @@ _read_directory_iterator_init :: proc(it: ^Read_Directory_Iterator, f: ^File) {
wpath = impl.wname[:i] wpath = impl.wname[:i]
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
wpath_search := make([]u16, len(wpath)+3, temp_allocator) wpath_search := make([]u16, len(wpath)+3, temp_allocator)
copy(wpath_search, wpath) copy(wpath_search, wpath)
+3 -3
View File
@@ -12,7 +12,7 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
ckey := strings.clone_to_cstring(key, temp_allocator) ckey := strings.clone_to_cstring(key, temp_allocator)
cval := posix.getenv(ckey) cval := posix.getenv(ckey)
@@ -27,7 +27,7 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
} }
_set_env :: proc(key, value: string) -> (err: Error) { _set_env :: proc(key, value: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
ckey := strings.clone_to_cstring(key, temp_allocator) or_return ckey := strings.clone_to_cstring(key, temp_allocator) or_return
cval := strings.clone_to_cstring(value, temp_allocator) or_return cval := strings.clone_to_cstring(value, temp_allocator) or_return
@@ -39,7 +39,7 @@ _set_env :: proc(key, value: string) -> (err: Error) {
} }
_unset_env :: proc(key: string) -> (ok: bool) { _unset_env :: proc(key: string) -> (ok: bool) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
ckey := strings.clone_to_cstring(key, temp_allocator) ckey := strings.clone_to_cstring(key, temp_allocator)
+1 -1
View File
@@ -39,7 +39,7 @@ build_env :: proc() -> (err: Error) {
g_env_buf = make([]byte, size_of_envs, file_allocator()) or_return g_env_buf = make([]byte, size_of_envs, file_allocator()) or_return
defer if err != nil { delete(g_env_buf, file_allocator()) } defer if err != nil { delete(g_env_buf, file_allocator()) }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
envs := make([]cstring, num_envs, temp_allocator) or_return envs := make([]cstring, num_envs, temp_allocator) or_return
+4 -4
View File
@@ -8,7 +8,7 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
if key == "" { if key == "" {
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
wkey, _ := win32_utf8_to_wstring(key, temp_allocator) wkey, _ := win32_utf8_to_wstring(key, temp_allocator)
n := win32.GetEnvironmentVariableW(wkey, nil, 0) n := win32.GetEnvironmentVariableW(wkey, nil, 0)
@@ -37,7 +37,7 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
} }
_set_env :: proc(key, value: string) -> Error { _set_env :: proc(key, value: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
k := win32_utf8_to_wstring(key, temp_allocator) or_return k := win32_utf8_to_wstring(key, temp_allocator) or_return
v := win32_utf8_to_wstring(value, temp_allocator) or_return v := win32_utf8_to_wstring(value, temp_allocator) or_return
@@ -48,13 +48,13 @@ _set_env :: proc(key, value: string) -> Error {
} }
_unset_env :: proc(key: string) -> bool { _unset_env :: proc(key: string) -> bool {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
k, _ := win32_utf8_to_wstring(key, temp_allocator) k, _ := win32_utf8_to_wstring(key, temp_allocator)
return bool(win32.SetEnvironmentVariableW(k, nil)) return bool(win32.SetEnvironmentVariableW(k, nil))
} }
_clear_env :: proc() { _clear_env :: proc() {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
envs, _ := environ(temp_allocator) envs, _ := environ(temp_allocator)
for env in envs { for env in envs {
for j in 1..<len(env) { for j in 1..<len(env) {
+1 -1
View File
@@ -108,7 +108,7 @@ error_string :: proc(ferr: Error) -> string {
} }
print_error :: proc(f: ^File, ferr: Error, msg: string) { print_error :: proc(f: ^File, ferr: Error, msg: string) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
err_str := error_string(ferr) err_str := error_string(ferr)
// msg + ": " + err_str + '\n' // msg + ": " + err_str + '\n'
+2 -2
View File
@@ -291,7 +291,7 @@ exists :: proc(path: string) -> bool {
@(require_results) @(require_results)
is_file :: proc(path: string) -> bool { is_file :: proc(path: string) -> bool {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
fi, err := stat(path, temp_allocator) fi, err := stat(path, temp_allocator)
if err != nil { if err != nil {
return false return false
@@ -303,7 +303,7 @@ is_dir :: is_directory
@(require_results) @(require_results)
is_directory :: proc(path: string) -> bool { is_directory :: proc(path: string) -> bool {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
fi, err := stat(path, temp_allocator) fi, err := stat(path, temp_allocator)
if err != nil { if err != nil {
return false return false
+13 -13
View File
@@ -66,7 +66,7 @@ _standard_stream_init :: proc() {
} }
_open :: proc(name: string, flags: File_Flags, perm: int) -> (f: ^File, err: Error) { _open :: proc(name: string, flags: File_Flags, perm: int) -> (f: ^File, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
// Just default to using O_NOCTTY because needing to open a controlling // Just default to using O_NOCTTY because needing to open a controlling
@@ -299,7 +299,7 @@ _truncate :: proc(f: ^File, size: i64) -> Error {
} }
_remove :: proc(name: string) -> Error { _remove :: proc(name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
if fd, errno := linux.open(name_cstr, _OPENDIR_FLAGS + {.NOFOLLOW}); errno == .NONE { if fd, errno := linux.open(name_cstr, _OPENDIR_FLAGS + {.NOFOLLOW}); errno == .NONE {
@@ -311,7 +311,7 @@ _remove :: proc(name: string) -> Error {
} }
_rename :: proc(old_name, new_name: string) -> Error { _rename :: proc(old_name, new_name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
old_name_cstr := clone_to_cstring(old_name, temp_allocator) or_return old_name_cstr := clone_to_cstring(old_name, temp_allocator) or_return
new_name_cstr := clone_to_cstring(new_name, temp_allocator) or_return new_name_cstr := clone_to_cstring(new_name, temp_allocator) or_return
@@ -319,7 +319,7 @@ _rename :: proc(old_name, new_name: string) -> Error {
} }
_link :: proc(old_name, new_name: string) -> Error { _link :: proc(old_name, new_name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
old_name_cstr := clone_to_cstring(old_name, temp_allocator) or_return old_name_cstr := clone_to_cstring(old_name, temp_allocator) or_return
new_name_cstr := clone_to_cstring(new_name, temp_allocator) or_return new_name_cstr := clone_to_cstring(new_name, temp_allocator) or_return
@@ -327,7 +327,7 @@ _link :: proc(old_name, new_name: string) -> Error {
} }
_symlink :: proc(old_name, new_name: string) -> Error { _symlink :: proc(old_name, new_name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
old_name_cstr := clone_to_cstring(old_name, temp_allocator) or_return old_name_cstr := clone_to_cstring(old_name, temp_allocator) or_return
new_name_cstr := clone_to_cstring(new_name, temp_allocator) or_return new_name_cstr := clone_to_cstring(new_name, temp_allocator) or_return
return _get_platform_error(linux.symlink(old_name_cstr, new_name_cstr)) return _get_platform_error(linux.symlink(old_name_cstr, new_name_cstr))
@@ -352,13 +352,13 @@ _read_link_cstr :: proc(name_cstr: cstring, allocator: runtime.Allocator) -> (st
} }
_read_link :: proc(name: string, allocator: runtime.Allocator) -> (s: string, e: Error) { _read_link :: proc(name: string, allocator: runtime.Allocator) -> (s: string, e: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
return _read_link_cstr(name_cstr, allocator) return _read_link_cstr(name_cstr, allocator)
} }
_chdir :: proc(name: string) -> Error { _chdir :: proc(name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
return _get_platform_error(linux.chdir(name_cstr)) return _get_platform_error(linux.chdir(name_cstr))
} }
@@ -369,7 +369,7 @@ _fchdir :: proc(f: ^File) -> Error {
} }
_chmod :: proc(name: string, mode: int) -> Error { _chmod :: proc(name: string, mode: int) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
return _get_platform_error(linux.chmod(name_cstr, transmute(linux.Mode)(u32(mode)))) return _get_platform_error(linux.chmod(name_cstr, transmute(linux.Mode)(u32(mode))))
} }
@@ -381,14 +381,14 @@ _fchmod :: proc(f: ^File, mode: int) -> Error {
// NOTE: will throw error without super user priviledges // NOTE: will throw error without super user priviledges
_chown :: proc(name: string, uid, gid: int) -> Error { _chown :: proc(name: string, uid, gid: int) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
return _get_platform_error(linux.chown(name_cstr, linux.Uid(uid), linux.Gid(gid))) return _get_platform_error(linux.chown(name_cstr, linux.Uid(uid), linux.Gid(gid)))
} }
// NOTE: will throw error without super user priviledges // NOTE: will throw error without super user priviledges
_lchown :: proc(name: string, uid, gid: int) -> Error { _lchown :: proc(name: string, uid, gid: int) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
return _get_platform_error(linux.lchown(name_cstr, linux.Uid(uid), linux.Gid(gid))) return _get_platform_error(linux.lchown(name_cstr, linux.Uid(uid), linux.Gid(gid)))
} }
@@ -400,7 +400,7 @@ _fchown :: proc(f: ^File, uid, gid: int) -> Error {
} }
_chtimes :: proc(name: string, atime, mtime: time.Time) -> Error { _chtimes :: proc(name: string, atime, mtime: time.Time) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
times := [2]linux.Time_Spec { times := [2]linux.Time_Spec {
{ {
@@ -431,7 +431,7 @@ _fchtimes :: proc(f: ^File, atime, mtime: time.Time) -> Error {
} }
_exists :: proc(name: string) -> bool { _exists :: proc(name: string) -> bool {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
name_cstr, _ := clone_to_cstring(name, temp_allocator) name_cstr, _ := clone_to_cstring(name, temp_allocator)
return linux.access(name_cstr, linux.F_OK) == .NONE return linux.access(name_cstr, linux.F_OK) == .NONE
} }
@@ -440,7 +440,7 @@ _exists :: proc(name: string) -> bool {
_read_entire_pseudo_file :: proc { _read_entire_pseudo_file_string, _read_entire_pseudo_file_cstring } _read_entire_pseudo_file :: proc { _read_entire_pseudo_file_string, _read_entire_pseudo_file_cstring }
_read_entire_pseudo_file_string :: proc(name: string, allocator: runtime.Allocator) -> (b: []u8, e: Error) { _read_entire_pseudo_file_string :: proc(name: string, allocator: runtime.Allocator) -> (b: []u8, e: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
return _read_entire_pseudo_file_cstring(name_cstr, allocator) return _read_entire_pseudo_file_cstring(name_cstr, allocator)
} }
+12 -12
View File
@@ -69,7 +69,7 @@ _open :: proc(name: string, flags: File_Flags, perm: int) -> (f: ^File, err: Err
if .Trunc in flags { sys_flags += {.TRUNC} } if .Trunc in flags { sys_flags += {.TRUNC} }
if .Inheritable in flags { sys_flags -= {.CLOEXEC} } if .Inheritable in flags { sys_flags -= {.CLOEXEC} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
fd := posix.open(cname, sys_flags, transmute(posix.mode_t)posix._mode_t(perm)) fd := posix.open(cname, sys_flags, transmute(posix.mode_t)posix._mode_t(perm))
@@ -184,7 +184,7 @@ _truncate :: proc(f: ^File, size: i64) -> Error {
} }
_remove :: proc(name: string) -> (err: Error) { _remove :: proc(name: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
if posix.remove(cname) != 0 { if posix.remove(cname) != 0 {
return _get_platform_error() return _get_platform_error()
@@ -193,7 +193,7 @@ _remove :: proc(name: string) -> (err: Error) {
} }
_rename :: proc(old_path, new_path: string) -> (err: Error) { _rename :: proc(old_path, new_path: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cold := clone_to_cstring(old_path, temp_allocator) or_return cold := clone_to_cstring(old_path, temp_allocator) or_return
cnew := clone_to_cstring(new_path, temp_allocator) or_return cnew := clone_to_cstring(new_path, temp_allocator) or_return
if posix.rename(cold, cnew) != 0 { if posix.rename(cold, cnew) != 0 {
@@ -203,7 +203,7 @@ _rename :: proc(old_path, new_path: string) -> (err: Error) {
} }
_link :: proc(old_name, new_name: string) -> (err: Error) { _link :: proc(old_name, new_name: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cold := clone_to_cstring(old_name, temp_allocator) or_return cold := clone_to_cstring(old_name, temp_allocator) or_return
cnew := clone_to_cstring(new_name, temp_allocator) or_return cnew := clone_to_cstring(new_name, temp_allocator) or_return
if posix.link(cold, cnew) != .OK { if posix.link(cold, cnew) != .OK {
@@ -213,7 +213,7 @@ _link :: proc(old_name, new_name: string) -> (err: Error) {
} }
_symlink :: proc(old_name, new_name: string) -> (err: Error) { _symlink :: proc(old_name, new_name: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cold := clone_to_cstring(old_name, temp_allocator) or_return cold := clone_to_cstring(old_name, temp_allocator) or_return
cnew := clone_to_cstring(new_name, temp_allocator) or_return cnew := clone_to_cstring(new_name, temp_allocator) or_return
if posix.symlink(cold, cnew) != .OK { if posix.symlink(cold, cnew) != .OK {
@@ -223,7 +223,7 @@ _symlink :: proc(old_name, new_name: string) -> (err: Error) {
} }
_read_link :: proc(name: string, allocator: runtime.Allocator) -> (s: string, err: Error) { _read_link :: proc(name: string, allocator: runtime.Allocator) -> (s: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
buf: [dynamic]byte buf: [dynamic]byte
@@ -269,7 +269,7 @@ _read_link :: proc(name: string, allocator: runtime.Allocator) -> (s: string, er
} }
_chdir :: proc(name: string) -> (err: Error) { _chdir :: proc(name: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
if posix.chdir(cname) != .OK { if posix.chdir(cname) != .OK {
return _get_platform_error() return _get_platform_error()
@@ -292,7 +292,7 @@ _fchmod :: proc(f: ^File, mode: int) -> Error {
} }
_chmod :: proc(name: string, mode: int) -> (err: Error) { _chmod :: proc(name: string, mode: int) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
if posix.chmod(cname, transmute(posix.mode_t)posix._mode_t(mode)) != .OK { if posix.chmod(cname, transmute(posix.mode_t)posix._mode_t(mode)) != .OK {
return _get_platform_error() return _get_platform_error()
@@ -308,7 +308,7 @@ _fchown :: proc(f: ^File, uid, gid: int) -> Error {
} }
_chown :: proc(name: string, uid, gid: int) -> (err: Error) { _chown :: proc(name: string, uid, gid: int) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
if posix.chown(cname, posix.uid_t(uid), posix.gid_t(gid)) != .OK { if posix.chown(cname, posix.uid_t(uid), posix.gid_t(gid)) != .OK {
return _get_platform_error() return _get_platform_error()
@@ -317,7 +317,7 @@ _chown :: proc(name: string, uid, gid: int) -> (err: Error) {
} }
_lchown :: proc(name: string, uid, gid: int) -> Error { _lchown :: proc(name: string, uid, gid: int) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
if posix.lchown(cname, posix.uid_t(uid), posix.gid_t(gid)) != .OK { if posix.lchown(cname, posix.uid_t(uid), posix.gid_t(gid)) != .OK {
return _get_platform_error() return _get_platform_error()
@@ -337,7 +337,7 @@ _chtimes :: proc(name: string, atime, mtime: time.Time) -> (err: Error) {
}, },
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
if posix.utimes(cname, &times) != .OK { if posix.utimes(cname, &times) != .OK {
@@ -365,7 +365,7 @@ _fchtimes :: proc(f: ^File, atime, mtime: time.Time) -> Error {
} }
_exists :: proc(path: string) -> bool { _exists :: proc(path: string) -> bool {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cpath, err := clone_to_cstring(path, temp_allocator) cpath, err := clone_to_cstring(path, temp_allocator)
if err != nil { return false } if err != nil { return false }
return posix.access(cpath) == .OK return posix.access(cpath) == .OK
+1 -1
View File
@@ -7,7 +7,7 @@ import "base:runtime"
import "core:sys/posix" import "core:sys/posix"
_posix_absolute_path :: proc(fd: posix.FD, name: string, allocator: runtime.Allocator) -> (path: cstring, err: Error) { _posix_absolute_path :: proc(fd: posix.FD, name: string, allocator: runtime.Allocator) -> (path: cstring, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
cname := clone_to_cstring(name, temp_allocator) cname := clone_to_cstring(name, temp_allocator)
buf: [posix.PATH_MAX]byte buf: [posix.PATH_MAX]byte
+8 -8
View File
@@ -109,7 +109,7 @@ _open_internal :: proc(name: string, flags: File_Flags, perm: int) -> (handle: u
err = .Not_Exist err = .Not_Exist
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
path := _fix_long_path(name, temp_allocator) or_return path := _fix_long_path(name, temp_allocator) or_return
access: u32 access: u32
@@ -580,7 +580,7 @@ _truncate :: proc(f: ^File, size: i64) -> Error {
} }
_remove :: proc(name: string) -> Error { _remove :: proc(name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
p := _fix_long_path(name, temp_allocator) or_return p := _fix_long_path(name, temp_allocator) or_return
err, err1: Error err, err1: Error
if !win32.DeleteFileW(p) { if !win32.DeleteFileW(p) {
@@ -618,7 +618,7 @@ _remove :: proc(name: string) -> Error {
} }
_rename :: proc(old_path, new_path: string) -> Error { _rename :: proc(old_path, new_path: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
from := _fix_long_path(old_path, temp_allocator) or_return from := _fix_long_path(old_path, temp_allocator) or_return
to := _fix_long_path(new_path, temp_allocator) or_return to := _fix_long_path(new_path, temp_allocator) or_return
if win32.MoveFileExW(from, to, win32.MOVEFILE_REPLACE_EXISTING) { if win32.MoveFileExW(from, to, win32.MOVEFILE_REPLACE_EXISTING) {
@@ -629,7 +629,7 @@ _rename :: proc(old_path, new_path: string) -> Error {
} }
_link :: proc(old_name, new_name: string) -> Error { _link :: proc(old_name, new_name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
o := _fix_long_path(old_name, temp_allocator) or_return o := _fix_long_path(old_name, temp_allocator) or_return
n := _fix_long_path(new_name, temp_allocator) or_return n := _fix_long_path(new_name, temp_allocator) or_return
if win32.CreateHardLinkW(n, o, nil) { if win32.CreateHardLinkW(n, o, nil) {
@@ -692,7 +692,7 @@ _normalize_link_path :: proc(p: []u16, allocator: runtime.Allocator) -> (str: st
return "", _get_platform_error() return "", _get_platform_error()
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buf := make([]u16, n+1, temp_allocator) buf := make([]u16, n+1, temp_allocator)
n = win32.GetFinalPathNameByHandleW(handle, raw_data(buf), u32(len(buf)), win32.VOLUME_NAME_DOS) n = win32.GetFinalPathNameByHandleW(handle, raw_data(buf), u32(len(buf)), win32.VOLUME_NAME_DOS)
@@ -718,7 +718,7 @@ _read_link :: proc(name: string, allocator: runtime.Allocator) -> (s: string, er
@thread_local @thread_local
rdb_buf: [MAXIMUM_REPARSE_DATA_BUFFER_SIZE]byte rdb_buf: [MAXIMUM_REPARSE_DATA_BUFFER_SIZE]byte
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
p := _fix_long_path(name, temp_allocator) or_return p := _fix_long_path(name, temp_allocator) or_return
handle := _open_sym_link(p) or_return handle := _open_sym_link(p) or_return
@@ -785,7 +785,7 @@ _fchown :: proc(f: ^File, uid, gid: int) -> Error {
} }
_chdir :: proc(name: string) -> Error { _chdir :: proc(name: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
p := _fix_long_path(name, temp_allocator) or_return p := _fix_long_path(name, temp_allocator) or_return
if !win32.SetCurrentDirectoryW(p) { if !win32.SetCurrentDirectoryW(p) {
return _get_platform_error() return _get_platform_error()
@@ -834,7 +834,7 @@ _fchtimes :: proc(f: ^File, atime, mtime: time.Time) -> Error {
} }
_exists :: proc(path: string) -> bool { _exists :: proc(path: string) -> bool {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
wpath, _ := _fix_long_path(path, temp_allocator) wpath, _ := _fix_long_path(path, temp_allocator)
attribs := win32.GetFileAttributesW(wpath) attribs := win32.GetFileAttributesW(wpath)
return attribs != win32.INVALID_FILE_ATTRIBUTES return attribs != win32.INVALID_FILE_ATTRIBUTES
+2 -2
View File
@@ -119,7 +119,7 @@ clean_path :: proc(path: string, allocator: runtime.Allocator) -> (cleaned: stri
return strings.clone(".", allocator) return strings.clone(".", allocator)
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
// The extra byte is to simplify appending path elements by letting the // The extra byte is to simplify appending path elements by letting the
// loop to end each with a separator. We'll trim the last one when we're done. // loop to end each with a separator. We'll trim the last one when we're done.
@@ -326,7 +326,7 @@ For example, `join_path({"/home", "foo", "bar.txt"})` will result in `"/home/foo
join_path :: proc(elems: []string, allocator: runtime.Allocator) -> (joined: string, err: Error) { join_path :: proc(elems: []string, allocator: runtime.Allocator) -> (joined: string, err: Error) {
for e, i in elems { for e, i in elems {
if e != "" { if e != "" {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
p := strings.join(elems[i:], Path_Separator_String, temp_allocator) or_return p := strings.join(elems[i:], Path_Separator_String, temp_allocator) or_return
return clean_path(p, allocator) return clean_path(p, allocator)
} }
+5 -5
View File
@@ -18,7 +18,7 @@ _is_path_separator :: proc(c: byte) -> bool {
} }
_mkdir :: proc(path: string, perm: int) -> Error { _mkdir :: proc(path: string, perm: int) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
path_cstr := clone_to_cstring(path, temp_allocator) or_return path_cstr := clone_to_cstring(path, temp_allocator) or_return
return _get_platform_error(linux.mkdir(path_cstr, transmute(linux.Mode)u32(perm))) return _get_platform_error(linux.mkdir(path_cstr, transmute(linux.Mode)u32(perm)))
} }
@@ -52,7 +52,7 @@ _mkdir_all :: proc(path: string, perm: int) -> Error {
} }
return _get_platform_error(errno) return _get_platform_error(errno)
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
// need something we can edit, and use to generate cstrings // need something we can edit, and use to generate cstrings
path_bytes := make([]u8, len(path) + 1, temp_allocator) path_bytes := make([]u8, len(path) + 1, temp_allocator)
@@ -129,7 +129,7 @@ _remove_all :: proc(path: string) -> Error {
return nil return nil
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
path_cstr := clone_to_cstring(path, temp_allocator) or_return path_cstr := clone_to_cstring(path, temp_allocator) or_return
fd, errno := linux.open(path_cstr, _OPENDIR_FLAGS) fd, errno := linux.open(path_cstr, _OPENDIR_FLAGS)
@@ -168,14 +168,14 @@ _get_working_directory :: proc(allocator: runtime.Allocator) -> (string, Error)
} }
_set_working_directory :: proc(dir: string) -> Error { _set_working_directory :: proc(dir: string) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
dir_cstr := clone_to_cstring(dir, temp_allocator) or_return dir_cstr := clone_to_cstring(dir, temp_allocator) or_return
return _get_platform_error(linux.chdir(dir_cstr)) return _get_platform_error(linux.chdir(dir_cstr))
} }
_get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) { _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buf := make([dynamic]byte, 1024, temp_allocator) or_return buf := make([dynamic]byte, 1024, temp_allocator) or_return
for { for {
+1 -1
View File
@@ -5,7 +5,7 @@ import "base:runtime"
import "core:sys/posix" import "core:sys/posix"
_get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) { _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buf := make([dynamic]byte, 1024, temp_allocator) or_return buf := make([dynamic]byte, 1024, temp_allocator) or_return
for { for {
+1 -1
View File
@@ -35,7 +35,7 @@ _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err
return real(arg, allocator) return real(arg, allocator)
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buf := strings.builder_make(temp_allocator) buf := strings.builder_make(temp_allocator)
+5 -5
View File
@@ -15,7 +15,7 @@ _is_path_separator :: proc(c: byte) -> bool {
} }
_mkdir :: proc(name: string, perm: int) -> (err: Error) { _mkdir :: proc(name: string, perm: int) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
if posix.mkdir(cname, transmute(posix.mode_t)posix._mode_t(perm)) != .OK { if posix.mkdir(cname, transmute(posix.mode_t)posix._mode_t(perm)) != .OK {
return _get_platform_error() return _get_platform_error()
@@ -28,7 +28,7 @@ _mkdir_all :: proc(path: string, perm: int) -> Error {
return .Invalid_Path return .Invalid_Path
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
if exists(path) { if exists(path) {
return .Exist return .Exist
@@ -53,7 +53,7 @@ _mkdir_all :: proc(path: string, perm: int) -> Error {
} }
_remove_all :: proc(path: string) -> (err: Error) { _remove_all :: proc(path: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cpath := clone_to_cstring(path, temp_allocator) or_return cpath := clone_to_cstring(path, temp_allocator) or_return
dir := posix.opendir(cpath) dir := posix.opendir(cpath)
@@ -95,7 +95,7 @@ _remove_all :: proc(path: string) -> (err: Error) {
} }
_get_working_directory :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) { _get_working_directory :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buf: [dynamic]byte buf: [dynamic]byte
buf.allocator = temp_allocator buf.allocator = temp_allocator
@@ -116,7 +116,7 @@ _get_working_directory :: proc(allocator: runtime.Allocator) -> (dir: string, er
} }
_set_working_directory :: proc(dir: string) -> (err: Error) { _set_working_directory :: proc(dir: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
cdir := clone_to_cstring(dir, temp_allocator) or_return cdir := clone_to_cstring(dir, temp_allocator) or_return
if posix.chdir(cdir) != .OK { if posix.chdir(cdir) != .OK {
err = _get_platform_error() err = _get_platform_error()
+1 -1
View File
@@ -31,7 +31,7 @@ _get_absolute_path :: proc(path: string, allocator: runtime.Allocator) -> (absol
if rel == "" { if rel == "" {
rel = "." rel = "."
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
rel_cstr := strings.clone_to_cstring(rel, temp_allocator) rel_cstr := strings.clone_to_cstring(rel, temp_allocator)
path_ptr := posix.realpath(rel_cstr, nil) path_ptr := posix.realpath(rel_cstr, nil)
if path_ptr == nil { if path_ptr == nil {
+1 -1
View File
@@ -28,7 +28,7 @@ _mkdir_all :: proc(path: string, perm: int) -> Error {
return .Invalid_Path return .Invalid_Path
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
if exists(path) { if exists(path) {
return .Exist return .Exist
+8 -8
View File
@@ -14,7 +14,7 @@ _is_path_separator :: proc(c: byte) -> bool {
} }
_mkdir :: proc(name: string, perm: int) -> Error { _mkdir :: proc(name: string, perm: int) -> Error {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
if !win32.CreateDirectoryW(_fix_long_path(name, temp_allocator) or_return, nil) { if !win32.CreateDirectoryW(_fix_long_path(name, temp_allocator) or_return, nil) {
return _get_platform_error() return _get_platform_error()
} }
@@ -33,7 +33,7 @@ _mkdir_all :: proc(path: string, perm: int) -> Error {
return p, false, nil return p, false, nil
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
dir_stat, err := stat(path, temp_allocator) dir_stat, err := stat(path, temp_allocator)
if err == nil { if err == nil {
@@ -82,7 +82,7 @@ _remove_all :: proc(path: string) -> Error {
return nil return nil
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
dir := win32_utf8_to_wstring(path, temp_allocator) or_return dir := win32_utf8_to_wstring(path, temp_allocator) or_return
empty: [1]u16 empty: [1]u16
@@ -109,7 +109,7 @@ _remove_all :: proc(path: string) -> Error {
_get_working_directory :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) { _get_working_directory :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
win32.AcquireSRWLockExclusive(&cwd_lock) win32.AcquireSRWLockExclusive(&cwd_lock)
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
sz_utf16 := win32.GetCurrentDirectoryW(0, nil) sz_utf16 := win32.GetCurrentDirectoryW(0, nil)
dir_buf_wstr := make([]u16, sz_utf16, temp_allocator) or_return dir_buf_wstr := make([]u16, sz_utf16, temp_allocator) or_return
@@ -123,7 +123,7 @@ _get_working_directory :: proc(allocator: runtime.Allocator) -> (dir: string, er
} }
_set_working_directory :: proc(dir: string) -> (err: Error) { _set_working_directory :: proc(dir: string) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
wstr := win32_utf8_to_wstring(dir, temp_allocator) or_return wstr := win32_utf8_to_wstring(dir, temp_allocator) or_return
win32.AcquireSRWLockExclusive(&cwd_lock) win32.AcquireSRWLockExclusive(&cwd_lock)
@@ -138,7 +138,7 @@ _set_working_directory :: proc(dir: string) -> (err: Error) {
} }
_get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) { _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buf := make([dynamic]u16, 512, temp_allocator) or_return buf := make([dynamic]u16, 512, temp_allocator) or_return
for { for {
@@ -222,7 +222,7 @@ _fix_long_path_internal :: proc(path: string) -> string {
return path return path
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
PREFIX :: `\\?` PREFIX :: `\\?`
path_buf := make([]byte, len(PREFIX)+len(path)+1, temp_allocator) path_buf := make([]byte, len(PREFIX)+len(path)+1, temp_allocator)
@@ -297,7 +297,7 @@ _get_absolute_path :: proc(path: string, allocator: runtime.Allocator) -> (absol
if rel == "" { if rel == "" {
rel = "." rel = "."
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
rel_utf16 := win32.utf8_to_utf16(rel, temp_allocator) rel_utf16 := win32.utf8_to_utf16(rel, temp_allocator)
n := win32.GetFullPathNameW(raw_data(rel_utf16), 0, nil, nil) n := win32.GetFullPathNameW(raw_data(rel_utf16), 0, nil, nil)
if n == 0 { if n == 0 {
+4 -4
View File
@@ -50,7 +50,7 @@ _get_ppid :: proc() -> int {
@(private="package") @(private="package")
_process_list :: proc(allocator: runtime.Allocator) -> (list: []int, err: Error) { _process_list :: proc(allocator: runtime.Allocator) -> (list: []int, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
dir_fd, errno := linux.open("/proc/", _OPENDIR_FLAGS) dir_fd, errno := linux.open("/proc/", _OPENDIR_FLAGS)
#partial switch errno { #partial switch errno {
@@ -100,7 +100,7 @@ _process_list :: proc(allocator: runtime.Allocator) -> (list: []int, err: Error)
@(private="package") @(private="package")
_process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) { _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
info.pid = pid info.pid = pid
@@ -392,7 +392,7 @@ _process_open :: proc(pid: int, _: Process_Open_Flags) -> (process: Process, err
@(private="package") @(private="package")
_process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
if len(desc.command) == 0 { if len(desc.command) == 0 {
return process, .Invalid_Command return process, .Invalid_Command
@@ -593,7 +593,7 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
} }
_process_state_update_times :: proc(state: ^Process_State) -> (err: Error) { _process_state_update_times :: proc(state: ^Process_State) -> (err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
stat_path_buf: [48]u8 stat_path_buf: [48]u8
path_builder := strings.builder_from_bytes(stat_path_buf[:]) path_builder := strings.builder_from_bytes(stat_path_buf[:])
+1 -1
View File
@@ -52,7 +52,7 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
// search PATH if just a plain name is provided. // search PATH if just a plain name is provided.
exe_builder := strings.builder_make(temp_allocator) exe_builder := strings.builder_make(temp_allocator)
+2 -2
View File
@@ -50,7 +50,7 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
info.pid = pid info.pid = pid
// Thought on errors is: allocation failures return immediately (also why the non-allocation stuff is done first), // Thought on errors is: allocation failures return immediately (also why the non-allocation stuff is done first),
@@ -240,7 +240,7 @@ _process_list :: proc(allocator: runtime.Allocator) -> (list: []int, err: Error)
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buffer := make([]i32, ret, temp_allocator) buffer := make([]i32, ret, temp_allocator)
ret = darwin.proc_listallpids(raw_data(buffer), ret*size_of(i32)) ret = darwin.proc_listallpids(raw_data(buffer), ret*size_of(i32))
+4 -4
View File
@@ -162,7 +162,7 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator
if err != nil { if err != nil {
break read_peb break read_peb
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
if selection >= {.Command_Line, .Command_Args} { if selection >= {.Command_Line, .Command_Args} {
temp_allocator_scope(temp_allocator) temp_allocator_scope(temp_allocator)
cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator) or_return cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator) or_return
@@ -273,7 +273,7 @@ _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields
if err != nil { if err != nil {
break read_peb break read_peb
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
if selection >= {.Command_Line, .Command_Args} { if selection >= {.Command_Line, .Command_Args} {
temp_allocator_scope(temp_allocator) temp_allocator_scope(temp_allocator)
cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator) or_return cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator) or_return
@@ -421,7 +421,7 @@ _process_open :: proc(pid: int, flags: Process_Open_Flags) -> (process: Process,
@(private="package") @(private="package")
_process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
command_line := _build_command_line(desc.command, temp_allocator) command_line := _build_command_line(desc.command, temp_allocator)
command_line_w := win32_utf8_to_wstring(command_line, temp_allocator) or_return command_line_w := win32_utf8_to_wstring(command_line, temp_allocator) or_return
environment := desc.env environment := desc.env
@@ -614,7 +614,7 @@ _process_exe_by_pid :: proc(pid: int, allocator: runtime.Allocator) -> (exe_path
} }
_get_process_user :: proc(process_handle: win32.HANDLE, allocator: runtime.Allocator) -> (full_username: string, err: Error) { _get_process_user :: proc(process_handle: win32.HANDLE, allocator: runtime.Allocator) -> (full_username: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
token_handle: win32.HANDLE token_handle: win32.HANDLE
if !win32.OpenProcessToken(process_handle, win32.TOKEN_QUERY, &token_handle) { if !win32.OpenProcessToken(process_handle, win32.TOKEN_QUERY, &token_handle) {
err = _get_platform_error() err = _get_platform_error()
+2 -2
View File
@@ -73,14 +73,14 @@ last_write_time_by_name :: modification_time_by_path
@(require_results) @(require_results)
modification_time :: proc(f: ^File) -> (time.Time, Error) { modification_time :: proc(f: ^File) -> (time.Time, Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
fi, err := fstat(f, temp_allocator) fi, err := fstat(f, temp_allocator)
return fi.modification_time, err return fi.modification_time, err
} }
@(require_results) @(require_results)
modification_time_by_path :: proc(path: string) -> (time.Time, Error) { modification_time_by_path :: proc(path: string) -> (time.Time, Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
fi, err := stat(path, temp_allocator) fi, err := stat(path, temp_allocator)
return fi.modification_time, err return fi.modification_time, err
} }
+2 -2
View File
@@ -47,7 +47,7 @@ _fstat_internal :: proc(fd: linux.Fd, allocator: runtime.Allocator) -> (fi: File
// NOTE: _stat and _lstat are using _fstat to avoid a race condition when populating fullpath // NOTE: _stat and _lstat are using _fstat to avoid a race condition when populating fullpath
_stat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { _stat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
fd, errno := linux.open(name_cstr, {}) fd, errno := linux.open(name_cstr, {})
@@ -59,7 +59,7 @@ _stat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err
} }
_lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { _lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
name_cstr := clone_to_cstring(name, temp_allocator) or_return name_cstr := clone_to_cstring(name, temp_allocator) or_return
fd, errno := linux.open(name_cstr, {.PATH, .NOFOLLOW}) fd, errno := linux.open(name_cstr, {.PATH, .NOFOLLOW})
+2 -2
View File
@@ -69,7 +69,7 @@ _stat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
cname := clone_to_cstring(name, temp_allocator) or_return cname := clone_to_cstring(name, temp_allocator) or_return
fd := posix.open(cname, {}) fd := posix.open(cname, {})
@@ -96,7 +96,7 @@ _lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, er
return return
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
// NOTE: can't use realpath or open (+ fcntl F_GETPATH) here because it tries to resolve symlinks. // NOTE: can't use realpath or open (+ fcntl F_GETPATH) here because it tries to resolve symlinks.
+4 -4
View File
@@ -45,7 +45,7 @@ full_path_from_name :: proc(name: string, allocator: runtime.Allocator) -> (path
name = "." name = "."
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
p := win32_utf8_to_utf16(name, temp_allocator) or_return p := win32_utf8_to_utf16(name, temp_allocator) or_return
@@ -65,7 +65,7 @@ internal_stat :: proc(name: string, create_file_attributes: u32, allocator: runt
if len(name) == 0 { if len(name) == 0 {
return {}, .Not_Exist return {}, .Not_Exist
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
wname := _fix_long_path(name, temp_allocator) or_return wname := _fix_long_path(name, temp_allocator) or_return
fa: win32.WIN32_FILE_ATTRIBUTE_DATA fa: win32.WIN32_FILE_ATTRIBUTE_DATA
@@ -137,7 +137,7 @@ _cleanpath_from_handle :: proc(f: ^File, allocator: runtime.Allocator) -> (strin
return "", _get_platform_error() return "", _get_platform_error()
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
buf := make([]u16, max(n, 260)+1, temp_allocator) buf := make([]u16, max(n, 260)+1, temp_allocator)
n = win32.GetFinalPathNameByHandleW(h, raw_data(buf), u32(len(buf)), 0) n = win32.GetFinalPathNameByHandleW(h, raw_data(buf), u32(len(buf)), 0)
@@ -155,7 +155,7 @@ _cleanpath_from_handle_u16 :: proc(f: ^File) -> ([]u16, Error) {
return nil, _get_platform_error() return nil, _get_platform_error()
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
buf := make([]u16, max(n, 260)+1, temp_allocator) buf := make([]u16, max(n, 260)+1, temp_allocator)
n = win32.GetFinalPathNameByHandleW(h, raw_data(buf), u32(len(buf)), 0) n = win32.GetFinalPathNameByHandleW(h, raw_data(buf), u32(len(buf)), 0)
+3 -3
View File
@@ -15,7 +15,7 @@ MAX_ATTEMPTS :: 1<<13 // Should be enough for everyone, right?
// The caller must `close` the file once finished with. // The caller must `close` the file once finished with.
@(require_results) @(require_results)
create_temp_file :: proc(dir, pattern: string) -> (f: ^File, err: Error) { create_temp_file :: proc(dir, pattern: string) -> (f: ^File, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
dir := dir if dir != "" else temp_directory(temp_allocator) or_return dir := dir if dir != "" else temp_directory(temp_allocator) or_return
prefix, suffix := _prefix_and_suffix(pattern) or_return prefix, suffix := _prefix_and_suffix(pattern) or_return
prefix = temp_join_path(dir, prefix) or_return prefix = temp_join_path(dir, prefix) or_return
@@ -47,7 +47,7 @@ mkdir_temp :: make_directory_temp
// If `dir` is an empty tring, `temp_directory()` will be used. // If `dir` is an empty tring, `temp_directory()` will be used.
@(require_results) @(require_results)
make_directory_temp :: proc(dir, pattern: string, allocator: runtime.Allocator) -> (temp_path: string, err: Error) { make_directory_temp :: proc(dir, pattern: string, allocator: runtime.Allocator) -> (temp_path: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
dir := dir if dir != "" else temp_directory(temp_allocator) or_return dir := dir if dir != "" else temp_directory(temp_allocator) or_return
prefix, suffix := _prefix_and_suffix(pattern) or_return prefix, suffix := _prefix_and_suffix(pattern) or_return
prefix = temp_join_path(dir, prefix) or_return prefix = temp_join_path(dir, prefix) or_return
@@ -89,7 +89,7 @@ temp_directory :: proc(allocator: runtime.Allocator) -> (string, Error) {
@(private="file") @(private="file")
temp_join_path :: proc(dir, name: string) -> (string, runtime.Allocator_Error) { temp_join_path :: proc(dir, name: string) -> (string, runtime.Allocator_Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({})) temp_allocator := TEMP_ALLOCATOR_GUARD({})
if len(dir) > 0 && is_path_separator(dir[len(dir)-1]) { if len(dir) > 0 && is_path_separator(dir[len(dir)-1]) {
return concatenate({dir, name}, temp_allocator,) return concatenate({dir, name}, temp_allocator,)
+1 -1
View File
@@ -4,7 +4,7 @@ package os2
import "base:runtime" import "base:runtime"
_temp_dir :: proc(allocator: runtime.Allocator) -> (string, runtime.Allocator_Error) { _temp_dir :: proc(allocator: runtime.Allocator) -> (string, runtime.Allocator_Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
tmpdir := get_env("TMPDIR", temp_allocator) tmpdir := get_env("TMPDIR", temp_allocator)
if tmpdir == "" { if tmpdir == "" {
tmpdir = "/tmp" tmpdir = "/tmp"
+1 -1
View File
@@ -9,7 +9,7 @@ _temp_dir :: proc(allocator: runtime.Allocator) -> (string, runtime.Allocator_Er
if n == 0 { if n == 0 {
return "", nil return "", nil
} }
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
b := make([]u16, max(win32.MAX_PATH, n), temp_allocator) b := make([]u16, max(win32.MAX_PATH, n), temp_allocator)
n = win32.GetTempPathW(u32(len(b)), raw_data(b)) n = win32.GetTempPathW(u32(len(b)), raw_data(b))
+2 -2
View File
@@ -4,7 +4,7 @@ import "base:runtime"
@(require_results) @(require_results)
user_cache_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) { user_cache_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
#partial switch ODIN_OS { #partial switch ODIN_OS {
case .Windows: case .Windows:
@@ -35,7 +35,7 @@ user_cache_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error
@(require_results) @(require_results)
user_config_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) { user_config_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
temp_allocator := get_temp_allocator(TEMP_ALLOCATOR_GUARD({ allocator })) temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator })
#partial switch ODIN_OS { #partial switch ODIN_OS {
case .Windows: case .Windows: