[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v3 06/10] block: add refcount to Job object
From: |
John Snow |
Subject: |
[Qemu-block] [PATCH v3 06/10] block: add refcount to Job object |
Date: |
Wed, 22 Apr 2015 20:04:49 -0400 |
If we want to get at the job after the life of the job,
we'll need a refcount for this object.
This may occur for example if we wish to inspect the actions
taken by a particular job after a transactional group of jobs
runs, and further actions are required.
Signed-off-by: John Snow <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
blockjob.c | 18 ++++++++++++++++--
include/block/blockjob.h | 21 +++++++++++++++++++++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/blockjob.c b/blockjob.c
index ba2255d..d620082 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -35,6 +35,19 @@
#include "qemu/timer.h"
#include "qapi-event.h"
+void block_job_incref(BlockJob *job)
+{
+ job->refcount++;
+}
+
+void block_job_decref(BlockJob *job)
+{
+ job->refcount--;
+ if (job->refcount == 0) {
+ g_free(job);
+ }
+}
+
void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
int64_t speed, BlockCompletionFunc *cb,
void *opaque, Error **errp)
@@ -57,6 +70,7 @@ void *block_job_create(const BlockJobDriver *driver,
BlockDriverState *bs,
job->cb = cb;
job->opaque = opaque;
job->busy = true;
+ job->refcount = 1;
bs->job = job;
/* Only set speed when necessary to avoid NotSupported error */
@@ -68,7 +82,7 @@ void *block_job_create(const BlockJobDriver *driver,
BlockDriverState *bs,
bs->job = NULL;
bdrv_op_unblock_all(bs, job->blocker);
error_free(job->blocker);
- g_free(job);
+ block_job_decref(job);
error_propagate(errp, local_err);
return NULL;
}
@@ -85,7 +99,7 @@ void block_job_completed(BlockJob *job, int ret)
bs->job = NULL;
bdrv_op_unblock_all(bs, job->blocker);
error_free(job->blocker);
- g_free(job);
+ block_job_decref(job);
}
void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
index b6d4ebb..dcc0596 100644
--- a/include/block/blockjob.h
+++ b/include/block/blockjob.h
@@ -116,6 +116,9 @@ struct BlockJob {
/** The opaque value that is passed to the completion function. */
void *opaque;
+
+ /** A reference count, allowing for post-job actions in e.g. transactions
*/
+ int refcount;
};
/**
@@ -141,6 +144,24 @@ void *block_job_create(const BlockJobDriver *driver,
BlockDriverState *bs,
void *opaque, Error **errp);
/**
+ * block_job_incref:
+ * @job: The job to pick up a handle to
+ *
+ * Increment the refcount on @job, to be able to use it asynchronously
+ * from the job it is being used for. Put down the reference when done
+ * with @block_job_unref.
+ */
+void block_job_incref(BlockJob *job);
+
+/**
+ * block_job_decref:
+ * @job: The job to unreference and delete.
+ *
+ * Decrement the refcount on @job and delete it if there are no more
references.
+ */
+void block_job_decref(BlockJob *job);
+
+/**
* block_job_sleep_ns:
* @job: The job that calls the function.
* @clock: The clock to sleep on.
--
2.1.0
- [Qemu-block] [PATCH v3 00/10] block: incremental backup transactions, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 02/10] iotests: add transactional incremental backup test, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 01/10] qapi: Add transaction support to block-dirty-bitmap operations, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 03/10] block: rename BlkTransactionState and BdrvActionOps, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 04/10] block: re-add BlkTransactionState, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 06/10] block: add refcount to Job object,
John Snow <=
- [Qemu-block] [PATCH v3 05/10] block: add transactional callbacks feature, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 08/10] qmp: Add an implementation wrapper for qmp_drive_backup, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 09/10] block: drive_backup transaction callback support, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 07/10] block: add delayed bitmap successor cleanup, John Snow, 2015/04/22
- [Qemu-block] [PATCH v3 10/10] iotests: 124 - transactional failure test, John Snow, 2015/04/22