diff --git a/addon-sdk/source/test/addons/content-permissions/httpd.js b/addon-sdk/source/test/addons/content-permissions/httpd.js index 3e762d1fa6c4..a9b59bb54c76 100644 --- a/addon-sdk/source/test/addons/content-permissions/httpd.js +++ b/addon-sdk/source/test/addons/content-permissions/httpd.js @@ -5177,11 +5177,7 @@ function server(port, basePath) gThreadManager.spinEventLoopUntil(() => srv.isStopped()); - var thread = gThreadManager.currentThread; - - // get rid of any pending requests - while (thread.hasPendingEvents()) - thread.processNextEvent(true); + gThreadManager.spinEventLoopUntilEmpty(); DEBUG = false; } diff --git a/addon-sdk/source/test/addons/content-script-messages-latency/httpd.js b/addon-sdk/source/test/addons/content-script-messages-latency/httpd.js index 3e762d1fa6c4..a9b59bb54c76 100644 --- a/addon-sdk/source/test/addons/content-script-messages-latency/httpd.js +++ b/addon-sdk/source/test/addons/content-script-messages-latency/httpd.js @@ -5177,11 +5177,7 @@ function server(port, basePath) gThreadManager.spinEventLoopUntil(() => srv.isStopped()); - var thread = gThreadManager.currentThread; - - // get rid of any pending requests - while (thread.hasPendingEvents()) - thread.processNextEvent(true); + gThreadManager.spinEventLoopUntilEmpty(); DEBUG = false; } diff --git a/addon-sdk/source/test/addons/e10s-content/lib/httpd.js b/addon-sdk/source/test/addons/e10s-content/lib/httpd.js index e1229575a92c..06163e743992 100644 --- a/addon-sdk/source/test/addons/e10s-content/lib/httpd.js +++ b/addon-sdk/source/test/addons/e10s-content/lib/httpd.js @@ -5178,11 +5178,7 @@ function server(port, basePath) gThreadManager.spinEventLoopUntil(() => srv.isStopped()); - var thread = gThreadManager.currentThread; - - // get rid of any pending requests - while (thread.hasPendingEvents()) - thread.processNextEvent(true); + gThreadManager.spinEventLoopUntilEmpty(); DEBUG = false; } diff --git a/addon-sdk/source/test/addons/places/lib/httpd.js b/addon-sdk/source/test/addons/places/lib/httpd.js index 3e762d1fa6c4..a9b59bb54c76 100644 --- a/addon-sdk/source/test/addons/places/lib/httpd.js +++ b/addon-sdk/source/test/addons/places/lib/httpd.js @@ -5177,11 +5177,7 @@ function server(port, basePath) gThreadManager.spinEventLoopUntil(() => srv.isStopped()); - var thread = gThreadManager.currentThread; - - // get rid of any pending requests - while (thread.hasPendingEvents()) - thread.processNextEvent(true); + gThreadManager.spinEventLoopUntilEmpty(); DEBUG = false; } diff --git a/addon-sdk/source/test/lib/httpd.js b/addon-sdk/source/test/lib/httpd.js index e1229575a92c..06163e743992 100644 --- a/addon-sdk/source/test/lib/httpd.js +++ b/addon-sdk/source/test/lib/httpd.js @@ -5178,11 +5178,7 @@ function server(port, basePath) gThreadManager.spinEventLoopUntil(() => srv.isStopped()); - var thread = gThreadManager.currentThread; - - // get rid of any pending requests - while (thread.hasPendingEvents()) - thread.processNextEvent(true); + gThreadManager.spinEventLoopUntilEmpty(); DEBUG = false; } diff --git a/dom/indexedDB/test/unit/test_success_events_after_abort.js b/dom/indexedDB/test/unit/test_success_events_after_abort.js index da9f48efbca3..52dc48001ee2 100644 --- a/dom/indexedDB/test/unit/test_success_events_after_abort.js +++ b/dom/indexedDB/test/unit/test_success_events_after_abort.js @@ -46,12 +46,9 @@ function* testSteps() if (this.window) { // Make sure the success event isn't queued somehow. let comp = SpecialPowers.wrap(Components); - let thread = comp.classes["@mozilla.org/thread-manager;1"] - .getService(comp.interfaces.nsIThreadManager) - .currentThread; - while (thread.hasPendingEvents()) { - thread.processNextEvent(false); - } + let tm = comp.classes["@mozilla.org/thread-manager;1"] + .getService(comp.interfaces.nsIThreadManager); + tm.spinEventLoopUntilEmpty(); } finishTest(); diff --git a/services/sync/tps/extensions/mozmill/resource/stdlib/httpd.js b/services/sync/tps/extensions/mozmill/resource/stdlib/httpd.js index 424f3969fa64..bc800d21c6e3 100644 --- a/services/sync/tps/extensions/mozmill/resource/stdlib/httpd.js +++ b/services/sync/tps/extensions/mozmill/resource/stdlib/httpd.js @@ -5343,11 +5343,7 @@ function server(port, basePath) gThreadManager.spinEventLoopUntil(() => srv.isStopped()); - var thread = gThreadManager.currentThread; - - // get rid of any pending requests - while (thread.hasPendingEvents()) - thread.processNextEvent(true); + gThreadManager.spinEventLoopUntilEmpty(); DEBUG = false; } diff --git a/testing/xpcshell/head.js b/testing/xpcshell/head.js index 55f8610c7de5..bbf1ccefc966 100644 --- a/testing/xpcshell/head.js +++ b/testing/xpcshell/head.js @@ -216,12 +216,10 @@ function _do_main() { _testLogger.info("running event loop"); var tm = Components.classes["@mozilla.org/thread-manager;1"].getService(); - var thr = tm.currentThread; tm.spinEventLoopUntil(() => _quit); - while (thr.hasPendingEvents()) - thr.processNextEvent(true); + tm.spinEventLoopUntilEmpty(); } function _do_quit() { diff --git a/xpcom/tests/unit/test_nsIProcess_stress.js b/xpcom/tests/unit/test_nsIProcess_stress.js index 63799141d8de..9e523c4a0199 100644 --- a/xpcom/tests/unit/test_nsIProcess_stress.js +++ b/xpcom/tests/unit/test_nsIProcess_stress.js @@ -2,8 +2,8 @@ function run_test() { set_process_running_environment(); var file = get_test_program("TestQuickReturn"); - var thread = Components.classes["@mozilla.org/thread-manager;1"] - .getService().currentThread; + var tm = Components.classes["@mozilla.org/thread-manager;1"] + .getService(); for (var i = 0; i < 1000; i++) { var process = Components.classes["@mozilla.org/process/util;1"] @@ -20,8 +20,7 @@ function run_test() { // We need to ensure that we process any events on the main thread - // this allow threads to clean up properly and avoid out of memory // errors during the test. - while (thread.hasPendingEvents()) - thread.processNextEvent(false); + tm.spinEventLoopUntilEmpty(); } -} \ No newline at end of file +} diff --git a/xpcom/threads/nsIThreadManager.idl b/xpcom/threads/nsIThreadManager.idl index b5caac82ccdb..b84cb853948c 100644 --- a/xpcom/threads/nsIThreadManager.idl +++ b/xpcom/threads/nsIThreadManager.idl @@ -105,6 +105,14 @@ interface nsIThreadManager : nsISupports */ void spinEventLoopUntil(in nsINestedEventLoopCondition condition); + /** + * Spin the current thread's event loop until there are no more pending + * events. This could be done with spinEventLoopUntil, but that would + * require access to the current thread from JavaScript, which we are + * moving away from. + */ + void spinEventLoopUntilEmpty(); + /** * This queues a runnable to the main thread's idle queue. * diff --git a/xpcom/threads/nsThreadManager.cpp b/xpcom/threads/nsThreadManager.cpp index aeb92e4585bc..35b80970487e 100644 --- a/xpcom/threads/nsThreadManager.cpp +++ b/xpcom/threads/nsThreadManager.cpp @@ -364,6 +364,18 @@ nsThreadManager::SpinEventLoopUntil(nsINestedEventLoopCondition* aCondition) return rv; } +NS_IMETHODIMP +nsThreadManager::SpinEventLoopUntilEmpty() +{ + nsIThread* thread = NS_GetCurrentThread(); + + while (NS_HasPendingEvents(thread)) { + (void)NS_ProcessNextEvent(thread, false); + } + + return NS_OK; +} + uint32_t nsThreadManager::GetHighestNumberOfThreads() {