Integrated Remotery.

This commit is contained in:
Branimir Karadžić 2015-11-12 22:26:50 -08:00
parent 2f8bbfb758
commit 21ccf8cb8c
4 changed files with 47 additions and 20 deletions

View file

@ -508,7 +508,7 @@ static void WriteFence()
// Get a shared value with acquire semantics, ensuring the read is complete // Get a shared value with acquire semantics, ensuring the read is complete
// before the function returns. // before the function returns.
static void* LoadAcquire(void* volatile const* addr) void* LoadAcquire(void* volatile const* addr)
{ {
// Hardware fence is implicit on x86 so only need the compiler fence // Hardware fence is implicit on x86 so only need the compiler fence
void* v = *addr; void* v = *addr;
@ -519,7 +519,7 @@ static void* LoadAcquire(void* volatile const* addr)
// Set a shared value with release semantics, ensuring any prior writes // Set a shared value with release semantics, ensuring any prior writes
// are complete before the value is set. // are complete before the value is set.
static void StoreRelease(void* volatile* addr, void* v) void StoreRelease(void* volatile* addr, void* v)
{ {
// Hardware fence is implicit on x86 so only need the compiler fence // Hardware fence is implicit on x86 so only need the compiler fence
WriteFence(); WriteFence();
@ -613,6 +613,7 @@ typedef struct VirtualMirrorBuffer
static rmtError VirtualMirrorBuffer_Constructor(VirtualMirrorBuffer* buffer, rmtU32 size, int nb_attempts) static rmtError VirtualMirrorBuffer_Constructor(VirtualMirrorBuffer* buffer, rmtU32 size, int nb_attempts)
{ {
static const rmtU32 k_64 = 64 * 1024; static const rmtU32 k_64 = 64 * 1024;
RMT_UNREFERENCED_PARAMETER(nb_attempts);
#ifdef RMT_PLATFORM_LINUX #ifdef RMT_PLATFORM_LINUX
char path[] = "/dev/shm/ring-buffer-XXXXXX"; char path[] = "/dev/shm/ring-buffer-XXXXXX";
@ -785,7 +786,7 @@ static rmtError VirtualMirrorBuffer_Constructor(VirtualMirrorBuffer* buffer, rmt
#endif #endif
// Map 2 contiguous pages // Map 2 contiguous pages
buffer->ptr = mmap(NULL, size * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); buffer->ptr = (rmtU8*)mmap(NULL, size * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (buffer->ptr == MAP_FAILED) if (buffer->ptr == MAP_FAILED)
{ {
buffer->ptr = NULL; buffer->ptr = NULL;
@ -1173,8 +1174,6 @@ strstr_s (char *dest, rsize_t dmax,
static errno_t static errno_t
strncat_s (char *dest, rsize_t dmax, const char *src, rsize_t slen) strncat_s (char *dest, rsize_t dmax, const char *src, rsize_t slen)
{ {
rsize_t orig_dmax;
char *orig_dest;
const char *overlap_bumper; const char *overlap_bumper;
if (dest == NULL) { if (dest == NULL) {
@ -1198,8 +1197,6 @@ strncat_s (char *dest, rsize_t dmax, const char *src, rsize_t slen)
} }
/* hold base of dest in case src was not copied */ /* hold base of dest in case src was not copied */
orig_dmax = dmax;
orig_dest = dest;
if (dest < src) { if (dest < src) {
overlap_bumper = src; overlap_bumper = src;
@ -1341,9 +1338,9 @@ static void itoahex_s( char *dest, rsize_t dmax, rmtS32 value )
// //
// All objects that require free-list-backed allocation need to inherit from this type. // All objects that require free-list-backed allocation need to inherit from this type.
// //
typedef struct ObjectLink typedef struct ObjectLink_s
{ {
struct ObjectLink* volatile next; struct ObjectLink_s* volatile next;
} ObjectLink; } ObjectLink;
@ -1676,11 +1673,12 @@ static void TCPSocket_Destructor(TCPSocket* tcp_socket)
static rmtError TCPSocket_RunServer(TCPSocket* tcp_socket, rmtU16 port) static rmtError TCPSocket_RunServer(TCPSocket* tcp_socket, rmtU16 port)
{ {
SOCKET s = INVALID_SOCKET; SOCKET s = INVALID_SOCKET;
struct sockaddr_in sin = { 0 }; struct sockaddr_in sin;
#ifdef RMT_PLATFORM_WINDOWS #ifdef RMT_PLATFORM_WINDOWS
u_long nonblock = 1; u_long nonblock = 1;
#endif #endif
memset(&sin, 0, sizeof(sin) );
assert(tcp_socket != NULL); assert(tcp_socket != NULL);
// Try to create the socket // Try to create the socket
@ -3294,7 +3292,7 @@ enum SampleType
typedef struct Sample typedef struct Sample
{ {
// Inherit so that samples can be quickly allocated // Inherit so that samples can be quickly allocated
ObjectLink ObjectLink; ObjectLink Link;
enum SampleType type; enum SampleType type;
@ -3568,13 +3566,13 @@ static void SampleTree_Pop(SampleTree* tree, Sample* sample)
static ObjectLink* FlattenSampleTree(Sample* sample, rmtU32* nb_samples) static ObjectLink* FlattenSampleTree(Sample* sample, rmtU32* nb_samples)
{ {
Sample* child; Sample* child;
ObjectLink* cur_link = &sample->ObjectLink; ObjectLink* cur_link = &sample->Link;
assert(sample != NULL); assert(sample != NULL);
assert(nb_samples != NULL); assert(nb_samples != NULL);
*nb_samples += 1; *nb_samples += 1;
sample->ObjectLink.next = (ObjectLink*)sample->first_child; sample->Link.next = (ObjectLink*)sample->first_child;
// Link all children together // Link all children together
for (child = sample->first_child; child != NULL; child = child->next_sibling) for (child = sample->first_child; child != NULL; child = child->next_sibling)
@ -3600,7 +3598,7 @@ static void FreeSampleTree(Sample* sample, ObjectAllocator* allocator)
ObjectLink* last_link = FlattenSampleTree(sample, &nb_cleared_samples); ObjectLink* last_link = FlattenSampleTree(sample, &nb_cleared_samples);
// Release the complete sample memory range // Release the complete sample memory range
if (sample->ObjectLink.next != NULL) if (sample->Link.next != NULL)
ObjectAllocator_FreeRange(allocator, sample, last_link, nb_cleared_samples); ObjectAllocator_FreeRange(allocator, sample, last_link, nb_cleared_samples);
else else
ObjectAllocator_Free(allocator, sample); ObjectAllocator_Free(allocator, sample);
@ -4272,18 +4270,18 @@ static void Remotery_DestroyThreadSamplers(Remotery* rmt)
} }
static void* CRTMalloc(void* mm_context, rmtU32 size) static void* CRTMalloc(void* /*mm_context*/, rmtU32 size)
{ {
return malloc((size_t)size); return malloc((size_t)size);
} }
static void CRTFree(void* mm_context, void* ptr) static void CRTFree(void* /*mm_context*/, void* ptr)
{ {
free(ptr); free(ptr);
} }
static void* CRTRealloc(void* mm_context, void* ptr, rmtU32 size) static void* CRTRealloc(void* /*mm_context*/, void* ptr, rmtU32 size)
{ {
return realloc(ptr, size); return realloc(ptr, size);
} }
@ -4361,6 +4359,7 @@ RMT_API Remotery* _rmt_GetGlobalInstance(void)
static void SetDebuggerThreadName(const char* name) static void SetDebuggerThreadName(const char* name)
{ {
RMT_UNREFERENCED_PARAMETER(name);
#ifdef RMT_PLATFORM_WINDOWS #ifdef RMT_PLATFORM_WINDOWS
THREADNAME_INFO info; THREADNAME_INFO info;
info.dwType = 0x1000; info.dwType = 0x1000;
@ -4926,7 +4925,7 @@ static void D3D11_Destructor(D3D11* d3d11)
typedef struct D3D11Timestamp typedef struct D3D11Timestamp
{ {
// Inherit so that timestamps can be quickly allocated // Inherit so that timestamps can be quickly allocated
ObjectLink ObjectLink; ObjectLink Link;
// Pair of timestamp queries that wrap the sample // Pair of timestamp queries that wrap the sample
ID3D11Query* query_start; ID3D11Query* query_start;
@ -5481,7 +5480,7 @@ static void OpenGL_Destructor(OpenGL* opengl)
typedef struct OpenGLTimestamp typedef struct OpenGLTimestamp
{ {
// Inherit so that timestamps can be quickly allocated // Inherit so that timestamps can be quickly allocated
ObjectLink ObjectLink; ObjectLink Link;
// Pair of timestamp queries that wrap the sample // Pair of timestamp queries that wrap the sample
GLuint queries[2]; GLuint queries[2];

View file

@ -43,7 +43,7 @@ documented just below this comment.
// Disable this to not include any bits of Remotery in your build // Disable this to not include any bits of Remotery in your build
#define RMT_ENABLED //#define RMT_ENABLED
// Used by the Celtoys TinyCRT library (not released yet) // Used by the Celtoys TinyCRT library (not released yet)
//#define RMT_USE_TINYCRT //#define RMT_USE_TINYCRT

View file

@ -17,6 +17,12 @@
#include "cmd.h" #include "cmd.h"
#include "input.h" #include "input.h"
#if ENTRY_CONFIG_PROFILER
# define RMT_ENABLED
#endif // ENTRY_CONFIG_PROFILER
#include <remotery/lib/Remotery.c>
extern "C" int _main_(int _argc, char** _argv); extern "C" int _main_(int _argc, char** _argv);
namespace entry namespace entry
@ -24,6 +30,9 @@ namespace entry
static uint32_t s_debug = BGFX_DEBUG_NONE; static uint32_t s_debug = BGFX_DEBUG_NONE;
static uint32_t s_reset = BGFX_RESET_NONE; static uint32_t s_reset = BGFX_RESET_NONE;
static bool s_exit = false; static bool s_exit = false;
static Remotery* s_rmt = NULL;
static bx::FileReaderI* s_fileReader = NULL; static bx::FileReaderI* s_fileReader = NULL;
static bx::FileWriterI* s_fileWriter = NULL; static bx::FileWriterI* s_fileWriter = NULL;
@ -338,6 +347,15 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{ {
//DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME); //DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME);
if (BX_ENABLED(ENTRY_CONFIG_PROFILER) )
{
// rmtSettings* settings = rmt_Settings();
if (RMT_ERROR_NONE != rmt_CreateGlobalInstance(&s_rmt) )
{
s_rmt = NULL;
}
}
#if BX_CONFIG_CRT_FILE_READER_WRITER #if BX_CONFIG_CRT_FILE_READER_WRITER
s_fileReader = new bx::CrtFileReader; s_fileReader = new bx::CrtFileReader;
s_fileWriter = new bx::CrtFileWriter; s_fileWriter = new bx::CrtFileWriter;
@ -370,6 +388,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
s_fileWriter = NULL; s_fileWriter = NULL;
#endif // BX_CONFIG_CRT_FILE_READER_WRITER #endif // BX_CONFIG_CRT_FILE_READER_WRITER
if (BX_ENABLED(ENTRY_CONFIG_PROFILER)
&& NULL != s_rmt)
{
rmt_DestroyGlobalInstance(s_rmt);
}
return result; return result;
} }

View file

@ -48,6 +48,10 @@
# define ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR 1 # define ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR 1
#endif // ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR #endif // ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR
#ifndef ENTRY_CONFIG_PROFILER
# define ENTRY_CONFIG_PROFILER 0
#endif // ENTRY_CONFIG_PROFILER
#define ENTRY_IMPLEMENT_EVENT(_class, _type) \ #define ENTRY_IMPLEMENT_EVENT(_class, _type) \
_class(WindowHandle _handle) : Event(_type, _handle) {} _class(WindowHandle _handle) : Event(_type, _handle) {}