summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVikas Gorur <vikas@gluster.com>2009-04-07 03:27:24 -0700
committerAnand V. Avati <avati@amp.gluster.com>2009-04-07 16:01:42 +0530
commitd71e72248096d12ce2a8ca7ccb36ef97ae486583 (patch)
tree22e950f26c76f9fa38fbc746e7167799b61521b6
parent27996c714f7fd6a7686f2d4a3552efbc1e54c2c7 (diff)
Add lock-less versions of fd_ctx_*
Added __fd_ctx_get __fd_ctx_set __fd_ctx_del which do not hold any lock. Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
-rw-r--r--libglusterfs/src/fd.c147
-rw-r--r--libglusterfs/src/fd.h9
2 files changed, 104 insertions, 52 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c
index deb3c800145..fc78acc7caa 100644
--- a/libglusterfs/src/fd.c
+++ b/libglusterfs/src/fd.c
@@ -586,7 +586,7 @@ fd_list_empty (inode_t *inode)
}
int
-fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)
+__fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)
{
int index = 0;
int ret = 0;
@@ -595,37 +595,52 @@ fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)
if (!fd || !xlator)
return -1;
- LOCK (&fd->lock);
- {
- for (index = 0; index < xlator->ctx->xl_count; index++) {
- if (!fd->_ctx[index].key) {
- if (set_idx == -1)
- set_idx = index;
- /* dont break, to check if key already exists
- further on */
- }
- if (fd->_ctx[index].key == (uint64_t)(long) xlator) {
+ for (index = 0; index < xlator->ctx->xl_count; index++) {
+ if (!fd->_ctx[index].key) {
+ if (set_idx == -1)
set_idx = index;
- break;
- }
+ /* dont break, to check if key already exists
+ further on */
}
-
- if (set_idx == -1) {
- ret = -1;
- goto unlock;
+ if (fd->_ctx[index].key == (uint64_t)(long) xlator) {
+ set_idx = index;
+ break;
}
+ }
+
+ if (set_idx == -1) {
+ ret = -1;
+ goto out;
+ }
+
+ fd->_ctx[set_idx].key = (uint64_t)(long) xlator;
+ fd->_ctx[set_idx].value = value;
+
+out:
+ return ret;
+}
+
+
+int
+fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)
+{
+ int ret = 0;
- fd->_ctx[set_idx].key = (uint64_t)(long) xlator;
- fd->_ctx[set_idx].value = value;
+ if (!fd || !xlator)
+ return -1;
+
+ LOCK (&fd->lock);
+ {
+ ret = __fd_ctx_set (fd, xlator, value);
}
-unlock:
UNLOCK (&fd->lock);
- return ret;
+ return ret;
}
+
int
-fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value)
+__fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value)
{
int index = 0;
int ret = 0;
@@ -633,24 +648,68 @@ fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value)
if (!fd || !xlator)
return -1;
+ for (index = 0; index < xlator->ctx->xl_count; index++) {
+ if (fd->_ctx[index].key == (uint64_t)(long)xlator)
+ break;
+ }
+
+ if (index == xlator->ctx->xl_count) {
+ ret = -1;
+ goto out;
+ }
+
+ if (value)
+ *value = fd->_ctx[index].value;
+
+out:
+ return ret;
+}
+
+
+int
+fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value)
+{
+ int ret = 0;
+
+ if (!fd || !xlator)
+ return -1;
+
LOCK (&fd->lock);
{
- for (index = 0; index < xlator->ctx->xl_count; index++) {
- if (fd->_ctx[index].key == (uint64_t)(long)xlator)
- break;
- }
+ ret = __fd_ctx_get (fd, xlator, value);
+ }
+ UNLOCK (&fd->lock);
- if (index == xlator->ctx->xl_count) {
- ret = -1;
- goto unlock;
- }
+ return ret;
+}
+
+
+int
+__fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value)
+{
+ int index = 0;
+ int ret = 0;
- if (value)
- *value = fd->_ctx[index].value;
+ if (!fd || !xlator)
+ return -1;
+
+ for (index = 0; index < xlator->ctx->xl_count; index++) {
+ if (fd->_ctx[index].key == (uint64_t)(long)xlator)
+ break;
}
-unlock:
- UNLOCK (&fd->lock);
+
+ if (index == xlator->ctx->xl_count) {
+ ret = -1;
+ goto out;
+ }
+
+ if (value)
+ *value = fd->_ctx[index].value;
+
+ fd->_ctx[index].key = 0;
+ fd->_ctx[index].value = 0;
+out:
return ret;
}
@@ -658,7 +717,6 @@ unlock:
int
fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value)
{
- int index = 0;
int ret = 0;
if (!fd || !xlator)
@@ -666,24 +724,9 @@ fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value)
LOCK (&fd->lock);
{
- for (index = 0; index < xlator->ctx->xl_count; index++) {
- if (fd->_ctx[index].key == (uint64_t)(long)xlator)
- break;
- }
-
- if (index == xlator->ctx->xl_count) {
- ret = -1;
- goto unlock;
- }
-
- if (value)
- *value = fd->_ctx[index].value;
-
- fd->_ctx[index].key = 0;
- fd->_ctx[index].value = 0;
+ ret = __fd_ctx_del (fd, xlator, value);
}
-unlock:
UNLOCK (&fd->lock);
- return ret;
+ return ret;
}
diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h
index 2916a44812e..d3c9afde3f9 100644
--- a/libglusterfs/src/fd.h
+++ b/libglusterfs/src/fd.h
@@ -110,4 +110,13 @@ fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value);
int
fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value);
+int
+__fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value);
+
+int
+__fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value);
+
+int
+__fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value);
+
#endif /* _FD_H */