forked from mirrors/gecko-dev
		
	 0e041b91bd
			
		
	
	
		0e041b91bd
		
	
	
	
	
		
			
			This commit does: - Sync files under security/sandbox/chromium/ with Chromium 81.0.4044.138 - Update files under security/sandbox/chromium-shim/ - Apply patches under security/sandbox/chromium-shim/patches/with_update/ - Add mozilla::AddWin32kLockdownPolicy to apply MITIGATION_WIN32K_DISABLE before SUBSYS_WIN32K_LOCKDOWN Differential Revision: https://phabricator.services.mozilla.com/D79560
		
			
				
	
	
		
			87 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2011 The Chromium Authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| #ifndef BASE_AT_EXIT_H_
 | |
| #define BASE_AT_EXIT_H_
 | |
| 
 | |
| #include "base/base_export.h"
 | |
| #include "base/callback.h"
 | |
| #include "base/containers/stack.h"
 | |
| #include "base/macros.h"
 | |
| #include "base/synchronization/lock.h"
 | |
| #include "base/thread_annotations.h"
 | |
| 
 | |
| namespace base {
 | |
| 
 | |
| // This class provides a facility similar to the CRT atexit(), except that
 | |
| // we control when the callbacks are executed. Under Windows for a DLL they
 | |
| // happen at a really bad time and under the loader lock. This facility is
 | |
| // mostly used by base::Singleton.
 | |
| //
 | |
| // The usage is simple. Early in the main() or WinMain() scope create an
 | |
| // AtExitManager object on the stack:
 | |
| // int main(...) {
 | |
| //    base::AtExitManager exit_manager;
 | |
| //
 | |
| // }
 | |
| // When the exit_manager object goes out of scope, all the registered
 | |
| // callbacks and singleton destructors will be called.
 | |
| 
 | |
| class BASE_EXPORT AtExitManager {
 | |
|  public:
 | |
|   typedef void (*AtExitCallbackType)(void*);
 | |
| 
 | |
|   AtExitManager();
 | |
| 
 | |
|   // The dtor calls all the registered callbacks. Do not try to register more
 | |
|   // callbacks after this point.
 | |
|   ~AtExitManager();
 | |
| 
 | |
|   // Registers the specified function to be called at exit. The prototype of
 | |
|   // the callback function is void func(void*).
 | |
|   static void RegisterCallback(AtExitCallbackType func, void* param);
 | |
| 
 | |
|   // Registers the specified task to be called at exit.
 | |
|   static void RegisterTask(base::OnceClosure task);
 | |
| 
 | |
|   // Calls the functions registered with RegisterCallback in LIFO order. It
 | |
|   // is possible to register new callbacks after calling this function.
 | |
|   static void ProcessCallbacksNow();
 | |
| 
 | |
|   // Disable all registered at-exit callbacks. This is used only in a single-
 | |
|   // process mode.
 | |
|   static void DisableAllAtExitManagers();
 | |
| 
 | |
|  protected:
 | |
|   // This constructor will allow this instance of AtExitManager to be created
 | |
|   // even if one already exists.  This should only be used for testing!
 | |
|   // AtExitManagers are kept on a global stack, and it will be removed during
 | |
|   // destruction.  This allows you to shadow another AtExitManager.
 | |
|   explicit AtExitManager(bool shadow);
 | |
| 
 | |
|  private:
 | |
|   base::Lock lock_;
 | |
| 
 | |
|   base::stack<base::OnceClosure> stack_ GUARDED_BY(lock_);
 | |
| 
 | |
| #if DCHECK_IS_ON()
 | |
|   bool processing_callbacks_ GUARDED_BY(lock_) = false;
 | |
| #endif
 | |
| 
 | |
|   // Stack of managers to allow shadowing.
 | |
|   AtExitManager* const next_manager_;
 | |
| 
 | |
|   DISALLOW_COPY_AND_ASSIGN(AtExitManager);
 | |
| };
 | |
| 
 | |
| #if defined(UNIT_TEST)
 | |
| class ShadowingAtExitManager : public AtExitManager {
 | |
|  public:
 | |
|   ShadowingAtExitManager() : AtExitManager(true) {}
 | |
| };
 | |
| #endif  // defined(UNIT_TEST)
 | |
| 
 | |
| }  // namespace base
 | |
| 
 | |
| #endif  // BASE_AT_EXIT_H_
 |