summaryrefslogtreecommitdiff
path: root/lisp/queue/fifo.lisp
diff options
context:
space:
mode:
authorckonstanski <carlos.konstanski@olo.com>2025-10-07 06:53:09 -0600
committerckonstanski <carlos.konstanski@olo.com>2025-10-07 06:53:09 -0600
commit50273c110856e18e3ba563b0f62b7273a4dc022b (patch)
treecc58541bb299c659c5fd98774d3693aa99ff092a /lisp/queue/fifo.lisp
parent9adba239b937df2830a5110adaa1dae17b7dd7d7 (diff)
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))))