Revision: 412
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=412&view=rev
Author: mlampard
Date: 2008-01-14 18:00:15 -0800 (Mon, 14 Jan 2008)
Log Message:
-----------
fix potential deadlock in lcd_cycle()
Modified Paths:
--------------
trunk/g15daemon-wip/g15daemon/linked_lists.c
Modified: trunk/g15daemon-wip/g15daemon/linked_lists.c
===================================================================
--- trunk/g15daemon-wip/g15daemon/linked_lists.c 2008-01-13 03:01:07 UTC (rev 411)
+++ trunk/g15daemon-wip/g15daemon/linked_lists.c 2008-01-15 02:00:15 UTC (rev 412)
@@ -117,14 +117,13 @@
void g15daemon_lcdnode_cycle(g15daemon_t *masterlist)
{
lcdnode_t *current_screen = NULL;
+ pthread_mutex_lock(&lcdlist_mutex);
skip:
current_screen = masterlist->current;
g15daemon_send_event(current_screen->lcd, G15_EVENT_VISIBILITY_CHANGED, SCR_HIDDEN);
-
do
{
- pthread_mutex_lock(&lcdlist_mutex);
g15daemon_send_event(current_screen->lcd, G15_EVENT_USER_FOREGROUND, 0);
if(masterlist->tail == masterlist->current){
@@ -132,11 +131,9 @@
}else{
masterlist->current = masterlist->current->prev;
}
- pthread_mutex_unlock(&lcdlist_mutex);
}
while (current_screen != masterlist->current);
- pthread_mutex_lock(&lcdlist_mutex);
if(masterlist->tail == masterlist->current) {
masterlist->current = masterlist->head;
} else {
@@ -144,12 +141,12 @@
}
if(masterlist->current->lcd->never_select==1) {
- pthread_mutex_unlock(&lcdlist_mutex);
goto skip;
}
masterlist->current->last_priority = masterlist->current;
pthread_mutex_unlock(&lcdlist_mutex);
+
g15daemon_send_event(current_screen->lcd, G15_EVENT_USER_FOREGROUND, 1);
g15daemon_send_event(masterlist->current->lcd, G15_EVENT_VISIBILITY_CHANGED, SCR_VISIBLE);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|