1. 29 May, 2017 1 commit
  2. 31 Jan, 2014 1 commit
  3. 17 Oct, 2013 4 commits
    • Allison Karlitskaya's avatar
      Fixup GSubprocess documentation bits · 542ad4db
      Allison Karlitskaya authored
    • Colin Walters's avatar
      gsubprocess: Add UTF-8 variants of communicate() · 9318d5a4
      Colin Walters authored
      Over many years of writing code interacting with subprocesses, a pattern
      that comes up a lot is to run a child and get its output as UTF-8, to
      put inside a JSON document or render in a GtkTextBuffer, etc.
      It's very important to validate at the boundaries, and not say deep
      inside Pango.
      We could do this a bit more efficiently if done in a streaming fashion,
      but realistically this should be OK for now.
    • Colin Walters's avatar
      gsubprocess: Fix up communicate · 0e1a3ee3
      Colin Walters authored
      We weren't closing the streams after we were done reading or writing,
      which is kind of essential.  The easy way to fix this is to just use
      g_output_stream_splice() to a GMemoryOutputStream rather than
      hand-rolling it.  This results in a substantial reduction of code
      A second serious issue is that we were marking the task as complete when
      the process exits, but that's racy - there could still be data to read
      from stdout.  Fix this by just refcounting outstanding operations.
      This code, not surprisingly, looks a lot like the "multi" test.
      Next, because processes output binary data, I'd be forced to annotate
      the char*/length pairs as (array) (element-type uint8).  But rather than
      doing that, it's *far* simpler to just use GBytes.
      We need a version of this that actually validates as UTF-8, that will be
      in the next patch.
    • Colin Walters's avatar
      GSubprocess: New class for spawning child processes · 5b48dc40
      Colin Walters authored
      There are a number of nice things this class brings:
      0) Has a race-free termination API on all platforms (on UNIX, calls to
         kill() and waitpid() are coordinated as not to cause problems).
      1) Operates in terms of G{Input,Output}Stream, not file descriptors
      2) Standard GIO-style async API for wait() with cancellation
      3) Makes some simple cases easy, like synchronously spawning a
         process with an argument list
      4) Makes hard cases possible, like asynchronously running a process
         with stdout/stderr merged, output directly to a file path
      Much rewriting and code review from Ryan Lortie <desrt@desrt.ca>