proc_test: reuse the same stack and memory array of the scheduling test during preemp...
[bertos.git] / bertos / kern / proc_test.c
index 5b5bf3ff663f842ac20c121c7a3b5e871c69c581..46a057f468a665a3a954df164d4d9ce5609fec17 100644 (file)
@@ -90,7 +90,7 @@ static unsigned int done[TASKS];
 #define DELAY  5
 
 // Define process stacks for test.
-static cpu_stack_t worker_stack[TASKS][WORKER_STACK_SIZE / sizeof(cpu_stack_t)];
+static PROC_DEFINE_STACK(worker_stack, TASKS * WORKER_STACK_SIZE);
 
 static int prime_numbers[] =
 {
@@ -102,7 +102,7 @@ STATIC_ASSERT(TASKS <= countof(prime_numbers));
 
 static void worker(void)
 {
-       long pid = (long)proc_currentUserData();
+       ssize_t pid = (ssize_t)proc_currentUserData();
        long tot = prime_numbers[pid - 1];
        unsigned int my_count = 0;
        int i;
@@ -110,24 +110,27 @@ static void worker(void)
        for (i = 0; i < tot; i++)
        {
                my_count++;
-               PROC_ATOMIC(kprintf("> %s[%ld] running\n", __func__, pid));
+               PROC_ATOMIC(kprintf("> %s[%zd] running\n", __func__, pid));
                timer_delay(tot * DELAY);
        }
        done[pid - 1] = 1;
-       PROC_ATOMIC(kprintf("> %s[%ld] completed\n", __func__, pid));
+       PROC_ATOMIC(kprintf("> %s[%zd] completed\n", __func__, pid));
 }
 
 static int worker_test(void)
 {
-       long i;
+       ssize_t i;
 
        // Init the test processes
        kputs("Run Proc test..\n");
        for (i = 0; i < TASKS; i++)
        {
-               sprintf(&name[i][0], "worker_%ld", i + 1);
+               name[i][0] = '\0';
+               snprintf(&name[i][0], sizeof(name[i]), "worker_%zd", i + 1);
+               name[i][sizeof(name) - 1] = '\0';
                proc_new_with_name(name[i], worker, (iptr_t)(i + 1),
-                               WORKER_STACK_SIZE, &worker_stack[i][0]);
+                               WORKER_STACK_SIZE,
+                               (cpu_stack_t *)((size_t)&worker_stack + WORKER_STACK_SIZE * i));
        }
        kputs("> Main: Processes started\n");
        while (1)
@@ -150,19 +153,15 @@ static int worker_test(void)
 /* Time to run each preemptible thread (in seconds) */
 #define TIME   10
 
-static char preempt_name[TASKS][32];
-
 static cpu_atomic_t barrier[TASKS];
 static cpu_atomic_t main_barrier;
 
 static unsigned int preempt_counter[TASKS];
 static unsigned int preempt_done[TASKS];
 
-static cpu_stack_t preempt_worker_stack[TASKS][WORKER_STACK_SIZE / sizeof(cpu_stack_t)];
-
 static void preempt_worker(void)
 {
-       long pid = (long)proc_currentUserData();
+       ssize_t pid = (ssize_t)proc_currentUserData();
        unsigned int *my_count = &preempt_counter[pid - 1];
        ticks_t start, stop;
        int i;
@@ -171,7 +170,7 @@ static void preempt_worker(void)
        /* Synchronize on the main barrier */
        while (!main_barrier)
                proc_yield();
-       PROC_ATOMIC(kprintf("> %s[%ld] running\n", __func__, pid));
+       PROC_ATOMIC(kprintf("> %s[%zd] running\n", __func__, pid));
        start = timer_clock();
        stop  = ms_to_ticks(TIME * 1000);
        while (timer_clock() - start < stop)
@@ -182,7 +181,7 @@ static void preempt_worker(void)
                if (UNLIKELY(*my_count == (unsigned int)~0))
                        *my_count = 1;
        }
-       PROC_ATOMIC(kprintf("> %s[%ld] completed: (counter = %d)\n",
+       PROC_ATOMIC(kprintf("> %s[%zd] completed: (counter = %d)\n",
                                __func__, pid, *my_count));
        for (i = 0; i < TASKS; i++)
                if (!preempt_counter[i])
@@ -196,15 +195,19 @@ static void preempt_worker(void)
 static int preempt_worker_test(void)
 {
        unsigned long score = 0;
-       long i;
+       ssize_t i;
 
        // Init the test processes
        kputs("Run Preemption test..\n");
        for (i = 0; i < TASKS; i++)
        {
-               sprintf(&preempt_name[i][0], "preempt_worker_%ld", i + 1);
-               proc_new_with_name(preempt_name[i], preempt_worker, (iptr_t)(i + 1),
-                               WORKER_STACK_SIZE, &preempt_worker_stack[i][0]);
+               name[i][0] = '\0';
+               snprintf(&name[i][0], sizeof(name[i]),
+                               "preempt_worker_%zd", i + 1);
+               name[i][sizeof(name) - 1] = '\0';
+               proc_new_with_name(name[i], preempt_worker, (iptr_t)(i + 1),
+                               WORKER_STACK_SIZE,
+                               (cpu_stack_t *)((size_t)&worker_stack + WORKER_STACK_SIZE * i));
        }
        kputs("> Main: Processes created\n");
        /* Synchronize on start */