diff options
| author | Garrett D'Amore <garrett@damore.org> | 2017-01-19 13:47:47 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2017-01-19 13:47:47 -0800 |
| commit | 70c6f49a552b97b455d9f9c4419129463a30847d (patch) | |
| tree | e5512a48a48f62e152e29e2aeb7be8d685e2f341 /src | |
| parent | 09e7b2f6fa394943a151c79e3b1086834f643497 (diff) | |
| download | nng-70c6f49a552b97b455d9f9c4419129463a30847d.tar.gz nng-70c6f49a552b97b455d9f9c4419129463a30847d.tar.bz2 nng-70c6f49a552b97b455d9f9c4419129463a30847d.zip | |
Thread fini shouldl be idempotent.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/endpt.c | 14 | ||||
| -rw-r--r-- | src/core/thread.c | 4 |
2 files changed, 8 insertions, 10 deletions
diff --git a/src/core/endpt.c b/src/core/endpt.c index 2366a8e8..5a642a2f 100644 --- a/src/core/endpt.c +++ b/src/core/endpt.c @@ -93,10 +93,7 @@ nni_ep_close(nni_ep *ep) nni_mtx *mx = &ep->ep_sock->s_mx; nni_mtx_lock(mx); - if (ep->ep_close) { - nni_mtx_unlock(mx); - return; - } + NNI_ASSERT(ep->ep_close == 0); ep->ep_close = 1; ep->ep_ops.ep_close(ep->ep_data); if ((pipe = ep->ep_pipe) != NULL) { @@ -104,20 +101,17 @@ nni_ep_close(nni_ep *ep) ep->ep_pipe = NULL; } nni_cv_wake(&ep->ep_cv); - nni_list_remove(&ep->ep_sock->s_eps, ep); nni_mtx_unlock(mx); - if (ep->ep_mode != NNI_EP_MODE_IDLE) { - nni_thr_fini(&ep->ep_thr); - } - + nni_thr_fini(&ep->ep_thr); ep->ep_ops.ep_fini(ep->ep_data); - nni_cv_fini(&ep->ep_cv); nni_mtx_lock(nni_idlock); + nni_list_remove(&ep->ep_sock->s_eps, ep); nni_idhash_remove(nni_endpoints, ep->ep_id); nni_mtx_unlock(nni_idlock); + nni_cv_fini(&ep->ep_cv); NNI_FREE_STRUCT(ep); } diff --git a/src/core/thread.c b/src/core/thread.c index 91bacdec..74a434f9 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -152,6 +152,9 @@ nni_thr_run(nni_thr *thr) void nni_thr_wait(nni_thr *thr) { + if (!thr->init) { + return; + } nni_plat_mtx_lock(&thr->mtx); thr->stop = 1; nni_plat_cv_wake(&thr->cv); @@ -181,4 +184,5 @@ nni_thr_fini(nni_thr *thr) nni_plat_cv_fini(&thr->cv); nni_plat_mtx_fini(&thr->mtx); + thr->init = 0; } |
