Async::Safe
Runtime thread safety monitoring for concurrent Ruby code.
This gem provides a TracePoint-based ownership tracking system that detects when objects are accessed from multiple fibers or threads without proper synchronization. It helps catch concurrency bugs during development and testing with zero overhead in production.
Motivation
Ruby's fiber-based concurrency (via async) requires careful attention to object ownership. This gem helps you catch violations of the single-owner model in your test suite, preventing concurrency bugs from reaching production.
Enable it in your tests to get immediate feedback when objects are incorrectly shared across fibers.
Usage
Please browse the source code index or refer to the guides below.
Getting Started
This guide explains how to use async-safe to detect thread safety violations in your Ruby code.
Releases
Please browse the releases for more details.
v0.4.0
- Improved
Async::Safe.transferto recursively transfer ownership of tracked instance variables.
v0.3.2
- Better error message.
v0.3.0
- Inverted default model: classes are async-safe by default, use
ASYNC_SAFE = falseto enable tracking. - Added flexible
ASYNC_SAFEconstant support: boolean, hash, or array configurations. - Added
Class#async_safe!method for marking classes. - Added
Class#async_safe?(method)method for querying safety. - Added
Class.async_safe_traversefor custom deep transfer traversal (opt-in). - Improved
Async::Safe.transferto use shallow transfer by default with opt-in deep traversal. - Mark built-in collections (
Array,Hash,Set) as single-owner with deep traversal support. - Removed logger feature: always raises
ViolationErrorexceptions. - Removed
Async::Safe::Concurrentmodule: useasync_safe!instead.
v0.2.0
Thread::Queuetransfers ownership of objects popped from it.- Add support for
logger:option inAsync::Safe.enable!which logs violations instead of raising errors.
v0.1.0
- Implement TracePoint-based ownership tracking.
- Add
Async::Safe::Concurrentmodule for marking thread-safe classes. - Add
thread_safeclass method for marking thread-safe methods. - Add
Async::Safe.transferfor explicit ownership transfer - Add violation detection and reporting
- Zero overhead when monitoring is disabled
See Also
- async - Composable asynchronous I/O for Ruby.
- Thread Safety Guide - Best practices for concurrent Ruby code.
Contributing
We welcome contributions to this project.
- Fork it.
- Create your feature branch (
git checkout -b my-new-feature). - Commit your changes (
git commit -am 'Add some feature'). - Push to the branch (
git push origin my-new-feature). - Create new Pull Request.
Developer Certificate of Origin
In order to protect users of this project, we require all contributors to comply with the Developer Certificate of Origin. This ensures that all contributions are properly licensed and attributed.
Community Guidelines
This project is best served by a collaborative and respectful environment. Treat each other professionally, respect differing viewpoints, and engage constructively. Harassment, discrimination, or harmful behavior is not tolerated. Communicate clearly, listen actively, and support one another. If any issues arise, please inform the project maintainers.