2009-06-15 Marcus Brinkmann <marcus@g10code.de>

* 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.
This commit is contained in:
Marcus Brinkmann 2009-06-15 17:05:47 +00:00
parent 148f51bb3e
commit 59eecf421e
7 changed files with 57 additions and 6 deletions

View File

@ -1,3 +1,14 @@
2009-06-15 Marcus Brinkmann <marcus@g10code.de>
* 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 <wk@g10code.com>
* gpgme-w32spawn.c (translate_get_from_file): Parse optional spawn

View File

@ -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;

View File

@ -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)
{

View File

@ -177,6 +177,8 @@ EXPORTS
gpgme_io_read @136
gpgme_io_write @137
gpgme_release_ref @138
gpgme_release_unref @139
; END

View File

@ -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;

View File

@ -56,7 +56,9 @@ GPGME_1.1 {
gpgme_io_read;
gpgme_io_write;
gpgme_result_ref;
gpgme_result_unref;
};

View File

@ -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;