From 37d0896748417133a73aaeef82263563044e9974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Wed, 27 May 1998 16:18:59 -0700 Subject: [PATCH] optimized Rev: lib/modules/Thread.pmod:1.11 --- lib/modules/Thread.pmod | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/lib/modules/Thread.pmod b/lib/modules/Thread.pmod index 01bc30f215..18462856e3 100644 --- a/lib/modules/Thread.pmod +++ b/lib/modules/Thread.pmod @@ -6,8 +6,9 @@ class Fifo { inherit Condition: w_cond; inherit Mutex: lock; - mixed *buffer; + array buffer; int ptr, num; + int read_tres, write_tres; int size() { return num; } @@ -19,22 +20,44 @@ class Fifo { tmp=buffer[ptr]; buffer[ptr++] = 0; // Throw away any references. ptr%=sizeof(buffer); - num--; - w_cond::signal(); + if(num-- == read_tres) + w_cond::signal(); return tmp; } + + array read_array() + { + array ret; + object key=lock::lock(); + while(!num) r_cond::wait(key); + if(num==1) + { + ret=buffer[ptr..ptr]; + buffer[ptr++] = 0; // Throw away any references. + ptr%=sizeof(buffer); + num--; + }else{ + ret=buffer[ptr..]+buffer[..num-sizeof(ret)-1]; + ptr=num=0; + buffer=allocate(sizeof(buffer)); // Throw away any references. + } + w_cond::signal(); + return ret; + } void write(mixed v) { object key=lock::lock(); while(num == sizeof(buffer)) w_cond::wait(key); - buffer[(ptr + num++) % sizeof(buffer)]=v; - r_cond::signal(); + buffer[(ptr + num) % sizeof(buffer)]=v; + if(num++ == write_tres) + r_cond::signal(); } - + void create(int|void size) { - buffer=allocate(size || 128); + write_tres=0; + buffer=allocate(read_tres=size || 128); } }; -- GitLab