summaryrefslogtreecommitdiffstats
path: root/Tools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp')
-rw-r--r--Tools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp62
1 files changed, 36 insertions, 26 deletions
diff --git a/Tools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp b/Tools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp
index 5a48b27..1266c02 100644
--- a/Tools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp
+++ b/Tools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp
@@ -37,6 +37,8 @@
#include <wtf/Assertions.h>
#include <wtf/HashSet.h>
+static JSContextGroupRef javaScriptThreadsGroup;
+
static pthread_mutex_t javaScriptThreadsMutex = PTHREAD_MUTEX_INITIALIZER;
static bool javaScriptThreadsShouldTerminate;
@@ -51,58 +53,68 @@ static ThreadSet* javaScriptThreads()
return &staticJavaScriptThreads;
}
-// Loops forever, running a script and randomly respawning, until
-// javaScriptThreadsShouldTerminate becomes true.
+// This function exercises JSC in a loop until javaScriptThreadsShouldTerminate
+// becomes true or it probabilistically decides to spawn a replacement thread and exit.
void* runJavaScriptThread(void* arg)
{
- const char* const script =
+ static const char* const script =
"var array = [];"
- "for (var i = 0; i < 10; i++) {"
+ "for (var i = 0; i < 1024; i++) {"
" array.push(String(i));"
"}";
- while (1) {
- JSGlobalContextRef ctx = JSGlobalContextCreate(0);
- JSStringRef scriptRef = JSStringCreateWithUTF8CString(script);
+ pthread_mutex_lock(&javaScriptThreadsMutex);
+ JSGlobalContextRef ctx = JSGlobalContextCreateInGroup(javaScriptThreadsGroup, 0);
+ pthread_mutex_unlock(&javaScriptThreadsMutex);
+
+ pthread_mutex_lock(&javaScriptThreadsMutex);
+ JSStringRef scriptRef = JSStringCreateWithUTF8CString(script);
+ pthread_mutex_unlock(&javaScriptThreadsMutex);
+ while (1) {
+ pthread_mutex_lock(&javaScriptThreadsMutex);
JSValueRef exception = 0;
JSEvaluateScript(ctx, scriptRef, 0, 0, 1, &exception);
ASSERT(!exception);
-
- JSGarbageCollect(ctx);
- JSGlobalContextRelease(ctx);
- JSStringRelease(scriptRef);
-
- JSGarbageCollect(0);
+ pthread_mutex_unlock(&javaScriptThreadsMutex);
pthread_mutex_lock(&javaScriptThreadsMutex);
+ size_t valuesCount = 1024;
+ JSValueRef values[valuesCount];
+ for (size_t i = 0; i < valuesCount; ++i)
+ values[i] = JSObjectMake(ctx, 0, 0);
+ pthread_mutex_unlock(&javaScriptThreadsMutex);
// Check for cancellation.
- if (javaScriptThreadsShouldTerminate) {
- javaScriptThreads()->remove(pthread_self());
- pthread_mutex_unlock(&javaScriptThreadsMutex);
- return 0;
- }
+ if (javaScriptThreadsShouldTerminate)
+ goto done;
// Respawn probabilistically.
if (random() % 5 == 0) {
+ pthread_mutex_lock(&javaScriptThreadsMutex);
pthread_t pthread;
pthread_create(&pthread, 0, &runJavaScriptThread, 0);
pthread_detach(pthread);
-
- javaScriptThreads()->remove(pthread_self());
javaScriptThreads()->add(pthread);
-
pthread_mutex_unlock(&javaScriptThreadsMutex);
- return 0;
+ goto done;
}
-
- pthread_mutex_unlock(&javaScriptThreadsMutex);
}
+
+done:
+ pthread_mutex_lock(&javaScriptThreadsMutex);
+ JSStringRelease(scriptRef);
+ JSGarbageCollect(ctx);
+ JSGlobalContextRelease(ctx);
+ javaScriptThreads()->remove(pthread_self());
+ pthread_mutex_unlock(&javaScriptThreadsMutex);
+ return 0;
}
void startJavaScriptThreads()
{
+ javaScriptThreadsGroup = JSContextGroupCreate();
+
pthread_mutex_lock(&javaScriptThreadsMutex);
for (int i = 0; i < javaScriptThreadsCount; i++) {
@@ -121,8 +133,6 @@ void stopJavaScriptThreads()
javaScriptThreadsShouldTerminate = true;
- ASSERT(javaScriptThreads()->size() == javaScriptThreadsCount);
-
pthread_mutex_unlock(&javaScriptThreadsMutex);
while (true) {