VBoxWatchdogInternal.h revision cafc6ad33e78753d79eb74d774ad6f6d0e0dec2d
/* $Id$ */
/** @file
* VBoxWatchdog - VirtualBox Watchdog Service.
*/
/*
* Copyright (C) 2011-2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#ifndef ___H_VBOXWATCHDOG
#define ___H_VBOXWATCHDOG
#ifndef VBOX_ONLY_DOCS
#endif /* !VBOX_ONLY_DOCS */
#include <algorithm>
#include <map>
#include <sstream>
#include <string>
#include <vector>
////////////////////////////////////////////////////////////////////////////////
//
// definitions
//
////////////////////////////////////////////////////////////////////////////////
/** Command handler argument. */
struct HandlerArg
{
int argc;
char **argv;
};
/**
* A module's payload for a machine entry.
* The payload data is not (yet) thread safe -- so only
* use this in one module at a time only!
*/
typedef struct VBOXWATCHDOG_MODULE_PAYLOAD
{
/** Pointer to allocated payload. Can be NULL if
* a module doesn't have an own payload. */
void *pvData;
/** Size of payload (in bytes). */
/** @todo Add mutex for locking + getPayloadLocked(). */
/**
* Map containing a module's individual payload -- the module itself
* is responsible for allocating/handling/destroying this payload.
* Primary key is the module name.
*/
/** Group list (plus additional per-group flags, not used yet) for one VM.
* Primary key is the group name, secondary specify flags (if any). */
/** A machine's internal entry.
* Primary key is the machine's UUID. */
typedef struct VBOXWATCHDOG_MACHINE
{
#ifndef VBOX_WATCHDOG_GLOBAL_PERFCOL
#endif
/** The group(s) this machine belongs to. */
/** Map containing the individual module payloads. */
/** Members of a VM group; currently only represented by the machine's UUID.
* Primary key is the machine's UUID. */
/** A VM group. Can contain none, one or more group members.
* Primary key is the group's name. */
/**
* A module descriptor.
*/
typedef struct
{
/** The short module name. */
const char *pszName;
/** The longer module name. */
const char *pszDescription;
/** A comma-separated list of modules this module
* depends on. Might be NULL if no dependencies. */
const char *pszDepends;
/** Priority (lower is higher, 0 is invalid) of
* module execution. */
/** The usage options stuff for the --help screen. */
const char *pszUsage;
/** The option descriptions for the --help screen. */
const char *pszOptions;
/**
* Called before parsing arguments.
* @returns VBox status code.
*/
DECLCALLBACKMEMBER(int, pfnPreInit)(void);
/**
* Tries to parse the given command line options.
*
* @returns 0 if we parsed, -1 if it didn't and anything else means exit.
* @param argc Argument count.
* @param argv Arguments.
*/
/**
* Called before parsing arguments.
* @returns VBox status code.
*/
DECLCALLBACKMEMBER(int, pfnInit)(void);
/** Called from the watchdog's main function. Non-blocking.
*
* @returns VBox status code.
*/
DECLCALLBACKMEMBER(int, pfnMain)(void);
/**
* Stop the module.
*/
DECLCALLBACKMEMBER(int, pfnStop)(void);
/**
* Does termination cleanups.
*
* @remarks This may be called even if pfnInit hasn't been called!
*/
DECLCALLBACKMEMBER(void, pfnTerm)(void);
/** @name Callbacks.
* @{
*/
/**
*
* @returns VBox status code.
*/
/**
*
* @returns VBox status code.
*/
/**
*
* @returns VBox status code.
*/
/**
*
* @returns VBox status code.
*/
/** @} */
} VBOXMODULE;
/** Pointer to a VBOXMODULE. */
typedef VBOXMODULE *PVBOXMODULE;
/** Pointer to a const VBOXMODULE. */
typedef VBOXMODULE const *PCVBOXMODULE;
extern bool g_fDryrun;
extern bool g_fVerbose;
extern mapGroup g_mapGroup;
# ifdef VBOX_WATCHDOG_GLOBAL_PERFCOL
# endif
extern VBOXMODULE g_ModBallooning;
extern VBOXMODULE g_ModAPIMonitor;
extern void serviceLog(const char *pszFormat, ...);
int payloadAlloc(PVBOXWATCHDOG_MACHINE pMachine, const char *pszModule, size_t cbSize, void **ppszPayload);
#endif /* !___H_VBOXWATCHDOG */