Move deleted participants admin into "gv"
That reduces the number of global variables in preparation for supporting multi domains simultaneously. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
59fb537ba3
commit
cf46ddbb7b
7 changed files with 58 additions and 50 deletions
|
@ -77,7 +77,6 @@ dds_init(dds_domainid_t domain)
|
|||
}
|
||||
|
||||
gv.tstart = now ();
|
||||
gv.exception = false;
|
||||
ddsrt_mutex_init (&dds_global.m_mutex);
|
||||
thread_states_init_static();
|
||||
|
||||
|
|
|
@ -386,10 +386,10 @@ extern const ddsrt_avl_treedef_t deleted_participants_treedef;
|
|||
|
||||
#define DPG_LOCAL 1
|
||||
#define DPG_REMOTE 2
|
||||
|
||||
int deleted_participants_admin_init (void);
|
||||
void deleted_participants_admin_fini (void);
|
||||
int is_deleted_participant_guid (const struct nn_guid *guid, unsigned for_what);
|
||||
struct deleted_participants_admin;
|
||||
struct deleted_participants_admin *deleted_participants_admin_new (void);
|
||||
void deleted_participants_admin_free (struct deleted_participants_admin *admin);
|
||||
int is_deleted_participant_guid (struct deleted_participants_admin *admin, const struct nn_guid *guid, unsigned for_what);
|
||||
|
||||
nn_entityid_t to_entityid (unsigned u);
|
||||
int is_builtin_entityid (nn_entityid_t id, nn_vendorid_t vendorid);
|
||||
|
|
|
@ -83,9 +83,10 @@ struct recv_thread_arg {
|
|||
} u;
|
||||
};
|
||||
|
||||
struct deleted_participants_admin;
|
||||
|
||||
struct q_globals {
|
||||
volatile int terminate;
|
||||
volatile int exception;
|
||||
volatile int deaf;
|
||||
volatile int mute;
|
||||
|
||||
|
@ -150,6 +151,9 @@ struct q_globals {
|
|||
struct participant *privileged_pp;
|
||||
ddsrt_mutex_t privileged_pp_lock;
|
||||
|
||||
/* For tracking (recently) deleted participants */
|
||||
struct deleted_participants_admin *deleted_participants;
|
||||
|
||||
/* GUID to be used in next call to new_participant; also protected
|
||||
by privileged_pp_lock */
|
||||
struct nn_guid next_ppguid;
|
||||
|
|
|
@ -567,7 +567,7 @@ static int handle_SPDP_alive (const struct receiver_state *rst, seqno_t seq, nn_
|
|||
consequently the looped back packet may appear to be from an
|
||||
unknown participant. So we handle that, too. */
|
||||
|
||||
if (is_deleted_participant_guid (&datap->participant_guid, DPG_REMOTE))
|
||||
if (is_deleted_participant_guid (gv.deleted_participants, &datap->participant_guid, DPG_REMOTE))
|
||||
{
|
||||
DDS_LOG(DDS_LC_TRACE, "SPDP ST0 "PGUIDFMT" (recently deleted)", PGUID (datap->participant_guid));
|
||||
return 1;
|
||||
|
@ -1126,7 +1126,7 @@ static void handle_SEDP_alive (const struct receiver_state *rst, nn_plist_t *dat
|
|||
|
||||
ppguid.prefix = datap->endpoint_guid.prefix;
|
||||
ppguid.entityid.u = NN_ENTITYID_PARTICIPANT;
|
||||
if (is_deleted_participant_guid (&ppguid, DPG_REMOTE))
|
||||
if (is_deleted_participant_guid (gv.deleted_participants, &ppguid, DPG_REMOTE))
|
||||
E (" local dead pp?\n", err);
|
||||
|
||||
if (ephash_lookup_participant_guid (&ppguid) != NULL)
|
||||
|
|
|
@ -56,8 +56,10 @@ struct deleted_participant {
|
|||
nn_mtime_t t_prune;
|
||||
};
|
||||
|
||||
static ddsrt_mutex_t deleted_participants_lock;
|
||||
static ddsrt_avl_tree_t deleted_participants;
|
||||
struct deleted_participants_admin {
|
||||
ddsrt_mutex_t deleted_participants_lock;
|
||||
ddsrt_avl_tree_t deleted_participants;
|
||||
};
|
||||
|
||||
static int compare_guid (const void *va, const void *vb);
|
||||
static void augment_wr_prd_match (void *vnode, const void *vleft, const void *vright);
|
||||
|
@ -273,83 +275,85 @@ nn_vendorid_t get_entity_vendorid (const struct entity_common *e)
|
|||
|
||||
/* DELETED PARTICIPANTS --------------------------------------------- */
|
||||
|
||||
int deleted_participants_admin_init (void)
|
||||
struct deleted_participants_admin *deleted_participants_admin_new (void)
|
||||
{
|
||||
ddsrt_mutex_init (&deleted_participants_lock);
|
||||
ddsrt_avl_init (&deleted_participants_treedef, &deleted_participants);
|
||||
return 0;
|
||||
struct deleted_participants_admin *admin = ddsrt_malloc (sizeof (*admin));
|
||||
ddsrt_mutex_init (&admin->deleted_participants_lock);
|
||||
ddsrt_avl_init (&deleted_participants_treedef, &admin->deleted_participants);
|
||||
return admin;
|
||||
}
|
||||
|
||||
void deleted_participants_admin_fini (void)
|
||||
void deleted_participants_admin_free (struct deleted_participants_admin *admin)
|
||||
{
|
||||
ddsrt_avl_free (&deleted_participants_treedef, &deleted_participants, ddsrt_free);
|
||||
ddsrt_mutex_destroy (&deleted_participants_lock);
|
||||
ddsrt_avl_free (&deleted_participants_treedef, &admin->deleted_participants, ddsrt_free);
|
||||
ddsrt_mutex_destroy (&admin->deleted_participants_lock);
|
||||
ddsrt_free (admin);
|
||||
}
|
||||
|
||||
static void prune_deleted_participant_guids_unlocked (nn_mtime_t tnow)
|
||||
static void prune_deleted_participant_guids_unlocked (struct deleted_participants_admin *admin, nn_mtime_t tnow)
|
||||
{
|
||||
/* Could do a better job of finding prunable ones efficiently under
|
||||
all circumstances, but I expect the tree to be very small at all
|
||||
times, so a full scan is fine, too ... */
|
||||
struct deleted_participant *dpp;
|
||||
dpp = ddsrt_avl_find_min (&deleted_participants_treedef, &deleted_participants);
|
||||
dpp = ddsrt_avl_find_min (&deleted_participants_treedef, &admin->deleted_participants);
|
||||
while (dpp)
|
||||
{
|
||||
struct deleted_participant *dpp1 = ddsrt_avl_find_succ (&deleted_participants_treedef, &deleted_participants, dpp);
|
||||
struct deleted_participant *dpp1 = ddsrt_avl_find_succ (&deleted_participants_treedef, &admin->deleted_participants, dpp);
|
||||
if (dpp->t_prune.v < tnow.v)
|
||||
{
|
||||
ddsrt_avl_delete (&deleted_participants_treedef, &deleted_participants, dpp);
|
||||
ddsrt_avl_delete (&deleted_participants_treedef, &admin->deleted_participants, dpp);
|
||||
ddsrt_free (dpp);
|
||||
}
|
||||
dpp = dpp1;
|
||||
}
|
||||
}
|
||||
|
||||
static void prune_deleted_participant_guids (nn_mtime_t tnow)
|
||||
static void prune_deleted_participant_guids (struct deleted_participants_admin *admin, nn_mtime_t tnow)
|
||||
{
|
||||
ddsrt_mutex_lock (&deleted_participants_lock);
|
||||
prune_deleted_participant_guids_unlocked (tnow);
|
||||
ddsrt_mutex_unlock (&deleted_participants_lock);
|
||||
ddsrt_mutex_lock (&admin->deleted_participants_lock);
|
||||
prune_deleted_participant_guids_unlocked (admin, tnow);
|
||||
ddsrt_mutex_unlock (&admin->deleted_participants_lock);
|
||||
}
|
||||
|
||||
static void remember_deleted_participant_guid (const struct nn_guid *guid)
|
||||
static void remember_deleted_participant_guid (struct deleted_participants_admin *admin, const struct nn_guid *guid)
|
||||
{
|
||||
struct deleted_participant *n;
|
||||
ddsrt_avl_ipath_t path;
|
||||
ddsrt_mutex_lock (&deleted_participants_lock);
|
||||
if (ddsrt_avl_lookup_ipath (&deleted_participants_treedef, &deleted_participants, guid, &path) == NULL)
|
||||
ddsrt_mutex_lock (&admin->deleted_participants_lock);
|
||||
if (ddsrt_avl_lookup_ipath (&deleted_participants_treedef, &admin->deleted_participants, guid, &path) == NULL)
|
||||
{
|
||||
if ((n = ddsrt_malloc (sizeof (*n))) != NULL)
|
||||
{
|
||||
n->guid = *guid;
|
||||
n->t_prune.v = T_NEVER;
|
||||
n->for_what = DPG_LOCAL | DPG_REMOTE;
|
||||
ddsrt_avl_insert_ipath (&deleted_participants_treedef, &deleted_participants, n, &path);
|
||||
ddsrt_avl_insert_ipath (&deleted_participants_treedef, &admin->deleted_participants, n, &path);
|
||||
}
|
||||
}
|
||||
ddsrt_mutex_unlock (&deleted_participants_lock);
|
||||
ddsrt_mutex_unlock (&admin->deleted_participants_lock);
|
||||
}
|
||||
|
||||
int is_deleted_participant_guid (const struct nn_guid *guid, unsigned for_what)
|
||||
int is_deleted_participant_guid (struct deleted_participants_admin *admin, const struct nn_guid *guid, unsigned for_what)
|
||||
{
|
||||
struct deleted_participant *n;
|
||||
int known;
|
||||
ddsrt_mutex_lock (&deleted_participants_lock);
|
||||
prune_deleted_participant_guids_unlocked (now_mt());
|
||||
if ((n = ddsrt_avl_lookup (&deleted_participants_treedef, &deleted_participants, guid)) == NULL)
|
||||
ddsrt_mutex_lock (&admin->deleted_participants_lock);
|
||||
prune_deleted_participant_guids_unlocked (admin, now_mt ());
|
||||
if ((n = ddsrt_avl_lookup (&deleted_participants_treedef, &admin->deleted_participants, guid)) == NULL)
|
||||
known = 0;
|
||||
else
|
||||
known = ((n->for_what & for_what) != 0);
|
||||
ddsrt_mutex_unlock (&deleted_participants_lock);
|
||||
ddsrt_mutex_unlock (&admin->deleted_participants_lock);
|
||||
return known;
|
||||
}
|
||||
|
||||
static void remove_deleted_participant_guid (const struct nn_guid *guid, unsigned for_what)
|
||||
static void remove_deleted_participant_guid (struct deleted_participants_admin *admin, const struct nn_guid *guid, unsigned for_what)
|
||||
{
|
||||
struct deleted_participant *n;
|
||||
DDS_LOG(DDS_LC_DISCOVERY, "remove_deleted_participant_guid("PGUIDFMT" for_what=%x)\n", PGUID (*guid), for_what);
|
||||
ddsrt_mutex_lock (&deleted_participants_lock);
|
||||
if ((n = ddsrt_avl_lookup (&deleted_participants_treedef, &deleted_participants, guid)) != NULL)
|
||||
ddsrt_mutex_lock (&admin->deleted_participants_lock);
|
||||
if ((n = ddsrt_avl_lookup (&deleted_participants_treedef, &admin->deleted_participants, guid)) != NULL)
|
||||
{
|
||||
if (config.prune_deleted_ppant.enforce_delay)
|
||||
{
|
||||
|
@ -366,12 +370,12 @@ static void remove_deleted_participant_guid (const struct nn_guid *guid, unsigne
|
|||
}
|
||||
else
|
||||
{
|
||||
ddsrt_avl_delete (&deleted_participants_treedef, &deleted_participants, n);
|
||||
ddsrt_avl_delete (&deleted_participants_treedef, &admin->deleted_participants, n);
|
||||
ddsrt_free (n);
|
||||
}
|
||||
}
|
||||
}
|
||||
ddsrt_mutex_unlock (&deleted_participants_lock);
|
||||
ddsrt_mutex_unlock (&admin->deleted_participants_lock);
|
||||
}
|
||||
|
||||
|
||||
|
@ -443,7 +447,7 @@ dds_return_t new_participant_guid (const nn_guid_t *ppguid, unsigned flags, cons
|
|||
/* privileged participant MUST have builtin readers and writers */
|
||||
assert (!(flags & RTPS_PF_PRIVILEGED_PP) || (flags & (RTPS_PF_NO_BUILTIN_READERS | RTPS_PF_NO_BUILTIN_WRITERS)) == 0);
|
||||
|
||||
prune_deleted_participant_guids (now_mt ());
|
||||
prune_deleted_participant_guids (gv.deleted_participants, now_mt ());
|
||||
|
||||
/* FIXME: FULL LOCKING AROUND NEW_XXX FUNCTIONS, JUST SO EXISTENCE TESTS ARE PRECISE */
|
||||
|
||||
|
@ -879,7 +883,7 @@ static void unref_participant (struct participant *pp, const struct nn_guid *gui
|
|||
ddsrt_free (pp->plist);
|
||||
ddsrt_mutex_destroy (&pp->refc_lock);
|
||||
entity_common_fini (&pp->e);
|
||||
remove_deleted_participant_guid (&pp->e.guid, DPG_LOCAL);
|
||||
remove_deleted_participant_guid (gv.deleted_participants, &pp->e.guid, DPG_LOCAL);
|
||||
inverse_uint32_set_fini(&pp->avail_entityids.x);
|
||||
ddsrt_free (pp);
|
||||
}
|
||||
|
@ -903,7 +907,7 @@ dds_return_t delete_participant (const struct nn_guid *ppguid)
|
|||
if ((pp = ephash_lookup_participant_guid (ppguid)) == NULL)
|
||||
return DDS_RETCODE_BAD_PARAMETER;
|
||||
ddsi_plugin.builtintopic_write (&pp->e, now(), false);
|
||||
remember_deleted_participant_guid (&pp->e.guid);
|
||||
remember_deleted_participant_guid (gv.deleted_participants, &pp->e.guid);
|
||||
ephash_remove_participant_guid (pp);
|
||||
gcreq_participant (pp);
|
||||
return 0;
|
||||
|
@ -3500,7 +3504,7 @@ void new_proxy_participant
|
|||
assert (ephash_lookup_proxy_participant_guid (ppguid) == NULL);
|
||||
assert (privileged_pp_guid == NULL || privileged_pp_guid->entityid.u == NN_ENTITYID_PARTICIPANT);
|
||||
|
||||
prune_deleted_participant_guids (now_mt ());
|
||||
prune_deleted_participant_guids (gv.deleted_participants, now_mt ());
|
||||
|
||||
proxypp = ddsrt_malloc (sizeof (*proxypp));
|
||||
|
||||
|
@ -3750,7 +3754,7 @@ static void unref_proxy_participant (struct proxy_participant *proxypp, struct p
|
|||
if (proxypp->owns_lease)
|
||||
lease_free (ddsrt_atomic_ldvoidp (&proxypp->lease));
|
||||
entity_common_fini (&proxypp->e);
|
||||
remove_deleted_participant_guid (&proxypp->e.guid, DPG_LOCAL | DPG_REMOTE);
|
||||
remove_deleted_participant_guid (gv.deleted_participants, &proxypp->e.guid, DPG_LOCAL | DPG_REMOTE);
|
||||
ddsrt_free (proxypp);
|
||||
}
|
||||
else if (proxypp->endpoints == NULL && proxypp->implicitly_created)
|
||||
|
@ -3912,7 +3916,7 @@ int delete_proxy_participant_by_guid (const struct nn_guid * guid, nn_wctime_t t
|
|||
}
|
||||
DDS_LOG(DDS_LC_DISCOVERY, "- deleting\n");
|
||||
ddsi_plugin.builtintopic_write (&ppt->e, timestamp, false);
|
||||
remember_deleted_participant_guid (&ppt->e.guid);
|
||||
remember_deleted_participant_guid (gv.deleted_participants, &ppt->e.guid);
|
||||
ephash_remove_proxy_participant_guid (ppt);
|
||||
ddsrt_mutex_unlock (&gv.lock);
|
||||
delete_ppt (ppt, timestamp, isimplicit);
|
||||
|
|
|
@ -1029,7 +1029,7 @@ int rtps_init (void)
|
|||
ddsrt_mutex_init (&gv.participant_set_lock);
|
||||
ddsrt_cond_init (&gv.participant_set_cond);
|
||||
lease_management_init ();
|
||||
deleted_participants_admin_init ();
|
||||
gv.deleted_participants = deleted_participants_admin_new ();
|
||||
gv.guid_hash = ephash_new ();
|
||||
|
||||
ddsrt_mutex_init (&gv.privileged_pp_lock);
|
||||
|
@ -1306,7 +1306,7 @@ err_unicast_sockets:
|
|||
ddsrt_mutex_destroy (&gv.privileged_pp_lock);
|
||||
ephash_free (gv.guid_hash);
|
||||
gv.guid_hash = NULL;
|
||||
deleted_participants_admin_fini ();
|
||||
deleted_participants_admin_free (gv.deleted_participants);
|
||||
lease_management_term ();
|
||||
ddsrt_cond_destroy (&gv.participant_set_cond);
|
||||
ddsrt_mutex_destroy (&gv.participant_set_lock);
|
||||
|
@ -1640,7 +1640,7 @@ void rtps_fini (void)
|
|||
|
||||
ephash_free (gv.guid_hash);
|
||||
gv.guid_hash = NULL;
|
||||
deleted_participants_admin_fini ();
|
||||
deleted_participants_admin_free (gv.deleted_participants);
|
||||
lease_management_term ();
|
||||
ddsrt_mutex_destroy (&gv.participant_set_lock);
|
||||
ddsrt_cond_destroy (&gv.participant_set_cond);
|
||||
|
|
|
@ -1508,7 +1508,8 @@ static int handle_InfoDST (struct receiver_state *rst, const InfoDST_t *msg, con
|
|||
nn_guid_t dst;
|
||||
dst.prefix = rst->dst_guid_prefix;
|
||||
dst.entityid = to_entityid(NN_ENTITYID_PARTICIPANT);
|
||||
rst->forme = (ephash_lookup_participant_guid (&dst) != NULL) || is_deleted_participant_guid (&dst, DPG_LOCAL);
|
||||
rst->forme = (ephash_lookup_participant_guid (&dst) != NULL ||
|
||||
is_deleted_participant_guid (gv.deleted_participants, &dst, DPG_LOCAL));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue