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/Makefile.am | 4 +- libglusterfs/src/globals.c | 166 +++++++++++++++++++++++++++++++++++++++++++ libglusterfs/src/globals.h | 41 +++++++++++ 3 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 libglusterfs/src/globals.c create mode 100644 libglusterfs/src/globals.h (limited to 'libglusterfs') diff --git a/libglusterfs/src/Makefile.am b/libglusterfs/src/Makefile.am index 8ff35fbb27a..7698661fa42 100644 --- a/libglusterfs/src/Makefile.am +++ b/libglusterfs/src/Makefile.am @@ -6,9 +6,9 @@ libglusterfs_la_LIBADD = @LEXLIB@ lib_LTLIBRARIES = libglusterfs.la -libglusterfs_la_SOURCES = dict.c spec.lex.c y.tab.c xlator.c logging.c hashfn.c defaults.c scheduler.c common-utils.c transport.c timer.c inode.c call-stub.c compat.c authenticate.c fd.c compat-errno.c event.c mem-pool.c gf-dirent.c syscall.c iobuf.c +libglusterfs_la_SOURCES = dict.c spec.lex.c y.tab.c xlator.c logging.c hashfn.c defaults.c scheduler.c common-utils.c transport.c timer.c inode.c call-stub.c compat.c authenticate.c fd.c compat-errno.c event.c mem-pool.c gf-dirent.c syscall.c iobuf.c globals.c -noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h logging.h protocol.h scheduler.h xlator.h transport.h stack.h timer.h list.h inode.h call-stub.h compat.h authenticate.h fd.h revision.h compat-errno.h event.h mem-pool.h byte-order.h gf-dirent.h locking.h syscall.h iobuf.h +noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h logging.h protocol.h scheduler.h xlator.h transport.h stack.h timer.h list.h inode.h call-stub.h compat.h authenticate.h fd.h revision.h compat-errno.h event.h mem-pool.h byte-order.h gf-dirent.h locking.h syscall.h iobuf.h globals.h EXTRA_DIST = spec.l spec.y 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. + 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; +} diff --git a/libglusterfs/src/globals.h b/libglusterfs/src/globals.h new file mode 100644 index 00000000000..f4d252dd9b5 --- /dev/null +++ b/libglusterfs/src/globals.h @@ -0,0 +1,41 @@ +/* + 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 _GLOBALS_H +#define _GLOBALS_H + +#include "glusterfs.h" +#include "xlator.h" + +/* CTX */ +#define CTX (glusterfs_ctx_get()) + +glusterfs_ctx_t *glusterfs_ctx_get (); + +/* THIS */ +#define THIS (*__glusterfs_this_location()) + +xlator_t **__glusterfs_this_location (); +xlator_t *glusterfs_this_get (); +int glusterfs_this_set (xlator_t *); + +/* init */ +int glusterfs_globals_init (void); + +#endif /* !_GLOBALS_H */ -- cgit