X-Git-Url: http://git.roojs.org/?p=gitlive;a=blobdiff_plain;f=Spawn.vala;h=738ea44d6721d406cb253e35dc852d1d74a3d3ac;hp=c9e67f5db1791825df61fa5ed32626f10241f845;hb=0b86050bdbbbd2985f7078ca9036be0196455398;hpb=9a960396915b829af188f5dd9969f3d862b81ab6 diff --git a/Spawn.vala b/Spawn.vala index c9e67f5d..738ea44d 100644 --- a/Spawn.vala +++ b/Spawn.vala @@ -94,10 +94,7 @@ public class SpawnConfig { } - public void onFinish( SpawnFinish? finish ) { - this.finish = finish; - } - + public void setHandlers( SpawnOutput? output, @@ -156,7 +153,9 @@ public class Spawn : Object if (this.cfg.args.length < 0) { throw new SpawnError.NO_ARGS("No arguments"); } - this.run((res, output) => { }); + if (!this.cfg.async) { + this.run((res, output) => { }); + } } @@ -201,6 +200,9 @@ public class Spawn : Object */ int out_src = -1; + + unowned SpawnFinish on_finished; + /** * * @method run @@ -208,10 +210,10 @@ public class Spawn : Object * result is applied to object properties (eg. '?' or 'stderr') * @returns {Object} self. */ - public void run(unowned SpawnFinish? finished_cb) throws SpawnError, GLib.SpawnError, GLib.IOChannelError + public void run( SpawnFinish finished_cb) throws SpawnError, GLib.SpawnError, GLib.IOChannelError { - + this.on_finished = finished_cb; err_src = -1; out_src = -1; int standard_input; @@ -264,29 +266,7 @@ public class Spawn : Object - ChildWatch.add (this.pid, (w_pid, result) => { - - this.result = result; - if (this.cfg.debug) { - stdout.printf("child_watch_add : result:%d\n", result); - } - - this.read(this.out_ch); - this.read(this.err_ch); - - - Process.close_pid(this.pid); - this.pid = -1; - if (this.ctx != null) { - this.ctx.quit(); - this.ctx = null; - } - this.tidyup(); - //print("DONE TIDYUP"); - if (this.cfg.finish != null) { - this.cfg.finish(this.result); - } - }); + ChildWatch.add (this.pid, this.on_child_watch); @@ -322,7 +302,7 @@ public class Spawn : Object //but... let's close input now.. this.in_ch.shutdown(true); this.in_ch = null; - + } catch (Error e) { this.tidyup(); @@ -336,6 +316,7 @@ public class Spawn : Object } // async - if running - return.. if (this.cfg.async && this.pid > -1) { + //this.ref(); return; } @@ -346,7 +327,7 @@ public class Spawn : Object //if (this.cfg.debug) { // // } - this.ctx = new MainLoop (); + this.ctx = new MainLoop (); this.ctx.run(); // wait fore exit? //print("main_loop done!"); @@ -361,7 +342,7 @@ public class Spawn : Object errstr += this.output.length > 0 ? "\n" : ""; errstr += this.stderr; //print("Throwing execute error:%s\n", errstr); - throw new SpawnError.EXECUTE_ERROR(errstr); + throw new SpawnError.EXECUTE_ERROR(errstr); //this.toString = function() { return this.stderr; }; ///throw new Exception this; // we throw self... } @@ -369,6 +350,36 @@ public class Spawn : Object return; } + + void on_child_watch(GLib.Pid w_pid, int result) { + + this.result = result; + if (this.cfg.debug) { + stdout.printf("child_watch_add : result:%d\n", result); + } + + this.read(this.out_ch); + this.read(this.err_ch); + + + Process.close_pid(this.pid); + this.pid = -1; + if (this.ctx != null) { + this.ctx.quit(); + this.ctx = null; + + } + //print("child process done - running callback, then tidyup"); + this.on_finished(this.result, this.output + (this.output.length > 0 ? "\n" : "") + this.stderr); + // this.unref(); + this.tidyup(); + + //print("DONE TIDYUP"); + + + } + + private void tidyup() { @@ -393,7 +404,7 @@ public class Spawn : Object //if (this.out_src > -1 ) GLib.source_remove(this.out_src); this.err_src = -1; this.out_src = -1; - this.unref(); + //this.unref(); }