output-api: cleanup handling

Add output 'free list' that contains all the output ctx' that need
cleanup at shutdown. It differs from the runmode output list in that
it will also contain a 'parent' for the submodules that share the
context of it's parent.
pull/926/head
Victor Julien 11 years ago
parent c27304451e
commit 26778b8703

@ -84,6 +84,16 @@ static RunModes runmodes[RUNMODE_USER_MAX];
static char *active_runmode;
/* free list for our outputs */
typedef struct OutputFreeList_ {
TmModule *tm_module;
OutputCtx *output_ctx;
TAILQ_ENTRY(OutputFreeList_) entries;
} OutputFreeList;
TAILQ_HEAD(, OutputFreeList_) output_free_list =
TAILQ_HEAD_INITIALIZER(output_free_list);
/**
* \internal
* \brief Translate a runmode mode to a printale string.
@ -394,24 +404,46 @@ void RunModeRegisterNewRunMode(int runmode, const char *name,
return;
}
/**
* Setup the outputs for this run mode.
*
* \param tv The ThreadVars for the thread the outputs will be
* appended to.
*/
void RunOutputFreeList(void)
{
OutputFreeList *output;
while ((output = TAILQ_FIRST(&output_free_list))) {
SCLogDebug("output %s %p %p", output->tm_module->name, output, output->output_ctx);
if (output->output_ctx != NULL && output->output_ctx->DeInit != NULL)
output->output_ctx->DeInit(output->output_ctx);
TAILQ_REMOVE(&output_free_list, output, entries);
SCFree(output);
}
}
/**
* Cleanup the run mode.
*/
void RunModeShutDown(void)
{
RunOutputFreeList();
OutputPacketShutdown();
OutputTxShutdown();
OutputFileShutdown();
OutputFiledataShutdown();
/* Close any log files. */
RunModeOutput *output;
while ((output = TAILQ_FIRST(&RunModeOutputs))) {
SCLogDebug("Shutting down output %s.", output->tm_module->name);
TAILQ_REMOVE(&RunModeOutputs, output, entries);
if (output->output_ctx != NULL && output->output_ctx->DeInit != NULL)
output->output_ctx->DeInit(output->output_ctx);
SCFree(output);
}
OutputPacketShutdown();
OutputTxShutdown();
OutputFileShutdown();
}
static TmModule *pkt_logger_module = NULL;
@ -419,6 +451,25 @@ static TmModule *tx_logger_module = NULL;
static TmModule *file_logger_module = NULL;
static TmModule *filedata_logger_module = NULL;
/** \internal
* \brief add Sub RunModeOutput to list for Submodule so we can free
* the output ctx at shutdown and unix socket reload */
static void AddOutputToFreeList(OutputModule *module, OutputCtx *output_ctx)
{
TmModule *tm_module = TmModuleGetByName(module->name);
if (tm_module == NULL) {
SCLogError(SC_ERR_INVALID_ARGUMENT,
"TmModuleGetByName for %s failed", module->name);
exit(EXIT_FAILURE);
}
OutputFreeList *fl_output = SCCalloc(1, sizeof(OutputFreeList));
if (unlikely(fl_output == NULL))
return;
fl_output->tm_module = tm_module;
fl_output->output_ctx = output_ctx;
TAILQ_INSERT_TAIL(&output_free_list, fl_output, entries);
}
/** \brief Turn output into thread module */
static void SetupOutput(const char *name, OutputModule *module, OutputCtx *output_ctx)
{
@ -645,10 +696,16 @@ void RunModeInitializeOutputs(void)
continue;
}
AddOutputToFreeList(sub_module, sub_output_ctx);
SetupOutput(sub_module->name, sub_module, sub_output_ctx);
}
}
/* add 'eve-log' to free list as it's the owner of the
* main output ctx from which the sub-modules share the
* LogFileCtx */
AddOutputToFreeList(module, output_ctx);
} else {
AddOutputToFreeList(module, output_ctx);
SetupOutput(module->name, module, output_ctx);
}
}

Loading…
Cancel
Save