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

Method acquire

src/jrd/trace/TraceConfigStorage.cpp:278–330  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

276
277
278void ConfigStorage::acquire()
279{
280 if (!m_sharedMemory)
281 (Arg::Gds(isc_random) << "Trace shared memory can not be accessed").raise();
282
283 fb_assert(m_recursive >= 0);
284 const ThreadId currTID = getThreadId();
285
286 if (m_mutexTID == currTID)
287 {
288 m_recursive++;
289 return;
290 }
291
292 m_sharedMemory->mutexLock();
293
294 fb_assert(m_recursive == 0);
295 m_recursive = 1;
296
297 fb_assert(m_mutexTID == 0);
298 m_mutexTID = currTID;
299
300 while (m_sharedMemory->getHeader()->isDeleted())
301 {
302 // Shared memory must be empty at this point
303 fb_assert(m_sharedMemory->getHeader()->cnt_uses == 0);
304
305 m_sharedMemory->mutexUnlock();
306 m_sharedMemory.reset();
307
308 Thread::yield();
309
310 initSharedFile();
311 m_sharedMemory->mutexLock();
312 }
313
314 TraceCSHeader* header = m_sharedMemory->getHeader();
315 if (header->mem_allocated > m_sharedMemory->sh_mem_length_mapped)
316 {
317#ifdef HAVE_OBJECT_MAP
318 FbLocalStatus status;
319 if (!m_sharedMemory->remapFile(&status, header->mem_allocated, false))
320 {
321 release();
322 status_exception::raise(&status);
323 }
324#else
325 release();
326 fb_assert(false);
327 (Arg::Gds(isc_random) << Arg::Str("Trace storage memory remapping error")).raise();
328#endif
329 }
330}
331
332void ConfigStorage::release()
333{

Callers 1

StorageGuardMethod · 0.45

Calls 13

GdsClass · 0.85
getThreadIdFunction · 0.85
raiseFunction · 0.85
StrClass · 0.85
mutexLockMethod · 0.80
isDeletedMethod · 0.80
mutexUnlockMethod · 0.80
remapFileMethod · 0.80
yieldClass · 0.50
releaseFunction · 0.50
raiseMethod · 0.45
getHeaderMethod · 0.45

Tested by

no test coverage detected