aboutsummaryrefslogtreecommitdiff
path: root/examples/http-server/connection-queue.tm
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-04-01 21:15:17 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-04-01 21:15:17 -0400
commit428f035d9ea21d3e23dc9b96e72d3c7cd6a8c493 (patch)
treed5c141d52e60d8d7d88056ab1c98a27df13f23b5 /examples/http-server/connection-queue.tm
parentf32d2a25c10977f52c83ddef77008afd22e7f0ce (diff)
Add http-server example
Diffstat (limited to 'examples/http-server/connection-queue.tm')
-rw-r--r--examples/http-server/connection-queue.tm25
1 files changed, 25 insertions, 0 deletions
diff --git a/examples/http-server/connection-queue.tm b/examples/http-server/connection-queue.tm
new file mode 100644
index 00000000..a198f091
--- /dev/null
+++ b/examples/http-server/connection-queue.tm
@@ -0,0 +1,25 @@
+use pthreads
+
+func _assert_success(name:Text, val:Int32; inline):
+ fail("$name() failed!") if val < 0
+
+struct ConnectionQueue(_connections=@[:Int32], _mutex=pthread_mutex_t.new(), _cond=pthread_cond_t.new()):
+ func enqueue(queue:ConnectionQueue, connection:Int32):
+ queue._mutex:lock()
+ queue._connections:insert(connection)
+ queue._mutex:unlock()
+ queue._cond:signal()
+
+
+ func dequeue(queue:ConnectionQueue -> Int32):
+ conn := none:Int32
+
+ queue._mutex:lock()
+
+ while queue._connections.length == 0:
+ queue._cond:wait(queue._mutex)
+
+ conn = queue._connections:pop(1)
+ queue._mutex:unlock()
+ queue._cond:signal()
+ return conn!