summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorРуслан Ижбулатов <lrn1986@gmail.com>2014-07-27 03:06:16 +0000
committerSebastian Dröge <sebastian@centricular.com>2014-07-28 09:13:44 +0200
commitb87c55f6ed83e11a483f43d6bc29a9d4a79c786f (patch)
tree7f00eaee450f5d5b6aa0f617f85ee8db1a26a315
parent24080568a13bd5287730450d5223a79b9116425f (diff)
poll: Prevent false-negative from WAKE_EVENT() on W32
SetEvent() seems to not call SetLastError(0) internally, so checking last error after calling SetEvent() may return the error from an earlier W32 API call. Fix this by calling SetlastError(0) explicitly. Currently WAKE_EVENT() code is cramped into a macro and doesn't look to be entirely correct. Particularly, it does not check the return value of SetEvent(), only the thread-local W32 error value. It is likely that SetEvent() actually just returns non-zero value, but the code mistakenly thinks that the call has failed, because GetLastError() seems to indicate so. https://bugzilla.gnome.org/show_bug.cgi?id=733805
-rw-r--r--gst/gstpoll.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gst/gstpoll.c b/gst/gstpoll.c
index 34f93f4ffa..04165a5ffa 100644
--- a/gst/gstpoll.c
+++ b/gst/gstpoll.c
@@ -170,7 +170,7 @@ static gboolean gst_poll_add_fd_unlocked (GstPoll * set, GstPollFD * fd);
#define WAKE_EVENT(s) (write ((s)->control_write_fd.fd, "W", 1) == 1)
#define RELEASE_EVENT(s) (read ((s)->control_read_fd.fd, (s)->buf, 1) == 1)
#else
-#define WAKE_EVENT(s) (SetEvent ((s)->wakeup_event), errno = GetLastError () == NO_ERROR ? 0 : EACCES, errno == 0 ? 1 : 0)
+#define WAKE_EVENT(s) (SetLastError (0), SetEvent ((s)->wakeup_event), errno = GetLastError () == NO_ERROR ? 0 : EACCES, errno == 0 ? 1 : 0)
#define RELEASE_EVENT(s) (ResetEvent ((s)->wakeup_event))
#endif