@@ -72,8 +72,8 @@ namespace Jrd {
7272 : hazardDelayed(nullptr )
7373 { }
7474
75- inline void add (const void * hazardPointer);
76- inline void remove (const void * hazardPointer);
75+ inline void add (const void * hazardPointer, const char * from );
76+ inline void remove (const void * hazardPointer, const char * from );
7777
7878 private:
7979 HazardDelayedDelete* hazardDelayed;
@@ -87,50 +87,58 @@ namespace Jrd {
8787 class HazardPtr : public HazardBase
8888 {
8989 public:
90- HazardPtr ()
91- : hazardPointer(nullptr )
90+ HazardPtr (const char * F)
91+ : hazardPointer(nullptr ),
92+ frm (F)
9293 { }
9394
9495 template <class DDS >
95- explicit HazardPtr (DDS* par)
96+ explicit HazardPtr (DDS* par, const char * F )
9697 : HazardBase(par),
97- hazardPointer(nullptr )
98+ hazardPointer(nullptr ),
99+ frm(F)
98100 { }
99101
100102 template <class DDS >
101- HazardPtr (DDS* par, const std::atomic<T*>& from)
103+ HazardPtr (DDS* par, const std::atomic<T*>& from, const char * F )
102104 : HazardBase(par),
103- hazardPointer (nullptr )
105+ hazardPointer(nullptr ),
106+ frm(F)
104107 {
105108 set (from);
106109 }
107110
108- HazardPtr (HazardPtr& copy)
111+ HazardPtr (const HazardPtr& copy)
109112 : HazardBase(copy),
110- hazardPointer(nullptr )
113+ hazardPointer(nullptr ),
114+ frm(copy.frm)
111115 {
112116 reset (copy.hazardPointer );
117+ frm = copy.frm ;
113118 }
114119
115120 HazardPtr (HazardPtr&& move)
116121 : HazardBase(move),
117- hazardPointer(nullptr )
122+ hazardPointer(nullptr ),
123+ frm(move.frm)
118124 {
119125 hazardPointer = move.releasePointer ();
120126 }
121127
122128 template <class T2 >
123- HazardPtr (HazardPtr<T2>& copy)
129+ HazardPtr (const HazardPtr<T2>& copy)
124130 : HazardBase(copy),
125- hazardPointer(nullptr )
131+ hazardPointer(nullptr ),
132+ frm(copy.frm)
126133 {
127134 reset (copy.getPointer ());
128135 }
129136
130137 template <class T2 >
131138 HazardPtr (HazardPtr<T2>&& move)
132139 : HazardBase(move),
133- hazardPointer(nullptr )
140+ hazardPointer(nullptr ),
141+ frm(move.frm)
134142 {
135143 hazardPointer = move.releasePointer ();
136144 }
@@ -233,7 +241,7 @@ namespace Jrd {
233241 HazardPtr& operator =(HazardPtr&& moveAssign)
234242 {
235243 if (hazardPointer)
236- remove (hazardPointer);
244+ remove (hazardPointer, frm );
237245 HazardBase::operator =(moveAssign);
238246 hazardPointer = moveAssign.releasePointer ();
239247 return *this ;
@@ -250,7 +258,7 @@ namespace Jrd {
250258 HazardPtr& operator =(HazardPtr<T2>&& moveAssign)
251259 {
252260 if (hazardPointer)
253- remove (hazardPointer);
261+ remove (hazardPointer, FB_FUNCTION );
254262 HazardBase::operator =(moveAssign);
255263 hazardPointer = moveAssign.releasePointer ();
256264 return *this ;
@@ -267,16 +275,19 @@ namespace Jrd {
267275 if (newPtr != hazardPointer)
268276 {
269277 if (hazardPointer)
270- remove (hazardPointer);
278+ remove (hazardPointer, frm );
271279 if (newBase)
272280 HazardBase::operator =(*newBase);
273281 if (newPtr)
274- add (newPtr);
282+ add (newPtr, frm );
275283 hazardPointer = newPtr;
276284 }
277285 }
278286
279287 T* hazardPointer;
288+
289+ public:
290+ const char * frm;
280291 };
281292
282293 template <typename T>
@@ -300,7 +311,7 @@ namespace Jrd {
300311
301312 // Shared read here means that any thread can read from vector using HP.
302313 // It can be modified only in single thread, and it's caller's responsibility that modifying thread is single.
303- // It's also callers resposibility to destroy Generation when deleting SharedReadVector:
314+ // It's also callers responsibility to destroy Generation when deleting SharedReadVector:
304315 // in dtor we do not have enough information to do it correctly, default delayedDelete() may be already wrong.
305316
306317 template <typename T, FB_SIZE_T CAP, bool GC_ENABLED = true >
@@ -386,7 +397,7 @@ namespace Jrd {
386397 template <class DDS >
387398 HazardPtr<Generation> readAccessor (DDS* par) const
388399 {
389- return HazardPtr<Generation>(par, v);
400+ return HazardPtr<Generation>(par, v, FB_FUNCTION );
390401 }
391402
392403 inline void grow (HazardDelayedDelete* dd, FB_SIZE_T newSize = 0 );
@@ -416,8 +427,8 @@ namespace Jrd {
416427 hazardPointers(getPool())
417428 { }
418429
419- void add (const void * ptr);
420- void remove (const void * ptr);
430+ void add (const void * ptr, const char * from );
431+ void remove (const void * ptr, const char * from );
421432
422433 void delayedDelete (HazardObject* mem, bool gc = true );
423434 void garbageCollect (GarbageCollectMethod gcMethod);
@@ -434,18 +445,18 @@ namespace Jrd {
434445 };
435446
436447
437- inline void HazardBase::add (const void * hazardPointer)
448+ inline void HazardBase::add (const void * hazardPointer, const char * from )
438449 {
439450 if (!hazardDelayed)
440451 hazardDelayed = getHazardDelayed ();
441- hazardDelayed->add (hazardPointer);
452+ hazardDelayed->add (hazardPointer, from );
442453 }
443454
444- inline void HazardBase::remove (const void * hazardPointer)
455+ inline void HazardBase::remove (const void * hazardPointer, const char * from )
445456 {
446457 if (!hazardDelayed)
447458 hazardDelayed = getHazardDelayed ();
448- hazardDelayed->remove (hazardPointer);
459+ hazardDelayed->remove (hazardPointer, from );
449460 }
450461
451462 template <typename T, FB_SIZE_T CAP, bool GC_ENABLED>
@@ -495,7 +506,7 @@ namespace Jrd {
495506
496507 for (SubArrayElement* end = &sub[SUBARRAY_SIZE]; sub < end--;)
497508 {
498- HazardPtr<Object> val (tdbb, *end);
509+ HazardPtr<Object> val (tdbb, *end, FB_FUNCTION );
499510 if (val.hasData () && val->getKey () == key)
500511 {
501512 if (object)
@@ -575,7 +586,7 @@ namespace Jrd {
575586 oldVal->delayedDelete (tdbb);
576587 }
577588
578- return HazardPtr<Object>(tdbb, *sub);
589+ return HazardPtr<Object>(tdbb, *sub, FB_FUNCTION );
579590 }
580591
581592 bool replace (thread_db* tdbb, FB_SIZE_T id, HazardPtr<Object>& oldVal, Object* const newVal)
@@ -617,7 +628,7 @@ namespace Jrd {
617628 template <class DDS >
618629 HazardPtr<Object> load (DDS* par, FB_SIZE_T id) const
619630 {
620- HazardPtr<Object> val;
631+ HazardPtr<Object> val (FB_FUNCTION) ;
621632 if (!load (par, id, val))
622633 val.clear ();
623634 return val;
@@ -677,7 +688,7 @@ namespace Jrd {
677688
678689 HazardPtr<Object> get ()
679690 {
680- HazardPtr<Object> rc (hd);
691+ HazardPtr<Object> rc (hd, FB_FUNCTION );
681692 if (!snap->load (index, rc))
682693 rc.clear ();
683694 return rc;
0 commit comments