# HG changeset patch # User jbe # Date 1497230334 -7200 # Node ID 91d0c8304d74c61721d83f214ab0845d493c732a # Parent 7d53e12f0804bb8d5675cc41bde427e10256524c Do not execute abortable command if termination has already been requested diff -r 7d53e12f0804 -r 91d0c8304d74 framework/env/execute/command.lua --- a/framework/env/execute/command.lua Sun Jun 11 23:27:17 2017 +0200 +++ b/framework/env/execute/command.lua Mon Jun 12 03:18:54 2017 +0200 @@ -23,16 +23,7 @@ local moonbridge_io = require("moonbridge_io") local poll = args.poll or moonbridge_io.poll - local start = moonbridge_io.timeref() - local process, errmsg = moonbridge_io.exec(table.unpack(args.command)) - if not process then return nil, errmsg end - local stdout_chunks, stderr_chunks = {}, {} - local read_fds = {[process.stdout] = true, [process.stderr] = true} - local write_fds = {[process.stdin] = true} - if args.db then - read_fds[args.db.fd] = true - end local function return_error(errmsg) if args.stdout_result_handler then @@ -41,6 +32,24 @@ return nil, errmsg end + if args.abortable then + local pollready, pollmsg, pollterm = poll(nil, nil, 0, true) + if pollterm then + if args.abort_handler then args.abort_handler() end + return_error(pollmsg) + end + end + + local start = moonbridge_io.timeref() + local process, errmsg = moonbridge_io.exec(table.unpack(args.command)) + if not process then return nil, errmsg end + + local read_fds = {[process.stdout] = true, [process.stderr] = true} + local write_fds = {[process.stdin] = true} + if args.db then + read_fds[args.db.fd] = true + end + local function write(...) if write_fds[process.stdin] then local buffered = process.stdin:flush_nb(...) @@ -57,9 +66,9 @@ write_fds[process.stdin] do local timeout = args.timeout and args.timeout-moonbridge_io.timeref(start) - local pollstatus, pollmsg, pollterm = + local pollready, pollmsg, pollterm = poll(read_fds, write_fds, timeout, args.abortable) - if not pollstatus then + if not pollready then process:kill():wait() if pollterm then if args.abort_handler then args.abort_handler() end