diff options
| author | Richard Purdie <rpurdie@linux.intel.com> | 2010-07-06 17:41:11 +0100 |
|---|---|---|
| committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-07-16 12:31:19 +0100 |
| commit | 5c44f9a78dd310b31df2d84128c4b3ca468d685d (patch) | |
| tree | 89bd33570db4c27bb782a7d6eb341fcd4d7b4f71 /bitbake/lib/bb/runqueue.py | |
| parent | 8a5b5080a2fa0db7972573cfcd8e04abedb22618 (diff) | |
| download | poky-5c44f9a78dd310b31df2d84128c4b3ca468d685d.tar.gz | |
bitbake: runqueue: Separate out task forking code into a new function
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 117 |
1 files changed, 61 insertions, 56 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index c82affca3c..8814343377 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -942,62 +942,7 @@ class RunQueue: | |||
| 942 | self.stats.taskSkipped() | 942 | self.stats.taskSkipped() |
| 943 | continue | 943 | continue |
| 944 | 944 | ||
| 945 | sys.stdout.flush() | 945 | pid, pipein, pipeout = self.fork_off_task(fn, task, taskname) |
| 946 | sys.stderr.flush() | ||
| 947 | try: | ||
| 948 | pipein, pipeout = os.pipe() | ||
| 949 | pid = os.fork() | ||
| 950 | except OSError as e: | ||
| 951 | bb.msg.fatal(bb.msg.domain.RunQueue, "fork failed: %d (%s)" % (e.errno, e.strerror)) | ||
| 952 | if pid == 0: | ||
| 953 | os.close(pipein) | ||
| 954 | # Save out the PID so that the event can include it the | ||
| 955 | # events | ||
| 956 | bb.event.worker_pid = os.getpid() | ||
| 957 | bb.event.worker_pipe = pipeout | ||
| 958 | |||
| 959 | self.state = runQueueChildProcess | ||
| 960 | # Make the child the process group leader | ||
| 961 | os.setpgid(0, 0) | ||
| 962 | # No stdin | ||
| 963 | newsi = os.open('/dev/null', os.O_RDWR) | ||
| 964 | os.dup2(newsi, sys.stdin.fileno()) | ||
| 965 | # Stdout to a logfile | ||
| 966 | #logout = data.expand("${TMPDIR}/log/stdout.%s" % os.getpid(), self.cfgData, True) | ||
| 967 | #mkdirhier(os.path.dirname(logout)) | ||
| 968 | #newso = open(logout, 'w') | ||
| 969 | #os.dup2(newso.fileno(), sys.stdout.fileno()) | ||
| 970 | #os.dup2(newso.fileno(), sys.stderr.fileno()) | ||
| 971 | |||
| 972 | bb.event.fire(runQueueTaskStarted(task, self.stats, self), self.cfgData) | ||
| 973 | bb.msg.note(1, bb.msg.domain.RunQueue, | ||
| 974 | "Running task %d of %d (ID: %s, %s)" % (self.stats.completed + self.stats.active + 1, | ||
| 975 | self.stats.total, | ||
| 976 | task, | ||
| 977 | self.get_user_idstring(task))) | ||
| 978 | |||
| 979 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY", self, self.cooker.configuration.data) | ||
| 980 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY2", fn, self.cooker.configuration.data) | ||
| 981 | try: | ||
| 982 | the_data = self.cooker.bb_cache.loadDataFull(fn, self.cooker.configuration.data) | ||
| 983 | |||
| 984 | if not self.cooker.configuration.dry_run: | ||
| 985 | bb.build.exec_task(taskname, the_data) | ||
| 986 | os._exit(0) | ||
| 987 | |||
| 988 | except bb.build.FuncFailed: | ||
| 989 | bb.msg.error(bb.msg.domain.Build, "task stack execution failed") | ||
| 990 | os._exit(1) | ||
| 991 | except bb.build.EventException as e: | ||
| 992 | event = e.args[1] | ||
| 993 | bb.msg.error(bb.msg.domain.Build, "%s event exception, aborting" % bb.event.getName(event)) | ||
| 994 | os._exit(1) | ||
| 995 | except Exception: | ||
| 996 | from traceback import format_exc | ||
| 997 | bb.msg.error(bb.msg.domain.Build, "Build of %s %s failed" % (fn, taskname)) | ||
| 998 | bb.msg.error(bb.msg.domain.Build, format_exc()) | ||
| 999 | os._exit(1) | ||
| 1000 | os._exit(0) | ||
| 1001 | 946 | ||
| 1002 | self.build_pids[pid] = task | 947 | self.build_pids[pid] = task |
| 1003 | self.build_pipes[pid] = runQueuePipe(pipein, pipeout, self.cfgData) | 948 | self.build_pipes[pid] = runQueuePipe(pipein, pipeout, self.cfgData) |
| @@ -1083,6 +1028,66 @@ class RunQueue: | |||
| 1083 | self.state = runQueueComplete | 1028 | self.state = runQueueComplete |
| 1084 | return | 1029 | return |
| 1085 | 1030 | ||
| 1031 | def fork_off_task(self, fn, task, taskname): | ||
| 1032 | sys.stdout.flush() | ||
| 1033 | sys.stderr.flush() | ||
| 1034 | try: | ||
| 1035 | pipein, pipeout = os.pipe() | ||
| 1036 | pid = os.fork() | ||
| 1037 | except OSError as e: | ||
| 1038 | bb.msg.fatal(bb.msg.domain.RunQueue, "fork failed: %d (%s)" % (e.errno, e.strerror)) | ||
| 1039 | if pid == 0: | ||
| 1040 | os.close(pipein) | ||
| 1041 | # Save out the PID so that the event can include it the | ||
| 1042 | # events | ||
| 1043 | bb.event.worker_pid = os.getpid() | ||
| 1044 | bb.event.worker_pipe = pipeout | ||
| 1045 | |||
| 1046 | self.state = runQueueChildProcess | ||
| 1047 | # Make the child the process group leader | ||
| 1048 | os.setpgid(0, 0) | ||
| 1049 | # No stdin | ||
| 1050 | newsi = os.open('/dev/null', os.O_RDWR) | ||
| 1051 | os.dup2(newsi, sys.stdin.fileno()) | ||
| 1052 | # Stdout to a logfile | ||
| 1053 | #logout = data.expand("${TMPDIR}/log/stdout.%s" % os.getpid(), self.cfgData, True) | ||
| 1054 | #mkdirhier(os.path.dirname(logout)) | ||
| 1055 | #newso = open(logout, 'w') | ||
| 1056 | #os.dup2(newso.fileno(), sys.stdout.fileno()) | ||
| 1057 | #os.dup2(newso.fileno(), sys.stderr.fileno()) | ||
| 1058 | |||
| 1059 | bb.event.fire(runQueueTaskStarted(task, self.stats, self), self.cfgData) | ||
| 1060 | bb.msg.note(1, bb.msg.domain.RunQueue, | ||
| 1061 | "Running task %d of %d (ID: %s, %s)" % (self.stats.completed + self.stats.active + 1, | ||
| 1062 | self.stats.total, | ||
| 1063 | task, | ||
| 1064 | self.get_user_idstring(task))) | ||
| 1065 | |||
| 1066 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY", self, self.cooker.configuration.data) | ||
| 1067 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY2", fn, self.cooker.configuration.data) | ||
| 1068 | try: | ||
| 1069 | the_data = self.cooker.bb_cache.loadDataFull(fn, self.cooker.configuration.data) | ||
| 1070 | |||
| 1071 | if not self.cooker.configuration.dry_run: | ||
| 1072 | bb.build.exec_task(taskname, the_data) | ||
| 1073 | os._exit(0) | ||
| 1074 | |||
| 1075 | except bb.build.FuncFailed: | ||
| 1076 | bb.msg.error(bb.msg.domain.Build, "task stack execution failed") | ||
| 1077 | os._exit(1) | ||
| 1078 | except bb.build.EventException as e: | ||
| 1079 | event = e.args[1] | ||
| 1080 | bb.msg.error(bb.msg.domain.Build, "%s event exception, aborting" % bb.event.getName(event)) | ||
| 1081 | os._exit(1) | ||
| 1082 | except Exception: | ||
| 1083 | from traceback import format_exc | ||
| 1084 | bb.msg.error(bb.msg.domain.Build, "Build of %s %s failed" % (fn, taskname)) | ||
| 1085 | bb.msg.error(bb.msg.domain.Build, format_exc()) | ||
| 1086 | os._exit(1) | ||
| 1087 | os._exit(0) | ||
| 1088 | return pid, pipein, pipeout | ||
| 1089 | |||
| 1090 | |||
| 1086 | def dump_data(self, taskQueue): | 1091 | def dump_data(self, taskQueue): |
| 1087 | """ | 1092 | """ |
| 1088 | Dump some debug information on the internal data structures | 1093 | Dump some debug information on the internal data structures |
