return;
}
-/**
- * \brief Waits for all threads to be in a running state
- *
- * \retval TM_ECODE_OK if all are running or error if a thread failed
- */
-TmEcode TmThreadWaitOnThreadRunning(void)
+static TmEcode WaitOnThreadsRunningByType(const int t)
{
- uint16_t RX_num = 0;
- uint16_t W_num = 0;
- uint16_t FM_num = 0;
- uint16_t FR_num = 0;
- uint16_t TX_num = 0;
-
struct timeval start_ts;
struct timeval cur_ts;
gettimeofday(&start_ts, NULL);
+ /* on retries, this will init to the last thread that started up already */
+ ThreadVars *tv_start = tv_root[t];
again:
SCMutexLock(&tv_root_lock);
- for (int i = 0; i < TVT_MAX; i++) {
- ThreadVars *tv = tv_root[i];
- while (tv != NULL) {
- if (TmThreadsCheckFlag(tv, (THV_FAILED | THV_CLOSED | THV_DEAD))) {
- SCMutexUnlock(&tv_root_lock);
+ ThreadVars *tv = tv_start;
+ while (tv != NULL) {
+ if (TmThreadsCheckFlag(tv, (THV_FAILED | THV_CLOSED | THV_DEAD))) {
+ SCMutexUnlock(&tv_root_lock);
+
+ SCLogError("thread \"%s\" failed to "
+ "start: flags %04x",
+ tv->name, SC_ATOMIC_GET(tv->flags));
+ return TM_ECODE_FAILED;
+ }
+
+ if (!(TmThreadsCheckFlag(tv, THV_RUNNING | THV_RUNNING_DONE))) {
+ SCMutexUnlock(&tv_root_lock);
+ /* 60 seconds provided for the thread to transition from
+ * THV_INIT_DONE to THV_RUNNING */
+ gettimeofday(&cur_ts, NULL);
+ if ((cur_ts.tv_sec - start_ts.tv_sec) > 60) {
SCLogError("thread \"%s\" failed to "
- "start: flags %04x",
+ "start in time: flags %04x",
tv->name, SC_ATOMIC_GET(tv->flags));
return TM_ECODE_FAILED;
}
- if (!(TmThreadsCheckFlag(tv, THV_RUNNING | THV_RUNNING_DONE))) {
- SCMutexUnlock(&tv_root_lock);
+ /* sleep a little to give the thread some
+ * time to start running */
+ SleepUsec(100);
+ goto again;
+ }
+ tv_start = tv;
- /* 60 seconds provided for the thread to transition from
- * THV_INIT_DONE to THV_RUNNING */
- gettimeofday(&cur_ts, NULL);
- if ((cur_ts.tv_sec - start_ts.tv_sec) > 60) {
- SCLogError("thread \"%s\" failed to "
- "start in time: flags %04x",
- tv->name, SC_ATOMIC_GET(tv->flags));
- return TM_ECODE_FAILED;
- }
+ tv = tv->next;
+ }
+ SCMutexUnlock(&tv_root_lock);
+ return TM_ECODE_OK;
+}
- /* sleep a little to give the thread some
- * time to start running */
- SleepUsec(100);
- goto again;
- }
- tv = tv->next;
- }
+/**
+ * \brief Waits for all threads to be in a running state
+ *
+ * \retval TM_ECODE_OK if all are running or error if a thread failed
+ */
+TmEcode TmThreadWaitOnThreadRunning(void)
+{
+ uint16_t RX_num = 0;
+ uint16_t W_num = 0;
+ uint16_t FM_num = 0;
+ uint16_t FR_num = 0;
+ uint16_t TX_num = 0;
+
+ for (int i = 0; i < TVT_MAX; i++) {
+ if (WaitOnThreadsRunningByType(i) != TM_ECODE_OK)
+ return TM_ECODE_FAILED;
}
+
+ SCMutexLock(&tv_root_lock);
for (int i = 0; i < TVT_MAX; i++) {
for (ThreadVars *tv = tv_root[i]; tv != NULL; tv = tv->next) {
if (strncmp(thread_name_autofp, tv->name, strlen(thread_name_autofp)) == 0)