Exemple #1
0
gallus_result_t
gallus_module_shutdown_all(shutdown_grace_level_t level) {
  gallus_result_t ret = GALLUS_RESULT_ANY_FAILURES;

  if (IS_VALID_SHUTDOWN(level) == true) {

    s_lock();
    {

      s_gstate = MODULE_GLOBAL_STATE_SHUTTINGDOWN;

      if (s_n_modules > 0) {
        gallus_result_t first_err = GALLUS_RESULT_OK;
        size_t i;
        a_module *mptr;

        /*
         * Reverse order.
         */
        for (i = 0; i < s_n_modules; i++) {
          mptr = &(s_modules[s_n_modules - i - 1]);
          ret = s_shutdown_module(mptr, level);
          if (ret != GALLUS_RESULT_OK) {
            gallus_perror(ret);
            gallus_msg_error("can't shutdown module \"%s\".\n",
                              mptr->m_name);
            if (first_err == GALLUS_RESULT_OK) {
              first_err = ret;
            }
          }
          /*
           * Just carry on shutting down no matter what kind of errors
           * occur.
           */
        }

        ret = first_err;

      } else {
        ret = GALLUS_RESULT_OK;
      }

    }
    s_unlock();

  } else {
    ret = GALLUS_RESULT_INVALID_ARGS;
  }

  return ret;
}
static inline gallus_result_t
s_null_create(null_thread_t *nptr, shutdown_grace_level_t l) {
  gallus_result_t ret = GALLUS_RESULT_ANY_FAILURES;

  if (IS_VALID_SHUTDOWN(l) == true && nptr != NULL) {
    null_thread_t nt;

    if (*nptr != NULL) {
      nt = *nptr;
    } else {
      if ((nt = (null_thread_t)malloc(sizeof(*nt))) == NULL) {
        ret = GALLUS_RESULT_NO_MEMORY;
        goto done;
      }
    }

    if ((ret = gallus_thread_create((gallus_thread_t *)&nt,
                                     s_main, s_finalize, NULL,
                                     "null", NULL)) == GALLUS_RESULT_OK) {
      if (*nptr == NULL) {
        (void)gallus_thread_free_when_destroy((gallus_thread_t *)&nt);
        *nptr = nt;
      }

      nt->m_gl = l;

      ret = GALLUS_RESULT_OK;

    } else {
      if (*nptr == NULL) {
        free((void *)nt);
      }
    }

  } else {
    ret = GALLUS_RESULT_INVALID_ARGS;
  }

done:
  return ret;
}
Exemple #3
0
lagopus_result_t
global_state_request_shutdown(shutdown_grace_level_t l) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;

  if (IS_VALID_SHUTDOWN(l) == true) {

    s_lock();
    {
      if (IS_GLOBAL_STATE_SHUTDOWN(s_gs) == false &&
          s_gs != GLOBAL_STATE_REQUEST_SHUTDOWN) {
        if (s_is_valid_state(GLOBAL_STATE_REQUEST_SHUTDOWN) == true) {
          s_gs = GLOBAL_STATE_REQUEST_SHUTDOWN;
          s_gl = l;
          (void)lagopus_cond_notify(&s_cond, true);

          /*
           * Wait until someone changes the state to
           * GLOBAL_STATE_ACCEPT_SHUTDOWN
           */
        recheck:
          if (IS_GLOBAL_STATE_SHUTDOWN(s_gs) == false) {
            if ((ret = lagopus_cond_wait(&s_cond, &s_lck, -1LL)) ==
                LAGOPUS_RESULT_OK) {
              goto recheck;
            }
          }
        } else {
          ret = LAGOPUS_RESULT_INVALID_STATE_TRANSITION;
        }
      }
    }
    s_unlock();

  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  return ret;
}
Exemple #4
0
static inline gallus_result_t
s_shutdown_module(a_module *mptr, shutdown_grace_level_t level) {
  gallus_result_t ret = GALLUS_RESULT_ANY_FAILURES;

  if (mptr != NULL &&
      mptr->m_shutdown_proc != NULL &&
      IS_VALID_SHUTDOWN(level) == true) {
    if (mptr->m_status == MODULE_STATE_STARTED) {
      ret = (mptr->m_shutdown_proc)(level);
      if (mptr->m_thdptr == NULL) {
        /*
         * Means that this module doesn't have any gallus'd threads
         * nor pthreads. Just change the state to shutdwon.
         */
        mptr->m_status = MODULE_STATE_SHUTDOWN;
      }
#if 0
      else {
        /*
         * Note that we don't update the module status.
         */
      }
#endif
    } else {
      if (mptr->m_status == MODULE_STATE_SHUTDOWN ||
          mptr->m_status == MODULE_STATE_STOPPED) {
        ret = GALLUS_RESULT_OK;
      } else {
        ret = GALLUS_RESULT_INVALID_STATE_TRANSITION;
      }
    }
  } else {
    ret = GALLUS_RESULT_INVALID_ARGS;
  }

  return ret;
}
Exemple #5
0
static void
s_term_handler(int sig) {
  lagopus_result_t r = LAGOPUS_RESULT_ANY_FAILURES;
  global_state_t gs = GLOBAL_STATE_UNKNOWN;

  if ((r = global_state_get(&gs)) == LAGOPUS_RESULT_OK) {

    if ((int)gs == (int)GLOBAL_STATE_STARTED) {

      shutdown_grace_level_t l = SHUTDOWN_UNKNOWN;
      if (sig == SIGTERM || sig == SIGINT) {
        l = SHUTDOWN_GRACEFULLY;
      } else if (sig == SIGQUIT) {
        l = SHUTDOWN_RIGHT_NOW;
      }
      if (IS_VALID_SHUTDOWN(l) == true) {
        lagopus_msg_info("About to request shutdown(%s)...\n",
                         (l == SHUTDOWN_RIGHT_NOW) ?
                         "RIGHT_NOW" : "GRACEFULLY");
        if ((r = global_state_request_shutdown(l)) == LAGOPUS_RESULT_OK) {
          lagopus_msg_info("The shutdown request accepted.\n");
        } else {
          lagopus_perror(r);
          lagopus_msg_error("can't request shutdown.\n");
        }
      }

    } else if ((int)gs < (int)GLOBAL_STATE_STARTED) {
      if (sig == SIGTERM || sig == SIGINT || sig == SIGQUIT) {
        s_got_term_sig = true;
      }
    } else {
      lagopus_msg_debug(5, "The system is already shutting down.\n");
    }
  }

}