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 db21dc4b105c1f40dc0dda33904f434792a538f4..35622ee667c6f6e55894375c1a663e191449c28b 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 472b8bebf14000f679b96b06f932b7b56f0130cc..63af1d1029d4f30611be36ebc938bcc07ea33ef6 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 203cd711374590a566bc4cec453b2834fb8ca31e..2372a06ab63e2d7255da5cfd7cd829ce95c23246 100644 (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)
 {
index b1969ea9092af9fbfeb5c1e1e32c1469456c8569..9bc95d004e01a55e60597754fa97b1fece1e6d1b 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 46f8769c38909ae0345c30b99aed67ba1fc958ab..8e224a4732dd17bb53fe0cd3bf7067ba1e3c4ff1 100644 (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);
 
+\f
+void gpgme_result_ref (void *result);
+void gpgme_result_unref (void *result);
+
 \f
 /* Deprecated types.  */
 typedef gpgme_ctx_t GpgmeCtx _GPGME_DEPRECATED;
index fe32392b7b5a7b4453acad1b27219296ef3221b0..44f617605fd4f9cf351c089a0b9337ac3518f20a 100644 (file)
@@ -56,7 +56,9 @@ GPGME_1.1 {
 
     gpgme_io_read;
     gpgme_io_write;
-    
+
+    gpgme_result_ref;
+    gpgme_result_unref;
 };
 
 
index fefccc67b345e2ff3edf53ca2e56409b2f35c398..19b242055e275623eaf1ecbda86eefa3eaae543b 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;