summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-12-27 00:00:57 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-12-27 00:00:57 +0100
commit03be85eb11f756414aafedca22f93a3351b727b8 (patch)
tree8657bee4e525bdc1f8fe640d44055dcca8857dc2
parent07440b75bcbd20056c11f2375d3aa765788af034 (diff)
Optimise dir-lookup's second-lock
This should avoid some lock contention. * libdiskfs/dir-lookup.c (diskfs_S_dir_lookup): Before releasing &np->lock to get &dnp->lock safely, try to lock &dnp->lock directly. * libtreefs/dir-lookup.c (_treefs_s_dir_lookup): Likewise.
-rw-r--r--libdiskfs/dir-lookup.c9
-rw-r--r--libtreefs/dir-lookup.c9
2 files changed, 12 insertions, 6 deletions
diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c
index 1efdf75c..923be033 100644
--- a/libdiskfs/dir-lookup.c
+++ b/libdiskfs/dir-lookup.c
@@ -310,9 +310,12 @@ diskfs_S_dir_lookup (struct protid *dircred,
pthread_mutex_lock (&dnp->lock);
else
{
- pthread_mutex_unlock (&np->lock);
- pthread_mutex_lock (&dnp->lock);
- pthread_mutex_lock (&np->lock);
+ if (pthread_mutex_trylock (&dnp->lock))
+ {
+ pthread_mutex_unlock (&np->lock);
+ pthread_mutex_lock (&dnp->lock);
+ pthread_mutex_lock (&np->lock);
+ }
}
}
}
diff --git a/libtreefs/dir-lookup.c b/libtreefs/dir-lookup.c
index ce2acafd..8665059c 100644
--- a/libtreefs/dir-lookup.c
+++ b/libtreefs/dir-lookup.c
@@ -199,9 +199,12 @@ _treefs_s_dir_lookup (struct treefs_handle *h,
in the right order. */
if (strcmp (path, "..") != 0)
{
- pthread_mutex_unlock (&node->lock);
- pthread_mutex_lock (&dir->lock);
- pthread_mutex_lock (&node->lock);
+ if (pthread_mutex_trylock (&dir->lock))
+ {
+ pthread_mutex_unlock (&node->lock);
+ pthread_mutex_lock (&dir->lock);
+ pthread_mutex_lock (&node->lock);
+ }
}
else
pthread_mutex_lock (&dir->lock);