RBuffer* makeRBufferOptions(size_t startSize, size_t objectCount) { RBuffer *object = allocator(RBuffer); if(object != nil) { // allocation of buffer master(object, RData) = makeRDataBytes(arrayAllocator(byte, startSize), startSize); if(master(object, RData) != nil) { // allocation of sizes array object->sizesArray = arrayAllocator(RRange, objectCount); if(object->sizesArray != nil) { object->classId = registerClassOnce(toString(RBuffer)); object->freePlaces = objectCount; object->count = 0; object->totalPlaced = 0; #ifdef RAY_BUFFER_THREAD_SAFE mutexWithType(&object->mutex, RMutexRecursive); #endif } else { RError("RBuffer. Allocation of sizes array failed.", object); deleter(master(object, RData), RData); } } else { RError("RBuffer. Allocation of master RData failed.", object); deallocator(object); object = nil; } } return object; }
RAutoPool* makeRAutoPool(size_t startSize, size_t multiplier) { RAutoPool* object = allocator(RAutoPool); if(object != nil) { object->pointersInWork = makeRArrayOptions(startSize, multiplier, nil); if(object->pointersInWork != nil) { object->classId = 5; // store current hierarchy lvl memory functions object->innerMalloc = getRMalloc(); object->innerRealloc = getRRealloc(); object->innerCalloc = getRCalloc(); object->innerFree = getRFree(); object->pointersInWork->destructorDelegate = innerFree; object->pointersInWork->printerDelegate = poolPrinter; #if defined(RAY_POOL_THREAD_SAFE) mutexWithType(&object->mutex, RMutexErrorCheck); #endif } elseError( RError("RAutoPool. Bad workers RArray allocation.", object) ); } return object; }