From 59eecf421e42cb929794f31e6387dbfb5b6a543b Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Mon, 15 Jun 2009 17:05:47 +0000 Subject: [PATCH] 2009-06-15 Marcus Brinkmann * gpgme.h.in (gpgme_result_ref, gpgme_result_unref): Add prototypes. * gpgme.def, libgpgme.vers (gpgme_result_ref, gpgme_result_unref): Add these. * context.h (struct ctx_op_data): Add member "references". * gpgme.c (gpgme_result_ref, gpgme_result_unref): New functions. (_gpgme_release_result): Use gpgme_result_unref. * op-support.c (_gpgme_op_data_lookup): Initialize references. --- src/ChangeLog | 11 +++++++++++ src/context.h | 5 ++++- src/gpgme.c | 36 ++++++++++++++++++++++++++++++++---- src/gpgme.def | 2 ++ src/gpgme.h.in | 4 ++++ src/libgpgme.vers | 4 +++- src/op-support.c | 1 + 7 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index db21dc4..35622ee 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2009-06-15 Marcus Brinkmann + + * gpgme.h.in (gpgme_result_ref, gpgme_result_unref): Add + prototypes. + * gpgme.def, libgpgme.vers (gpgme_result_ref, gpgme_result_unref): + Add these. + * context.h (struct ctx_op_data): Add member "references". + * gpgme.c (gpgme_result_ref, gpgme_result_unref): New functions. + (_gpgme_release_result): Use gpgme_result_unref. + * op-support.c (_gpgme_op_data_lookup): Initialize references. + 2009-06-12 Werner Koch * gpgme-w32spawn.c (translate_get_from_file): Parse optional spawn diff --git a/src/context.h b/src/context.h index 472b8be..63af1d1 100644 --- a/src/context.h +++ b/src/context.h @@ -45,7 +45,7 @@ typedef enum struct ctx_op_data { /* The next element in the linked list, or NULL if this is the last - element. */ + element. Used by op data structures linked into a context. */ struct ctx_op_data *next; /* The type of the hook data, which can be used by a routine to @@ -58,6 +58,9 @@ struct ctx_op_data /* The hook that points to the operation data. */ void *hook; + + /* The number of outstanding references. */ + int references; }; typedef struct ctx_op_data *ctx_op_data_t; diff --git a/src/gpgme.c b/src/gpgme.c index 203cd71..2372a06 100644 --- a/src/gpgme.c +++ b/src/gpgme.c @@ -175,6 +175,35 @@ gpgme_release (gpgme_ctx_t ctx) } +void +gpgme_result_ref (void *result) +{ + struct ctx_op_data *data = result - sizeof (struct ctx_op_data); + + if (! result) + return; + + data->references++; +} + + +void +gpgme_result_unref (void *result) +{ + struct ctx_op_data *data = result - sizeof (struct ctx_op_data); + + if (! result) + return; + + if (--data->references == 0) + { + if (data->cleanup) + (*data->cleanup) (data->hook); + free (data); + } +} + + void _gpgme_release_result (gpgme_ctx_t ctx) { @@ -183,9 +212,8 @@ _gpgme_release_result (gpgme_ctx_t ctx) while (data) { struct ctx_op_data *next_data = data->next; - if (data->cleanup) - (*data->cleanup) (data->hook); - free (data); + data->next = NULL; + gpgme_result_unref (data->hook); data = next_data; } ctx->op_data = NULL; @@ -430,7 +458,7 @@ gpgme_set_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs) /* This function provides access to the internal read function; it is - normally not used. */ + normally not used. */ ssize_t gpgme_io_read (int fd, void *buffer, size_t count) { diff --git a/src/gpgme.def b/src/gpgme.def index b1969ea..9bc95d0 100644 --- a/src/gpgme.def +++ b/src/gpgme.def @@ -177,6 +177,8 @@ EXPORTS gpgme_io_read @136 gpgme_io_write @137 + gpgme_release_ref @138 + gpgme_release_unref @139 ; END diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 46f8769..8e224a4 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -1933,6 +1933,10 @@ gpgme_error_t gpgme_set_engine_info (gpgme_protocol_t proto, available. */ gpgme_error_t gpgme_engine_check_version (gpgme_protocol_t proto); + +void gpgme_result_ref (void *result); +void gpgme_result_unref (void *result); + /* Deprecated types. */ typedef gpgme_ctx_t GpgmeCtx _GPGME_DEPRECATED; diff --git a/src/libgpgme.vers b/src/libgpgme.vers index fe32392..44f6176 100644 --- a/src/libgpgme.vers +++ b/src/libgpgme.vers @@ -56,7 +56,9 @@ GPGME_1.1 { gpgme_io_read; gpgme_io_write; - + + gpgme_result_ref; + gpgme_result_unref; }; diff --git a/src/op-support.c b/src/op-support.c index fefccc6..19b2420 100644 --- a/src/op-support.c +++ b/src/op-support.c @@ -52,6 +52,7 @@ _gpgme_op_data_lookup (gpgme_ctx_t ctx, ctx_op_data_id_t type, void **hook, data->type = type; data->cleanup = cleanup; data->hook = (void *) (((char *) data) + sizeof (struct ctx_op_data)); + data->references = 1; ctx->op_data = data; } *hook = data->hook; -- 2.26.2