Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/divine-software/divine-synchronization
The Divine Synchronization Library
https://github.com/divine-software/divine-synchronization
barrier blocking-queue condition condition-variable cyclic-barrier ddr-queue deficit-round-robin fair-mutex fair-queue fair-semaphore lightswitch lock mutex queue read-write-lock semaphore signal synchronization
Last synced: 24 days ago
JSON representation
The Divine Synchronization Library
- Host: GitHub
- URL: https://github.com/divine-software/divine-synchronization
- Owner: Divine-Software
- Created: 2018-11-25T16:19:15.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2024-09-27T12:16:29.000Z (3 months ago)
- Last Synced: 2024-11-14T10:43:40.067Z (about 1 month ago)
- Topics: barrier, blocking-queue, condition, condition-variable, cyclic-barrier, ddr-queue, deficit-round-robin, fair-mutex, fair-queue, fair-semaphore, lightswitch, lock, mutex, queue, read-write-lock, semaphore, signal, synchronization
- Language: TypeScript
- Size: 110 KB
- Stars: 5
- Watchers: 3
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# The Divine Synchronization Library
[![npm version](https://badge.fury.io/js/%40divine%2Fsynchronization.svg)](https://badge.fury.io/js/%40divine%2Fsynchronization)
[![Build Status](https://travis-ci.org/LeviticusMB/divine-synchronization.svg?branch=master)](https://travis-ci.org/LeviticusMB/divine-synchronization)
[![Coverage Status](https://coveralls.io/repos/github/LeviticusMB/divine-synchronization/badge.svg?branch=master)](https://coveralls.io/github/LeviticusMB/divine-synchronization?branch=master)## Introduction
Many *JavaScript* or *TypeScript* developers don't think much about synchronization, even if they should. While it's true
that JavaScript in *Node.js* or on the web is single-threaded, anytime an asynchronous function call is invoked,
something else might be executed before control is handed back to your callback.This library contains a classical set of high-quality synchronization primitives that can be used to protect critical
sections in such code.It's written in *TypeScript* (which means it provides excellent IDE/editor support out of the box) and down-compiled to
ES5, so it works equally well in *Node.js* or in any web browser (a `Promise` polyfill might be required, though).## About fairness
Most synchronization primitives in this library has a "fair" counterpart, that requires the waiter to provide an ID
token. The waiters are then woken up not in FIFO order but in such a way that each ID is processed before a waiter with
a duplicate ID.## Provided primitives
This section lists the synchronization primitives provided by this library.
### `DDRQueue`
Although not really a classical primitive, it's a fair queue based on the paper [Efficient Fair Queuing Using Deficit
Round-Robin](http://www.ecs.umass.edu/ece/wolf/courses/ECE697J/papers/DRR.pdf). It's more or less just a *TypeScript*
rewrite of Matt Lavin's [drr-fair-queue](https://github.com/mdlavin/drr-fair-queue).This queue is the foundation of all the "fair" variants of the synchronization primitives.
### `Queue` and `FairQueue`
A blocking queue (strict FIFO, or fair).
### `Condition` and `FairCondition`
A condition variable implementation with `notify()`, `notifyAll` and `wait()` methods.
### `Signal` and `FairSignal`
A trivial extension to the condition variable that allows a value to be passed to the waiter.
***NOTE***: *Don't mistake this for a* Pub/Sub *primitive!* While possible, it's very difficult to use these two
primitives as event emitters without losing messages. See below instead.### `PubSub` and `FairPubSub`
A *Pub/Sub* primitive, with configurable capacity, blocking publishing and generator-based subscription, suitable to be
used in a `for await`-loop.### `Semaphore` and `FairSemaphore`
A classical semaphore that can be signaled and waited for. There is also a non-blocking `take()` method available.
### `Mutex` and `FairMutex`
Just a semaphore initialized to 1 and with more appropriate method names.
### `Barrier`, `Lightswitch` and `ReadWriteLock`
A few extra primitives taken more or less verbatim from the [The Little Book of
Semaphores](http://greenteapress.com/wp/semaphores/) by Allen B. Downey. There are no fair variants of these.