aboutsummaryrefslogtreecommitdiff
path: root/base/runtime/thread_management.odin
blob: cabd4691cee77a06c17a5ed277472ce57a7306c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package runtime

Thread_Local_Cleaner :: #type proc "odin" ()

@(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`.
//
// Intended to be called in an `init` procedure of a package with
// dynamically-allocated memory that is stored in `thread_local` variables.
add_thread_local_cleaner :: proc "contextless" (p: Thread_Local_Cleaner) {
	for &v in thread_local_cleaners {
		if v == nil {
			v = p
			return
		}
	}
	panic_contextless("There are no more thread-local cleaner slots available.")
}

// Run all of the thread-local cleaner procedures.
//
// Intended to be called by the internals of a threading API at the end of a
// thread's lifetime.
run_thread_local_cleaners :: proc "odin" () {
	for p in thread_local_cleaners {
		if p == nil {
			break
		}
		p()
	}
}