Changeset 6fa0965 in rtems-tools


Ignore:
Timestamp:
Nov 23, 2018, 3:59:18 AM (6 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
7e5cdea
Parents:
82254b0
Message:

rtemstoolkit/execute: Use buffered output and improve performance

  • Use buffered output on the stdout and stderr streams from child processors.
  • Simplify the read thread line processing to improve performance.
  • Disable 'close_fds' as it slows down python3's popen call.
  • Update the importing of rtemstoolkit modules.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtemstoolkit/execute.py

    r82254b0 r6fa0965  
    4747import traceback
    4848
    49 #
    50 # Support to handle use in a package and as a unit test.
    51 # If there is a better way to let us know.
    52 #
    53 try:
    54     from . import error
    55     from . import log
    56 except (ValueError, SystemError):
    57     import error
    58     import log
     49from rtemstoolkit import error
     50from rtemstoolkit import log
    5951
    6052# Trace exceptions
     
    197189                    #
    198190                    # The io module file handling return up to the size passed
    199                     # in.
     191                    # in to the read call. The io handle has the default
     192                    # buffering size. On any error assume the handle has gone
     193                    # and the process is shutting down.
    200194                    #
    201                     data = fh.read(4096)
     195                    try:
     196                        data = fh.read(4096)
     197                    except:
     198                        data = ''
    202199                    if len(data) == 0:
     200                        if len(line) > 0:
     201                            _output_line(l + '\n', exe, prefix, out, count)
    203202                        break
    204203                    # str and bytes are the same type in Python2
    205204                    if type(data) is not str and type(data) is bytes:
    206205                        data = data.decode(sys.stdout.encoding)
    207                     for c in data:
    208                         line += c
    209                         if c == '\n':
     206                    last_ch = data[-1]
     207                    sd = (line + data).split('\n')
     208                    if last_ch != '\n':
     209                        line = sd[-1]
     210                    else:
     211                        line = ''
     212                    sd = sd[:-1]
     213                    if len(sd) > 0:
     214                        for l in sd:
     215                            _output_line(l + '\n', exe, prefix, out, count)
    210216                            count += 1
    211                             _output_line(line, exe, prefix, out, count)
    212                             if count > 10:
    213                                 count = 0
    214                             line = ''
     217                        if count > 10:
     218                            count -= 10
    215219            except:
    216220                raise
     
    263267                                                     io.open(proc.stdout.fileno(),
    264268                                                             mode = 'rb',
    265                                                              buffering = 0,
    266269                                                             closefd = False),
    267270                                                     self.output,
     
    275278                                                     io.open(proc.stderr.fileno(),
    276279                                                             mode = 'rb',
    277                                                              buffering = 0,
    278280                                                             closefd = False),
    279281                                                     self.output,
     
    375377                                    cwd = cwd, env = env,
    376378                                    stdin = stdin, stdout = stdout,
    377                                     stderr = stderr)
     379                                    stderr = stderr,
     380                                    close_fds = False)
    378381            if not capture:
    379382                return (0, proc)
Note: See TracChangeset for help on using the changeset viewer.