Skip to content

Add erlang.sleep() with dirty scheduler release#24

Merged
benoitc merged 2 commits intomainfrom
feature/erlang-sleep
Mar 11, 2026
Merged

Add erlang.sleep() with dirty scheduler release#24
benoitc merged 2 commits intomainfrom
feature/erlang-sleep

Conversation

@benoitc
Copy link
Owner

@benoitc benoitc commented Mar 11, 2026

Summary

  • Add erlang.sleep() function that works in both async and sync contexts
  • Both modes release the dirty NIF scheduler thread
  • Remove unused _erlang_sleep NIF in favor of callback-based approach

Changes

erlang.sleep():

  • Async context: returns asyncio.sleep() using Erlang timer system via call_later()
  • Sync context: uses erlang.call('_py_sleep') callback with receive/after
  • Both modes release dirty scheduler, allowing other Erlang processes to run

Removed:

  • _erlang_sleep NIF (blocked pthread, only released GIL - not dirty scheduler)
  • dispatch_sleep_complete NIF and related sync_sleep fields
  • Sleep handlers from py_event_worker (replaced by callback in py_event_loop)

Documentation:

  • Updated docstring with dirty scheduler release details
  • Updated asyncio.md architecture diagram
  • Added erlang.sleep() API reference with context table

benoitc added 2 commits March 11, 2026 08:39
Add erlang.sleep() function that works in both async and sync contexts:
- Async: returns asyncio.sleep() which uses Erlang timer system
- Sync: uses erlang.call('_py_sleep') callback with receive/after,
  truly releasing the dirty scheduler for cooperative yielding

Remove unused _erlang_sleep NIF which only released the GIL but blocked
the pthread. The callback approach properly suspends the Erlang process.

Changes:
- Add sleep() to _erlang_impl and export to erlang module
- Add _py_sleep callback in py_event_loop.erl
- Remove py_erlang_sleep NIF and dispatch_sleep_complete
- Remove sync_sleep fields from event loop struct
- Remove sleep handlers from py_event_worker
- Update tests to use erlang.sleep()
Update docstring and asyncio.md to clarify:
- Both sync and async modes release the dirty NIF scheduler
- Async: yields to event loop via asyncio.sleep()/call_later()
- Sync: suspends Erlang process via receive/after callback

Also fix outdated architecture diagram that referenced removed
sleep_wait/dispatch_sleep_complete NIF.
@benoitc benoitc merged commit 50c97f2 into main Mar 11, 2026
10 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant