;;;; cl-scopes/util/async - utilities for asynchronous (concurrent / parallel) operations (defpackage :scopes/util/async (:use :common-lisp) (:local-nicknames (:lp :lparallel) (:lpq :lparallel.queue)) (:export #:init #:finish #:make-ch #:make-mb #:rcv #:try-rcv #:snd #:submit-task #:receive-result #:try-receive-result)) (in-package :scopes/util/async) ;;;; general definitions (lparallel wrappers) (defun init () (when (null lp:*kernel*) (format t "async:init ~a ~%" (setf lp:*kernel* (lp:make-kernel (serapeum:count-cpus)))))) (defun finish () (when lp:*kernel* (lp:end-kernel))) ;;;; higher-level mailbox / task / channel combination (defclass mailbox () ((queue :reader queue :initform (lpq:make-queue)) (channel :reader channel :initform (lp:make-channel)))) (defun make-mb () (make-instance 'mailbox)) (defun rcv (mb) (lpq:pop-queue (queue mb))) (defun try-rcv (mb) (lpq:peek-queue (queue mb))) (defun snd (mb msg) (lpq:push-queue msg (queue mb))) (defun submit-task (mb job) (lp:submit-task (channel mb) job)) (defun receive-result (mb) (lp:receive-result (channel mb))) (defun try-receive-result (mb) (lp:try-receive-result (channel mb)))