[HB] Remove HB_MEMORY_MODE_READONLY_NEVER_DUPLICATE
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 19 Aug 2009 20:45:41 +0000 (16:45 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 2 Nov 2009 19:40:46 +0000 (14:40 -0500)
Unlike the rest of the memory-mode enum, this one didn't only
describe the access mode of the input memory region.  Remove it.

If someone wants to inhibit duplicating, they can lock the blob
and throw away the key.

Based on mailing list discussion with Carl Worth.

src/hb-blob.c
src/hb-blob.h

index a1ab7f3..5f54753 100644 (file)
@@ -59,7 +59,7 @@ static hb_blob_t _hb_blob_nil = {
   HB_MUTEX_INIT, /* lock */
 
   0, /* lock_count */
-  HB_MEMORY_MODE_READONLY_NEVER_DUPLICATE, /* mode */
+  HB_MEMORY_MODE_READONLY, /* mode */
 
   NULL, /* data */
 
@@ -286,6 +286,26 @@ _try_make_writable_inplace_unix_locked (hb_blob_t *blob)
 #endif
 }
 
+static void
+_try_writable_inplace_locked (hb_blob_t *blob)
+{
+#if HB_DEBUG
+  fprintf (stderr, "%p %s: making writable\n", blob, __FUNCTION__);
+#endif
+
+  if (_try_make_writable_inplace_unix_locked (blob)) {
+#if HB_DEBUG
+  fprintf (stderr, "%p %s: making writable -> succeeded\n", blob, __FUNCTION__);
+#endif
+    blob->mode = HB_MEMORY_MODE_WRITABLE;
+  } else {
+#if HB_DEBUG
+  fprintf (stderr, "%p %s: making writable -> FAILED\n", blob, __FUNCTION__);
+#endif
+    /* Failed to make writable inplace, mark that */
+    blob->mode = HB_MEMORY_MODE_READONLY;
+  }
+}
 
 hb_bool_t
 hb_blob_try_writable_inplace (hb_blob_t *blob)
@@ -297,25 +317,8 @@ hb_blob_try_writable_inplace (hb_blob_t *blob)
 
   hb_mutex_lock (blob->lock);
 
-  if (blob->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE) {
-
-#if HB_DEBUG
-    fprintf (stderr, "%p %s: making writable\n", blob, __FUNCTION__);
-#endif
-
-    if (_try_make_writable_inplace_unix_locked (blob)) {
-#if HB_DEBUG
-    fprintf (stderr, "%p %s: making writable -> succeeded\n", blob, __FUNCTION__);
-#endif
-      blob->mode = HB_MEMORY_MODE_WRITABLE;
-    } else {
-#if HB_DEBUG
-    fprintf (stderr, "%p %s: making writable -> FAILED\n", blob, __FUNCTION__);
-#endif
-      /* Failed to make writable inplace, mark that */
-      blob->mode = HB_MEMORY_MODE_READONLY;
-    }
-  }
+  if (blob->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE)
+    _try_writable_inplace_locked (blob);
 
   mode = blob->mode;
 
@@ -334,9 +337,6 @@ hb_blob_try_writable (hb_blob_t *blob)
 
   hb_mutex_lock (blob->lock);
 
-  if (blob->mode == HB_MEMORY_MODE_READONLY_NEVER_DUPLICATE)
-    goto done;
-
   if (blob->mode == HB_MEMORY_MODE_READONLY)
   {
     char *new_data;
@@ -360,14 +360,13 @@ hb_blob_try_writable (hb_blob_t *blob)
       _hb_blob_destroy_user_data (blob);
     }
   }
+  else if (blob->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE)
+    _try_writable_inplace_locked (blob);
 
 done:
   mode = blob->mode;
 
   hb_mutex_unlock (blob->lock);
 
-  if (blob->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE)
-    return hb_blob_try_writable_inplace (blob);
-
   return mode == HB_MEMORY_MODE_WRITABLE;
 }
index 1a58f15..131a282 100644 (file)
@@ -35,7 +35,6 @@ typedef enum {
   HB_MEMORY_MODE_DUPLICATE,
   HB_MEMORY_MODE_READONLY,
   HB_MEMORY_MODE_WRITABLE,
-  HB_MEMORY_MODE_READONLY_NEVER_DUPLICATE,
   HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
 } hb_memory_mode_t;