diff options
-rw-r--r-- | api/src/glfs.c | 8 | ||||
-rw-r--r-- | cli/src/cli.c | 2 | ||||
-rw-r--r-- | glusterfsd/src/glusterfsd.c | 2 | ||||
-rw-r--r-- | libglusterfs/src/ctx.c | 3 | ||||
-rw-r--r-- | libglusterfs/src/glusterfs.h | 3 | ||||
-rw-r--r-- | libglusterfs/src/timer.c | 128 | ||||
-rw-r--r-- | libglusterfs/src/timer.h | 10 | ||||
-rw-r--r-- | rpc/rpc-transport/rdma/src/rdma.c | 4 | ||||
-rw-r--r-- | xlators/features/changelog/lib/src/gf-changelog.c | 2 |
9 files changed, 86 insertions, 76 deletions
diff --git a/api/src/glfs.c b/api/src/glfs.c index 0d67ce1a86c..1cb6bf7a3cf 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -149,7 +149,7 @@ glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx) LOCK_INIT (&pool->lock); ctx->pool = pool; - pthread_mutex_init (&(ctx->lock), NULL); + LOCK_INIT (&ctx->lock); ret = 0; err: @@ -1059,9 +1059,9 @@ glusterfs_ctx_destroy (glusterfs_ctx_t *ctx) GF_FREE (ctx->process_uuid); GF_FREE (ctx->cmd_args.volfile_id); - pthread_mutex_destroy (&(ctx->lock)); - pthread_mutex_destroy (&(ctx->notify_lock)); - pthread_cond_destroy (&(ctx->notify_cond)); + LOCK_DESTROY (&ctx->lock); + pthread_mutex_destroy (&ctx->notify_lock); + pthread_cond_destroy (&ctx->notify_cond); /* Free all the graph structs and its containing xlator_t structs * from this point there should be no reference to GF_FREE/GF_CALLOC diff --git a/cli/src/cli.c b/cli/src/cli.c index 923748b4594..518ae265f22 100644 --- a/cli/src/cli.c +++ b/cli/src/cli.c @@ -154,7 +154,7 @@ glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx) LOCK_INIT (&pool->lock); ctx->pool = pool; - pthread_mutex_init (&(ctx->lock), NULL); + LOCK_INIT (&ctx->lock); cmd_args = &ctx->cmd_args; diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index d8bc01337b7..0cf1763bdf0 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1493,7 +1493,7 @@ glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx) if (!ctx->logbuf_pool) goto out; - pthread_mutex_init (&(ctx->lock), NULL); + LOCK_INIT (&ctx->lock); pthread_mutex_init (&ctx->notify_lock, NULL); pthread_cond_init (&ctx->notify_cond, NULL); diff --git a/libglusterfs/src/ctx.c b/libglusterfs/src/ctx.c index c70d97bc5d4..2aa14654b9e 100644 --- a/libglusterfs/src/ctx.c +++ b/libglusterfs/src/ctx.c @@ -35,7 +35,8 @@ glusterfs_ctx_new () ctx->daemon_pipe[0] = -1; ctx->daemon_pipe[1] = -1; - ret = pthread_mutex_init (&ctx->lock, NULL); + /* lock is never destroyed! */ + ret = LOCK_INIT (&ctx->lock); if (ret) { free (ctx); ctx = NULL; diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index d5fde68d76a..610dfc9e7d9 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -32,6 +32,7 @@ #include "glusterfs-fops.h" /* generated XDR values for FOPs */ #include "list.h" +#include "locking.h" #include "logging.h" #include "lkowner.h" #include "compat-uuid.h" @@ -428,7 +429,7 @@ struct _glusterfs_ctx { void *event_pool; void *iobuf_pool; void *logbuf_pool; - pthread_mutex_t lock; + gf_lock_t lock; size_t page_size; struct list_head graphs; /* double linked list of graphs - one per volfile parse */ glusterfs_graph_t *active; /* the latest graph in use */ diff --git a/libglusterfs/src/timer.c b/libglusterfs/src/timer.c index a072985acce..bcdc5da5571 100644 --- a/libglusterfs/src/timer.c +++ b/libglusterfs/src/timer.c @@ -15,6 +15,10 @@ #include "timespec.h" #include "libglusterfs-messages.h" +/* fwd decl */ +static gf_timer_registry_t * +gf_timer_registry_init (glusterfs_ctx_t *); + gf_timer_t * gf_timer_call_after (glusterfs_ctx_t *ctx, struct timespec delta, @@ -33,17 +37,6 @@ gf_timer_call_after (glusterfs_ctx_t *ctx, return NULL; } - /* ctx and its fields are not accessed inside mutex!? - * TODO: Even with this there is a possiblity of race - * when cleanup_started is set after checking for it - */ - if (ctx->cleanup_started) { - gf_msg_callingfn ("timer", GF_LOG_INFO, 0, - LG_MSG_CTX_CLEANUP_STARTED, "ctx cleanup " - "started"); - return NULL; - } - reg = gf_timer_registry_init (ctx); if (!reg) { @@ -62,7 +55,7 @@ gf_timer_call_after (glusterfs_ctx_t *ctx, event->callbk = callbk; event->data = data; event->xl = THIS; - pthread_mutex_lock (®->lock); + LOCK (®->lock); { trav = reg->active.prev; while (trav != ®->active) { @@ -75,10 +68,11 @@ gf_timer_call_after (glusterfs_ctx_t *ctx, event->prev->next = event; event->next->prev = event; } - pthread_mutex_unlock (®->lock); + UNLOCK (®->lock); return event; } + int32_t gf_timer_call_cancel (glusterfs_ctx_t *ctx, gf_timer_t *event) @@ -93,7 +87,12 @@ gf_timer_call_cancel (glusterfs_ctx_t *ctx, return 0; } - reg = gf_timer_registry_init (ctx); + LOCK (&ctx->lock); + { + reg = ctx->timer; + } + UNLOCK (&ctx->lock); + if (!reg) { gf_msg ("timer", GF_LOG_ERROR, 0, LG_MSG_INIT_TIMER_FAILED, "!reg"); @@ -101,53 +100,42 @@ gf_timer_call_cancel (glusterfs_ctx_t *ctx, return 0; } - pthread_mutex_lock (®->lock); + LOCK (®->lock); { - fired = event->fired; - if (fired) - goto unlock; + fired = event->fired; + if (fired) + goto unlock; event->next->prev = event->prev; event->prev->next = event->next; } unlock: - pthread_mutex_unlock (®->lock); + UNLOCK (®->lock); - if (!fired) { - GF_FREE (event); - return 0; + if (!fired) { + GF_FREE (event); + return 0; } return -1; } -static void __delete_entry (gf_timer_t *event) { + +static void +__delete_entry (gf_timer_t *event) { event->next->prev = event->prev; event->prev->next = event->next; GF_FREE (event); } -void * -gf_timer_proc (void *ctx) + +static void * +gf_timer_proc (void *data) { - gf_timer_registry_t *reg = NULL; + gf_timer_registry_t *reg = data; const struct timespec sleepts = {.tv_sec = 1, .tv_nsec = 0, }; gf_timer_t *event = NULL; xlator_t *old_THIS = NULL; - if (ctx == NULL) - { - gf_msg_callingfn ("timer", GF_LOG_ERROR, EINVAL, - LG_MSG_INVALID_ARG, "invalid argument"); - return NULL; - } - - reg = gf_timer_registry_init (ctx); - if (!reg) { - gf_msg ("timer", GF_LOG_ERROR, 0, LG_MSG_INIT_TIMER_FAILED, - "!reg"); - return NULL; - } - while (!reg->fin) { uint64_t now; struct timespec now_ts; @@ -158,7 +146,7 @@ gf_timer_proc (void *ctx) uint64_t at; char need_cbk = 0; - pthread_mutex_lock (®->lock); + LOCK (®->lock); { event = reg->active.next; at = TS (event->at); @@ -169,7 +157,7 @@ gf_timer_proc (void *ctx) event->fired = _gf_true; } } - pthread_mutex_unlock (®->lock); + UNLOCK (®->lock); if (need_cbk) { old_THIS = NULL; if (event->xl) { @@ -188,7 +176,7 @@ gf_timer_proc (void *ctx) nanosleep (&sleepts, NULL); } - pthread_mutex_lock (®->lock); + LOCK (®->lock); { /* Do not call gf_timer_call_cancel(), * it will lead to deadlock @@ -200,42 +188,58 @@ gf_timer_proc (void *ctx) __delete_entry (event); } } - pthread_mutex_unlock (®->lock); - pthread_mutex_destroy (®->lock); - GF_FREE (((glusterfs_ctx_t *)ctx)->timer); + UNLOCK (®->lock); + LOCK_DESTROY (®->lock); return NULL; } -gf_timer_registry_t * + +static gf_timer_registry_t * gf_timer_registry_init (glusterfs_ctx_t *ctx) { + gf_timer_registry_t *reg = NULL; + if (ctx == NULL) { gf_msg_callingfn ("timer", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG, "invalid argument"); return NULL; } - if (!ctx->timer) { - gf_timer_registry_t *reg = NULL; + if (ctx->cleanup_started) { + gf_msg_callingfn ("timer", GF_LOG_INFO, 0, + LG_MSG_CTX_CLEANUP_STARTED, + "ctx cleanup started"); + return NULL; + } + LOCK (&ctx->lock); + { + reg = ctx->timer; + } + UNLOCK (&ctx->lock); + if (!reg) { reg = GF_CALLOC (1, sizeof (*reg), gf_common_mt_gf_timer_registry_t); if (!reg) - goto out; + return NULL; - pthread_mutex_init (®->lock, NULL); + LOCK_INIT (®->lock); reg->active.next = ®->active; reg->active.prev = ®->active; - ctx->timer = reg; - gf_thread_create (®->th, NULL, gf_timer_proc, ctx); - + LOCK (&ctx->lock); + { + ctx->timer = reg; + } + UNLOCK (&ctx->lock); + gf_thread_create (®->th, NULL, gf_timer_proc, reg); } -out: - return ctx->timer; + + return reg; } + void gf_timer_registry_destroy (glusterfs_ctx_t *ctx) { @@ -245,8 +249,18 @@ gf_timer_registry_destroy (glusterfs_ctx_t *ctx) if (ctx == NULL) return; - reg = ctx->timer; + LOCK (&ctx->lock); + { + reg = ctx->timer; + ctx->timer = NULL; + } + UNLOCK (&ctx->lock); + + if (!reg) + return; + thr_id = reg->th; reg->fin = 1; pthread_join (thr_id, NULL); + GF_FREE (reg); } diff --git a/libglusterfs/src/timer.h b/libglusterfs/src/timer.h index fff902814ed..0224b0897f9 100644 --- a/libglusterfs/src/timer.h +++ b/libglusterfs/src/timer.h @@ -20,7 +20,7 @@ typedef void (*gf_timer_cbk_t) (void *); struct _gf_timer { struct _gf_timer *next, *prev; - struct timespec at; + struct timespec at; gf_timer_cbk_t callbk; void *data; xlator_t *xl; @@ -31,7 +31,7 @@ struct _gf_timer_registry { pthread_t th; char fin; struct _gf_timer active; - pthread_mutex_t lock; + gf_lock_t lock; }; typedef struct _gf_timer gf_timer_t; @@ -47,12 +47,6 @@ int32_t gf_timer_call_cancel (glusterfs_ctx_t *ctx, gf_timer_t *event); -void * -gf_timer_proc (void *data); - -gf_timer_registry_t * -gf_timer_registry_init (glusterfs_ctx_t *ctx); - void gf_timer_registry_destroy (glusterfs_ctx_t *ctx); #endif /* _TIMER_H */ diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c index 1f397e42206..551ac072079 100644 --- a/rpc/rpc-transport/rdma/src/rdma.c +++ b/rpc/rpc-transport/rdma/src/rdma.c @@ -4641,7 +4641,7 @@ gf_rdma_init (rpc_transport_t *this) pthread_mutex_init (&priv->recv_mutex, NULL); pthread_cond_init (&priv->recv_cond, NULL); - pthread_mutex_lock (&ctx->lock); + LOCK (&ctx->lock); { if (ctx->ib == NULL) { ctx->ib = __gf_rdma_ctx_create (); @@ -4650,7 +4650,7 @@ gf_rdma_init (rpc_transport_t *this) } } } - pthread_mutex_unlock (&ctx->lock); + UNLOCK (&ctx->lock); return ret; } diff --git a/xlators/features/changelog/lib/src/gf-changelog.c b/xlators/features/changelog/lib/src/gf-changelog.c index 165703d3aa6..75891635827 100644 --- a/xlators/features/changelog/lib/src/gf-changelog.c +++ b/xlators/features/changelog/lib/src/gf-changelog.c @@ -145,7 +145,7 @@ gf_changelog_ctx_defaults_init (glusterfs_ctx_t *ctx) LOCK_INIT (&pool->lock); ctx->pool = pool; - pthread_mutex_init (&(ctx->lock), NULL); + LOCK_INIT (&ctx->lock); cmd_args = &ctx->cmd_args; |