VirtualBox

Changeset 24828 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Nov 20, 2009 2:57:25 PM (15 years ago)
Author:
vboxsync
Message:

xpcom/server.cpp: Some cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/xpcom/server.cpp

    r24823 r24828  
    2020 */
    2121
    22 /* Make sure all the stdint.h macros are included - must come first! */
    23 #ifndef __STDC_LIMIT_MACROS
    24 # define __STDC_LIMIT_MACROS
    25 #endif
    26 #ifndef __STDC_CONSTANT_MACROS
    27 # define __STDC_CONSTANT_MACROS
    28 #endif
    29 
    3022#include <ipcIService.h>
    3123#include <ipcCID.h>
     
    3325#include <nsIComponentRegistrar.h>
    3426
    35 #if defined(XPCOM_GLUE)
    36 #include <nsXPCOMGlue.h>
     27#ifdef XPCOM_GLUE
     28# include <nsXPCOMGlue.h>
    3729#endif
    3830
     
    4840
    4941#include <iprt/initterm.h>
     42#include <iprt/critsect.h>
     43#include <iprt/getopt.h>
    5044#include <iprt/path.h>
    51 #include <iprt/critsect.h>
    5245#include <iprt/timer.h>
    5346
     
    5750#include <unistd.h>
    5851#include <errno.h>
    59 #include <getopt.h>
    6052#include <fcntl.h>
    6153#include <sys/stat.h>
    62 #ifndef RT_OS_OS2
    63 # include <sys/resource.h>
    64 #endif
     54#include <sys/resource.h>
    6555
    6656/////////////////////////////////////////////////////////////////////////////
     
    212202static bool gAutoShutdown = false;
    213203
    214 static nsIEventQueue* gEventQ = nsnull;
     204static nsIEventQueue  *gEventQ      = nsnull;
    215205static PRBool volatile gKeepRunning = PR_TRUE;
    216206
     
    238228     * either case.
    239229     */
    240     nsresult postTo (nsIEventQueue *aEventQ)
     230    nsresult postTo(nsIEventQueue *aEventQ)
    241231    {
    242232        AssertReturn(mEv.that == NULL, NS_ERROR_FAILURE);
    243233        AssertReturn(aEventQ, NS_ERROR_FAILURE);
    244         nsresult rv = aEventQ->InitEvent (&mEv.e, NULL,
    245                                           eventHandler, eventDestructor);
     234        nsresult rv = aEventQ->InitEvent(&mEv.e, NULL,
     235                                         eventHandler, eventDestructor);
    246236        if (NS_SUCCEEDED(rv))
    247237        {
    248238            mEv.that = this;
    249             rv = aEventQ->PostEvent (&mEv.e);
     239            rv = aEventQ->PostEvent(&mEv.e);
    250240            if (NS_SUCCEEDED(rv))
    251241                return rv;
     
    265255    } mEv;
    266256
    267     static void *PR_CALLBACK eventHandler (PLEvent *self)
    268     {
    269         return reinterpret_cast <Ev *> (self)->that->handler();
    270     }
    271 
    272     static void PR_CALLBACK eventDestructor (PLEvent *self)
    273     {
    274         delete reinterpret_cast <Ev *> (self)->that;
     257    static void *PR_CALLBACK eventHandler(PLEvent *self)
     258    {
     259        return reinterpret_cast<Ev *>(self)->that->handler();
     260    }
     261
     262    static void PR_CALLBACK eventDestructor(PLEvent *self)
     263    {
     264        delete reinterpret_cast<Ev *>(self)->that;
    275265    }
    276266};
     
    289279    virtual ~VirtualBoxClassFactory()
    290280    {
    291         LogFlowFunc (("Deleting VirtualBox...\n"));
     281        LogFlowFunc(("Deleting VirtualBox...\n"));
    292282
    293283        FinalRelease();
    294284        sInstance = NULL;
    295285
    296         LogFlowFunc (("VirtualBox object deleted.\n"));
    297         printf ("Informational: VirtualBox object deleted.\n");
     286        LogFlowFunc(("VirtualBox object deleted.\n"));
     287        printf("Informational: VirtualBox object deleted.\n");
    298288    }
    299289
     
    312302            PRBool onMainThread = PR_TRUE;
    313303            if (gEventQ)
    314                 gEventQ->IsOnCurrentThread (&onMainThread);
     304                gEventQ->IsOnCurrentThread(&onMainThread);
    315305
    316306            PRBool timerStarted = PR_FALSE;
     
    319309            if (sTimer != NULL)
    320310            {
    321                 LogFlowFunc (("Last VirtualBox instance was released.\n"));
    322                 LogFlowFunc (("Scheduling server shutdown in %d ms...\n",
    323                               VBoxSVC_ShutdownDelay));
     311                LogFlowFunc(("Last VirtualBox instance was released.\n"));
     312                LogFlowFunc(("Scheduling server shutdown in %d ms...\n",
     313                             VBoxSVC_ShutdownDelay));
    324314
    325315                /* make sure the previous timer (if any) is stopped;
    326316                 * otherwise RTTimerStart() will definitely fail. */
    327                 RTTimerLRStop (sTimer);
    328 
    329                 int vrc = RTTimerLRStart (sTimer, uint64_t (VBoxSVC_ShutdownDelay) * 1000000);
    330                 AssertRC (vrc);
     317                RTTimerLRStop(sTimer);
     318
     319                int vrc = RTTimerLRStart(sTimer, uint64_t(VBoxSVC_ShutdownDelay) * 1000000);
     320                AssertRC(vrc);
    331321                timerStarted = SUCCEEDED(vrc);
    332322            }
    333323            else
    334324            {
    335                 LogFlowFunc (("Last VirtualBox instance was released "
    336                               "on XPCOM shutdown.\n"));
    337                 Assert (onMainThread);
     325                LogFlowFunc(("Last VirtualBox instance was released "
     326                             "on XPCOM shutdown.\n"));
     327                Assert(onMainThread);
    338328            }
    339329
     
    344334                    /* Failed to start the timer, post the shutdown event
    345335                     * manually if not on the main thread alreay. */
    346                     ShutdownTimer (NULL, NULL, 0);
     336                    ShutdownTimer(NULL, NULL, 0);
    347337                }
    348338                else
     
    366356                     */
    367357
    368                     Assert (gEventQ == NULL);
     358                    Assert(gEventQ == NULL);
    369359                }
    370360            }
     
    379369        void *handler()
    380370        {
    381             LogFlowFunc (("\n"));
    382 
    383             Assert (RTCritSectIsInitialized (&sLock));
     371            LogFlowFunc(("\n"));
     372
     373            Assert(RTCritSectIsInitialized(&sLock));
    384374
    385375            /* stop accepting GetInstance() requests on other threads during
    386376             * possible destruction */
    387             RTCritSectEnter (&sLock);
     377            RTCritSectEnter(&sLock);
    388378
    389379            nsrefcnt count = 0;
     
    401391                if (gAutoShutdown)
    402392                {
    403                     Assert (sInstance == NULL);
    404                     LogFlowFunc (("Terminating the server process...\n"));
     393                    Assert(sInstance == NULL);
     394                    LogFlowFunc(("Terminating the server process...\n"));
    405395                    /* make it leave the event loop */
    406396                    gKeepRunning = PR_FALSE;
     
    412402                 * connect after this event has been posted to the main queue
    413403                 * but before it started to process it. */
    414                 LogFlowFunc (("Destruction is canceled (refcnt=%d).\n", count));
    415             }
    416 
    417             RTCritSectLeave (&sLock);
     404                LogFlowFunc(("Destruction is canceled (refcnt=%d).\n", count));
     405            }
     406
     407            RTCritSectLeave(&sLock);
    418408
    419409            return NULL;
     
    421411    };
    422412
    423     static void ShutdownTimer (RTTIMERLR hTimerLR, void *pvUser, uint64_t /*iTick*/)
    424     {
    425         NOREF (hTimerLR);
    426         NOREF (pvUser);
     413    static void ShutdownTimer(RTTIMERLR hTimerLR, void *pvUser, uint64_t /*iTick*/)
     414    {
     415        NOREF(hTimerLR);
     416        NOREF(pvUser);
    427417
    428418        /* A "too late" event is theoretically possible if somebody
     
    430420         * and this method was so lucky that it got a chance to run before
    431421         * the timer was killed. */
    432         AssertReturnVoid (gEventQ);
     422        AssertReturnVoid(gEventQ);
    433423
    434424        /* post a quit event to the main queue */
    435425        MaybeQuitEvent *ev = new MaybeQuitEvent();
    436         nsresult rv = ev->postTo (gEventQ);
    437         NOREF (rv);
     426        nsresult rv = ev->postTo(gEventQ);
     427        NOREF(rv);
    438428
    439429        /* A failure above means we've been already stopped (for example
     
    444434    static NS_IMETHODIMP FactoryConstructor()
    445435    {
    446         LogFlowFunc (("\n"));
     436        LogFlowFunc(("\n"));
    447437
    448438        /* create a critsect to protect object construction */
    449         if (RT_FAILURE(RTCritSectInit (&sLock)))
     439        if (RT_FAILURE(RTCritSectInit(&sLock)))
    450440            return NS_ERROR_OUT_OF_MEMORY;
    451441
    452         int vrc = RTTimerLRCreateEx (&sTimer, 0, 0, ShutdownTimer, NULL);
     442        int vrc = RTTimerLRCreateEx(&sTimer, 0, 0, ShutdownTimer, NULL);
    453443        if (RT_FAILURE(vrc))
    454444        {
    455             LogFlowFunc (("Failed to create a timer! (vrc=%Rrc)\n", vrc));
     445            LogFlowFunc(("Failed to create a timer! (vrc=%Rrc)\n", vrc));
    456446            return NS_ERROR_FAILURE;
    457447        }
     
    462452    static NS_IMETHODIMP FactoryDestructor()
    463453    {
    464         LogFlowFunc (("\n"));
    465 
    466         RTTimerLRDestroy (sTimer);
     454        LogFlowFunc(("\n"));
     455
     456        RTTimerLRDestroy(sTimer);
    467457        sTimer = NULL;
    468458
    469         RTCritSectDelete (&sLock);
     459        RTCritSectDelete(&sLock);
    470460
    471461        if (sInstance != NULL)
     
    482472    }
    483473
    484     static nsresult GetInstance (VirtualBox **inst)
    485     {
    486         LogFlowFunc (("Getting VirtualBox object...\n"));
    487 
    488         RTCritSectEnter (&sLock);
     474    static nsresult GetInstance(VirtualBox **inst)
     475    {
     476        LogFlowFunc(("Getting VirtualBox object...\n"));
     477
     478        RTCritSectEnter(&sLock);
    489479
    490480        if (!gKeepRunning)
    491481        {
    492             LogFlowFunc (("Process termination requested first. Refusing.\n"));
    493 
    494             RTCritSectLeave (&sLock);
     482            LogFlowFunc(("Process termination requested first. Refusing.\n"));
     483
     484            RTCritSectLeave(&sLock);
    495485
    496486            /* this rv is what CreateInstance() on the client side returns
     
    515505                sInstance->AddRef(); /* protect FinalConstruct() */
    516506                rv = sInstance->FinalConstruct();
    517                 printf ("Informational: VirtualBox object created (rc=%08X).\n", rv);
    518                 if (NS_FAILED (rv))
     507                printf("Informational: VirtualBox object created (rc=%08X).\n", rv);
     508                if (NS_FAILED(rv))
    519509                {
    520510                    /* On failure diring VirtualBox initialization, delete it
     
    529519                    sInstance->Release();
    530520                    sInstance->Release();
    531                     Assert (sInstance == NULL);
     521                    Assert(sInstance == NULL);
    532522                }
    533523                else
     
    535525                    /* On success, make sure the previous timer is stopped to
    536526                     * cancel a scheduled server termination (if any). */
    537                     RTTimerLRStop (sTimer);
     527                    RTTimerLRStop(sTimer);
    538528                }
    539529            }
     
    545535        else
    546536        {
    547             LogFlowFunc (("Using existing VirtualBox object...\n"));
     537            LogFlowFunc(("Using existing VirtualBox object...\n"));
    548538            nsrefcnt count = sInstance->AddRef();
    549             Assert (count > 1);
     539            Assert(count > 1);
    550540
    551541            if (count == 2)
    552542            {
    553                 LogFlowFunc (("Another client has requested a reference to VirtualBox, "
    554                               "canceling detruction...\n"));
     543                LogFlowFunc(("Another client has requested a reference to VirtualBox, canceling detruction...\n"));
    555544
    556545                /* make sure the previous timer is stopped */
    557                 RTTimerLRStop (sTimer);
     546                RTTimerLRStop(sTimer);
    558547            }
    559548        }
     
    561550        *inst = sInstance;
    562551
    563         RTCritSectLeave (&sLock);
     552        RTCritSectLeave(&sLock);
    564553
    565554        return rv;
     
    581570
    582571VirtualBoxClassFactory *VirtualBoxClassFactory::sInstance = NULL;
    583 RTCRITSECT VirtualBoxClassFactory::sLock = {0};
     572RTCRITSECT VirtualBoxClassFactory::sLock;
    584573
    585574RTTIMERLR VirtualBoxClassFactory::sTimer = NIL_RTTIMERLR;
    586575
    587 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR_WITH_RC
    588     (VirtualBox, VirtualBoxClassFactory::GetInstance)
     576NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR_WITH_RC(VirtualBox, VirtualBoxClassFactory::GetInstance)
    589577
    590578////////////////////////////////////////////////////////////////////////////////
     
    601589struct nsModuleComponentInfoEx : nsModuleComponentInfo
    602590{
    603     nsModuleComponentInfoEx () {}
    604     nsModuleComponentInfoEx (int) {}
    605 
    606     nsModuleComponentInfoEx (
     591    nsModuleComponentInfoEx() {}
     592    nsModuleComponentInfoEx(int) {}
     593
     594    nsModuleComponentInfoEx(
    607595        const char*                                 aDescription,
    608596        const nsCID&                                aCID,
     
    640628static const nsModuleComponentInfoEx components[] =
    641629{
    642     nsModuleComponentInfoEx (
     630    nsModuleComponentInfoEx(
    643631        "VirtualBox component",
    644632        (nsCID) NS_VIRTUALBOX_CID,
     
    664652 */
    665653nsresult
    666 NS_NewGenericFactoryEx (nsIGenericFactory **result,
    667                         const nsModuleComponentInfoEx *info)
     654NS_NewGenericFactoryEx(nsIGenericFactory **result,
     655                       const nsModuleComponentInfoEx *info)
    668656{
    669657    AssertReturn(result, NS_ERROR_INVALID_POINTER);
    670658
    671     nsresult rv = NS_NewGenericFactory (result, info);
     659    nsresult rv = NS_NewGenericFactory(result, info);
    672660    if (NS_SUCCEEDED(rv) && info && info->mFactoryConstructor)
    673661    {
    674662        rv = info->mFactoryConstructor();
    675         if (NS_FAILED (rv))
    676             NS_RELEASE (*result);
     663        if (NS_FAILED(rv))
     664            NS_RELEASE(*result);
    677665    }
    678666
     
    687675 */
    688676static nsresult
    689 RegisterSelfComponents (nsIComponentRegistrar *registrar,
    690                         const nsModuleComponentInfoEx *components,
    691                         PRUint32 count)
     677RegisterSelfComponents(nsIComponentRegistrar *registrar,
     678                       const nsModuleComponentInfoEx *components,
     679                       PRUint32 count)
    692680{
    693681    nsresult rc = NS_OK;
     
    696684    {
    697685        /* skip components w/o a constructor */
    698         if (!info->mConstructor) continue;
     686        if (!info->mConstructor)
     687            continue;
    699688        /* create a new generic factory for a component and register it */
    700689        nsIGenericFactory *factory;
    701         rc = NS_NewGenericFactoryEx (&factory, info);
     690        rc = NS_NewGenericFactoryEx(&factory, info);
    702691        if (NS_SUCCEEDED(rc))
    703692        {
    704             rc = registrar->RegisterFactory (info->mCID,
    705                                              info->mDescription,
    706                                              info->mContractID,
    707                                              factory);
     693            rc = registrar->RegisterFactory(info->mCID,
     694                                            info->mDescription,
     695                                            info->mContractID,
     696                                            factory);
    708697            factory->Release();
    709698        }
     
    715704
    716705static ipcIService *gIpcServ = nsnull;
    717 static char *pszPidFile = NULL;
     706static const char *g_pszPidFile = NULL;
    718707
    719708class ForceQuitEvent : public MyEvent
     
    721710    void *handler()
    722711    {
    723         LogFlowFunc (("\n"));
     712        LogFlowFunc(("\n"));
    724713
    725714        gKeepRunning = PR_FALSE;
    726715
    727         if (pszPidFile)
    728             RTFileDelete(pszPidFile);
     716        if (g_pszPidFile)
     717            RTFileDelete(g_pszPidFile);
    729718
    730719        return NULL;
     
    732721};
    733722
    734 static void signal_handler (int /* sig */)
     723static void signal_handler(int /* sig */)
    735724{
    736725    if (gEventQ && gKeepRunning)
     
    738727        /* post a quit event to the queue */
    739728        ForceQuitEvent *ev = new ForceQuitEvent();
    740         ev->postTo (gEventQ);
     729        ev->postTo(gEventQ);
    741730    }
    742731}
    743732
    744 int main (int argc, char **argv)
     733int main(int argc, char **argv)
    745734{
    746     const struct option options[] =
    747     {
    748         { "automate",       no_argument,        NULL, 'a' },
    749         { "auto-shutdown",  no_argument,        NULL, 'A' },
    750         { "daemonize",      no_argument,        NULL, 'd' },
    751         { "pidfile",        required_argument,  NULL, 'p' },
    752         { "pipe",           required_argument,  NULL, 'P' },
    753         { NULL,             0,                  NULL,  0  }
     735    /*
     736     * Initialize the VBox runtime without loading
     737     * the support driver
     738     */
     739    RTR3Init();
     740
     741    static const RTGETOPTDEF s_aOptions[] =
     742    {
     743        { "--automate",       'a', RTGETOPT_REQ_NOTHING },
     744        { "--auto-shutdown",  'A', RTGETOPT_REQ_NOTHING },
     745        { "--daemonize",      'd', RTGETOPT_REQ_NOTHING },
     746        { "--pidfile",        'p', RTGETOPT_REQ_STRING  },
     747        { "--pipe",           'P', RTGETOPT_REQ_UINT32  },
    754748    };
    755     int  c;
    756     bool fDaemonize = false;
    757     int  daemon_pipe_wr = -1;
    758 
    759     for (;;)
    760     {
    761         c = getopt_long(argc, argv, "", options, NULL);
    762         if (c == -1)
    763             break;
    764         switch (c)
     749
     750    bool            fDaemonize = false;
     751    int             daemon_pipe_wr = -1;
     752
     753    RTGETOPTSTATE   GetOptState;
     754    int vrc = RTGetOptInit(&GetOptState, argc, argv, &s_aOptions[0], RT_ELEMENTS(s_aOptions), 1, 0 /*fFlags*/);
     755    AssertRC(vrc);
     756
     757    RTGETOPTUNION   ValueUnion;
     758    while ((vrc = RTGetOpt(&GetOptState, &ValueUnion)))
     759    {
     760        switch (vrc)
    765761        {
    766762            case 'a':
     
    789785            case 'p':
    790786            {
    791                 pszPidFile = optarg;
     787                g_pszPidFile = ValueUnion.psz;
    792788                break;
    793789            }
    794790
    795             /* we need to exec on darwin, this is just an internal
    796              * hack for passing the pipe fd along to the final child. */
     791            /* This is just an internal hack for passing the pipe write fd
     792               along to the final child.  Internal use only. */
    797793            case 'P':
    798794            {
    799                 daemon_pipe_wr = atoi(optarg);
     795                daemon_pipe_wr = ValueUnion.u32;
    800796                break;
    801797            }
    802798
    803799            default:
    804             {
    805                 /* exit on invalid options */
    806                 return 1;
    807             }
    808         }
    809     }
    810 
    811     static RTFILE pidFile = NIL_RTFILE;
    812 
    813 #ifdef RT_OS_OS2
     800                return RTGetOptPrintError(vrc, &ValueUnion);
     801        }
     802    }
     803
     804#ifdef RT_OS_OS2 /** @todo There is almost no need to make a special case of OS/2 here. Just the execv call needs to be told to create a background process... */
    814805
    815806    /* nothing to do here, the process is supposed to be already
     
    854845                    fSuccess = true;
    855846                else
    856                     printf ("ERROR: Unknown message from child process (%s)\n", msg);
     847                    printf("ERROR: Unknown message from child process (%s)\n", msg);
    857848            }
    858849            else
    859                 printf ("ERROR: 0 bytes read from child process\n");
     850                printf("ERROR: 0 bytes read from child process\n");
    860851
    861852            /* close the reading end of the pipe as well and exit */
     
    931922        apszArgs[i++] = "--pipe";
    932923        char szPipeArg[32];
    933         RTStrPrintf (szPipeArg, sizeof (szPipeArg), "%d", daemon_pipe_wr);
     924        RTStrPrintf(szPipeArg, sizeof(szPipeArg), "%d", daemon_pipe_wr);
    934925        apszArgs[i++] = szPipeArg;
    935         if (pszPidFile)
     926        if (g_pszPidFile)
    936927        {
    937928            apszArgs[i++] = "--pidfile";
    938             apszArgs[i++] = pszPidFile;
     929            apszArgs[i++] = g_pszPidFile;
    939930        }
    940931        if (gAutoShutdown)
    941932            apszArgs[i++] = "--auto-shutdown";
    942         apszArgs[i++] = NULL; Assert(i <= RT_ELEMENTS(apszArgs));
    943         execv (apszArgs[0], (char * const *)apszArgs);
    944         exit (126);
     933        apszArgs[i++] = NULL;   Assert(i <= RT_ELEMENTS(apszArgs));
     934        execv(apszArgs[0], (char * const *)apszArgs);
     935        exit(126);
    945936    }
    946937
    947938#endif // !RT_OS_OS2
    948939
    949     /*
    950      * Initialize the VBox runtime without loading
    951      * the support driver
    952      */
    953     RTR3Init();
    954 
    955     nsresult rc;
     940    nsresult    rc;
    956941
    957942    do
    958943    {
    959944        rc = com::Initialize();
    960         if (NS_FAILED (rc))
    961         {
    962             printf ("ERROR: Failed to initialize XPCOM! (rc=%08X)\n", rc);
     945        if (NS_FAILED(rc))
     946        {
     947            printf("ERROR: Failed to initialize XPCOM! (rc=%08X)\n", rc);
    963948            break;
    964949        }
    965950
    966951        nsCOMPtr <nsIComponentRegistrar> registrar;
    967         rc = NS_GetComponentRegistrar (getter_AddRefs (registrar));
    968         if (NS_FAILED (rc))
    969         {
    970             printf ("ERROR: Failed to get component registrar! (rc=%08X)\n", rc);
     952        rc = NS_GetComponentRegistrar(getter_AddRefs(registrar));
     953        if (NS_FAILED(rc))
     954        {
     955            printf("ERROR: Failed to get component registrar! (rc=%08X)\n", rc);
    971956            break;
    972957        }
    973958
    974         registrar->AutoRegister (nsnull);
    975         rc = RegisterSelfComponents (registrar, components,
    976                                      NS_ARRAY_LENGTH (components));
    977         if (NS_FAILED (rc))
    978         {
    979             printf ("ERROR: Failed to register server components! (rc=%08X)\n", rc);
     959        registrar->AutoRegister(nsnull);
     960        rc = RegisterSelfComponents(registrar, components,
     961                                    NS_ARRAY_LENGTH (components));
     962        if (NS_FAILED(rc))
     963        {
     964            printf("ERROR: Failed to register server components! (rc=%08X)\n", rc);
    980965            break;
    981966        }
     
    984969         * gets created upon XPCOM startup, so it will use the main (this)
    985970         * thread's event queue to receive IPC events) */
    986         rc = NS_GetMainEventQ (&gEventQ);
    987         if (NS_FAILED (rc))
    988         {
    989             printf ("ERROR: Failed to get the main event queue! (rc=%08X)\n", rc);
     971        rc = NS_GetMainEventQ(&gEventQ);
     972        if (NS_FAILED(rc))
     973        {
     974            printf("ERROR: Failed to get the main event queue! (rc=%08X)\n", rc);
    990975            break;
    991976        }
     
    994979        if (NS_FAILED (rc))
    995980        {
    996             printf ("ERROR: Failed to get IPC service! (rc=%08X)\n", rc);
     981            printf("ERROR: Failed to get IPC service! (rc=%08X)\n", rc);
    997982            break;
    998983        }
    999984
    1000         NS_ADDREF (gIpcServ = ipcServ);
    1001 
    1002         LogFlowFunc (("Will use \"%s\" as server name.\n", VBOXSVC_IPC_NAME));
    1003 
    1004         rc = gIpcServ->AddName (VBOXSVC_IPC_NAME);
    1005         if (NS_FAILED (rc))
    1006         {
    1007             LogFlowFunc (("Failed to register the server name (rc=%08X)!\n"
    1008                           "Is another server already running?\n", rc));
    1009 
    1010             printf ("ERROR: Failed to register the server name \"%s\" (rc=%08X)!\n"
    1011                     "Is another server already running?\n",
    1012                     VBOXSVC_IPC_NAME, rc);
    1013             NS_RELEASE (gIpcServ);
     985        NS_ADDREF(gIpcServ = ipcServ);
     986
     987        LogFlowFunc(("Will use \"%s\" as server name.\n", VBOXSVC_IPC_NAME));
     988
     989        rc = gIpcServ->AddName(VBOXSVC_IPC_NAME);
     990        if (NS_FAILED(rc))
     991        {
     992            LogFlowFunc(("Failed to register the server name (rc=%Rhrc (%08X))!\n"
     993                         "Is another server already running?\n", rc, rc));
     994
     995            printf("ERROR: Failed to register the server name \"%s\" (rc=%08X)!\n"
     996                   "Is another server already running?\n",
     997                   VBOXSVC_IPC_NAME, rc);
     998            NS_RELEASE(gIpcServ);
    1014999            break;
    10151000        }
     
    10191004            struct sigaction sa;
    10201005            sa.sa_handler = signal_handler;
    1021             sigemptyset (&sa.sa_mask);
     1006            sigemptyset(&sa.sa_mask);
    10221007            sa.sa_flags = 0;
    1023             sigaction (SIGINT, &sa, NULL);
    1024             sigaction (SIGQUIT, &sa, NULL);
    1025             sigaction (SIGTERM, &sa, NULL);
    1026             sigaction (SIGTRAP, &sa, NULL);
     1008            sigaction(SIGINT, &sa, NULL);
     1009            sigaction(SIGQUIT, &sa, NULL);
     1010            sigaction(SIGTERM, &sa, NULL);
     1011            sigaction(SIGTRAP, &sa, NULL);
    10271012        }
    10281013
     
    10311016            int  iSize;
    10321017
    1033             iSize = snprintf (szBuf, sizeof(szBuf),
    1034                               "Sun VirtualBox XPCOM Server Version "
    1035                               VBOX_VERSION_STRING);
    1036             for (int i=iSize; i>0; i--)
     1018            iSize = RTStrPrintf(szBuf, sizeof(szBuf),
     1019                                "Sun VirtualBox XPCOM Server Version "
     1020                                VBOX_VERSION_STRING);
     1021            for (int i = iSize; i > 0; i--)
    10371022                putchar('*');
    1038             printf ("\n%s\n", szBuf);
    1039             printf ("(C) 2008-2009 Sun Microsystems, Inc.\n"
    1040                     "All rights reserved.\n");
     1023            printf("\n%s\n", szBuf);
     1024            printf("(C) 2008-2009 Sun Microsystems, Inc.\n"
     1025                   "All rights reserved.\n");
    10411026#ifdef DEBUG
    1042             printf ("Debug version.\n");
     1027            printf("Debug version.\n");
    10431028#endif
    1044 #if 0
    1045             /* in my opinion two lines enclosing the text look better */
    1046             for (int i=iSize; i>0; i--)
    1047                 putchar('*');
    1048             putchar('\n');
    1049 #endif
    10501029        }
    10511030
    10521031        if (daemon_pipe_wr >= 0)
    10531032        {
    1054             printf ("\nStarting event loop....\n[send TERM signal to quit]\n");
     1033            printf("\nStarting event loop....\n[send TERM signal to quit]\n");
    10551034            /* now we're ready, signal the parent process */
    10561035            write(daemon_pipe_wr, "READY", strlen("READY"));
    10571036        }
    10581037        else
    1059         {
    1060             printf ("\nStarting event loop....\n[press Ctrl-C to quit]\n");
    1061         }
    1062 
    1063         if (pszPidFile)
    1064         {
    1065             char szBuf[32];
    1066             const char *lf = "\n";
    1067             RTFileOpen(&pidFile, pszPidFile, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_NONE);
    1068             RTStrFormatNumber(szBuf, getpid(), 10, 0, 0, 0);
    1069             RTFileWrite(pidFile, szBuf, strlen(szBuf), NULL);
    1070             RTFileWrite(pidFile, lf, strlen(lf), NULL);
    1071             RTFileClose(pidFile);
    1072         }
    1073 
    1074 #ifndef RT_OS_OS2
     1038            printf("\nStarting event loop....\n[press Ctrl-C to quit]\n");
     1039
     1040        if (g_pszPidFile)
     1041        {
     1042            RTFILE pidFile = NIL_RTFILE;
     1043            vrc = RTFileOpen(&pidFile, g_pszPidFile, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_NONE);
     1044            if (RT_SUCCESS(vrc))
     1045            {
     1046                char szBuf[32];
     1047                const char *lf = "\n";
     1048                RTStrFormatNumber(szBuf, getpid(), 10, 0, 0, 0);
     1049                RTFileWrite(pidFile, szBuf, strlen(szBuf), NULL);
     1050                RTFileWrite(pidFile, lf, strlen(lf), NULL);
     1051                RTFileClose(pidFile);
     1052            }
     1053        }
     1054
    10751055        // Increase the file table size to 10240 or as high as possible.
    10761056        struct rlimit lim;
     
    10871067        else
    10881068            printf("WARNING: failed to obtain per-process file-descriptor limit (%d).\n", errno);
    1089 #endif
    10901069
    10911070        PLEvent *ev;
    10921071        while (gKeepRunning)
    10931072        {
    1094             gEventQ->WaitForEvent (&ev);
    1095             gEventQ->HandleEvent (ev);
     1073            gEventQ->WaitForEvent(&ev);
     1074            gEventQ->HandleEvent(ev);
    10961075        }
    10971076
     
    11041083        /* unregister ourselves. After this point, clients will start a new
    11051084         * process because they won't be able to resolve the server name.*/
    1106         gIpcServ->RemoveName (VBOXSVC_IPC_NAME);
     1085        gIpcServ->RemoveName(VBOXSVC_IPC_NAME);
    11071086
    11081087        /* process any remaining events. These events may include
     
    11121091        gEventQ->ProcessPendingEvents();
    11131092
    1114         printf ("Terminated event loop.\n");
     1093        printf("Terminated event loop.\n");
    11151094    }
    11161095    while (0); // this scopes the nsCOMPtrs
    11171096
    1118     NS_IF_RELEASE (gIpcServ);
    1119     NS_IF_RELEASE (gEventQ);
     1097    NS_IF_RELEASE(gIpcServ);
     1098    NS_IF_RELEASE(gEventQ);
    11201099
    11211100    /* no nsCOMPtrs are allowed to be alive when you call com::Shutdown(). */
    11221101
    1123     LogFlowFunc (("Calling com::Shutdown()...\n"));
     1102    LogFlowFunc(("Calling com::Shutdown()...\n"));
    11241103    rc = com::Shutdown();
    1125     LogFlowFunc (("Finished com::Shutdown() (rc=%08X)\n", rc));
     1104    LogFlowFunc(("Finished com::Shutdown() (rc=%Rhrc)\n", rc));
    11261105
    11271106    if (NS_FAILED (rc))
    1128         printf ("ERROR: Failed to shutdown XPCOM! (rc=%08X)\n", rc);
    1129 
    1130     printf ("XPCOM server has shutdown.\n");
    1131 
    1132     if (pszPidFile)
    1133     {
    1134         RTFileDelete(pszPidFile);
    1135     }
    1136 
     1107        printf("ERROR: Failed to shutdown XPCOM! (rc=%08X)\n", rc);
     1108
     1109    printf("XPCOM server has shutdown.\n");
     1110
     1111    if (g_pszPidFile)
     1112        RTFileDelete(g_pszPidFile);
     1113
     1114    /* close writing end of the pipe as well */
    11371115    if (daemon_pipe_wr >= 0)
    1138     {
    1139         /* close writing end of the pipe as well */
    11401116        close(daemon_pipe_wr);
    1141     }
    11421117
    11431118    return 0;
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