targets/Linux/plc_Linux_main.c
changeset 235 a66e150f2888
parent 227 48c13b84505c
child 236 a32817e81f5e
--- a/targets/Linux/plc_Linux_main.c	Tue Sep 02 12:24:25 2008 +0200
+++ b/targets/Linux/plc_Linux_main.c	Wed Sep 03 17:28:17 2008 +0200
@@ -86,23 +86,37 @@
     return 0;
 }
 
+static int __debug_tick;
+
+static pthread_mutex_t wait_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t wait_cond = PTHREAD_COND_INITIALIZER;
+
+void AbortDebug()
+{
+    /* Eventually unlock debugger thread*/
+    __debug_tick = -1;
+    pthread_mutex_lock(&wait_mutex);
+    pthread_cond_broadcast(&wait_cond);
+    pthread_mutex_unlock(&wait_mutex);
+}
+
 int stopPLC()
 {
     /* Stop the PLC */
     PLC_SetTimer(0,0);
     timer_delete (PLC_timer);
     __cleanup();
+    AbortDebug();
 }
 
-pthread_mutex_t DebugLock = PTHREAD_MUTEX_INITIALIZER;
-
-static int __debug_tick;
 extern int __tick;
 /* from plc_debugger.c */
 int WaitDebugData()
 {
     /* Wait signal from PLC thread */
-    pthread_mutex_lock(&DebugLock);
+    pthread_mutex_lock(&wait_mutex);
+    pthread_cond_wait(&wait_cond, &wait_mutex);
+    pthread_mutex_unlock(&wait_mutex);
     return __debug_tick;
 }
  
@@ -112,5 +126,7 @@
 {
     /* signal debugger thread to continue*/
     __debug_tick = __tick;
-    pthread_mutex_unlock(&DebugLock);
+    pthread_mutex_lock(&wait_mutex);
+    pthread_cond_broadcast(&wait_cond);
+    pthread_mutex_unlock(&wait_mutex);
 }