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>
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>
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>
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>
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>
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>
implement task class methods:
- Task.new: creates task with block, optional name and priority
- Task.current: returns currently running task
- Task.list: returns array of all tasks in all queues
- Task.pass: yields to other tasks voluntarily
- Task.get: finds task by name
implement task instance methods:
- status: returns task status as symbol (:DORMANT, :READY, etc)
- name/name=: get/set task name
- priority/priority=: get/set priority with queue re-sorting
- suspend/resume: manual task suspension and resumption
- terminate: forcibly terminate task and wake joiners
- join: wait for task completion
the api provides full control over task lifecycle and scheduling
from ruby code while maintaining thread safety through irq protection.
Co-authored-by: Claude <noreply@anthropic.com>
implement core scheduling components:
- mrb_tick: tick handler for timeslice countdown and sleep wakeup
- mrb_tasks_run: main scheduler loop with context switching
- sleep operations: sleep_ms_impl, sleep, sleep_ms
- hal stub implementations for compilation (temporary)
the scheduler uses tick-based preemption with round-robin at same
priority. sleeping tasks wake when their tick count expires.
completed tasks move to dormant queue and wake any waiting joiners.
Co-authored-by: Claude <noreply@anthropic.com>
add priority queue operations:
- q_get_queue: select queue based on task status
- q_insert_task: priority-based insertion (lower number = higher priority)
- q_delete_task: remove task from queue
- q_find_task: search for task in all queues
add task lifecycle functions:
- task_alloc: allocate and zero-initialize task structure
- task_free: free task and associated context (stack + callinfo)
- task_init_context: initialize execution context similar to fiber
* allocate vm stack with dynamic sizing based on irep->nregs
* allocate callinfo stack
* setup callinfo with proc and target class
* set context status to MRB_TASK_CREATED
this completes phase 2 of the task scheduler implementation.
Co-authored-by: Claude <noreply@anthropic.com>
replace confusing "tcb" (task control block) terminology with clearer
"mrb_task" naming:
- struct mrb_tcb -> struct mrb_task
- update mrb_task_state to use mrb_task pointers
- rename internal functions to avoid naming conflicts:
- mrb_task_new -> task_alloc
- mrb_task_free (lifecycle) -> task_free
- update field names for clarity:
- tcb_join -> join
- task (ruby object) -> self
- value (return value) -> result
this makes the code more readable and follows mruby naming conventions
like mrb_context, mrb_irep, etc.
Co-authored-by: Claude <noreply@anthropic.com>
extend mrb_fiber_state enum with task-specific states:
- MRB_TASK_CREATED: task context initialized
- MRB_TASK_STOPPED: task execution finished
add mrb_task_state structure to mrb_state:
- task queues array (dormant, ready, waiting, suspended)
- tick counter for scheduling
- wakeup_tick for sleep timing
- switching flag for context switches
remove duplicate mrb_task_state definition from task.h since it is
now defined in include/mruby.h. all changes guarded by
MRB_USE_TASK_SCHEDULER for zero overhead when disabled.
Co-authored-by: Claude <noreply@anthropic.com>
create mruby-task gem directory structure with:
- mrbgem.rake: gem specification with task scheduler define
- include/task.h: tcb structure and core scheduler declarations
- src/task.c: implementation skeleton with empty method stubs
- mrblib/task.rb: ruby api documentation and task::stat class
all methods have empty bodies ready for implementation.
Co-authored-by: Claude <noreply@anthropic.com>