unix-manager: convert to thread module

Sync command thread for unix manager with other managers and make
it a full thread module.
pull/1487/head
Victor Julien 10 years ago
parent cc01b5f6b6
commit df5e9d44ca

@ -797,6 +797,8 @@ int g_ut_covered;
void RegisterAllModules() void RegisterAllModules()
{ {
/* commanders */
TmModuleUnixManagerRegister();
/* managers */ /* managers */
TmModuleFlowManagerRegister(); TmModuleFlowManagerRegister();
TmModuleFlowRecyclerRegister(); TmModuleFlowRecyclerRegister();

@ -267,6 +267,7 @@ const char * TmModuleTmmIdToString(TmmId id)
CASE_CODE (TMM_OUTPUTJSON); CASE_CODE (TMM_OUTPUTJSON);
CASE_CODE (TMM_FLOWMANAGER); CASE_CODE (TMM_FLOWMANAGER);
CASE_CODE (TMM_FLOWRECYCLER); CASE_CODE (TMM_FLOWRECYCLER);
CASE_CODE (TMM_UNIXMANAGER);
CASE_CODE (TMM_LUALOG); CASE_CODE (TMM_LUALOG);
CASE_CODE (TMM_LOGSTATSLOG); CASE_CODE (TMM_LOGSTATSLOG);
CASE_CODE (TMM_RECEIVENETMAP); CASE_CODE (TMM_RECEIVENETMAP);

@ -34,6 +34,7 @@
#define TM_FLAG_DETECT_TM 0x08 #define TM_FLAG_DETECT_TM 0x08
#define TM_FLAG_LOGAPI_TM 0x10 /**< TM is run by Log API */ #define TM_FLAG_LOGAPI_TM 0x10 /**< TM is run by Log API */
#define TM_FLAG_MANAGEMENT_TM 0x20 #define TM_FLAG_MANAGEMENT_TM 0x20
#define TM_FLAG_COMMAND_TM 0x40
typedef struct TmModule_ { typedef struct TmModule_ {
char *name; char *name;

@ -104,6 +104,8 @@ typedef enum {
TMM_FLOWMANAGER, TMM_FLOWMANAGER,
TMM_FLOWRECYCLER, TMM_FLOWRECYCLER,
TMM_UNIXMANAGER,
TMM_LUALOG, TMM_LUALOG,
TMM_SIZE, TMM_SIZE,
} TmmId; } TmmId;

@ -662,6 +662,8 @@ TmEcode TmThreadSetSlots(ThreadVars *tv, char *name, void *(*fn_p)(void *))
tv->tm_func = TmThreadsSlotPktAcqLoop; tv->tm_func = TmThreadsSlotPktAcqLoop;
} else if (strcmp(name, "management") == 0) { } else if (strcmp(name, "management") == 0) {
tv->tm_func = TmThreadsManagement; tv->tm_func = TmThreadsManagement;
} else if (strcmp(name, "command") == 0) {
tv->tm_func = TmThreadsManagement;
} else if (strcmp(name, "custom") == 0) { } else if (strcmp(name, "custom") == 0) {
if (fn_p == NULL) if (fn_p == NULL)
goto error; goto error;
@ -1227,6 +1229,39 @@ ThreadVars *TmThreadCreateMgmtThreadByName(char *name, char *module,
return tv; return tv;
} }
/**
* \brief Creates and returns the TV instance for a Command thread (CMD).
* This function supports only custom slot functions and hence a
* function pointer should be sent as an argument.
*
* \param name Name of this TV instance
* \param module Name of TmModule with COMMAND flag set.
* \param mucond Flag to indicate whether to initialize the condition
* and the mutex variables for this newly created TV.
*
* \retval the newly created TV instance, or NULL on error
*/
ThreadVars *TmThreadCreateCmdThreadByName(char *name, char *module,
int mucond)
{
ThreadVars *tv = NULL;
tv = TmThreadCreate(name, NULL, NULL, NULL, NULL, "command", NULL, mucond);
if (tv != NULL) {
tv->type = TVT_CMD;
tv->id = TmThreadsRegisterThread(tv, tv->type);
TmThreadSetCPU(tv, MANAGEMENT_CPU_SET);
TmModule *m = TmModuleGetByName(module);
if (m) {
TmSlotSetFuncAppend(tv, m, NULL);
}
}
return tv;
}
/** /**
* \brief Creates and returns the TV instance for a CMD thread. * \brief Creates and returns the TV instance for a CMD thread.
* This function supports only custom slot functions and hence a * This function supports only custom slot functions and hence a

@ -92,6 +92,8 @@ ThreadVars *TmThreadCreateMgmtThread(char *name, void *(fn_p)(void *), int);
ThreadVars *TmThreadCreateMgmtThreadByName(char *name, char *module, ThreadVars *TmThreadCreateMgmtThreadByName(char *name, char *module,
int mucond); int mucond);
ThreadVars *TmThreadCreateCmdThread(char *name, void *(fn_p)(void *), int); ThreadVars *TmThreadCreateCmdThread(char *name, void *(fn_p)(void *), int);
ThreadVars *TmThreadCreateCmdThreadByName(char *name, char *module,
int mucond);
TmEcode TmThreadSpawn(ThreadVars *); TmEcode TmThreadSpawn(ThreadVars *);
void TmThreadSetFlags(ThreadVars *, uint8_t); void TmThreadSetFlags(ThreadVars *, uint8_t);
void TmThreadSetAOF(ThreadVars *, uint8_t); void TmThreadSetAOF(ThreadVars *, uint8_t);

@ -841,13 +841,31 @@ TmEcode UnixManagerRegisterBackgroundTask(TmEcode (*Func)(void *),
SCReturnInt(TM_ECODE_OK); SCReturnInt(TM_ECODE_OK);
} }
void *UnixManagerThread(void *td) typedef struct UnixManagerThreadData_ {
int padding;
} UnixManagerThreadData;
static TmEcode UnixManagerThreadInit(ThreadVars *t, void *initdata, void **data)
{
UnixManagerThreadData *utd = SCCalloc(1, sizeof(*utd));
if (utd == NULL)
return TM_ECODE_FAILED;
*data = utd;
return TM_ECODE_OK;
}
static TmEcode UnixManagerThreadDeinit(ThreadVars *t, void *data)
{
SCFree(data);
return TM_ECODE_OK;
}
static TmEcode UnixManager(ThreadVars *th_v, void *thread_data)
{ {
ThreadVars *th_v = (ThreadVars *)td;
int ret; int ret;
/* set the thread name */ /* set the thread name */
(void) SCSetThreadName(th_v->name);
SCLogDebug("%s started...", th_v->name); SCLogDebug("%s started...", th_v->name);
th_v->sc_perf_pca = SCPerfGetAllCountersArray(&th_v->sc_perf_pctx); th_v->sc_perf_pca = SCPerfGetAllCountersArray(&th_v->sc_perf_pctx);
@ -863,8 +881,7 @@ void *UnixManagerThread(void *td)
if (failure_fatal) { if (failure_fatal) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} else { } else {
TmThreadsSetFlag(th_v, THV_INIT_DONE|THV_RUNNING_DONE); return TM_ECODE_FAILED;
pthread_exit((void *) 0);
} }
} }
@ -904,10 +921,7 @@ void *UnixManagerThread(void *td)
UnixCommandBackgroundTasks(&command); UnixCommandBackgroundTasks(&command);
} }
TmThreadWaitForFlag(th_v, THV_DEINIT); return TM_ECODE_OK;
TmThreadsSetFlag(th_v, THV_CLOSED);
pthread_exit((void *) 0);
} }
@ -922,8 +936,8 @@ void UnixManagerThreadSpawn(int mode)
SCCtrlCondInit(&unix_manager_ctrl_cond, NULL); SCCtrlCondInit(&unix_manager_ctrl_cond, NULL);
SCCtrlMutexInit(&unix_manager_ctrl_mutex, NULL); SCCtrlMutexInit(&unix_manager_ctrl_mutex, NULL);
tv_unixmgr = TmThreadCreateCmdThread("UnixManagerThread", tv_unixmgr = TmThreadCreateCmdThreadByName("UnixManagerThread",
UnixManagerThread, 0); "UnixManager", 0);
if (tv_unixmgr == NULL) { if (tv_unixmgr == NULL) {
SCLogError(SC_ERR_INITIALIZATION, "TmThreadsCreate failed"); SCLogError(SC_ERR_INITIALIZATION, "TmThreadsCreate failed");
@ -997,3 +1011,15 @@ void UnixSocketKillSocketThread(void)
} }
#endif /* BUILD_UNIX_SOCKET */ #endif /* BUILD_UNIX_SOCKET */
void TmModuleUnixManagerRegister (void)
{
#ifdef BUILD_UNIX_SOCKET
tmm_modules[TMM_UNIXMANAGER].name = "UnixManager";
tmm_modules[TMM_UNIXMANAGER].ThreadInit = UnixManagerThreadInit;
tmm_modules[TMM_UNIXMANAGER].ThreadDeinit = UnixManagerThreadDeinit;
tmm_modules[TMM_UNIXMANAGER].Management = UnixManager;
tmm_modules[TMM_UNIXMANAGER].cap_flags = 0;
tmm_modules[TMM_UNIXMANAGER].flags = TM_FLAG_COMMAND_TM;
#endif /* BUILD_UNIX_SOCKET */
}

@ -46,4 +46,6 @@ TmEcode UnixManagerRegisterBackgroundTask(
void *data); void *data);
#endif #endif
void TmModuleUnixManagerRegister(void);
#endif /* UNIX_MANAGER_H */ #endif /* UNIX_MANAGER_H */

Loading…
Cancel
Save