pike.git / lib / modules / Thread.pmod

version» Context lines:

pike.git/lib/modules/Thread.pmod:1:   constant Mutex=__builtin.mutex;   constant Condition=__builtin.condition;      class Fifo {    inherit Condition : r_cond;    inherit Condition: w_cond;    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;    }       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();    }       varargs void create(int size)    {    buffer=allocate(size || 128);    }   };      class Queue {