Skip to content

Commit

Permalink
rng: move request queue cleanup from RngEgd to RngBackend
Browse files Browse the repository at this point in the history
RngBackend is now in charge of cleaning up the linked list on
instance finalization. It also exposes a function to finalize
individual RngRequest instances, called by its child classes.

Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Reviewed-by: Amit Shah <amit.shah@redhat.com>
Message-Id: <1456994238-9585-4-git-send-email-lprosek@redhat.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
  • Loading branch information
ladipro authored and Amit Shah committed Mar 3, 2016
1 parent 74074e8 commit 9f14b0a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 24 deletions.
25 changes: 1 addition & 24 deletions backends/rng-egd.c
Expand Up @@ -58,12 +58,6 @@ static void rng_egd_request_entropy(RngBackend *b, size_t size,
s->parent.requests = g_slist_append(s->parent.requests, req);
}

static void rng_egd_free_request(RngRequest *req)
{
g_free(req->data);
g_free(req);
}

static int rng_egd_chr_can_read(void *opaque)
{
RngEgd *s = RNG_EGD(opaque);
Expand Down Expand Up @@ -93,28 +87,13 @@ static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)
size -= len;

if (req->offset == req->size) {
s->parent.requests = g_slist_remove_link(s->parent.requests,
s->parent.requests);

req->receive_entropy(req->opaque, req->data, req->size);

rng_egd_free_request(req);
rng_backend_finalize_request(&s->parent, req);
}
}
}

static void rng_egd_free_requests(RngEgd *s)
{
GSList *i;

for (i = s->parent.requests; i; i = i->next) {
rng_egd_free_request(i->data);
}

g_slist_free(s->parent.requests);
s->parent.requests = NULL;
}

static void rng_egd_opened(RngBackend *b, Error **errp)
{
RngEgd *s = RNG_EGD(b);
Expand Down Expand Up @@ -183,8 +162,6 @@ static void rng_egd_finalize(Object *obj)
}

g_free(s->chr_name);

rng_egd_free_requests(s);
}

static void rng_egd_class_init(ObjectClass *klass, void *data)
Expand Down
32 changes: 32 additions & 0 deletions backends/rng.c
Expand Up @@ -64,6 +64,30 @@ static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp)
s->opened = true;
}

static void rng_backend_free_request(RngRequest *req)
{
g_free(req->data);
g_free(req);
}

static void rng_backend_free_requests(RngBackend *s)
{
GSList *i;

for (i = s->requests; i; i = i->next) {
rng_backend_free_request(i->data);
}

g_slist_free(s->requests);
s->requests = NULL;
}

void rng_backend_finalize_request(RngBackend *s, RngRequest *req)
{
s->requests = g_slist_remove(s->requests, req);
rng_backend_free_request(req);
}

static void rng_backend_init(Object *obj)
{
object_property_add_bool(obj, "opened",
Expand All @@ -72,6 +96,13 @@ static void rng_backend_init(Object *obj)
NULL);
}

static void rng_backend_finalize(Object *obj)
{
RngBackend *s = RNG_BACKEND(obj);

rng_backend_free_requests(s);
}

static void rng_backend_class_init(ObjectClass *oc, void *data)
{
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
Expand All @@ -84,6 +115,7 @@ static const TypeInfo rng_backend_info = {
.parent = TYPE_OBJECT,
.instance_size = sizeof(RngBackend),
.instance_init = rng_backend_init,
.instance_finalize = rng_backend_finalize,
.class_size = sizeof(RngBackendClass),
.class_init = rng_backend_class_init,
.abstract = true,
Expand Down
12 changes: 12 additions & 0 deletions include/sysemu/rng.h
Expand Up @@ -60,6 +60,7 @@ struct RngBackend
GSList *requests;
};


/**
* rng_backend_request_entropy:
* @s: the backend to request entropy from
Expand All @@ -78,4 +79,15 @@ struct RngBackend
void rng_backend_request_entropy(RngBackend *s, size_t size,
EntropyReceiveFunc *receive_entropy,
void *opaque);

/**
* rng_backend_free_request:
* @s: the backend that created the request
* @req: the request to finalize
*
* Used by child rng backend classes to finalize requests once they've been
* processed. The request is removed from the list of active requests and
* deleted.
*/
void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
#endif

0 comments on commit 9f14b0a

Please sign in to comment.