VirtualBox

Ignore:
Timestamp:
Jul 30, 2010 8:02:05 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
64275
Message:

xpcom: Use RTMem* for memory alloc so that we can more easily wrap direct it to the electric fence heap.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/libs/xpcom18a4/xpcom/proxy/src/nsProxyEvent.cpp

    r1 r31259  
    7676
    7777static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
    78        
     78
    7979static void* PR_CALLBACK EventHandler(PLEvent *self);
    8080static void  PR_CALLBACK DestroyHandler(PLEvent *self);
     
    8686nsProxyObjectCallInfo::nsProxyObjectCallInfo( nsProxyObject* owner,
    8787                                              nsXPTMethodInfo *methodInfo,
    88                                               PRUint32 methodIndex, 
    89                                               nsXPTCVariant* parameterList, 
    90                                               PRUint32 parameterCount, 
     88                                              PRUint32 methodIndex,
     89                                              nsXPTCVariant* parameterList,
     90                                              PRUint32 parameterCount,
    9191                                              PLEvent *event)
    9292{
     
    9494    NS_ASSERTION(methodInfo, "No nsXPTMethodInfo!");
    9595    NS_ASSERTION(event, "No PLEvent!");
    96    
     96
    9797    mCompleted        = 0;
    9898    mMethodIndex      = methodIndex;
     
    104104
    105105    mOwner            = owner;
    106    
     106
    107107    RefCountInInterfacePointers(PR_TRUE);
    108108    if (mOwner->GetProxyType() & PROXY_ASYNC)
     
    118118
    119119    mOwner = nsnull;
    120    
     120
    121121    PR_FREEIF(mEvent);
    122    
    123     if (mParameterList) 
     122
     123    if (mParameterList)
     124#ifdef VBOX_USE_IPRT_IN_XPCOM
     125        nsMemory::Free((void*) mParameterList);
     126#else
    124127        free( (void*) mParameterList);
     128#endif
    125129}
    126130
     
    139143            {
    140144                anInterface = ((nsISupports*)mParameterList[i].val.p);
    141                
     145
    142146                if (anInterface)
    143147                {
     
    146150                    else
    147151                        anInterface->Release();
    148            
     152
    149153                }
    150154            }
     
    170174
    171175            if (copy)
    172             {               
    173                 switch (type_tag) 
     176            {
     177                switch (type_tag)
    174178                {
    175                     case nsXPTType::T_CHAR_STR:                               
     179                    case nsXPTType::T_CHAR_STR:
    176180                        mParameterList[i].val.p =
    177181                            PL_strdup((const char *)ptr);
     
    183187                    case nsXPTType::T_DOMSTRING:
    184188                    case nsXPTType::T_ASTRING:
    185                         mParameterList[i].val.p = 
     189                        mParameterList[i].val.p =
    186190                            new nsString(*((nsAString*) ptr));
    187191                        break;
    188192                    case nsXPTType::T_CSTRING:
    189                         mParameterList[i].val.p = 
     193                        mParameterList[i].val.p =
    190194                            new nsCString(*((nsACString*) ptr));
    191195                        break;
    192                     case nsXPTType::T_UTF8STRING:                       
    193                         mParameterList[i].val.p = 
     196                    case nsXPTType::T_UTF8STRING:
     197                        mParameterList[i].val.p =
    194198                            new nsUTF8String(*((nsAUTF8String*) ptr));
    195199                        break;
    196200                    default:
    197201                        // Other types are ignored
    198                         break;                   
     202                        break;
    199203                }
    200204            }
    201205            else
    202206            {
    203                 switch (type_tag) 
     207                switch (type_tag)
    204208                {
    205209                    case nsXPTType::T_CHAR_STR:
     
    226230}
    227231
    228 PRBool               
     232PRBool
    229233nsProxyObjectCallInfo::GetCompleted()
    230234{
     
    238242}
    239243
    240 void               
     244void
    241245nsProxyObjectCallInfo::PostCompleted()
    242246{
     
    244248    {
    245249        PLEvent *event = PR_NEW(PLEvent);
    246    
    247         PL_InitEvent(event, 
     250
     251        PL_InitEvent(event,
    248252                     this,
    249253                     CompletedEventHandler,
    250254                     CompletedDestroyHandler);
    251    
     255
    252256        mCallersEventQ->PostSynchronousEvent(event, nsnull);
    253257        PR_FREEIF(event);
     
    259263    }
    260264}
    261  
    262 nsIEventQueue*     
    263 nsProxyObjectCallInfo::GetCallersQueue() 
    264 { 
     265
     266nsIEventQueue*
     267nsProxyObjectCallInfo::GetCallersQueue()
     268{
    265269    return mCallersEventQ;
    266 }   
     270}
    267271void
    268272nsProxyObjectCallInfo::SetCallersQueue(nsIEventQueue* queue)
    269273{
    270274    mCallersEventQ = queue;
    271 }   
     275}
    272276
    273277
     
    286290    mEventQService = do_GetService(kEventQueueServiceCID);
    287291
    288     nsComponentManager::CreateInstance(aClass, 
     292    nsComponentManager::CreateInstance(aClass,
    289293                                       aDelegate,
    290294                                       aIID,
     
    296300
    297301nsProxyObject::~nsProxyObject()
    298 {   
    299     // I am worried about order of destruction here. 
     302{
     303    // I am worried about order of destruction here.
    300304    // do not remove assignments.
    301    
     305
    302306    mRealObject = 0;
    303307    mDestQueue  = 0;
     
    315319nsProxyObject::Release(void)
    316320{
    317   NS_PRECONDITION(0 != mRefCnt, "dup release");             
     321  NS_PRECONDITION(0 != mRefCnt, "dup release");
    318322
    319323  nsrefcnt count = PR_AtomicDecrement((PRInt32 *)&mRefCnt);
     
    343347           return;  // if this happens we are going to leak.
    344348       }
    345        
    346        PL_InitEvent(event, 
     349
     350       PL_InitEvent(event,
    347351                    this,
    348352                    ProxyDestructorEventHandler,
    349                     ProxyDestructorDestroyHandler); 
     353                    ProxyDestructorDestroyHandler);
    350354
    351355       mDestQueue->PostEvent(event);
    352   }                         
    353 }               
     356  }
     357}
    354358
    355359
     
    357361nsProxyObject::PostAndWait(nsProxyObjectCallInfo *proxyInfo)
    358362{
    359     if (proxyInfo == nsnull || mEventQService == nsnull) 
     363    if (proxyInfo == nsnull || mEventQService == nsnull)
    360364        return NS_ERROR_NULL_POINTER;
    361    
     365
    362366    PRBool eventLoopCreated = PR_FALSE;
    363     nsresult rv; 
     367    nsresult rv;
    364368
    365369    nsCOMPtr<nsIEventQueue> eventQ;
     
    371375        if (NS_FAILED(rv))
    372376            return rv;
    373        
     377
    374378        rv = mEventQService->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(eventQ));
    375379    }
     
    377381    if (NS_FAILED(rv))
    378382        return rv;
    379    
     383
    380384    proxyInfo->SetCallersQueue(eventQ);
    381385
     
    383387    if (!event)
    384388        return NS_ERROR_NULL_POINTER;
    385    
     389
    386390    mDestQueue->PostEvent(event);
    387391
     
    391395        rv = eventQ->WaitForEvent(&nextEvent);
    392396        if (NS_FAILED(rv)) break;
    393                
     397
    394398        eventQ->HandleEvent(nextEvent);
    395     } 
     399    }
    396400
    397401    if (eventLoopCreated)
     
    400404         eventQ = 0;
    401405    }
    402    
     406
    403407    return rv;
    404408}
    405        
    406        
     409
     410
    407411nsresult
    408 nsProxyObject::convertMiniVariantToVariant(nsXPTMethodInfo *methodInfo, 
    409                                            nsXPTCMiniVariant * params, 
    410                                            nsXPTCVariant **fullParam, 
     412nsProxyObject::convertMiniVariantToVariant(nsXPTMethodInfo *methodInfo,
     413                                           nsXPTCMiniVariant * params,
     414                                           nsXPTCVariant **fullParam,
    411415                                           uint8 *outParamCount)
    412416{
     
    416420
    417421    if (!paramCount) return NS_OK;
    418        
     422
     423#ifdef VBOX_USE_IPRT_IN_XPCOM
     424    *fullParam = (nsXPTCVariant*)nsMemory::Alloc(sizeof(nsXPTCVariant) * paramCount);
     425#else
    419426    *fullParam = (nsXPTCVariant*)malloc(sizeof(nsXPTCVariant) * paramCount);
    420    
     427#endif
     428
    421429    if (*fullParam == nsnull)
    422430        return NS_ERROR_OUT_OF_MEMORY;
    423    
     431
    424432    for (int i = 0; i < paramCount; i++)
    425433    {
     
    427435        if ((mProxyType & PROXY_ASYNC) && paramInfo.IsDipper())
    428436        {
    429             NS_WARNING("Async proxying of out parameters is not supported"); 
     437            NS_WARNING("Async proxying of out parameters is not supported");
    430438            return NS_ERROR_PROXY_INVALID_OUT_PARAMETER;
    431439        }
     
    433441        (*fullParam)[i].Init(params[i], paramInfo.GetType(), flags);
    434442    }
    435    
     443
    436444    return NS_OK;
    437445}
    438        
     446
    439447nsresult
    440 nsProxyObject::Post( PRUint32 methodIndex, 
    441                      nsXPTMethodInfo *methodInfo, 
    442                      nsXPTCMiniVariant * params, 
    443                      nsIInterfaceInfo *interfaceInfo)           
    444 {
    445     nsresult rv = NS_OK; 
     448nsProxyObject::Post( PRUint32 methodIndex,
     449                     nsXPTMethodInfo *methodInfo,
     450                     nsXPTCMiniVariant * params,
     451                     nsIInterfaceInfo *interfaceInfo)
     452{
     453    nsresult rv = NS_OK;
    446454
    447455    if (! mDestQueue  || ! mRealObject)
     
    450458    if (methodInfo->IsNotXPCOM())
    451459        return NS_ERROR_PROXY_INVALID_IN_PARAMETER;
    452    
     460
    453461    nsXPTCVariant *fullParam;
    454     uint8 paramCount; 
     462    uint8 paramCount;
    455463    rv = convertMiniVariantToVariant(methodInfo, params, &fullParam, &paramCount);
    456    
     464
    457465    if (NS_FAILED(rv))
    458466        return rv;
     
    462470    // see if we should call into the method directly. Either it is a QI function call
    463471    // (methodIndex == 0), or it is a sync proxy and this code is running on the same thread
    464     // as the destination event queue. 
     472    // as the destination event queue.
    465473    if ( (methodIndex == 0) ||
    466          (mProxyType & PROXY_SYNC && 
     474         (mProxyType & PROXY_SYNC &&
    467475          NS_SUCCEEDED(mDestQueue->IsOnCurrentThread(&callDirectly)) &&
    468476          callDirectly))
     
    470478
    471479        // invoke the magic of xptc...
    472         nsresult rv = XPTC_InvokeByIndex( mRealObject, 
     480        nsresult rv = XPTC_InvokeByIndex( mRealObject,
    473481                                          methodIndex,
    474                                           paramCount, 
     482                                          paramCount,
    475483                                          fullParam);
    476        
    477         if (fullParam)
     484
     485        if (fullParam)
     486#ifdef VBOX_USE_IPRT_IN_XPCOM
     487            nsMemory::Free(fullParam);
     488#else
    478489            free(fullParam);
     490#endif
    479491        return rv;
    480492    }
    481493
    482494    PLEvent *event = PR_NEW(PLEvent);
    483    
     495
    484496    if (event == nsnull) {
    485         if (fullParam)
     497        if (fullParam)
     498#ifdef VBOX_USE_IPRT_IN_XPCOM
     499            nsMemory::Free(fullParam);
     500#else
    486501            free(fullParam);
    487         return NS_ERROR_OUT_OF_MEMORY;   
    488     }
    489 
    490     nsProxyObjectCallInfo *proxyInfo = new nsProxyObjectCallInfo(this,
    491                                                                  methodInfo,
    492                                                                  methodIndex,
     502#endif
     503        return NS_ERROR_OUT_OF_MEMORY;
     504    }
     505
     506    nsProxyObjectCallInfo *proxyInfo = new nsProxyObjectCallInfo(this,
     507                                                                 methodInfo,
     508                                                                 methodIndex,
    493509                                                                 fullParam,   // will be deleted by ~()
    494                                                                  paramCount, 
     510                                                                 paramCount,
    495511                                                                 event);      // will be deleted by ~()
    496    
     512
    497513    if (proxyInfo == nsnull) {
    498514        PR_DELETE(event);
    499515        if (fullParam)
     516#ifdef VBOX_USE_IPRT_IN_XPCOM
     517            nsMemory::Free(fullParam);
     518#else
    500519            free(fullParam);
    501         return NS_ERROR_OUT_OF_MEMORY; 
    502     }
    503 
    504     PL_InitEvent(event,
     520#endif
     521        return NS_ERROR_OUT_OF_MEMORY;
     522    }
     523
     524    PL_InitEvent(event,
    505525                 proxyInfo,
    506526                 EventHandler,
    507527                 DestroyHandler);
    508    
     528
    509529    if (mProxyType & PROXY_SYNC)
    510530    {
    511531        rv = PostAndWait(proxyInfo);
    512        
     532
    513533        if (NS_SUCCEEDED(rv))
    514534            rv = proxyInfo->GetResult();
     
    516536        return rv;
    517537    }
    518    
     538
    519539    if (mProxyType & PROXY_ASYNC)
    520540    {
     
    527547
    528548
    529 static void DestroyHandler(PLEvent *self) 
     549static void DestroyHandler(PLEvent *self)
    530550{
    531551    nsProxyObjectCallInfo* owner = (nsProxyObjectCallInfo*)PL_GetEventOwner(self);
    532552    nsProxyObject* proxyObject = owner->GetProxyObject();
    533    
     553
    534554    if (proxyObject == nsnull)
    535555        return;
    536  
     556
    537557    if (proxyObject->GetProxyType() & PROXY_ASYNC)
    538     {       
     558    {
    539559        delete owner;
    540560    }
     
    546566}
    547567
    548 static void* EventHandler(PLEvent *self) 
     568static void* EventHandler(PLEvent *self)
    549569{
    550570    nsProxyObjectCallInfo *info = (nsProxyObjectCallInfo*)PL_GetEventOwner(self);
    551571    NS_ASSERTION(info, "No nsProxyObjectCallInfo!");
    552    
     572
    553573    nsProxyObject *proxyObject = info->GetProxyObject();
    554        
     574
    555575    if (proxyObject)
    556576    {
    557577        // invoke the magic of xptc...
    558         nsresult rv = XPTC_InvokeByIndex( proxyObject->GetRealObject(), 
     578        nsresult rv = XPTC_InvokeByIndex( proxyObject->GetRealObject(),
    559579                                          info->GetMethodIndex(),
    560                                           info->GetParameterCount(), 
     580                                          info->GetParameterCount(),
    561581                                          info->GetParameterList());
    562582        info->SetResult(rv);
     
    569589}
    570590
    571 static void CompletedDestroyHandler(PLEvent *self) 
    572 {
    573 }
    574 
    575 static void* CompletedEventHandler(PLEvent *self) 
     591static void CompletedDestroyHandler(PLEvent *self)
     592{
     593}
     594
     595static void* CompletedEventHandler(PLEvent *self)
    576596{
    577597    nsProxyObjectCallInfo* owner = (nsProxyObjectCallInfo*)PL_GetEventOwner(self);
     
    581601
    582602static void* ProxyDestructorEventHandler(PLEvent *self)
    583 {             
     603{
    584604    nsProxyObject* owner = (nsProxyObject*) PL_GetEventOwner(self);
    585605    NS_DELETEXPCOM(owner);
    586     return nsnull;                                           
     606    return nsnull;
    587607}
    588608
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