Commit Graph

56 Commits

Author SHA1 Message Date
Yukihiro "Matz" Matsumoto dc7c6ed7a7 mruby-fiber,mruby-task: increase stack init size for 32-bit msvc
increase fiber_stack_init_size and task_stack_init_size from 16 to 64
to fix crashes on 32-bit msvc builds. git bisect identified commit
3246dd2 (which reduced sizes from 64 to 16) as causing the issue.
empirical testing shows 48 fails intermittently but 64 is stable on
32-bit msvc, likely due to different alignment or initialization
overhead on 32-bit platforms.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-18 23:34:10 +09:00
Yukihiro "Matz" Matsumoto e540547413 mruby-task: use hal-win-task for mingw builds
mingw provides posix compatibility for file i/o but not for signal
handling. hal-posix-task relies on SIGALRM, setitimer(), and
sigprocmask() which are not available on windows even through mingw.

changed hal selection for mruby-task to use hal-win-task for mingw,
while mruby-dir, mruby-io, and mruby-socket correctly use posix hals
for mingw since those features are supported.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 19:00:06 +09:00
Yukihiro "Matz" Matsumoto feca90ceab hal: fix selection to use toolchain instead of RUBY_PLATFORM
when building with MSVC on Windows, RUBY_PLATFORM (from the Ruby
installation running rake) may indicate "mingw" if Ruby was installed
via RubyInstaller, causing incorrect selection of POSIX HALs instead
of Windows HALs.

fixed by checking spec.build.primary_toolchain first:
- if toolchain is "visualcpp", select Windows HALs
- otherwise fall through to existing platform checks

this ensures MSVC builds use hal-win-* gems even when Ruby itself
was installed with MinGW.

affected gems:
- mruby-dir
- mruby-io
- mruby-socket
- mruby-task

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 18:20:32 +09:00
Yukihiro "Matz" Matsumoto 34205d6ba3 mruby-task: fix integer conversion warning by using uint32_t for sleep functions
change sleep_us_impl and sleep_ms_impl parameters from mrb_int to uint32_t.
this makes the type requirement explicit and resolves msvc warning c4244.
all type conversions happen at ruby boundary functions after validation.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 16:34:01 +09:00
Yukihiro "Matz" Matsumoto 96e91004cd mruby-task: reduce initial stack sizes to match fiber allocations
reduced TASK_STACK_INIT_SIZE from 64 to 16 and TASK_CI_INIT_SIZE from 8 to 4,
matching mruby-fiber's conservative allocations. this saves 56 bytes per task
(320 bytes down to 160 bytes for initial allocations). stacks grow dynamically
via mrb_stack_extend when needed.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 14:56:13 +09:00
Yukihiro "Matz" Matsumoto 510f1ddb75 mruby-task: fix proc retrieval in execute_task to ensure coherence
use t->c.ci->proc directly with explicit null check instead of falling
back to t->proc (which was removed). with c function boundary checks
preventing suspension in c functions, proc should always be valid on resume.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 14:56:13 +09:00
Yukihiro "Matz" Matsumoto 4b25faace0 mruby-task: further optimize struct with redundancy removal and unions
removes duplicate proc field and adds state-based union for result/timeslice,
achieving 16 bytes total savings per task (12.5% reduction):

optimizations:
- removed proc field (stored in c.ci->proc, already marked by gc): 8 bytes
- unified result/timeslice into state union (mutually exclusive): ~4 bytes
- combined with previous commit savings (priority_preemption, started, etc)

total reduction: 128 -> 112 bytes per task

impact:
- 10 tasks: 160 bytes saved
- 50 tasks: 800 bytes saved
- 100 tasks: 1.6 KB saved

all 1770 tests pass with zero functionality changes.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 14:56:13 +09:00
Yukihiro "Matz" Matsumoto 6d4fecc57c mruby-task: optimize mrb_task struct memory footprint
reduces per-task memory usage by 8 bytes (6.2%) through:
- removing priority_preemption field (always equals priority)
- removing started flag (inferred from context status)
- unifying wakeup_tick/join/mutex into single union

old size: 128 bytes
new size: 120 bytes

all tests pass with no functionality changes.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 14:56:12 +09:00
Yukihiro "Matz" Matsumoto d72b5d5fbc mruby-task: raise exception when task.pass is called from C function
when task.pass is called from within a C function (such as Module.new's
block evaluation), attempting to yield would cause a segfault because C
functions lack valid bytecode program counters (see #6642).

this commit adds C function boundary detection to task.pass, raising a
runtime error when cci > 0 (indicating execution is inside a C function).
this matches fiber's behavior and provides a clear error message instead of
a cryptic segfault.

unlike the previous commit which allowed sleep to fall back to blocking
sleep, task.pass raises an exception because its sole purpose is cooperative
yielding - there is no sensible blocking fallback behavior.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 10:49:26 +09:00
Yukihiro "Matz" Matsumoto f8883178c5 mruby-task: prevent segfault when sleep is called from C function; fix #6642
when sleep() was called from within a C function (such as module.new's block
evaluation), the task scheduler would segfault while attempting to resume the
task. this occurred because C functions don't execute bytecode and thus their
callinfo has no valid program counter (pc). when the task tried to resume
execution, mrb_vm_exec() received a null pc, causing a segmentation fault.

the fix adds two safeguards in task.c:

1. C function boundary detection: before suspending a task for sleep, check
   if we're inside a C function by examining the cci (c call info) field.
   if cci > 0, fall back to blocking sleep via HAL instead of attempting
   cooperative context switch. this preserves sleep functionality without
   raising exceptions, though it blocks other tasks during the sleep period.

2. proc fallback in execute_task(): use the task's stored proc if the
   current callinfo's proc is null, ensuring mrb_vm_exec() always receives
   a valid proc pointer.

this approach prioritizes functionality over strict cooperative multitasking
semantics - tasks can still sleep inside C functions, but the sleep becomes
blocking. the alternative would be raising an exception like fiber does, but
that would break existing code unexpectedly.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 10:45:10 +09:00
Yukihiro "Matz" Matsumoto 610ff67906 HAL: rename functions to mrb_hal_<feature>_<name> convention
rename all HAL functions from mrb_<feature>_hal_<name>() to
mrb_hal_<feature>_<name>() for better grouping and clarity. this makes all
HAL functions immediately identifiable with the mrb_hal_* prefix.

affected gems:
- mruby-task: mrb_task_hal_* -> mrb_hal_task_*
- mruby-io: mrb_io_hal_* -> mrb_hal_io_*
- mruby-socket: mrb_socket_hal_* -> mrb_hal_socket_*
- mruby-dir: mrb_dir_hal_* -> mrb_hal_dir_*

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 09:59:03 +09:00
Yukihiro "Matz" Matsumoto f81cadfed5 mrbgems: standardize HAL header include patterns
changed from angle brackets to quotes for gem-local HAL headers
(task.h, io_hal.h, socket_hal.h), and removed relative path prefix
from task.h include. this follows the mrbgem build system convention
where gem/include/ is automatically added to the include path.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-15 18:52:28 +09:00
Yukihiro "Matz" Matsumoto 87c8889726 mruby-task: move platform-specific sleep to hal
task.c used clock_gettime() directly, breaking portability. added
mrb_task_hal_sleep_us() to hal interface.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-15 08:00:34 +09:00
Yukihiro "Matz" Matsumoto 6ff5c7bfa9 mruby-task: rename mrb_tasks_run to mrb_task_run
follows mrb_{gem_name}_{operation} naming convention consistently
with other hal functions like mrb_task_hal_init. the plural form was
semantically correct but inconsistent with gem naming patterns.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-14 23:11:10 +09:00
Yukihiro "Matz" Matsumoto 4fa51c8ea0 task_hal.h: remove non-HAL function declarations
removes mrb_tasks_run and mrb_task_mark_all from task_hal.h as these
are core scheduler functions, not HAL interface functions. only
mrb_tick remains as it must be called by HAL timer callbacks.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-14 23:10:34 +09:00
Yukihiro "Matz" Matsumoto 9c100ab844 mruby-task: introduce HAL (hardware abstraction layer) for platform support
separates platform-specific timer and interrupt code into hal-posix-task
and hal-win-task gems. mruby-task now uses HAL interface defined in
task_hal.h, making it easier to port to new platforms.

hal-posix-task: uses sigalrm/setitimer for timer, sigprocmask for irq
protection, and SA_RESTART flag to prevent EINTR on system calls.

hal-win-task: uses multimedia timer API and critical_section for irq
protection.

both HALs support multiple mrb_state instances with single shared timer.
auto-detection loads appropriate HAL based on platform.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-14 09:14:59 +09:00
Yukihiro "Matz" Matsumoto 4181a42cd2 mruby-task: remove unnecessary mruby-fiber dependency
mruby-task uses mrb_context and mrb_fiber_state enum, but these are
part of core mruby, not the mruby-fiber gem. the dependency was not
needed.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-14 09:14:55 +09:00
Yukihiro "Matz" Matsumoto 572c674c2b mruby-task: fix memory leak in task context cleanup; ref #6641
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 23:01:33 +09:00
Yukihiro "Matz" Matsumoto 7469b79aa8 mruby-task: link with winmm library on windows
windows multimedia timer api requires linking with winmm.lib. added
conditional linker library using spec.for_windows? to match mruby
build system conventions.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 12:23:33 +09:00
Yukihiro "Matz" Matsumoto 34bf0c1fd2 mruby-task: add macos and windows hal support
extended posix platform detection to include macos via __APPLE__ and
__MACH__ defines. implemented full windows hal using multimedia timer
(timeSetEvent) and CRITICAL_SECTION for thread synchronization. added
task_count_update stub for unsupported platforms with clear warnings.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 11:52:58 +09:00
Yukihiro "Matz" Matsumoto 872c3bcea4 mruby-task: remove unnecessary ifdef guards
remove MRB_USE_TASK_SCHEDULER ifdef guards from task.h and task.c
since the macro is always defined when compiling this gem

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 10:34:10 +09:00
Yukihiro "Matz" Matsumoto 8d61b67dc1 mruby-task: fix c++ compatibility warnings
- remove redundant MRB_TASK_CREATED/STOPPED macros from task.h since
  they are now properly defined in mrb_fiber_state enum in mruby.h
- declare kw_names array separately to avoid taking address of
  temporary array in c++ compilation

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 10:29:41 +09:00
Yukihiro "Matz" Matsumoto 76d6c1b16e mruby-task: remove unused task_count variable
remove unused task_count variable in mrb_task_mark_all to fix compiler
warning.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 09:02:44 +09:00
Yukihiro "Matz" Matsumoto b50dbfe868 mruby-task: update readme API documentation
clarify that task.new name parameter must be string, document
task#name returns "(noname)" for unnamed tasks, and provide full
structure of task.stat return value.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 08:57:11 +09:00
Yukihiro "Matz" Matsumoto eb13ffdc9d mruby-task: add comprehensive test suite
add tests for sleep/usleep validation, task creation, status/inspect
methods, control methods, task.stat, priority handling, and name
handling.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 08:44:11 +09:00
Yukihiro "Matz" Matsumoto dd06920640 mruby-task: fix validation bugs in task creation
fix uninitialized kwargs array causing crashes, add type validation for
name (must be String) and priority (must be Integer) parameters, return
"(noname)" for unnamed tasks.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 08:43:16 +09:00
Yukihiro "Matz" Matsumoto 2a124a704f mruby-task: add comprehensive examples demonstrating task features
added six new examples:
- simple.rb: basic task creation and execution
- priority.rb: priority-based scheduling
- suspend_resume.rb: manual task control
- inspection.rb: task status and inspection methods
- statistics.rb: scheduler monitoring with Task.stat
- producer_consumer.rb: task coordination pattern

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-10 17:44:31 +09:00
Yukihiro "Matz" Matsumoto 2d713c647e mruby-task: implement task.stat method
replaced stub with full implementation that returns a hash containing
scheduler statistics:

- tick: current tick counter
- wakeup_tick: next scheduled wakeup time
- dormant/ready/waiting/suspended: per-queue statistics

each queue stat includes:
- count: number of tasks in queue
- tasks: array of task objects in that queue

implements helper function mrb_stat_sub() to walk queues and collect
task information. uses irq disable/enable to ensure consistent snapshot.

returns hash directly as requested, not wrapped in stat object.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-10 17:30:06 +09:00
Yukihiro "Matz" Matsumoto 33e5af432b mruby-task: implement task#inspect method
added inspect method that returns formatted string showing:
- task pointer address
- task name (string/symbol), or "(unnamed)" for nil/other types
- task status (RUNNING, READY, WAITING, SUSPENDED, DORMANT, UNKNOWN)

format matches original implementation: #<Task:0x12345678 name:STATUS>

avoids mrb_funcall during inspection to prevent vm state issues.
handles string and symbol names directly, treats other types as unnamed.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-10 17:06:22 +09:00
Yukihiro "Matz" Matsumoto 6d640b77d6 mruby-task: implement task#status method
replaced stub implementation with proper status reporting that returns
symbols representing task state:
- :RUNNING for executing tasks
- :READY for tasks ready to execute
- :WAITING for tasks waiting (sleeping, blocked, etc.)
- :SUSPENDED for manually suspended tasks
- :DORMANT for terminated tasks
- :UNKNOWN for invalid states

implementation matches original mruby-task design using ternary operators
and MRB_SYM() macros for efficient symbol lookup.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-10 16:43:57 +09:00
Yukihiro "Matz" Matsumoto 77b6febc19 mruby-task: improve sleep implementation with efficiency and safety
improved sleep_us_impl() in several ways:

1. dynamic sleep intervals: now sleeps for actual remaining time instead
   of fixed 1ms polling, reducing unnecessary wakeups and improving
   efficiency for longer sleeps

2. error handling: added checks for clock_gettime() failures with fallback
   to usleep(), and input validation to handle negative values

3. overflow prevention: use named constant USEC_PER_MSEC instead of
   literal 1000 for microsecond-to-nanosecond conversion, and validate
   input before conversion

4. wraparound handling: fixed tick comparison at line 580 to use signed
   arithmetic like other tick comparisons in the codebase

5. code clarity: added time conversion constants (NSEC_PER_MSEC,
   NSEC_PER_SEC, USEC_PER_MSEC) to replace magic numbers

all tests pass.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-10 16:30:50 +09:00
Yukihiro "Matz" Matsumoto 0ea429e29e mruby-task: fix sleep from root context to use real wall-clock time
when sleep is called from root context (not within a task), it was
instantly advancing the simulated tick counter instead of actually
delaying. this caused task_pass.rb example to run tasks 0-5 instantly
without proper delays between iterations.

fixed by using clock_gettime() to track elapsed real time and sleeping
in 1ms intervals. also clear switching_ flag when returning from root
context sleep to prevent unwanted context switches.

removed find_earliest_wakeup_tick() function and time-advancing logic
from task_run_one_iteration() as real delays are now handled by sleep
itself.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-10 12:23:36 +09:00
Yukihiro "Matz" Matsumoto 1d90c19a36 mruby-task: rename constants for improved readability
Renamed constants to use more descriptive underscores:
- MRB_TASKSTATUS_* -> MRB_TASK_STATUS_*
- MRB_TASKREASON_* -> MRB_TASK_REASON_*

This improves code readability by making the constant names clearer.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-09 16:57:08 +09:00
Yukihiro "Matz" Matsumoto fd07c36feb mruby-task: refactor to eliminate code duplication
Eliminated approximately 160 lines of duplicated code (~10% of file) by
extracting common patterns into reusable helpers. This improves
maintainability by consolidating task execution logic, validation
patterns, and state transitions into single locations.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-09 16:54:37 +09:00
Yukihiro "Matz" Matsumoto 745e577b0e mruby-task: treat root context as main task
Implement main task wrapper following Fiber's pattern, where root context
is represented by a special task object. This matches PicoRuby behavior
where Task.current always returns a task object, even from root context.

The main task is lazy-allocated on first Task.current call from root,
stored in mrb->task.main_task, and has name "main", status RUNNING,
priority 0. It wraps the root context without allocating a separate
execution context.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-09 16:22:25 +09:00
Yukihiro "Matz" Matsumoto 6461af9cca mruby-task: support Task.pass from root context
Enable Task.pass to work from root context by implementing mini-scheduler
iteration. When called from root context, Task.pass now runs one task
iteration, allowing cooperative multitasking without Task.run. This matches
PicoRuby behavior.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-09 12:52:14 +09:00
Yukihiro "Matz" Matsumoto 61f99385ba mruby-task: fix crash by setting vmexec flag during task execution
Fix task termination crash caused by fiber_terminate freeing task
context resources. When a task completes, the VM would call
fiber_terminate which frees cibase/stbase, then next resume attempt
crashes dereferencing NULL pointers.

Solution unifies task and fiber lifecycle management:
- Set vmexec flag before calling mrb_vm_exec to prevent fiber_terminate
  from being called during normal task completion
- Save proc/pc to local variables to avoid CI_PROC_SET macro corruption
- Add termination check in mrb_task_free to prevent double-free

Tasks now follow the same execution pattern as Fiber, leveraging
VM's built-in context management.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-09 10:58:23 +09:00
Yukihiro "Matz" Matsumoto 8eb275b665 mruby-task: simplify stack marking using mrb_gc_mark_value
Replace manual mrb_immediate_p check with mrb_gc_mark_value macro
which already includes the immediate check internally.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-09 07:49:51 +09:00
Yukihiro "Matz" Matsumoto e7cbd8cc28 mruby-task: add gc protection and optimize task operations
Implements dual-mechanism GC protection and optimizes task lookup
using pointer arithmetic based on PicoRuby reference implementation.

GC Protection:
- Add mrb_gc_register/unregister to protect Task objects
- Implement mrb_task_mark_all() to mark task contexts during GC
- Store proc reference in mrb_task to prevent premature collection
- Integrate marking into gc.c root_scan_phase

Performance Optimizations:
- Add MRB2TASK macro for O(1) context-to-task conversion
- Optimize Task.current: O(n) queue search -> O(1) pointer arithmetic
- Optimize Task.pass: simplify to root context check
- Optimize Task.join: use MRB2TASK for current task lookup

Bug Fixes:
- Fix MRB_TASK_CREATED/STOPPED to use MRB_FIBER_TERMINATED
- Add safety check to prevent execution of terminated tasks
- Initialize callinfo PC to bytecode start in task_init_context

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:23 +09:00
Yukihiro "Matz" Matsumoto e49f42570c mruby-task: optimize timer control for single-task workloads
dynamically enable/disable timer interrupts based on scheduler state.
timer disabled when only one runnable task exists.
timer enabled when multiple tasks need preemption or sleeping tasks need wakeup.

use counter arrays to track ready/waiting tasks per vm.
separate platform-specific timer control from generic decision logic.
update counters at all task state transitions.

eliminates 250 interrupts/second in single-task workloads.
improves cpu efficiency and power consumption.
simplifies porting to new platforms.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:23 +09:00
Yukihiro "Matz" Matsumoto b416d29010 mruby-sleep,mruby-task: define sleep methods as module functions
change sleep, usleep, sleep_ms from private methods to module functions
to match cruby behavior where sleep can be called as both bare sleep and
kernel.sleep.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:22 +09:00
Yukihiro "Matz" Matsumoto 4e7b6babe8 mruby-task: support multiple concurrent mrb_states
replace global_mrb with vm_list to support up to 8 concurrent mrb_state
instances. sigalrm handler now ticks all registered VMs. first VM
initializes timer, last VM stops timer. proper cleanup in hal_final.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:22 +09:00
Yukihiro "Matz" Matsumoto fab6ccc794 mruby-task: add README.md
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:22 +09:00
Yukihiro "Matz" Matsumoto f6eb2e7c8e mruby-task: use MRB_SYM() for method name symbols
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:22 +09:00
Yukihiro "Matz" Matsumoto ee398ddcdc mruby-task: refactor sleep implementation to use microseconds
Rename sleep_ms_impl to sleep_us_impl as the base implementation,
providing true microsecond precision for usleep. sleep_ms_impl now
simply calls sleep_us_impl with converted values.

This ensures usleep provides proper microsecond granularity instead of
losing precision by converting to milliseconds.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:21 +09:00
Yukihiro "Matz" Matsumoto ef4a14996a mruby-task: add usleep method
Add usleep method that provides task-aware sleep behavior with
microsecond precision. This overrides mruby-sleep's usleep when both
gems are loaded.

The implementation converts microseconds to milliseconds and uses the
same sleep_ms_impl as sleep_ms, providing cooperative sleep within
tasks and signal-safe blocking sleep otherwise.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:21 +09:00
Yukihiro "Matz" Matsumoto c7e0312c65 mruby-task: fix sleep to work correctly with sigalrm timer
The sleep implementation now properly handles signal interruptions from
the sigalrm timer by using nanosleep with retry loop instead of usleep.

This commit also makes sleep override mruby-sleep's implementation when
both gems are loaded, providing task-aware sleep behavior.

Changes:
- replace usleep with nanosleep for signal-safe blocking sleep
- add retry loop to handle eintr interruptions
- use mrb_define_private_method_id for both sleep and sleep_ms
- add time.h and presym.h headers

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:21 +09:00
Yukihiro "Matz" Matsumoto f58051c48e mruby-task: fix context switching and sleep implementation
This commit fixes several critical issues in the task scheduler:

1. Context switching now properly saves and restores ci/cci pointers
   and sets prev links, following the fiber implementation pattern.
   This prevents crashes when tasks complete.

2. Sleep implementation now falls back to blocking sleep (usleep/Sleep)
   when not in task context, fixing standalone sleep calls.

3. Removed unused functions q_find_task and task_free to eliminate
   compiler warnings.

4. Added platform-specific headers for sleep functions on Unix/Windows.

5. Enabled HAL initialization which was previously commented out.

6. Added SA_RESTART flag to SIGALRM handler to prevent timer from
   interrupting IO syscalls, fixing mrbtest IO.popen failures.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:21 +09:00
Yukihiro "Matz" Matsumoto 47dfb771cf mruby-task: fix cooperative task yielding with Task.pass
this patch fixes several critical issues in the task scheduler:

1. vm integration for computed goto dispatch mode:
   - added task switching check in NEXT macro for computed goto
   - previous implementation only worked with switch dispatch mode
   - now Task.pass properly yields control to other tasks

2. task lifecycle tracking:
   - added 'started' flag to mrb_task structure
   - fixed first-run detection to avoid popping callinfo multiple times
   - vm overwrites context status during execution, making it unreliable

3. removed mrblib/task.rb:
   - empty Ruby method stubs were overriding C implementations
   - all task methods now properly implemented in C

4. cleaned up task scheduler loop:
   - proper task completion detection using switching flag
   - round-robin scheduling for tasks at same priority
   - clean scheduler exit when all tasks complete

tasks now cooperatively yield with Task.pass and complete cleanly.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:21 +09:00
Yukihiro "Matz" Matsumoto b7b06a0857 mruby-task: implement posix hal for timer and interrupt control
add hardware abstraction layer with posix implementation:
- setitimer: generates periodic sigalrm for tick-based scheduling
- signal handler: calls mrb_tick on each timer interrupt
- sigprocmask: enables/disables interrupts by blocking sigalrm
- usleep: idle cpu implementation for posix platforms

the hal is initialized during gem init and starts the periodic
timer automatically. non-posix platforms get stub implementations.

tick period is configurable via MRB_TICK_UNIT (default 4ms).

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:21 +09:00