diff --git a/lib/include/fifo.h b/lib/include/fifo.h new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/lib/include/fifo.h @@ -0,0 +1 @@ + diff --git a/lib/include/fifo.pre.pike b/lib/include/fifo.pre.pike new file mode 100644 index 0000000000000000000000000000000000000000..9cb4f0a82a72e0d8d601e452473467731c307a72 --- /dev/null +++ b/lib/include/fifo.pre.pike @@ -0,0 +1,36 @@ +void create() +{ + master()->add_precompiled_program("/precompiled/fifo", class { + inherit "/precompiled/condition": r_cond; + inherit "/precompiled/condition": w_cond; + inherit "/precompiled/mutex": lock; + + mixed *buffer; + int r_ptr, w_ptr; + + int query_messages() { return w_ptr - r_ptr; } + + mixed read() + { + mixed tmp; + object key=lock::lock(); + while(!query_messages()) r_cond::wait(key); + tmp=buffer[r_ptr++ % sizeof(buffer)]; + w_cond::signal(); + return tmp; + } + + void write(mixed v) + { + object key=lock::lock(); + while(query_messages() == sizeof(buffer)) w_cond::wait(key); + buffer[w_ptr++ % sizeof(buffer)]=v; + r_cond::signal(); + } + + varargs void create(int size) + { + buffer=allocate(size || 128); + } + }); +}