author | Andrey Skvortsov <andrej.skvortzov@gmail.com> |
Thu, 19 Jan 2017 13:56:09 +0300 | |
changeset 1639 | 1953c268a194 |
parent 1581 | 2295fdc5c271 |
child 1730 | 64d8f52bc8c8 |
permissions | -rw-r--r-- |
79 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
4 |
# This file is part of Beremiz, a Integrated Development Environment for |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
5 |
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival. |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
6 |
# |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
7 |
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
8 |
# |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
9 |
# See COPYING file for copyrights details. |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
10 |
# |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
11 |
# This program is free software; you can redistribute it and/or |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
12 |
# modify it under the terms of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
13 |
# as published by the Free Software Foundation; either version 2 |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
14 |
# of the License, or (at your option) any later version. |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
15 |
# |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
16 |
# This program is distributed in the hope that it will be useful, |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
17 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
18 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
19 |
# GNU General Public License for more details. |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
20 |
# |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
21 |
# You should have received a copy of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
22 |
# along with this program; if not, write to the Free Software |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1539
diff
changeset
|
23 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
79 | 24 |
|
25 |
import time |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
26 |
import wx |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
27 |
import subprocess, ctypes |
704 | 28 |
from threading import Timer, Lock, Thread, Semaphore |
788 | 29 |
import os, sys |
235 | 30 |
if os.name == 'posix': |
31 |
from signal import SIGTERM, SIGKILL |
|
79 | 32 |
|
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
33 |
|
704 | 34 |
class outputThread(Thread): |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
35 |
""" |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
36 |
Thread is used to print the output of a command to the stdout |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
37 |
""" |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
38 |
def __init__(self, Proc, fd, callback=None, endcallback=None): |
704 | 39 |
Thread.__init__(self) |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
40 |
self.killed = False |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
41 |
self.finished = False |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
42 |
self.retval = None |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
43 |
self.Proc = Proc |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
44 |
self.callback = callback |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
45 |
self.endcallback = endcallback |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
46 |
self.fd = fd |
79 | 47 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
48 |
def run(self): |
162
bf3eac08a96b
Try to fix strange wxPopen behavior. Feedback appreciated.
etisserant
parents:
154
diff
changeset
|
49 |
outchunk = None |
149 | 50 |
self.retval = None |
51 |
while self.retval is None and not self.killed : |
|
1507
d7f474d10210
fix issue with sometimes wrong return code of ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1506
diff
changeset
|
52 |
if self.endcallback: |
d7f474d10210
fix issue with sometimes wrong return code of ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1506
diff
changeset
|
53 |
self.retval = self.Proc.poll() |
d7f474d10210
fix issue with sometimes wrong return code of ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1506
diff
changeset
|
54 |
else: |
d7f474d10210
fix issue with sometimes wrong return code of ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1506
diff
changeset
|
55 |
self.retval = self.Proc.returncode |
d7f474d10210
fix issue with sometimes wrong return code of ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1506
diff
changeset
|
56 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
57 |
outchunk = self.fd.readline() |
162
bf3eac08a96b
Try to fix strange wxPopen behavior. Feedback appreciated.
etisserant
parents:
154
diff
changeset
|
58 |
if self.callback : self.callback(outchunk) |
bf3eac08a96b
Try to fix strange wxPopen behavior. Feedback appreciated.
etisserant
parents:
154
diff
changeset
|
59 |
while outchunk != '' and not self.killed : |
bf3eac08a96b
Try to fix strange wxPopen behavior. Feedback appreciated.
etisserant
parents:
154
diff
changeset
|
60 |
outchunk = self.fd.readline() |
704 | 61 |
if self.callback : self.callback(outchunk) |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
62 |
if self.endcallback: |
130
9af34a1d33b7
fixed short process wainting bug. Seems wait() fail when process already finisshed... TO BE CONFIRMED.
greg
parents:
128
diff
changeset
|
63 |
try: |
232 | 64 |
err = self.Proc.wait() |
130
9af34a1d33b7
fixed short process wainting bug. Seems wait() fail when process already finisshed... TO BE CONFIRMED.
greg
parents:
128
diff
changeset
|
65 |
except: |
149 | 66 |
err = self.retval |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
67 |
self.finished = True |
421 | 68 |
self.endcallback(self.Proc.pid, err) |
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
69 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
70 |
class ProcessLogger: |
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
71 |
def __init__(self, logger, Command, finish_callback = None, |
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
72 |
no_stdout = False, no_stderr = False, no_gui = True, |
704 | 73 |
timeout = None, outlimit = None, errlimit = None, |
1415
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
74 |
endlog = None, keyword = None, kill_it = False, cwd = None, |
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
75 |
encoding = None): |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
76 |
self.logger = logger |
424 | 77 |
if not isinstance(Command, list): |
78 |
self.Command_str = Command |
|
79 |
self.Command = [] |
|
80 |
for i,word in enumerate(Command.replace("'",'"').split('"')): |
|
81 |
if i % 2 == 0: |
|
82 |
word = word.strip() |
|
83 |
if len(word) > 0: |
|
84 |
self.Command.extend(word.split()) |
|
85 |
else: |
|
86 |
self.Command.append(word) |
|
87 |
else: |
|
88 |
self.Command = Command |
|
89 |
self.Command_str = subprocess.list2cmdline(self.Command) |
|
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
90 |
|
1415
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
91 |
fsencoding = sys.getfilesystemencoding() |
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
92 |
|
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
93 |
if encoding is None: |
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
94 |
encoding = fsencoding |
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
95 |
self.Command = [self.Command[0].encode(fsencoding)]+map( |
c411fc7246eb
Allow specification of command line arguments encoding in ProcessLogger
Edouard Tisserant
parents:
1407
diff
changeset
|
96 |
lambda x: x.encode(encoding), self.Command[1:]) |
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
97 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
98 |
self.finish_callback = finish_callback |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
99 |
self.no_stdout = no_stdout |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
100 |
self.no_stderr = no_stderr |
111
e2e498333fbc
fixed display/hide console when launch external programs
greg
parents:
110
diff
changeset
|
101 |
self.startupinfo = None |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
102 |
self.errlen = 0 |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
103 |
self.outlen = 0 |
704 | 104 |
self.errlimit = errlimit |
105 |
self.outlimit = outlimit |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
106 |
self.exitcode = None |
704 | 107 |
self.outdata = [] |
108 |
self.errdata = [] |
|
109 |
self.keyword = keyword |
|
110 |
self.kill_it = kill_it |
|
1519
f7ac0d11118e
fix race condition in ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1516
diff
changeset
|
111 |
self.startsem = Semaphore(0) |
704 | 112 |
self.finishsem = Semaphore(0) |
113 |
self.endlock = Lock() |
|
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
114 |
|
128
3db703a78e9c
fixed subprocess launching on linux (avoid use of undefied self.startupinfo and use use Shell=True (bash will split arguments))
greg
parents:
112
diff
changeset
|
115 |
popenargs= { |
958
511bf048b8b7
Added CWD to ProcessLogger, and make sure local runtime have CWD setup correctly
Edouard Tisserant
parents:
788
diff
changeset
|
116 |
"cwd":os.getcwd() if cwd is None else cwd, |
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
117 |
"stdin":subprocess.PIPE, |
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
118 |
"stdout":subprocess.PIPE, |
128
3db703a78e9c
fixed subprocess launching on linux (avoid use of undefied self.startupinfo and use use Shell=True (bash will split arguments))
greg
parents:
112
diff
changeset
|
119 |
"stderr":subprocess.PIPE} |
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
120 |
|
111
e2e498333fbc
fixed display/hide console when launch external programs
greg
parents:
110
diff
changeset
|
121 |
if no_gui == True and wx.Platform == '__WXMSW__': |
e2e498333fbc
fixed display/hide console when launch external programs
greg
parents:
110
diff
changeset
|
122 |
self.startupinfo = subprocess.STARTUPINFO() |
e2e498333fbc
fixed display/hide console when launch external programs
greg
parents:
110
diff
changeset
|
123 |
self.startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW |
128
3db703a78e9c
fixed subprocess launching on linux (avoid use of undefied self.startupinfo and use use Shell=True (bash will split arguments))
greg
parents:
112
diff
changeset
|
124 |
popenargs["startupinfo"] = self.startupinfo |
3db703a78e9c
fixed subprocess launching on linux (avoid use of undefied self.startupinfo and use use Shell=True (bash will split arguments))
greg
parents:
112
diff
changeset
|
125 |
elif wx.Platform == '__WXGTK__': |
704 | 126 |
popenargs["shell"] = False |
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
127 |
|
1506
b9b8978dbc9d
Fix error about missing attribute 'timeout' that happens sometimes during compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1476
diff
changeset
|
128 |
if timeout: |
b9b8978dbc9d
Fix error about missing attribute 'timeout' that happens sometimes during compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1476
diff
changeset
|
129 |
self.timeout = Timer(timeout,self.endlog) |
b9b8978dbc9d
Fix error about missing attribute 'timeout' that happens sometimes during compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1476
diff
changeset
|
130 |
self.timeout.start() |
b9b8978dbc9d
Fix error about missing attribute 'timeout' that happens sometimes during compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1476
diff
changeset
|
131 |
else: |
b9b8978dbc9d
Fix error about missing attribute 'timeout' that happens sometimes during compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1476
diff
changeset
|
132 |
self.timeout = None |
b9b8978dbc9d
Fix error about missing attribute 'timeout' that happens sometimes during compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1476
diff
changeset
|
133 |
|
128
3db703a78e9c
fixed subprocess launching on linux (avoid use of undefied self.startupinfo and use use Shell=True (bash will split arguments))
greg
parents:
112
diff
changeset
|
134 |
self.Proc = subprocess.Popen( self.Command, **popenargs ) |
112 | 135 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
136 |
self.outt = outputThread( |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
137 |
self.Proc, |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
138 |
self.Proc.stdout, |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
139 |
self.output, |
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
140 |
self.finish) |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
141 |
self.outt.start() |
79 | 142 |
|
112 | 143 |
self.errt = outputThread( |
144 |
self.Proc, |
|
145 |
self.Proc.stderr, |
|
146 |
self.errors) |
|
232 | 147 |
self.errt.start() |
1519
f7ac0d11118e
fix race condition in ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1516
diff
changeset
|
148 |
self.startsem.release() |
79 | 149 |
|
704 | 150 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
151 |
def output(self,v): |
704 | 152 |
self.outdata.append(v) |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
153 |
self.outlen += 1 |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
154 |
if not self.no_stdout: |
686
e4e1da75d411
More robust Logger, now resist to flooding.
Edouard Tisserant
parents:
424
diff
changeset
|
155 |
self.logger.write(v) |
704 | 156 |
if (self.keyword and v.find(self.keyword)!=-1) or (self.outlimit and self.outlen > self.outlimit): |
157 |
self.endlog() |
|
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
158 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
159 |
def errors(self,v): |
704 | 160 |
self.errdata.append(v) |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
161 |
self.errlen += 1 |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
162 |
if not self.no_stderr: |
686
e4e1da75d411
More robust Logger, now resist to flooding.
Edouard Tisserant
parents:
424
diff
changeset
|
163 |
self.logger.write_warning(v) |
704 | 164 |
if self.errlimit and self.errlen > self.errlimit: |
165 |
self.endlog() |
|
79 | 166 |
|
232 | 167 |
def log_the_end(self,ecode,pid): |
168 |
self.logger.write(self.Command_str + "\n") |
|
1581
2295fdc5c271
fix translation strings with multiple parameters
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
169 |
self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1 = str(ecode), a2 = str(pid))) |
232 | 170 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
171 |
def finish(self, pid,ecode): |
1539
8e5c03798abc
fix syncronization issue during killing ProcessLoggers on IDE close
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1519
diff
changeset
|
172 |
# avoid running function before start is finished |
1519
f7ac0d11118e
fix race condition in ProcessLogger
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1516
diff
changeset
|
173 |
self.startsem.acquire() |
1476
49f1763a5613
fixes sometimes happened error during project compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com
parents:
1415
diff
changeset
|
174 |
if self.timeout: |
49f1763a5613
fixes sometimes happened error during project compilation
Andrey Skvortsov <andrej.skvortzov@gmail.com
parents:
1415
diff
changeset
|
175 |
self.timeout.cancel() |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
176 |
self.exitcode = ecode |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
177 |
if self.exitcode != 0: |
686
e4e1da75d411
More robust Logger, now resist to flooding.
Edouard Tisserant
parents:
424
diff
changeset
|
178 |
self.log_the_end(ecode,pid) |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
179 |
if self.finish_callback is not None: |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
180 |
self.finish_callback(self,ecode,pid) |
1516
9db0b436fbb3
fix bug: Beremiz IDE hangs during launching Beremiz_service
andrey@new-nest
parents:
1507
diff
changeset
|
181 |
self.errt.join() |
704 | 182 |
self.finishsem.release() |
79 | 183 |
|
235 | 184 |
def kill(self,gently=True): |
1539
8e5c03798abc
fix syncronization issue during killing ProcessLoggers on IDE close
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1519
diff
changeset
|
185 |
# avoid running kill before start is finished |
8e5c03798abc
fix syncronization issue during killing ProcessLoggers on IDE close
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1519
diff
changeset
|
186 |
self.startsem.acquire() |
8e5c03798abc
fix syncronization issue during killing ProcessLoggers on IDE close
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1519
diff
changeset
|
187 |
self.startsem.release() |
8e5c03798abc
fix syncronization issue during killing ProcessLoggers on IDE close
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1519
diff
changeset
|
188 |
|
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
189 |
self.outt.killed = True |
112 | 190 |
self.errt.killed = True |
110
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
191 |
if wx.Platform == '__WXMSW__': |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
192 |
PROCESS_TERMINATE = 1 |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
193 |
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, self.Proc.pid) |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
194 |
ctypes.windll.kernel32.TerminateProcess(handle, -1) |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
195 |
ctypes.windll.kernel32.CloseHandle(handle) |
a05e8b30c024
Fixed way apps are launched in parralel with single log window... Tested in win32 only.
etisserant
parents:
89
diff
changeset
|
196 |
else: |
235 | 197 |
if gently: |
198 |
sig=SIGTERM |
|
199 |
else: |
|
200 |
sig=SIGKILL |
|
154
f3134b2c6d92
Fixed killing app on Linux in wxPopen. Do not use shell anymore. Command line is splitted into args, taking care of double and simple cotes. To be tested on win32.
etisserant
parents:
151
diff
changeset
|
201 |
try: |
235 | 202 |
os.kill(self.Proc.pid, sig) |
154
f3134b2c6d92
Fixed killing app on Linux in wxPopen. Do not use shell anymore. Command line is splitted into args, taking care of double and simple cotes. To be tested on win32.
etisserant
parents:
151
diff
changeset
|
203 |
except: |
f3134b2c6d92
Fixed killing app on Linux in wxPopen. Do not use shell anymore. Command line is splitted into args, taking care of double and simple cotes. To be tested on win32.
etisserant
parents:
151
diff
changeset
|
204 |
pass |
232 | 205 |
self.outt.join() |
206 |
self.errt.join() |
|
79 | 207 |
|
704 | 208 |
def endlog(self): |
209 |
if self.endlock.acquire(False): |
|
210 |
if not self.outt.finished and self.kill_it: |
|
211 |
self.kill() |
|
1516
9db0b436fbb3
fix bug: Beremiz IDE hangs during launching Beremiz_service
andrey@new-nest
parents:
1507
diff
changeset
|
212 |
self.finishsem.release() |
89 | 213 |
|
1407
cf3d2b53dd68
Organized controller's _Build sub-methods layout. Many (unwanted) white space changes.
Edouard Tisserant
parents:
958
diff
changeset
|
214 |
|
704 | 215 |
def spin(self): |
216 |
self.finishsem.acquire() |
|
217 |
return [self.exitcode, "".join(self.outdata), "".join(self.errdata)] |
|
89 | 218 |