switchToWatchXid(): modified the new migrate-path to work when there exists a process...
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Tue, 11 May 2004 18:23:56 +0000 (18:23 +0000)
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Tue, 11 May 2004 18:23:56 +0000 (18:23 +0000)
git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@1555 94cd875c-1c1d-0410-91d2-eb244daf1a30

util-vserver/lib_internal/switchtowatchxid.c

index cea37fe..f88805d 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <vserver.h>
 #include <errno.h>
+#include <unistd.h>
 
   // try to switch in context 1
 bool
@@ -34,7 +35,14 @@ switchToWatchXid(char const **errptr)
   if (vc_get_task_xid(0)==1) return true;
 
   if (vc_isSupported(vcFEATURE_MIGRATE)) {
+    int                max_tries = 20;
+    again:
     if (vc_ctx_create(1)==VC_NOCTX) {
+      if (errno==EBUSY && --max_tries>0) {
+       usleep(50000);
+       goto again;
+      }
+       
       if (errno!=EEXIST) {
        if (errptr) *errptr = "vc_create_context()";
        return false;
@@ -45,6 +53,17 @@ switchToWatchXid(char const **errptr)
        return false;
       }
     }
+    else {
+      struct vc_ctx_flags      flags = {
+       .flagword = 0,
+       .mask     = VC_VXF_STATE_SETUP,
+      };
+
+      if (vc_set_cflags(1, &flags)==-1) {
+       if (errptr) *errptr = "vc_set_cflags()";
+       return false;
+      }
+    }
   }
   else {
 #if VC_ENABLE_API_COMPAT