[Xenomai-git] Philippe Gerum : copperplate/timerobj: do not hold any mutex while intentionally sleeping

2015-05-22 Thread git repository hosting
Module: xenomai-3
Branch: master
Commit: 19309fb17f1640e75af4c1d64162c2de350d4cc3
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=19309fb17f1640e75af4c1d64162c2de350d4cc3

Author: Philippe Gerum 
Date:   Mon May 18 20:36:38 2015 +0200

copperplate/timerobj: do not hold any mutex while intentionally sleeping

CONFIG_XENO_OPT_DEBUG_USER triggers a warning signal as we call
copperplate_create_thread() while holding a mutex, since the former
waits briefly for synchronizing with the child thread.

Use pthread_once() construct instead, which is more appropriate in
this context.

---

 lib/copperplate/timerobj.c |   22 ++
 1 file changed, 6 insertions(+), 16 deletions(-)

diff --git a/lib/copperplate/timerobj.c b/lib/copperplate/timerobj.c
index fbe5b0a..bbfa8f2 100644
--- a/lib/copperplate/timerobj.c
+++ b/lib/copperplate/timerobj.c
@@ -140,16 +140,9 @@ static void *timerobj_server(void *arg)
return NULL;
 }
 
-static int timerobj_spawn_server(void)
+static void timerobj_spawn_server(void)
 {
struct corethread_attributes cta;
-   int ret = 0;
-
-   push_cleanup_lock(&svlock);
-   write_lock(&svlock);
-
-   if (svthread)
-   goto out;
 
cta.policy = SCHED_CORE;
cta.param_ex.sched_priority = threadobj_irq_prio;
@@ -158,16 +151,13 @@ static int timerobj_spawn_server(void)
cta.arg = NULL;
cta.stacksize = PTHREAD_STACK_MIN * 16;
cta.detachstate = PTHREAD_CREATE_DETACHED;
-   ret = __bt(copperplate_create_thread(&cta, &svthread));
-out:
-   write_unlock(&svlock);
-   pop_cleanup_lock(&svlock);
 
-   return ret;
+   __bt(copperplate_create_thread(&cta, &svthread));
 }
 
 int timerobj_init(struct timerobj *tmobj)
 {
+   static pthread_once_t spawn_once;
pthread_mutexattr_t mattr;
struct sigevent sev;
int ret;
@@ -183,9 +173,9 @@ int timerobj_init(struct timerobj *tmobj)
 * very least), and spawning a short-lived thread at each
 * timeout expiration to run the handler is just overkill.
 */
-   ret = timerobj_spawn_server();
-   if (ret)
-   return __bt(ret);
+   pthread_once(&spawn_once, timerobj_spawn_server);
+   if (!svthread)
+   return __bt(-EAGAIN);
 
tmobj->handler = NULL;
pvholder_init(&tmobj->next); /* so we may use pvholder_linked() */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/timerobj: do not hold any mutex while intentionally sleeping

2015-05-18 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: 19309fb17f1640e75af4c1d64162c2de350d4cc3
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=19309fb17f1640e75af4c1d64162c2de350d4cc3

Author: Philippe Gerum 
Date:   Mon May 18 20:36:38 2015 +0200

copperplate/timerobj: do not hold any mutex while intentionally sleeping

CONFIG_XENO_OPT_DEBUG_USER triggers a warning signal as we call
copperplate_create_thread() while holding a mutex, since the former
waits briefly for synchronizing with the child thread.

Use pthread_once() construct instead, which is more appropriate in
this context.

---

 lib/copperplate/timerobj.c |   22 ++
 1 file changed, 6 insertions(+), 16 deletions(-)

diff --git a/lib/copperplate/timerobj.c b/lib/copperplate/timerobj.c
index fbe5b0a..bbfa8f2 100644
--- a/lib/copperplate/timerobj.c
+++ b/lib/copperplate/timerobj.c
@@ -140,16 +140,9 @@ static void *timerobj_server(void *arg)
return NULL;
 }
 
-static int timerobj_spawn_server(void)
+static void timerobj_spawn_server(void)
 {
struct corethread_attributes cta;
-   int ret = 0;
-
-   push_cleanup_lock(&svlock);
-   write_lock(&svlock);
-
-   if (svthread)
-   goto out;
 
cta.policy = SCHED_CORE;
cta.param_ex.sched_priority = threadobj_irq_prio;
@@ -158,16 +151,13 @@ static int timerobj_spawn_server(void)
cta.arg = NULL;
cta.stacksize = PTHREAD_STACK_MIN * 16;
cta.detachstate = PTHREAD_CREATE_DETACHED;
-   ret = __bt(copperplate_create_thread(&cta, &svthread));
-out:
-   write_unlock(&svlock);
-   pop_cleanup_lock(&svlock);
 
-   return ret;
+   __bt(copperplate_create_thread(&cta, &svthread));
 }
 
 int timerobj_init(struct timerobj *tmobj)
 {
+   static pthread_once_t spawn_once;
pthread_mutexattr_t mattr;
struct sigevent sev;
int ret;
@@ -183,9 +173,9 @@ int timerobj_init(struct timerobj *tmobj)
 * very least), and spawning a short-lived thread at each
 * timeout expiration to run the handler is just overkill.
 */
-   ret = timerobj_spawn_server();
-   if (ret)
-   return __bt(ret);
+   pthread_once(&spawn_once, timerobj_spawn_server);
+   if (!svthread)
+   return __bt(-EAGAIN);
 
tmobj->handler = NULL;
pvholder_init(&tmobj->next); /* so we may use pvholder_linked() */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git