remove dds_rhc_fini abomination
It was called strangely early in the deleting of the reader, even before the DDSI reader was no longer being accessed by other threads. The immediate and obvious problem is that it resets the pointer to the upper-layer entity even though this can still be dereferenced in invoking a listener, resulting in a crash. Secondly it blocks until there are no listener calls any more (and the resetting of that pointer will prevent any further listener invocations), but a similar piece of logic is already in generic entity code that resets the mask and then waits for all listener invocations to complete. Having both is a problem. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
d6edfada81
commit
0202039f61
6 changed files with 13 additions and 48 deletions
|
@ -30,7 +30,6 @@ struct proxy_writer_info
|
|||
struct ddsi_rhc_plugin
|
||||
{
|
||||
void (*rhc_free_fn) (struct rhc *rhc);
|
||||
void (*rhc_fini_fn) (struct rhc *rhc);
|
||||
bool (*rhc_store_fn)
|
||||
(struct rhc * __restrict rhc, const struct proxy_writer_info * __restrict pwr_info,
|
||||
struct ddsi_serdata * __restrict sample, struct ddsi_tkmap_instance * __restrict tk);
|
||||
|
|
|
@ -3386,10 +3386,6 @@ int delete_reader (const struct nn_guid *guid)
|
|||
DDS_LOG(DDS_LC_DISCOVERY, "delete_reader_guid(guid %x:%x:%x:%x) - unknown guid\n", PGUID (*guid));
|
||||
return Q_ERR_UNKNOWN_ENTITY;
|
||||
}
|
||||
if (rd->rhc)
|
||||
{
|
||||
(ddsi_plugin.rhc_plugin.rhc_fini_fn) (rd->rhc);
|
||||
}
|
||||
DDS_LOG(DDS_LC_DISCOVERY, "delete_reader_guid(guid %x:%x:%x:%x) ...\n", PGUID (*guid));
|
||||
ddsi_plugin.builtintopic_write (&rd->e, now(), false);
|
||||
ephash_remove_reader_guid (rd);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue