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