summaryrefslogtreecommitdiff
path: root/lisp/queue/fifo.lisp
diff options
context:
space:
mode:
authorBret Koppel <bret@olo.com>2025-10-07 09:00:37 -0400
committerGitHub <noreply@github.com>2025-10-07 09:00:37 -0400
commit910d7fd656b9e957181732b36761449de5a970d1 (patch)
tree0f8ee46af3e93aa489785d64d54c5e155ef0057b /lisp/queue/fifo.lisp
parent9adba239b937df2830a5110adaa1dae17b7dd7d7 (diff)
parent0ad86ba37be273ee1fe4d9bdd5f7bb15c5701abf (diff)
Merge pull request #1 from ololabs/initial-commit
initial commit
Diffstat (limited to 'lisp/queue/fifo.lisp')
-rw-r--r--lisp/queue/fifo.lisp44
1 files changed, 44 insertions, 0 deletions
diff --git a/lisp/queue/fifo.lisp b/lisp/queue/fifo.lisp
new file mode 100644
index 0000000..8bbd106
--- /dev/null
+++ b/lisp/queue/fifo.lisp
@@ -0,0 +1,44 @@
+;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
+(declaim (optimize (speed 0) (safety 3) (debug 3)))
+
+(in-package #:snow)
+
+(defclass fifo ()
+ ((buffer :initarg :buffer
+ :initform ()
+ :accessor buffer)
+ (mutex :initarg :mutex
+ :initform (sb-thread:make-mutex)
+ :accessor mutex)
+ (discard-preceding :initarg :discard-preceding
+ :initform nil
+ :accessor discard-preceding)
+ (wait-interval :initarg :wait-interval
+ :initform 0
+ :accessor wait-interval)
+ (timestamp :initarg :timestamp
+ :initform (get-universal-time)
+ :accessor timestamp))
+ (:documentation ""))
+
+(defmethod dequeue ((fifo fifo))
+ (sb-thread:with-mutex ((mutex fifo))
+ (when (or (= (wait-interval fifo) 0)
+ (> (get-universal-time) (+ (timestamp fifo) (wait-interval fifo))))
+ (setf (timestamp fifo) (get-universal-time))
+ (when (buffer fifo)
+ (pop (buffer fifo))))))
+
+(defmethod enqueue ((fifo fifo) obj)
+ (sb-thread:with-mutex ((mutex fifo))
+ (if (discard-preceding fifo)
+ (setf (buffer fifo) `(,obj))
+ (push obj (buffer fifo)))))
+
+(defmethod empty-p ((fifo fifo))
+ (sb-thread:with-mutex ((mutex fifo))
+ (endp (buffer fifo))))
+
+(defmethod len ((fifo fifo))
+ (sb-thread:with-mutex ((mutex fifo))
+ (length (buffer fifo))))