📄 boundedbuffer.cc
字号:
#include "BoundedBuffer.h"
// create a bounded buffer with a limit of 'maxsize' bytes
//-------------------------------------------------------------------------------------------BoundedBuffer::BoundedBuffer(int maxsize){ buffersize=maxsize; readyRead=0; readyWrite=buffersize; buffer=(void *)malloc(buffersize); bufferend=(char *)buffer+buffersize; nextin=(char *)buffer; nextout=(char *)buffer; lock=new Lock("buffer lock"); notreadyRead=new Condition("buffer not ready read cond"); // enforce mutual exclusive access to the table notreadyWrite=new Condition("buffer not ready write cond");}
//-----------------------------------------------------------------------------------------------BoundedBuffer::~BoundedBuffer(){ delete buffer; delete lock; delete notreadyRead; delete notreadyWrite; }//---------------------------------------------------------------------------------------------
// read 'size' bytes from the bounded buffer, storing into 'data'.
// ('size' may be greater than 'maxsize')
//----------------------------------------------------------------------------------------------voidBoundedBuffer::Read(void *data, int size)
{ char *p=(char *)data; lock->Acquire(); while(readyRead<size) notreadyRead->Wait(lock); DEBUG('t',"enter Read() size is %d \n",size); for(int i=0;i<size;i++) {*p++=*nextout++; if(nextout==bufferend)nextout=(char *)buffer; readyRead--;readyWrite++;} notreadyWrite->Signal(lock); lock->Release();}//--------------------------------------------------------------------------------------------------
// write 'size' bytes from 'data' into the bounded buffer.
// ('size' may be greater than 'maxsize')//--------------------------------------------------------------------------------------------------
void BoundedBuffer::Write(void *data, int size)
{ char *p=(char *)data; lock->Acquire(); while(readyWrite<size) notreadyWrite->Wait(lock); DEBUG('t',"enter Write() size is %d \n",size); for(int i=0;i<size;i++) {*nextin++=*p++; if(nextin==bufferend)nextin=(char *)buffer; readyWrite--;readyRead++;} notreadyRead->Signal(lock); lock->Release();
}
//--------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -