diff options
Diffstat (limited to 'xlators/protocol/client/src')
| -rw-r--r-- | xlators/protocol/client/src/client.c | 47 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client.h | 3 | 
2 files changed, 36 insertions, 14 deletions
diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index b919e4c80a5..7fd1858cf50 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -35,6 +35,25 @@ int client_destroy_rpc (xlator_t *this);  int client_mark_fd_bad (xlator_t *this);  static int +client_fini_complete (xlator_t *this) +{ +        GF_VALIDATE_OR_GOTO (this->name, this->private, out); + +        clnt_conf_t *conf = this->private; + +        if (!conf->destroy) +                return 0; + +        this->private = NULL; + +        pthread_mutex_destroy (&conf->lock); +        GF_FREE (conf); + +out: +        return 0; +} + +static int  client_notify_dispatch_uniq (xlator_t *this, int32_t event, void *data, ...)  {          clnt_conf_t     *conf = this->private; @@ -2298,6 +2317,10 @@ client_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,                  break; +        case RPC_CLNT_DESTROY: +                ret = client_fini_complete (this); +                break; +          default:                  gf_log (this->name, GF_LOG_TRACE,                          "got some other RPC event %d", event); @@ -2730,23 +2753,19 @@ fini (xlator_t *this)          clnt_conf_t *conf = NULL;          conf = this->private; -        this->private = NULL; - -        if (conf) { -                if (conf->rpc) { -                        /* cleanup the saved-frames before last unref */ -                        rpc_clnt_connection_cleanup (&conf->rpc->conn); - -                        rpc_clnt_unref (conf->rpc); -                } +        if (!conf) +                return; -                /* Saved Fds */ -                /* TODO: */ +        conf->destroy = 1; +        if (conf->rpc) { +                /* cleanup the saved-frames before last unref */ +                rpc_clnt_connection_cleanup (&conf->rpc->conn); +                rpc_clnt_unref (conf->rpc); +        } -                pthread_mutex_destroy (&conf->lock); +        /* Saved Fds */ +        /* TODO: */ -                GF_FREE (conf); -        }          return;  } diff --git a/xlators/protocol/client/src/client.h b/xlators/protocol/client/src/client.h index 1aea1353727..7157e120dda 100644 --- a/xlators/protocol/client/src/client.h +++ b/xlators/protocol/client/src/client.h @@ -128,6 +128,9 @@ typedef struct clnt_conf {          int                     event_threads; /* # of event threads                                                  * configured */ + +        gf_boolean_t           destroy; /* if enabled implies fini was called +                                         * on @this xlator instance */  } clnt_conf_t;  typedef struct _client_fd_ctx {  | 
