diff options
Diffstat (limited to 'libglusterfs/src/globals.c')
| -rw-r--r-- | libglusterfs/src/globals.c | 166 | 
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; +}  | 
