diff options
Diffstat (limited to 'libglusterfs/src/event.c')
| -rw-r--r-- | libglusterfs/src/event.c | 59 | 
1 files changed, 43 insertions, 16 deletions
diff --git a/libglusterfs/src/event.c b/libglusterfs/src/event.c index 6aaa53499df..bba6f8429a1 100644 --- a/libglusterfs/src/event.c +++ b/libglusterfs/src/event.c @@ -159,8 +159,9 @@ event_pool_destroy (struct event_pool *event_pool)          }          pthread_mutex_unlock (&event_pool->mutex); -        if (!destroy || (activethreadcount > 0)) +        if (!destroy || (activethreadcount > 0)) {                  goto out; +        }          ret = event_pool->ops->event_pool_destroy (event_pool);  out: @@ -168,19 +169,27 @@ out:  }  int -poller_destroy_handler (int fd, int idx, void *data, +poller_destroy_handler (int fd, int idx, int gen, void *data,                         int poll_out, int poll_in, int poll_err)  { -        int readfd = -1; -        char buf = '\0'; +        struct event_destroy_data *destroy = NULL; +        int                        readfd  = -1, ret = -1; +        char                       buf     = '\0'; -        readfd = *(int *)data; -        if (readfd < 0) -                return -1; +        destroy = data; +        readfd = destroy->readfd; +        if (readfd < 0) { +                goto out; +        }          while (sys_read (readfd, &buf, 1) > 0) {          } -        return 0; + +        ret = 0; +out: +        event_handled (destroy->pool, fd, idx, gen); + +        return ret;  }  /* This function destroys all the poller threads. @@ -197,11 +206,12 @@ poller_destroy_handler (int fd, int idx, void *data,  int  event_dispatch_destroy (struct event_pool *event_pool)  { -        int  ret     = -1; -        int  fd[2]   = {-1}; -        int  idx     = -1; -        int  flags   = 0; -        struct timespec   sleep_till = {0, }; +        int                       ret        = -1, threadcount = 0; +        int  fd[2]                           = {-1}; +        int                       idx        = -1; +        int                       flags      = 0; +        struct timespec           sleep_till = {0, }; +        struct event_destroy_data data       = {0, };          GF_VALIDATE_OR_GOTO ("event", event_pool, out); @@ -223,10 +233,13 @@ event_dispatch_destroy (struct event_pool *event_pool)          if (ret < 0)                  goto out; +        data.pool = event_pool; +        data.readfd = fd[1]; +          /* From the main thread register an event on the pipe fd[0],           */          idx = event_register (event_pool, fd[0], poller_destroy_handler, -                              &fd[1], 1, 0); +                              &data, 1, 0);          if (idx < 0)                  goto out; @@ -235,6 +248,7 @@ event_dispatch_destroy (struct event_pool *event_pool)           */          pthread_mutex_lock (&event_pool->mutex);          { +                threadcount = event_pool->eventthreadcount;                  event_pool->destroy = 1;          }          pthread_mutex_unlock (&event_pool->mutex); @@ -254,9 +268,11 @@ event_dispatch_destroy (struct event_pool *event_pool)                   */                  int retry = 0; -                while (event_pool->activethreadcount > 0 && retry++ < 10) { -                        if (sys_write (fd[1], "dummy", 6) == -1) +                while (event_pool->activethreadcount > 0 +                       && (retry++ < (threadcount + 10))) { +                        if (sys_write (fd[1], "dummy", 6) == -1) {                                  break; +                        }                          sleep_till.tv_sec = time (NULL) + 1;                          ret = pthread_cond_timedwait (&event_pool->cond,                                                        &event_pool->mutex, @@ -275,3 +291,14 @@ event_dispatch_destroy (struct event_pool *event_pool)          return ret;  } + +int +event_handled (struct event_pool *event_pool, int fd, int idx, int gen) +{ +        int ret = 0; + +        if (event_pool->ops->event_handled) +                ret = event_pool->ops->event_handled (event_pool, fd, idx, gen); + +        return ret; +}  | 
