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