Changeset 26582 in vbox for trunk/src/libs/xpcom18a4/ipc/ipcd/client
- Timestamp:
- Feb 16, 2010 3:01:50 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/libs/xpcom18a4/ipc/ipcd/client/src/ipcdclient.cpp
r26566 r26582 405 405 break; 406 406 } 407 #ifdef VBOX 408 else 409 { 410 /* Special client liveness check if there is no message to process. 411 * This is necessary as there might be several threads waiting for 412 * a message from a single client, and only one gets the DOWN msg. */ 413 PRBool alive = (aSelector)(aArg, td, NULL); 414 if (!alive) 415 { 416 *aMsg = NULL; 417 break; 418 } 419 } 420 #endif /* VBOX */ 407 421 408 422 PRIntervalTime t = PR_IntervalNow(); … … 587 601 WaitIPCMResponseSelector(void *arg, ipcTargetData *td, const ipcMessage *msg) 588 602 { 603 #ifdef VBOX 604 if (!msg) 605 return PR_TRUE; 606 #endif /* VBOX */ 589 607 PRUint32 requestIndex = *(PRUint32 *) arg; 590 608 return IPCM_GetRequestIndex(msg) == requestIndex; … … 914 932 { 915 933 WaitMessageSelectorData *data = (WaitMessageSelectorData *) arg; 934 #ifdef VBOX 935 if (!msg) 936 { 937 /* Special NULL message which asks to check whether the client is 938 * still alive. Called when there is nothing suitable in the queue. */ 939 ipcIMessageObserver *obs = data->observer; 940 if (!obs) 941 obs = td->observer; 942 NS_ASSERTION(obs, "must at least have a default observer"); 943 944 nsresult rv = obs->OnMessageAvailable(IPC_SENDER_ANY, nsID(), 0, 0); 945 if (rv != IPC_WAIT_NEXT_MESSAGE) 946 { 947 data->senderDead = PR_TRUE; 948 return PR_FALSE; 949 } 950 return PR_TRUE; 951 } 952 #endif /* VBOX */ 916 953 917 954 // process the specially forwarded client state message to see if the … … 943 980 { 944 981 // otherwise inform the observer about the client death using a special 945 // null message with an emp ly target id, and fail IPC_WaitMessage call982 // null message with an empty target id, and fail IPC_WaitMessage call 946 983 // with NS_ERROR_xxx only if the observer accepts this message. 947 984 … … 959 996 } 960 997 } 998 #ifdef VBOX 999 else if ((data->senderID == IPC_SENDER_ANY || 1000 status->ClientID() == data->senderID) && 1001 status->ClientState() == IPCM_CLIENT_STATE_UP) 1002 { 1003 LOG(("sender (%d) we're waiting a message from (%d) has come up\n", 1004 status->ClientID(), data->senderID)); 1005 if (data->senderID == IPC_SENDER_ANY) 1006 { 1007 // inform the observer about the client appearance using a special 1008 // null message with an empty target id, but a length of 1. 1009 1010 ipcIMessageObserver *obs = data->observer; 1011 if (!obs) 1012 obs = td->observer; 1013 NS_ASSERTION(obs, "must at least have a default observer"); 1014 1015 nsresult rv = obs->OnMessageAvailable(status->ClientID(), nsID(), 0, 1); 1016 /* VBoxSVC/VBoxXPCOMIPCD auto-start can cause that a client up 1017 * message arrives while we're already waiting for a response 1018 * from this client. Don't declare the connection as dead in 1019 * this case. A client ID wraparound can't falsely trigger 1020 * this, since the waiting thread would have hit the liveness 1021 * check in the mean time. Also, DO NOT consume the message, 1022 * otherwise it gets passed to the DConnect message handling 1023 * without any further checks. IPCM messages are automatically 1024 * discarded if they are left unclaimed. */ 1025 } 1026 } 1027 #endif /* VBOX */ 961 1028 break; 962 1029 }
Note:
See TracChangeset
for help on using the changeset viewer.