15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2011 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A collection of debugging related interfaces. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_UTILITY_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_UTILITY_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_macros.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/portability.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/platform/nacl_threads.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/platform/nacl_time.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/c/private/pp_file_handle.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/c/private/ppb_nacl_private.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SRPC_PLUGIN_DEBUG 1 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a string is a valid JavaScript identifier. According to the 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ECMAScript spec, this should be done in terms of unicode character 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// categories. For now, we are simply limiting identifiers to the ASCII 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subset of that spec. If successful, it returns the length of the 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// identifier in the location pointed to by length (if it is not NULL). 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sehr): add Unicode identifier support. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsValidIdentifierString(const char* strval, uint32_t* length); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst PPB_NaCl_Private* GetNaClInterface(); 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid SetNaClInterface(const PPB_NaCl_Private* nacl_interface); 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CloseFileHandle(PP_FileHandle file_handle); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Converts a PP_FileHandle to a POSIX file descriptor. 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int32_t ConvertFileDescriptor(PP_FileHandle handle, bool read_only); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Debugging print utility 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int gNaClPluginDebugPrintEnabled; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int NaClPluginPrintLog(const char *format, ...); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int NaClPluginDebugPrintCheckEnv(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SRPC_PLUGIN_DEBUG 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INIT_PLUGIN_LOGGING() do { \ 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (-1 == ::plugin::gNaClPluginDebugPrintEnabled) { \ 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::plugin::gNaClPluginDebugPrintEnabled = \ 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::plugin::NaClPluginDebugPrintCheckEnv(); \ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PLUGIN_PRINTF(args) do { \ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INIT_PLUGIN_LOGGING(); \ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (0 != ::plugin::gNaClPluginDebugPrintEnabled) { \ 54bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ::plugin::NaClPluginPrintLog("PLUGIN %" NACL_PRIu64 ": ", \ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClGetTimeOfDayMicroseconds()); \ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::plugin::NaClPluginPrintLog args; \ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MODULE_PRINTF is used in the module because PLUGIN_PRINTF uses a 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a timer that may not yet be initialized. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MODULE_PRINTF(args) do { \ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INIT_PLUGIN_LOGGING(); \ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (0 != ::plugin::gNaClPluginDebugPrintEnabled) { \ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::plugin::NaClPluginPrintLog("MODULE: "); \ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::plugin::NaClPluginPrintLog args; \ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PLUGIN_PRINTF(args) do { if (0) { printf args; } } while (0) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define MODULE_PRINTF(args) do { if (0) { printf args; } } while (0) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* allows DCE but compiler can still do format string checks */ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace plugin 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_UTILITY_H_ 78