Don't unref the GAsyncResult in finish functions. Do it after calling g_simple_async_result_complete(). This allows the GAsyncReadyCallback to be optional, and we'll still clean up resources properly. Also, don't call g_simple_async_result_complete_in_idle() unless we're completing an operation from a separate thread, which we're not in any of the current cases.