This commit is contained in:
Riyyi
2026-09-14 23:00:24 +02:00
parent 416b42c27e
commit e7cc935035
5 changed files with 51 additions and 12 deletions
+22
View File
@@ -0,0 +1,22 @@
# Odin
This document contains specifics about the workings of the Odin programming
language, dynamic linking and state management design patterns. These are
tested and validated findings, for continued reference by me.
## Dynamic Library Memory
When a program loads in a dynamic library, what happens with package globals?
Findings (macOS):
- The package globals are shared between the host and the lib
- After hot reloading the lib, the memory of the packge is not refreshed,
it keeps pointing to the package global of the host
The clanker states this is due to "flat-namespace symbol interposition".
Linux "ELF has symbol preemption: when resolving references, ld.so searches
globals scope in order — executable first, then loaded shared objects".
Windows PE has no interposition at all, every module (exe and each DLL) has its
own symbol table.
+13 -6
View File
@@ -5,11 +5,12 @@ import "core:time"
import "core:fmt" import "core:fmt"
import "sindri:core" import "sindri:core"
import "sindri:test"
// ----------------------------------------- // -----------------------------------------
Game_Memory :: struct { Game_Memory :: struct {
should_close: bool should_close: bool,
} }
g: ^Game_Memory g: ^Game_Memory
@@ -54,6 +55,8 @@ settings :: proc() -> core.Settings {
@(export) @(export)
init_once :: proc() { init_once :: proc() {
fmt.println("init once") fmt.println("init once")
test.test_proc = proc() {}
} }
@(export) @(export)
@@ -62,6 +65,8 @@ init :: proc() {
g = new(Game_Memory) g = new(Game_Memory)
memory_set(g) memory_set(g)
test.test_proc = proc() { asd := 2 }
} }
@(export) @(export)
@@ -71,6 +76,10 @@ update :: proc(dt: f32) {
if input.key_state(.Key_Escape) == .Press { if input.key_state(.Key_Escape) == .Press {
g.should_close = true g.should_close = true
} }
fmt.println("GAME:", test.test)
fmt.printf("pointer: %p | %p\n", &test.test, &test.test_proc)
test.test += 1
} }
@(export) @(export)
@@ -84,19 +93,17 @@ start := time.tick_now()
should_close :: proc() -> bool { should_close :: proc() -> bool {
elapsed := time.tick_since(start) elapsed := time.tick_since(start)
seconds := time.duration_seconds(elapsed) seconds := time.duration_seconds(elapsed)
if seconds > 4 do return true // if seconds > 4 do return true
return g.should_close return g.should_close
} }
@(export) @(export)
force_reload :: proc() -> bool { force_reload :: proc() -> bool {
// TODO: read keypress return input.key_state(.Key_F5) == .Press
return false
} }
@(export) @(export)
force_restart :: proc() -> bool { force_restart :: proc() -> bool {
// TODO: read keypress return input.key_state(.Key_F6) == .Press
return false
} }
+7 -6
View File
@@ -9,7 +9,8 @@ import "sindri:input"
// event category, bitfield (?) // event category, bitfield (?)
Event_Data :: union { // Event_Data :: union {
Event :: union {
Window_Close_Event, Window_Close_Event,
Window_Resize_Event, Window_Resize_Event,
Joystick_Connect_Event, Joystick_Connect_Event,
@@ -23,10 +24,10 @@ Event_Data :: union {
Mouse_Scroll_Event, Mouse_Scroll_Event,
} }
Event :: struct { // Event :: struct {
data: Event_Data, // data: Event_Data,
handled: bool, // handled: bool,
} // }
Window_Close_Event :: struct { Window_Close_Event :: struct {
handled: bool, handled: bool,
@@ -94,7 +95,7 @@ Mouse_Scroll_Event :: struct {
// Variables // Variables
// I want to have a list of Listeners per Event type, but this is state // I want to have a list of Listeners per Event type, but this is state
listeners: map[typeid][dynamic]Listener // listeners: map[typeid][dynamic]Listener
// ----------------------------------------- // -----------------------------------------
// Public functions // Public functions
+4
View File
@@ -2,6 +2,7 @@ package sindri
import "core:fmt" import "core:fmt"
import "core:time" import "core:time"
import "sindri:test"
import "sindri:hot_reload" import "sindri:hot_reload"
import "sindri:platform" import "sindri:platform"
@@ -41,6 +42,9 @@ main :: proc() {
platform.os_poll_events() platform.os_poll_events()
api.update(dt) api.update(dt)
fmt.println("MAIN:", test.test)
fmt.printf("pointer: %p | %p\n", &test.test, &test.test_proc)
platform.frame(dt) platform.frame(dt)
dt = f32(time.duration_seconds(time.tick_since(start))) dt = f32(time.duration_seconds(time.tick_since(start)))
+5
View File
@@ -0,0 +1,5 @@
package test
test: int = 0
test_proc: proc()