20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync/*******************************************************************************
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync* Header Files *
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync*******************************************************************************/
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync#include "internal/iprt.h"
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync#include <iprt/trace.h>
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync#include <iprt/asm.h>
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync#include <iprt/err.h>
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync#include <iprt/thread.h>
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync/*******************************************************************************
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync* Global Variables *
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync*******************************************************************************/
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync/** The default trace buffer handle. */
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsyncstatic RTTRACEBUF g_hDefaultTraceBuf = NIL_RTTRACEBUF;
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsyncRTDECL(int) RTTraceSetDefaultBuf(RTTRACEBUF hTraceBuf)
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync{
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync /* Retain the new buffer. */
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync if (hTraceBuf != NIL_RTTRACEBUF)
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync {
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync uint32_t cRefs = RTTraceBufRetain(hTraceBuf);
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync if (cRefs >= _1M)
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync return VERR_INVALID_HANDLE;
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync }
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync RTTRACEBUF hOldTraceBuf;
5c47137ffdbcb823e83b3cfc93bf8ccd3318bec3vboxsync#ifdef IN_RC
5c47137ffdbcb823e83b3cfc93bf8ccd3318bec3vboxsync hOldTraceBuf = (RTTRACEBUF)ASMAtomicXchgPtr((void **)&g_hDefaultTraceBuf, hTraceBuf);
5c47137ffdbcb823e83b3cfc93bf8ccd3318bec3vboxsync#else
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync ASMAtomicXchgHandle(&g_hDefaultTraceBuf, hTraceBuf, &hOldTraceBuf);
5c47137ffdbcb823e83b3cfc93bf8ccd3318bec3vboxsync#endif
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync if ( hOldTraceBuf != NIL_RTTRACEBUF
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync && hOldTraceBuf != hTraceBuf)
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync {
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync /* Race prevention kludge. */
5c47137ffdbcb823e83b3cfc93bf8ccd3318bec3vboxsync#ifndef IN_RC
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync RTThreadSleep(33);
5c47137ffdbcb823e83b3cfc93bf8ccd3318bec3vboxsync#endif
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync RTTraceBufRelease(hOldTraceBuf);
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync }
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync return VINF_SUCCESS;
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync}
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsyncRTDECL(RTTRACEBUF) RTTraceGetDefaultBuf(void)
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync{
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync return g_hDefaultTraceBuf;
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync}
20024c6bd4100e9925d1ff0516af5753814fc43dvboxsync