12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppb_trace_event_impl.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/threading/platform_thread.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/thunk.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PPB_Trace_Event_Dev is a shared implementation because Trace Events can be 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sent from either the plugin process or renderer process depending on whether 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the plugin is in- or out-of-process. Also, for NaCl plugins these functions 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will be executed from untrusted code and handled appropriately by tracing 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// functionality in the IRT. 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void* TraceEventImpl::GetCategoryEnabled(const char* category_name) { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This casting is here because all mem_t return types in Pepper are void* and 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-const. All mem_t parameters are const void* so there is no way to 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // return a pointer type to the caller without some const_cast. The pointer 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // type the tracing system works with is normally unsigned char*. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return const_cast<void*>(static_cast<const void*>( 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::debug::TraceLog::GetInstance()->GetCategoryGroupEnabled( 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) category_name))); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TraceEventImpl::AddTraceEvent(int8_t phase, 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const void* category_enabled, 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const char* name, 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint64_t id, 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32_t num_args, 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const char* arg_names[], 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const uint8_t arg_types[], 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const uint64_t arg_values[], 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint8_t flags) { 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch COMPILE_ASSERT(sizeof(unsigned long long) == sizeof(uint64_t), msg); 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::debug::TraceLog::GetInstance()->AddTraceEvent( 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) phase, 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<const unsigned char*>(category_enabled), 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name, 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) num_args, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) arg_names, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) arg_types, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This cast is necessary for LP64 systems, where uint64_t is defined as 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // an unsigned long int, but trace_event internals are hermetic and 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // accepts an |unsigned long long*|. The pointer types are compatible but 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the compiler throws an error without an explicit cast. 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reinterpret_cast<const unsigned long long*>(arg_values), 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL, 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) flags); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TraceEventImpl::AddTraceEventWithThreadIdAndTimestamp( 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int8_t phase, 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const void* category_enabled, 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* name, 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint64_t id, 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int32_t thread_id, 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64_t timestamp, 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t num_args, 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* arg_names[], 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const uint8_t arg_types[], 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const uint64_t arg_values[], 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint8_t flags) { 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::debug::TraceLog::GetInstance()->AddTraceEventWithThreadIdAndTimestamp( 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch phase, 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<const unsigned char*>(category_enabled), 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name, 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id, 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch thread_id, 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeTicks::FromInternalValue(timestamp), 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) num_args, 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) arg_names, 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) arg_types, 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This cast is necessary for LP64 systems, where uint64_t is defined as 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // an unsigned long int, but trace_event internals are hermetic and 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // accepts an |unsigned long long*|. The pointer types are compatible but 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the compiler throws an error without an explicit cast. 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reinterpret_cast<const unsigned long long*>(arg_values), 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL, 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) flags); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint64_t TraceEventImpl::Now() { 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::TimeTicks::NowFromSystemTraceTime().ToInternalValue(); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TraceEventImpl::SetThreadName(const char* thread_name) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::PlatformThread::SetName(thread_name); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst PPB_Trace_Event_Dev_0_1 g_ppb_trace_event_thunk_0_1 = { 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &TraceEventImpl::GetCategoryEnabled, &TraceEventImpl::AddTraceEvent, 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &TraceEventImpl::SetThreadName, }; 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst PPB_Trace_Event_Dev_0_2 g_ppb_trace_event_thunk_0_2 = { 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &TraceEventImpl::GetCategoryEnabled, 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &TraceEventImpl::AddTraceEvent, 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &TraceEventImpl::AddTraceEventWithThreadIdAndTimestamp, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &TraceEventImpl::Now, 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &TraceEventImpl::SetThreadName, }; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace thunk { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PPB_Trace_Event_Dev_0_1* GetPPB_Trace_Event_Dev_0_1_Thunk() { 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return &g_ppb_trace_event_thunk_0_1; 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst PPB_Trace_Event_Dev_0_2* GetPPB_Trace_Event_Dev_0_2_Thunk() { 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return &g_ppb_trace_event_thunk_0_2; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace thunk 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 133