[ovs-dev] [PATCH 1/5] ovs-thread: Add a comment
Ben Pfaff
blp at nicira.com
Fri Feb 7 01:06:23 UTC 2014
On Wed, Feb 05, 2014 at 11:47:17AM +0900, YAMAMOTO Takashi wrote:
> > On Wed, Jan 15, 2014 at 12:41:20PM +0900, YAMAMOTO Takashi wrote:
> >> Add a comment about implicit synchronization which
> >> fat-rwlock seems to rely on.
> >>
> >> Signed-off-by: YAMAMOTO Takashi <yamamoto at valinux.co.jp>
> >> ---
> >> lib/ovs-thread.h | 8 ++++++++
> >> 1 file changed, 8 insertions(+)
> >>
> >> diff --git a/lib/ovs-thread.h b/lib/ovs-thread.h
> >> index 8cf2ecc..dab7510 100644
> >> --- a/lib/ovs-thread.h
> >> +++ b/lib/ovs-thread.h
> >> @@ -447,6 +447,14 @@ void xpthread_join(pthread_t, void **);
> >> * Compared to pthread_key_t, ovsthread_key_t has the follow limitations:
> >> *
> >> * - Destructors must not access thread-specific data (via ovsthread_key).
> >> + *
> >> + * Unlike pthread_key_t, this API implicitly serializes key removal
> >> + * (ovsthread_key_delete) and thread exit. (destructor)
> >> + * I.e.
> >> + * - ovsthread_key_delete ensures the completion of destructors for
> >> + * the key.
> >> + * - Once ovsthread_key_delete completed, no destructors for the key
> >> + * will be executed on thread exit.
> >> */
> >> typedef struct ovsthread_key *ovsthread_key_t;
> >
> > I think I understand what you are saying, but I think that I would
> > phrase it differently. Does the following express what you mean?
> >
> > diff --git a/lib/ovs-thread.c b/lib/ovs-thread.c
> > index a20b2fd..18e524e 100644
> > --- a/lib/ovs-thread.c
> > +++ b/lib/ovs-thread.c
> > @@ -592,7 +592,8 @@ ovsthread_key_create(ovsthread_key_t *keyp, void (*destructor)(void *))
> > }
> >
> > /* Frees 'key'. The destructor supplied to ovsthread_key_create(), if any, is
> > - * not called.
> > + * not called. This function returns only after any running destructors for
> > + * 'key' complete execution.
>
> 'running destructors' is not exact.
> i believe pthread api allows for concurrent exiting threads to
> start executing the destructor after pthread_key_delete completed.
> but this ovsthread one doesn't. and fat-rwlock relies on it.
>
> i think it's better to say the difference explicitly as
> it guarantees more than pthread while using similar-looking names.
> i was confused when reading fat-rwlock.
Do you like the following version?
--8<--------------------------cut here-------------------------->8--
From: Ben Pfaff <blp at nicira.com>
Date: Thu, 6 Feb 2014 17:06:00 -0800
Subject: [PATCH] ovs-thread: Add a comment.
Reported-by: YAMAMOTO Takashi <yamamoto at valinux.co.jp>
Signed-off-by: Ben Pfaff <blp at nicira.com>
---
lib/ovs-thread.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/lib/ovs-thread.h b/lib/ovs-thread.h
index 8cf2ecc..f031894 100644
--- a/lib/ovs-thread.h
+++ b/lib/ovs-thread.h
@@ -444,9 +444,15 @@ void xpthread_join(pthread_t, void **);
* (by recompiling). Thus, one may more freely use this form of
* thread-specific data.
*
- * Compared to pthread_key_t, ovsthread_key_t has the follow limitations:
+ * ovsthread_key_t also differs from pthread_key_t in the following ways:
*
* - Destructors must not access thread-specific data (via ovsthread_key).
+ *
+ * - The pthread_key_t API allows concurrently exiting threads to start
+ * executing the destructor after pthread_key_delete() returns. The
+ * ovsthread_key_t API guarantees that, when ovsthread_key_delete()
+ * returns, all destructors have returned and no new ones will start
+ * execution.
*/
typedef struct ovsthread_key *ovsthread_key_t;
--
1.7.10.4
More information about the dev
mailing list