From df5e9d44ca0904a20ed198f22d21dc4bba8a188b Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Wed, 13 May 2015 16:52:11 +0200 Subject: [PATCH] unix-manager: convert to thread module Sync command thread for unix manager with other managers and make it a full thread module. --- src/suricata.c | 2 ++ src/tm-modules.c | 1 + src/tm-modules.h | 1 + src/tm-threads-common.h | 2 ++ src/tm-threads.c | 35 ++++++++++++++++++++++++++++++ src/tm-threads.h | 2 ++ src/unix-manager.c | 48 +++++++++++++++++++++++++++++++---------- src/unix-manager.h | 2 ++ 8 files changed, 82 insertions(+), 11 deletions(-) diff --git a/src/suricata.c b/src/suricata.c index d0971ab484..6a8f067950 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -797,6 +797,8 @@ int g_ut_covered; void RegisterAllModules() { + /* commanders */ + TmModuleUnixManagerRegister(); /* managers */ TmModuleFlowManagerRegister(); TmModuleFlowRecyclerRegister(); diff --git a/src/tm-modules.c b/src/tm-modules.c index bd990b4e11..3c6d6d2292 100644 --- a/src/tm-modules.c +++ b/src/tm-modules.c @@ -267,6 +267,7 @@ const char * TmModuleTmmIdToString(TmmId id) CASE_CODE (TMM_OUTPUTJSON); CASE_CODE (TMM_FLOWMANAGER); CASE_CODE (TMM_FLOWRECYCLER); + CASE_CODE (TMM_UNIXMANAGER); CASE_CODE (TMM_LUALOG); CASE_CODE (TMM_LOGSTATSLOG); CASE_CODE (TMM_RECEIVENETMAP); diff --git a/src/tm-modules.h b/src/tm-modules.h index a606306c55..6502b21c10 100644 --- a/src/tm-modules.h +++ b/src/tm-modules.h @@ -34,6 +34,7 @@ #define TM_FLAG_DETECT_TM 0x08 #define TM_FLAG_LOGAPI_TM 0x10 /**< TM is run by Log API */ #define TM_FLAG_MANAGEMENT_TM 0x20 +#define TM_FLAG_COMMAND_TM 0x40 typedef struct TmModule_ { char *name; diff --git a/src/tm-threads-common.h b/src/tm-threads-common.h index c18e508765..5affa40c18 100644 --- a/src/tm-threads-common.h +++ b/src/tm-threads-common.h @@ -104,6 +104,8 @@ typedef enum { TMM_FLOWMANAGER, TMM_FLOWRECYCLER, + TMM_UNIXMANAGER, + TMM_LUALOG, TMM_SIZE, } TmmId; diff --git a/src/tm-threads.c b/src/tm-threads.c index 92f35e5178..b77f52af4d 100644 --- a/src/tm-threads.c +++ b/src/tm-threads.c @@ -662,6 +662,8 @@ TmEcode TmThreadSetSlots(ThreadVars *tv, char *name, void *(*fn_p)(void *)) tv->tm_func = TmThreadsSlotPktAcqLoop; } else if (strcmp(name, "management") == 0) { tv->tm_func = TmThreadsManagement; + } else if (strcmp(name, "command") == 0) { + tv->tm_func = TmThreadsManagement; } else if (strcmp(name, "custom") == 0) { if (fn_p == NULL) goto error; @@ -1227,6 +1229,39 @@ ThreadVars *TmThreadCreateMgmtThreadByName(char *name, char *module, 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. * This function supports only custom slot functions and hence a diff --git a/src/tm-threads.h b/src/tm-threads.h index 0c92a4bdb0..363a30b8b3 100644 --- a/src/tm-threads.h +++ b/src/tm-threads.h @@ -92,6 +92,8 @@ ThreadVars *TmThreadCreateMgmtThread(char *name, void *(fn_p)(void *), int); ThreadVars *TmThreadCreateMgmtThreadByName(char *name, char *module, int mucond); ThreadVars *TmThreadCreateCmdThread(char *name, void *(fn_p)(void *), int); +ThreadVars *TmThreadCreateCmdThreadByName(char *name, char *module, + int mucond); TmEcode TmThreadSpawn(ThreadVars *); void TmThreadSetFlags(ThreadVars *, uint8_t); void TmThreadSetAOF(ThreadVars *, uint8_t); diff --git a/src/unix-manager.c b/src/unix-manager.c index e86bae81aa..b8eb0045ca 100644 --- a/src/unix-manager.c +++ b/src/unix-manager.c @@ -841,13 +841,31 @@ TmEcode UnixManagerRegisterBackgroundTask(TmEcode (*Func)(void *), 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; /* set the thread name */ - (void) SCSetThreadName(th_v->name); SCLogDebug("%s started...", th_v->name); th_v->sc_perf_pca = SCPerfGetAllCountersArray(&th_v->sc_perf_pctx); @@ -863,8 +881,7 @@ void *UnixManagerThread(void *td) if (failure_fatal) { exit(EXIT_FAILURE); } else { - TmThreadsSetFlag(th_v, THV_INIT_DONE|THV_RUNNING_DONE); - pthread_exit((void *) 0); + return TM_ECODE_FAILED; } } @@ -904,10 +921,7 @@ void *UnixManagerThread(void *td) UnixCommandBackgroundTasks(&command); } - TmThreadWaitForFlag(th_v, THV_DEINIT); - - TmThreadsSetFlag(th_v, THV_CLOSED); - pthread_exit((void *) 0); + return TM_ECODE_OK; } @@ -922,8 +936,8 @@ void UnixManagerThreadSpawn(int mode) SCCtrlCondInit(&unix_manager_ctrl_cond, NULL); SCCtrlMutexInit(&unix_manager_ctrl_mutex, NULL); - tv_unixmgr = TmThreadCreateCmdThread("UnixManagerThread", - UnixManagerThread, 0); + tv_unixmgr = TmThreadCreateCmdThreadByName("UnixManagerThread", + "UnixManager", 0); if (tv_unixmgr == NULL) { SCLogError(SC_ERR_INITIALIZATION, "TmThreadsCreate failed"); @@ -997,3 +1011,15 @@ void UnixSocketKillSocketThread(void) } #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 */ +} diff --git a/src/unix-manager.h b/src/unix-manager.h index 2bbdee11ed..848da76137 100644 --- a/src/unix-manager.h +++ b/src/unix-manager.h @@ -46,4 +46,6 @@ TmEcode UnixManagerRegisterBackgroundTask( void *data); #endif +void TmModuleUnixManagerRegister(void); + #endif /* UNIX_MANAGER_H */