This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "aesop Repository".
The branch, master has been updated
via 6334b6b00d0a665a09b44a770e44450506b9f9df (commit)
via 233c430b785d213d4cf4dd12c6cbb650a7e39ed1 (commit)
via 7783d568af3b8f22666c11cdaabe5552551ea276 (commit)
via eb94e24b727ae65749cdad29d4f0284dbf6dc48e (commit)
via 806d340b28c3f5bcc7073f1e96b58c0af45d6b7d (commit)
via 1777383e9f6547bcec267e4556b980170b7d2b2a (commit)
from c96325166f18ba62b5f835498cc894b09f552bee (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 6334b6b00d0a665a09b44a770e44450506b9f9df
Author: Phil Carns <carns(a)mcs.anl.gov>
Date: Sun Feb 5 20:54:40 2012 -0500
filled in more file functions
commit 233c430b785d213d4cf4dd12c6cbb650a7e39ed1
Author: Phil Carns <carns(a)mcs.anl.gov>
Date: Sun Feb 5 20:26:43 2012 -0500
convert thread/file tests to use aesop_main_set()
commit 7783d568af3b8f22666c11cdaabe5552551ea276
Author: Phil Carns <carns(a)mcs.anl.gov>
Date: Sun Feb 5 14:21:13 2012 -0500
update parser tests to not use context by default
commit eb94e24b727ae65749cdad29d4f0284dbf6dc48e
Author: Phil Carns <carns(a)mcs.anl.gov>
Date: Sun Feb 5 14:12:42 2012 -0500
update to new c-utils
commit 806d340b28c3f5bcc7073f1e96b58c0af45d6b7d
Author: Phil Carns <carns(a)mcs.anl.gov>
Date: Sat Feb 4 17:31:11 2012 -0500
added aefile resource proof of concept
commit 1777383e9f6547bcec267e4556b980170b7d2b2a
Author: Phil Carns <carns(a)mcs.anl.gov>
Date: Sat Feb 4 07:37:25 2012 -0500
added thread resource
- based on old branch-threader concept, but using a thread pool
-----------------------------------------------------------------------
Summary of changes:
ae-init.c | 3 +-
configure.ac | 4 +
parser/tests/blocking/afterwhile.ae | 2 +-
parser/tests/blocking/basic-struct-init.ae | 2 +-
parser/tests/blocking/basic-struct-return.ae | 2 +-
parser/tests/blocking/basic.ae | 2 +-
parser/tests/blocking/cancel-pbranch-loop.ae | 2 +-
parser/tests/blocking/cancel-pbranch1.ae | 2 +-
parser/tests/blocking/cancel-pbranch2.ae | 2 +-
parser/tests/blocking/cancel-pbranch3.ae | 2 +-
parser/tests/blocking/cancel-pbranch4.ae | 2 +-
parser/tests/blocking/compound.ae | 2 +-
parser/tests/blocking/dowhileloop.ae | 2 +-
parser/tests/blocking/forloop.ae | 2 +-
parser/tests/blocking/forloop2.ae | 2 +-
parser/tests/blocking/forloop3.ae | 2 +-
parser/tests/blocking/funptrs.ae | 2 +-
parser/tests/blocking/icpfor.ae | 2 +-
parser/tests/blocking/if.ae | 2 +-
parser/tests/blocking/ifnbelse.ae | 2 +-
parser/tests/blocking/ifnoelse.ae | 2 +-
parser/tests/blocking/ifnoelse2.ae | 2 +-
.../blocking/lonely-pbranch-variable-scope.ae | 2 +-
parser/tests/blocking/lonely-pbranch.ae | 2 +-
parser/tests/blocking/lonely-pbranch2.ae | 2 +-
parser/tests/blocking/lonely-pbranch3.ae | 2 +-
parser/tests/blocking/lonely-pbranch4.ae | 2 +-
parser/tests/blocking/mixed.ae | 2 +-
parser/tests/blocking/multif.ae | 2 +-
parser/tests/blocking/nbfun.ae | 2 +-
parser/tests/blocking/nested-forloop.ae | 2 +-
parser/tests/blocking/nested.ae | 2 +-
parser/tests/blocking/parallel1.ae | 2 +-
parser/tests/blocking/parallel2.ae | 2 +-
parser/tests/blocking/parallel3.ae | 2 +-
parser/tests/blocking/parallel4.ae | 2 +-
parser/tests/blocking/parallelfor.ae | 2 +-
parser/tests/blocking/parallelfor2.ae | 2 +-
parser/tests/blocking/parallelfor3.ae | 2 +-
parser/tests/blocking/params.ae | 2 +-
parser/tests/blocking/pbranch-completion.ae | 2 +-
parser/tests/blocking/pbranch-with-return.ae | 2 +-
parser/tests/blocking/pbreak-before-blocking.ae | 2 +-
parser/tests/blocking/pbreak-immed-cancel.ae | 2 +-
parser/tests/blocking/pbreak.ae | 2 +-
parser/tests/blocking/pbreak2.ae | 2 +-
parser/tests/blocking/pbreak3.ae | 2 +-
parser/tests/blocking/pbreak4.ae | 2 +-
parser/tests/blocking/pbreak5.ae | 2 +-
parser/tests/blocking/pbreak6.ae | 2 +-
parser/tests/blocking/pbreak7.ae | 2 +-
parser/tests/blocking/pbreak8.ae | 2 +-
parser/tests/blocking/pprivate.ae | 2 +-
parser/tests/blocking/pshared.ae | 2 +-
parser/tests/blocking/pwait-in-for.ae | 2 +-
parser/tests/blocking/pwait-in-while.ae | 2 +-
parser/tests/blocking/tcpfor.ae | 2 +-
parser/tests/blocking/threefors.ae | 2 +-
parser/tests/blocking/twofors.ae | 2 +-
parser/tests/blocking/whilebreak.ae | 2 +-
parser/tests/blocking/whilebreak2.ae | 2 +-
parser/tests/blocking/whilebreak3.ae | 2 +-
parser/tests/blocking/whileloop.ae | 2 +-
resources/file/aefile.ae | 128 ++++++++++
resources/file/aefile.hae | 20 ++
resources/file/module.mk.in | 5 +
resources/file/test/aefile-example.ae | 127 ++++++++++
resources/file/test/module.mk.in | 4 +
resources/thread/aethread.c | 245 ++++++++++++++++++++
resources/thread/aethread.hae | 17 ++
resources/thread/module.mk.in | 5 +
resources/thread/test/aethread-example.ae | 116 +++++++++
resources/thread/test/module.mk.in | 4 +
src/c-utils | 2 +-
74 files changed, 739 insertions(+), 63 deletions(-)
create mode 100644 resources/file/aefile.ae
create mode 100644 resources/file/aefile.hae
create mode 100644 resources/file/module.mk.in
create mode 100644 resources/file/test/aefile-example.ae
create mode 100644 resources/file/test/module.mk.in
create mode 100644 resources/thread/aethread.c
create mode 100644 resources/thread/aethread.hae
create mode 100644 resources/thread/module.mk.in
create mode 100644 resources/thread/test/aethread-example.ae
create mode 100644 resources/thread/test/module.mk.in
Diff of changes:
diff --git a/ae-init.c b/ae-init.c
index 3fcbe0a..bb8f914 100644
--- a/ae-init.c
+++ b/ae-init.c
@@ -1,10 +1,11 @@
#include "ae-init.h"
__attribute__((constructor)) void triton_timer_init_register(void);
-
+__attribute__((constructor)) void triton_aethread_init_register(void);
int ae_init (void)
{
/* Call the constructor functions here */
triton_timer_init_register ();
+ triton_aethread_init_register ();
}
diff --git a/configure.ac b/configure.ac
index 9aa279b..edc99ff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -282,6 +282,10 @@ AC_CONFIG_FILES([bin/aecc], [chmod +x bin/aecc])
AC_OUTPUT([Makefile
resources/timer/test/module.mk
resources/timer/module.mk
+resources/file/module.mk
+resources/file/test/module.mk
+resources/thread/module.mk
+resources/thread/test/module.mk
resources/resourcebuilder/module.mk
resources/resourcebuilder/test/module.mk
module.mk
diff --git a/parser/tests/blocking/afterwhile.ae b/parser/tests/blocking/afterwhile.ae
index d4010fb..01e6ca1 100644
--- a/parser/tests/blocking/afterwhile.ae
+++ b/parser/tests/blocking/afterwhile.ae
@@ -31,4 +31,4 @@ __blocking int aesop_main(int argc, char **argv)
run_outer();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/basic-struct-init.ae b/parser/tests/blocking/basic-struct-init.ae
index 7c55959..3f0440a 100644
--- a/parser/tests/blocking/basic-struct-init.ae
+++ b/parser/tests/blocking/basic-struct-init.ae
@@ -36,5 +36,5 @@ __blocking int aesop_main(int argc, char **argv)
run_basic();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/basic-struct-return.ae b/parser/tests/blocking/basic-struct-return.ae
index 5dd1a85..ad25659 100644
--- a/parser/tests/blocking/basic-struct-return.ae
+++ b/parser/tests/blocking/basic-struct-return.ae
@@ -39,5 +39,5 @@ __blocking int aesop_main(int argc, char **argv)
run_basic();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/basic.ae b/parser/tests/blocking/basic.ae
index fc73f6a..91af433 100644
--- a/parser/tests/blocking/basic.ae
+++ b/parser/tests/blocking/basic.ae
@@ -50,5 +50,5 @@ __blocking int aesop_main(int argc, char **argv)
run_basic();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/cancel-pbranch-loop.ae b/parser/tests/blocking/cancel-pbranch-loop.ae
index a94250d..c71287a 100644
--- a/parser/tests/blocking/cancel-pbranch-loop.ae
+++ b/parser/tests/blocking/cancel-pbranch-loop.ae
@@ -44,5 +44,5 @@ __blocking int aesop_main(int argc, char **argv)
run_test();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/cancel-pbranch1.ae b/parser/tests/blocking/cancel-pbranch1.ae
index e1d1c53..fbe7500 100644
--- a/parser/tests/blocking/cancel-pbranch1.ae
+++ b/parser/tests/blocking/cancel-pbranch1.ae
@@ -158,5 +158,5 @@ __blocking int aesop_main(int argc, char **argv)
run_test();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/cancel-pbranch2.ae b/parser/tests/blocking/cancel-pbranch2.ae
index 12fb967..83f3938 100644
--- a/parser/tests/blocking/cancel-pbranch2.ae
+++ b/parser/tests/blocking/cancel-pbranch2.ae
@@ -53,5 +53,5 @@ __blocking int aesop_main(int argc, char **argv)
run_test();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/cancel-pbranch3.ae b/parser/tests/blocking/cancel-pbranch3.ae
index 49df7fe..694af3d 100644
--- a/parser/tests/blocking/cancel-pbranch3.ae
+++ b/parser/tests/blocking/cancel-pbranch3.ae
@@ -41,5 +41,5 @@ __blocking int aesop_main(int argc, char **argv)
run_test();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/cancel-pbranch4.ae b/parser/tests/blocking/cancel-pbranch4.ae
index aafbc34..22f371d 100644
--- a/parser/tests/blocking/cancel-pbranch4.ae
+++ b/parser/tests/blocking/cancel-pbranch4.ae
@@ -36,5 +36,5 @@ __blocking int aesop_main(int argc, char **argv)
run_test();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/compound.ae b/parser/tests/blocking/compound.ae
index b2c8e12..9bb0039 100644
--- a/parser/tests/blocking/compound.ae
+++ b/parser/tests/blocking/compound.ae
@@ -47,5 +47,5 @@ __blocking int aesop_main(int argc, char **argv)
{
return run_compound();
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/dowhileloop.ae b/parser/tests/blocking/dowhileloop.ae
index 1627955..6964b41 100644
--- a/parser/tests/blocking/dowhileloop.ae
+++ b/parser/tests/blocking/dowhileloop.ae
@@ -24,5 +24,5 @@ __blocking int aesop_main(int argc, char **argv)
run_forloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/forloop.ae b/parser/tests/blocking/forloop.ae
index 0f75579..560c8ba 100644
--- a/parser/tests/blocking/forloop.ae
+++ b/parser/tests/blocking/forloop.ae
@@ -30,5 +30,5 @@ __blocking int aesop_main(int argc, char **argv)
run_forloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/forloop2.ae b/parser/tests/blocking/forloop2.ae
index 806f96e..998ce57 100644
--- a/parser/tests/blocking/forloop2.ae
+++ b/parser/tests/blocking/forloop2.ae
@@ -28,5 +28,5 @@ __blocking int aesop_main(int argc, char **argv)
run_forloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/forloop3.ae b/parser/tests/blocking/forloop3.ae
index 14d841c..beaed32 100644
--- a/parser/tests/blocking/forloop3.ae
+++ b/parser/tests/blocking/forloop3.ae
@@ -30,5 +30,5 @@ __blocking int aesop_main(int argc, char **argv)
run_forloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/funptrs.ae b/parser/tests/blocking/funptrs.ae
index 94639f2..cefa61f 100644
--- a/parser/tests/blocking/funptrs.ae
+++ b/parser/tests/blocking/funptrs.ae
@@ -74,5 +74,5 @@ __blocking int aesop_main(int argc, char **argv)
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/icpfor.ae b/parser/tests/blocking/icpfor.ae
index 1848a6f..ec51759 100644
--- a/parser/tests/blocking/icpfor.ae
+++ b/parser/tests/blocking/icpfor.ae
@@ -33,5 +33,5 @@ __blocking int aesop_main(int argc, char **argv)
run_parfor();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/if.ae b/parser/tests/blocking/if.ae
index 9f04c78..c0ee71b 100644
--- a/parser/tests/blocking/if.ae
+++ b/parser/tests/blocking/if.ae
@@ -41,5 +41,5 @@ __blocking int aesop_main(int argc, char **argv)
run_if();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/ifnbelse.ae b/parser/tests/blocking/ifnbelse.ae
index dbe111b..7e42c74 100644
--- a/parser/tests/blocking/ifnbelse.ae
+++ b/parser/tests/blocking/ifnbelse.ae
@@ -30,5 +30,5 @@ __blocking int aesop_main(int argc, char **argv)
run_ifnbelse();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/ifnoelse.ae b/parser/tests/blocking/ifnoelse.ae
index 69eeb10..57f0ef6 100644
--- a/parser/tests/blocking/ifnoelse.ae
+++ b/parser/tests/blocking/ifnoelse.ae
@@ -26,5 +26,5 @@ __blocking int aesop_main(int argc, char **argv)
run_ifnoelse();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/ifnoelse2.ae b/parser/tests/blocking/ifnoelse2.ae
index 4baa3b6..fb10dd8 100644
--- a/parser/tests/blocking/ifnoelse2.ae
+++ b/parser/tests/blocking/ifnoelse2.ae
@@ -28,5 +28,5 @@ __blocking int aesop_main(int argc, char **argv)
run_ifnoelse2();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/lonely-pbranch-variable-scope.ae b/parser/tests/blocking/lonely-pbranch-variable-scope.ae
index bba1f6c..573a244 100644
--- a/parser/tests/blocking/lonely-pbranch-variable-scope.ae
+++ b/parser/tests/blocking/lonely-pbranch-variable-scope.ae
@@ -59,7 +59,7 @@ __blocking int aesop_main(int argc, char **argv)
printf("Test complete.\n");
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/lonely-pbranch.ae b/parser/tests/blocking/lonely-pbranch.ae
index 3bacfb7..8626add 100644
--- a/parser/tests/blocking/lonely-pbranch.ae
+++ b/parser/tests/blocking/lonely-pbranch.ae
@@ -46,7 +46,7 @@ __blocking int aesop_main(int argc, char **argv)
lonely_pbranch();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/lonely-pbranch2.ae b/parser/tests/blocking/lonely-pbranch2.ae
index 24532b4..04d05cc 100644
--- a/parser/tests/blocking/lonely-pbranch2.ae
+++ b/parser/tests/blocking/lonely-pbranch2.ae
@@ -46,7 +46,7 @@ __blocking int aesop_main(int argc, char **argv)
lonely_pbranch();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/lonely-pbranch3.ae b/parser/tests/blocking/lonely-pbranch3.ae
index 8a9a177..b5a32ba 100644
--- a/parser/tests/blocking/lonely-pbranch3.ae
+++ b/parser/tests/blocking/lonely-pbranch3.ae
@@ -56,7 +56,7 @@ __blocking int aesop_main(int argc, char **argv)
lonely_pbranch_wrapper();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/lonely-pbranch4.ae b/parser/tests/blocking/lonely-pbranch4.ae
index 715024a..2c8d911 100644
--- a/parser/tests/blocking/lonely-pbranch4.ae
+++ b/parser/tests/blocking/lonely-pbranch4.ae
@@ -53,7 +53,7 @@ __blocking int aesop_main(int argc, char **argv)
lonely_pbranch();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/mixed.ae b/parser/tests/blocking/mixed.ae
index 30ec18c..76baba6 100644
--- a/parser/tests/blocking/mixed.ae
+++ b/parser/tests/blocking/mixed.ae
@@ -82,4 +82,4 @@ __blocking int aesop_main(int argc, char **argv)
run_mixed();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/multif.ae b/parser/tests/blocking/multif.ae
index 9464fa3..6d9da4d 100644
--- a/parser/tests/blocking/multif.ae
+++ b/parser/tests/blocking/multif.ae
@@ -67,4 +67,4 @@ __blocking int aesop_main(int argc, char **argv)
run_multiif();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/nbfun.ae b/parser/tests/blocking/nbfun.ae
index 9317f2c..d62639a 100644
--- a/parser/tests/blocking/nbfun.ae
+++ b/parser/tests/blocking/nbfun.ae
@@ -20,4 +20,4 @@ __blocking int aesop_main(int argc, char **argv)
{
return run_outer_nbfun1();
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/nested-forloop.ae b/parser/tests/blocking/nested-forloop.ae
index 7829df7..047e51a 100644
--- a/parser/tests/blocking/nested-forloop.ae
+++ b/parser/tests/blocking/nested-forloop.ae
@@ -25,5 +25,5 @@ __blocking int aesop_main(int argc, char **argv)
run_forloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/nested.ae b/parser/tests/blocking/nested.ae
index 60faa4e..9d996b5 100644
--- a/parser/tests/blocking/nested.ae
+++ b/parser/tests/blocking/nested.ae
@@ -25,4 +25,4 @@ __blocking int aesop_main(int argc, char **argv)
run_outer();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/parallel1.ae b/parser/tests/blocking/parallel1.ae
index d841616..8d065f6 100644
--- a/parser/tests/blocking/parallel1.ae
+++ b/parser/tests/blocking/parallel1.ae
@@ -42,4 +42,4 @@ __blocking int aesop_main(int argc, char **argv)
run_par1();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/parallel2.ae b/parser/tests/blocking/parallel2.ae
index 49745be..1e50c2b 100644
--- a/parser/tests/blocking/parallel2.ae
+++ b/parser/tests/blocking/parallel2.ae
@@ -51,6 +51,6 @@ __blocking int aesop_main(int argc, char **argv)
run_par2();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/parallel3.ae b/parser/tests/blocking/parallel3.ae
index 2c516d0..c2b138e 100644
--- a/parser/tests/blocking/parallel3.ae
+++ b/parser/tests/blocking/parallel3.ae
@@ -69,4 +69,4 @@ __blocking int aesop_main(int argc, char **argv)
run_par3();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/parallel4.ae b/parser/tests/blocking/parallel4.ae
index a7d7cb1..4b1f64a 100644
--- a/parser/tests/blocking/parallel4.ae
+++ b/parser/tests/blocking/parallel4.ae
@@ -67,4 +67,4 @@ __blocking int aesop_main(int argc, char **argv)
run_par4();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/parallelfor.ae b/parser/tests/blocking/parallelfor.ae
index 41ace9a..11eac19 100644
--- a/parser/tests/blocking/parallelfor.ae
+++ b/parser/tests/blocking/parallelfor.ae
@@ -42,5 +42,5 @@ __blocking int aesop_main(int argc, char **argv)
run_parfor();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/parallelfor2.ae b/parser/tests/blocking/parallelfor2.ae
index b609945..292186e 100644
--- a/parser/tests/blocking/parallelfor2.ae
+++ b/parser/tests/blocking/parallelfor2.ae
@@ -37,7 +37,7 @@ __blocking int aesop_main(int argc, char **argv)
run_parfor();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/parallelfor3.ae b/parser/tests/blocking/parallelfor3.ae
index 58a3426..1f7f42e 100644
--- a/parser/tests/blocking/parallelfor3.ae
+++ b/parser/tests/blocking/parallelfor3.ae
@@ -40,7 +40,7 @@ __blocking int aesop_main(int argc, char **argv)
run_parfor();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/params.ae b/parser/tests/blocking/params.ae
index a086e9f..c5d72a6 100644
--- a/parser/tests/blocking/params.ae
+++ b/parser/tests/blocking/params.ae
@@ -23,4 +23,4 @@ __blocking int aesop_main(int argc, char **argv)
run_params(10, "FOO", "BAR");
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbranch-completion.ae b/parser/tests/blocking/pbranch-completion.ae
index 5f3828a..d2bdd23 100644
--- a/parser/tests/blocking/pbranch-completion.ae
+++ b/parser/tests/blocking/pbranch-completion.ae
@@ -74,5 +74,5 @@ __blocking int aesop_main(int argc, char **argv)
}
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbranch-with-return.ae b/parser/tests/blocking/pbranch-with-return.ae
index 257ceb5..041fc78 100644
--- a/parser/tests/blocking/pbranch-with-return.ae
+++ b/parser/tests/blocking/pbranch-with-return.ae
@@ -29,5 +29,5 @@ __blocking int aesop_main(int argc, char **argv)
pbranch_with_return();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak-before-blocking.ae b/parser/tests/blocking/pbreak-before-blocking.ae
index 8bd61a1..e175653 100644
--- a/parser/tests/blocking/pbreak-before-blocking.ae
+++ b/parser/tests/blocking/pbreak-before-blocking.ae
@@ -87,7 +87,7 @@ __blocking int aesop_main(int argc, char **argv)
run_par1();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/pbreak-immed-cancel.ae b/parser/tests/blocking/pbreak-immed-cancel.ae
index 4d609af..55b5492 100644
--- a/parser/tests/blocking/pbreak-immed-cancel.ae
+++ b/parser/tests/blocking/pbreak-immed-cancel.ae
@@ -56,5 +56,5 @@ __blocking int aesop_main(int argc, char **argv)
run_pbreak();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak.ae b/parser/tests/blocking/pbreak.ae
index edd8554..cdd6e7a 100644
--- a/parser/tests/blocking/pbreak.ae
+++ b/parser/tests/blocking/pbreak.ae
@@ -54,5 +54,5 @@ __blocking int aesop_main(int argc, char **argv)
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak2.ae b/parser/tests/blocking/pbreak2.ae
index 45fae6e..b9ab983 100644
--- a/parser/tests/blocking/pbreak2.ae
+++ b/parser/tests/blocking/pbreak2.ae
@@ -47,5 +47,5 @@ __blocking int aesop_main(int argc, char **argv)
run_pbreak2();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak3.ae b/parser/tests/blocking/pbreak3.ae
index 26f738f..2ef6154 100644
--- a/parser/tests/blocking/pbreak3.ae
+++ b/parser/tests/blocking/pbreak3.ae
@@ -56,4 +56,4 @@ __blocking int aesop_main(int argc, char **argv)
run_pbreak3();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak4.ae b/parser/tests/blocking/pbreak4.ae
index 9ae0c4b..04c26d4 100644
--- a/parser/tests/blocking/pbreak4.ae
+++ b/parser/tests/blocking/pbreak4.ae
@@ -66,4 +66,4 @@ __blocking int aesop_main(int argc, char **argv)
run_pbreak4();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak5.ae b/parser/tests/blocking/pbreak5.ae
index 51eae26..dfb89ad 100644
--- a/parser/tests/blocking/pbreak5.ae
+++ b/parser/tests/blocking/pbreak5.ae
@@ -61,4 +61,4 @@ __blocking int aesop_main(int argc, char **argv)
run_pbreak5();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak6.ae b/parser/tests/blocking/pbreak6.ae
index b4cbfe7..d0f6748 100644
--- a/parser/tests/blocking/pbreak6.ae
+++ b/parser/tests/blocking/pbreak6.ae
@@ -55,4 +55,4 @@ __blocking int aesop_main(int argc, char **argv)
run_pbreak6();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pbreak7.ae b/parser/tests/blocking/pbreak7.ae
index 2b049f4..7056963 100644
--- a/parser/tests/blocking/pbreak7.ae
+++ b/parser/tests/blocking/pbreak7.ae
@@ -76,7 +76,7 @@ __blocking int aesop_main(int argc, char **argv)
run_par1();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/pbreak8.ae b/parser/tests/blocking/pbreak8.ae
index 385a306..7d4f3a7 100644
--- a/parser/tests/blocking/pbreak8.ae
+++ b/parser/tests/blocking/pbreak8.ae
@@ -74,7 +74,7 @@ __blocking int aesop_main(int argc, char **argv)
run_par1();
return 0;
}
-aesop_main_set(aesop_main, "btest", "timer");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/pprivate.ae b/parser/tests/blocking/pprivate.ae
index fbe6a90..7959ebf 100644
--- a/parser/tests/blocking/pprivate.ae
+++ b/parser/tests/blocking/pprivate.ae
@@ -46,7 +46,7 @@ __blocking int aesop_main(int argc, char **argv)
run_pprivate();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/pshared.ae b/parser/tests/blocking/pshared.ae
index 14ad3ea..c9f947c 100644
--- a/parser/tests/blocking/pshared.ae
+++ b/parser/tests/blocking/pshared.ae
@@ -64,7 +64,7 @@ __blocking int aesop_main(int argc, char **argv)
run_pshared();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
/*
* Local variables:
diff --git a/parser/tests/blocking/pwait-in-for.ae b/parser/tests/blocking/pwait-in-for.ae
index 85c4340..e66005c 100644
--- a/parser/tests/blocking/pwait-in-for.ae
+++ b/parser/tests/blocking/pwait-in-for.ae
@@ -43,4 +43,4 @@ __blocking int aesop_main(int argc, char **argv)
run_forloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/pwait-in-while.ae b/parser/tests/blocking/pwait-in-while.ae
index 5f73bd3..80c5ae8 100644
--- a/parser/tests/blocking/pwait-in-while.ae
+++ b/parser/tests/blocking/pwait-in-while.ae
@@ -42,4 +42,4 @@ __blocking int aesop_main(int argc, char **argv)
run_whileloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/tcpfor.ae b/parser/tests/blocking/tcpfor.ae
index f585651..2596fb4 100644
--- a/parser/tests/blocking/tcpfor.ae
+++ b/parser/tests/blocking/tcpfor.ae
@@ -33,5 +33,5 @@ __blocking int aesop_main(int argc, char **argv)
run_parfor();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/threefors.ae b/parser/tests/blocking/threefors.ae
index cc76c90..401972b 100644
--- a/parser/tests/blocking/threefors.ae
+++ b/parser/tests/blocking/threefors.ae
@@ -96,5 +96,5 @@ __blocking int aesop_main(int argc, char **argv)
run_threefors();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/twofors.ae b/parser/tests/blocking/twofors.ae
index c4343c2..e0cfd16 100644
--- a/parser/tests/blocking/twofors.ae
+++ b/parser/tests/blocking/twofors.ae
@@ -80,4 +80,4 @@ __blocking int aesop_main(int argc, char **argv)
run_twofors();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/whilebreak.ae b/parser/tests/blocking/whilebreak.ae
index 36ec675..8dde7f0 100644
--- a/parser/tests/blocking/whilebreak.ae
+++ b/parser/tests/blocking/whilebreak.ae
@@ -28,5 +28,5 @@ __blocking int aesop_main(int argc, char **argv)
run_whilebreak();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/whilebreak2.ae b/parser/tests/blocking/whilebreak2.ae
index f38dbe1..07480d3 100644
--- a/parser/tests/blocking/whilebreak2.ae
+++ b/parser/tests/blocking/whilebreak2.ae
@@ -26,4 +26,4 @@ __blocking int aesop_main(int argc, char **argv)
run_whilebreak();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/whilebreak3.ae b/parser/tests/blocking/whilebreak3.ae
index f201a4e..46007ea 100644
--- a/parser/tests/blocking/whilebreak3.ae
+++ b/parser/tests/blocking/whilebreak3.ae
@@ -33,4 +33,4 @@ __blocking int aesop_main(int argc, char **argv)
run_whilebreak();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/parser/tests/blocking/whileloop.ae b/parser/tests/blocking/whileloop.ae
index 9fd2e2b..556b6ff 100644
--- a/parser/tests/blocking/whileloop.ae
+++ b/parser/tests/blocking/whileloop.ae
@@ -29,4 +29,4 @@ __blocking int aesop_main(int argc, char **argv)
run_whileloop();
return 0;
}
-aesop_main_set(aesop_main, "btest");
+aesop_main_set(aesop_main);
diff --git a/resources/file/aefile.ae b/resources/file/aefile.ae
new file mode 100644
index 0000000..27ada83
--- /dev/null
+++ b/resources/file/aefile.ae
@@ -0,0 +1,128 @@
+#define _GNU_SOURCE
+#define _XOPEN_SOURCE 600
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "resources/file/aefile.hae"
+#include "resources/thread/aethread.hae"
+
+struct aethread_group* file_threads = NULL;
+
+int aefile_init(void)
+{
+ assert(file_threads == NULL);
+ /* TODO: make this configurable */
+ file_threads = aethread_create_group_pool(32);
+ if(!file_threads)
+ return(AE_ERR_SYSTEM);
+
+ return(0);
+}
+
+void aefile_finalize(void)
+{
+ assert(file_threads);
+ aethread_destroy_group(file_threads);
+
+ return;
+}
+
+__blocking ssize_t aefile_pwrite(int fd, const void *buf, size_t count, off_t offset)
+{
+ ssize_t ret;
+
+ aethread_hint(file_threads);
+
+ ret = pwrite(fd, buf, count, offset);
+ if(ret < 0)
+ {
+ ret = -errno;
+ }
+
+ return(ret);
+}
+
+__blocking ssize_t aefile_pread(int fd, void *buf, size_t count, off_t offset)
+{
+ ssize_t ret;
+
+ aethread_hint(file_threads);
+
+ ret = pread(fd, buf, count, offset);
+ if(ret < 0)
+ {
+ ret = -errno;
+ }
+
+ return(ret);
+}
+
+__blocking int aefile_fsync(int fd)
+{
+ int ret;
+
+ aethread_hint(file_threads);
+
+ ret = fsync(fd);
+ if(ret < 0)
+ {
+ ret = -errno;
+ }
+
+ return(ret);
+}
+
+__blocking int aefile_fdatasync(int fd)
+{
+ int ret;
+
+ aethread_hint(file_threads);
+
+ ret = fdatasync(fd);
+ if(ret < 0)
+ {
+ ret = -errno;
+ }
+
+ return(ret);
+}
+
+__blocking int aefile_ftruncate(int fd, off_t length)
+{
+ int ret;
+
+ aethread_hint(file_threads);
+
+ ret = ftruncate(fd, length);
+ if(ret < 0)
+ {
+ ret = -errno;
+ }
+
+ return(ret);
+}
+
+__blocking int aefile_unlink(const char *pathname)
+{
+ int ret;
+
+ aethread_hint(file_threads);
+
+ ret = unlink(pathname);
+ if(ret < 0)
+ {
+ ret = -errno;
+ }
+
+ return(ret);
+}
+
+
+
diff --git a/resources/file/aefile.hae b/resources/file/aefile.hae
new file mode 100644
index 0000000..f10eb1e
--- /dev/null
+++ b/resources/file/aefile.hae
@@ -0,0 +1,20 @@
+#ifndef __AEFILE_HAE__
+#define __AEFILE_HAE__
+
+#include "aesop.h"
+
+#include <unistd.h>
+#include <sys/types.h>
+
+int aefile_init(void);
+void aefile_finalize(void);
+
+__blocking ssize_t aefile_pwrite(int fd, const void *buf, size_t count, off_t offset);
+__blocking ssize_t aefile_pread(int fd, void *buf, size_t count, off_t offset);
+__blocking int aefile_fsync(int fd);
+__blocking int aefile_fdatasync(int fd);
+__blocking int aefile_ftruncate(int fd, off_t length);
+__blocking int aefile_unlink(const char *pathname);
+
+#endif
+
diff --git a/resources/file/module.mk.in b/resources/file/module.mk.in
new file mode 100644
index 0000000..d23d62d
--- /dev/null
+++ b/resources/file/module.mk.in
@@ -0,0 +1,5 @@
+DIR := resources/file
+
+AESOP_HDR += $(DIR)/aefile.hae
+
+AELIBSRC += $(DIR)/aefile.ae
diff --git a/resources/file/test/aefile-example.ae b/resources/file/test/aefile-example.ae
new file mode 100644
index 0000000..b971d09
--- /dev/null
+++ b/resources/file/test/aefile-example.ae
@@ -0,0 +1,127 @@
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+
+#include "aesop.h"
+#include "resources/file/aefile.hae"
+#include "resources/thread/aethread.hae"
+
+static double wtime(void)
+{
+ struct timeval t;
+ gettimeofday(&t, (void *) 0);
+ return ( (double) t.tv_sec + ( (double) t.tv_usec / 1000000 ) );
+}
+
+static __blocking int dotest(void)
+{
+ int fd;
+ int ret;
+ double start, end;
+ char fname_template[256];
+ char buf[4096];
+
+ start = wtime();
+
+ /* create a temporary file */
+ sprintf(fname_template, "/tmp/aefile-example.XXXXXX");
+ fd = mkstemp(fname_template);
+ if(fd < 0)
+ {
+ perror("mkstemp");
+ return(-1);
+ }
+
+ /* use aefile resource to access file */
+ /* NOTE: the aefile calls do not set errno; check the return code for
+ * -errno instead
+ */
+ ret = aefile_pwrite(fd, buf, 4096, 0);
+ if(ret < 0)
+ {
+ fprintf(stderr, "aefile_pwrite: %s\n", strerror(-ret));
+ return(-1);
+ }
+
+ ret = aefile_fsync(fd);
+ if(ret < 0)
+ {
+ fprintf(stderr, "aefile_fsync: %s\n", strerror(-ret));
+ return(-1);
+ }
+
+ ret = aefile_fdatasync(fd);
+ if(ret < 0)
+ {
+ fprintf(stderr, "aefile_fdatasync: %s\n", strerror(-ret));
+ return(-1);
+ }
+
+ ret = aefile_pread(fd, buf, 4096, 0);
+ if(ret < 0)
+ {
+ fprintf(stderr, "aefile_pread: %s\n", strerror(-ret));
+ return(-1);
+ }
+
+ ret = aefile_ftruncate(fd, 100);
+ if(ret < 0)
+ {
+ fprintf(stderr, "aefile_ftruncate: %s\n", strerror(-ret));
+ return(-1);
+ }
+
+ ret = close(fd);
+ if(ret < 0)
+ {
+ perror("close");
+ return(-1);
+ }
+
+ ret = aefile_unlink(fname_template);
+ if(ret < 0)
+ {
+ fprintf(stderr, "aefile_ftruncate: %s\n", strerror(-ret));
+ return(-1);
+ }
+
+ end = wtime();
+
+ printf("Example complete: %f seconds.\n", (end-start));
+
+ return 0;
+}
+
+__blocking int aesop_main(int argc, char **argv)
+{
+ int ret;
+
+ ret = aefile_init();
+ assert(ret == 0);
+
+ ret = dotest();
+ if(ret == 0)
+ printf("Success.\n");
+ else
+ printf("Failure.\n");
+
+ aefile_finalize();
+
+ return(ret);
+}
+
+aesop_main_set(aesop_main);
+
+/*
+ * Local variables:
+ * c-indent-level: 4
+ * c-basic-offset: 4
+ * End:
+ *
+ * vim: ft=c ts=8 sts=4 sw=4 expandtab
+ */
diff --git a/resources/file/test/module.mk.in b/resources/file/test/module.mk.in
new file mode 100644
index 0000000..03dc4d7
--- /dev/null
+++ b/resources/file/test/module.mk.in
@@ -0,0 +1,4 @@
+DIR := resources/file/test
+
+AETESTSRC += $(DIR)/aefile-example.ae
+
diff --git a/resources/thread/aethread.c b/resources/thread/aethread.c
new file mode 100644
index 0000000..d6b2cdf
--- /dev/null
+++ b/resources/thread/aethread.c
@@ -0,0 +1,245 @@
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <unistd.h>
+#include "aesop.h"
+#include "op.h"
+#include "opcache.h"
+#include "resources/thread/aethread.h"
+
+struct aethread_op
+{
+ ae_op_id_t op_id;
+ struct ae_op op;
+};
+
+struct aethread_group
+{
+ int pool_size;
+ int pool_active;
+ int pool_started;
+ pthread_t* pool_tids;
+ pthread_cond_t pool_cond;
+ pthread_mutex_t pool_mutex;
+ ae_ops_t oplist;
+};
+/* TODO: make configurable, or better yet dynamic based a runtime
+ * calculation that compares typical op service times against how long it
+ * takes to wake up a thread.
+ */
+#define THREAD_WORK_THRESHOLD 1
+static int aethread_resource_id;
+#define AETHREAD_DEFAULT_OPCACHE_SIZE 1024
+static ae_opcache_t aethread_opcache;
+static int initialized = 0;
+
+static void* thread_pool_fn(void* foo);
+
+void aethread_destroy_group(struct aethread_group* group)
+{
+ int i;
+
+ pthread_mutex_lock(&group->pool_mutex);
+ group->pool_started = 0;
+ pthread_cond_broadcast(&group->pool_cond);
+ pthread_mutex_unlock(&group->pool_mutex);
+
+ for(i=0; i<group->pool_size; i++)
+ {
+ pthread_join(group->pool_tids[i], NULL);
+ }
+
+ free(group->pool_tids);
+
+ return;
+}
+
+struct aethread_group* aethread_create_group_pool(int size)
+{
+ struct aethread_group* group;
+ int i;
+ int ret;
+
+ assert(initialized);
+
+ group = malloc(sizeof(*group));
+ if(!group)
+ {
+ return(NULL);
+ }
+ memset(group, 0, sizeof(*group));
+
+ group->pool_size = size;
+ group->pool_tids = malloc(size*sizeof(*group->pool_tids));
+ if(!group->pool_tids)
+ {
+ free(group);
+ return(NULL);
+ }
+ pthread_cond_init(&group->pool_cond, NULL);
+ pthread_mutex_init(&group->pool_mutex, NULL);
+ ae_ops_init(&group->oplist);
+
+ group->pool_active = size;
+ group->pool_started = 1;
+ for(i=0; i<size; i++)
+ {
+ ret = pthread_create(&group->pool_tids[i], NULL, thread_pool_fn, group);
+ assert(ret == 0); /* TODO: err handling */
+ }
+
+ return(group);
+}
+
+static void* thread_pool_fn(void* foo)
+{
+ struct aethread_group* group = (struct aethread_group*)foo;
+ struct ae_op* op = NULL;
+ void* user_ptr;
+ void (*callback)(void*);
+
+ while(1)
+ {
+ pthread_mutex_lock(&group->pool_mutex);
+ while(ae_ops_empty(&group->oplist) && group->pool_started)
+ {
+ group->pool_active--;
+ pthread_cond_wait(&group->pool_cond, &group->pool_mutex);
+ group->pool_active++;
+ }
+ if(!group->pool_started)
+ {
+ triton_mutex_unlock(&group->pool_mutex);
+ pthread_exit(NULL);
+ }
+ op = ae_ops_dequeue(&group->oplist);
+
+ if(ae_ops_count(&group->oplist)/group->pool_active >=
+ THREAD_WORK_THRESHOLD &&
+ group->pool_active < group->pool_size)
+ {
+ /* there is enough work available that we could make use of
+ * another thread
+ */
+ pthread_cond_signal(&group->pool_cond);
+ }
+
+ pthread_mutex_unlock(&group->pool_mutex);
+
+ /* no work; just run callback in the context of this thread */
+ /* trigger completion of the operation */
+ /* TODO: follow up on this. Can't use the usual complete_op macro
+ * because there is no return code
+ */
+ user_ptr = op->user_ptr;
+ callback = op->callback;
+ callback(user_ptr);
+ ae_opcache_put(aethread_opcache, op);
+ }
+
+ return(NULL);
+}
+
+int aethread_hint(void (*__ae_callback)(void *ptr), \
+ void *__ae_user_ptr, \
+ ae_hints_t *__ae_hints, \
+ ae_context_t __ae_ctx, \
+ ae_op_id_t *__ae_op_id, \
+ int __ae_internal, \
+ struct aethread_group* group)
+{
+ struct ae_op *op;
+ struct aethread_op *a_op;
+ pthread_t tid;
+ pthread_attr_t attr;
+ int ret;
+
+ assert(initialized && group);
+
+ if(!aethread_opcache)
+ {
+ fprintf(stderr, "Error: thread resource not initialized.\n");
+ assert(0);
+ }
+
+ op = ae_opcache_get(aethread_opcache);
+ ae_op_fill(op);
+
+ a_op = ae_op_entry(op, struct aethread_op, op);
+ a_op->op_id = ae_id_gen(aethread_resource_id, (intptr_t) op);
+
+ *__ae_op_id = a_op->op_id;
+
+ pthread_mutex_lock(&group->pool_mutex);
+ ae_ops_enqueue(op, &group->oplist);
+ if(group->pool_active == 0)
+ {
+ /* need to wake up at least one servicing thread */
+ pthread_cond_signal(&group->pool_cond);
+ }
+ pthread_mutex_unlock(&group->pool_mutex);
+
+ return AE_SUCCESS;
+}
+
+static int triton_aethread_poll(ae_context_t context)
+{
+ return AE_SUCCESS;
+}
+
+static int triton_aethread_cancel(ae_context_t triton_ctx, ae_op_id_t op_id)
+{
+ return AE_SUCCESS;
+}
+
+struct ae_resource triton_aethread_resource =
+{
+ .resource_name = "thread",
+ .poll_context = triton_aethread_poll,
+ .cancel = triton_aethread_cancel,
+ .config_array = NULL
+};
+
+__attribute__((constructor)) void triton_aethread_init_register(void);
+
+__attribute__((constructor)) void triton_aethread_init_register(void)
+{
+ ae_resource_init_register("thread", aethread_init, aethread_finalize);
+}
+
+int aethread_init(void)
+{
+ int ret;
+
+ assert(!initialized);
+
+ ret = AE_OPCACHE_INIT(struct aethread_op, op, AETHREAD_DEFAULT_OPCACHE_SIZE, &aethread_opcache);
+ if(ret != 0)
+ {
+ return AE_ERR_SYSTEM;
+ }
+
+ initialized = 1;
+ return ae_resource_register(&triton_aethread_resource, &aethread_resource_id);
+}
+
+void aethread_finalize(void)
+{
+ assert(initialized);
+
+ ae_resource_unregister(aethread_resource_id);
+
+ ae_opcache_destroy(aethread_opcache);
+
+ initialized = 0;
+}
+
+/*
+ * Local variables:
+ * c-indent-level: 4
+ * c-basic-offset: 4
+ * End:
+ *
+ * vim: ts=8 sts=4 sw=4 expandtab
+ */
diff --git a/resources/thread/aethread.hae b/resources/thread/aethread.hae
new file mode 100644
index 0000000..b95f050
--- /dev/null
+++ b/resources/thread/aethread.hae
@@ -0,0 +1,17 @@
+#ifndef __AETHREAD_HAE__
+#define __AETHREAD_HAE__
+
+#include "aesop.h"
+
+struct aethread_group;
+
+struct aethread_group* aethread_create_group_pool(int size);
+void aethread_destroy_group(struct aethread_group* group);
+
+__blocking void aethread_hint(struct aethread_group* group);
+
+int aethread_init(void);
+void aethread_finalize(void);
+
+#endif
+
diff --git a/resources/thread/module.mk.in b/resources/thread/module.mk.in
new file mode 100644
index 0000000..c952dab
--- /dev/null
+++ b/resources/thread/module.mk.in
@@ -0,0 +1,5 @@
+DIR := resources/thread
+
+AESOP_HDR += $(DIR)/aethread.hae
+
+LIBSRC += $(DIR)/aethread.c
diff --git a/resources/thread/test/aethread-example.ae b/resources/thread/test/aethread-example.ae
new file mode 100644
index 0000000..03d045e
--- /dev/null
+++ b/resources/thread/test/aethread-example.ae
@@ -0,0 +1,116 @@
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include "aesop.h"
+#include "resources/thread/aethread.hae"
+
+static double wtime(void)
+{
+ struct timeval t;
+ gettimeofday(&t, (void *) 0);
+ return ( (double) t.tv_sec + ( (double) t.tv_usec / 1000000 ) );
+}
+
+static __blocking int dotest(void)
+{
+ struct aethread_group* agroup;
+ double start, end;
+
+ agroup = aethread_create_group_pool(8);
+ assert(agroup);
+
+ start = wtime();
+ pwait
+ {
+ pbranch
+ {
+ sleep(3);
+ }
+
+ pbranch
+ {
+ sleep(3);
+ }
+
+ pbranch
+ {
+ sleep(3);
+ }
+ }
+ end = wtime();
+
+ printf("First example (should be about 9 seconds): %f seconds.\n", (end-start));
+
+ start = wtime();
+ pwait
+ {
+ pbranch
+ {
+ aethread_hint(agroup);
+ sleep(3);
+ }
+
+ pbranch
+ {
+ aethread_hint(agroup);
+ sleep(3);
+ }
+
+ pbranch
+ {
+ aethread_hint(agroup);
+ sleep(3);
+ }
+ }
+ end = wtime();
+
+ printf("Second example (should be about 3 seconds): %f seconds.\n", (end-start));
+
+ start = wtime();
+ pwait
+ {
+ pprivate int i;
+
+ /* deliberately go one past the thread pool size */
+ for(i=0; i<9; i++)
+ {
+ pbranch
+ {
+ aethread_hint(agroup);
+ sleep(3);
+ }
+ }
+ }
+ end = wtime();
+
+ printf("Third example (should be about 6 seconds): %f seconds.\n", (end-start));
+
+ aethread_destroy_group(agroup);
+ return 0;
+}
+
+__blocking int aesop_main(int argc, char **argv)
+{
+ int ret;
+
+ ret = dotest();
+ if(ret == 0)
+ printf("Success.\n");
+ else
+ printf("Failure.\n");
+
+ return(ret);
+}
+
+aesop_main_set(aesop_main);
+
+/*
+ * Local variables:
+ * c-indent-level: 4
+ * c-basic-offset: 4
+ * End:
+ *
+ * vim: ft=c ts=8 sts=4 sw=4 expandtab
+ */
diff --git a/resources/thread/test/module.mk.in b/resources/thread/test/module.mk.in
new file mode 100644
index 0000000..8b4d1db
--- /dev/null
+++ b/resources/thread/test/module.mk.in
@@ -0,0 +1,4 @@
+DIR := resources/thread/test
+
+AETESTSRC += $(DIR)/aethread-example.ae
+
diff --git a/src/c-utils b/src/c-utils
index 3b86ef2..e4d1f58 160000
--- a/src/c-utils
+++ b/src/c-utils
@@ -1 +1 @@
-Subproject commit 3b86ef28bcd17863fdf67cb4af6aa1558560ad9d
+Subproject commit e4d1f589cf370787f8d62aedf5887251c0d0ab81
hooks/post-receive
--
aesop Repository