From 207fb347ed24716ac4f443bab2d1daeb9ae5ccf4 Mon Sep 17 00:00:00 2001 From: "Anand V. Avati" Date: Fri, 22 May 2009 02:10:21 +0000 Subject: globals: add globals.h/c THIS: macro to access thread specific current xlator CTX: macro to access glusterfs global context (glusterfs_ctx_t) Signed-off-by: Anand V. Avati Signed-off-by: Anand V. Avati --- libglusterfs/src/globals.c | 166 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 libglusterfs/src/globals.c (limited to 'libglusterfs/src/globals.c') diff --git a/libglusterfs/src/globals.c b/libglusterfs/src/globals.c new file mode 100644 index 00000000..38727a25 --- /dev/null +++ b/libglusterfs/src/globals.c @@ -0,0 +1,166 @@ +/* + Copyright (c) 2009 Z RESEARCH, Inc. + 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 + . +*/ + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif /* !_CONFIG_H */ + +#include + +#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; +} -- cgit