diff options
Diffstat (limited to 'examples/http-server/connection-queue.tm')
| -rw-r--r-- | examples/http-server/connection-queue.tm | 25 |
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! |
