Avoid deadlock on publication-matched listener invocation
This addresses the deadlock of #41 but leaves another issue open: sequencing of listener invocations on publication/subscription matched events: there is a risk that the "unmatch" even precedes the "match" event from the application perspective, even though it is quite unlike in practice. Various ways of addressing it exist, but it looks like sequencing at the level of the "dds" entities suffers from similar risks. So better to just avoid the deadlock for now. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
ca99fd10aa
commit
9f51c44e50
1 changed files with 10 additions and 10 deletions
|
@ -1351,16 +1351,16 @@ static void writer_drop_connection (const struct nn_guid * wr_guid, const struct
|
||||||
rebuild_writer_addrset (wr);
|
rebuild_writer_addrset (wr);
|
||||||
remove_acked_messages (wr, &whcst, &deferred_free_list);
|
remove_acked_messages (wr, &whcst, &deferred_free_list);
|
||||||
wr->num_reliable_readers -= m->is_reliable;
|
wr->num_reliable_readers -= m->is_reliable;
|
||||||
if (wr->status_cb)
|
|
||||||
{
|
|
||||||
status_cb_data_t data;
|
|
||||||
data.status = DDS_PUBLICATION_MATCHED_STATUS;
|
|
||||||
data.add = false;
|
|
||||||
data.handle = prd->e.iid;
|
|
||||||
(wr->status_cb) (wr->status_cb_entity, &data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
os_mutexUnlock (&wr->e.lock);
|
os_mutexUnlock (&wr->e.lock);
|
||||||
|
if (m != NULL && wr->status_cb)
|
||||||
|
{
|
||||||
|
status_cb_data_t data;
|
||||||
|
data.status = DDS_PUBLICATION_MATCHED_STATUS;
|
||||||
|
data.add = false;
|
||||||
|
data.handle = prd->e.iid;
|
||||||
|
(wr->status_cb) (wr->status_cb_entity, &data);
|
||||||
|
}
|
||||||
whc_free_deferred_free_list (wr->whc, deferred_free_list);
|
whc_free_deferred_free_list (wr->whc, deferred_free_list);
|
||||||
free_wr_prd_match (m);
|
free_wr_prd_match (m);
|
||||||
}
|
}
|
||||||
|
@ -1380,7 +1380,8 @@ static void writer_drop_local_connection (const struct nn_guid *wr_guid, struct
|
||||||
ut_avlDelete (&wr_local_readers_treedef, &wr->local_readers, m);
|
ut_avlDelete (&wr_local_readers_treedef, &wr->local_readers, m);
|
||||||
}
|
}
|
||||||
local_reader_ary_remove (&wr->rdary, rd);
|
local_reader_ary_remove (&wr->rdary, rd);
|
||||||
if (wr->status_cb)
|
os_mutexUnlock (&wr->e.lock);
|
||||||
|
if (m != NULL && wr->status_cb)
|
||||||
{
|
{
|
||||||
status_cb_data_t data;
|
status_cb_data_t data;
|
||||||
data.status = DDS_PUBLICATION_MATCHED_STATUS;
|
data.status = DDS_PUBLICATION_MATCHED_STATUS;
|
||||||
|
@ -1388,7 +1389,6 @@ static void writer_drop_local_connection (const struct nn_guid *wr_guid, struct
|
||||||
data.handle = rd->e.iid;
|
data.handle = rd->e.iid;
|
||||||
(wr->status_cb) (wr->status_cb_entity, &data);
|
(wr->status_cb) (wr->status_cb_entity, &data);
|
||||||
}
|
}
|
||||||
os_mutexUnlock (&wr->e.lock);
|
|
||||||
free_wr_rd_match (m);
|
free_wr_rd_match (m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue