]> Zhao Yanbai Git Server - minix.git/commitdiff
test:test51 add a few more tests for calling setcontext.
authorKees Jongenburger <kees.jongenburger@gmail.com>
Tue, 25 Mar 2014 15:03:06 +0000 (16:03 +0100)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:22 +0000 (17:05 +0200)
Change-Id: I272ac01c77537b80bab328aae1acd7b6ce6027fb

test/test51.c

index 40116ee6e30cd882de85f4c9f8c56effc4bdb29d..d8691c43c977aeac57d018b5856903adade8ad8c 100644 (file)
 #include <string.h>
 #include <ucontext.h>
 #include <math.h>
-#ifndef __arm__
 #include <fenv.h>
-#else
-#include <ieeefp.h>
-#endif
 
 #include <sys/signal.h>
 
@@ -200,6 +196,19 @@ void verify_main_reenter(void)
   if (reentered_main == 0) err(4, 1);
 }
 
+int set_context_test_value;
+void set_context_test_thread1(void){
+       set_context_test_value |= 0x1;
+       setcontext(&ctx[2]);
+       err(1, 24);
+
+}
+
+void set_context_test_thread2(void){
+       set_context_test_value |= 0x1 << 1;
+       setcontext(&ctx[0]);
+       err(1, 23);
+}
 
 int main(void)
 {
@@ -317,6 +326,42 @@ int main(void)
   makecontext(&ctx[2], (void (*) (void)) do_child, 0);
   if (swapcontext(&ctx[0], &ctx[2]) == -1) err(1, 16);
 
+  /* test setcontext  first do some cleanup */
+
+  free(ctx[1].uc_stack.ss_sp);
+  free(ctx[2].uc_stack.ss_sp);
+
+  memset(&ctx[0],0,sizeof(ucontext_t));
+  memset(&ctx[1],0,sizeof(ucontext_t));
+  memset(&ctx[2],0,sizeof(ucontext_t));
+
+
+  /* create 3 new contexts */
+  volatile int cb =1;
+
+  /* control will be returned here */
+  set_context_test_value  = 0;
+  if (getcontext(&ctx[0]) != 0) err(1, 17);
+  if (set_context_test_value != 0x3) err(1, 20);
+  if (cb == 1) {
+    cb =0;
+    if (getcontext(&ctx[1]) != 0) err(1, 18);
+    if (getcontext(&ctx[2]) != 0) err(1, 19);
+
+    // allocate new stacks */
+    ctx[1].uc_stack.ss_sp = malloc(SSIZE);
+    ctx[1].uc_stack.ss_size = SSIZE;
+    ctx[2].uc_stack.ss_sp = malloc(SSIZE);
+    ctx[2].uc_stack.ss_size = SSIZE;
+
+    makecontext(&ctx[1],set_context_test_thread1,0);
+    makecontext(&ctx[2],set_context_test_thread2,0);
+    if( setcontext(&ctx[1]) != 0){
+      err(1, 21);
+    }
+    err(1, 22);
+  }
+
   quit();
   return(-1);
 }