On 11/10/2020 2:21 PM, Richard Cochran wrote:
> The main method that causes the PMC agent to update its status takes a flag
> that results in different behavior when push notifications are active.
> This patch simplifies the interface by letting the agent remember whether
> or not the caller subscribed to the notifications in the first place.
>
> Signed-off-by: Richard Cochran <richardcoch...@gmail.com>
Makes sense. I definitely like dropping the on/off parameter. It makes
the API between the callers easier to follow.
> ---
> phc2sys.c | 6 ++++--
> pmc_agent.c | 32 ++++++++++++++++++++------------
> pmc_agent.h | 2 +-
> 3 files changed, 25 insertions(+), 15 deletions(-)
>
> diff --git a/phc2sys.c b/phc2sys.c
> index d758aca..436ccea 100644
> --- a/phc2sys.c
> +++ b/phc2sys.c
> @@ -673,7 +673,7 @@ static int do_pps_loop(struct phc2sys_private *priv,
> struct clock *clock,
> pps_offset = pps_ts - phc_ts;
> }
>
> - if (update_pmc_node(priv->node, 0) < 0)
> + if (update_pmc_node(priv->node) < 0)
> continue;
> update_clock(priv, clock, pps_offset, pps_ts, -1);
> }
> @@ -710,8 +710,10 @@ static int do_loop(struct phc2sys_private *priv, int
> subscriptions)
>
> while (is_running()) {
> clock_nanosleep(CLOCK_MONOTONIC, 0, &interval, NULL);
> - if (update_pmc_node(priv->node, subscriptions) < 0)
> +
> + if (update_pmc_node(priv->node) < 0) {
> continue;
> + }
Ok, so now the node/agent tracks the subscriptions automatically. So
someone else needs to call renew_subscription first.
Patch context alone isn't enough to follow where that happens. We pass
subscriptions to do_loop. Is this still used? No longer necessary? hmm.
>
> if (subscriptions) {
> run_pmc_events(priv->node);
> diff --git a/pmc_agent.c b/pmc_agent.c
> index 714c5c5..24587b4 100644
> --- a/pmc_agent.c
> +++ b/pmc_agent.c
> @@ -42,6 +42,7 @@ struct pmc_agent {
> int clock_identity_set;
> int leap;
> int pmc_ds_requested;
> + int subscription_active;
> int sync_offset;
> int utc_offset_traceable;
>
> @@ -188,6 +189,19 @@ static int run_pmc(struct pmc_agent *node, int timeout,
> int ds_id,
> }
> }
>
> +static int renew_subscription(struct pmc_agent *node, int timeout)
> +{
> + struct ptp_message *msg;
> + int res;
> +
> + res = run_pmc(node, timeout, TLV_SUBSCRIBE_EVENTS_NP, &msg);
> + if (is_run_pmc_error(res)) {
> + return run_pmc_err2errno(res);
> + }
> + msg_put(msg);
> + return 0;
> +}
> +
> int run_pmc_wait_sync(struct pmc_agent *node, int timeout)
> {
> struct ptp_message *msg;
> @@ -323,7 +337,7 @@ int run_pmc_clock_identity(struct pmc_agent *node, int
> timeout)
> }
>
> /* Returns: -1 in case of error, 0 otherwise */
> -int update_pmc_node(struct pmc_agent *node, int subscribe)
> +int update_pmc_node(struct pmc_agent *node)
> {
> struct timespec tp;
> uint64_t ts;
> @@ -337,8 +351,9 @@ int update_pmc_node(struct pmc_agent *node, int subscribe)
> if (node->pmc &&
> !(ts > node->pmc_last_update &&
> ts - node->pmc_last_update < PMC_UPDATE_INTERVAL)) {
> - if (subscribe)
> - pmc_agent_subscribe(node, 0);
> + if (node->subscription_active) {
> + renew_subscription(node, 0);
> + }
> if (run_pmc_get_utc_offset(node, 0) > 0)
> node->pmc_last_update = ts;
> }
> @@ -393,15 +408,8 @@ void pmc_agent_set_sync_offset(struct pmc_agent *agent,
> int offset)
>
> int pmc_agent_subscribe(struct pmc_agent *node, int timeout)
> {
> - struct ptp_message *msg;
> - int res;
> -
> - res = run_pmc(node, timeout, TLV_SUBSCRIBE_EVENTS_NP, &msg);
> - if (is_run_pmc_error(res)) {
> - return run_pmc_err2errno(res);
> - }
> - msg_put(msg);
> - return 0;
> + node->subscription_active = 1;
> + return renew_subscription(node, timeout);
> }
>
> bool pmc_agent_utc_offset_traceable(struct pmc_agent *agent)
> diff --git a/pmc_agent.h b/pmc_agent.h
> index 551c4a5..e4d3c3c 100644
> --- a/pmc_agent.h
> +++ b/pmc_agent.h
> @@ -33,7 +33,7 @@ typedef int pmc_node_recv_subscribed_t(void *context,
> struct ptp_message *msg,
>
> int init_pmc_node(struct config *cfg, struct pmc_agent *agent, const char
> *uds,
> pmc_node_recv_subscribed_t *recv_subscribed, void *context);
> -int update_pmc_node(struct pmc_agent *agent, int subscribe);
> +int update_pmc_node(struct pmc_agent *agent);
> int run_pmc_clock_identity(struct pmc_agent *agent, int timeout);
> int run_pmc_wait_sync(struct pmc_agent *agent, int timeout);
> int run_pmc_get_number_ports(struct pmc_agent *agent, int timeout);
>
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel