⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsiruntime.cpp

📁 OSB-PIK-OpenVXI-3.0.0源代码 “中国XML论坛 - 专业的XML技术讨论区--XML在语音技术中的应用”
💻 CPP
字号:
/*****************************************************************************  *****************************************************************************  *  * $Id: JsiRuntime.cpp,v 1.13.2.2 2003/10/06 19:11:32 mpanacci Exp $  *  * JsiRuntime, class for managing JavaScript runtime environments  *  * The JsiRuntime class represents a JavaScript interpreter runtime  * environment, which is the overall JavaScript engine execution space  * (compiler, interpreter, decompiler, garbage collector, etc.) which  * can hold zero or more JavaScript contexts (JsiContext objects).  *  *****************************************************************************  ****************************************************************************/  /****************License************************************************  *  * Copyright 2000-2003.  ScanSoft, Inc.      *  * Use of this software is subject to notices and obligations set forth   * in the SpeechWorks Public License - Software Version 1.2 which is   * included with this software.   *  * ScanSoft is a registered trademark of ScanSoft, Inc., and OpenSpeech,   * SpeechWorks and the SpeechWorks logo are registered trademarks or   * trademarks of SpeechWorks International, Inc. in the United States   * and other countries.  *  ***********************************************************************/  static const char *rcsid = 0 ? (char *) &rcsid : "$Id: JsiRuntime.cpp,v 1.13.2.2 2003/10/06 19:11:32 mpanacci Exp $";  // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8   #include "SBjsiInternal.h"  #include "JsiRuntime.hpp"          // Defines this class  #ifndef JS_THREADSAFE #include "VXItrd.h"                // For VXItrdMutex object and functions #endif #include "SBjsiLog.h"              // For logging  #include <jsapi.h>                 // SpiderMonkey JavaScript API  // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8   // Constructor, only does initialization that cannot fail JsiRuntime::JsiRuntime( ) : SBjsiLogger(MODULE_SBJSI, NULL, 0), runtime(NULL) #ifndef JS_THREADSAFE   , mutex(NULL) #endif { }   // Destructor JsiRuntime::~JsiRuntime( ) {   // Destroy the runtime   if ( runtime )     JS_DestroyRuntime (runtime);  #ifndef JS_THREADSAFE   // Destroy the mutex   if ( mutex )     VXItrdMutexDestroy (&mutex); #endif }   // Creation method VXIjsiResult JsiRuntime::Create (long runtimeSize, 				 VXIlogInterface *l, 				 VXIunsigned diagTagBase) {   if (( runtimeSize < 1 ) || ( ! l ))     return VXIjsi_RESULT_INVALID_ARGUMENT;    // Initialize the logging base class   SetLog (l, diagTagBase);    VXIjsiResult rc = VXIjsi_RESULT_SUCCESS;  #ifndef JS_THREADSAFE   // Create the mutex   if ( VXItrdMutexCreate (&mutex) != VXItrd_RESULT_SUCCESS )     rc = VXIjsi_RESULT_SYSTEM_ERROR; #endif    if ( rc == VXIjsi_RESULT_SUCCESS ) {     // Create the runtime, must do this within a mutex to ensure     // this is thread safe due to us using a non-thread safe build     // of SpiderMonkey for performance reasons     runtime = JS_NewRuntime (runtimeSize);     if ( runtime == NULL ) {       rc = VXIjsi_RESULT_OUT_OF_MEMORY;     } else {       // Set this as the runtime's private data       JS_SetRuntimePrivate (runtime, this);        // Enable garbage collection tracking       JS_SetGCCallbackRT (runtime, JsiRuntime::GCCallback);     }   }      return rc; }   // Get a new JavaScript context for the runtime VXIjsiResult JsiRuntime::NewContext (long contextSize, JSContext **context) {   if (( contextSize < 1 ) || ( context == NULL ))     return VXIjsi_RESULT_INVALID_ARGUMENT;  #ifndef JS_THREADSAFE   if ( AccessBegin( ) == false )     return VXIjsi_RESULT_SYSTEM_ERROR; #endif    // Create the context   JSContext *newContext = JS_NewContext (runtime, contextSize);   if ( newContext == NULL )     return VXIjsi_RESULT_OUT_OF_MEMORY;  #ifndef JS_THREADSAFE   if ( AccessEnd( ) == false ) {     DestroyContext (&newContext);     return VXIjsi_RESULT_SYSTEM_ERROR;   } #endif    *context = newContext;   return VXIjsi_RESULT_SUCCESS; }   // Destroy a JavaScript context for the runtime VXIjsiResult JsiRuntime::DestroyContext (JSContext **context) {   if (( context == NULL ) || ( *context == NULL ))     return VXIjsi_RESULT_INVALID_ARGUMENT;  #ifndef JS_THREADSAFE   if ( AccessBegin( ) == false )     return VXIjsi_RESULT_SYSTEM_ERROR; #endif    // Destroy the context   JS_DestroyContext (*context);  #ifndef JS_THREADSAFE   if ( AccessEnd( ) == false )     return VXIjsi_RESULT_SYSTEM_ERROR; #endif    *context = NULL;   return VXIjsi_RESULT_SUCCESS; }   #ifndef JS_THREADSAFE  // Flag that we are beginning and ending access of a context within // this runtime, used to ensure thread safety. For simplicity, // return true on success, false on failure (mutex error). bool JsiRuntime::AccessBegin( ) const {   return (VXItrdMutexLock (mutex) == VXItrd_RESULT_SUCCESS ? true : false); }   bool JsiRuntime::AccessEnd( ) const {   return (VXItrdMutexUnlock (mutex) == VXItrd_RESULT_SUCCESS ? true : false); }  #endif /* JS_THREADSAFE */   // Static callback for diagnostic logging of garbage collection JSBool JS_DLL_CALLBACK  JsiRuntime::GCCallback (JSContext *context, JSGCStatus status) {   JSBool rc = JS_TRUE;    // Get the runtime, then this runtime object   JSRuntime *rt = JS_GetRuntime (context);   if ( rt == NULL ) {     rc = JS_FALSE; // Fatal error   } else {     const JsiRuntime *pThis = (const JsiRuntime *) JS_GetRuntimePrivate (rt);     if ( pThis == NULL ) {       return JS_FALSE; // Fatal error     } else {       // Log the garbage collection state       switch (status) {       case JSGC_BEGIN: 	pThis->Diag (SBJSI_LOG_GC, NULL, L"begin 0x%p", context); 	break;       case JSGC_END: 	pThis->Diag (SBJSI_LOG_GC, NULL, L"end 0x%p", context); 	break;       case JSGC_MARK_END: 	// Diag (SBJSI_LOG_GC, NULL, L"mark end 0x%p", context); 	break;       default: 	pThis->Diag (SBJSI_LOG_GC, NULL, L"unknown %d 0x%p", status, context); 	break;       }     }   }    return rc; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -