webmcp
changeset 487:91d0c8304d74
Do not execute abortable command if termination has already been requested
author | jbe |
---|---|
date | Mon Jun 12 03:18:54 2017 +0200 (2017-06-12) |
parents | 7d53e12f0804 |
children | 5b1c4f76e44f |
files | framework/env/execute/command.lua |
line diff
1.1 --- a/framework/env/execute/command.lua Sun Jun 11 23:27:17 2017 +0200 1.2 +++ b/framework/env/execute/command.lua Mon Jun 12 03:18:54 2017 +0200 1.3 @@ -23,16 +23,7 @@ 1.4 local moonbridge_io = require("moonbridge_io") 1.5 local poll = args.poll or moonbridge_io.poll 1.6 1.7 - local start = moonbridge_io.timeref() 1.8 - local process, errmsg = moonbridge_io.exec(table.unpack(args.command)) 1.9 - if not process then return nil, errmsg end 1.10 - 1.11 local stdout_chunks, stderr_chunks = {}, {} 1.12 - local read_fds = {[process.stdout] = true, [process.stderr] = true} 1.13 - local write_fds = {[process.stdin] = true} 1.14 - if args.db then 1.15 - read_fds[args.db.fd] = true 1.16 - end 1.17 1.18 local function return_error(errmsg) 1.19 if args.stdout_result_handler then 1.20 @@ -41,6 +32,24 @@ 1.21 return nil, errmsg 1.22 end 1.23 1.24 + if args.abortable then 1.25 + local pollready, pollmsg, pollterm = poll(nil, nil, 0, true) 1.26 + if pollterm then 1.27 + if args.abort_handler then args.abort_handler() end 1.28 + return_error(pollmsg) 1.29 + end 1.30 + end 1.31 + 1.32 + local start = moonbridge_io.timeref() 1.33 + local process, errmsg = moonbridge_io.exec(table.unpack(args.command)) 1.34 + if not process then return nil, errmsg end 1.35 + 1.36 + local read_fds = {[process.stdout] = true, [process.stderr] = true} 1.37 + local write_fds = {[process.stdin] = true} 1.38 + if args.db then 1.39 + read_fds[args.db.fd] = true 1.40 + end 1.41 + 1.42 local function write(...) 1.43 if write_fds[process.stdin] then 1.44 local buffered = process.stdin:flush_nb(...) 1.45 @@ -57,9 +66,9 @@ 1.46 write_fds[process.stdin] 1.47 do 1.48 local timeout = args.timeout and args.timeout-moonbridge_io.timeref(start) 1.49 - local pollstatus, pollmsg, pollterm = 1.50 + local pollready, pollmsg, pollterm = 1.51 poll(read_fds, write_fds, timeout, args.abortable) 1.52 - if not pollstatus then 1.53 + if not pollready then 1.54 process:kill():wait() 1.55 if pollterm then 1.56 if args.abort_handler then args.abort_handler() end