X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=xfer-src%2Fxfer-element.c;h=37e3377de8cea3bee41eca649318a71608bec55d;hb=109540caa4e37a3663b3dcfb9a205b9609e3f561;hp=c244effb9e7953c7f7b7e3cb22f22bc8bb087d4e;hpb=42ff24f2a525d5965e1841b2ebe3ee0f4b918ac6;p=debian%2Famanda diff --git a/xfer-src/xfer-element.c b/xfer-src/xfer-element.c index c244eff..37e3377 100644 --- a/xfer-src/xfer-element.c +++ b/xfer-src/xfer-element.c @@ -1,6 +1,6 @@ /* * Amanda, The Advanced Maryland Automatic Network Disk Archiver - * Copyright (c) 2008, 2009, 2010 Zmanda, Inc. All Rights Reserved. + * Copyright (c) 2008-2012 Zmanda, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -50,6 +50,16 @@ xfer_element_setup_impl( return TRUE; /* success */ } +static gboolean +xfer_element_set_size_impl( + XferElement *elt G_GNUC_UNUSED, + gint64 size G_GNUC_UNUSED) +{ + elt->size = size; + + return TRUE; /* success */ +} + static gboolean xfer_element_start_impl( XferElement *elt G_GNUC_UNUSED) @@ -134,6 +144,7 @@ xfer_element_class_init( klass->repr = xfer_element_repr_impl; klass->setup = xfer_element_setup_impl; + klass->set_size = xfer_element_set_size_impl; klass->start = xfer_element_start_impl; klass->cancel = xfer_element_cancel_impl; klass->pull_buffer = xfer_element_pull_buffer_impl; @@ -199,6 +210,14 @@ xfer_element_setup( return XFER_ELEMENT_GET_CLASS(elt)->setup(elt); } +gboolean +xfer_element_set_size( + XferElement *elt, + gint64 size) +{ + return XFER_ELEMENT_GET_CLASS(elt)->set_size(elt, size); +} + gboolean xfer_element_start( XferElement *elt) @@ -219,11 +238,15 @@ xfer_element_pull_buffer( XferElement *elt, size_t *size) { + xfer_status status; /* Make sure that the xfer is running before calling upstream's * pull_buffer method; this avoids a race condition where upstream * hasn't finished its xfer_element_start yet, and isn't ready for * a pull */ - if (elt->xfer->status == XFER_START) + g_mutex_lock(elt->xfer->status_mutex); + status = elt->xfer->status; + g_mutex_unlock(elt->xfer->status_mutex); + if (status == XFER_START) wait_until_xfer_running(elt->xfer); return XFER_ELEMENT_GET_CLASS(elt)->pull_buffer(elt, size); @@ -252,7 +275,7 @@ xfer_element_get_mech_pairs( */ void -xfer_element_drain_by_pulling( +xfer_element_drain_buffers( XferElement *upstream) { gpointer buf; @@ -264,7 +287,7 @@ xfer_element_drain_by_pulling( } void -xfer_element_drain_by_reading( +xfer_element_drain_fd( int fd) { size_t len;