summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/graph.y
diff options
context:
space:
mode:
authorAnand Avati <avati@redhat.com>2013-08-28 18:38:26 -0700
committerAnand Avati <avati@gluster.org>2013-09-06 17:54:10 -0700
commit2347a1a7594dafc1e6a74784287efe84963fe4ea (patch)
tree1e9e6f7aae96b92dc429f9d8b3285099944c79d8 /libglusterfs/src/graph.y
parent1955f7dc84239f23660e23e637f9ddcc672cbeb7 (diff)
parser: make the parser thread safe.
The volfile parser thread safe by guarding the parsing phase in a mutex. Thread safety becomes a problem when there are multiple glfs_t objects created by gfapi and all of them potentially parse the respective volfiles at the same time. Change-Id: I4376019c4956994b72397ab36e6ac3ce849797ec BUG: 1004519 Signed-off-by: Anand Avati <avati@redhat.com> Reviewed-on: http://review.gluster.org/5790 Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Anand Avati <avati@gluster.org>
Diffstat (limited to 'libglusterfs/src/graph.y')
-rw-r--r--libglusterfs/src/graph.y14
1 files changed, 10 insertions, 4 deletions
diff --git a/libglusterfs/src/graph.y b/libglusterfs/src/graph.y
index e2f16ff714b..282cee3817c 100644
--- a/libglusterfs/src/graph.y
+++ b/libglusterfs/src/graph.y
@@ -18,6 +18,7 @@
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <pthread.h>
#define RELAX_POISONING
@@ -557,6 +558,7 @@ glusterfs_graph_construct (FILE *fp)
glusterfs_graph_t *graph = NULL;
FILE *tmp_file = NULL;
char template[PATH_MAX] = {0};
+ static pthread_mutex_t graph_mutex = PTHREAD_MUTEX_INITIALIZER;
graph = glusterfs_graph_new ();
if (!graph)
@@ -583,10 +585,14 @@ glusterfs_graph_construct (FILE *fp)
goto err;
}
- yyin = tmp_file;
- construct = graph;
- ret = yyparse ();
- construct = NULL;
+ pthread_mutex_lock (&graph_mutex);
+ {
+ yyin = tmp_file;
+ construct = graph;
+ ret = yyparse ();
+ construct = NULL;
+ }
+ pthread_mutex_unlock (&graph_mutex);
if (ret == 1) {
gf_log ("parser", GF_LOG_DEBUG,