MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / extend

Method extend

src/jrd/trace/TraceLog.cpp:217–267  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

215}
216
217void TraceLog::extend(FB_SIZE_T size)
218{
219 TraceLogHeader* header = m_sharedMemory->getHeader();
220 const ULONG oldSize = header->allocated;
221 const FB_SIZE_T oldUsed = getUsed();
222
223 ULONG newSize = header->allocated * ((header->allocated + size) / header->allocated + 1);
224 newSize = MIN(newSize, header->maxSize);
225
226 LocalStatus ls;
227 CheckStatusWrapper s(&ls);
228
229 if (!m_sharedMemory->remapFile(&s, newSize, true))
230 status_exception::raise(&s);
231
232 header = m_sharedMemory->getHeader();
233 header->allocated = newSize;
234
235 if (header->writePos < header->readPos)
236 {
237 const FB_SIZE_T toMoveW = header->writePos - sizeof(TraceLogHeader);
238 const FB_SIZE_T toMoveR = oldSize - header->readPos;
239
240 char* data = reinterpret_cast<char*> (header);
241 const FB_SIZE_T deltaSize = newSize - oldSize;
242
243 if (toMoveW < toMoveR)
244 {
245 if (toMoveW <= deltaSize)
246 {
247 memcpy(data + oldSize, data + sizeof(TraceLogHeader), toMoveW);
248 header->writePos = oldSize + toMoveW;
249
250 if (header->writePos == header->allocated)
251 header->writePos = sizeof(TraceLogHeader);
252 }
253 else
254 {
255 memcpy(data + oldSize, data + sizeof(TraceLogHeader), deltaSize);
256 memcpy(data + sizeof(TraceLogHeader), data + sizeof(TraceLogHeader) + deltaSize, toMoveW - deltaSize);
257 header->writePos -= deltaSize;
258 }
259 }
260 else
261 {
262 memcpy(data + newSize - toMoveR, data + header->readPos, toMoveR);
263 header->readPos = newSize - toMoveR;
264 }
265 }
266 fb_assert(oldUsed == getUsed());
267}
268
269FB_SIZE_T TraceLog::getUsed()
270{

Callers

nothing calls this directly

Calls 3

raiseFunction · 0.85
remapFileMethod · 0.80
getHeaderMethod · 0.45

Tested by

no test coverage detected