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

Reply via email to