[gnome-chess] Disconnect engine_stopped_cb when stopping the engine
- From: Sahil Sareen <ssareen src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-chess] Disconnect engine_stopped_cb when stopping the engine
- Date: Thu, 23 Jul 2015 17:49:04 +0000 (UTC)
commit 8ba6bcb9929d33f273270ea0c90a97ff920aed5b
Author: Michael Catanzaro <mcatanzaro gnome org>
Date: Mon Jul 20 13:38:46 2015 -0500
Disconnect engine_stopped_cb when stopping the engine
What if, somehow, the cb gets called *after* ChessEngine.start()? Then
everything would break. Make sure that can't happen.
https://bugzilla.gnome.org/show_bug.cgi?id=724504
src/chess-engine.vala | 21 ++++++++++++---------
1 files changed, 12 insertions(+), 9 deletions(-)
---
diff --git a/src/chess-engine.vala b/src/chess-engine.vala
index c48210d..74ce38c 100644
--- a/src/chess-engine.vala
+++ b/src/chess-engine.vala
@@ -22,6 +22,7 @@ public abstract class ChessEngine : Object
private int stdin_fd = -1;
private int stderr_fd = -1;
private IOChannel? stdout_channel;
+ private uint child_watch_id = 0;
private uint stdout_watch_id = 0;
private bool started = false;
@@ -59,6 +60,7 @@ public abstract class ChessEngine : Object
public bool start ()
requires (pid == 0)
+ requires (child_watch_id == 0)
requires (stdout_watch_id == 0)
requires (stdin_fd == -1)
requires (stderr_fd == -1)
@@ -83,7 +85,7 @@ public abstract class ChessEngine : Object
return false;
}
- ChildWatch.add (pid, engine_stopped_cb);
+ child_watch_id = ChildWatch.add (pid, engine_stopped_cb);
stdout_channel = new IOChannel.unix_new (stdout_fd);
try
@@ -103,15 +105,12 @@ public abstract class ChessEngine : Object
return true;
}
- private void engine_stopped_cb (Pid pid, int status)
+ private void engine_stopped_cb (Pid pid)
+ requires (pid == this.pid)
+ requires (started)
{
- // This function could be called because the engine quit on its own, or
- // it could be called because we killed the engine ourselves in
- // ChessEngine.stop(). If it quit on its own, we need to clean up here.
- if (started) {
- stop (false);
- stopped_unexpectedly ();
- }
+ stop (false);
+ stopped_unexpectedly ();
}
public abstract void start_game ();
@@ -147,6 +146,7 @@ public abstract class ChessEngine : Object
requires (!started || stdin_fd != -1)
requires (!started || stderr_fd != -1)
requires (!started || pid != 0)
+ requires (!started || child_watch_id != 0)
{
if (!started)
return;
@@ -174,6 +174,9 @@ public abstract class ChessEngine : Object
warning ("Failed to close pipe to engine's stderr: %s", strerror (errno));
stderr_fd = -1;
+ Source.remove (child_watch_id);
+ child_watch_id = 0;
+
if (kill_engine && Posix.kill (pid, Posix.SIGTERM) == -1)
warning ("Failed to kill engine: %s", strerror (errno));
Process.close_pid (pid);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]