@@ -293,7 +293,7 @@ RelationPages* RelationPermanent::getPagesInternal(thread_db* tdbb, TraNumber tr
293293 else
294294 inst_id = PAG_attachment_id (tdbb);
295295
296- MutexLockGuard relPerm (rel_pages_mutex, FB_FUNCTION);
296+ MutexLockGuard g (rel_pages_mutex, FB_FUNCTION);
297297
298298 if (!rel_pages_inst)
299299 rel_pages_inst = FB_NEW_POOL (getPool ()) RelationPagesInstances (getPool ());
@@ -409,31 +409,59 @@ bool RelationPermanent::delPages(thread_db* tdbb, TraNumber tran, RelationPages*
409409 pages);
410410#endif
411411
412- FB_SIZE_T pos;
412+ { // mutex scope
413+ MutexLockGuard g (rel_pages_mutex, FB_FUNCTION);
414+
415+ FB_SIZE_T pos;
413416#ifdef DEV_BUILD
414- const bool found =
417+ const bool found =
415418#endif
416- rel_pages_inst->find (pages->rel_instance_id , pos);
417- fb_assert (found && ((*rel_pages_inst)[pos] == pages) );
419+ rel_pages_inst->find (pages->rel_instance_id , pos);
420+ fb_assert (found && ((*rel_pages_inst)[pos] == pages) );
418421
419- rel_pages_inst->remove (pos);
422+ rel_pages_inst->remove (pos);
423+ }
420424
421425 if (pages->rel_index_root )
422426 IDX_delete_indices (tdbb, this , pages, false );
423427
424428 if (pages->rel_pages )
425429 DPM_delete_relation_pages (tdbb, this , pages);
426430
431+ MutexLockGuard g (rel_pages_mutex, FB_FUNCTION);
432+
427433 pages->free (rel_pages_free);
428434 return true ;
429435}
430436
437+ void RelationPermanent::freePages (thread_db* tdbb)
438+ {
439+ if (!rel_pages_inst)
440+ return ;
441+
442+ // no need in rel_pages_mutex - it's cleanup after DROP TABLE
443+ while (rel_pages_inst->hasData ())
444+ {
445+ auto * pages = rel_pages_inst->pop ();
446+
447+ if (pages->rel_index_root )
448+ IDX_delete_indices (tdbb, this , pages, false );
449+
450+ if (pages->rel_pages )
451+ DPM_delete_relation_pages (tdbb, this , pages);
452+
453+ pages->free (rel_pages_free);
454+ }
455+ }
456+
431457void RelationPermanent::retainPages (thread_db* tdbb, TraNumber oldNumber, TraNumber newNumber)
432458{
433459 fb_assert (rel_flags & REL_temp_tran);
434460 fb_assert (oldNumber != 0 );
435461 fb_assert (newNumber != 0 );
436462
463+ MutexLockGuard g (rel_pages_mutex, FB_FUNCTION);
464+
437465 if (!rel_pages_inst)
438466 return ;
439467
@@ -450,6 +478,24 @@ void RelationPermanent::retainPages(thread_db* tdbb, TraNumber oldNumber, TraNum
450478 rel_pages_inst->add (pages);
451479}
452480
481+ void RelationPermanent::dropTempPages (thread_db* tdbb)
482+ {
483+ if (rel_flags & REL_temp_gtt)
484+ {
485+ Database* dbb = tdbb->getDatabase ();
486+ dbb->markForDelete (this );
487+ }
488+ }
489+
490+ void RelationPermanent::clearDropMarker (thread_db* tdbb)
491+ {
492+ if (rel_flags & REL_temp_gtt)
493+ {
494+ Database* dbb = tdbb->getDatabase ();
495+ dbb->clearDeleteMark (this );
496+ }
497+ }
498+
453499void RelationPermanent::getRelLockKey (thread_db* tdbb, UCHAR* key)
454500{
455501 const ULONG val = getId ();
@@ -474,6 +520,8 @@ void RelationPermanent::cleanUp() noexcept
474520
475521void RelationPermanent::fillPagesSnapshot (RelPagesSnapshot& snapshot, const bool attachmentOnly)
476522{
523+ MutexLockGuard g (rel_pages_mutex, FB_FUNCTION);
524+
477525 if (rel_pages_inst)
478526 {
479527 for (FB_SIZE_T i = 0 ; i < rel_pages_inst->getCount (); i++)
0 commit comments