From dc2fc9f2cd69422c720daaa531d1bdb9a6bde0e5 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sun, 31 Jan 2021 19:50:38 +0100 Subject: Define a library for Go-style wait groups Define a data structure and methods to represent a Go-style wait group, similar to `sync.WaitGroup` (except single-threaded). Implements a similar interface. Calling `wait` blocks until the wait group's internal counter gets to 0. --- src/package.lisp | 9 +++++++++ src/wait-group.lisp | 27 +++++++++++++++++++++++++++ wait-group.asd | 6 ++++++ 3 files changed, 42 insertions(+) create mode 100644 src/package.lisp create mode 100644 src/wait-group.lisp create mode 100644 wait-group.asd diff --git a/src/package.lisp b/src/package.lisp new file mode 100644 index 0000000..c868d02 --- /dev/null +++ b/src/package.lisp @@ -0,0 +1,9 @@ +(defpackage :wait-group + (:nicknames :wg) + + (:use :cl) + + (:export #:make-wait-group + #:add + #:done + #:wait)) diff --git a/src/wait-group.lisp b/src/wait-group.lisp new file mode 100644 index 0000000..35bb982 --- /dev/null +++ b/src/wait-group.lisp @@ -0,0 +1,27 @@ +(in-package :wait-group) + +(defclass wait-group () + ((counter + :initform 0 + :accessor counter))) + +(defun make-wait-group () + (make-instance 'wait-group)) + +(defgeneric add (wait-group &optional amount) + (:documentation "")) + +(defmethod add ((wait-group wait-group) &optional (amount 1)) + (incf (counter wait-group) amount)) + +(defgeneric done (wait-group) + (:documentation "")) + +(defmethod done ((wait-group wait-group)) + (decf (counter wait-group))) + +(defgeneric wait (wait-group) + (:documentation "")) + +(defmethod wait ((wait-group wait-group)) + (loop until (= (counter wait-group) 0))) diff --git a/wait-group.asd b/wait-group.asd new file mode 100644 index 0000000..ac7e280 --- /dev/null +++ b/wait-group.asd @@ -0,0 +1,6 @@ +(asdf:defsystem wait-group + :version "0.0.1" + :components ((:module "src" + :serial t + :components ((:file "package") + (:file "wait-group"))))) -- cgit v1.2.3