diff options
Diffstat (limited to 'xlators/performance/io-threads/src/io-threads.c')
| -rw-r--r-- | xlators/performance/io-threads/src/io-threads.c | 89 | 
1 files changed, 67 insertions, 22 deletions
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c index 5ab38890df3..79845316315 100644 --- a/xlators/performance/io-threads/src/io-threads.c +++ b/xlators/performance/io-threads/src/io-threads.c @@ -153,9 +153,8 @@ iot_worker (void *data)          struct timespec   sleep_till = {0, };          int               ret = 0;          int               pri = -1; -        char              timeout = 0; -        char              bye = 0;  	struct timespec	  sleep = {0,}; +        gf_boolean_t      bye = _gf_false;          conf = data;          this = conf->this; @@ -169,6 +168,12 @@ iot_worker (void *data)                                  pri = -1;                          }                          while (conf->queue_size == 0) { +                                if (conf->down) { +                                        bye = _gf_true;/*Avoid sleep*/ +                                        break; +                                } + +                                conf->sleep_count++;                                  clock_gettime (CLOCK_REALTIME_COARSE,                                                 &sleep_till);                                  sleep_till.tv_sec += conf->idle_time; @@ -179,48 +184,48 @@ iot_worker (void *data)                                                                &sleep_till);                                  conf->sleep_count--; -                                if (ret == ETIMEDOUT) { -                                        timeout = 1; +                                if (conf->down || ret == ETIMEDOUT) { +                                        bye = _gf_true;                                          break;                                  }                          } -                        if (timeout) { -                                if (conf->curr_count > IOT_MIN_THREADS) { +                        if (bye) { +                                if (conf->down || +                                    conf->curr_count > IOT_MIN_THREADS) {                                          conf->curr_count--; -                                        bye = 1; +                                        if (conf->curr_count == 0) +                                           pthread_cond_broadcast (&conf->cond);                                          gf_msg_debug (conf->this->name, 0, -                                                      "timeout, terminated. conf->curr_count=%d", +                                                      "terminated. " +                                                      "conf->curr_count=%d",                                                        conf->curr_count);                                  } else { -                                        timeout = 0; +                                        bye = _gf_false;                                  }                          } -                        stub = __iot_dequeue (conf, &pri, &sleep); -			if (!stub && (sleep.tv_sec || sleep.tv_nsec)) { -				pthread_cond_timedwait(&conf->cond, -						       &conf->mutex, &sleep); -				pthread_mutex_unlock(&conf->mutex); -				continue; +                        if (!bye) { +                                stub = __iot_dequeue (conf, &pri, &sleep); +                                if (!stub && (sleep.tv_sec || sleep.tv_nsec)) { +                                        pthread_cond_timedwait(&conf->cond, +                                                               &conf->mutex, +                                                               &sleep); +                                        pthread_mutex_unlock(&conf->mutex); +                                        continue; +                                }                          }                  }                  pthread_mutex_unlock (&conf->mutex);                  if (stub) /* guard against spurious wakeups */                          call_resume (stub); +                stub = NULL;                  if (bye)                          break;          } -        if (pri != -1) { -                pthread_mutex_lock (&conf->mutex); -                { -                        conf->ac_iot_count[pri]--; -                } -                pthread_mutex_unlock (&conf->mutex); -        }          return NULL;  } @@ -975,6 +980,7 @@ init (xlator_t *this)                          "pthread_cond_init failed (%d)", ret);                  goto out;          } +        conf->cond_inited = _gf_true;          if ((ret = pthread_mutex_init(&conf->mutex, NULL)) != 0) {                  gf_msg (this->name, GF_LOG_ERROR, 0, @@ -982,6 +988,7 @@ init (xlator_t *this)                          "pthread_mutex_init failed (%d)", ret);                  goto out;          } +        conf->mutex_inited = _gf_true;          set_stack_size (conf); @@ -1039,12 +1046,50 @@ out:  	return ret;  } +static void +iot_exit_threads (iot_conf_t *conf) +{ +        pthread_mutex_lock (&conf->mutex); +        { +                conf->down = _gf_true; +                /*Let all the threads know that xl is going down*/ +                pthread_cond_broadcast (&conf->cond); +                while (conf->curr_count)/*Wait for threads to exit*/ +                        pthread_cond_wait (&conf->cond, &conf->mutex); +        } +        pthread_mutex_unlock (&conf->mutex); +} + +int +notify (xlator_t *this, int32_t event, void *data, ...) +{ +        iot_conf_t *conf = this->private; + +        if (GF_EVENT_PARENT_DOWN == event) +                iot_exit_threads (conf); + +        default_notify (this, event, data); + +        return 0; +}  void  fini (xlator_t *this)  {  	iot_conf_t *conf = this->private; +        if (!conf) +                return; + +        if (conf->mutex_inited && conf->cond_inited) +                iot_exit_threads (conf); + +        if (conf->cond_inited) +                pthread_cond_destroy (&conf->cond); + +        if (conf->mutex_inited) +                pthread_mutex_destroy (&conf->mutex); +  	GF_FREE (conf);  	this->private = NULL;  | 
