#include "toisegment.h" /******* BufferSegment *********/ TOISegmented::BufferSegment::BufferSegment(int sz) { status = NEW; bufferSize = sz; sn0 = -1; refcount = 0; data = new double[sz]; flags = new uint_8[sz]; pthread_mutex_init(&refcount_mutex, NULL); } TOISegmented::BufferSegment::~BufferSegment() { if (refcount > 0) { throw(ForbiddenError("TOISegment : delete Buffer with refcount>0")); } delete[] data; delete[] flags; pthread_mutex_destroy(&refcount_mutex); } void TOISegmented::BufferSegment::putData(int sn, double d, uint_8 f) { if (status == NEW) { status = WRITE; sn0 = sn; } if (status == COMMITTED) { throw(ForbiddenError("TOISegment : putData in committed buffer")); } checkInRange(sn); data[sn-sn0] = d; flags[sn-sn0] = f; } void TOISegmented::BufferSegment::incRefCount() { pthread_mutex_lock(&refcount_mutex); refcount++; pthread_mutex_unlock(&refcount_mutex); } void TOISegmented::BufferSegment::decRefCount() { pthread_mutex_lock(&refcount_mutex); int nrc = --refcount; pthread_mutex_unlock(&refcount_mutex); if (nrc<0) throw(ForbiddenError("TOISegment : buffer refcount < 0")); } int TOISegmented::BufferSegment::getRefCount() { pthread_mutex_lock(&refcount_mutex); int rc = refcount; pthread_mutex_unlock(&refcount_mutex); return rc; }