49d36b55bcf206ced156a303dab448a75fac001bvboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Runtime Init/Term.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2013 Oracle Corporation
49d36b55bcf206ced156a303dab448a75fac001bvboxsync *
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * available from http://www.virtualbox.org. This file is free software;
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * terms and conditions of either the GPL or the CDDL or both.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
154e1d5579ca6c8bee571a8d1ced5d76a0234030vboxsync#ifndef ___iprt_initterm_h
154e1d5579ca6c8bee571a8d1ced5d76a0234030vboxsync#define ___iprt_initterm_h
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#include <iprt/cdefs.h>
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#include <iprt/types.h>
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_BEGIN
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync/** @defgroup grp_rt IPRT C/C++ APIs
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @{
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/** @defgroup grp_rt_initterm Init / Term
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @{
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#ifdef IN_RING3
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** @name RTR3Init flags (RTR3INIT_XXX).
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @{ */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** Try initialize SUPLib. */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync#define RTR3INIT_FLAGS_SUPLIB RT_BIT(0)
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** Initializing IPRT from a DLL. */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync#define RTR3INIT_FLAGS_DLL RT_BIT(1)
602cd163f45e8c5b5a400e49ff1ca50987f99b06vboxsync/** We are sharing a process space, so we need to behave. */
602cd163f45e8c5b5a400e49ff1ca50987f99b06vboxsync#define RTR3INIT_FLAGS_UNOBTRUSIVE RT_BIT(2)
7d172bb4ed1217e28e28829193159954f6b40ef7vboxsync/** The caller ensures that the argument bector is UTF-8. */
7d172bb4ed1217e28e28829193159954f6b40ef7vboxsync#define RTR3INIT_FLAGS_UTF8_ARGV RT_BIT(3)
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** @} */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** @name RTR3InitEx version
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @{ */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** Version 1. */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync#define RTR3INIT_VER_1 UINT32_C(1)
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** The current version. */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync#define RTR3INIT_VER_CUR RTR3INIT_VER_1
230bd8589bba39933ac5ec21482d6186d675e604vboxsync/** @} */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/**
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * Initializes the runtime library.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync *
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @returns iprt status code.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param fFlags Flags, see RTR3INIT_XXX.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync */
230bd8589bba39933ac5ec21482d6186d675e604vboxsyncRTR3DECL(int) RTR3InitExeNoArguments(uint32_t fFlags);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync/**
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * Initializes the runtime library.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync *
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @returns iprt status code.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param cArgs Pointer to the argument count.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param ppapszArgs Pointer to the argument vector pointer.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param fFlags Flags, see RTR3INIT_XXX.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync */
230bd8589bba39933ac5ec21482d6186d675e604vboxsyncRTR3DECL(int) RTR3InitExe(int cArgs, char ***papszArgs, uint32_t fFlags);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync/**
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * Initializes the runtime library.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync *
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @returns iprt status code.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param fFlags Flags, see RTR3INIT_XXX.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync */
230bd8589bba39933ac5ec21482d6186d675e604vboxsyncRTR3DECL(int) RTR3InitDll(uint32_t fFlags);
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsync/**
c897410835e67f7da96b4a6f4c800677e7901321vboxsync * Initializes the runtime library and possibly also SUPLib too.
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsync *
c897410835e67f7da96b4a6f4c800677e7901321vboxsync * Avoid this interface, it's not considered stable.
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsync *
c897410835e67f7da96b4a6f4c800677e7901321vboxsync * @returns IPRT status code.
c897410835e67f7da96b4a6f4c800677e7901321vboxsync * @param iVersion The interface version. Must be 0 atm.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param fFlags Flags, see RTR3INIT_XXX.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param cArgs Pointer to the argument count.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param ppapszArgs Pointer to the argument vector pointer. NULL
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * allowed if @a cArgs is 0.
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * @param pszProgramPath The program path. Pass NULL if we're to figure it
230bd8589bba39933ac5ec21482d6186d675e604vboxsync * out ourselves.
c897410835e67f7da96b4a6f4c800677e7901321vboxsync */
230bd8589bba39933ac5ec21482d6186d675e604vboxsyncRTR3DECL(int) RTR3InitEx(uint32_t iVersion, uint32_t fFlags, int cArgs, char ***papszArgs, const char *pszProgramPath);
c897410835e67f7da96b4a6f4c800677e7901321vboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/**
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * Terminates the runtime library.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsyncRTR3DECL(void) RTR3Term(void);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync
ce617464bdeee0bbae0058f64069d14092cc6522vboxsync/**
ce617464bdeee0bbae0058f64069d14092cc6522vboxsync * Is IPRT succesfully initialized?
ce617464bdeee0bbae0058f64069d14092cc6522vboxsync *
ce617464bdeee0bbae0058f64069d14092cc6522vboxsync * @returns true/false.
ce617464bdeee0bbae0058f64069d14092cc6522vboxsync */
ce617464bdeee0bbae0058f64069d14092cc6522vboxsyncRTR3DECL(bool) RTR3InitIsInitialized(void);
ce617464bdeee0bbae0058f64069d14092cc6522vboxsync
602cd163f45e8c5b5a400e49ff1ca50987f99b06vboxsync/**
602cd163f45e8c5b5a400e49ff1ca50987f99b06vboxsync * Are we running in unobtrusive mode?
8a6690612d1bd9471d1983f5063afb8b5ca20218vboxsync * @returns true/false.
602cd163f45e8c5b5a400e49ff1ca50987f99b06vboxsync */
602cd163f45e8c5b5a400e49ff1ca50987f99b06vboxsyncRTR3DECL(bool) RTR3InitIsUnobtrusive(void);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync#endif /* IN_RING3 */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#ifdef IN_RING0
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Initializes the ring-0 driver runtime library.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync *
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @returns iprt status code.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @param fReserved Flags reserved for the future.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsyncRTR0DECL(int) RTR0Init(unsigned fReserved);
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/**
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * Terminates the ring-0 driver runtime library.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsyncRTR0DECL(void) RTR0Term(void);
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsync
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsync/**
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsync * Forcibily terminates the ring-0 driver runtime library.
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsync *
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsync * This should be used when statically linking the IPRT. Module using dynamic
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsync * linking shall use RTR0Term. If you're not sure, use RTR0Term!
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsync */
3a68c165cd8232b322716e03cb7878c4cbf5b535vboxsyncRTR0DECL(void) RTR0TermForced(void);
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#endif
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#ifdef IN_RC
f25c2612832b605961e651736ef27c3833960c0fvboxsync/**
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsync * Initializes the raw-mode context runtime library.
f25c2612832b605961e651736ef27c3833960c0fvboxsync *
f25c2612832b605961e651736ef27c3833960c0fvboxsync * @returns iprt status code.
f25c2612832b605961e651736ef27c3833960c0fvboxsync *
f25c2612832b605961e651736ef27c3833960c0fvboxsync * @param u64ProgramStartNanoTS The startup timestamp.
f25c2612832b605961e651736ef27c3833960c0fvboxsync */
d7b4fec135679488c2e31643e5b3319e33d8c132vboxsyncRTRCDECL(int) RTRCInit(uint64_t u64ProgramStartNanoTS);
f25c2612832b605961e651736ef27c3833960c0fvboxsync
f25c2612832b605961e651736ef27c3833960c0fvboxsync/**
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsync * Terminates the raw-mode context runtime library.
f25c2612832b605961e651736ef27c3833960c0fvboxsync */
d7b4fec135679488c2e31643e5b3319e33d8c132vboxsyncRTRCDECL(void) RTRCTerm(void);
f25c2612832b605961e651736ef27c3833960c0fvboxsync#endif
f25c2612832b605961e651736ef27c3833960c0fvboxsync
f25c2612832b605961e651736ef27c3833960c0fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync/**
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * Termination reason.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsynctypedef enum RTTERMREASON
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync{
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync /** Normal exit. iStatus contains the exit code. */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync RTTERMREASON_EXIT = 1,
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync /** Any abnormal exit. iStatus is 0 and has no meaning. */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync RTTERMREASON_ABEND,
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync /** Killed by a signal. The iStatus contains the signal number. */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync RTTERMREASON_SIGNAL,
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync /** The IPRT module is being unloaded. iStatus is 0 and has no meaning. */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync RTTERMREASON_UNLOAD
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync} RTTERMREASON;
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync/** Whether lazy clean up is Okay or not.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * When the process is exiting, it is a waste of time to for instance free heap
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * memory or close open files. OTOH, when the runtime is unloaded from the
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * process, it is important to release absolutely all resources to prevent
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * resource leaks. */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync#define RTTERMREASON_IS_LAZY_CLEANUP_OK(enmReason) ((enmReason) != RTTERMREASON_UNLOAD)
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync/**
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * IPRT termination callback function.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param enmReason The cause of the termination.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param iStatus The meaning of this depends on enmReason.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param pvUser User argument passed to RTTermRegisterCallback.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsynctypedef DECLCALLBACK(void) FNRTTERMCALLBACK(RTTERMREASON enmReason, int32_t iStatus, void *pvUser);
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync/** Pointer to an IPRT termination callback function. */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsynctypedef FNRTTERMCALLBACK *PFNRTTERMCALLBACK;
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync/**
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * Registers a termination callback.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * This is intended for performing clean up during IPRT termination. Frequently
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * paired with lazy initialization thru RTOnce.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * The callbacks are called in LIFO order.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @returns IPRT status code.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param pfnCallback The callback function.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param pvUser The user argument for the callback.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @remarks May need to acquire a fast mutex or critical section, so use with
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * some care in ring-0 context.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @remarks Be very careful using this from code that may be unloaded before
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * IPRT terminates. Unlike some atexit and on_exit implementations,
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * IPRT will not automatically unregister callbacks when a module gets
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * unloaded.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsyncRTDECL(int) RTTermRegisterCallback(PFNRTTERMCALLBACK pfnCallback, void *pvUser);
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync/**
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * Deregister a termination callback.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @returns VINF_SUCCESS if found, VERR_NOT_FOUND if the callback/pvUser pair
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * wasn't found.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param pfnCallback The callback function.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param pvUser The user argument for the callback.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsyncRTDECL(int) RTTermDeregisterCallback(PFNRTTERMCALLBACK pfnCallback, void *pvUser);
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync/**
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * Runs the termination callback queue.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * Normally called by an internal IPRT termination function, but may also be
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * called by external code immediately prior to terminating IPRT if it is in a
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * better position to state the termination reason and/or status.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync *
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param enmReason The reason why it's called.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * @param iStatus The associated exit status or signal number.
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync */
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsyncRTDECL(void) RTTermRunCallbacks(RTTERMREASON enmReason, int32_t iStatus);
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/** @} */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/** @} */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_END
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#endif
49d36b55bcf206ced156a303dab448a75fac001bvboxsync