Branch data Line data Source code
1 : : /*
2 : : SSSD
3 : :
4 : : Simple reference counting wrappers for talloc.
5 : :
6 : : Authors:
7 : : Martin Nagy <mnagy@redhat.com>
8 : :
9 : : Copyright (C) Red Hat, Inc 2009
10 : :
11 : : This program is free software; you can redistribute it and/or modify
12 : : it under the terms of the GNU General Public License as published by
13 : : the Free Software Foundation; either version 3 of the License, or
14 : : (at your option) any later version.
15 : :
16 : : This program is distributed in the hope that it will be useful,
17 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : GNU General Public License for more details.
20 : :
21 : : You should have received a copy of the GNU General Public License
22 : : along with this program. If not, see <http://www.gnu.org/licenses/>.
23 : : */
24 : :
25 : : #include <talloc.h>
26 : :
27 : : #include "refcount.h"
28 : : #include "util/util.h"
29 : :
30 : : struct wrapper {
31 : : int *refcount;
32 : : void *ptr;
33 : : };
34 : :
35 : : static int
36 : 311 : refcount_destructor(struct wrapper *wrapper)
37 : : {
38 : 311 : (*wrapper->refcount)--;
39 [ + + ]: 311 : if (*wrapper->refcount == 0) {
40 : 6 : talloc_free(wrapper->ptr);
41 : : };
42 : :
43 : 311 : return 0;
44 : : }
45 : :
46 : : void *
47 : 6 : _rc_alloc(const void *context, size_t size, size_t refcount_offset,
48 : : const char *type_name)
49 : : {
50 : : struct wrapper *wrapper;
51 : :
52 : 6 : wrapper = talloc(context, struct wrapper);
53 [ + - ]: 6 : if (wrapper == NULL) {
54 : : return NULL;
55 : : }
56 : :
57 : 6 : wrapper->ptr = talloc_named_const(NULL, size, type_name);
58 [ - + ]: 6 : if (wrapper->ptr == NULL) {
59 : 0 : talloc_free(wrapper);
60 : 0 : return NULL;
61 : : };
62 : :
63 : 6 : wrapper->refcount = (int *)((char *)wrapper->ptr + refcount_offset);
64 : 6 : *wrapper->refcount = 1;
65 : :
66 : 6 : talloc_set_destructor(wrapper, refcount_destructor);
67 : :
68 : 6 : return wrapper->ptr;
69 : : }
70 : :
71 : : void *
72 : 305 : _rc_reference(const void *context, size_t refcount_offset, void *source)
73 : : {
74 : : struct wrapper *wrapper;
75 : :
76 : 305 : wrapper = talloc(context, struct wrapper);
77 [ + - ]: 305 : if (wrapper == NULL) {
78 : : return NULL;
79 : : }
80 : :
81 : 305 : wrapper->ptr = source;
82 : 305 : wrapper->refcount = (int *)((char *)wrapper->ptr + refcount_offset);
83 : 305 : (*wrapper->refcount)++;
84 : :
85 : 305 : talloc_set_destructor(wrapper, refcount_destructor);
86 : :
87 : 305 : return wrapper->ptr;
88 : : }
|