ldapServer->retVal = MGU_SUCCESS;
ldapServer->callBack = NULL;
ldapServer->accessFlag = FALSE;
+ ldapServer->idleId = 0;
return 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);
+ ldapServer->thread = NULL;
+ return TRUE;
+}
+
/* ============================================================================================ */
/*
* Read data into list. Main entry point
/* 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;
}
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;
}
ldapServer->busyFlag = FALSE;
syldap_check_search( ldapServer );
if( ldapServer->retVal == MGU_SUCCESS ) {
- debug_print("Staring LDAP read thread\n");
+// debug_print("Staring LDAP read thread\n");
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;
}