2009-06-15 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Mon, 15 Jun 2009 17:05:47 +0000 (17:05 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Mon, 15 Jun 2009 17:05:47 +0000 (17:05 +0000)
* 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
src/context.h
src/gpgme.c
src/gpgme.def
src/gpgme.h.in
src/libgpgme.vers
src/op-support.c

index db21dc4..35622ee 100644 (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
index 472b8be..63af1d1 100644 (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;
 
index 203cd71..2372a06 100644 (file)
@@ -176,6 +176,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)
 {
   struct ctx_op_data *data = ctx->op_data;
@@ -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)
 {
index b1969ea..9bc95d0 100644 (file)
@@ -177,6 +177,8 @@ EXPORTS
     gpgme_io_read                         @136
     gpgme_io_write                        @137
 
+    gpgme_release_ref                     @138
+    gpgme_release_unref                   @139
 
 ; END
 
index 46f8769..8e224a4 100644 (file)
@@ -1934,6 +1934,10 @@ gpgme_error_t gpgme_set_engine_info (gpgme_protocol_t proto,
 gpgme_error_t gpgme_engine_check_version (gpgme_protocol_t proto);
 
 \f
+void gpgme_result_ref (void *result);
+void gpgme_result_unref (void *result);
+
+\f
 /* Deprecated types.  */
 typedef gpgme_ctx_t GpgmeCtx _GPGME_DEPRECATED;
 typedef gpgme_data_t GpgmeData _GPGME_DEPRECATED;
index fe32392..44f6176 100644 (file)
@@ -56,7 +56,9 @@ GPGME_1.1 {
 
     gpgme_io_read;
     gpgme_io_write;
-    
+
+    gpgme_result_ref;
+    gpgme_result_unref;
 };
 
 
index fefccc6..19b2420 100644 (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;