[vlc-devel] commit: WinCE: do an ugly thread cancellation without using QueueUserAPC ( Geoffroy Couprie )
git version control
git at videolan.org
Mon Oct 6 11:13:23 CEST 2008
vlc | branch: master | Geoffroy Couprie <geo.couprie at gmail.com> | Mon Oct 6 11:12:59 2008 +0200| [272308b2004fac7f4474a80764c20fd5ba5f13c7] | committer: Geoffroy Couprie
WinCE: do an ugly thread cancellation without using QueueUserAPC
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=272308b2004fac7f4474a80764c20fd5ba5f13c7
---
src/misc/mtime.c | 2 +-
src/misc/threads.c | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/src/misc/mtime.c b/src/misc/mtime.c
index c9248ae..c5b1bc2 100644
--- a/src/misc/mtime.c
+++ b/src/misc/mtime.c
@@ -53,7 +53,7 @@
#endif
#if defined( UNDER_CE )
-# include <windows.h>
+# define SleepEx(a,b) Sleep(a)
#endif
#if defined(HAVE_SYS_TIME_H)
diff --git a/src/misc/threads.c b/src/misc/threads.c
index 19f4ded..e1d6255 100644
--- a/src/misc/threads.c
+++ b/src/misc/threads.c
@@ -49,6 +49,10 @@ static vlc_threadvar_t cancel_key;
# include <execinfo.h>
#endif
+#ifdef UNDER_CE
+# define WaitForSingleObjectEx(a,b,c) WaitForSingleObject(a,b)
+#endif
+
/**
* Print a backtrace to the standard error for debugging purpose.
*/
@@ -689,6 +693,19 @@ void vlc_cancel (vlc_thread_t thread_id)
{
#if defined (LIBVLC_USE_PTHREAD_CANCEL)
pthread_cancel (thread_id);
+#elif defined (UNDER_CE)
+ /* HACK:There is no way to use something
+ * like QueueUserAPC on Windows CE, so I rely
+ * on some crappy arch specific code */
+ CONTEXT context;
+ context.ContextFlags = CONTEXT_CONTROL;
+ GetThreadContext (thread_id->handle, &context);
+ /* Setting the instruction pointer for the canceled thread */
+#if defined(_ARM_) || defined(ARM)
+ context.Pc = (DWORD_PTR) vlc_cancel_self;
+#endif
+ SetThreadContext (thread_id->handle, &context);
+
#elif defined (WIN32)
QueueUserAPC (vlc_cancel_self, thread_id->handle, 0);
#else
More information about the vlc-devel
mailing list