Mercurial > audlegacy
annotate src/audacious/memorypool.c @ 2866:4f84eb45ec3a trunk
BSD relicensing (pass 7).
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Sat, 23 Jun 2007 22:52:33 -0500 |
parents | d226b83fa329 |
children | 4c758281fe8f |
rev | line source |
---|---|
2865
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
1 /* |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
2 * audacious: Cross-platform multimedia player. |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
3 * memorypool.c: Memory pooling. |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
4 * |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
5 * Copyright (c) 2005-2007 Audacious development team. |
2313 | 6 * |
2865
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
7 * Redistribution and use in source and binary forms, with or without |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
8 * modification, are permitted provided that the following conditions are |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
9 * met: |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
10 * |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
11 * 1. Redistributions of source code must retain the above copyright notice, |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
12 * this list of conditions and the following disclaimer. |
2313 | 13 * |
2865
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
14 * 2. Redistributions in binary form must reproduce the above copyright |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
15 * notice, this list of conditions and the following disclaimer in the |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
16 * documentation and/or other materials provided with the distribution. |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
17 * |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
18 * 3. The name of the author may not be used to endorse or promote products |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
19 * derived from this software without specific prior written permission. |
2313 | 20 * |
2865
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
24 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
d226b83fa329
BSD relicensing (pass 6).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
31 * POSSIBILITY OF SUCH DAMAGE. |
2313 | 32 */ |
33 | |
34 #include <glib.h> | |
35 #include <stdlib.h> | |
36 #include <string.h> | |
37 | |
38 #include "util.h" | |
39 #include "memorypool.h" | |
40 | |
41 /* visibility of this object is not available to the outside */ | |
42 struct _MemoryPool { | |
43 GList *stack; | |
44 GDestroyNotify notify; | |
45 GMutex *mutex; | |
46 }; | |
47 | |
48 MemoryPool * | |
49 memory_pool_new(void) | |
50 { | |
51 MemoryPool *pool; | |
52 | |
53 pool = g_new0(MemoryPool, 1); | |
54 pool->notify = g_free; | |
55 pool->mutex = g_mutex_new(); | |
56 | |
57 return pool; | |
58 } | |
59 | |
60 MemoryPool * | |
61 memory_pool_with_custom_destructor(GDestroyNotify notify) | |
62 { | |
63 MemoryPool *pool; | |
64 | |
65 pool = g_new0(MemoryPool, 1); | |
66 pool->notify = notify; | |
67 pool->mutex = g_mutex_new(); | |
68 | |
69 return pool; | |
70 } | |
71 | |
72 gpointer | |
73 memory_pool_add(MemoryPool * pool, gpointer ptr) | |
74 { | |
75 g_mutex_lock(pool->mutex); | |
76 pool->stack = g_list_append(pool->stack, ptr); | |
77 g_mutex_unlock(pool->mutex); | |
78 | |
79 return ptr; | |
80 } | |
81 | |
82 gpointer | |
83 memory_pool_allocate(MemoryPool * pool, gsize sz) | |
84 { | |
85 gpointer addr; | |
86 | |
87 g_mutex_lock(pool->mutex); | |
88 addr = g_malloc0(sz); | |
89 pool->stack = g_list_append(pool->stack, addr); | |
90 g_mutex_unlock(pool->mutex); | |
91 | |
92 return addr; | |
93 } | |
94 | |
95 void | |
96 memory_pool_release(MemoryPool * pool, gpointer addr) | |
97 { | |
98 g_mutex_lock(pool->mutex); | |
99 | |
100 pool->stack = g_list_remove(pool->stack, addr); | |
101 pool->notify(addr); | |
102 | |
103 g_mutex_unlock(pool->mutex); | |
104 } | |
105 | |
106 static void | |
107 memory_pool_cleanup_nolock(MemoryPool * pool) | |
108 { | |
109 GList *iter; | |
110 | |
111 for (iter = pool->stack; iter != NULL; iter = g_list_next(iter)) | |
112 { | |
113 pool->stack = g_list_delete_link(pool->stack, iter); | |
114 g_warning("MemoryPool<%p> element at %p was not released until cleanup!", pool, iter->data); | |
115 pool->notify(iter->data); | |
116 } | |
117 } | |
118 | |
119 void | |
120 memory_pool_cleanup(MemoryPool * pool) | |
121 { | |
122 g_mutex_lock(pool->mutex); | |
123 memory_pool_cleanup_nolock(pool); | |
124 g_mutex_unlock(pool->mutex); | |
125 } | |
126 | |
127 void | |
128 memory_pool_destroy(MemoryPool * pool) | |
129 { | |
130 g_mutex_lock(pool->mutex); | |
131 memory_pool_cleanup_nolock(pool); | |
132 g_mutex_unlock(pool->mutex); | |
133 | |
134 g_mutex_free(pool->mutex); | |
135 g_free(pool); | |
136 } | |
137 | |
138 gchar * | |
139 memory_pool_strdup(MemoryPool * pool, gchar * src) | |
140 { | |
141 gchar *out; | |
142 gsize sz = strlen(src) + 1; | |
143 | |
144 out = memory_pool_allocate(pool, sz); | |
145 g_strlcpy(out, src, sz); | |
146 | |
147 return out; | |
148 } |