Skip to content

Commit 76ddfee

Browse files
committed
Compiled shared metacache
1 parent 3420540 commit 76ddfee

29 files changed

+173
-156
lines changed

src/dsql/DdlNodes.epp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "../jrd/obj.h"
3535
#include "../jrd/ods.h"
3636
#include "../jrd/tra.h"
37+
#include "../jrd/met.h"
3738
#include "../common/os/path_utils.h"
3839
#include "../jrd/CryptoManager.h"
3940
#include "../jrd/IntlManager.h"
@@ -8417,7 +8418,7 @@ void DropRelationNode::checkPermission(thread_db* tdbb, jrd_tra* transaction)
84178418
void DropRelationNode::execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch,
84188419
jrd_tra* transaction)
84198420
{
8420-
jrd_rel* rel_drop = MetadataCache::lookup_relation(tdbb, name);
8421+
HazardPtr<jrd_rel> rel_drop = MetadataCache::lookup_relation(tdbb, name);
84218422
if (rel_drop)
84228423
MET_scan_relation(tdbb, rel_drop);
84238424

src/dsql/ExprNodes.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "../jrd/align.h"
3232
#include "firebird/impl/blr.h"
3333
#include "../jrd/tra.h"
34+
#include "../jrd/met.h"
3435
#include "../jrd/Function.h"
3536
#include "../jrd/SysFunction.h"
3637
#include "../jrd/recsrc/RecordSource.h"
@@ -4864,7 +4865,7 @@ DmlNode* DefaultNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch*
48644865
if (csb->csb_g_flags & csb_get_dependencies)
48654866
{
48664867
CompilerScratch::Dependency dependency(obj_relation);
4867-
dependency.relation = MetadataCache::lookup_relation(tdbb, relationName);
4868+
dependency.relation = MetadataCache::lookup_relation(tdbb, relationName).unsafePointer();
48684869
dependency.subName = FB_NEW_POOL(pool) MetaName(fieldName);
48694870
csb->csb_dependencies.push(dependency);
48704871
}
@@ -4873,11 +4874,11 @@ DmlNode* DefaultNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch*
48734874

48744875
while (true)
48754876
{
4876-
jrd_rel* relation = MetadataCache::lookup_relation(tdbb, relationName);
4877+
HazardPtr<jrd_rel> relation = MetadataCache::lookup_relation(tdbb, relationName);
48774878

48784879
if (relation && relation->rel_fields)
48794880
{
4880-
int fieldId = MET_lookup_field(tdbb, relation, fieldName);
4881+
int fieldId = MET_lookup_field(tdbb, relation.unsafePointer(), fieldName);
48814882

48824883
if (fieldId >= 0)
48834884
{
@@ -5826,7 +5827,7 @@ DmlNode* FieldNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* cs
58265827
(procedure->flags & Routine::FLAG_BEING_SCANNED) ||
58275828
(procedure->flags & Routine::FLAG_BEING_ALTERED)))
58285829
{
5829-
const jrd_prc* scan_proc = MetadataCache::findProcedure(tdbb, procedure->getId(), false, 0);
5830+
HazardPtr<jrd_prc> scan_proc = MetadataCache::findProcedure(tdbb, procedure->getId(), false, 0);
58305831

58315832
if (scan_proc != procedure)
58325833
procedure = NULL;
@@ -12759,11 +12760,14 @@ DmlNode* UdfCallNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch*
1275912760
}
1276012761
}
1276112762

12762-
Function* function = node->function;
12763-
12764-
if (!function)
12765-
function = node->function = Function::lookup(tdbb, name, false);
12763+
HazardPtr<Function> func;
12764+
if (!node->function)
12765+
{
12766+
func = Function::lookup(tdbb, name, false); // !!!!!!!!!!!!!!!!!!! resource
12767+
node->function = func.unsafePointer();
12768+
}
1276612769

12770+
Function* function = node->function;
1276712771
if (function)
1276812772
{
1276912773
if (function->isImplemented() && !function->isDefined())
@@ -12881,7 +12885,13 @@ ValueExprNode* UdfCallNode::copy(thread_db* tdbb, NodeCopier& copier) const
1288112885
{
1288212886
UdfCallNode* node = FB_NEW_POOL(*tdbb->getDefaultPool()) UdfCallNode(*tdbb->getDefaultPool(), name);
1288312887
node->args = copier.copy(tdbb, args);
12884-
node->function = isSubRoutine ? function : Function::lookup(tdbb, name, false);
12888+
if (isSubRoutine)
12889+
node->function = function;
12890+
else
12891+
{
12892+
HazardPtr<Function> func = Function::lookup(tdbb, name, false); // !!!!!!!!!!!!!!!!!!! resource
12893+
node->function = func.unsafePointer();
12894+
}
1288512895
return node;
1288612896
}
1288712897

src/dsql/StmtNodes.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "../jrd/ids.h"
3333
#include "../jrd/ini.h"
3434
#include "../jrd/tra.h"
35+
#include "../jrd/met.h"
3536
#include "../jrd/Coercion.h"
3637
#include "../jrd/Function.h"
3738
#include "../jrd/Optimizer.h"
@@ -107,7 +108,7 @@ static void pass1Validations(thread_db* tdbb, CompilerScratch* csb, Array<Valida
107108
static ForNode* pass2FindForNode(StmtNode* node, StreamType stream);
108109
static void postTriggerAccess(CompilerScratch* csb, jrd_rel* ownerRelation,
109110
ExternalAccess::exa_act operation, jrd_rel* view);
110-
static void preModifyEraseTriggers(thread_db* tdbb, TrigVector** trigs,
111+
static void preModifyEraseTriggers(thread_db* tdbb, TrigVectorPtr* trigs,
111112
StmtNode::WhichTrigger whichTrig, record_param* rpb, record_param* rec, TriggerAction op);
112113
static void preprocessAssignments(thread_db* tdbb, CompilerScratch* csb,
113114
StreamType stream, CompoundStmtNode* compoundNode, const Nullable<OverrideClause>* insertOverride);
@@ -2917,13 +2918,14 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr
29172918
{
29182919
SET_TDBB(tdbb);
29192920

2921+
HazardPtr<jrd_prc> proc;
29202922
jrd_prc* procedure = NULL;
29212923
QualifiedName name;
29222924

29232925
if (blrOp == blr_exec_pid)
29242926
{
29252927
const USHORT pid = csb->csb_blr_reader.getWord();
2926-
if (!(procedure = MetadataCache::lookup_procedure_id(tdbb, pid, false, false, 0)))
2928+
if (!(proc = MetadataCache::lookup_procedure_id(tdbb, pid, false, false, 0)))
29272929
name.identifier.printf("id %d", pid);
29282930
}
29292931
else
@@ -2944,9 +2946,12 @@ DmlNode* ExecProcedureNode::parse(thread_db* tdbb, MemoryPool& pool, CompilerScr
29442946
}
29452947
}
29462948
else
2947-
procedure = MetadataCache::lookup_procedure(tdbb, name, false);
2949+
proc = MetadataCache::lookup_procedure(tdbb, name, false);
29482950
}
29492951

2952+
if (proc && !procedure)
2953+
procedure = proc.unsafePointer();
2954+
29502955
if (!procedure)
29512956
PAR_error(csb, Arg::Gds(isc_prcnotdef) << Arg::Str(name.toString()));
29522957

@@ -10531,7 +10536,9 @@ static RelationSourceNode* pass1Update(thread_db* tdbb, CompilerScratch* csb, jr
1053110536

1053210537
for (FB_SIZE_T i = 0; i < trigger->getCount(); i++)
1053310538
{
10534-
if (!(*trigger)[i].sysTrigger)
10539+
HazardPtr<Trigger> tr;
10540+
trigger->load(i, tr);
10541+
if (!tr->sysTrigger)
1053510542
{
1053610543
userTriggers = true;
1053710544
break;
@@ -10633,7 +10640,7 @@ static void postTriggerAccess(CompilerScratch* csb, jrd_rel* ownerRelation,
1063310640
}
1063410641

1063510642
// Perform operation's pre-triggers, storing active rpb in chain.
10636-
static void preModifyEraseTriggers(thread_db* tdbb, TrigVector** trigs,
10643+
static void preModifyEraseTriggers(thread_db* tdbb, TrigVectorPtr* trigs,
1063710644
StmtNode::WhichTrigger whichTrig, record_param* rpb, record_param* rec, TriggerAction op)
1063810645
{
1063910646
if (!tdbb->getTransaction()->tra_rpblist)
@@ -10715,7 +10722,7 @@ static void preprocessAssignments(thread_db* tdbb, CompilerScratch* csb,
1071510722
}
1071610723
else if (relation->rel_view_rse && fld->fld_source_rel_field.first.hasData())
1071710724
{
10718-
relation = MetadataCache::lookup_relation(tdbb, fld->fld_source_rel_field.first);
10725+
relation = MetadataCache::lookup_relation(tdbb, fld->fld_source_rel_field.first).unsafePointer();
1071910726

1072010727
fb_assert(relation);
1072110728
if (!relation)

src/dsql/metd.epp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "../jrd/intl.h"
4141
#include "../jrd/irq.h"
4242
#include "../jrd/tra.h"
43+
#include "../jrd/met.h"
4344
#include "../dsql/ExprNodes.h"
4445
#include "../dsql/ddl_proto.h"
4546
#include "../dsql/metd_proto.h"

src/jrd/HazardPtr.cpp

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,38 +37,13 @@ using namespace Firebird;
3737
HazardObject::~HazardObject()
3838
{ }
3939

40-
int HazardObject::release(thread_db* tdbb)
40+
int HazardObject::delayedDelete(thread_db* tdbb)
4141
{
4242
HazardDelayedDelete& dd = tdbb->getAttachment()->att_delayed_delete;
4343
dd.delayedDelete(this);
4444
return 0;
4545
}
4646

47-
RefHazardObject::~RefHazardObject()
48-
{
49-
fb_assert(counter == 0);
50-
}
51-
52-
int RefHazardObject::release(thread_db* tdbb)
53-
{
54-
fb_assert(counter > 0);
55-
if (--counter == 0)
56-
{
57-
HazardObject::release(tdbb);
58-
return 0;
59-
}
60-
61-
return 1;
62-
}
63-
64-
void RefHazardObject::addRef(thread_db*)
65-
{
66-
fb_assert(counter >= 0);
67-
if (counter < 1)
68-
fatal_exception::raise("Attempt to reuse released object failed"); // need special error handling? !!!!!!!!!!!
69-
++counter;
70-
}
71-
7247
HazardDelayedDelete* HazardBase::getHazardDelayed(thread_db* tdbb)
7348
{
7449
if (!tdbb)

src/jrd/HazardPtr.h

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,7 @@ namespace Jrd {
4848
protected:
4949
virtual ~HazardObject();
5050
public:
51-
virtual int release(thread_db* tdbb);
52-
};
53-
54-
class RefHazardObject : public HazardObject
55-
{
56-
public:
57-
RefHazardObject()
58-
: counter(1) // non-std reference counted implementation
59-
{ }
60-
61-
~RefHazardObject() override;
62-
int release(thread_db* tdbb) override;
63-
virtual void addRef(thread_db* tdbb);
64-
65-
private:
66-
std::atomic<int> counter;
51+
int delayedDelete(thread_db* tdbb);
6752
};
6853

6954
class HazardDelayedDelete : public Firebird::PermanentStorage
@@ -280,6 +265,11 @@ namespace Jrd {
280265
return hazardPointer == v;
281266
}
282267

268+
bool operator!=(const T* v) const
269+
{
270+
return hazardPointer != v;
271+
}
272+
283273
operator bool() const
284274
{
285275
return hazardPointer != nullptr;
@@ -434,8 +424,8 @@ namespace Jrd {
434424
if (!m_objects[id >> SUBARRAY_SHIFT].compare_exchange_strong(sub, newSub,
435425
std::memory_order_release, std::memory_order_acquire))
436426
{
437-
// someone else already installed this subarray
438-
// ok for us - just free unneeded memory
427+
// Someone else already installed this subarray.
428+
// OK for us - just free unneeded memory.
439429
delete[] newSub;
440430
}
441431
else
@@ -448,7 +438,7 @@ namespace Jrd {
448438
std::memory_order_release, std::memory_order_acquire)); // empty body
449439

450440
if (oldVal)
451-
oldVal->release(tdbb); // delayedDelete
441+
oldVal->delayedDelete(tdbb);
452442

453443
return HazardPtr<Object>(tdbb, *sub);
454444
}

src/jrd/RecordSourceNodes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ class RelationSourceNode : public TypedNode<RecordSourceNode, RecordSourceNode::
359359
: TypedNode<RecordSourceNode, RecordSourceNode::TYPE_RELATION>(pool),
360360
dsqlName(pool, aDsqlName),
361361
alias(pool),
362-
relation(NULL),
362+
//relation(NULL),
363363
view(NULL),
364364
context(0)
365365
{

src/jrd/Relation.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,3 +601,13 @@ void RelationPages::free(RelationPages*& nextFree)
601601
dpMap.clear();
602602
dpMapMark = 0;
603603
}
604+
605+
606+
/// TrigVector
607+
608+
HazardPtr<Trigger> TrigVector::add(thread_db* tdbb, Trigger* trig)
609+
{
610+
FB_SIZE_T id = addCount.fetch_add(1);
611+
return store(tdbb, id, trig);
612+
}
613+

src/jrd/Relation.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class Trigger : public HazardObject
7979
bool isActive() const;
8080

8181
void compile(thread_db*); // Ensure that trigger is compiled
82-
int release(thread_db*) override; // Try to free trigger request
82+
int release(thread_db*); // Try to free trigger request
8383

8484
explicit Trigger(MemoryPool& p)
8585
: blr(p),
@@ -109,10 +109,10 @@ class TrigVector : public HazardArray<Trigger>
109109

110110
TrigVector()
111111
: HazardArray<Trigger>(Firebird::AutoStorage::getAutoMemoryPool()),
112-
useCount(0)
112+
useCount(0), addCount(0)
113113
{ }
114114

115-
HazardPtr<Trigger> add(Trigger*);
115+
HazardPtr<Trigger> add(thread_db* tdbb, Trigger*);
116116

117117
void addRef()
118118
{
@@ -138,11 +138,12 @@ class TrigVector : public HazardArray<Trigger>
138138

139139
~TrigVector()
140140
{
141-
fb_assert(useCount.value() == 0);
141+
fb_assert(useCount.load() == 0);
142142
}
143143

144144
private:
145-
Firebird::AtomicCounter useCount;
145+
std::atomic<int> useCount;
146+
std::atomic<FB_SIZE_T> addCount;
146147
};
147148

148149
typedef std::atomic<TrigVector*> TrigVectorPtr;

src/jrd/Routine.h

Lines changed: 5 additions & 3 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 RefHazardObject
44+
class Routine : public Firebird::PermanentStorage, public HazardObject
4545
{
4646
protected:
4747
explicit Routine(MemoryPool& p)
@@ -154,10 +154,12 @@ namespace Jrd
154154
{
155155
}
156156

157-
int release(thread_db* tdbb) override;
157+
int release(thread_db* tdbb);
158158
void releaseStatement(thread_db* tdbb);
159159
void remove(thread_db* tdbb);
160-
virtual void releaseExternal() {};
160+
virtual void releaseExternal()
161+
{
162+
}
161163

162164
public:
163165
virtual int getObjectType() const = 0;

0 commit comments

Comments
 (0)