diff --git a/lib/modules/Thread.pmod b/lib/modules/Thread.pmod index 255fe6f0c29a4f871ef3b7b520b866b2bf11ac7f..faf0d5999a22383a0879137d2514cf7df9d8e594 100644 --- a/lib/modules/Thread.pmod +++ b/lib/modules/Thread.pmod @@ -7,17 +7,18 @@ class Fifo { inherit Mutex: lock; mixed *buffer; - int r_ptr, w_ptr; + int ptr, num; - int size() { return (w_ptr+sizeof(buffer) - r_ptr) % sizeof(buffer); } + int size() { return num; } mixed read() { mixed tmp; object key=lock::lock(); - while(!size()) r_cond::wait(key); - tmp=buffer[r_ptr]; - if(++r_ptr >= sizeof(buffer)) r_ptr=0; + while(!num) r_cond::wait(key); + tmp=buffer[ptr++]; + r_ptr%=sizeof(buffer); + num--; w_cond::signal(); return tmp; } @@ -25,9 +26,8 @@ class Fifo { void write(mixed v) { object key=lock::lock(); - while(size() == sizeof(buffer)) w_cond::wait(key); - buffer[w_ptr]=v; - if(++w_ptr >= sizeof(buffer)) w_ptr=0; + while(num == sizeof(buffer)) w_cond::wait(key); + buffer[(ptr + num++) % sizeof(buffer)]=v; r_cond::signal(); }