diff example/task_queue/main.cc @ 492:9522c376a9fe

memcpy for param
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 09 Oct 2009 11:18:42 +0900
parents
children 58240647b23b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/main.cc	Fri Oct 09 11:18:42 2009 +0900
@@ -0,0 +1,114 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "TaskManager.h"
+#include "Func.h"
+#include "main.h"
+
+extern void task_init(void);
+
+static int count = 1;
+
+extern TaskManager *manager;
+
+const char *usr_help_str = "Usage: ./hello [-cpu spe_num] [-count N]\n\
+  -cpu    Number of SPE (default 1) \n\
+  -count  Number of task is print \"Hello, World!!\"";
+
+int
+init(int argc, char **argv)
+{
+    for (int i = 1; argv[i]; ++i) {
+	if (strcmp(argv[i], "-count") == 0) {
+            count = atoi(argv[++i]);
+        }
+
+    }
+
+    return 0;
+}
+
+Queues queues;
+
+static void
+repeat(void *arg)
+{
+    static int count = 4;
+    QueuePtr q = (QueuePtr) arg;
+    TaskManager *manager = q->m;
+
+    if (count-->0) {
+        HTask *t = manager->create_task(HELLO_TASK);
+        t->set_post(repeat, arg);
+        t->add_param(q->i);
+        t->add_param((int)arg);
+        t->spawn();
+
+        printf("[PPE] Create Task : Hello count=%d id=%d\n\n",count, q->i);
+    } else {
+        printf("[PPE] End Task : Hello id=%d\n\n", q->i);
+    }
+}
+
+void
+hello_init(TaskManager *manager)
+{
+
+    if (count >MAX_QUEUE) return;
+
+    queues.m = manager;
+    queues.i = 0;
+    for (int i = 0; i < MAX_QUEUE; i++) {
+	TaskQueueInfo *q = new TaskQueueInfo() ;
+	queues.q[i] = q;
+    }
+
+    for (int i = 0; i < count; i++) {
+	/**
+	 * Create Task
+	 *   create_task(Task ID);
+	 */
+	HTask *hello = manager->create_task(HELLO_TASK);
+
+	/**
+	 * Select CPU
+	 *   SPE_0, SPE_1, SPE_2, SPE_3, SPE_4, SPE_5, SPE_ANY
+	 *   if you do not call this, execute PPE.
+	 */
+	// hello->set_cpu(SPE_ANY);
+
+	/**
+	 * Set 32bits parameter
+	 *   add_param(32bit parameter);
+	 */
+	QueuePtr q = (QueuePtr) manager->allocate(sizeof(Queues));
+
+	q->i = i;
+	q->m = manager;
+	for (int j = 0; j < MAX_QUEUE; j++) {
+	    q->q[j] = queues.q[j];
+	}
+
+	hello->add_param(i);
+	hello->add_param((int)&queues);
+	hello->set_post(repeat, (void*) &queues);
+
+	hello->spawn();
+    }
+}
+
+int
+TMmain(TaskManager *manager, int argc, char *argv[])
+{
+    if (init(argc, argv) < 0) {
+	return -1;
+    }
+
+    // Task Register
+    //   ppe/task_init.cc
+    task_init();
+
+    hello_init(manager);
+
+    return 0;
+}