summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/globals.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/globals.c')
-rw-r--r--libglusterfs/src/globals.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/libglusterfs/src/globals.c b/libglusterfs/src/globals.c
new file mode 100644
index 00000000000..38727a25afe
--- /dev/null
+++ b/libglusterfs/src/globals.c
@@ -0,0 +1,166 @@
+/*
+ Copyright (c) 2009 Z RESEARCH, Inc. <http://www.zresearch.com>
+ This file is part of GlusterFS.
+
+ GlusterFS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3 of the License,
+ or (at your option) any later version.
+
+ GlusterFS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see
+ <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _CONFIG_H
+#define _CONFIG_H
+#include "config.h"
+#endif /* !_CONFIG_H */
+
+#include <pthread.h>
+
+#include "globals.h"
+#include "glusterfs.h"
+#include "xlator.h"
+
+
+/* CTX */
+static glusterfs_ctx_t *glusterfs_ctx;
+
+
+int
+glusterfs_ctx_init ()
+{
+ int ret = 0;
+
+ if (glusterfs_ctx)
+ goto out;
+
+ glusterfs_ctx = CALLOC (1, sizeof (*glusterfs_ctx));
+ if (!glusterfs_ctx) {
+ ret = -1;
+ goto out;
+ }
+
+ ret = pthread_mutex_init (&glusterfs_ctx->lock, NULL);
+
+out:
+ return ret;
+}
+
+
+glusterfs_ctx_t *
+glusterfs_ctx_get ()
+{
+ return glusterfs_ctx;
+
+}
+
+
+/* THIS */
+
+xlator_t global_xlator;
+static pthread_key_t this_xlator_key;
+
+void
+glusterfs_this_destroy (void *ptr)
+{
+ if (ptr)
+ FREE (ptr);
+}
+
+
+int
+glusterfs_this_init ()
+{
+ int ret = 0;
+
+ ret = pthread_key_create (&this_xlator_key, glusterfs_this_destroy);
+ if (ret != 0) {
+ return ret;
+ }
+
+ global_xlator.name = "glusterfs";
+ global_xlator.type = "global";
+
+ return ret;
+}
+
+
+xlator_t **
+__glusterfs_this_location ()
+{
+ xlator_t **this_location = NULL;
+ int ret = 0;
+
+ this_location = pthread_getspecific (this_xlator_key);
+
+ if (!this_location) {
+ this_location = CALLOC (1, sizeof (*this_location));
+ if (!this_location)
+ goto out;
+
+ ret = pthread_setspecific (this_xlator_key, this_location);
+ if (ret != 0) {
+ FREE (this_location);
+ this_location = NULL;
+ goto out;
+ }
+ }
+out:
+ if (this_location) {
+ if (!*this_location)
+ *this_location = &global_xlator;
+ }
+ return this_location;
+}
+
+
+xlator_t *
+glusterfs_this_get ()
+{
+ xlator_t **this_location = NULL;
+
+ this_location = __glusterfs_this_location ();
+ if (!this_location)
+ return &global_xlator;
+
+ return *this_location;
+}
+
+
+int
+glusterfs_this_set (xlator_t *this)
+{
+ xlator_t **this_location = NULL;
+
+ this_location = __glusterfs_this_location ();
+ if (!this_location)
+ return -ENOMEM;
+
+ *this_location = this;
+
+ return 0;
+}
+
+
+int
+glusterfs_globals_init ()
+{
+ int ret = 0;
+
+ ret = glusterfs_ctx_init ();
+ if (ret)
+ goto out;
+
+ ret = glusterfs_this_init ();
+ if (ret)
+ goto out;
+out:
+ return ret;
+}