File: ThreadUtils.h

package info (click to toggle)
firefox 143.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,617,328 kB
  • sloc: cpp: 7,478,492; javascript: 6,417,157; ansic: 3,720,058; python: 1,396,372; xml: 627,523; asm: 438,677; java: 186,156; sh: 63,477; makefile: 19,171; objc: 13,059; perl: 12,983; yacc: 4,583; cs: 3,846; pascal: 3,405; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (59 lines) | stat: -rw-r--r-- 2,577 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */

#ifndef DOM_QUOTA_THREADUTILS_H_
#define DOM_QUOTA_THREADUTILS_H_

#include <cstdint>
#include <functional>

#include "mozilla/StaticPrefsBase.h"

enum class nsresult : uint32_t;

namespace mozilla::dom::quota {

/**
 * Add a temporary thread observer and listen for the "AfterProcessNextEvent"
 * notification. Once the notification is received, remove the temporary thread
 * observer and call aCallback.
 * In practice, this calls aCallback immediately after the current thread is
 * done with running and releasing recently popped event from thread's event
 * queue.
 * If called multiple times, all the callbacks will be executed, in the
 * order in which RunAfterProcessingCurrentEvent() was called.
 * Use this method if you need to dispatch the same or some other runnable to
 * another thread in a way which prevents any race conditions (for example
 * unpredictable releases of objects).
 * This method should be used only in existing code which can't be easily
 * converted to use MozPromise which doesn't have the problem with
 * unpredictable releases of objects, see:
 * https://searchfox.org/mozilla-central/rev/4582d908c17fbf7924f5699609fe4a12c28ddc4a/xpcom/threads/MozPromise.h#866
 *
 * Note: Calling this method from a thread pool is not supported since thread
 * pools don't fire the "AfterProcessNextEvent" notification. The method has
 * a diagnostic assertion for that so any calls like that will be caught
 * in builds with enabled diagnostic assertions. The callback will never
 * get executed in other builds, such as release builds. The limitation can
 * be removed completely when thread pool implementation gets support for firing
 * the "AfterProcessNextEvent".
 */
nsresult RunAfterProcessingCurrentEvent(std::function<void()>&& aCallback);

/**
 * Causes the current thread to yield for a specified amount of milliseconds if
 * a mirrored preference value is not zero.
 *
 * @param aMirroredPrefValue
 *   A mirrored preference value. If this value is greater than zero, the
 *   function will cause the current thread to sleep for that number of
 *   milliseconds.
 */
void SleepIfEnabled(StripAtomic<RelaxedAtomicUint32> aMirroredPrefValue);

}  // namespace mozilla::dom::quota

#endif  // DOM_QUOTA_THREADUTILS_H_