summaryrefslogtreecommitdiff
path: root/rsync/job.c
Side-by-side diff
Diffstat (limited to 'rsync/job.c') (more/less context) (ignore whitespace changes)
-rw-r--r--rsync/job.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/rsync/job.c b/rsync/job.c
index 680982d..36f39f0 100644
--- a/rsync/job.c
+++ b/rsync/job.c
@@ -49,96 +49,97 @@
#include "stream.h"
#include "util.h"
#include "sumset.h"
#include "job.h"
#include "trace.h"
static const int rs_job_tag = 20010225;
static rs_result rs_job_work(rs_job_t *job, rs_buffers_t *buffers);
rs_job_t * rs_job_new(char const *job_name, rs_result (*statefn)(rs_job_t *))
{
rs_job_t *job;
job = rs_alloc_struct(rs_job_t);
job->job_name = job_name;
job->dogtag = rs_job_tag;
job->statefn = statefn;
job->stats.op = job_name;
rs_trace("start %s job", job_name);
return job;
}
void rs_job_check(rs_job_t *job)
{
assert(job->dogtag == rs_job_tag);
}
rs_result rs_job_free(rs_job_t *job)
{
rs_bzero(job, sizeof *job);
free(job);
return RS_DONE;
}
static rs_result rs_job_s_complete(rs_job_t *job)
{
+ job = job;
rs_fatal("should not be reached");
return RS_INTERNAL_ERROR;
}
static rs_result rs_job_complete(rs_job_t *job, rs_result result)
{
rs_job_check(job);
job->statefn = rs_job_s_complete;
job->final_result = result;
if (result != RS_DONE) {
rs_error("%s job failed: %s", job->job_name, rs_strerror(result));
} else {
rs_trace("%s job complete", job->job_name);
}
if (result == RS_DONE && !rs_tube_is_idle(job))
/* Processing is finished, but there is still some data
* waiting to get into the output buffer. */
return RS_BLOCKED;
else
return result;
}
/**
* \brief Run a ::rs_job_t state machine until it blocks
* (::RS_BLOCKED), returns an error, or completes (::RS_COMPLETE).
*
* \return The ::rs_result that caused iteration to stop.
*
* \param ending True if there is no more data after what's in the
* input buffer. The final block checksum will run across whatever's
* in there, without trying to accumulate anything else.
*/
rs_result rs_job_iter(rs_job_t *job, rs_buffers_t *buffers)
{
rs_result result;
rs_long_t orig_in, orig_out;
orig_in = buffers->avail_in;
orig_out = buffers->avail_out;
result = rs_job_work(job, buffers);
if (result == RS_BLOCKED || result == RS_DONE)