UNPKG

ciorent

Version:

A lightweight, low-overhead concurrency library

1 lines 837 B
import{loadedResolve,loadResolve}from"./utils.js";export let init=(permits,capacity)=>[new Array(capacity).fill(null),capacity,0,0,permits];export let acquire=sem=>{if(--sem[4]<0){if(sem[0].length+sem[4]<0){sem[4]++;return false}let promise=new Promise(loadResolve);let tail=sem[3];sem[3]=tail+1===sem[1]?0:tail+1;sem[0][tail]=loadedResolve;return promise}return true};export let release=sem=>{if(sem[4]++<0){let head=sem[2];sem[2]=head+1===sem[1]?0:head+1;sem[0][head](true);sem[0][head]=null}};export let run=async(sem,task,...args)=>{if(--sem[4]<0){if(sem[0].length+sem[4]<0){sem[4]++;return Promise.reject(new Error(`Semaphore internal queue is full`))}let promise=new Promise(loadResolve);let tail=sem[3];sem[3]=tail+1===sem[1]?0:tail+1;sem[0][tail]=loadedResolve;await promise}try{return await task(...args)}finally{release(sem)}};