aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-08-10 12:47:15 +0100
committerGitHub <noreply@github.com>2025-08-10 12:47:15 +0100
commita0ff05e63307f533b384820717bb582e1ff47c39 (patch)
treed9adfd28090dc72044003fed211383a63bdb3587 /base
parentdbc338248e8693994f232d02f1aff9536f204add (diff)
parent14ca1c8c89dd219dd52d061649d4db7778df2e64 (diff)
Merge pull request #5558 from odin-lang/bill/init-fini-changes
`@(init)` & `@(finit)` Changes.
Diffstat (limited to 'base')
-rw-r--r--base/runtime/default_allocators_nil.odin2
-rw-r--r--base/runtime/default_temp_allocator_arena.odin7
-rw-r--r--base/runtime/default_temporary_allocator.odin6
-rw-r--r--base/runtime/procs_js.odin4
-rw-r--r--base/runtime/thread_management.odin11
5 files changed, 20 insertions, 10 deletions
diff --git a/base/runtime/default_allocators_nil.odin b/base/runtime/default_allocators_nil.odin
index e7a1b1a74..14edd11dd 100644
--- a/base/runtime/default_allocators_nil.odin
+++ b/base/runtime/default_allocators_nil.odin
@@ -23,7 +23,7 @@ nil_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode,
return nil, .None
}
-nil_allocator :: proc() -> Allocator {
+nil_allocator :: proc "contextless" () -> Allocator {
return Allocator{
procedure = nil_allocator_proc,
data = nil,
diff --git a/base/runtime/default_temp_allocator_arena.odin b/base/runtime/default_temp_allocator_arena.odin
index ca144b66f..525f81825 100644
--- a/base/runtime/default_temp_allocator_arena.odin
+++ b/base/runtime/default_temp_allocator_arena.odin
@@ -52,10 +52,13 @@ memory_block_alloc :: proc(allocator: Allocator, capacity: uint, alignment: uint
return
}
-memory_block_dealloc :: proc(block_to_free: ^Memory_Block, loc := #caller_location) {
+memory_block_dealloc :: proc "contextless" (block_to_free: ^Memory_Block, loc := #caller_location) {
if block_to_free != nil {
+
allocator := block_to_free.allocator
// sanitizer.address_unpoison(block_to_free.base, block_to_free.capacity)
+ context = default_context()
+ context.allocator = allocator
mem_free(block_to_free, allocator, loc)
}
}
@@ -172,7 +175,7 @@ arena_free_all :: proc(arena: ^Arena, loc := #caller_location) {
arena.total_used = 0
}
-arena_destroy :: proc(arena: ^Arena, loc := #caller_location) {
+arena_destroy :: proc "contextless" (arena: ^Arena, loc := #caller_location) {
for arena.curr_block != nil {
free_block := arena.curr_block
arena.curr_block = free_block.prev
diff --git a/base/runtime/default_temporary_allocator.odin b/base/runtime/default_temporary_allocator.odin
index b355ded70..671728be8 100644
--- a/base/runtime/default_temporary_allocator.odin
+++ b/base/runtime/default_temporary_allocator.odin
@@ -8,7 +8,7 @@ when NO_DEFAULT_TEMP_ALLOCATOR {
default_temp_allocator_init :: proc(s: ^Default_Temp_Allocator, size: int, backing_allocator := context.allocator) {}
- default_temp_allocator_destroy :: proc(s: ^Default_Temp_Allocator) {}
+ default_temp_allocator_destroy :: proc "contextless" (s: ^Default_Temp_Allocator) {}
default_temp_allocator_proc :: nil_allocator_proc
@@ -28,7 +28,7 @@ when NO_DEFAULT_TEMP_ALLOCATOR {
_ = arena_init(&s.arena, uint(size), backing_allocator)
}
- default_temp_allocator_destroy :: proc(s: ^Default_Temp_Allocator) {
+ default_temp_allocator_destroy :: proc "contextless" (s: ^Default_Temp_Allocator) {
if s != nil {
arena_destroy(&s.arena)
s^ = {}
@@ -56,7 +56,7 @@ when NO_DEFAULT_TEMP_ALLOCATOR {
}
@(fini, private)
- _destroy_temp_allocator_fini :: proc() {
+ _destroy_temp_allocator_fini :: proc "contextless" () {
default_temp_allocator_destroy(&global_default_temp_allocator_data)
}
}
diff --git a/base/runtime/procs_js.odin b/base/runtime/procs_js.odin
index 58bed808d..3690f9436 100644
--- a/base/runtime/procs_js.odin
+++ b/base/runtime/procs_js.odin
@@ -3,8 +3,8 @@ package runtime
init_default_context_for_js: Context
@(init, private="file")
-init_default_context :: proc() {
- init_default_context_for_js = context
+init_default_context :: proc "contextless" () {
+ __init_context(&init_default_context_for_js)
}
@(export)
diff --git a/base/runtime/thread_management.odin b/base/runtime/thread_management.odin
index cabd4691c..97dcbc8f5 100644
--- a/base/runtime/thread_management.odin
+++ b/base/runtime/thread_management.odin
@@ -1,10 +1,14 @@
package runtime
-Thread_Local_Cleaner :: #type proc "odin" ()
+Thread_Local_Cleaner_Odin :: #type proc "odin" ()
+Thread_Local_Cleaner_Contextless :: #type proc "contextless" ()
+
+Thread_Local_Cleaner :: union #shared_nil {Thread_Local_Cleaner_Odin, Thread_Local_Cleaner_Contextless}
@(private="file")
thread_local_cleaners: [8]Thread_Local_Cleaner
+
// Add a procedure that will be run at the end of a thread for the purpose of
// deallocating state marked as `thread_local`.
//
@@ -29,6 +33,9 @@ run_thread_local_cleaners :: proc "odin" () {
if p == nil {
break
}
- p()
+ switch v in p {
+ case Thread_Local_Cleaner_Odin: v()
+ case Thread_Local_Cleaner_Contextless: v()
+ }
}
}