[pypy-commit] stmgc default: Add the first nice checkfence demo with a minimal stm.
arigo
noreply at buildbot.pypy.org
Tue Aug 20 21:30:24 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r486:6d314a5409dd
Date: 2013-08-20 21:29 +0200
http://bitbucket.org/pypy/stmgc/changeset/6d314a5409dd/
Log: Add the first nice checkfence demo with a minimal stm.
Add the 'howto-checkfence' from arigo/arigo, complete it with how to
run the demo.
diff --git a/checkfence/README b/checkfence/README
new file mode 100644
--- /dev/null
+++ b/checkfence/README
@@ -0,0 +1,56 @@
+Installing checkfence on Linux 64
+---------------------------------
+
+apt-get install bison flex ocaml ocaml-findlib
+
+cvs -z3 -d:pserver:anonymous at checkfence.cvs.sourceforge.net:/cvsroot/checkfence co -P checkfence
+
+cvs -z3 -d:pserver:anonymous at checkfence.cvs.sourceforge.net:/cvsroot/checkfence co -P c2lsl
+
+
+http://www.princeton.edu/~chaff/zchaff.html
+ for Linux 64 you need zchaff.64bit.2007.3.12.zip.
+ I did not try the 32-bit version.
+
+ Build with "make -j1".
+
+ This is C++ code with errors: it's missing these lines
+ #include <cstdlib>
+ #include <cstring>
+ at the top of some files. Add as you get the errors.
+
+
+CIL version 1.3.7 (the more recent 1.7.3 doesn't work here)
+ http://sourceforge.net/projects/cil/files/cil/cil-1.3.7/
+
+ cd /usr/lib/ocaml
+ sudo ln -s libcamlstr.a libstr.a
+
+ ./configure
+ make -j1
+
+
+Compiling checkfence:
+ cd checkfence/build
+
+ edit the Makefile: ZCHAFFDIR=/path/to/zchaff64
+ make opt
+
+
+Compiling C2LSL:
+ cd c2lsl
+
+ edit the Makefile: CILDIR=/path/to/cil-1.3.7
+ and also: CILINCLUDES=....x86_LINUX (instead of x86_WIN32)
+
+ make -j1
+
+
+
+Running the examples:
+ cd c4
+ ln -s /full/path/to/c2lsl
+ ln -s /full/path/to/checkfence
+ ./run test1.c test1.lsl
+
+ Look at 'T0.bsc-overview.htm' in your web browser.
diff --git a/checkfence/c4/run b/checkfence/c4/run
new file mode 100755
--- /dev/null
+++ b/checkfence/c4/run
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+export C2LSL_HOME=./c2lsl
+export CHECKFENCE_HOME=./checkfence
+
+
+$C2LSL_HOME/bin/c2lsl.exe "$1" _run.lsl || exit 1
+shift
+$CHECKFENCE_HOME/run/clean || exit 1
+echo -------------------------------------------------------------------------
+$CHECKFENCE_HOME/run/checkfence -i _run.lsl "$@" || exit 1
diff --git a/checkfence/c4/test1.c b/checkfence/c4/test1.c
new file mode 100644
--- /dev/null
+++ b/checkfence/c4/test1.c
@@ -0,0 +1,93 @@
+#include "lsl_protos.h"
+
+
+#define PREBUILT_FLAGS 0
+#define LOCKED 5
+
+typedef int revision_t;
+
+
+typedef struct {
+ int h_flags;
+ revision_t h_revision;
+ revision_t h_original;
+ int value;
+} object_t;
+
+object_t o1, o2;
+int global_timestamp;
+
+struct tx_descriptor {
+ int starttime;
+ int lock;
+ object_t *copy_of_o1;
+};
+
+void init_descriptor(struct tx_descriptor *d)
+{
+ d->starttime = global_timestamp; lsl_fence("load-load");
+ d->copy_of_o1 = NULL;
+ //d->lock = lsl_get_thread_id() + 1000000;
+}
+
+
+object_t *stm_write_barrier(struct tx_descriptor *d, object_t *P)
+{
+ lsl_observe_label("write_barrier");
+
+ if (d->copy_of_o1 == NULL) {
+ lsl_assume(P->h_revision <= d->starttime); /* otherwise, abort */
+
+ object_t *W = lsl_malloc(sizeof(object_t));
+ W->value = P->value;
+ d->copy_of_o1 = W;
+ }
+ return d->copy_of_o1;
+}
+
+
+void i()
+{
+ o1.h_flags = PREBUILT_FLAGS;
+ o1.h_revision = 0;
+ o1.h_original = 0;
+ o1.value = 50;
+ global_timestamp = 2;
+}
+
+void commit(struct tx_descriptor *d)
+{
+ lsl_observe_label("commit");
+
+ if (d->copy_of_o1 != NULL) {
+ int old = o1.h_revision;
+ lsl_assume(old <= d->starttime); /* otherwise, abort */
+ lsl_assume(lsl_cas_32(&o1.h_revision, old, LOCKED)); /* retry */
+ }
+
+ int endtime = global_timestamp + 1;
+ lsl_fence("load-load");
+ lsl_assume(lsl_cas_32(&global_timestamp, endtime - 1, endtime));
+ /* otherwise, retry */
+
+ if (d->copy_of_o1 != NULL) {
+ int o1_value = d->copy_of_o1->value;
+ o1.value = o1_value;
+ lsl_fence("store-store");
+ o1.h_revision = endtime;
+ lsl_observe_output("o1_value", o1_value);
+ d->copy_of_o1 = NULL;
+ }
+}
+
+void W1()
+{
+ struct tx_descriptor d;
+
+ init_descriptor(&d);
+
+ object_t *p1 = stm_write_barrier(&d, &o1);
+ ++p1->value;
+
+ commit(&d);
+}
diff --git a/checkfence/c4/test1.lsl b/checkfence/c4/test1.lsl
new file mode 100644
--- /dev/null
+++ b/checkfence/c4/test1.lsl
@@ -0,0 +1,2 @@
+
+test T0 = i ( W1 | W1 )
More information about the pypy-commit
mailing list