Mercurial > nomad > old-fuse
changeset 157:6dd1b43f0589
objstore/mem: lock the backend when operating on shared structs
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Sun, 18 Oct 2015 16:20:41 -0400 |
parents | f17edce1a103 |
children | efde22afef53 |
files | src/objstore/mem/main.c |
diffstat | 1 files changed, 19 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/objstore/mem/main.c Sun Oct 18 16:08:37 2015 -0400 +++ b/src/objstore/mem/main.c Sun Oct 18 16:20:41 2015 -0400 @@ -28,6 +28,7 @@ #include <nomad/time.h> #include <nomad/rand.h> #include <nomad/atomic.h> +#include <nomad/mutex.h> #include <nomad/objstore_impl.h> /* each <oid,ver> */ @@ -51,6 +52,8 @@ uint32_t ds; /* our dataset id */ atomic64_t next_oid_uniq; /* the next unique part of noid */ + + pthread_mutex_t lock; }; static int cmp(const void *va, const void *vb) @@ -124,6 +127,8 @@ return PTR_ERR(obj); } + mxinit(&ms->lock); + ms->ds = rand32(); noid_set(&obj->oid, ms->ds, atomic_inc(&ms->next_oid_uniq)); @@ -145,8 +150,10 @@ ms = store->private; + mxlock(&ms->lock); hndl->oid = ms->root->oid; hndl->clock = nvclock_dup(ms->root->ver); + mxunlock(&ms->lock); if (!hndl->clock) return ENOMEM; @@ -160,6 +167,7 @@ struct memstore *ms; struct memobj *obj; struct memobj key; + int ret; if (!vol || !hndl || !attr) return EINVAL; @@ -169,13 +177,19 @@ key.oid = hndl->oid; key.ver = hndl->clock; - obj = avl_find(&ms->objs, &key, NULL); - if (!obj) - return ENOENT; + mxlock(&ms->lock); - *attr = obj->attrs; + obj = avl_find(&ms->objs, &key, NULL); + if (!obj) { + ret = ENOENT; + } else { + ret = 0; + *attr = obj->attrs; + } - return 0; + mxunlock(&ms->lock); + + return ret; } static const struct vol_ops vol_ops = {