Changeset 31259 in vbox for trunk/src/libs/xpcom18a4/xpcom/proxy
- Timestamp:
- Jul 30, 2010 8:02:05 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 64275
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/libs/xpcom18a4/xpcom/proxy/src/nsProxyEvent.cpp
r1 r31259 76 76 77 77 static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID); 78 78 79 79 static void* PR_CALLBACK EventHandler(PLEvent *self); 80 80 static void PR_CALLBACK DestroyHandler(PLEvent *self); … … 86 86 nsProxyObjectCallInfo::nsProxyObjectCallInfo( nsProxyObject* owner, 87 87 nsXPTMethodInfo *methodInfo, 88 PRUint32 methodIndex, 89 nsXPTCVariant* parameterList, 90 PRUint32 parameterCount, 88 PRUint32 methodIndex, 89 nsXPTCVariant* parameterList, 90 PRUint32 parameterCount, 91 91 PLEvent *event) 92 92 { … … 94 94 NS_ASSERTION(methodInfo, "No nsXPTMethodInfo!"); 95 95 NS_ASSERTION(event, "No PLEvent!"); 96 96 97 97 mCompleted = 0; 98 98 mMethodIndex = methodIndex; … … 104 104 105 105 mOwner = owner; 106 106 107 107 RefCountInInterfacePointers(PR_TRUE); 108 108 if (mOwner->GetProxyType() & PROXY_ASYNC) … … 118 118 119 119 mOwner = nsnull; 120 120 121 121 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 124 127 free( (void*) mParameterList); 128 #endif 125 129 } 126 130 … … 139 143 { 140 144 anInterface = ((nsISupports*)mParameterList[i].val.p); 141 145 142 146 if (anInterface) 143 147 { … … 146 150 else 147 151 anInterface->Release(); 148 152 149 153 } 150 154 } … … 170 174 171 175 if (copy) 172 { 173 switch (type_tag) 176 { 177 switch (type_tag) 174 178 { 175 case nsXPTType::T_CHAR_STR: 179 case nsXPTType::T_CHAR_STR: 176 180 mParameterList[i].val.p = 177 181 PL_strdup((const char *)ptr); … … 183 187 case nsXPTType::T_DOMSTRING: 184 188 case nsXPTType::T_ASTRING: 185 mParameterList[i].val.p = 189 mParameterList[i].val.p = 186 190 new nsString(*((nsAString*) ptr)); 187 191 break; 188 192 case nsXPTType::T_CSTRING: 189 mParameterList[i].val.p = 193 mParameterList[i].val.p = 190 194 new nsCString(*((nsACString*) ptr)); 191 195 break; 192 case nsXPTType::T_UTF8STRING: 193 mParameterList[i].val.p = 196 case nsXPTType::T_UTF8STRING: 197 mParameterList[i].val.p = 194 198 new nsUTF8String(*((nsAUTF8String*) ptr)); 195 199 break; 196 200 default: 197 201 // Other types are ignored 198 break; 202 break; 199 203 } 200 204 } 201 205 else 202 206 { 203 switch (type_tag) 207 switch (type_tag) 204 208 { 205 209 case nsXPTType::T_CHAR_STR: … … 226 230 } 227 231 228 PRBool 232 PRBool 229 233 nsProxyObjectCallInfo::GetCompleted() 230 234 { … … 238 242 } 239 243 240 void 244 void 241 245 nsProxyObjectCallInfo::PostCompleted() 242 246 { … … 244 248 { 245 249 PLEvent *event = PR_NEW(PLEvent); 246 247 PL_InitEvent(event, 250 251 PL_InitEvent(event, 248 252 this, 249 253 CompletedEventHandler, 250 254 CompletedDestroyHandler); 251 255 252 256 mCallersEventQ->PostSynchronousEvent(event, nsnull); 253 257 PR_FREEIF(event); … … 259 263 } 260 264 } 261 262 nsIEventQueue* 263 nsProxyObjectCallInfo::GetCallersQueue() 264 { 265 266 nsIEventQueue* 267 nsProxyObjectCallInfo::GetCallersQueue() 268 { 265 269 return mCallersEventQ; 266 } 270 } 267 271 void 268 272 nsProxyObjectCallInfo::SetCallersQueue(nsIEventQueue* queue) 269 273 { 270 274 mCallersEventQ = queue; 271 } 275 } 272 276 273 277 … … 286 290 mEventQService = do_GetService(kEventQueueServiceCID); 287 291 288 nsComponentManager::CreateInstance(aClass, 292 nsComponentManager::CreateInstance(aClass, 289 293 aDelegate, 290 294 aIID, … … 296 300 297 301 nsProxyObject::~nsProxyObject() 298 { 299 // I am worried about order of destruction here. 302 { 303 // I am worried about order of destruction here. 300 304 // do not remove assignments. 301 305 302 306 mRealObject = 0; 303 307 mDestQueue = 0; … … 315 319 nsProxyObject::Release(void) 316 320 { 317 NS_PRECONDITION(0 != mRefCnt, "dup release"); 321 NS_PRECONDITION(0 != mRefCnt, "dup release"); 318 322 319 323 nsrefcnt count = PR_AtomicDecrement((PRInt32 *)&mRefCnt); … … 343 347 return; // if this happens we are going to leak. 344 348 } 345 346 PL_InitEvent(event, 349 350 PL_InitEvent(event, 347 351 this, 348 352 ProxyDestructorEventHandler, 349 ProxyDestructorDestroyHandler); 353 ProxyDestructorDestroyHandler); 350 354 351 355 mDestQueue->PostEvent(event); 352 } 353 } 356 } 357 } 354 358 355 359 … … 357 361 nsProxyObject::PostAndWait(nsProxyObjectCallInfo *proxyInfo) 358 362 { 359 if (proxyInfo == nsnull || mEventQService == nsnull) 363 if (proxyInfo == nsnull || mEventQService == nsnull) 360 364 return NS_ERROR_NULL_POINTER; 361 365 362 366 PRBool eventLoopCreated = PR_FALSE; 363 nsresult rv; 367 nsresult rv; 364 368 365 369 nsCOMPtr<nsIEventQueue> eventQ; … … 371 375 if (NS_FAILED(rv)) 372 376 return rv; 373 377 374 378 rv = mEventQService->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(eventQ)); 375 379 } … … 377 381 if (NS_FAILED(rv)) 378 382 return rv; 379 383 380 384 proxyInfo->SetCallersQueue(eventQ); 381 385 … … 383 387 if (!event) 384 388 return NS_ERROR_NULL_POINTER; 385 389 386 390 mDestQueue->PostEvent(event); 387 391 … … 391 395 rv = eventQ->WaitForEvent(&nextEvent); 392 396 if (NS_FAILED(rv)) break; 393 397 394 398 eventQ->HandleEvent(nextEvent); 395 } 399 } 396 400 397 401 if (eventLoopCreated) … … 400 404 eventQ = 0; 401 405 } 402 406 403 407 return rv; 404 408 } 405 406 409 410 407 411 nsresult 408 nsProxyObject::convertMiniVariantToVariant(nsXPTMethodInfo *methodInfo, 409 nsXPTCMiniVariant * params, 410 nsXPTCVariant **fullParam, 412 nsProxyObject::convertMiniVariantToVariant(nsXPTMethodInfo *methodInfo, 413 nsXPTCMiniVariant * params, 414 nsXPTCVariant **fullParam, 411 415 uint8 *outParamCount) 412 416 { … … 416 420 417 421 if (!paramCount) return NS_OK; 418 422 423 #ifdef VBOX_USE_IPRT_IN_XPCOM 424 *fullParam = (nsXPTCVariant*)nsMemory::Alloc(sizeof(nsXPTCVariant) * paramCount); 425 #else 419 426 *fullParam = (nsXPTCVariant*)malloc(sizeof(nsXPTCVariant) * paramCount); 420 427 #endif 428 421 429 if (*fullParam == nsnull) 422 430 return NS_ERROR_OUT_OF_MEMORY; 423 431 424 432 for (int i = 0; i < paramCount; i++) 425 433 { … … 427 435 if ((mProxyType & PROXY_ASYNC) && paramInfo.IsDipper()) 428 436 { 429 NS_WARNING("Async proxying of out parameters is not supported"); 437 NS_WARNING("Async proxying of out parameters is not supported"); 430 438 return NS_ERROR_PROXY_INVALID_OUT_PARAMETER; 431 439 } … … 433 441 (*fullParam)[i].Init(params[i], paramInfo.GetType(), flags); 434 442 } 435 443 436 444 return NS_OK; 437 445 } 438 446 439 447 nsresult 440 nsProxyObject::Post( PRUint32 methodIndex, 441 nsXPTMethodInfo *methodInfo, 442 nsXPTCMiniVariant * params, 443 nsIInterfaceInfo *interfaceInfo) 444 { 445 nsresult rv = NS_OK; 448 nsProxyObject::Post( PRUint32 methodIndex, 449 nsXPTMethodInfo *methodInfo, 450 nsXPTCMiniVariant * params, 451 nsIInterfaceInfo *interfaceInfo) 452 { 453 nsresult rv = NS_OK; 446 454 447 455 if (! mDestQueue || ! mRealObject) … … 450 458 if (methodInfo->IsNotXPCOM()) 451 459 return NS_ERROR_PROXY_INVALID_IN_PARAMETER; 452 460 453 461 nsXPTCVariant *fullParam; 454 uint8 paramCount; 462 uint8 paramCount; 455 463 rv = convertMiniVariantToVariant(methodInfo, params, &fullParam, ¶mCount); 456 464 457 465 if (NS_FAILED(rv)) 458 466 return rv; … … 462 470 // see if we should call into the method directly. Either it is a QI function call 463 471 // (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. 465 473 if ( (methodIndex == 0) || 466 (mProxyType & PROXY_SYNC && 474 (mProxyType & PROXY_SYNC && 467 475 NS_SUCCEEDED(mDestQueue->IsOnCurrentThread(&callDirectly)) && 468 476 callDirectly)) … … 470 478 471 479 // invoke the magic of xptc... 472 nsresult rv = XPTC_InvokeByIndex( mRealObject, 480 nsresult rv = XPTC_InvokeByIndex( mRealObject, 473 481 methodIndex, 474 paramCount, 482 paramCount, 475 483 fullParam); 476 477 if (fullParam) 484 485 if (fullParam) 486 #ifdef VBOX_USE_IPRT_IN_XPCOM 487 nsMemory::Free(fullParam); 488 #else 478 489 free(fullParam); 490 #endif 479 491 return rv; 480 492 } 481 493 482 494 PLEvent *event = PR_NEW(PLEvent); 483 495 484 496 if (event == nsnull) { 485 if (fullParam) 497 if (fullParam) 498 #ifdef VBOX_USE_IPRT_IN_XPCOM 499 nsMemory::Free(fullParam); 500 #else 486 501 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, 493 509 fullParam, // will be deleted by ~() 494 paramCount, 510 paramCount, 495 511 event); // will be deleted by ~() 496 512 497 513 if (proxyInfo == nsnull) { 498 514 PR_DELETE(event); 499 515 if (fullParam) 516 #ifdef VBOX_USE_IPRT_IN_XPCOM 517 nsMemory::Free(fullParam); 518 #else 500 519 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, 505 525 proxyInfo, 506 526 EventHandler, 507 527 DestroyHandler); 508 528 509 529 if (mProxyType & PROXY_SYNC) 510 530 { 511 531 rv = PostAndWait(proxyInfo); 512 532 513 533 if (NS_SUCCEEDED(rv)) 514 534 rv = proxyInfo->GetResult(); … … 516 536 return rv; 517 537 } 518 538 519 539 if (mProxyType & PROXY_ASYNC) 520 540 { … … 527 547 528 548 529 static void DestroyHandler(PLEvent *self) 549 static void DestroyHandler(PLEvent *self) 530 550 { 531 551 nsProxyObjectCallInfo* owner = (nsProxyObjectCallInfo*)PL_GetEventOwner(self); 532 552 nsProxyObject* proxyObject = owner->GetProxyObject(); 533 553 534 554 if (proxyObject == nsnull) 535 555 return; 536 556 537 557 if (proxyObject->GetProxyType() & PROXY_ASYNC) 538 { 558 { 539 559 delete owner; 540 560 } … … 546 566 } 547 567 548 static void* EventHandler(PLEvent *self) 568 static void* EventHandler(PLEvent *self) 549 569 { 550 570 nsProxyObjectCallInfo *info = (nsProxyObjectCallInfo*)PL_GetEventOwner(self); 551 571 NS_ASSERTION(info, "No nsProxyObjectCallInfo!"); 552 572 553 573 nsProxyObject *proxyObject = info->GetProxyObject(); 554 574 555 575 if (proxyObject) 556 576 { 557 577 // invoke the magic of xptc... 558 nsresult rv = XPTC_InvokeByIndex( proxyObject->GetRealObject(), 578 nsresult rv = XPTC_InvokeByIndex( proxyObject->GetRealObject(), 559 579 info->GetMethodIndex(), 560 info->GetParameterCount(), 580 info->GetParameterCount(), 561 581 info->GetParameterList()); 562 582 info->SetResult(rv); … … 569 589 } 570 590 571 static void CompletedDestroyHandler(PLEvent *self) 572 { 573 } 574 575 static void* CompletedEventHandler(PLEvent *self) 591 static void CompletedDestroyHandler(PLEvent *self) 592 { 593 } 594 595 static void* CompletedEventHandler(PLEvent *self) 576 596 { 577 597 nsProxyObjectCallInfo* owner = (nsProxyObjectCallInfo*)PL_GetEventOwner(self); … … 581 601 582 602 static void* ProxyDestructorEventHandler(PLEvent *self) 583 { 603 { 584 604 nsProxyObject* owner = (nsProxyObject*) PL_GetEventOwner(self); 585 605 NS_DELETEXPCOM(owner); 586 return nsnull; 606 return nsnull; 587 607 } 588 608
Note:
See TracChangeset
for help on using the changeset viewer.