diff --git a/src/hb-blob.c b/src/hb-blob.c index a1ab7f3efda78f3854cc48155ec7c320de965f2f..5f54753b6ac7c715c94043dda7f37d0c45a808e5 100644 --- a/src/hb-blob.c +++ b/src/hb-blob.c @@ -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; } diff --git a/src/hb-blob.h b/src/hb-blob.h index 1a58f15e87f0a7ab09935045705138902190d341..131a282b9bca8c8f162a675a36782cc02cf44bd0 100644 --- a/src/hb-blob.h +++ b/src/hb-blob.h @@ -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;