# safina-sync

[![crates.io version](https://img.shields.io/crates/v/safina-sync.svg)](https://crates.io/crates/safina-sync)
[![license: Apache 2.0](https://gitlab.com/leonhard-llc/safina-rs/-/raw/main/license-apache-2.0.svg)](http://www.apache.org/licenses/LICENSE-2.0)
[![unsafe forbidden](https://gitlab.com/leonhard-llc/safina-rs/-/raw/main/unsafe-forbidden-success.svg)](https://github.com/rust-secure-code/safety-dance/)
[![pipeline status](https://gitlab.com/leonhard-llc/safina-rs/badges/main/pipeline.svg)](https://gitlab.com/leonhard-llc/safina-rs/-/pipelines)

This is a safe Rust library for sharing or sending data between async tasks.

It is part of [`safina`](https://crates.io/crates/safina), a safe async runtime.

## Features
- `forbid(unsafe_code)`
- Depends only on `std`
- Good test coverage (100%)
- Works with [`safina-executor`](https://crates.io/crates/safina-executor) or any async executor

## Limitations
- Allocates

## Documentation
https://docs.rs/safina-sync

## Examples
```rust
use std::sync::Arc;
use safina_async_test::async_test;
use safina_sync::Mutex;
let shared_counter: Arc<Mutex<u32>> = get_shared_data();
{
    let mut counter_guard = shared_counter.lock().await;
    *counter_guard += 1;
    // some_async_fn().await; // Cannot await while holding a MutexGuard.
}
some_async_fn().await; // Await is ok after releasing MutexGuard.
```

## TO DO - Alternatives
- [async-lock](https://crates.io/crates/async-lock)
  - Contains a little `unsafe` code
- [futures-locks](https://crates.io/crates/futures-locks)
  - Contains a little `unsafe` code
- [futures-util](https://crates.io/crates/futures-util)
  - Very popular
  - Full of `unsafe`
- [tokio-sync](https://crates.io/crates/tokio-sync)
  - Very popular
  - Fast
  - Internally incredibly complicated
  - Full of `unsafe`

## Changelog
- v0.1.0 - First published version

## TO DO
- DONE - Implement `Mutex` with tests & docs
- DONE - Publish on crates.io
- Add `Barrier`
- Add `RwLock`
- Add `WaitableBool`
- Add `Promise`
- Add `Channel` (single receiver)
- Add `UnboundedChannel`
- Add `WaitableQueue` (multiple receivers)
- Add `UnboundedWaitableQueue`
- Add `Topic` (copies message to every receiver)

## Release Process
1. Edit `Cargo.toml` and bump version number.
1. Run `./release.sh`

License: Apache-2.0
