Mercurial > audlegacy
annotate src/audacious/memorypool.c @ 2865:d226b83fa329 trunk
BSD relicensing (pass 6).
| author | William Pitcock <nenolod@atheme.org> |
|---|---|
| date | Sat, 23 Jun 2007 22:51:13 -0500 |
| parents | 3149d4b1a9a9 |
| 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 } |
