hb-object-private.hh revision 799b3c375ad0e1293fd37a0e3a0d422a3166dcd8
1f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod/*
235a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod * Copyright (C) 2007 Chris Wilson
335a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod * Copyright (C) 2009  Red Hat, Inc.
4f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *
5f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *  This is part of HarfBuzz, an OpenType Layout engine 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
30f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#ifndef HB_REFCOUNT_PRIVATE_H
31f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFCOUNT_PRIVATE_H
32f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
3323c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod
34799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#ifndef HB_DEBUG_OBJECT
35799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#define HB_DEBUG_OBJECT HB_DEBUG
36799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#endif
37799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod
38799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#if HB_DEBUG_OBJECT
39799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#include <stdio.h>
40799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#define HB_OBJECT_DEBUG_OUT(obj) fprintf (stderr, "%p refcount=%d %s\n", \
41799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod					  obj, \
42799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod					  HB_REFERENCE_COUNT_GET_VALUE (obj->ref_count), \
43799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod					  __FUNCTION__)
44799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#else
45799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#define HB_OBJECT_DEBUG_OUT(obj) 0
46799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod#endif
47799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod
48799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod
49f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod/* Encapsulate operations on the object's reference count */
50f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbodtypedef struct {
51f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod  hb_atomic_int_t ref_count;
52f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod} hb_reference_count_t;
53f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
547f3d5c8166e5205e9d9bf8b4b2f31d44387a8006Behdad Esfahbod#define hb_reference_count_inc(RC) hb_atomic_int_fetch_and_add ((RC).ref_count, 1)
557f3d5c8166e5205e9d9bf8b4b2f31d44387a8006Behdad Esfahbod#define hb_reference_count_dec(RC) hb_atomic_int_fetch_and_add ((RC).ref_count, -1)
56f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
57f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_INIT(RC, VALUE) ((RC).ref_count = (VALUE))
58f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
59a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod#define HB_REFERENCE_COUNT_GET_VALUE(RC) hb_atomic_int_get ((RC).ref_count)
60a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod#define HB_REFERENCE_COUNT_SET_VALUE(RC, VALUE) hb_atomic_int_set ((RC).ref_count, (VALUE))
61f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
62f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_INVALID_VALUE ((hb_atomic_int_t) -1)
63f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_INVALID {HB_REFERENCE_COUNT_INVALID_VALUE}
64f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
65f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_IS_INVALID(RC) (HB_REFERENCE_COUNT_GET_VALUE (RC) == HB_REFERENCE_COUNT_INVALID_VALUE)
66f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
67f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#define HB_REFERENCE_COUNT_HAS_REFERENCE(RC) (HB_REFERENCE_COUNT_GET_VALUE (RC) > 0)
68f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
6935a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod
70c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
7135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod/* Helper macros */
7235a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod
73c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod#define HB_OBJECT_IS_INERT(obj) \
7404cc0a29ee1472c318c36efcd19b9c1a6657d9eaBehdad Esfahbod    (HB_UNLIKELY (HB_REFERENCE_COUNT_IS_INVALID ((obj)->ref_count)))
75c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
76ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod#define HB_OBJECT_DO_INIT_EXPR(obj) \
77ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod    HB_REFERENCE_COUNT_INIT (obj->ref_count, 1)
78ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod
79ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod#define HB_OBJECT_DO_INIT(obj) \
8035a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod  HB_STMT_START { \
81ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod    HB_OBJECT_DO_INIT_EXPR (obj); \
8235a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod  } HB_STMT_END
8335a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod
845fc22e647c8a2bf6d3cb59185e351ac625e7e322Behdad Esfahbod#define HB_OBJECT_DO_CREATE(Type, obj) \
85ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod  HB_LIKELY (( \
865fc22e647c8a2bf6d3cb59185e351ac625e7e322Behdad Esfahbod	     (obj) = (Type *) calloc (1, sizeof (Type)), \
87ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod	     HB_OBJECT_DO_INIT_EXPR (obj), \
88799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod	     HB_OBJECT_DEBUG_OUT (obj), \
89ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod	     (obj) \
90ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod	     ))
91ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod
92c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod#define HB_OBJECT_DO_REFERENCE(obj) \
9335a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod  HB_STMT_START { \
9423c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    int old_count; \
9523c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    if (HB_UNLIKELY (!(obj) || HB_OBJECT_IS_INERT (obj))) \
9635a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod      return obj; \
97799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod    HB_OBJECT_DEBUG_OUT (obj); \
98a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod    old_count = hb_reference_count_inc (obj->ref_count); \
9923c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    assert (old_count > 0); \
10035a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod    return obj; \
10135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod  } HB_STMT_END
10235a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod
103a12dd324a3859496a95602d426aee34ce6c5c8a6Behdad Esfahbod#define HB_OBJECT_DO_GET_REFERENCE_COUNT(obj) \
104a12dd324a3859496a95602d426aee34ce6c5c8a6Behdad Esfahbod  HB_STMT_START { \
10523c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    if (HB_UNLIKELY (!(obj) || HB_OBJECT_IS_INERT (obj))) \
106a12dd324a3859496a95602d426aee34ce6c5c8a6Behdad Esfahbod      return 0; \
107a12dd324a3859496a95602d426aee34ce6c5c8a6Behdad Esfahbod    return HB_REFERENCE_COUNT_GET_VALUE (obj->ref_count); \
108a12dd324a3859496a95602d426aee34ce6c5c8a6Behdad Esfahbod  } HB_STMT_END
109a12dd324a3859496a95602d426aee34ce6c5c8a6Behdad Esfahbod
110c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod#define HB_OBJECT_DO_DESTROY(obj) \
11135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod  HB_STMT_START { \
11223c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    int old_count; \
11323c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    if (HB_UNLIKELY (!(obj) || HB_OBJECT_IS_INERT (obj))) \
11435a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod      return; \
115799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod    HB_OBJECT_DEBUG_OUT (obj); \
116a794ebf4be9896393f4badf02905a4007981a588Behdad Esfahbod    old_count = hb_reference_count_dec (obj->ref_count); \
11723c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    assert (old_count > 0); \
11823c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod    if (old_count != 1) \
11935a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod      return; \
12035a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod  } HB_STMT_END
12135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod
12235a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod
123f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod#endif /* HB_REFCOUNT_PRIVATE_H */
124