VirtualBox

Changeset 39942 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Feb 1, 2012 7:50:46 PM (13 years ago)
Author:
vboxsync
Message:

VBoxBalloonCtrl: Update.

Location:
trunk/src/VBox/Frontends/VBoxBalloonCtrl
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxModBallooning.cpp

    r39936 r39942  
    6464 * The module's RTGetOpt-IDs for the command line.
    6565 */
    66 enum GETOPTDEF_BALLOONCTRL
     66static enum GETOPTDEF_BALLOONCTRL
    6767{
    6868    GETOPTDEF_BALLOONCTRL_BALLOOINC = 1000,
     
    7070    GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT,
    7171    GETOPTDEF_BALLOONCTRL_BALLOONMAX,
    72     GETOPTDEF_BALLOONCTRL_TIMEOUTMS
     72    GETOPTDEF_BALLOONCTRL_TIMEOUTMS,
     73    GETOPTDEF_BALLOONCTRL_GROUPS
     74};
     75
     76/**
     77 * The module's command line arguments.
     78 */
     79static const RTGETOPTDEF g_aBalloonOpts[] = {
     80    { "--balloon-dec",            GETOPTDEF_BALLOONCTRL_BALLOONDEC,        RTGETOPT_REQ_UINT32 },
     81    { "--balloon-groups",         GETOPTDEF_BALLOONCTRL_GROUPS,            RTGETOPT_REQ_STRING },
     82    { "--balloon-inc",            GETOPTDEF_BALLOONCTRL_BALLOOINC,         RTGETOPT_REQ_UINT32 },
     83    { "--balloon-interval",       GETOPTDEF_BALLOONCTRL_TIMEOUTMS,         RTGETOPT_REQ_UINT32 },
     84    { "--balloon-lower-limit",    GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT, RTGETOPT_REQ_UINT32 },
     85    { "--balloon-max",            GETOPTDEF_BALLOONCTRL_BALLOONMAX,        RTGETOPT_REQ_UINT32 }
    7386};
    7487
     
    146159     *  Legacy (VBoxBalloonCtrl):
    147160     *  - per-VM parameter ("VBoxInternal/Guest/BalloonSizeMax")
     161     *  Global:
    148162     *  - global parameter ("VBoxInternal/Guest/BalloonSizeMax")
    149163     *  New:
     
    188202 *
    189203 * @return  bool                    True if ballooning is required, false if not.
    190  * @param   strUuid                 UUID of the specified machine.
     204 * @param   pMachine                Machine to determine ballooning for.
    191205 */
    192206static bool balloonIsRequired(PVBOXWATCHDOG_MACHINE pMachine)
     
    297311}
    298312
    299 static DECLCALLBACK(int) VBoxModBallooningOption(PCRTGETOPTUNION pOpt, int iShort)
    300 {
    301     AssertPtrReturn(pOpt, -1);
    302 
    303     int rc = 0;
    304     switch (iShort)
    305     {
    306          case GETOPTDEF_BALLOONCTRL_BALLOOINC:
    307             g_ulMemoryBalloonIncrementMB = pOpt->u32;
    308             break;
    309 
    310         case GETOPTDEF_BALLOONCTRL_BALLOONDEC:
    311             g_ulMemoryBalloonDecrementMB = pOpt->u32;
    312             break;
    313 
    314         case GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT:
    315             g_ulMemoryBalloonLowerLimitMB = pOpt->u32;
    316             break;
    317 
    318         case GETOPTDEF_BALLOONCTRL_BALLOONMAX:
    319             g_ulMemoryBalloonMaxMB = pOpt->u32;
    320             break;
    321 
    322         /** @todo Add (legacy) "--inverval" setting! */
    323         /** @todo This option is a common moudle option! Put
    324          *        this into a utility function! */
    325         case GETOPTDEF_BALLOONCTRL_TIMEOUTMS:
    326             g_ulMemoryBalloonTimeoutMS = pOpt->u32;
    327             if (g_ulMemoryBalloonTimeoutMS < 500)
    328                 g_ulMemoryBalloonTimeoutMS = 500;
    329             break;
    330 
    331         default:
    332             rc = -1; /* We don't handle this option, skip. */
    333             break;
    334     }
    335 
    336     /* (Legacy) note. */
    337     RTStrmPrintf(g_pStdErr, "\n"
    338                             "Set \"VBoxInternal/Guest/BalloonSizeMax\" for a per-VM maximum ballooning size.\n");
     313static DECLCALLBACK(int) VBoxModBallooningOption(int argc, char **argv)
     314{
     315    if (!argc) /* Take a shortcut. */
     316        return -1;
     317
     318    AssertPtrReturn(argv, VERR_INVALID_PARAMETER);
     319
     320    RTGETOPTSTATE GetState;
     321    int rc = RTGetOptInit(&GetState, argc, argv,
     322                          g_aBalloonOpts, RT_ELEMENTS(g_aBalloonOpts),
     323                          0 /* First */, 0 /*fFlags*/);
     324    if (RT_FAILURE(rc))
     325        return rc;
     326
     327    rc = 0; /* Set default parsing result to valid. */
     328
     329    int c;
     330    RTGETOPTUNION ValueUnion;
     331    while ((c = RTGetOpt(&GetState, &ValueUnion)))
     332    {
     333        switch (c)
     334        {
     335            case GETOPTDEF_BALLOONCTRL_BALLOONDEC:
     336                g_ulMemoryBalloonDecrementMB = ValueUnion.u32;
     337                break;
     338
     339            case GETOPTDEF_BALLOONCTRL_BALLOOINC:
     340                g_ulMemoryBalloonIncrementMB = ValueUnion.u32;
     341                break;
     342
     343            case GETOPTDEF_BALLOONCTRL_GROUPS:
     344                /** @todo Add ballooning groups cmd line arg. */
     345                break;
     346
     347            case GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT:
     348                g_ulMemoryBalloonLowerLimitMB = ValueUnion.u32;
     349                break;
     350
     351            case GETOPTDEF_BALLOONCTRL_BALLOONMAX:
     352                g_ulMemoryBalloonMaxMB = ValueUnion.u32;
     353                break;
     354
     355            /** @todo Add (legacy) "--inverval" setting! */
     356            /** @todo This option is a common moudle option! Put
     357             *        this into a utility function! */
     358            case GETOPTDEF_BALLOONCTRL_TIMEOUTMS:
     359                g_ulMemoryBalloonTimeoutMS = ValueUnion.u32;
     360                if (g_ulMemoryBalloonTimeoutMS < 500)
     361                    g_ulMemoryBalloonTimeoutMS = 500;
     362                break;
     363
     364            default:
     365                rc = -1; /* We don't handle this option, skip. */
     366                break;
     367        }
     368    }
     369
    339370    return rc;
    340371}
     
    421452    /* pszDescription. */
    422453    "Memory Ballooning Control",
     454    /* pszDepends. */
     455    NULL,
     456    /* uPriority. */
     457    0 /* Not used */,
    423458    /* pszUsage. */
    424     "              [--balloon-interval <ms>] [--balloon-inc <MB>]\n"
    425     "              [--balloon-dec <MB>] [--balloon-lower-limit <MB>]"
     459    "              [--balloon-dec <MB>] [--balloon-inc <MB>]\n"
     460    "              [--balloon-interval <ms>] [--balloon-lower-limit <MB>]\n"
    426461    "              [--balloon-max <MB>]",
    427462    /* pszOptions. */
    428     "    --balloon-interval      Sets the check interval in ms (30 seconds).\n"
    429     "    --balloon-inc           Sets the ballooning increment in MB (256 MB).\n"
    430     "    --balloon-dec           Sets the ballooning decrement in MB (128 MB).\n"
    431     "    --balloon-lower-limit   Sets the ballooning lower limit in MB (64 MB).\n"
    432     "    --balloon-max           Sets the balloon maximum limit in MB (0 MB).\n"
    433     "                            Specifying \"0\" means disabled ballooning.\n",
    434     /* methods */
     463    "--balloon-dec          Sets the ballooning decrement in MB (128 MB).\n"
     464    "--balloon-groups       Sets the VM groups for ballooning (All).\n"
     465    "--balloon-inc          Sets the ballooning increment in MB (256 MB).\n"
     466    "--balloon-interval     Sets the check interval in ms (30 seconds).\n"
     467    "--balloon-lower-limit  Sets the ballooning lower limit in MB (64 MB).\n"
     468    "--balloon-max          Sets the balloon maximum limit in MB (0 MB).\n"
     469    "                       Specifying \"0\" means disabled ballooning.\n"
     470#if 1
     471    /* (Legacy) note. */
     472    "Set \"VBoxInternal/Guest/BalloonSizeMax\" for a per-VM maximum ballooning size.\n"
     473#endif
     474    ,
     475    /* methods. */
    435476    VBoxModBallooningPreInit,
    436477    VBoxModBallooningOption,
     
    439480    VBoxModBallooningStop,
    440481    VBoxModBallooningTerm,
    441     /* callbacks */
     482    /* callbacks. */
    442483    VBoxModBallooningOnMachineRegistered,
    443484    VBoxModBallooningOnMachineUnregistered,
  • trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxWatchdog.cpp

    r39929 r39942  
    11/* $Id$ */
    22/** @file
    3  * VBoxBalloonCtrl - VirtualBox Ballooning Control Service.
     3 * VBoxWatchdog.cpp - VirtualBox Watchdog.
    44 */
    55
     
    7070ComPtr<ISession>     g_pSession    = NULL;
    7171
    72 /** The critical section for keep our stuff in sync. */
    73 static RTCRITSECT    g_MapCritSect;
     72/** The critical section for the machines map. */
     73static RTCRITSECT    g_csMachines;
    7474
    7575/** Set by the signal handler. */
     
    143143static int machineAdd(const Bstr &strUuid);
    144144static int machineRemove(const Bstr &strUuid);
    145 static int machineUpdate(const Bstr &strUuid, MachineState_T enmState);
     145//static int machineUpdate(const Bstr &strUuid, MachineState_T enmState);
    146146static HRESULT watchdogSetup();
    147147static void watchdogTeardown();
     
    192192                    if (SUCCEEDED(hr))
    193193                    {
    194                         int rc = RTCritSectEnter(&g_MapCritSect);
     194                        int rc = RTCritSectEnter(&g_csMachines);
    195195                        if (RT_SUCCESS(rc))
    196196                        {
     
    212212                            else if (!fRegistered)
    213213                                 rc = machineRemove(uuid);
    214 
    215                             int rc2 = RTCritSectLeave(&g_MapCritSect);
     214                            #endif
     215                            int rc2 = RTCritSectLeave(&g_csMachines);
    216216                            if (RT_SUCCESS(rc))
    217217                                rc = rc2;
    218218                            AssertRC(rc);
    219                             #endif
    220219                        }
    221220                    }
     
    237236                    if (SUCCEEDED(hr))
    238237                    {
    239                         int rc = RTCritSectEnter(&g_MapCritSect);
     238                        int rc = RTCritSectEnter(&g_csMachines);
    240239                        if (RT_SUCCESS(rc))
    241240                        {
     
    252251
    253252                            //rc = machineUpdate(uuid, machineState);
    254                             int rc2 = RTCritSectLeave(&g_MapCritSect);
     253                            int rc2 = RTCritSectLeave(&g_csMachines);
    255254                            if (RT_SUCCESS(rc))
    256255                                rc = rc2;
     
    482481
    483482        /* Register all module payloads. */
    484         /* TODO */
     483        for (unsigned j = 0; j < RT_ELEMENTS(g_aModules); j++)
     484        {
     485            if (g_aModules[j].pDesc->pszOptions)
     486                RTPrintf("%s", g_aModules[j].pDesc->pszOptions);
     487        }
    485488
    486489        g_mapVM.insert(std::make_pair(strUuid, m));
     
    489492
    490493    } while (0);
     494
     495    /** @todo Add std exception handling! */
    491496
    492497    return SUCCEEDED(rc) ? VINF_SUCCESS : VERR_COM_IPRT_ERROR; /* @todo Find a better error! */
     
    524529}
    525530
     531#if 0
    526532/**
    527533 * Updates a specified machine according to its current machine state.
     
    583589    return rc;
    584590}
     591#endif
    585592
    586593static void vmListDestroy()
     
    588595    serviceLogVerbose(("Destroying VM list ...\n"));
    589596
    590     int rc = RTCritSectEnter(&g_MapCritSect);
     597    int rc = RTCritSectEnter(&g_csMachines);
    591598    if (RT_SUCCESS(rc))
    592599    {
     
    603610        g_mapVM.clear();
    604611
    605         rc = RTCritSectLeave(&g_MapCritSect);
     612        rc = RTCritSectLeave(&g_csMachines);
    606613    }
    607614    AssertRC(rc);
     
    612619    serviceLogVerbose(("Building VM list ...\n"));
    613620
    614     int rc = RTCritSectEnter(&g_MapCritSect);
     621    int rc = RTCritSectEnter(&g_csMachines);
    615622    if (RT_SUCCESS(rc))
    616623    {
     
    656663        }
    657664
    658         int rc2 = RTCritSectLeave(&g_MapCritSect);
     665        int rc2 = RTCritSectLeave(&g_csMachines);
    659666        if (RT_SUCCESS(rc))
    660667            rc = rc2;
     
    756763        g_pEventQ = com::EventQueue::getMainEventQueue();
    757764
    758         RTCritSectInit(&g_MapCritSect);
     765        RTCritSectInit(&g_csMachines);
    759766
    760767        /*
     
    848855        AssertRC(vrc);
    849856
    850         RTCritSectDelete(&g_MapCritSect);
     857        RTCritSectDelete(&g_csMachines);
    851858
    852859        if (RT_FAILURE(vrc))
     
    885892        {
    886893            pfnLog(pLoggerRelease,
    887                    "VirtualBox Ballooning Control Service %s r%u %s (%s %s) release log\n"
     894                   "VirtualBox Watchdog %s r%u %s (%s %s) release log\n"
    888895#ifdef VBOX_BLEEDING_EDGE
    889896                   "EXPERIMENTAL build " VBOX_BLEEDING_EDGE "\n"
     
    939946}
    940947
     948static void displayHeader()
     949{
     950    RTStrmPrintf(g_pStdErr, VBOX_PRODUCT " Watchdog " VBOX_VERSION_STRING "\n"
     951                 "(C) " VBOX_C_YEAR " " VBOX_VENDOR "\n"
     952                 "All rights reserved.\n\n");
     953}
     954
    941955/**
    942956 * Displays the help.
     
    948962    AssertPtrReturnVoid(pszImage);
    949963
    950     RTStrmPrintf(g_pStdErr, "\nUsage: %s [options]\n\nSupported options (default values in brackets):\n",
     964    displayHeader();
     965
     966    RTStrmPrintf(g_pStdErr, "Usage: %s [options]\n\nSupported options (default values in brackets):\n",
    951967                 pszImage);
    952968    for (unsigned i = 0;
     
    9991015    }
    10001016
    1001     RTStrmPrintf(g_pStdErr, "Module options:\n");
    1002 
    1003     /** @todo Add module options here. */
     1017    for (unsigned j = 0; j < RT_ELEMENTS(g_aModules); j++)
     1018    {
     1019        if (g_aModules[j].pDesc->pszOptions)
     1020            RTPrintf("%s", g_aModules[j].pDesc->pszOptions);
     1021    }
    10041022
    10051023    /** @todo Change VBOXBALLOONCTRL_RELEASE_LOG to WATCHDOG*. */
     
    10751093    if (RT_FAILURE(rc))
    10761094        return RTMsgInitFailure(rc);
    1077 
    1078     RTPrintf(VBOX_PRODUCT " Watchdog " VBOX_VERSION_STRING "\n"
    1079              "(C) " VBOX_C_YEAR " " VBOX_VENDOR "\n"
    1080              "All rights reserved.\n\n");
    10811095
    10821096    /*
     
    11401154                {
    11411155                    rc = watchdogLazyPreInit();
    1142                     if (rc != RTEXITCODE_SUCCESS)
    1143                         return rc;
     1156                    if (RT_SUCCESS(rc))
     1157                        return RTEXITCODE_FAILURE;
    11441158
    11451159                    for (unsigned j = 0; !fFound && j < RT_ELEMENTS(g_aModules); j++)
    11461160                    {
    1147                         rc = g_aModules[j].pDesc->pfnOption(&ValueUnion, c);
     1161                        rc = g_aModules[j].pDesc->pfnOption(1 /* Current value only. */,
     1162                                                            &argv[GetState.iNext - 1]);
    11481163                        fFound = rc == 0;
    11491164                        if (fFound)
     
    11601175    }
    11611176
     1177    /** @todo Add "--quiet/-q" option to not show the header. */
     1178    displayHeader();
     1179
    11621180    /* create release logger */
    11631181    PRTLOGGER pLoggerRelease;
  • trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxWatchdogInternal.h

    r39936 r39942  
    2929
    3030#include <map>
     31#include <vector>
    3132
    3233using namespace com;
     
    6970typedef std::map<const char*, VBOXWATCHDOG_MODULE_PAYLOAD>::const_iterator mapPayloadIterConst;
    7071
    71 /** A machine group entry.
    72  *  Currently contains on the name of the group. */
    73 typedef struct VBOXWATCHDOG_MACHINE_GROUP
    74 {
    75     Bstr name;
    76 } VBOXWATCHDOG_MACHINE_GROUP;
    77 typedef std::map<Bstr, VBOXWATCHDOG_MACHINE_GROUP> mapGroup;
    78 typedef std::map<Bstr, VBOXWATCHDOG_MACHINE_GROUP>::iterator mapGroupIter;
    79 typedef std::map<Bstr, VBOXWATCHDOG_MACHINE_GROUP>::const_iterator mapGroupIterConst;
    80 
    81 /** A machine's internal entry. */
     72struct VBOXWATCHDOG_VM_GROUP;
     73
     74/** A machine's internal entry.
     75 *  Primary key is the machine's UUID. */
    8276typedef struct VBOXWATCHDOG_MACHINE
    8377{
     
    8680    ComPtr<IPerformanceCollector> collector;
    8781#endif
    88     /** Map containing the group(s) assigned to
    89      *  this machine. */
    90     mapGroup group;
    9182    /** Map containing the individual
    9283     *  module payloads. */
     
    9788typedef std::map<Bstr, VBOXWATCHDOG_MACHINE>::const_iterator mapVMIterConst;
    9889
     90/** A VM group entry. Note that a machine can belong
     91 *  to more than one group. */
     92typedef struct VBOXWATCHDOG_VM_GROUP
     93{
     94    /** UUIDs of machines belonging to this group. */
     95    std::vector<Bstr> machine;
     96} VBOXWATCHDOG_VM_GROUP;
     97typedef std::map<Bstr, VBOXWATCHDOG_VM_GROUP> mapGroup;
     98typedef std::map<Bstr, VBOXWATCHDOG_VM_GROUP>::iterator mapGroupIter;
     99typedef std::map<Bstr, VBOXWATCHDOG_VM_GROUP>::const_iterator mapGroupIterConst;
     100
    99101/**
    100102 * A module descriptor.
     
    104106    /** The short module name. */
    105107    const char *pszName;
     108    /** A comma-separated list of modules this module
     109     *  depends on. Might be NULL if no dependencies. */
     110    const char *pszDepends;
     111    /** Priority (lower is higher, 0 is invalid) of
     112     *  module execution. */
     113    uint32_t    uPriority;
    106114    /** The longer module name. */
    107115    const char *pszDescription;
     
    118126
    119127    /**
    120      * Tries to parse the given command line option.
     128     * Tries to parse the given command line options.
    121129     *
    122130     * @returns 0 if we parsed, -1 if it didn't and anything else means exit.
    123      * @param   pOpt        Pointer to a value union containing the current
    124      *                      command line value to parse.
    125      * @param   iShort      Short version of current commad line value.
    126      */
    127     DECLCALLBACKMEMBER(int, pfnOption)(PCRTGETOPTUNION pOpt, int iShort);
     131     * @param   argc        Argument count.
     132     * @param   argv        Arguments.
     133     */
     134    DECLCALLBACKMEMBER(int, pfnOption)(int argc, char **argv);
    128135
    129136    /**
     
    198205extern int getMetric(PVBOXWATCHDOG_MACHINE pMachine, const Bstr& strName, LONG *pulData);
    199206void* getPayload(PVBOXWATCHDOG_MACHINE pMachine, const char *pszModule);
    200 int getArgUInt32(int argc, char **argv, const char *psz, int *pi, uint32_t *pu32, uint32_t u32Min, uint32_t u32Max);
    201207
    202208RT_C_DECLS_END
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette