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()
{
/* commanders */
TmModuleUnixManagerRegister();
/* managers */
TmModuleFlowManagerRegister();
TmModuleFlowRecyclerRegister();

@ -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);

@ -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;

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

@ -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

@ -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);

@ -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 */
}

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

Loading…
Cancel
Save