Skip to content

Commit adf5176

Browse files
committed
More reliable (in a concurrent environment) shared lock release and broadcasting.
1 parent f0b0d0c commit adf5176

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

src/jrd/Relation.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ int RelationPermanent::partners_ast_relation(void* ast_object)
191191

192192
AsyncContextHolder tdbb(dbb, FB_FUNCTION);
193193

194-
auto oldFlags = relation->rel_flags.fetch_or(REL_check_partners);
194+
const auto oldFlags = relation->rel_flags.fetch_or(REL_check_partners);
195195
if (!(oldFlags & REL_check_partners))
196196
LCK_release(tdbb, lock);
197197
}
@@ -248,10 +248,15 @@ Record* RelationPermanent::getGCRecord(thread_db* tdbb, const Format* const form
248248

249249
void RelationPermanent::checkPartners(thread_db* tdbb)
250250
{
251-
rel_flags |= REL_check_partners;
251+
const auto oldFlags = rel_flags.fetch_or(REL_check_partners);
252+
if (!(oldFlags & REL_check_partners))
253+
LCK_release(tdbb, rel_partners_lock);
254+
255+
Lock tempLock(tdbb, 0, LCK_rel_partners);
256+
tempLock.setKey(rel_id);
252257

253-
LCK_lock(tdbb, rel_partners_lock, LCK_EX, LCK_WAIT);
254-
LCK_release(tdbb, rel_partners_lock);
258+
if (LCK_lock(tdbb, &tempLock, LCK_EX, LCK_WAIT))
259+
LCK_release(tdbb, &tempLock);
255260
}
256261

257262
bool RelationPermanent::isReplicating(thread_db* tdbb)

0 commit comments

Comments
 (0)