/* $Id: VBoxWatchdogInternal.h 39942 2012-02-01 19:50:46Z vboxsync $ */ /** @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; * you can redistribute it and/or modify it under the terms of the GNU * 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 #include #include #include #include #include #endif /* !VBOX_ONLY_DOCS */ #include #include using namespace com; //////////////////////////////////////////////////////////////////////////////// // // 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 *pvPayload; /* Size of payload (in bytes). */ size_t cbPayload; /** @todo Add mutex for locking + getPayloadLocked(). */ } VBOXWATCHDOG_MODULE_PAYLOAD, *PVBOXWATCHDOG_MODULE_PAYLOAD; /** * Map containing a module's individual payload -- the module itself * is responsible for allocating/handling/destroying this payload. * Primary key is the module name. */ typedef std::map mapPayload; typedef std::map::iterator mapPayloadIter; typedef std::map::const_iterator mapPayloadIterConst; struct VBOXWATCHDOG_VM_GROUP; /** A machine's internal entry. * Primary key is the machine's UUID. */ typedef struct VBOXWATCHDOG_MACHINE { ComPtr machine; #ifndef VBOX_WATCHDOG_GLOBAL_PERFCOL ComPtr collector; #endif /** Map containing the individual * module payloads. */ mapPayload payload; } VBOXWATCHDOG_MACHINE, *PVBOXWATCHDOG_MACHINE; typedef std::map mapVM; typedef std::map::iterator mapVMIter; typedef std::map::const_iterator mapVMIterConst; /** A VM group entry. Note that a machine can belong * to more than one group. */ typedef struct VBOXWATCHDOG_VM_GROUP { /** UUIDs of machines belonging to this group. */ std::vector machine; } VBOXWATCHDOG_VM_GROUP; typedef std::map mapGroup; typedef std::map::iterator mapGroupIter; typedef std::map::const_iterator mapGroupIterConst; /** * A module descriptor. */ typedef struct { /** The short module name. */ const char *pszName; /** 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. */ uint32_t uPriority; /** The longer module name. */ const char *pszDescription; /** 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. */ DECLCALLBACKMEMBER(int, pfnOption)(int argc, char **argv); /** * 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); /** * Callbacks. */ /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnMachineRegistered)(const Bstr &strUuid); /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnMachineUnregistered)(const Bstr &strUuid); /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnMachineStateChanged)(const Bstr &strUuid, MachineState_T enmState); /** * * @returns VBox status code. */ DECLCALLBACKMEMBER(int, pfnOnServiceStateChanged)(bool fAvailable); } VBOXMODULE; /** Pointer to a VBOXMODULE. */ typedef VBOXMODULE *PVBOXMODULE; /** Pointer to a const VBOXMODULE. */ typedef VBOXMODULE const *PCVBOXMODULE; RT_C_DECLS_BEGIN extern bool g_fVerbose; extern ComPtr g_pVirtualBox; extern ComPtr g_pSession; extern VBOXMODULE g_ModBallooning; extern void serviceLog(const char *pszFormat, ...); #define serviceLogVerbose(a) if (g_fVerbose) { serviceLog a; } extern int getMetric(PVBOXWATCHDOG_MACHINE pMachine, const Bstr& strName, LONG *pulData); void* getPayload(PVBOXWATCHDOG_MACHINE pMachine, const char *pszModule); RT_C_DECLS_END #endif /* !___H_VBOXWATCHDOG */