Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/scriptinterface/ScriptRuntime.h
Show All 24 Lines | |||||
constexpr int STACK_CHUNK_SIZE = 8192; | constexpr int STACK_CHUNK_SIZE = 8192; | ||||
// Those are minimal defaults. The runtime for the main game is larger and GCs upon a larger growth. | // Those are minimal defaults. The runtime for the main game is larger and GCs upon a larger growth. | ||||
constexpr int DEFAULT_RUNTIME_SIZE = 16 * 1024 * 1024; | constexpr int DEFAULT_RUNTIME_SIZE = 16 * 1024 * 1024; | ||||
constexpr int DEFAULT_HEAP_GROWTH_BYTES_GCTRIGGER = 2 * 1024 * 1024; | constexpr int DEFAULT_HEAP_GROWTH_BYTES_GCTRIGGER = 2 * 1024 * 1024; | ||||
/** | /** | ||||
* Abstraction around a SpiderMonkey JSRuntime. | * Abstraction around a SpiderMonkey JSRuntime/JSContext. | ||||
* Each ScriptRuntime can be used to initialize several ScriptInterface | * | ||||
* contexts which can then share data, but a single ScriptRuntime should | * A single ScriptRuntime, with the associated runtime and context, | ||||
* only be used on a single thread. | * should only be used on a single thread. | ||||
* | * | ||||
* (One means to share data between threads and runtimes is to create | * (One means to share data between threads and runtimes is to create | ||||
* a ScriptInterface::StructuredClone.) | * a ScriptInterface::StructuredClone.) | ||||
*/ | */ | ||||
class ScriptRuntime | class ScriptRuntime | ||||
{ | { | ||||
public: | public: | ||||
ScriptRuntime(int runtimeSize, int heapGrowthBytesGCTrigger); | ScriptRuntime(int runtimeSize, int heapGrowthBytesGCTrigger); | ||||
~ScriptRuntime(); | ~ScriptRuntime(); | ||||
/** | /** | ||||
* Returns a runtime, which can used to initialise any number of | * Returns a runtime/context, in which any number of ScriptInterfaces compartments can live. | ||||
* ScriptInterfaces contexts. Values created in one context may be used | |||||
* in any other context from the same runtime (but not any other runtime). | |||||
* Each runtime should only ever be used on a single thread. | * Each runtime should only ever be used on a single thread. | ||||
* @param runtimeSize Maximum size in bytes of the new runtime | * @param runtimeSize Maximum size in bytes of the new runtime | ||||
* @param heapGrowthBytesGCTrigger Size in bytes of cumulated allocations after which a GC will be triggered | * @param heapGrowthBytesGCTrigger Size in bytes of cumulated allocations after which a GC will be triggered | ||||
*/ | */ | ||||
static shared_ptr<ScriptRuntime> CreateRuntime( | static shared_ptr<ScriptRuntime> CreateRuntime( | ||||
int runtimeSize = DEFAULT_RUNTIME_SIZE, | int runtimeSize = DEFAULT_RUNTIME_SIZE, | ||||
int heapGrowthBytesGCTrigger = DEFAULT_HEAP_GROWTH_BYTES_GCTRIGGER); | int heapGrowthBytesGCTrigger = DEFAULT_HEAP_GROWTH_BYTES_GCTRIGGER); | ||||
/** | /** | ||||
* MaybeIncrementalRuntimeGC tries to determine whether a runtime-wide garbage collection would free up enough memory to | * MaybeIncrementalRuntimeGC tries to determine whether a runtime-wide garbage collection would free up enough memory to | ||||
* be worth the amount of time it would take. It does this with our own logic and NOT some predefined JSAPI logic because | * be worth the amount of time it would take. It does this with our own logic and NOT some predefined JSAPI logic because | ||||
* such functionality currently isn't available out of the box. | * such functionality currently isn't available out of the box. | ||||
* It does incremental GC which means it will collect one slice each time it's called until the garbage collection is done. | * It does incremental GC which means it will collect one slice each time it's called until the garbage collection is done. | ||||
* This can and should be called quite regularly. The delay parameter allows you to specify a minimum time since the last GC | * This can and should be called quite regularly. The delay parameter allows you to specify a minimum time since the last GC | ||||
* in seconds (the delay should be a fraction of a second in most cases though). | * in seconds (the delay should be a fraction of a second in most cases though). | ||||
* It will only start a new incremental GC or another GC slice if this time is exceeded. The user of this function is | * It will only start a new incremental GC or another GC slice if this time is exceeded. The user of this function is | ||||
* responsible for ensuring that GC can run with a small enough delay to get done with the work. | * responsible for ensuring that GC can run with a small enough delay to get done with the work. | ||||
*/ | */ | ||||
void MaybeIncrementalGC(double delay); | void MaybeIncrementalGC(double delay); | ||||
void ShrinkingGC(); | void ShrinkingGC(); | ||||
void RegisterContext(JSContext* cx); | /** | ||||
void UnRegisterContext(JSContext* cx); | * This is used to keep track of compartments which should be prepared for a GC. | ||||
*/ | |||||
void RegisterCompartment(JSCompartment* cmpt); | |||||
void UnRegisterCompartment(JSCompartment* cmpt); | |||||
JSRuntime* m_rt; | JSRuntime* GetJSRuntime() const { return m_rt; } | ||||
/** | |||||
* GetGeneralJSContext returns the context without starting a GC request and without | |||||
* entering any compartment. It should only be used in specific situations, such as | |||||
* creating a new compartment, or as an unsafe alternative to GetJSRuntime. | |||||
* If you need the compartmented context of a ScriptInterface, you should create a | |||||
* ScriptInterface::Request and use the context from that. | |||||
*/ | |||||
JSContext* GetGeneralJSContext() const { return m_cx; } | |||||
private: | private: | ||||
void PrepareContextsForIncrementalGC(); | JSRuntime* m_rt; | ||||
JSContext* m_cx; | |||||
std::list<JSContext*> m_Contexts; | void PrepareCompartmentsForIncrementalGC() const; | ||||
std::list<JSCompartment*> m_Compartments; | |||||
int m_RuntimeSize; | int m_RuntimeSize; | ||||
int m_HeapGrowthBytesGCTrigger; | int m_HeapGrowthBytesGCTrigger; | ||||
int m_LastGCBytes; | int m_LastGCBytes; | ||||
double m_LastGCCheck; | double m_LastGCCheck; | ||||
}; | }; | ||||
#endif // INCLUDED_SCRIPTRUNTIME | #endif // INCLUDED_SCRIPTRUNTIME |
Wildfire Games · Phabricator