Skip to content
Snippets Groups Projects
Commit 4a5360af authored by Fredrik Hübinette (Hubbe)'s avatar Fredrik Hübinette (Hubbe)
Browse files

/precompiled/queue added

Rev: lib/include/fifo.pre.pike:1.2
parent eb3c130e
No related branches found
No related tags found
No related merge requests found
...@@ -8,14 +8,15 @@ void create() ...@@ -8,14 +8,15 @@ void create()
mixed *buffer; mixed *buffer;
int r_ptr, w_ptr; 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 read()
{ {
mixed tmp; mixed tmp;
object key=lock::lock(); object key=lock::lock();
while(!query_messages()) r_cond::wait(key); while(!size()) r_cond::wait(key);
tmp=buffer[r_ptr++ % sizeof(buffer)]; tmp=buffer[r_ptr];
if(++r_ptr >= sizeof(buffer)) r_ptr=0;
w_cond::signal(); w_cond::signal();
return tmp; return tmp;
} }
...@@ -23,8 +24,9 @@ void create() ...@@ -23,8 +24,9 @@ void create()
void write(mixed v) void write(mixed v)
{ {
object key=lock::lock(); object key=lock::lock();
while(query_messages() == sizeof(buffer)) w_cond::wait(key); while(size() == sizeof(buffer)) w_cond::wait(key);
buffer[w_ptr++ % sizeof(buffer)]=v; buffer[w_ptr]=v;
if(++w_ptr >= sizeof(buffer)) r_ptr=0;
r_cond::signal(); r_cond::signal();
} }
...@@ -33,4 +35,38 @@ void create() ...@@ -33,4 +35,38 @@ void create()
buffer=allocate(size || 128); 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();
}
});
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment