Index: /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.cpp
===================================================================
--- /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.cpp	(revision 26626)
+++ /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.cpp	(revision 26627)
@@ -1312,8 +1312,7 @@
         // entries and free one element if there's still no space (if needed).
         PRIntervalTime now = PR_IntervalNow();
-        do {
+        while (!g_ClientDownList.empty())
+        {
             ClientDownInfo *cInfo = g_ClientDownList.back();
-            if (!cInfo)
-                break;
             PRInt64 diff = (PRInt64)now - cInfo->uTimestamp;
             if (diff < 0)
@@ -1323,18 +1322,23 @@
                 g_ClientDownMap.erase(cInfo->uClient);
                 g_ClientDownList.pop_back();
+                NS_ASSERTION(g_ClientDownMap.size() == g_ClientDownList.size(),
+                             "client down info inconsistency during expiry");
                 delete cInfo;
             }
             else
                 break;
-        } while (true);
+        }
 
         ClientDownMap::iterator it = g_ClientDownMap.find(aSenderID);
         if (it == g_ClientDownMap.end())
         {
-            while (g_ClientDownList.size() >= MAX_CLIENT_DOWN_SIZE)
+            /* Getting size of a map is O(1), size of a list can be O(n). */
+            while (g_ClientDownMap.size() >= MAX_CLIENT_DOWN_SIZE)
             {
                 ClientDownInfo *cInfo = g_ClientDownList.back();
                 g_ClientDownMap.erase(cInfo->uClient);
                 g_ClientDownList.pop_back();
+                NS_ASSERTION(g_ClientDownMap.size() == g_ClientDownList.size(),
+                             "client down info inconsistency during emergency evicting");
                 delete cInfo;
             }
@@ -1343,4 +1347,6 @@
             g_ClientDownMap[aSenderID] = cInfo;
             g_ClientDownList.push_front(cInfo);
+            NS_ASSERTION(g_ClientDownMap.size() == g_ClientDownList.size(),
+                         "client down info inconsistency after adding entry");
         }
         return (aSenderID == mPeer) ? NS_OK : IPC_WAIT_NEXT_MESSAGE;
@@ -1356,4 +1362,6 @@
             g_ClientDownMap.erase(it);
             g_ClientDownList.remove(cInfo);
+            NS_ASSERTION(g_ClientDownMap.size() == g_ClientDownList.size(),
+                         "client down info inconsistency in client up case");
             delete cInfo;
         }
