From 4a5360afb70ec1f3ee076fc7f0b86196b101f92b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Wed, 9 Oct 1996 06:18:15 +0200 Subject: [PATCH] /precompiled/queue added Rev: lib/include/fifo.pre.pike:1.2 --- lib/include/fifo.pre.pike | 46 ++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/lib/include/fifo.pre.pike b/lib/include/fifo.pre.pike index 9cb4f0a82a..a9ddd6f6b9 100644 --- a/lib/include/fifo.pre.pike +++ b/lib/include/fifo.pre.pike @@ -8,14 +8,15 @@ void create() mixed *buffer; int r_ptr, w_ptr; - int query_messages() { return w_ptr - r_ptr; } + int size() { return (w_ptr+sizeof(buffer) - r_ptr) % sizeof(buffer); } mixed read() { mixed tmp; object key=lock::lock(); - while(!query_messages()) r_cond::wait(key); - tmp=buffer[r_ptr++ % sizeof(buffer)]; + while(!size()) r_cond::wait(key); + tmp=buffer[r_ptr]; + if(++r_ptr >= sizeof(buffer)) r_ptr=0; w_cond::signal(); return tmp; } @@ -23,8 +24,9 @@ void create() void write(mixed v) { object key=lock::lock(); - while(query_messages() == sizeof(buffer)) w_cond::wait(key); - buffer[w_ptr++ % sizeof(buffer)]=v; + while(size() == sizeof(buffer)) w_cond::wait(key); + buffer[w_ptr]=v; + if(++w_ptr >= sizeof(buffer)) r_ptr=0; r_cond::signal(); } @@ -33,4 +35,38 @@ void create() buffer=allocate(size || 128); } }); + + master()->add_precompiled_program("/precompiled/queue", class { + inherit "/precompiled/condition": r_cond; + inherit "/precompiled/mutex": lock; + + mixed *buffer=allocate(16); + int r_ptr, w_ptr; + + int size() { return w_ptr - r_ptr; } + + mixed read() + { + mixed tmp; + object key=lock::lock(); + while(!size()) r_cond::wait(key); + tmp=buffer[r_ptr++]; + return tmp; + } + + void write(mixed v) + { + object key=lock::lock(); + if(w_ptr >= sizeof(buffer)) + { + buffer=buffer[r_ptr..]; + buffer+=allocate(sizeof(buffer)+1); + w_ptr-=r_ptr; + r_ptr=0; + } + buffer[w_ptr]=v; + w_ptr++; + r_cond::signal(); + } + }); } -- GitLab