hb-object-private.hh revision c57d454accff66e5f2c58006e8fb40bc020b6182
1f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod/* 2a45f00019242734fca742adeb2ed507305baeda6Behdad Esfahbod * Copyright (C) 2007 Chris Wilson 3863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod * Copyright (C) 2009,2010 Red Hat, Inc. 4f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * 5c755cb3e3ac55156d0d2ec05adea7a650b97cc41Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 6f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * 7f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * Permission is hereby granted, without written agreement and without 8f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 9f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * software and its documentation for any purpose, provided that the 10f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 11f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * all copies of this software. 12f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * 13f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 14f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 15f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 16f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 17f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * DAMAGE. 18f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * 19f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 20f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 21f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 22f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 23f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 24f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * 25f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * Contributor(s): 26f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * Chris Wilson <chris@chris-wilson.co.uk> 2735a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod * Red Hat Author(s): Behdad Esfahbod 28f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod */ 29f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 30c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#ifndef HB_OBJECT_PRIVATE_HH 31c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#define HB_OBJECT_PRIVATE_HH 32f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 33c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#include "hb-private.hh" 3423c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod 35acdba3f90b232fc12fcb200dca2584481b339118Behdad EsfahbodHB_BEGIN_DECLS 36799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod 37799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod 38f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod/* Encapsulate operations on the object's reference count */ 39f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbodtypedef struct { 40f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod hb_atomic_int_t ref_count; 41f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod} hb_reference_count_t; 42f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 437f3d5c8166e5205e9d9bf8b4b2f31d44387a8006Behdad Esfahbod#define hb_reference_count_inc(RC) hb_atomic_int_fetch_and_add ((RC).ref_count, 1) 447f3d5c8166e5205e9d9bf8b4b2f31d44387a8006Behdad Esfahbod#define hb_reference_count_dec(RC) hb_atomic_int_fetch_and_add ((RC).ref_count, -1) 45f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 46f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_INIT(RC, VALUE) ((RC).ref_count = (VALUE)) 47f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 48a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod#define HB_REFERENCE_COUNT_GET_VALUE(RC) hb_atomic_int_get ((RC).ref_count) 49a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod#define HB_REFERENCE_COUNT_SET_VALUE(RC, VALUE) hb_atomic_int_set ((RC).ref_count, (VALUE)) 50f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 51f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_INVALID_VALUE ((hb_atomic_int_t) -1) 52f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_INVALID {HB_REFERENCE_COUNT_INVALID_VALUE} 53f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 54f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_IS_INVALID(RC) (HB_REFERENCE_COUNT_GET_VALUE (RC) == HB_REFERENCE_COUNT_INVALID_VALUE) 55f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod 5635a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod 57c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 58863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod/* Debug */ 59863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod 60863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod#ifndef HB_DEBUG_OBJECT 6111e3ec444a85fc72541823c2e98cc92c4ceb19afBehdad Esfahbod#define HB_DEBUG_OBJECT (HB_DEBUG+0) 62863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod#endif 63863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod 64f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbodstatic inline void 65f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod_hb_trace_object (const void *obj, 66f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod hb_reference_count_t *ref_count, 67f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod const char *function) 68863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod{ 6911e3ec444a85fc72541823c2e98cc92c4ceb19afBehdad Esfahbod (void) (HB_DEBUG_OBJECT && 7011e3ec444a85fc72541823c2e98cc92c4ceb19afBehdad Esfahbod fprintf (stderr, "OBJECT(%p) refcount=%d %s\n", 7111e3ec444a85fc72541823c2e98cc92c4ceb19afBehdad Esfahbod obj, 7211e3ec444a85fc72541823c2e98cc92c4ceb19afBehdad Esfahbod HB_REFERENCE_COUNT_GET_VALUE (*ref_count), 7311e3ec444a85fc72541823c2e98cc92c4ceb19afBehdad Esfahbod function)); 74863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod} 75863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod 76f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod#define TRACE_OBJECT(obj) _hb_trace_object (obj, &obj->ref_count, __FUNCTION__) 77863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod 78863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod 79863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod 80863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod/* Object allocation and lifecycle manamgement macros */ 8135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod 82c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod#define HB_OBJECT_IS_INERT(obj) \ 8364d3fc8d0dada673245cc8c0b1c12cd849b30997Behdad Esfahbod (unlikely (HB_REFERENCE_COUNT_IS_INVALID ((obj)->ref_count))) 84c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 85ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod#define HB_OBJECT_DO_INIT_EXPR(obj) \ 86ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod HB_REFERENCE_COUNT_INIT (obj->ref_count, 1) 87ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod 88ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod#define HB_OBJECT_DO_INIT(obj) \ 8935a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod HB_STMT_START { \ 90ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod HB_OBJECT_DO_INIT_EXPR (obj); \ 9135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod } HB_STMT_END 9235a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod 935fc22e647c8a2bf6d3cb59185e351ac625e7e322Behdad Esfahbod#define HB_OBJECT_DO_CREATE(Type, obj) \ 9464d3fc8d0dada673245cc8c0b1c12cd849b30997Behdad Esfahbod likely (( \ 9541011a6ed7c4891b20c0eddbb6d4ad9c820cfddbBehdad Esfahbod (void) ( \ 96c165f25410f817d248ad5d07e1827d33efd1b0a0Behdad Esfahbod ((obj) = (Type *) calloc (1, sizeof (Type))) && \ 97f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod ( \ 98f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod HB_OBJECT_DO_INIT_EXPR (obj), \ 99f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod TRACE_OBJECT (obj), \ 100f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod TRUE \ 101f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod ) \ 102c165f25410f817d248ad5d07e1827d33efd1b0a0Behdad Esfahbod ), \ 103c165f25410f817d248ad5d07e1827d33efd1b0a0Behdad Esfahbod (obj) \ 104ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod )) 105ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod 106c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod#define HB_OBJECT_DO_REFERENCE(obj) \ 10735a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod HB_STMT_START { \ 10823c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod int old_count; \ 10964d3fc8d0dada673245cc8c0b1c12cd849b30997Behdad Esfahbod if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \ 11035a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod return obj; \ 111f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod TRACE_OBJECT (obj); \ 112a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod old_count = hb_reference_count_inc (obj->ref_count); \ 11323c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod assert (old_count > 0); \ 11435a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod return obj; \ 11535a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod } HB_STMT_END 11635a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod 117c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod#define HB_OBJECT_DO_DESTROY(obj) \ 11835a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod HB_STMT_START { \ 11923c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod int old_count; \ 12064d3fc8d0dada673245cc8c0b1c12cd849b30997Behdad Esfahbod if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \ 12135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod return; \ 122f5ac9de259773a5f86809892e58166a485d70a3dBehdad Esfahbod TRACE_OBJECT (obj); \ 123a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod old_count = hb_reference_count_dec (obj->ref_count); \ 12423c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod assert (old_count > 0); \ 12523c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod if (old_count != 1) \ 12635a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod return; \ 12735a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod } HB_STMT_END 12835a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod 12935a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod 130acdba3f90b232fc12fcb200dca2584481b339118Behdad EsfahbodHB_END_DECLS 131863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod 132c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#endif /* HB_OBJECT_PRIVATE_HH */ 133