// |reftest| skip /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ * Contributor: Jason Orendorff */ //----------------------------------------------------------------------------- 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);