h := CreateFile("data.txt", ...) defer CloseHandle(h) // Guaranteed to run on scope exit // ... use h ...
package resource import "core:sys/windows"
Close_Handle :: proc(h: windows.HANDLE) -> bool if h == windows.INVALID_HANDLE_VALUE do return true return windows.CloseHandle(h) odin rqt-close
A typical Odin solution uses conditional compilation:
In Odin, every open deserves a close, every create a destroy. Your future self (and your operating system) will thank you. h := CreateFile("data
Or for a cross-platform abstraction:
import "core:runtime" cleanup_my_resource :: proc(data: rawptr) handle := cast(^windows.HANDLE)data CloseHandle(handle^) Your future self (and your operating system) will thank you
when ODIN_OS == "windows" close_fn :: proc(h: rawptr) windows.CloseHandle(transmute(windows.HANDLE)h) else when ODIN_OS == "linux" || ODIN_OS == "darwin" close_fn :: proc(fd: rawptr) sys.linux.close(transmute(int)fd)
In the landscape of modern programming languages, automatic garbage collection and RAII (Resource Acquisition Is Initialization) have become the norm. The Odin programming language, however, takes a distinct path. It embraces simplicity, data-orientation, and explicit control. One of the key functions that exemplifies this philosophy is rqt-close (often accessed via the core:sys/windows or similar platform-specific bindings, or as part of a custom runtime).
rqt-close is not a magic keyword or a hidden runtime feature. It is a discipline . By writing an explicit close for every opened file, created handle, or allocated system object, you retain full control over your program’s interaction with the operating system.