summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/lib/cothread/test/test_args.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/lib/cothread/test/test_args.cpp')
-rw-r--r--trunk/src/lib/cothread/test/test_args.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/trunk/src/lib/cothread/test/test_args.cpp b/trunk/src/lib/cothread/test/test_args.cpp
new file mode 100644
index 00000000000..1e6e2bbb5a3
--- /dev/null
+++ b/trunk/src/lib/cothread/test/test_args.cpp
@@ -0,0 +1,76 @@
+/*****
+ * cothread parameterized function example
+ *****
+ * entry point to cothreads cannot take arguments.
+ * this is due to portability issues: each processor,
+ * operating system, programming language and compiler
+ * can use different parameter passing methods, so
+ * arguments to the cothread entry points were omitted.
+ *
+ * however, the behavior can easily be simulated by use
+ * of a specialized co_switch to set global parameters to
+ * be used as function arguments.
+ *
+ * in this way, with a bit of extra red tape, one gains
+ * even more flexibility than would be possible with a
+ * fixed argument list entry point, such as void (*)(void*),
+ * as any number of arguments can be used.
+ *
+ * this also eliminates race conditions where a pointer
+ * passed to co_create may have changed or become invalidated
+ * before call to co_switch, as said pointer would now be set
+ * when calling co_switch, instead.
+ *****/
+
+#include "test.h"
+
+cothread_t thread[3];
+
+namespace co_arg {
+ int param_x;
+ int param_y;
+};
+
+//one could also call this co_init or somesuch if they preferred ...
+void co_switch(cothread_t thread, int param_x, int param_y) {
+ co_arg::param_x = param_x;
+ co_arg::param_y = param_y;
+ co_switch(thread);
+}
+
+void co_entrypoint() {
+int param_x = co_arg::param_x;
+int param_y = co_arg::param_y;
+ printf("co_entrypoint(%d, %d)\n", param_x, param_y);
+ co_switch(thread[0]);
+
+//co_arg::param_x will change here (due to co_switch(cothread_t, int, int) call changing values),
+//however, param_x and param_y will persist as they are thread local
+
+ printf("co_entrypoint(%d, %d)\n", param_x, param_y);
+ co_switch(thread[0]);
+ throw;
+}
+
+int main() {
+ printf("cothread parameterized function example\n\n");
+
+ thread[0] = co_active();
+ thread[1] = co_create(65536, co_entrypoint);
+ thread[2] = co_create(65536, co_entrypoint);
+
+//use specialized co_switch(cothread_t, int, int) for initial co_switch call
+ co_switch(thread[1], 1, 2);
+ co_switch(thread[2], 4, 8);
+
+//after first call, entry point arguments have been initialized, standard
+//co_switch(cothread_t) can be used from now on
+ co_switch(thread[2]);
+ co_switch(thread[1]);
+
+ printf("\ndone\n");
+#if defined(_MSC_VER) || defined(__DJGPP__)
+ getch();
+#endif
+ return 0;
+}