From 008f708aa1e7965d2d7976b65e6ab0d31ca8a87d Mon Sep 17 00:00:00 2001 From: "reed%reedloden.com" Date: Wed, 20 Feb 2008 11:27:41 +0000 Subject: [PATCH] Bug 404879 - "ActionMonkey: Modify js/src to use new thread-safe MMgc APIs" (tests) [p=jorendorff@mozilla.com (Jason Orendorff) r=bc a1.9=schrep] git-svn-id: svn://10.0.0.236/trunk@246078 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/tests/js1_8/extensions/dekker.js | 98 ++++++++++++++ mozilla/js/tests/js1_8/extensions/for-in.js | 85 ++++++++++++ mozilla/js/tests/js1_8/extensions/lamport.js | 126 ++++++++++++++++++ mozilla/js/tests/js1_8/extensions/peterson.js | 89 +++++++++++++ .../tests/js1_8/extensions/regress-415721.js | 74 ++++++++++ .../js/tests/js1_8/extensions/simple-tree.js | 82 ++++++++++++ 6 files changed, 554 insertions(+) create mode 100644 mozilla/js/tests/js1_8/extensions/dekker.js create mode 100644 mozilla/js/tests/js1_8/extensions/for-in.js create mode 100644 mozilla/js/tests/js1_8/extensions/lamport.js create mode 100644 mozilla/js/tests/js1_8/extensions/peterson.js create mode 100644 mozilla/js/tests/js1_8/extensions/regress-415721.js create mode 100644 mozilla/js/tests/js1_8/extensions/simple-tree.js diff --git a/mozilla/js/tests/js1_8/extensions/dekker.js b/mozilla/js/tests/js1_8/extensions/dekker.js new file mode 100644 index 00000000000..e7921290c53 --- /dev/null +++ b/mozilla/js/tests/js1_8/extensions/dekker.js @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is JavaScript Engine testing utilities. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): Jason Orendorff + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +var gTestfile = 'dekker.js'; +//----------------------------------------------------------------------------- + +var summary = "Dekker's algorithm for mutual exclusion"; +// Adapted from pseudocode in Wikipedia: +// http://en.wikipedia.org/wiki/Dekker%27s_algorithm + +printStatus (summary); + +var N = 500; // number of iterations + +// the mutex mechanism +var f = [false, false]; +var turn = 0; + +// resource being protected +var counter = 0; + +function worker(me) { + let him = 1 - me; + + for (let i = 0; i < N; i++) { + // enter the mutex + f[me] = true; + while (f[him]) { + if (turn != me) { + f[me] = false; + while (turn != me) + ; // busy wait + f[me] = true; + } + } + + // critical section + let x = counter; + sleep(0.003); + counter = x + 1; + + // leave the mutex + turn = him; + f[me] = false; + } + + return 'ok'; +} + +var expect; +var actual; + +if (typeof scatter == 'undefined' || typeof sleep == 'undefined') { + print('Test skipped. scatter or sleep not defined.'); + expect = actual = 'Test skipped.'; +} else { + var results = scatter([function () { return worker(0); }, + function () { return worker(1); }]); + + expect = "Thread status: [ok,ok], counter: " + (2 * N); + actual = "Thread status: [" + results + "], counter: " + counter; +} + +reportCompare(expect, actual, summary); diff --git a/mozilla/js/tests/js1_8/extensions/for-in.js b/mozilla/js/tests/js1_8/extensions/for-in.js new file mode 100644 index 00000000000..df5e00adcd5 --- /dev/null +++ b/mozilla/js/tests/js1_8/extensions/for-in.js @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is JavaScript Engine testing utilities. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): Jason Orendorff + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +var gTestfile = 'for-in.js'; +//----------------------------------------------------------------------------- + +var summary = "Contention among threads enumerating properties"; +// Adapted from mozilla/js/src/xpconnect/tests/js/old/threads.js + +printStatus (summary); + +var LOOP_COUNT = 1000; +var THREAD_COUNT = 10; + +var foo; +var bar; + +function makeWorkerFn(id) { + return function() { + foo = id + 1; + bar[id] = {p: 0}; + var n, m; + for (n in bar) { + for (m in bar[n]) {} + } + for (n in {}.__parent__) {} + }; +} + +function range(n) { + for (let i = 0; i < n; i++) + yield i; +} + +var expect; +var actual; + +expect = actual = 'No crash'; +if (typeof scatter == 'undefined') { + print('Test skipped. scatter not defined.'); +} else if (!("__parent__" in {})) { + print('Test skipped. __parent__ not defined.'); +} else { + for (let i = 0; i < LOOP_COUNT; i++) { + foo = 0; + bar = new Array(THREAD_COUNT); + scatter([makeWorkerFn(j) for (j in range(THREAD_COUNT))]); + } +} + +reportCompare(expect, actual, summary); diff --git a/mozilla/js/tests/js1_8/extensions/lamport.js b/mozilla/js/tests/js1_8/extensions/lamport.js new file mode 100644 index 00000000000..15abf1740fb --- /dev/null +++ b/mozilla/js/tests/js1_8/extensions/lamport.js @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is JavaScript Engine testing utilities. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): Guoxin Fan + * Jason Orendorff + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +var gTestfile = 'lamport.js' +//----------------------------------------------------------------------- + +var summary = "Lamport Bakery's algorithm for mutual exclusion"; +// Adapted from pseudocode in Wikipedia: +// http://en.wikipedia.org/wiki/Lamport%27s_bakery_algorithm + +printStatus(summary); + +var N = 15; // Number of threads. +var LOOP_COUNT = 10; // Number of times each thread should loop + +function range(n) { + for (let i = 0; i < n; i++) + yield i; +} + +function max(a) { + let x = Number.NEGATIVE_INFINITY; + for each (let i in a) + if (i > x) + x = i; + return x; +} + +// the mutex mechanism +var entering = [false for (i in range(N))]; +var ticket = [0 for (i in range(N))]; + +// the object being protected +var counter = 0; + +function lock(i) +{ + entering[i] = true; + ticket[i] = 1 + max(ticket); + entering[i] = false; + + for (let j = 0; j < N; j++) { + // If thread j is in the middle of getting a ticket, wait for that to + // finish. + while (entering[j]) + ; + + // Wait until all threads with smaller ticket numbers or with the same + // ticket number, but with higher priority, finish their work. + while ((ticket[j] != 0) && ((ticket[j] < ticket[i]) || + ((ticket[j] == ticket[i]) && (i < j)))) + ; + } +} + +function unlock(i) { + ticket[i] = 0; +} + +function worker(i) { + for (let k = 0; k < LOOP_COUNT; k++) { + lock(i); + + // The critical section + let x = counter; + sleep(0.003); + counter = x + 1; + + unlock(i); + } + return 'ok'; +} + +function makeWorker(id) { + return function () { return worker(id); }; +} + +var expect; +var actual; + +if (typeof scatter == 'undefined' || typeof sleep == 'undefined') { + print('Test skipped. scatter or sleep not defined.'); + expect = actual = 'Test skipped.'; +} else { + scatter([makeWorker(i) for (i in range(N))]); + + expect = "counter: " + (N * LOOP_COUNT); + actual = "counter: " + counter; +} + +reportCompare(expect, actual, summary); diff --git a/mozilla/js/tests/js1_8/extensions/peterson.js b/mozilla/js/tests/js1_8/extensions/peterson.js new file mode 100644 index 00000000000..aaf0a163edf --- /dev/null +++ b/mozilla/js/tests/js1_8/extensions/peterson.js @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is JavaScript Engine testing utilities. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): Guoxin Fan + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +var gTestfile = 'peterson.js'; +//----------------------------------------------------------------------- + +var summary = "Peterson's algorithm for mutual exclusion"; + +printStatus(summary); + +var N = 500; // number of iterations + +// the mutex mechanism +var f = [false, false]; +var turn = 0; + +// the resource being protected +var counter = 0; + +function worker(me) { + let him = 1 - me; + + for (let i = 0; i < N; i++) { + // enter the mutex + f[me] = true; + turn = him; + while (f[him] && turn == him) + ; // busy wait + + // critical section + let x = counter; + sleep(0.003); + counter = x+1; + + // leave the mutex + f[me] = false; + } + + return 'ok'; +} + +var expect; +var actual; + +if (typeof scatter == 'undefined' || typeof sleep == 'undefined') { + print('Test skipped. scatter or sleep not defined.'); + expect = actual = 'Test skipped.'; +} else { + var results = scatter ([function() { return worker(0); }, + function() { return worker(1); }]); + expect = "Thread status: [ok,ok], counter: " + (2 * N); + actual = "Thread status: [" + results + "], counter: " + counter; +} + +reportCompare(expect, actual, summary); diff --git a/mozilla/js/tests/js1_8/extensions/regress-415721.js b/mozilla/js/tests/js1_8/extensions/regress-415721.js new file mode 100644 index 00000000000..b0508a5aa75 --- /dev/null +++ b/mozilla/js/tests/js1_8/extensions/regress-415721.js @@ -0,0 +1,74 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is JavaScript Engine testing utilities. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): Jason Orendorff + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +var gTestfile = 'regress-415721.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 415721; +var summary = 'jsatom.c double hashing re-validation logic is unsound'; + +printStatus (summary); + +var VARS = 10000; +var TRIES = 100; + +function atomizeStressTest() { + var fn = "function f() {var "; + for (var i = 0; i < VARS; i++) + fn += '_f' + i + ', '; + fn += 'q;}'; + + function e() { eval(fn); } + + for (var i = 0; i < TRIES; i++) { + scatter([e,e]); + gc(); + } +} + +var expect; +var actual; + +expect = actual = 'No crash'; +if (typeof scatter == 'undefined' || typeof gc == 'undefined') { + print('Test skipped. scatter or gc not defined.'); + expect = actual = 'Test skipped.'; +} else { + atomizeStressTest(); +} + +reportCompare(expect, actual, summary); + diff --git a/mozilla/js/tests/js1_8/extensions/simple-tree.js b/mozilla/js/tests/js1_8/extensions/simple-tree.js new file mode 100644 index 00000000000..8127f9f4080 --- /dev/null +++ b/mozilla/js/tests/js1_8/extensions/simple-tree.js @@ -0,0 +1,82 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is JavaScript Engine testing utilities. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): Jason Orendorff + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +var gTestfile = 'simple-tree.js'; +//----------------------------------------------------------------------------- + +var summary = "Create a tree of threads"; + +var N = 50; // number of threads to create + +printStatus (summary); + +function range(start, stop) { + var a = []; + for (var i = start; i < stop; i++) + a.push(i); + return a; +} + +function tree(start, stop) { + sleep(0.001); + + if (start >= stop) + return []; + else if (start + 1 >= stop) + return [start]; + + sleep(0.001); + + let mid = start + Math.floor((stop - start) / 2); + let halves = scatter([function () { return tree(start, mid); }, + function () { return tree(mid, stop); }]); + sleep(0.001); + return Array.prototype.concat.apply([], halves); +} + +var expect; +var actual; + +if (typeof scatter == 'undefined' || typeof sleep == 'undefined') { + print('Test skipped. scatter or sleep not defined.'); + expect = actual = 'Test skipped.'; +} else { + expect = range(0, N).toSource(); + actual = tree(0, N).toSource(); +} + +reportCompare(expect, actual, summary);