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