diff --git a/lib/include/fifo.pre.pike b/lib/include/fifo.pre.pike index 9cb4f0a82a72e0d8d601e452473467731c307a72..a9ddd6f6b968ae14505f9b2f7582994d61cda237 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(); + } + }); }