Commit Graph

23 Commits

Author SHA1 Message Date
anth64 d1e71faa6d fix(platform): harden linux watch check and clean up whitespace 2026-01-24 09:58:52 +01:00
anth64 f331970ae2 refactor: optimize file watching and fix cross-platform reliability issues
Refactor memory allocation patterns:
- Replace realloc-in-loop with count-then-allocate pattern across all platforms
- Eliminate arbitrary buffer sizes (e.g., malloc(8 * ...)) in favor of exact counts
- Reduce allocation overhead by pre-counting items before malloc

Fix Windows file watching:
- Replace unreliable FindFirstChangeNotification with directory handle approach
- Add is_file_ready() to prevent events while compiler is still writing files
- Preserve timestamps when file is locked to retry on next poll
- Fix do-while loop in platform_directory_init_scan (was skipping first file)

Fix Linux inotify event handling:
- Consolidate DELETE+CREATE pairs into single RELOAD event
- Prevents duplicate events when compiler uses temp-file-and-rename pattern

Fix BSD/macOS kqueue implementation:
- Remove realloc loops from update_watches() and watch initialization
- Pre-count files before allocating file descriptor arrays

All platforms now correctly handle:
- Compiler overwrites (temp file operations)
- Manual copy/move operations
- Explicit file deletions

Tested on Linux, Windows 10, and FreeBSD.
2026-01-23 23:39:24 +01:00
anth64 d1972f7893 refactor(platform): Unify watch logic and fix manual snapshot leaks
Unlike inotify, Windows and BSD require manual state snapshots to detect
specific file changes. This refactor standardizes that manual handling
to ensure it is resource-safe and easy to follow.

- Fix memory leaks in platform_directory_watch_check where temporary
  buffers (new_snaps, file_list) were not reliably freed on 'phantom'
  triggers or error paths.
- Unify control flow using a 'goto' cleanup pattern to ensure
  deterministic resource deallocation.
- Synchronizes the manual snapshot comparison logic between Windows
  and BSD to ensure identical LOAD/RELOAD/UNLOAD event behavior.
- Simplifies the platform_directory_init_scan logic by removing
  redundant directory rewinds and nested checks.
- Add WIN32_LEAN_AND_MEAN to optimize Windows header inclusion.
- Align internal API signatures (is_module_loaded) for consistency.
2026-01-22 00:24:04 +01:00
anth64 c863da08dd fix(platform): address C89 warnings and Windows pointer casting
- Include <stdint.h> so Windows does not complain about int types.
- Cast GetProcAddress return through intptr_t to satisfy -Wpedantic.
- Moved work_path for *nix only macros.
2026-01-20 21:53:33 +01:00
anth64 c64f9aa946 fix: I forgot to change it from uint8_t to int... 2026-01-18 22:24:24 +01:00
anth64 3e2762ac15 remove accidental import, thanks clangd 2026-01-18 22:04:05 +01:00
anth64 a3978644af refactor: centralize module identity logic and upgrade lookup
- Move extract_module_id and is_valid_module_file to module.c
- Update is_module_loaded to return module index instead of uint8_t
- Fix platform.c event checks to handle index-based return (>= 0)
- Centralize STK_MODULE_EXT definitions in stk.h
2026-01-18 22:01:54 +01:00
anth64 a290be5dcc feat: implement .tmp directory isolation for safe hot-reload
Add foundation for cross-platform hot-reload system by isolating
loaded modules from source files using a temporary directory.

Changes:
- Add configurable tmp directory parameter to stk_init()
  (defaults to mods/.tmp/ if not specified)
- Copy all modules from mods/ to .tmp/ on initialization
- Load modules exclusively from .tmp/ directory
- Clean up .tmp/ directory on shutdown
- Add cross-platform file operations:
  * platform_mkdir() - create directories
  * platform_copy_file() - copy files
  * platform_remove_file() - delete files
  * platform_remove_dir() - delete directory and contents
- Improve BSD kqueue implementation to detect file overwrites
  (adds individual file watches with NOTE_WRITE)

This isolates the loaded shared libraries from source files,
preventing segfaults when users overwrite mods using cp/copy
operations. The actual reload logic remains unimplemented
(marked as TODO in stk_poll switch cases).
2026-01-18 21:26:17 +01:00
anth64 38469a358f Replace dynamic allocations with fixed-size buffers and add module extension filtering
- Use fixed STK_PATH_MAX and STK_MOD_ID_BUFFER throughout for predictable memory
- Filter by platform-specific extensions (.so/.dll/.dylib) with compile-time length
- Add RELOAD event detection and is_module_loaded() helper
- Maintain feature parity across all platforms
2026-01-17 19:52:42 +01:00
anth64 888e6d5f72 Added kqueue directory behavior and huge refactor
- Added kqueue directory watching code for other unix like OSes
  (FreeBSD, OpenBSD, MacOS, etc)
- Since much of the code for Linux and other *nix OSes was the same,
  some refactoring was done to not have duplicate code.
2026-01-11 15:31:14 +01:00
anth64 c95daad754 Simplify Windows event handling
- Use STK_MOD_LOAD/STK_MOD_UNLOAD for Windows events
- Map FILE_ACTION_ADDED/MODIFIED/RENAMED_NEW_NAME to load
- Map FILE_ACTION_REMOVED/RENAMED_OLD_NAME to unload
2025-11-06 20:42:41 +01:00
anth64 13604e3f3e Fix Linux inotify event handling and simplify module events
- Simplify to STK_MOD_LOAD/STK_MOD_UNLOAD event types
- Replace IN_CREATE/IN_MODIFY with IN_CLOSE_WRITE to wait for complete writes
- Update watch flags to IN_CLOSE_WRITE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM
2025-11-06 20:06:15 +01:00
anth64 b5bb6bc707 Fix (*file_list) pointer syntax in Windows code, remove repeated variable, windows code now returns event types 2025-11-05 07:49:57 +01:00
anth64 da4dcee490 Enhance file watching to return event types
- `platform_directory_watch_check` now returns event types along side
  file names/counts
2025-11-03 23:16:32 +01:00
anth64 3c7608ef51 create mod directory if it does not exist. 2025-11-02 19:01:08 +01:00
anth64 5c621c8367 Init/shutdown working
- stk_init/shutdown do what they are supposed to.
- buffer sizes moved to headers
2025-11-02 18:40:33 +01:00
anth64 a0c9cdb577 Windows implementation for platform_directory_init_scan 2025-11-02 13:55:09 +01:00
anth64 4b70f606fa add directory scan function intended for use on startup, Linux only for now 2025-11-02 12:56:02 +01:00
anth64 ed6325598c remove kqueue code, focus on Linux/Windows implementation for now. 2025-11-02 09:29:27 +01:00
anth64 390f1a40bc add kqueue directory start/stop, check is still wip 2025-11-01 18:20:16 +01:00
anth64 f1c6372b3e rename event buffer, add directory watching for windows (WIP/needs testing) 2025-10-31 07:39:11 +01:00
anth64 0e6664ec47 Implement Linux directory watching using inotify 2025-10-29 20:25:45 +01:00
anth64 9d8dad7ea1 platform specific dynamic library loading 2025-10-22 19:20:48 +02:00