First of all, what we were doing with having GMainLoop in the internal APIs is wrong. Synchronous APIs should always create their own main context and not iterate the caller's. Doing the latter creates potential for evil reentrancy issues. Sync API should block, async API is for not blocking. Now that's out of the way, fix the pull code to do the clean ``` while (termination_condition (state)) g_main_context_iteration (mainctx, TRUE); ``` model for looping. This is a lot easier to understand and ultimately more reliable than having other code call `g_main_loop_quit()`, as the loop condition is in exactly one place. We can also remove the idle source which only fired once. Note we have to add a hack here to discard the synchronous session and create a new one which we only use async. https://bugzilla.gnome.org/show_bug.cgi?id=753336
62 lines
2.5 KiB
C
62 lines
2.5 KiB
C
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
|
|
*
|
|
* Copyright (C) 2014 Colin Walters <walters@verbum.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#ifndef __GI_SCANNER__
|
|
|
|
#include "ostree-fetcher.h"
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define OSTREE_TYPE_METALINK (_ostree_metalink_get_type ())
|
|
#define OSTREE_METALINK(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), OSTREE_TYPE_METALINK, OstreeMetalink))
|
|
#define OSTREE_METALINK_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), OSTREE_TYPE_METALINK, OstreeMetalinkClass))
|
|
#define OSTREE_IS_METALINK(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), OSTREE_TYPE_METALINK))
|
|
#define OSTREE_IS_METALINK_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), OSTREE_TYPE_METALINK))
|
|
#define OSTREE_METALINK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), OSTREE_TYPE_METALINK, OstreeMetalinkClass))
|
|
|
|
typedef struct OstreeMetalinkClass OstreeMetalinkClass;
|
|
typedef struct OstreeMetalink OstreeMetalink;
|
|
|
|
struct OstreeMetalinkClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
GType _ostree_metalink_get_type (void) G_GNUC_CONST;
|
|
|
|
OstreeMetalink *_ostree_metalink_new (OstreeFetcher *fetcher,
|
|
const char *requested_file,
|
|
guint64 max_size,
|
|
SoupURI *uri);
|
|
|
|
SoupURI *_ostree_metalink_get_uri (OstreeMetalink *self);
|
|
|
|
gboolean _ostree_metalink_request_sync (OstreeMetalink *self,
|
|
SoupURI **out_target_uri,
|
|
GBytes **out_data,
|
|
SoupURI **fetching_sync_uri,
|
|
GCancellable *cancellable,
|
|
GError **error);
|
|
G_END_DECLS
|
|
|
|
#endif
|