/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsISupports.idl" [ptr] native PRThread(PRThread); interface nsIRunnable; interface nsIThread; [scriptable, function, uuid(039a227d-0cb7-44a5-a8f9-dbb7071979f2)] interface nsINestedEventLoopCondition : nsISupports { /** * Returns true if the current nested event loop should stop spinning. */ bool isDone(); }; /** * An interface for creating and locating nsIThread instances. */ [scriptable, uuid(1be89eca-e2f7-453b-8d38-c11ba247f6f3)] interface nsIThreadManager : nsISupports { /** * Default number of bytes reserved for a thread's stack, if no stack size * is specified in newThread(). 0 means use platform default. */ const unsigned long DEFAULT_STACK_SIZE = 0; /** * Create a new thread (a global, user PRThread). * * @param creationFlags * Reserved for future use. Pass 0. * @param stackSize * Number of bytes to reserve for the thread's stack. * * @returns * The newly created nsIThread object. */ nsIThread newThread(in unsigned long creationFlags, [optional] in unsigned long stackSize); /** * Create a new thread (a global, user PRThread) with the specified name. * * @param name * The name of the thread. Passing an empty name is equivalent to * calling newThread(0, stackSize), i.e. the thread will not be named. * @param stackSize * Number of bytes to reserve for the thread's stack. * * @returns * The newly created nsIThread object. */ [noscript] nsIThread newNamedThread(in ACString name, [optional] in unsigned long stackSize); /** * Get the nsIThread object (if any) corresponding to the given PRThread. * This method returns null if there is no corresponding nsIThread. * * @param prthread * The PRThread of the nsIThread being requested. * * @returns * The nsIThread object corresponding to the given PRThread or null if no * such nsIThread exists. */ [noscript] nsIThread getThreadFromPRThread(in PRThread prthread); /** * Get the main thread. */ readonly attribute nsIThread mainThread; /** * Get the current thread. If the calling thread does not already have a * nsIThread associated with it, then a new nsIThread will be created and * associated with the current PRThread. */ readonly attribute nsIThread currentThread; /** * This queues a runnable to the main thread. It's a shortcut for JS callers * to be used instead of * .mainThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL); * or * .currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL); * C++ callers should instead use NS_DispatchToMainThread. */ void dispatchToMainThread(in nsIRunnable event); /** * This queues a runnable to the main thread's idle queue. * * @param event * The event to dispatch. * @param timeout * The time in milliseconds until this event should be moved from the idle * queue to the regular queue if it hasn't been executed by then. If not * passed or a zero value is specified, the event will never be moved to * the regular queue. */ void idleDispatchToMainThread(in nsIRunnable event, [optional] in uint32_t timeout); /** * Enter a nested event loop on the current thread, waiting on, and * processing events until condition.isDone() returns true. * * If condition.isDone() throws, this function will throw as well. * * C++ code should not use this function, instead preferring * mozilla::SpinEventLoopUntil. */ 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(); };