On 09.05.2017 13:18, Petri Latvala wrote:

snip 8<   -----
>> +            memset(buf, 0, sizeof(buf));
>> +            while (read(current->read_fd, buf, sizeof(buf)) > 0) {
>> +                    if (current->redirected) {
>> +                            if (!unredirect_output(current))
>> +                                    return -1;
>> +                    }
>> +                    igt_log(IGT_LOG_DOMAIN, current->log_level,
>> +                            "[cmd] %s", buf);
>> +                    memset(buf, 0, sizeof(buf));
>> +            }
>> +            close(current->read_fd);
>> +    }
> 
> 
> Unredirect_output calls for both pipes need to be called on all exit
> paths.
> 
> In redirect_output you set only the read fd of the pipe() pair to
> O_NONBLOCK. That will make the executed command block on its writes
> indefinitely if it prints more than whatsitnow, 64kB?
> the 

In case the stream output is more than the pipe buf, the read loop above
would just unblock the rest of the entries. From pipe(2) page:

 "Data written to the write end of the pipe is buffered
  by the kernel until it is read from the read end of the pipe."

Worked well when I tried it with igt_exec("../tools/intel_reg dump")
which dumps a screenfull of info.



_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to