pike.git / lib / modules / Thread.pmod

version» Context lines:

pike.git/lib/modules/Thread.pmod:13:    int size() { return num; }       mixed read()    {    mixed tmp;    object key=lock::lock();    while(!num) r_cond::wait(key);    tmp=buffer[ptr];    buffer[ptr++] = 0; // Throw away any references.    ptr%=sizeof(buffer); +  if(read_tres < sizeof(buffer)) +  {    if(num-- == read_tres) -  +  w_cond::broadcast(); +  }else{ +  num--;    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(); +  w_cond::broadcast();    return ret;    }       void write(mixed v)    {    object key=lock::lock();    while(num == sizeof(buffer)) w_cond::wait(key);    buffer[(ptr + num) % sizeof(buffer)]=v; -  +  if(write_tres) +  {    if(num++ == write_tres) -  +  r_cond::broadcast(); +  }else{ +  num++;    r_cond::signal();    } -  +  }       void create(int|void size)    {    write_tres=0;    buffer=allocate(read_tres=size || 128);    }   };      class Queue {    inherit Condition: r_cond;