[ovs-dev] [PATCH] netdev: New function netdev_ref().

Ben Pfaff blp at nicira.com
Wed May 22 18:12:39 UTC 2013


Applied to master, thanks.

On Wed, May 22, 2013 at 10:42:32AM -0700, Ethan Jackson wrote:
> LGTM as well.  I plan to use this in the CFM patch so please go ahead
> and push it.
> 
> Ethan
> 
> On Wed, May 22, 2013 at 8:50 AM, Ben Pfaff <blp at nicira.com> wrote:
> > Thanks for taking a look.  I won't push this unless Ethan says that he
> > thinks it is useful for his recent cfm patch.
> >
> > I have two perspectives on your question.  The first one is that this
> > situation is analogous to strchr(), which takes a const char * and
> > returns a char *.  Its parameter is const because it does not modify its
> > argument, and its return value is non-const because that is more useful
> > to the caller, which in practice often passes in a non-const pointer and
> > wishes to use the result in a non-const way.  (In C++, there are two
> > versions of strchr(): one that takes and returns a const char *, one
> > that takes and returns a char *.  This is strictly better type-wise, but
> > C does not allow this.)
> >
> > The second perspective is that this situation is analogous to a function
> > like strdup(), which takes a const char * (that it does not modify) and
> > returns a char * (that is newly allocated).  netdev_ref() is somewhat
> > like this, in that the caller can regard its return value as a new copy
> > of the netdev.  Even though the return value points to the same
> > location, it is still somewhat separate due to the additional reference
> > that it "owns".
> >
> > On Tue, May 21, 2013 at 06:37:17PM -0700, Alex Wang wrote:
> >> Looks good to me. Want to ask what is the tradeoff between using "const
> >> struct netdev" and "struct netdev" as input argument.
> >>
> >> Thanks,
> >>
> >> On Tue, May 21, 2013 at 3:42 PM, Ben Pfaff <blp at nicira.com> wrote:
> >>
> >> > I suspect that this makes it easier to make sure that a netdev stays open
> >> > as long as needed in some cases where a module needs access to a netdev
> >> > opened by some higher-level module.
> >> >
> >> > CC: Ethan Jackson <ethan at nicira.com>
> >> > Signed-off-by: Ben Pfaff <blp at nicira.com>
> >> > ---
> >> >  lib/netdev.c |   11 +++++++++++
> >> >  lib/netdev.h |    1 +
> >> >  2 files changed, 12 insertions(+), 0 deletions(-)
> >> >
> >> > diff --git a/lib/netdev.c b/lib/netdev.c
> >> > index 5c2e9f5..5aae01c 100644
> >> > --- a/lib/netdev.c
> >> > +++ b/lib/netdev.c
> >> > @@ -277,6 +277,17 @@ netdev_open(const char *name, const char *type,
> >> > struct netdev **netdevp)
> >> >      return 0;
> >> >  }
> >> >
> >> > +/* Returns a reference to 'netdev_' for the caller to own. */
> >> > +struct netdev *
> >> > +netdev_ref(const struct netdev *netdev_)
> >> > +{
> >> > +    struct netdev *netdev = CONST_CAST(struct netdev *, netdev_);
> >> > +
> >> > +    ovs_assert(netdev->ref_cnt > 0);
> >> > +    netdev->ref_cnt++;
> >> > +    return netdev;
> >> > +}
> >> > +
> >> >  /* Reconfigures the device 'netdev' with 'args'.  'args' may be empty
> >> >   * or NULL if none are needed. */
> >> >  int
> >> > diff --git a/lib/netdev.h b/lib/netdev.h
> >> > index c7f3c1d..b1cc319 100644
> >> > --- a/lib/netdev.h
> >> > +++ b/lib/netdev.h
> >> > @@ -110,6 +110,7 @@ bool netdev_is_reserved_name(const char *name);
> >> >
> >> >  /* Open and close. */
> >> >  int netdev_open(const char *name, const char *type, struct netdev **);
> >> > +struct netdev *netdev_ref(const struct netdev *);
> >> >  void netdev_close(struct netdev *);
> >> >
> >> >  void netdev_parse_name(const char *netdev_name, char **name, char **type);
> >> > --
> >> > 1.7.2.5
> >> >
> >> > _______________________________________________
> >> > dev mailing list
> >> > dev at openvswitch.org
> >> > http://openvswitch.org/mailman/listinfo/dev
> >> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list