diff options
| author | Vikas Gorur <vikas@zresearch.com> | 2009-02-18 17:36:07 +0530 | 
|---|---|---|
| committer | Vikas Gorur <vikas@zresearch.com> | 2009-02-18 17:36:07 +0530 | 
| commit | 77adf4cd648dce41f89469dd185deec6b6b53a0b (patch) | |
| tree | 02e155a5753b398ee572b45793f889b538efab6b /libglusterfsclient/src/libglusterfsclient-internals.h | |
| parent | f3b2e6580e5663292ee113c741343c8a43ee133f (diff) | |
Added all files
Diffstat (limited to 'libglusterfsclient/src/libglusterfsclient-internals.h')
| -rwxr-xr-x | libglusterfsclient/src/libglusterfsclient-internals.h | 144 | 
1 files changed, 144 insertions, 0 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient-internals.h b/libglusterfsclient/src/libglusterfsclient-internals.h new file mode 100755 index 00000000000..c07da818018 --- /dev/null +++ b/libglusterfsclient/src/libglusterfsclient-internals.h @@ -0,0 +1,144 @@ +/* +   Copyright (c) 2008 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 __LIBGLUSTERFSCLIENT_INTERNALS_H +#define __LIBGLUSTERFSCLIENT_INTERNALS_H + +#include <glusterfs.h> +#include <logging.h> +#include <inode.h> +#include <pthread.h> +#include <stack.h> +#include <list.h> +#include <signal.h> +#include <call-stub.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <fd.h> + +typedef void (*sighandler_t) (int); +typedef struct list_head list_head_t; + +typedef struct libglusterfs_client_ctx { +        glusterfs_ctx_t gf_ctx; +        inode_table_t *itable; +        pthread_t reply_thread; +        call_pool_t pool; +        uint32_t counter; +        time_t lookup_timeout; +        time_t stat_timeout; +}libglusterfs_client_ctx_t; + +typedef struct signal_handler { +        int signo; +        sighandler_t handler; +        list_head_t next; +}libgf_client_signal_handler_t ; + +typedef struct { +        pthread_mutex_t lock; +        pthread_cond_t reply_cond; +        call_stub_t *reply_stub; +        char complete; +        union { +                struct { +                        char is_revalidate; +                        loc_t *loc; +                        int32_t size; +                } lookup; +        }fop; +}libgf_client_local_t; + +#define LIBGF_STACK_WIND_AND_WAIT(frame, rfn, obj, fn, params ...)      \ +        do {                                                            \ +                STACK_WIND (frame, rfn, obj, fn, params);               \ +                pthread_mutex_lock (&local->lock);                      \ +                {                                                       \ +                        while (!local->complete) {                      \ +                                pthread_cond_wait (&local->reply_cond, &local->lock); \ +                        }                                               \ +                }                                                       \ +                pthread_mutex_unlock (&local->lock);                    \ +        } while (0) + + + +#define LIBGF_CLIENT_SIGNAL(signal_handler_list, signo, handler)        \ +        do {                                                            \ +                libgf_client_signal_handler_t *libgf_handler = CALLOC (1, sizeof (*libgf_handler)); \ +                ERR_ABORT (libgf_handler);                              \ +                libgf_handler->signo = signo;                           \ +                libgf_handler->handler = signal (signo, handler);       \ +                list_add (&libgf_handler->next, signal_handler_list);   \ +        } while (0)                                                            + +#define LIBGF_INSTALL_SIGNAL_HANDLERS(signal_handlers)                  \ +        do {                                                            \ +                INIT_LIST_HEAD (&signal_handlers);                      \ +                /* Handle SIGABORT and SIGSEGV */                       \ +                LIBGF_CLIENT_SIGNAL (&signal_handlers, SIGSEGV, gf_print_trace); \ +                LIBGF_CLIENT_SIGNAL (&signal_handlers, SIGABRT, gf_print_trace); \ +                LIBGF_CLIENT_SIGNAL (&signal_handlers, SIGHUP, gf_log_logrotate); \ +                /* LIBGF_CLIENT_SIGNAL (SIGTERM, glusterfs_cleanup_and_exit); */ \ +        } while (0) + +#define LIBGF_RESTORE_SIGNAL_HANDLERS(local)                            \ +        do {                                                            \ +                libgf_client_signal_handler_t *ptr = NULL, *tmp = NULL; \ +                list_for_each_entry_safe (ptr, tmp, &local->signal_handlers, next) { \ +                        signal (ptr->signo, ptr->handler);              \ +                        FREE (ptr);                                     \ +                }                                                       \ +        } while (0)                                        + +#define LIBGF_CLIENT_FOP_ASYNC(ctx, local, ret_fn, op, args ...)        \ +        do {                                                            \ +                call_frame_t *frame = get_call_frame_for_req (ctx, 1);  \ +                xlator_t *xl = frame->this->children ?                  \ +                        frame->this->children->xlator : NULL;           \ +                dict_t *refs = frame->root->req_refs;                   \ +                frame->root->state = ctx;                               \ +                frame->local = local;                                   \ +                STACK_WIND (frame, ret_fn, xl, xl->fops->op, args);     \ +                dict_unref (refs);                                      \ +        } while (0) + +#define LIBGF_CLIENT_FOP(ctx, stub, op, local, args ...)                \ +        do {                                                            \ +                call_frame_t *frame = get_call_frame_for_req (ctx, 1);  \ +                xlator_t *xl = frame->this->children ?                  \ +                        frame->this->children->xlator : NULL;           \ +                dict_t *refs = frame->root->req_refs;                   \ +                if (!local) {                                           \ +                        local = CALLOC (1, sizeof (*local));            \ +                }                                                       \ +                ERR_ABORT (local);                                      \ +                frame->local = local;                                   \ +                frame->root->state = ctx;                               \ +                pthread_cond_init (&local->reply_cond, NULL);           \ +                pthread_mutex_init (&local->lock, NULL);                \ +                LIBGF_STACK_WIND_AND_WAIT (frame, libgf_client_##op##_cbk, xl, xl->fops->op, args); \ +                dict_unref (refs);                                      \ +                stub = local->reply_stub;                               \ +                FREE (frame->local);                                    \ +                frame->local = NULL;                                    \ +                STACK_DESTROY (frame->root);                            \ +        } while (0) + +#endif  | 
