tokio-lk 0.2.2

Futures-aware lock-by-id primitives
Documentation
[![Crates.io](https://img.shields.io/crates/v/tokio-lk.svg)](https://crates.io/crates/tokio-lk)
[![License](https://img.shields.io/crates/l/tokio-lk)](LICENSE-MIT)
[![Build Status](https://travis-ci.org/zenixls2/tokio-lk.svg?branch=master)](https://travis-ci.org/zenixls2/tokio-lk)

# tokio-lk version - 0.2.2

## Tokio-lk

** A lock-by-id future for tokio **

`Lock` future will return `Guard` once it gets the mutex.
to hold the lock in subsequent futures, move the `Guard` inside the future output.
to release the mutex, simply drops the `Guard` from your future chain.

Each `Lock` object is assigned an **unique** id.
The uniqueness is promised until USIZE_MAX of id gets generated.
Make sure old Locks are dropped before you generate new Locks above this amount.

### Changelog
- 0.2.2 - minor fix on cargo.toml to let docs.rs generate documentation of all features
- 0.2.1 - add features for using either hashbrown or dashmap. add `KeyPool` for hashmap abstraction.
- 0.2.0 - bump to futures 0.3 and tokio 0.2
- 0.1.3 - now depends on [dashmap]https://crates.io/crates/dashmap to replace `RwLock<HashMap>`
- 0.1.2 - first stable version

### Example:
```rust
use std::time::{Duration, Instant};
use tokio_lk::*;
use futures::prelude::*;
use tokio::runtime::Runtime;
use tokio::time::delay_for;

let mut rt = Runtime::new().unwrap();
let map = KeyPool::<MapType>::new();
let now = Instant::now();
// this task will compete with task2 for lock at id 1
let task1 = async {
    let _guard = Lock::fnew(1, map.clone()).await.await;
    delay_for(Duration::from_millis(100)).await;
};
// this task will compete with task1 for lock at id 1
let task2 = async {
    let _guard = Lock::fnew(1, map.clone()).await.await;
    delay_for(Duration::from_millis(100)).await;
};
// no other task compete for lock at id 2
let task3 = async {
    let _guard = Lock::fnew(2, map.clone()).await.await;
    delay_for(Duration::from_millis(100)).await;
};
rt.block_on(async { tokio::join!(task1, task2, task3) });
```

### Features
- hashbrown
    * provides `MapType` as a type alias of `hashbrown::HashMap` for KeyPool initialization
- dashmap
    * provides `DashMapType` as a type alias of `dashmap::DashMap` for KeyPool initialization
- default: hashbrown
- all: both `hashbrown` and `dashmap`

### Benchmark
to run the benchmark, execute the following command in the prompt:
```bash
cargo bench -- --nocapture
```
The `lock1000_parallel` benchmark is to run 1000 futures locked by a single lock to update the
counter.
The `lock1000_serial` benchmark is to run run similar operations in a single thread.
Currently our implementation is about 4~5 times slower than the single threaded version.

### License

Licensed under

* MIT license ([LICENSE-MIT]LICENSE-MIT or https://opensource.org/licences/MIT)

### Contribution

Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, shall be licensed as above,
without any additional terms or conditions.