You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by na...@apache.org on 2019/02/07 14:40:29 UTC

[mynewt-nimble] branch master updated: [linux] Stability fixes to linux port: npl mutex, queues, and task.

This is an automated email from the ASF dual-hosted git repository.

naraj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git


The following commit(s) were added to refs/heads/master by this push:
     new 680a32c  [linux] Stability fixes to linux port: npl mutex, queues, and task.
680a32c is described below

commit 680a32ce66839211138a2fa4b5e4773136ccfaea
Author: Martin Turon <mt...@google.com>
AuthorDate: Mon Oct 29 14:55:43 2018 -0700

    [linux] Stability fixes to linux port: npl mutex, queues, and task.
---
 porting/npl/linux/src/os_mutex.c         | 17 +++++++----------
 porting/npl/linux/src/os_task.c          | 14 ++++++--------
 porting/npl/linux/src/os_types.h         |  4 ++++
 porting/npl/linux/src/wqueue.h           | 13 +++++++------
 porting/npl/linux/test/test_npl_eventq.c |  3 ++-
 5 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/porting/npl/linux/src/os_mutex.c b/porting/npl/linux/src/os_mutex.c
index bdc254c..5c6a996 100644
--- a/porting/npl/linux/src/os_mutex.c
+++ b/porting/npl/linux/src/os_mutex.c
@@ -28,14 +28,13 @@
 ble_npl_error_t
 ble_npl_mutex_init(struct ble_npl_mutex *mu)
 {
-    pthread_mutexattr_t mu_attr;
-
     if (!mu) {
         return BLE_NPL_INVALID_PARAM;
     }
 
-    pthread_mutexattr_settype(&mu_attr, PTHREAD_MUTEX_RECURSIVE_NP);
-    pthread_mutex_init(&mu->lock, &mu_attr);
+    pthread_mutexattr_init(&mu->attr);
+    pthread_mutexattr_settype(&mu->attr, PTHREAD_MUTEX_RECURSIVE_NP);
+    pthread_mutex_init(&mu->lock, &mu->attr);
 
     return BLE_NPL_OK;
 }
@@ -57,19 +56,17 @@ ble_npl_mutex_release(struct ble_npl_mutex *mu)
 ble_npl_error_t
 ble_npl_mutex_pend(struct ble_npl_mutex *mu, uint32_t timeout)
 {
-    struct timespec wait;
-
     if (!mu) {
         return BLE_NPL_INVALID_PARAM;
     }
 
     assert(&mu->lock);
 
-    wait.tv_sec  = timeout / 1000;
-    wait.tv_nsec = (timeout % 1000) * 1000000;
-    wait.tv_nsec %= 1000000000;
+    mu->wait.tv_sec  = timeout / 1000;
+    mu->wait.tv_nsec = (timeout % 1000) * 1000000;
+    mu->wait.tv_nsec %= 1000000000;
 
-    if (pthread_mutex_timedlock(&mu->lock, &wait)) {
+    if (pthread_mutex_timedlock(&mu->lock, &mu->wait)) {
         return BLE_NPL_TIMEOUT;
     }
 
diff --git a/porting/npl/linux/src/os_task.c b/porting/npl/linux/src/os_task.c
index 2ba7432..fe6c2df 100644
--- a/porting/npl/linux/src/os_task.c
+++ b/porting/npl/linux/src/os_task.c
@@ -55,20 +55,18 @@ ble_npl_task_init(struct ble_npl_task *t, const char *name, ble_npl_task_func_t
         return OS_INVALID_PARM;
     }
 
-    pthread_attr_t attr;
-    struct sched_param param;
-    err = pthread_attr_init(&attr);
+    err = pthread_attr_init(&t->attr);
     if (err) return err;
-    err = pthread_attr_getschedparam (&attr, &param);
+    err = pthread_attr_getschedparam (&t->attr, &t->param);
     if (err) return err;
-    err = pthread_attr_setschedpolicy(&attr, SCHED_RR);
+    err = pthread_attr_setschedpolicy(&t->attr, SCHED_RR);
     if (err) return err;
-    param.sched_priority = prio;
-    err = pthread_attr_setschedparam (&attr, &param);
+    t->param.sched_priority = prio;
+    err = pthread_attr_setschedparam (&t->attr, &t->param);
     if (err) return err;
 
     t->name = name;
-    err = pthread_create(&t->handle, &attr, func, arg);
+    err = pthread_create(&t->handle, &t->attr, func, arg);
 
     return err;
 }
diff --git a/porting/npl/linux/src/os_types.h b/porting/npl/linux/src/os_types.h
index c88a3e8..c9ab856 100644
--- a/porting/npl/linux/src/os_types.h
+++ b/porting/npl/linux/src/os_types.h
@@ -59,6 +59,8 @@ struct ble_npl_callout {
 
 struct ble_npl_mutex {
     pthread_mutex_t         lock;
+    pthread_mutexattr_t     attr;
+    struct timespec         wait;
 };
 
 struct ble_npl_sem {
@@ -67,6 +69,8 @@ struct ble_npl_sem {
 
 struct ble_npl_task {
     pthread_t               handle;
+    pthread_attr_t          attr;
+    struct sched_param      param;
     const char*             name;
 };
 
diff --git a/porting/npl/linux/src/wqueue.h b/porting/npl/linux/src/wqueue.h
index 0a1e7cc..451cae1 100644
--- a/porting/npl/linux/src/wqueue.h
+++ b/porting/npl/linux/src/wqueue.h
@@ -29,16 +29,17 @@ using namespace std;
 
 template <typename T> class wqueue
 {
-    list<T>         m_queue;
-    pthread_mutex_t m_mutex;
-    pthread_cond_t  m_condv;
+    list<T>              m_queue;
+    pthread_mutex_t      m_mutex;
+    pthread_mutexattr_t  m_mutex_attr;
+    pthread_cond_t       m_condv;
 
 public:
     wqueue()
     {
-        pthread_mutexattr_t attr;
-        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
-        pthread_mutex_init(&m_mutex, &attr);
+        pthread_mutexattr_init(&m_mutex_attr);
+        pthread_mutexattr_settype(&m_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
+        pthread_mutex_init(&m_mutex, &m_mutex_attr);
         pthread_cond_init(&m_condv, NULL);
     }
 
diff --git a/porting/npl/linux/test/test_npl_eventq.c b/porting/npl/linux/test/test_npl_eventq.c
index f2f8381..5b1cded 100644
--- a/porting/npl/linux/test/test_npl_eventq.c
+++ b/porting/npl/linux/test/test_npl_eventq.c
@@ -93,7 +93,8 @@ int test_get_no_wait()
 
 int test_get()
 {
-    struct ble_npl_event *ev = ble_npl_eventq_get(&s_eventq);
+    struct ble_npl_event *ev = ble_npl_eventq_get(&s_eventq,
+						  BLE_NPL_WAIT_FOREVER);
 
     VerifyOrQuit(ev == &s_event,
 		 "callout: wrong event passed");