1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * lt-mem.h
4  * Copyright (C) 2011-2015 Akira TAGOH
5  *
6  * Authors:
7  *   Akira TAGOH  <akira@tagoh.org>
8  *
9  * You may distribute under the terms of either the GNU
10  * Lesser General Public License or the Mozilla Public
11  * License, as specified in the README file.
12  */
13 #ifndef __LT_MEM_H__
14 #define __LT_MEM_H__
15 
16 #if !defined (__LANGTAG_PRIVATE)
17 #error "Unable to use the private header publicly"
18 #endif
19 
20 #include "lt-macros.h"
21 
22 LT_BEGIN_DECLS
23 
24 typedef struct _lt_mem_t		lt_mem_t;
25 typedef struct _lt_mem_slist_t		lt_mem_slist_t;
26 
27 struct _lt_mem_t {
28 	volatile unsigned int  ref_count;
29 	size_t                 size;
30 	lt_mem_slist_t        *refs;
31 	lt_mem_slist_t        *weak_pointers;
32 };
33 
34 lt_pointer_t lt_mem_alloc_object       (size_t             size);
35 lt_pointer_t lt_mem_ref                (lt_mem_t          *object);
36 void         lt_mem_unref              (lt_mem_t          *object);
37 void         lt_mem_add_ref            (lt_mem_t          *object,
38                                         lt_pointer_t       p,
39                                         lt_destroy_func_t  func);
40 void         lt_mem_remove_ref         (lt_mem_t          *object,
41                                         lt_pointer_t       p);
42 void         lt_mem_delete_ref         (lt_mem_t          *object,
43                                         lt_pointer_t       p);
44 void         lt_mem_add_weak_pointer   (lt_mem_t          *object,
45                                         lt_pointer_t      *p);
46 void         lt_mem_remove_weak_pointer(lt_mem_t          *object,
47                                         lt_pointer_t      *p);
48 
49 LT_END_DECLS
50 
51 #endif /* __LT_MEM_H__ */
52