OILS / stdlib / draft-synch.ysh View on Github | oilshell.org

51 lines, 31 significant
1#!/usr/bin/env ysh
2
3module stdlib/synch || return 0
4
5############################
6### FIFO File Desriptors ###
7############################
8
9proc fifo-fd-new(; out_fd) {
10 # WARN: this section should be critical but for now it's not
11 # A solution may be retry on fail.
12 #====================
13 var fifo = $(mktemp -u)
14 mkfifo $fifo
15 #====================
16 exec {fd}<>$fifo
17 call out_fd->setValue(fd)
18}
19
20proc fifo-fd-destroy(; fd) {
21 var fifoFile = $(readlink /proc/$$/fd/$fd)
22 exec {fd}>&-
23 exec {fd}<&-
24 rm $fifoFile
25}
26
27#################
28### Semaphore ###
29#################
30
31proc sema-new(; value, out_sema) {
32 fifo-fd-new (&sema)
33 sema-up (sema, value)
34 call out_sema->setValue(sema)
35}
36
37proc sema-down(; sema) {
38 read <&$sema
39}
40
41proc sema-up(; sema, delta = 1) {
42 fork {
43 for _ in (0 .. delta) {
44 echo >&$sema
45 }
46 }
47}
48
49proc sema-destroy(; sema) {
50 fifo-fd-destroy (sema)
51}