On Sat, Dec 17, 2005 at 12:02:00AM +0900, Jason Stubbs wrote:
> I mean for when a sub-process is running such as ebuild or rsync. Will 
> portage 
> get the SIGINT before or at the same time as the sub-process causing portage 
> to then SIGKILL it while it's trying to exit cleanly? Given that portage's 
> atexit handler is registered after portage_exec's, the subprocess reaping 
> code would not have been doing anything in the past. I guess the question is 
> more a general one rather than specifically related to background fetching.
Tests seem to work fine.

attached is updated parallel-fetch patch; main bits are chunking the 
worthless atexit crap from portage.py .

So... test it out please.  based against 2.1_pre1, although it should 
apply to .53.

Thanks,
~harring
Index: bin/emerge
===================================================================
--- bin/emerge  (revision 2390)
+++ bin/emerge  (working copy)
@@ -1869,6 +1869,41 @@
 
                self.pkgsettings["FEATURES"]=string.join(myfeat)
 
+               if "parallel-fetch" in myfeat and not ("--ask" in myopts or 
"--pretend" in myopts or "--fetchonly" in myopts):
+                       if "distlocks" not in myfeat:
+                               print red("!!!")
+                               print red("!!!")+" parallel-fetching requires 
the distlocks feature enabled"
+                               print red("!!!")+" you have it disabled, thus 
parallel-fetching is being disabled"
+                               print red("!!!")
+                       elif len(mymergelist) > 1:
+                               print ">>> starting parallel fetching"
+                               pid = os.fork()
+                               if not pid:
+                                       sys.stdin.close()
+                                       sys.stdout.close()
+                                       sys.stderr.close()
+                                       sys.stdout = open("/dev/null","w")
+                                       sys.stderr = open("/dev/null","w")
+                                       os.dup2(sys.stdout.fileno(), 1)
+                                       os.dup2(sys.stdout.fileno(), 2)
+                                       for x in ("autoaddcvs", "cvs"):
+                                               try:    myfeat.remove(x)
+                                               except ValueError: pass
+                                       self.pkgsettings["FEATURES"] = " 
".join(myfeat)
+                                       ret = 0
+                                       for x in mymergelist:
+                                               if x[0] != "ebuild":
+                                                       continue
+                                               try:
+                                                       ret = 
portage.doebuild(portage.portdb.findname(x[2]), "fetch", x[1], self.pkgsettings,
+                                                               cleanup=0, 
fetchonly=True, tree="porttree")
+                                               except SystemExit:
+                                                       raise
+                                               except Exception:
+                                                       ret = 1
+                                       sys.exit(0)
+                               portage.portage_exec.spawned_pids.append(pid)
+
                mergecount=0
                for x in mymergelist:
                        mergecount+=1
Index: pym/portage.py
===================================================================
--- pym/portage.py      (revision 2390)
+++ pym/portage.py      (working copy)
@@ -130,9 +130,6 @@
        signal.signal(signal.SIGTERM, signal.SIG_IGN)
 
        # 0=send to *everybody* in process group
-       portageexit()
-       print "Exiting due to signal"
-       os.kill(0,signum)
        sys.exit(1)
 
 signal.signal(signal.SIGCHLD, signal.SIG_DFL)
@@ -6987,14 +6984,6 @@
 def portageexit():
        global uid,portage_gid,portdb,db
        if secpass and not os.environ.has_key("SANDBOX_ACTIVE"):
-               # wait child process death
-               try:
-                       while True:
-                               os.wait()
-               except OSError:
-                       #writemsg(">>> All child process are now dead.")
-                       pass
-
                close_portdbapi_caches()
 
                if mtimedb:

Attachment: pgpf22JHBtdnM.pgp
Description: PGP signature

Reply via email to