{"id":28923690,"url":"https://github.com/frostyplanet/crossfire-rs","last_synced_at":"2026-05-23T11:01:23.907Z","repository":{"id":54011156,"uuid":"275917783","full_name":"frostyplanet/crossfire-rs","owner":"frostyplanet","description":"A lockless mpmc/mpsc to support async derive from crossbeam ","archived":false,"fork":false,"pushed_at":"2026-01-20T21:44:00.000Z","size":1059,"stargazers_count":396,"open_issues_count":4,"forks_count":13,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-01-20T23:21:28.672Z","etag":null,"topics":["async","channel","mpmc","mpsc","rust","spsc"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/frostyplanet.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2020-06-29T20:21:29.000Z","updated_at":"2026-01-20T21:44:05.000Z","dependencies_parsed_at":"2025-07-16T06:25:13.342Z","dependency_job_id":"326c76d7-6b0b-4b95-acee-d4979abc68ff","html_url":"https://github.com/frostyplanet/crossfire-rs","commit_stats":null,"previous_names":["frostyplanet/crossfire-rs","qingstor/crossfire-rs"],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/frostyplanet/crossfire-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frostyplanet%2Fcrossfire-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frostyplanet%2Fcrossfire-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frostyplanet%2Fcrossfire-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frostyplanet%2Fcrossfire-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frostyplanet","download_url":"https://codeload.github.com/frostyplanet/crossfire-rs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frostyplanet%2Fcrossfire-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28914896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T12:13:43.263Z","status":"ssl_error","status_checked_at":"2026-01-30T12:13:22.389Z","response_time":66,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","channel","mpmc","mpsc","rust","spsc"],"created_at":"2025-06-22T09:39:55.624Z","updated_at":"2026-05-23T11:01:23.898Z","avatar_url":"https://github.com/frostyplanet.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Crossfire\n\n[![Build Status](https://github.com/frostyplanet/crossfire-rs/workflows/Rust/badge.svg)](\nhttps://github.com/frostyplanet/crossfire-rs/actions)\n[![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)](\nhttps://github.com/qignstor/crossfire-rs#license)\n[![Cargo](https://img.shields.io/crates/v/crossfire.svg)](\nhttps://crates.io/crates/crossfire)\n[![Documentation](https://docs.rs/crossfire/badge.svg)](\nhttps://docs.rs/crossfire)\n[![Rust 1.36+](https://img.shields.io/badge/rust-1.36+-lightgray.svg)](\nhttps://www.rust-lang.org)\n\nHigh-performance lockless spsc/mpsc/mpmc channels, algorithm derives crossbeam with improvements.\n\nIt supports async contexts and bridges the gap between async and blocking contexts.\n\nFor the concept, please refer to the [wiki](https://github.com/frostyplanet/crossfire-rs/wiki).\n\n## Version history\n\n* v1.0: Used in production since 2022.12.\n\n* v2.0: [2025.6] Refactored the codebase and API\nby removing generic types from the ChannelShared type, which made it easier to code with.\n\n* v2.1: [2025.9] Removed the dependency on crossbeam-channel\nand implemented with [a modified version of crossbeam-queue](https://github.com/frostyplanet/crossfire-rs/wiki/crossbeam-related),\nbrings 2x performance improvements for both async and blocking contexts.\n\n* v3.0: [2026.1] Refactored API back to generic flavor interface, added [select](https://docs.rs/crossfire/latest/crossfire/select/index.html).\nDedicated optimization: Bounded SPSC +70%, MPSC +30%, one-size +20%.\nEliminate enum dispatch cost, async performance improved for another 33%.\nCheckout [compat](https://docs.rs/crossfire/latest/crossfire/compat/index.html) for migration from v2.x.\n\n\n## Performance\n\nBeing a lockless channel, crossfire outperforms other async-capable channels.\nAnd thanks to a lighter notification mechanism, in a blocking context, most cases are even\nbetter than the original crossbeam-channel,\n\n\u003cimg src=\"https://github.com/frostyplanet/crossfire-rs/wiki/images/benchmark-3.0.0-2026-01-18/mpsc_size_100_sync.png\" alt=\"mpsc bounded size 100 blocking context\"\u003e\n\n\u003cimg src=\"https://github.com/frostyplanet/crossfire-rs/wiki/images/benchmark-3.0.0-2026-01-18/mpmc_size_100_sync.png\" alt=\"mpmc bounded size 100 blocking context\"\u003e\n\n\u003cimg src=\"https://github.com/frostyplanet/crossfire-rs/wiki/images/benchmark-3.0.0-2026-01-18/mpsc_size_100_tokio.png\" alt=\"mpsc bounded size 100 async context\"\u003e\n\n\u003cimg src=\"https://github.com/frostyplanet/crossfire-rs/wiki/images/benchmark-3.0.0-2026-01-18/mpmc_size_100_tokio.png\" alt=\"mpmc bounded size 100 async context\"\u003e\n\nMore benchmark data is posted on [wiki](https://github.com/frostyplanet/crossfire-rs/wiki/benchmark-v3.0.0-2026%E2%80%9001%E2%80%9018).\n\nAlso, being a lockless channel, the algorithm relies on spinning and yielding. Spinning is good on\nmulti-core systems, but not friendly to single-core systems (like virtual machines).\nSo we provide a function `detect_backoff_cfg()` to detect the running platform.\nCalling it within the initialization section of your code, will get a 2x performance boost on\nVPS.\n\nThe benchmark is written in the criterion framework. You can run the benchmark by:\n\n``` shell\nmake bench crossfire\nmake bench crossfire_select\n```\n\n## APIs\n\n### Concurrency Modules\n\n- [spsc](https://docs.rs/crossfire/latest/crossfire/spsc/index.html), [mpsc](https://docs.rs/crossfire/latest/crossfire/mpsc/index.html), [mpmc](https://docs.rs/crossfire/latest/crossfire/mpmc/index.html). Each has different underlying implementation\noptimized to its concurrent model.\nThe SP or SC interface is only for non-concurrent operation. It's more memory-efficient in waker registration,\nand has atomic ops cost reduced in the lockless algorithm.\n\n- [oneshot](https://docs.rs/crossfire/latest/crossfire/oneshot/index.html) has its special sender/receiver type because using `Tx` / `Rx` will be too heavy.\n\n- [select](https://docs.rs/crossfire/latest/crossfire/select/index.html):\n    - [Select\u003c'a\u003e](https://docs.rs/crossfire/latest/crossfire/select/struct.Select.html): crossbeam-channel style type erased API, borrows receiver address and select with \"token\"\n    - [Multiplex](https://docs.rs/crossfire/latest/crossfire/select/struct.Multiplex.html): Multiplex stream that owns multiple receiver, select from the same type of\n    channel flavors, for the same type of message.\n\n- [waitgroup](https://docs.rs/crossfire/latest/crossfire/waitgroup/index.html) High performance WaitGroup that allows custom threshold.\n\n### Flavors\n\nThe following lockless queues are expose in [flavor](https://docs.rs/crossfire/latest/crossfire/flavor/index.html) module, and each one have type alias in spsc/mpsc/mpmc:\n\n- `List` (which use crossbeam `SegQueue`)\n- `Array` (which is an enum that wraps crossbeam `ArrayQueue`, and a `One` if init with size\u003c=1)\n  - For a bounded channel, a 0 size case is not supported yet. (rewrite as 1 size).\n  - The implementation for spsc \u0026 mpsc is simplified from mpmc version.\n- `One` (which derives from `ArrayQueue` algorithm, but have better performance in size=1\nscenario, because it have two slots to allow reader and writer works concurrently)\n- `Null` (See the doc [null](https://docs.rs/crossfire/latest/crossfire/null/index.html)), for cancellation purpose channel, that only wakeup on\nclosing.\n\n**NOTE** :\nAlthough the name `Array`, `List` are the same between spsc/mpsc/mpmc module,\nthey are different type alias local to its parent module. We suggest distinguish by\nnamespace when import for use.\n\n### Channel builder function\n\nAside from function `bounded_*`, `unbounded_*` which specify the sender / receiver type,\neach module has [build()](https://docs.rs/crossfire/latest/crossfire/mpmc/fn.build.html) and [new()](https://docs.rs/crossfire/latest/crossfire/mpmc/fn.new.html) function, which can apply to any channel flavors, and any async/blocking combinations.\n\n### Types\n\n\u003ctable align=\"center\" cellpadding=\"30\"\u003e\n\u003ctr\u003e \u003cth rowspan=\"2\"\u003e Context \u003c/th\u003e\u003cth colspan=\"2\" align=\"center\"\u003e Sender (Producer) \u003c/th\u003e \u003cth colspan=\"2\" align=\"center\"\u003e Receiver (Consumer) \u003c/th\u003e \u003c/tr\u003e\n\u003ctr\u003e \u003ctd\u003e Single \u003c/td\u003e \u003ctd\u003e Multiple \u003c/td\u003e\u003ctd\u003e Single \u003c/td\u003e\u003ctd\u003e Multiple \u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd align=\"center\" rowspan=\"2\"\u003e \u003cb\u003eBlocking\u003c/b\u003e \u003c/td\u003e\n\u003ctd colspan=\"2\" align=\"center\"\u003e BlockingTxTrait \u003c/td\u003e\n\u003ctd colspan=\"2\" align=\"center\"\u003e BlockingRxTrait \u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eTx \u003c/td\u003e\n\u003ctd align=\"center\"\u003eMTx\u003c/td\u003e\n\u003ctd align=\"center\"\u003eRx\u003c/td\u003e\n\u003ctd align=\"center\"\u003eMRx\u003c/td\u003e\n \u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\u003cb\u003eWeak reference\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003e\u003ca\u003eWeakTx\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd align=\"center\" rowspan=\"2\"\u003e\u003cb\u003eAsync\u003c/b\u003e\u003c/td\u003e\n\u003ctd colspan=\"2\" align=\"center\"\u003eAsyncTxTrait\u003c/td\u003e\n\u003ctd colspan=\"2\" align=\"center\"\u003eAsyncRxTrait\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAsyncTx\u003c/td\u003e\n\u003ctd\u003eMAsyncTx\u003c/td\u003e\n\u003ctd\u003eAsyncRx\u003c/td\u003e\n\u003ctd\u003eMAsyncRx\u003c/td\u003e\u003c/tr\u003e\n\n\u003c/table\u003e\n\n*Safety*: For the SP / SC version, `AsyncTx`, `AsyncRx`, `Tx`, and `Rx` are not `Clone` and without `Sync`.\nAlthough can be moved to other threads, but not allowed to use send/recv while in an Arc. (Refer to the compile_fail\nexamples in the type document).\n\nThe benefit of using the SP / SC API is completely lockless waker registration, in exchange for a performance boost.\n\nThe sender/receiver can use the **`From`** trait to convert between blocking and async context\ncounterparts (refer to the [example](#example) below)\n\n### Error types\n\nError types are the same as crossbeam-channel:\n\n`TrySendError`, `SendError`, `SendTimeoutError`, `TryRecvError`, `RecvError`, `RecvTimeoutError`\n\n### Async compatibility\n\nTested on tokio-1.x and async-std-1.x, crossfire is runtime-agnostic.\n\nThe following scenarios are considered:\n\n* The `AsyncTx::send()` and `AsyncRx::recv()` operations are **cancellation-safe** in an async context.\nYou can safely use the select! macro and timeout() function in tokio/futures in combination with recv().\n On cancellation, `SendFuture` and `RecvFuture` will trigger drop(), which will clean up the state of the waker,\nmaking sure there is no memory-leak and deadlock.\nBut you cannot know the true result from SendFuture, since it's dropped\nupon cancellation. Thus, we suggest using `AsyncTx::send_timeout()` instead.\n\n* When the \"tokio\" or \"async_std\" feature is enabled, we also provide two additional functions:\n\n- `AsyncTx::send_timeout()`, which will return the message that failed to be sent in\n`SendTimeoutError`. We guarantee the result is atomic. Alternatively, you can use\n`AsyncTx::send_with_timer()`.\n\n- `AsyncRx::recv_timeout()`, we guarantee the result is atomic.\nAlternatively, you can use `AsyncRx::recv_with_timer()`.\n\n* The waker footprint:\n\nWhen using a multi-producer and multi-consumer scenario, there's a small memory overhead to pass along a `Weak`\nreference of wakers.\nBecause we aim to be lockless, when the sending/receiving futures are canceled (like tokio::time::timeout()),\nit might trigger an immediate cleanup if the try-lock is successful, otherwise will rely on lazy cleanup.\n(This won't be an issue because weak wakers will be consumed by actual message send and recv).\nOn an idle-select scenario, like a notification for close, the waker will be reused as much as possible\nif poll() returns pending.\n\n* Handle written future:\n\nThe future object created by `AsyncTx::send()`, `AsyncTx::send_timeout()`, `AsyncRx::recv()`,\n`AsyncRx::recv_timeout()` is `Sized`. You don't need to put them in `Box`.\n\nIf you like to use poll function directly for complex behavior, you can call\n`AsyncSink::poll_send()` or `AsyncStream::poll_item()` with Context.\n\n## Usage\n\nCargo.toml:\n```toml\n[dependencies]\ncrossfire = \"3.1\"\n```\n\n### Feature flags\n\n* `compat`: Enable the compat model, which has the same API namespace struct as V2.x\n\n* `tokio`: Enable `send_timeout()`, `recv_timeout()` with tokio sleep function. (conflict\nwith `async_std` feature)\n\n* `async_std`: Enable send_timeout, recv_timeout with async-std sleep function. (conflict\nwith `tokio` feature)\n\n* `trace_log`: Development mode, to enable internal log while testing or benchmark, to debug deadlock issues.\n\n### Example\n\nblocking / async sender receiver mixed together\n\n```rust\n\nextern crate crossfire;\nuse crossfire::*;\n#[macro_use]\nextern crate tokio;\nuse tokio::time::{sleep, interval, Duration};\n\n#[tokio::main]\nasync fn main() {\n    let (tx, rx) = mpmc::bounded_async::\u003cusize\u003e(100);\n    let mut recv_counter = 0;\n    let mut co_tx = Vec::new();\n    let mut co_rx = Vec::new();\n    const ROUND: usize = 1000;\n\n    let _tx: MTx\u003cmpmc::Array\u003cusize\u003e\u003e = tx.clone().into_blocking();\n    co_tx.push(tokio::task::spawn_blocking(move || {\n        for i in 0..ROUND {\n            _tx.send(i).expect(\"send ok\");\n        }\n    }));\n    co_tx.push(tokio::spawn(async move {\n        for i in 0..ROUND {\n            tx.send(i).await.expect(\"send ok\");\n        }\n    }));\n    let _rx: MRx\u003cmpmc::Array\u003cusize\u003e\u003e = rx.clone().into_blocking();\n    co_rx.push(tokio::task::spawn_blocking(move || {\n        let mut count: usize = 0;\n        'A: loop {\n            match _rx.recv() {\n                Ok(_i) =\u003e {\n                    count += 1;\n                }\n                Err(_) =\u003e break 'A,\n            }\n        }\n        count\n    }));\n    co_rx.push(tokio::spawn(async move {\n        let mut count: usize = 0;\n        'A: loop {\n            match rx.recv().await {\n                Ok(_i) =\u003e {\n                    count += 1;\n                }\n                Err(_) =\u003e break 'A,\n            }\n        }\n        count\n    }));\n    for th in co_tx {\n        let _ = th.await.unwrap();\n    }\n    for th in co_rx {\n        recv_counter += th.await.unwrap();\n    }\n    assert_eq!(recv_counter, ROUND * 2);\n}\n```\n\n## Test status\n\n**NOTE**: Because we has push the speed to a level no one has gone before,\nit can put a pure pressure to the async runtime.\nSome hidden bug (especially atomic ops on weaker ordering platform) might occur:\n\nThe test is placed in test-suite directory, run with:\n\n```\nmake test\n```\n\n\u003ctable cellpadding=\"30\"\u003e\n\u003ctr\u003e\u003cth\u003earch\u003c/th\u003e\u003cth\u003eruntime\u003c/th\u003e\u003cth\u003eworkflow\u003c/th\u003e\u003cth\u003estatus\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" rowspan=\"5\"\u003ex86_64\u003c/td\u003e\n\u003ctd\u003ethreaded\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_threaded_x86.yml\"\u003ecron_master_threaded_x86\u003c/a\u003e \u003c/td\u003e\n\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003etokio 1.47.1\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_tokio_x86.yml\"\u003ecron_master_tokio_x86\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eSTABLE\u003cbr/\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003easync-std\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_async_std_x86.yml\"\u003ecron_master_async_std_x86\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003esmol\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_smol_x86.yml\"\u003ecron_master_smol-x86\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003ctr\u003e\u003ctd\u003ecompio\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_compio_x86.yml\"\u003ecron_master_compio-x86\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003everifying\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd align=\"center\" rowspan=\"5\"\u003earm\u003c/td\u003e\n\u003ctd\u003ethreaded\u003c/td\u003e\n\u003ctd\u003e\n\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_threaded_arm.yml\"\u003ecron_master_threaded_arm\u003c/a\u003e\u003cbr/\u003e\n\u003c/td\u003e\n\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003etokio \u003e= 1.48 (\u003ca href=\"https://github.com/tokio-rs/tokio/pull/7622\"\u003etokio PR #7622\u003c/a\u003e)\n\u003c/td\u003e\n\u003ctd\u003e\n\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_tokio_arm.yml\"\u003ecron_master_tokio_arm\u003c/a\u003e\u003cbr/\u003e\n\u003c/td\u003e\n\u003ctd\u003e SHOULD UPGRADE tokio to 1.48\u003cbr/\u003e\nSTABLE\n \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003easync-std\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_async_std_arm.yml\"\u003ecron_master_async_std_arm\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003esmol\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_smol_arm.yml\"\u003ecron_master_smol_arm\u003c/a\u003e \u003c/td\u003e\n\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecompio\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/cron_master_compio_arm.yml\"\u003ecron_master_compio_arm\u003c/a\u003e \u003c/td\u003e\n\u003ctd\u003everifying\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd rowspan=\"4\"\u003emiri (emulation)\u003c/td\u003e\n\u003ctd\u003ethreaded\u003c/td\u003e\n\u003ctd rowspan=\"2\"\u003e\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/miri_tokio.yml\"\u003emiri_tokio\u003c/a\u003e\u003cbr /\u003e\n\u003ca href=\"https://github.com/frostyplanet/crossfire-rs/actions/workflows/miri_tokio_cur.yml\"\u003emiri_tokio_cur\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003etokio\u003c/td\u003e\u003ctd\u003eSTABLE\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003easync-std\u003c/td\u003e\u003ctd\u003e-\u003c/td\u003e \u003ctd\u003e (timerfd_create) not supported by miri \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003esmol\u003c/td\u003e\u003ctd\u003e-\u003c/td\u003e \u003ctd\u003e (timerfd_create) not supported by miri \u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n### Debugging deadlock issue\n\n**Debug locally**:\n\nUse `--features trace_log` to run the bench or test until it hangs, then press `ctrl+c` or send `SIGINT`,  there will be latest log dump to /tmp/crossfire_ring.log (refer to tests/common.rs `_setup_log()`)\n\n**Debug with github workflow**:  https://github.com/frostyplanet/crossfire-rs/issues/37\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrostyplanet%2Fcrossfire-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrostyplanet%2Fcrossfire-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrostyplanet%2Fcrossfire-rs/lists"}