From: <svn...@op...> - 2009-03-24 12:44:06
|
Author: bellmich Date: Tue Mar 24 13:43:55 2009 New Revision: 1009 URL: http://libsyncml.opensync.org/changeset/1009 Log: libsoup_async respects now that SoupSessionAsync was designed for single-threaded applications. Modified: trunk/tests/check_libsoup.c Modified: trunk/tests/check_libsoup.c ============================================================================== --- trunk/tests/check_libsoup.c Tue Mar 24 13:41:46 2009 (r1008) +++ trunk/tests/check_libsoup.c Tue Mar 24 13:43:55 2009 (r1009) @@ -336,6 +336,36 @@ smlTrace(TRACE_EXIT, "%s", __func__); } +GMainContext *client_ctx; +SoupSession *client_session; + +SmlBool init_soup_session(gpointer data, SmlError **error) +{ + smlTrace(TRACE_ENTRY, "%s", __func__); + sml_fail_unless(data != NULL, NULL); + SoupMessage *msg = data; + client_session = soup_session_async_new_with_options( + SOUP_SESSION_ASYNC_CONTEXT, client_ctx, + SOUP_SESSION_TIMEOUT, 5, + NULL); + sml_fail_unless(client_session != NULL, NULL); + soup_session_queue_message(client_session, msg, client_callback, NULL); + return TRUE; +} + +SmlBool cleanup_soup_session(gpointer data, SmlError **error) +{ + smlTrace(TRACE_ENTRY, "%s", __func__); + + smlTrace(TRACE_INTERNAL, "%s: aborting session", __func__); + soup_session_abort(client_session); + smlTrace(TRACE_INTERNAL, "%s: unref session", __func__); + g_object_unref(client_session); + + smlTrace(TRACE_EXIT, "%s", __func__); + return TRUE; +} + START_TEST (libsoup_async) { smlTrace(TRACE_ENTRY, "%s", __func__); @@ -365,17 +395,13 @@ #else /* create asynchronous client */ - GMainContext *client_ctx = g_main_context_new(); + client_ctx = g_main_context_new(); sml_fail_unless(client_ctx != NULL, NULL); SmlThread *client_thread = smlThreadNew(client_ctx, &error); sml_fail_unless(client_thread != NULL, "%s", smlErrorPrint(&error)); smlThreadStart(client_thread); - SoupSession *session = soup_session_async_new_with_options( - SOUP_SESSION_ASYNC_CONTEXT, client_ctx, - SOUP_SESSION_TIMEOUT, 5, - NULL); - sml_fail_unless(session != NULL, NULL); - soup_session_queue_message(session, msg, client_callback, NULL); + + sml_fail_unless(smlThreadCallFunction(client_thread, init_soup_session, msg, &error), "%s", smlErrorPrint(&error)); #endif /* test and cleanup server */ @@ -392,13 +418,20 @@ sleep_total += sleep_interval; } sml_fail_unless(sleep_total < sleep_max, "client disconnect timed out"); - smlTrace(TRACE_INTERNAL, "%s: aborting session", __func__); + +#ifdef HAVE_LIBSOUP22_SOLARIS soup_session_abort(session); - // FIXME: This crashes sometimes. - // smlTrace(TRACE_INTERNAL, "%s: unref session", __func__); - // g_object_unref(session); + soup_session_unref(session); +#else + /* cleanup session */ + + sml_fail_unless(smlThreadCallFunction(client_thread, cleanup_soup_session, NULL, &error), "%s", smlErrorPrint(&error)); -#ifndef HAVE_LIBSOUP22_SOLARIS + /* The client thread must be stopped first + * because libsoup is not thread safe. + * If the client thread is still running + * then the behaviour of the session is not predictable. + */ smlTrace(TRACE_INTERNAL, "%s: cleanup client thread", __func__); smlThreadStop(client_thread); smlThreadFree(client_thread); |