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