From: Alfons Hoogervorst Date: Sat, 13 Oct 2001 18:01:56 +0000 (+0000) Subject: my stab at fixing the non MT safety code in the LDAP lookup X-Git-Tag: Release_0_6_4claws12~48 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=d2b481a39590dd6417b32cb13469a05a1cf1b8f2;hp=f23e648a94d35fedb496cf71cfa21eb4a29ed3d8 my stab at fixing the non MT safety code in the LDAP lookup --- diff --git a/ChangeLog.claws b/ChangeLog.claws index 83da651f5..eed55006d 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -1,3 +1,15 @@ +2001-10-13 [alfons, christoph, melvin] + 0.6.3claws15 + + solution #2 to solve MT-safety problems defers all GUI related calls + to the main thread using a gtk_idle_add() callback. discussed on + ircnet #sylpheed, with christoph spotting some issues with the + original code, and melvin allowing us to lobotomize his sylpheed. + + * src/syldap.[ch], src/main.c + fix race problem in ldap search thread by deferring GUI + stuff to main thread using gtk_idle_add() + 2001-10-13 [paul] 0.6.3claws14 * src/prefs_account.[ch], src/send.c, src/smtp.[ch] diff --git a/configure.in b/configure.in index 986378651..13d442afe 100644 --- a/configure.in +++ b/configure.in @@ -8,7 +8,7 @@ MINOR_VERSION=6 MICRO_VERSION=3 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=claws14 +EXTRA_VERSION=claws15 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION dnl diff --git a/src/main.c b/src/main.c index e4f384548..6b51ea343 100644 --- a/src/main.c +++ b/src/main.c @@ -296,9 +296,7 @@ int main(int argc, char *argv[]) /* ignore SIGPIPE signal for preventing sudden death of program */ signal(SIGPIPE, SIG_IGN); - gdk_threads_enter(); gtk_main(); - gdk_threads_leave(); #if USE_PSPELL gtkpspell_finished(gtkpspellconfig); diff --git a/src/syldap.c b/src/syldap.c index d0d1cf710..0080549b8 100644 --- a/src/syldap.c +++ b/src/syldap.c @@ -68,6 +68,7 @@ SyldapServer *syldap_create() { ldapServer->retVal = MGU_SUCCESS; ldapServer->callBack = NULL; ldapServer->accessFlag = FALSE; + ldapServer->idleId = 0; return ldapServer; } @@ -630,6 +631,19 @@ gint syldap_search( SyldapServer *ldapServer ) { return ldapServer->retVal; } +/* syldap_display_search_results() - updates the ui. this function is called from the + * main thread (the thread running the GTK event loop). */ +static gint syldap_display_search_results(SyldapServer *ldapServer) +{ + /* NOTE: when this function is called the accompanying thread should + * already be terminated. */ + gtk_idle_remove(ldapServer->idleId); + ldapServer->callBack(ldapServer); + /* FIXME: match should know whether to free this SyldapServer stuff. */ + g_free(ldapServer->thread); + return TRUE; +} + /* ============================================================================================ */ /* * Read data into list. Main entry point @@ -654,13 +668,15 @@ gint syldap_read_data( SyldapServer *ldapServer ) { /* Callback */ ldapServer->busyFlag = FALSE; if( ldapServer->callBack ) { - ( ldapServer->callBack )( ldapServer ); + /* make the ui thread update the search results */ + /* TODO: really necessary to call gdk_threads_XXX()??? gtk_idle_add() + * should do this - could someone check the GTK sources please? */ + gdk_threads_enter(); + ldapServer->idleId = gtk_idle_add(syldap_display_search_results, ldapServer); + gdk_threads_leave(); + } - /* The thread struct should not be freed inside the thread - g_free(ldapServer->thread); - ldapServer->thread = NULL; - pthread_exit( NULL ); - */ + return ldapServer->retVal; } @@ -672,16 +688,13 @@ gint syldap_read_data( SyldapServer *ldapServer ) { void syldap_cancel_read( SyldapServer *ldapServer ) { g_return_if_fail( ldapServer != NULL ); + /* DELETEME: this is called from inside UI thread so it's OK, Christoph! */ if( ldapServer->thread ) { /* printf( "thread cancelled\n" ); */ - /* The thread is cancleing itself, ok? pthread_cancel( *ldapServer->thread ); - */ } - /* The thread struct should not be freed inside the thread g_free(ldapServer->thread); ldapServer->thread = NULL; - */ ldapServer->busyFlag = FALSE; } @@ -702,7 +715,7 @@ gint syldap_read_data_th( SyldapServer *ldapServer ) { ldapServer->busyFlag = TRUE; ldapServer->thread = g_new0(pthread_t, 1); - pthread_create( ldapServer->thread, NULL, (void *) &syldap_read_data, (void *) ldapServer ); + pthread_create( ldapServer->thread, NULL, (void *) syldap_read_data, (void *) ldapServer ); } return ldapServer->retVal; } diff --git a/src/syldap.h b/src/syldap.h index 9c2449d99..c6e9d49a7 100644 --- a/src/syldap.h +++ b/src/syldap.h @@ -65,6 +65,7 @@ struct _SyldapServer { pthread_t *thread; gboolean busyFlag; void (*callBack)( void * ); + guint idleId; }; /* Function prototypes */