Skip to content

Commit 0164b8a

Browse files
committed
WIP
1 parent f0a0d07 commit 0164b8a

File tree

12 files changed

+151
-110
lines changed

12 files changed

+151
-110
lines changed

src/jrd/HazardPtr.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,9 +681,10 @@ namespace Jrd {
681681
class CacheObject : public HazardObject
682682
{
683683
public:
684-
virtual bool checkObject(thread_db* tdbb, Firebird::Arg::StatusVector&);
684+
virtual bool checkObject(thread_db* tdbb, Firebird::Arg::StatusVector&) /*const*/;
685685
virtual void afterUnlock(thread_db* tdbb);
686-
virtual void lockedExcl [[noreturn]] (thread_db* tdbb);
686+
virtual void lockedExcl [[noreturn]] (thread_db* tdbb) /*const*/;
687+
virtual const char* c_name() const = 0;
687688
};
688689

689690
} // namespace Jrd

src/jrd/Relation.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,24 @@ using namespace Firebird;
4343

4444
/// jrd_rel
4545

46+
jrd_rel::jrd_rel(MemoryPool& p)
47+
: rel_pool(&p), rel_id(0), rel_current_fmt(0),
48+
rel_flags(REL_gc_lockneed), rel_current_format(nullptr),
49+
rel_name(p), rel_owner_name(p), rel_security_name(p),
50+
rel_formats(nullptr), rel_fields(nullptr),
51+
rel_view_rse(nullptr), rel_view_contexts(p),
52+
rel_file(nullptr), rel_gc_records(p),
53+
rel_sweep_count(0), rel_scan_count(0),
54+
rel_partners_lock(nullptr), rel_rescan_lock(nullptr),
55+
rel_gc_lock(nullptr), rel_index_locks(p), rel_index_blocks(nullptr),
56+
rel_pre_erase(nullptr), rel_post_erase(nullptr),
57+
rel_pre_modify(nullptr), rel_post_modify(nullptr),
58+
rel_pre_store(nullptr), rel_post_store(nullptr),
59+
rel_ss_definer(false), rel_pages_inst(nullptr),
60+
rel_pages_base(p), rel_pages_free(nullptr)
61+
{
62+
}
63+
4664
bool jrd_rel::isReplicating(thread_db* tdbb)
4765
{
4866
Database* const dbb = tdbb->getDatabase();
@@ -669,3 +687,7 @@ IndexLock::IndexLock(MemoryPool& p, thread_db* tdbb, jrd_rel* rel, USHORT id)
669687
idl_lock(p, tdbb, LCK_idx_exist, (rel->rel_id << 16) | id, rel)
670688
{ }
671689

690+
const char* IndexLock::c_name() const
691+
{
692+
return "* unk *";
693+
}

src/jrd/Relation.h

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,12 @@ class Trigger : public HazardObject
8484
explicit Trigger(MemoryPool& p)
8585
: blr(p),
8686
debugInfo(p),
87+
statement(nullptr),
8788
releaseInProgress(false),
89+
sysTrigger(false),
90+
type(0),
91+
flags(0),
92+
relation(nullptr),
8893
name(p),
8994
engine(p),
9095
entryPoint(p),
@@ -315,6 +320,10 @@ struct prim
315320
vec<int>* prim_reference_ids;
316321
vec<int>* prim_relations;
317322
vec<int>* prim_indexes;
323+
324+
prim()
325+
: prim_reference_ids(nullptr), prim_relations(nullptr), prim_indexes(nullptr)
326+
{ }
318327
};
319328

320329

@@ -325,6 +334,10 @@ struct frgn
325334
vec<int>* frgn_reference_ids;
326335
vec<int>* frgn_relations;
327336
vec<int>* frgn_indexes;
337+
338+
frgn()
339+
: frgn_reference_ids(nullptr), frgn_relations(nullptr), frgn_indexes(nullptr)
340+
{ }
328341
};
329342

330343

@@ -347,6 +360,7 @@ class IndexLock : public CacheObject
347360
ExistenceLock idl_lock; // Lock block
348361

349362
bool hasData() { return true; }
363+
const char* c_name() const override;
350364
};
351365

352366

@@ -425,7 +439,7 @@ class jrd_rel : public CacheObject
425439
return &rel_pages_base;
426440
}
427441

428-
const char* c_name()
442+
const char* c_name() const override
429443
{
430444
return rel_name.c_str();
431445
}
@@ -561,14 +575,6 @@ const ULONG REL_gc_lockneed = 0x80000; // gc lock should be acquired
561575

562576
/// class jrd_rel
563577

564-
inline jrd_rel::jrd_rel(MemoryPool& p)
565-
: rel_pool(&p), rel_flags(REL_gc_lockneed),
566-
rel_name(p), rel_owner_name(p), rel_security_name(p),
567-
rel_view_contexts(p), rel_gc_records(p), rel_index_locks(p),
568-
rel_ss_definer(false), rel_pages_base(p)
569-
{
570-
}
571-
572578
inline bool jrd_rel::isSystem() const
573579
{
574580
return rel_flags & REL_system;

src/jrd/Routine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace Jrd
4141
class Parameter;
4242
class UserId;
4343

44-
class Routine : public Firebird::PermanentStorage, public HazardObject
44+
class Routine : public Firebird::PermanentStorage, public CacheObject
4545
{
4646
protected:
4747
explicit Routine(MemoryPool& p)
@@ -102,7 +102,7 @@ namespace Jrd
102102

103103
const QualifiedName& getName() const { return name; }
104104
void setName(const QualifiedName& value) { name = value; }
105-
const char* c_name() const { return name.c_str(); }
105+
const char* c_name() const override { return name.c_str(); }
106106

107107
const MetaName& getSecurityName() const { return securityName; }
108108
void setSecurityName(const MetaName& value) { securityName = value; }

src/jrd/cmp.cpp

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -317,45 +317,6 @@ void CMP_post_access(thread_db* tdbb,
317317
}
318318

319319

320-
/*void CMP_post_resource( ResourceList* rsc_ptr, void* obj, Resource::rsc_s type, USHORT id)
321-
{
322-
/**************************************
323-
*
324-
* C M P _ p o s t _ r e s o u r c e
325-
*
326-
**************************************
327-
*
328-
* Functional description
329-
* Post a resource usage to the compiler scratch block.
330-
*
331-
**************************************
332-
// Initialize resource block
333-
Resource resource(type, id, NULL, NULL, NULL);
334-
switch (type)
335-
{
336-
case Resource::rsc_relation:
337-
case Resource::rsc_index:
338-
resource.rsc_rel = (jrd_rel*) obj;
339-
break;
340-
case Resource::rsc_procedure:
341-
case Resource::rsc_function:
342-
resource.rsc_routine = (Routine*) obj;
343-
break;
344-
case Resource::rsc_collation:
345-
resource.rsc_coll = (Collation*) obj;
346-
break;
347-
default:
348-
BUGCHECK(220); // msg 220 unknown resource
349-
break;
350-
}
351-
352-
// Add it into list if not present already
353-
FB_SIZE_T pos;
354-
if (!rsc_ptr->find(resource, pos))
355-
rsc_ptr->insert(pos, resource);
356-
}
357-
*/
358-
359320
void CMP_release(thread_db* tdbb, Request* request)
360321
{
361322
/**************************************

src/jrd/dfw.epp

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4562,7 +4562,7 @@ static bool delete_index(thread_db* tdbb, SSHORT phase, DeferredWork* work, jrd_
45624562
case 0:
45634563
index = relation->getIndexLock(tdbb, id);
45644564
if (index)
4565-
index->idl_lock.releaseLock(tdbb);
4565+
index->idl_lock.unlock(tdbb);
45664566
return false;
45674567

45684568
case 1:
@@ -4647,33 +4647,30 @@ static bool delete_index(thread_db* tdbb, SSHORT phase, DeferredWork* work, jrd_
46474647
{
46484648
// if we are here that means we got exclLock() on step 3
46494649
fb_assert(index->idl_lock.hasExclLock(tdbb));
4650-
//if (index->idl_lock.hasExLock(tdbb))
4651-
{
4652-
// Release index existence lock and memory.
4653-
fb_assert(relation->rel_index_locks.load(tdbb, index->idl_id) == index);
46544650

4655-
HazardPtr<IndexLock> arrVal = index;
4656-
if (!relation->rel_index_locks.replace(tdbb, index->idl_id, arrVal, nullptr))
4657-
ERR_post(Arg::Gds(isc_random) << "Index block gone unexpestedly");
4658-
fb_assert(!arrVal);
4659-
index->idl_lock.releaseLock(tdbb);
4660-
index->delayedDelete(tdbb);
4651+
// Release index existence lock and memory.
4652+
fb_assert(relation->rel_index_locks.load(tdbb, index->idl_id) == index);
46614653

4662-
// Release index refresh lock and memory.
4654+
HazardPtr<IndexLock> arrVal = index;
4655+
if (!relation->rel_index_locks.replace(tdbb, index->idl_id, arrVal, nullptr))
4656+
ERR_post(Arg::Gds(isc_random) << "Index block gone unexpestedly");
4657+
fb_assert(!arrVal);
4658+
index->idl_lock.releaseLock(tdbb, ExistenceLock::ReleaseMethod::DropObject);
4659+
index->delayedDelete(tdbb);
46634660

4664-
for (IndexBlock** iptr = &relation->rel_index_blocks; *iptr; iptr = &(*iptr)->idb_next)
4661+
// Release index refresh lock and memory.
4662+
for (IndexBlock** iptr = &relation->rel_index_blocks; *iptr; iptr = &(*iptr)->idb_next)
4663+
{
4664+
if ((*iptr)->idb_id == id)
46654665
{
4666-
if ((*iptr)->idb_id == id)
4667-
{
4668-
IndexBlock* index_block = *iptr;
4669-
*iptr = index_block->idb_next;
4666+
IndexBlock* index_block = *iptr;
4667+
*iptr = index_block->idb_next;
46704668

4671-
// Lock was released in IDX_delete_index().
4669+
// Lock was released in IDX_delete_index().
46724670

4673-
delete index_block->idb_lock;
4674-
delete index_block;
4675-
break;
4676-
}
4671+
delete index_block->idb_lock;
4672+
delete index_block;
4673+
break;
46774674
}
46784675
}
46794676
}
@@ -4932,7 +4929,9 @@ static bool delete_relation(thread_db* tdbb, SSHORT phase, DeferredWork* work, j
49324929
END_FOR
49334930

49344931
// Release relation locks
4935-
relation->rel_existence_lock->releaseLock(tdbb);
4932+
if (relation->rel_existence_lock) {
4933+
relation->rel_existence_lock->releaseLock(tdbb, ExistenceLock::ReleaseMethod::DropObject);
4934+
}
49364935
if (relation->rel_partners_lock) {
49374936
LCK_release(tdbb, relation->rel_partners_lock);
49384937
}

src/jrd/exe.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,9 @@ class ResourceList
219219

220220
void releaseResources(thread_db* tdbb);
221221

222-
void inc_int_use_count();
223-
void zero_int_use_count();
224-
void markUndeletable();
222+
// void inc_int_use_count();
223+
// void zero_int_use_count();
224+
// void markUndeletable();
225225

226226
Resource* get(FB_SIZE_T n)
227227
{
@@ -233,6 +233,9 @@ class ResourceList
233233
FB_SIZE_T pos;
234234
Resource temp(type);
235235
list.find(temp, pos);
236+
237+
if (pos == list.getCount())
238+
return list.end();
236239
return &list[pos];
237240
}
238241

src/jrd/idx.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,7 @@ void IDX_delete_indices(thread_db* tdbb, jrd_rel* relation, RelationPages* relPa
651651
{
652652
HazardPtr<IndexLock> idx_lock = relation->getIndexLock(tdbb, i);
653653
if (idx_lock)
654-
idx_lock->idl_lock.releaseLock(tdbb);
654+
idx_lock->idl_lock.releaseLock(tdbb, ExistenceLock::ReleaseMethod::Normal);
655655
}
656656
}
657657

src/jrd/lck.cpp

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1678,7 +1678,7 @@ bool ExistenceLock::exclLock(thread_db* tdbb)
16781678
return true;
16791679
}
16801680

1681-
SSHORT getLockWait(thread_db* tdbb)
1681+
SSHORT ExistenceLock::getLockWait(thread_db* tdbb)
16821682
{
16831683
jrd_tra* transaction = tdbb->getTransaction();
16841684
return transaction ? transaction->getLockWait() : 0;
@@ -1718,3 +1718,56 @@ void ExistenceLock::unlock(thread_db* tdbb)
17181718
flags &= ~(blocking | unlocking | locked);
17191719
}
17201720
}
1721+
1722+
void ExistenceLock::incrementError [[noreturn]] ()
1723+
{
1724+
const char* objTypeName = "unknown object";
1725+
switch(lck->lck_type)
1726+
{
1727+
case LCK_rel_exist:
1728+
objTypeName = "relation";
1729+
break;
1730+
case LCK_idx_exist:
1731+
objTypeName = "index";
1732+
break;
1733+
case LCK_prc_exist:
1734+
objTypeName = "procedure";
1735+
break;
1736+
case LCK_tt_exist:
1737+
objTypeName = "collation";
1738+
break;
1739+
case LCK_fun_exist:
1740+
objTypeName = "function";
1741+
break;
1742+
default:
1743+
fb_assert(false);
1744+
break;
1745+
}
1746+
1747+
fatal_exception::raiseFmt("Can not use %s %s which is going to be dropped in regular request",
1748+
objTypeName, object->c_name());
1749+
}
1750+
1751+
void ExistenceLock::releaseLock(thread_db* tdbb, ReleaseMethod rm)
1752+
{
1753+
Firebird::MutexLockGuard g(mutex, FB_FUNCTION);
1754+
switch (rm)
1755+
{
1756+
case ReleaseMethod::Normal:
1757+
if ((flags |= blocking) & locked)
1758+
leave245(tdbb);
1759+
else if (hasExclLock(tdbb))
1760+
unlock(tdbb);
1761+
else
1762+
fb_assert(false);
1763+
break;
1764+
1765+
case ReleaseMethod::DropObject:
1766+
fb_assert(hasExclLock(tdbb));
1767+
// fall through
1768+
1769+
case ReleaseMethod::CloseCache:
1770+
LCK_release(tdbb, lck);
1771+
break;
1772+
}
1773+
}

src/jrd/lck.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ class ExistenceLock
207207
lck->setKey(key);
208208
}
209209

210+
enum class ReleaseMethod {Normal, DropObject, CloseCache};
211+
210212
Resource::State inc(thread_db* tdbb)
211213
{
212214
unsigned fl = ++flags;
@@ -247,7 +249,7 @@ class ExistenceLock
247249
#endif
248250
void unlock(thread_db* tdbb); // Release exclusive lock
249251

250-
void releaseLock(thread_db* tdbb); // Release all locks
252+
void releaseLock(thread_db* tdbb, ReleaseMethod rm); // Release any lock
251253

252254
private:
253255
static int ast(void* self)

0 commit comments

Comments
 (0)