Oolite 1.91.0.7604-240417-a536cbe
Loading...
Searching...
No Matches
Macros | Functions | Variables
OOJSEngineTimeManagement.m File Reference
#include <jsdbgapi.h>
import "OOJSEngineTimeManagement.h"
import "OOProfilingStopwatch.h"
import "OOJSScript.h"
import "OOCollectionExtractors.h"
import "OOLoggingExtended.h"
#include <unistd.h>
+ Include dependency graph for OOJSEngineTimeManagement.m:

Go to the source code of this file.

Macros

#define OOJS_DEBUG_LIMITER   0
 
#define OOJS_TIME_LIMIT   (1)
 

Functions

void OOJSStartTimeLimiterWithTimeLimit_ (OOTimeDelta limit, const char *file, unsigned line)
 
void OOJSStopTimeLimiter_ (const char *file, unsigned line)
 
void OOJSPauseTimeLimiter (void)
 
void OOJSResumeTimeLimiter (void)
 
OOHighResTimeValue OOJSCopyTimeLimiterNominalStartTime (void)
 
void OOJSResetTimeLimiter (void)
 
OOTimeDelta OOJSGetTimeLimiterLimit (void)
 
void OOJSSetTimeLimiterLimit (OOTimeDelta limit)
 
static JSBool OperationCallback (JSContext *context)
 
static JSBool ContextCallback (JSContext *context, uintN contextOp)
 
void OOJSTimeManagementInit (OOJavaScriptEngine *engine, JSRuntime *runtime)
 

Variables

static unsigned sLimiterStartDepth
 
static int sLimiterPauseDepth
 
static OOHighResTimeValue sLimiterStart
 
static OOHighResTimeValue sLimiterPauseStart
 
static double sLimiterTimeLimit
 
static BOOL sStop
 
static const char * sLastStartedFile
 
static unsigned sLastStartedLine
 
static const char * sLastStoppedFile
 
static unsigned sLastStoppedLine
 

Macro Definition Documentation

◆ OOJS_DEBUG_LIMITER

#define OOJS_DEBUG_LIMITER   0

Definition at line 49 of file OOJSEngineTimeManagement.m.

◆ OOJS_TIME_LIMIT

#define OOJS_TIME_LIMIT   (1)

Definition at line 63 of file OOJSEngineTimeManagement.m.

Referenced by OOJSStartTimeLimiterWithTimeLimit_().

Function Documentation

◆ ContextCallback()

static JSBool ContextCallback ( JSContext * context,
uintN contextOp )
static

Definition at line 240 of file OOJSEngineTimeManagement.m.

241{
242 if (contextOp == JSCONTEXT_NEW)
243 {
244 JS_SetOperationCallback(context, OperationCallback);
245
246#if OOJS_PROFILE && defined(MOZ_TRACE_JSCALLS)
247 JS_SetFunctionCallback(context, (JSFunctionCallback)FunctionCallback); // Naughtily casts away consts, because const JSContexts and JSFunctions are useless.
248#endif
249 }
250 return YES;
251}
static JSBool OperationCallback(JSContext *context)

References OperationCallback().

Referenced by OOJavaScriptEngine(WatchdogTimer)::watchdogTimerThread.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ OOJSCopyTimeLimiterNominalStartTime()

OOHighResTimeValue OOJSCopyTimeLimiterNominalStartTime ( void )

Definition at line 158 of file OOJSEngineTimeManagement.m.

159{
160 return sLimiterStart;
161}
static OOHighResTimeValue sLimiterStart

References sLimiterStart.

◆ OOJSGetTimeLimiterLimit()

OOTimeDelta OOJSGetTimeLimiterLimit ( void )

Definition at line 173 of file OOJSEngineTimeManagement.m.

174{
175 return sLimiterTimeLimit;
176}
static double sLimiterTimeLimit

References sLimiterTimeLimit.

◆ OOJSPauseTimeLimiter()

void OOJSPauseTimeLimiter ( void )

◆ OOJSResetTimeLimiter()

void OOJSResetTimeLimiter ( void )

Definition at line 164 of file OOJSEngineTimeManagement.m.

165{
168
169 sStop = NO;
170}
static BOOL sStop

References OODisposeHighResTime, OOGetHighResTime, sLimiterStart, and sStop.

◆ OOJSResumeTimeLimiter()

void OOJSResumeTimeLimiter ( void )

Definition at line 143 of file OOJSEngineTimeManagement.m.

144{
145 if (--sLimiterPauseDepth == 0)
146
147 {
151
152 sLimiterTimeLimit += elapsed;
153 }
154}
OOTimeDelta OOHighResTimeDeltaInSeconds(OOHighResTimeValue startTime, OOHighResTimeValue endTime)
uint64_t OOHighResTimeValue
double OOTimeDelta
Definition OOTypes.h:224

References OODisposeHighResTime, OOGetHighResTime, OOHighResTimeDeltaInSeconds(), sLimiterPauseDepth, sLimiterPauseStart, and sLimiterTimeLimit.

Referenced by NSString(OOJavaScriptExtensions)::concatenationOfStringsFromJavaScriptValues:count:separator:inContext:, ConsoleConsoleMessage(), ConsoleIsExecutableJavaScript(), ConsoleSettingsSetProperty(), OOPlanetEntity(OOJavaScriptExtensions)::getJSClass:andPrototype:, JSFunctionPredicate(), MissionRunScreen(), ReportJSError(), SoundFromJSValue(), SystemFilteredEntities(), and SystemInfoStaticFilteredSystems().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ OOJSSetTimeLimiterLimit()

void OOJSSetTimeLimiterLimit ( OOTimeDelta limit)

Definition at line 179 of file OOJSEngineTimeManagement.m.

180{
181 sLimiterTimeLimit = limit;
182}

References sLimiterTimeLimit.

◆ OOJSStartTimeLimiterWithTimeLimit_()

void OOJSStartTimeLimiterWithTimeLimit_ ( OOTimeDelta limit,
const char * file,
unsigned line )

Definition at line 82 of file OOJSEngineTimeManagement.m.

86{
87#if OOJS_DEBUG_LIMITER
88 OOLog(@"script.javaScript.timeLimit.debug",@"Limiter starting: %u => %u",sLimiterStartDepth,sLimiterStartDepth+1);
89#endif
90 if (sLimiterStartDepth++ == 0)
91 {
92 if (limit <= 0.0) limit = OOJS_TIME_LIMIT;
93 sLimiterTimeLimit = limit;
95
98 }
99
100#ifndef NDEBUG
101 sLastStartedFile = file;
102 sLastStartedLine = line;
103#endif
104}
#define OOJS_TIME_LIMIT
static const char * sLastStartedFile
static unsigned sLimiterStartDepth
static unsigned sLastStartedLine
#define OOLog(class, format,...)
Definition OOLogging.h:88

References OODisposeHighResTime, OOGetHighResTime, OOJS_TIME_LIMIT, OOLog, sLastStartedFile, sLastStartedLine, sLimiterPauseDepth, sLimiterStart, sLimiterStartDepth, and sLimiterTimeLimit.

◆ OOJSStopTimeLimiter_()

void OOJSStopTimeLimiter_ ( const char * file,
unsigned line )

Definition at line 108 of file OOJSEngineTimeManagement.m.

112{
113#ifndef NDEBUG
114 if (sLimiterStartDepth == 0)
115 {
116 OOLog(@"bug.javaScript.limiterDepth", @"Attempt to stop JavaScript time limiter while it is already fully stopped. This is an internal bug, please report it. (Last start: %@:%u, last valid stop: %@:%u, this stop attempt: %@:%u.)", OOLogAbbreviatedFileName(sLastStartedFile), sLastStartedLine, OOLogAbbreviatedFileName(sLastStoppedFile), sLastStoppedLine, OOLogAbbreviatedFileName(file), line);
117 return;
118 }
119
120 sLastStoppedFile = file;
121 sLastStoppedLine = line;
122
123#if OOJS_DEBUG_LIMITER
124 OOLog(@"script.javaScript.timeLimit.debug",@"Limiter ending: %u <= %u",sLimiterStartDepth-1,sLimiterStartDepth);
125#endif
126
127#endif
128
129 if (--sLimiterStartDepth == 0) sLimiterTimeLimit = 0.0;
130}
static unsigned sLastStoppedLine
static const char * sLastStoppedFile
NSString * OOLogAbbreviatedFileName(const char *inName)
Definition OOLogging.m:839

References OOLog, OOLogAbbreviatedFileName(), sLastStartedFile, sLastStartedLine, sLastStoppedFile, sLastStoppedLine, sLimiterStartDepth, and sLimiterTimeLimit.

+ Here is the call graph for this function:

◆ OOJSTimeManagementInit()

void OOJSTimeManagementInit ( OOJavaScriptEngine * engine,
JSRuntime * runtime )

Definition at line 254 of file OOJSEngineTimeManagement.m.

255{
256 [NSThread detachNewThreadSelector:@selector(watchdogTimerThread)
257 toTarget:engine
258 withObject:nil];
259
260 JS_SetContextCallback(runtime, ContextCallback);
261}
static JSBool ContextCallback(JSContext *context, uintN contextOp)
return nil

◆ OperationCallback()

static JSBool OperationCallback ( JSContext * context)
static

Definition at line 217 of file OOJSEngineTimeManagement.m.

218{
219 if (!sStop) return YES;
220
221 JS_ClearPendingException(context);
222
226
227 if (elapsed <= sLimiterTimeLimit) return YES;
228
229 OOLogERR(@"script.javaScript.timeLimit", @"Script \"%@\" ran for %g seconds and has been terminated.", [[OOJSScript currentlyRunningScript] name], elapsed);
230#ifndef NDEBUG
231 OOJSDumpStack(context);
232#endif
233
234 // FIXME: we really should put something in the JS log here, but since that's implemented in JS there are complications.
235
236 return NO;
237}
void OOJSDumpStack(JSContext *context)
#define OOLogERR(class, format,...)
Definition OOLogging.h:112

References OODisposeHighResTime, OOGetHighResTime, OOHighResTimeDeltaInSeconds(), OOJSDumpStack(), OOLogERR, sLimiterStart, sLimiterTimeLimit, and sStop.

Referenced by ContextCallback().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ sLastStartedFile

const char* sLastStartedFile
static

◆ sLastStartedLine

unsigned sLastStartedLine
static

◆ sLastStoppedFile

const char* sLastStoppedFile
static

Definition at line 71 of file OOJSEngineTimeManagement.m.

Referenced by OOJSStopTimeLimiter_().

◆ sLastStoppedLine

unsigned sLastStoppedLine
static

Definition at line 72 of file OOJSEngineTimeManagement.m.

Referenced by OOJSStopTimeLimiter_().

◆ sLimiterPauseDepth

int sLimiterPauseDepth
static

◆ sLimiterPauseStart

OOHighResTimeValue sLimiterPauseStart
static

Definition at line 56 of file OOJSEngineTimeManagement.m.

Referenced by OOJSPauseTimeLimiter(), and OOJSResumeTimeLimiter().

◆ sLimiterStart

OOHighResTimeValue sLimiterStart
static

◆ sLimiterStartDepth

unsigned sLimiterStartDepth
static

◆ sLimiterTimeLimit

double sLimiterTimeLimit
static

◆ sStop

BOOL sStop
static

Definition at line 66 of file OOJSEngineTimeManagement.m.

Referenced by OOJSResetTimeLimiter(), and OperationCallback().