initterm.h revision d4ca82a9febd97e1c848d677f88fccbc05e7f56f
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Runtime Init/Term.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/*
d4ca82a9febd97e1c848d677f88fccbc05e7f56fvboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
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.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync *
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * additional information or have any questions.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
154e1d5579ca6c8bee571a8d1ced5d76a0234030vboxsync#ifndef ___iprt_initterm_h
154e1d5579ca6c8bee571a8d1ced5d76a0234030vboxsync#define ___iprt_initterm_h
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#include <iprt/cdefs.h>
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#include <iprt/types.h>
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync__BEGIN_DECLS
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync/** @defgroup grp_rt IPRT APIs
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @{
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/** @defgroup grp_rt_initterm Init / Term
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @{
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#ifdef IN_RING3
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/**
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * Initializes the runtime library.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync *
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * @returns iprt status code.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync */
dced478b440a327fb550155c0f73c1ac968ad93bvboxsyncRTR3DECL(int) RTR3Init(void);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync
c897410835e67f7da96b4a6f4c800677e7901321vboxsync
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync/**
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * Initializes the runtime library and try initialize SUPLib too.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync *
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @returns IPRT status code.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @param pszProgramPath The path to the program file.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync *
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @remarks Failure to initialize SUPLib is ignored.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
dced478b440a327fb550155c0f73c1ac968ad93bvboxsyncRTR3DECL(int) RTR3InitAndSUPLib(void);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync/**
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * Initializes the runtime library passing it the program path.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync *
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @returns IPRT status code.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @param pszProgramPath The path to the program file.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync */
dced478b440a327fb550155c0f73c1ac968ad93bvboxsyncRTR3DECL(int) RTR3InitWithProgramPath(const char *pszProgramPath);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync/**
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * Initializes the runtime library passing it the program path,
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * and try initialize SUPLib too (failures ignored).
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync *
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @returns IPRT status code.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @param pszProgramPath The path to the program file.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync *
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync * @remarks Failure to initialize SUPLib is ignored.
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync */
dced478b440a327fb550155c0f73c1ac968ad93bvboxsyncRTR3DECL(int) RTR3InitAndSUPLibWithProgramPath(const char *pszProgramPath);
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.
c897410835e67f7da96b4a6f4c800677e7901321vboxsync * @param pszProgramPath The program path. Pass NULL if we're to figure it out ourselves.
c897410835e67f7da96b4a6f4c800677e7901321vboxsync * @param fInitSUPLib Whether to initialize the support library or not.
c897410835e67f7da96b4a6f4c800677e7901321vboxsync */
c897410835e67f7da96b4a6f4c800677e7901321vboxsyncRTR3DECL(int) RTR3InitEx(uint32_t iVersion, const char *pszProgramPath, bool fInitSUPLib);
c897410835e67f7da96b4a6f4c800677e7901321vboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/**
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * Terminates the runtime library.
49d36b55bcf206ced156a303dab448a75fac001bvboxsync */
49d36b55bcf206ced156a303dab448a75fac001bvboxsyncRTR3DECL(void) RTR3Term(void);
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync
dced478b440a327fb550155c0f73c1ac968ad93bvboxsync#endif /* IN_RING3 */
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#ifdef IN_RING0
49d36b55bcf206ced156a303dab448a75fac001bvboxsync/**
49d36b55bcf206ced156a303dab448a75fac001bvboxsync * Initalizes 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);
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 */
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsyncRTGCDECL(int) RTRCInit(uint64_t u64ProgramStartNanoTS);
f25c2612832b605961e651736ef27c3833960c0fvboxsync
f25c2612832b605961e651736ef27c3833960c0fvboxsync/**
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsync * Terminates the raw-mode context runtime library.
f25c2612832b605961e651736ef27c3833960c0fvboxsync */
0120c35c41a827e23a6e04fbd59299a187e0b22cvboxsyncRTGCDECL(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
49d36b55bcf206ced156a303dab448a75fac001bvboxsync__END_DECLS
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync
49d36b55bcf206ced156a303dab448a75fac001bvboxsync#endif
49d36b55bcf206ced156a303dab448a75fac001bvboxsync