lol
This commit is contained in:
@@ -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
@@ -5,11 +5,12 @@ import "core:time"
|
||||
import "core:fmt"
|
||||
|
||||
import "sindri:core"
|
||||
import "sindri:test"
|
||||
|
||||
// -----------------------------------------
|
||||
|
||||
Game_Memory :: struct {
|
||||
should_close: bool
|
||||
should_close: bool,
|
||||
}
|
||||
|
||||
g: ^Game_Memory
|
||||
@@ -54,6 +55,8 @@ settings :: proc() -> core.Settings {
|
||||
@(export)
|
||||
init_once :: proc() {
|
||||
fmt.println("init once")
|
||||
|
||||
test.test_proc = proc() {}
|
||||
}
|
||||
|
||||
@(export)
|
||||
@@ -62,6 +65,8 @@ init :: proc() {
|
||||
|
||||
g = new(Game_Memory)
|
||||
memory_set(g)
|
||||
|
||||
test.test_proc = proc() { asd := 2 }
|
||||
}
|
||||
|
||||
@(export)
|
||||
@@ -71,6 +76,10 @@ update :: proc(dt: f32) {
|
||||
if input.key_state(.Key_Escape) == .Press {
|
||||
g.should_close = true
|
||||
}
|
||||
|
||||
fmt.println("GAME:", test.test)
|
||||
fmt.printf("pointer: %p | %p\n", &test.test, &test.test_proc)
|
||||
test.test += 1
|
||||
}
|
||||
|
||||
@(export)
|
||||
@@ -84,19 +93,17 @@ start := time.tick_now()
|
||||
should_close :: proc() -> bool {
|
||||
elapsed := time.tick_since(start)
|
||||
seconds := time.duration_seconds(elapsed)
|
||||
if seconds > 4 do return true
|
||||
// if seconds > 4 do return true
|
||||
|
||||
return g.should_close
|
||||
}
|
||||
|
||||
@(export)
|
||||
force_reload :: proc() -> bool {
|
||||
// TODO: read keypress
|
||||
return false
|
||||
return input.key_state(.Key_F5) == .Press
|
||||
}
|
||||
|
||||
@(export)
|
||||
force_restart :: proc() -> bool {
|
||||
// TODO: read keypress
|
||||
return false
|
||||
return input.key_state(.Key_F6) == .Press
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@ import "sindri:input"
|
||||
|
||||
// event category, bitfield (?)
|
||||
|
||||
Event_Data :: union {
|
||||
// Event_Data :: union {
|
||||
Event :: union {
|
||||
Window_Close_Event,
|
||||
Window_Resize_Event,
|
||||
Joystick_Connect_Event,
|
||||
@@ -23,10 +24,10 @@ Event_Data :: union {
|
||||
Mouse_Scroll_Event,
|
||||
}
|
||||
|
||||
Event :: struct {
|
||||
data: Event_Data,
|
||||
handled: bool,
|
||||
}
|
||||
// Event :: struct {
|
||||
// data: Event_Data,
|
||||
// handled: bool,
|
||||
// }
|
||||
|
||||
Window_Close_Event :: struct {
|
||||
handled: bool,
|
||||
@@ -94,7 +95,7 @@ Mouse_Scroll_Event :: struct {
|
||||
// Variables
|
||||
|
||||
// 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
|
||||
|
||||
@@ -2,6 +2,7 @@ package sindri
|
||||
|
||||
import "core:fmt"
|
||||
import "core:time"
|
||||
import "sindri:test"
|
||||
|
||||
import "sindri:hot_reload"
|
||||
import "sindri:platform"
|
||||
@@ -41,6 +42,9 @@ main :: proc() {
|
||||
platform.os_poll_events()
|
||||
api.update(dt)
|
||||
|
||||
fmt.println("MAIN:", test.test)
|
||||
fmt.printf("pointer: %p | %p\n", &test.test, &test.test_proc)
|
||||
|
||||
platform.frame(dt)
|
||||
|
||||
dt = f32(time.duration_seconds(time.tick_since(start)))
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
package test
|
||||
|
||||
test: int = 0
|
||||
|
||||
test_proc: proc()
|
||||
Reference in New Issue
Block a user