X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Fqueue.c;h=78444d8ede48695d4780a81214955d4966d6b696;hb=3e147f08efc82c1c9d131bd03ee2efd493775570;hp=4d37a5f7810c0032ac09419ea90a95097e51fd98;hpb=fea813ae3de5343a2bc91306fddf6dbd1832f93d;p=vpp.git diff --git a/src/svm/queue.c b/src/svm/queue.c index 4d37a5f7810..78444d8ede4 100644 --- a/src/svm/queue.c +++ b/src/svm/queue.c @@ -51,6 +51,8 @@ svm_queue_init (void *base, int nels, int elsize) clib_unix_warning ("mutexattr_init"); if (pthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED)) clib_unix_warning ("pthread_mutexattr_setpshared"); + if (pthread_mutexattr_setrobust (&attr, PTHREAD_MUTEX_ROBUST)) + clib_unix_warning ("setrobust"); if (pthread_mutex_init (&q->mutex, &attr)) clib_unix_warning ("mutex_init"); if (pthread_mutexattr_destroy (&attr)) @@ -96,7 +98,18 @@ svm_queue_free (svm_queue_t * q) void svm_queue_lock (svm_queue_t * q) { - pthread_mutex_lock (&q->mutex); + int rv = pthread_mutex_lock (&q->mutex); + if (PREDICT_FALSE (rv == EOWNERDEAD)) + pthread_mutex_consistent (&q->mutex); +} + +static int +svm_queue_trylock (svm_queue_t * q) +{ + int rv = pthread_mutex_trylock (&q->mutex); + if (PREDICT_FALSE (rv == EOWNERDEAD)) + rv = pthread_mutex_consistent (&q->mutex); + return rv; } void @@ -125,8 +138,8 @@ svm_queue_send_signal_inline (svm_queue_t * q, u8 is_prod) ASSERT (q->consumer_evtfd > 0 && q->producer_evtfd > 0); fd = is_prod ? q->producer_evtfd : q->consumer_evtfd; rv = write (fd, &data, sizeof (data)); - if (PREDICT_FALSE (rv)) - clib_unix_warning ("signal write returned %d", rv); + if (PREDICT_FALSE (rv < 0)) + clib_unix_warning ("signal write on %d returned %d", fd, rv); } } @@ -252,7 +265,7 @@ svm_queue_add (svm_queue_t * q, u8 * elem, int nowait) if (nowait) { /* zero on success */ - if (pthread_mutex_trylock (&q->mutex)) + if (svm_queue_trylock (q)) { return (-1); } @@ -302,7 +315,7 @@ svm_queue_add2 (svm_queue_t * q, u8 * elem, u8 * elem2, int nowait) if (nowait) { /* zero on success */ - if (pthread_mutex_trylock (&q->mutex)) + if (svm_queue_trylock (q)) { return (-1); } @@ -310,14 +323,14 @@ svm_queue_add2 (svm_queue_t * q, u8 * elem, u8 * elem2, int nowait) else svm_queue_lock (q); - if (PREDICT_FALSE (q->cursize + 1 == q->maxsize)) + if (PREDICT_FALSE (q->cursize + 1 >= q->maxsize)) { if (nowait) { svm_queue_unlock (q); return (-2); } - while (q->cursize + 1 == q->maxsize) + while (q->cursize + 1 >= q->maxsize) svm_queue_wait_inline (q); } @@ -363,7 +376,7 @@ svm_queue_sub (svm_queue_t * q, u8 * elem, svm_q_conditional_wait_t cond, if (cond == SVM_Q_NOWAIT) { /* zero on success */ - if (pthread_mutex_trylock (&q->mutex)) + if (svm_queue_trylock (q)) { return (-1); }