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:
parent
148f51bb3e
commit
59eecf421e
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
36
src/gpgme.c
36
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)
|
||||
{
|
||||
|
@ -177,6 +177,8 @@ EXPORTS
|
||||
gpgme_io_read @136
|
||||
gpgme_io_write @137
|
||||
|
||||
gpgme_release_ref @138
|
||||
gpgme_release_unref @139
|
||||
|
||||
; END
|
||||
|
||||
|
@ -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;
|
||||
|
@ -56,7 +56,9 @@ GPGME_1.1 {
|
||||
|
||||
gpgme_io_read;
|
||||
gpgme_io_write;
|
||||
|
||||
|
||||
gpgme_result_ref;
|
||||
gpgme_result_unref;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user