2 This file is part of PulseAudio.
4 PulseAudio is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published
6 by the Free Software Foundation; either version 2.1 of the License,
7 or (at your option) any later version.
9 PulseAudio is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public License
15 along with PulseAudio; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
27 #include <pulsecore/memblock.h>
28 #include <pulsecore/macro.h>
29 #include <pulse/xmalloc.h>
31 static void release_cb(pa_memimport
*i
, uint32_t block_id
, void *userdata
) {
32 printf("%s: Imported block %u is released.\n", (char*) userdata
, block_id
);
35 static void revoke_cb(pa_memexport
*e
, uint32_t block_id
, void *userdata
) {
36 printf("%s: Exported block %u is revoked.\n", (char*) userdata
, block_id
);
39 static void print_stats(pa_mempool
*p
, const char *text
) {
40 const pa_mempool_stat
*s
= pa_mempool_get_stat(p
);
44 "n_accumulated = %u\n"
47 "allocated_size = %u\n"
48 "accumulated_size = %u\n"
49 "imported_size = %u\n"
50 "exported_size = %u\n"
51 "n_too_large_for_pool = %u\n"
55 (unsigned) pa_atomic_load(&s
->n_allocated
),
56 (unsigned) pa_atomic_load(&s
->n_accumulated
),
57 (unsigned) pa_atomic_load(&s
->n_imported
),
58 (unsigned) pa_atomic_load(&s
->n_exported
),
59 (unsigned) pa_atomic_load(&s
->allocated_size
),
60 (unsigned) pa_atomic_load(&s
->accumulated_size
),
61 (unsigned) pa_atomic_load(&s
->imported_size
),
62 (unsigned) pa_atomic_load(&s
->exported_size
),
63 (unsigned) pa_atomic_load(&s
->n_too_large_for_pool
),
64 (unsigned) pa_atomic_load(&s
->n_pool_full
));
67 int main(int argc
, char *argv
[]) {
68 pa_mempool
*pool_a
, *pool_b
, *pool_c
;
69 unsigned id_a
, id_b
, id_c
;
70 pa_memexport
*export_a
, *export_b
;
71 pa_memimport
*import_b
, *import_c
;
72 pa_memblock
*mb_a
, *mb_b
, *mb_c
;
74 pa_memblock
* blocks
[5];
79 const char txt
[] = "This is a test!";
81 pool_a
= pa_mempool_new(TRUE
, 0);
82 pool_b
= pa_mempool_new(TRUE
, 0);
83 pool_c
= pa_mempool_new(TRUE
, 0);
85 pa_mempool_get_shm_id(pool_a
, &id_a
);
86 pa_mempool_get_shm_id(pool_b
, &id_b
);
87 pa_mempool_get_shm_id(pool_c
, &id_c
);
89 pa_assert(pool_a
&& pool_b
&& pool_c
);
91 blocks
[0] = pa_memblock_new_fixed(pool_a
, (void*) txt
, sizeof(txt
), 1);
93 blocks
[1] = pa_memblock_new(pool_a
, sizeof(txt
));
94 x
= pa_memblock_acquire(blocks
[1]);
95 snprintf(x
, pa_memblock_get_length(blocks
[1]), "%s", txt
);
96 pa_memblock_release(blocks
[1]);
98 blocks
[2] = pa_memblock_new_pool(pool_a
, sizeof(txt
));
99 x
= pa_memblock_acquire(blocks
[2]);
100 snprintf(x
, pa_memblock_get_length(blocks
[2]), "%s", txt
);
101 pa_memblock_release(blocks
[2]);
103 blocks
[3] = pa_memblock_new_malloced(pool_a
, pa_xstrdup(txt
), sizeof(txt
));
106 for (i
= 0; blocks
[i
]; i
++) {
107 printf("Memory block %u\n", i
);
112 export_a
= pa_memexport_new(pool_a
, revoke_cb
, (void*) "A");
113 export_b
= pa_memexport_new(pool_b
, revoke_cb
, (void*) "B");
115 pa_assert(export_a
&& export_b
);
117 import_b
= pa_memimport_new(pool_b
, release_cb
, (void*) "B");
118 import_c
= pa_memimport_new(pool_c
, release_cb
, (void*) "C");
120 pa_assert(import_b
&& import_c
);
122 r
= pa_memexport_put(export_a
, mb_a
, &id
, &shm_id
, &offset
, &size
);
124 pa_assert(shm_id
== id_a
);
126 printf("A: Memory block exported as %u\n", id
);
128 mb_b
= pa_memimport_get(import_b
, id
, shm_id
, offset
, size
);
130 r
= pa_memexport_put(export_b
, mb_b
, &id
, &shm_id
, &offset
, &size
);
132 pa_assert(shm_id
== id_a
|| shm_id
== id_b
);
133 pa_memblock_unref(mb_b
);
135 printf("B: Memory block exported as %u\n", id
);
137 mb_c
= pa_memimport_get(import_c
, id
, shm_id
, offset
, size
);
139 x
= pa_memblock_acquire(mb_c
);
140 printf("1 data=%s\n", x
);
141 pa_memblock_release(mb_c
);
143 print_stats(pool_a
, "A");
144 print_stats(pool_b
, "B");
145 print_stats(pool_c
, "C");
147 pa_memexport_free(export_b
);
148 x
= pa_memblock_acquire(mb_c
);
149 printf("2 data=%s\n", x
);
150 pa_memblock_release(mb_c
);
151 pa_memblock_unref(mb_c
);
153 pa_memimport_free(import_b
);
155 pa_memblock_unref(mb_a
);
157 pa_memimport_free(import_c
);
158 pa_memexport_free(export_a
);
161 printf("vaccuuming...\n");
163 pa_mempool_vacuum(pool_a
);
164 pa_mempool_vacuum(pool_b
);
165 pa_mempool_vacuum(pool_c
);
167 printf("vaccuuming done...\n");
169 pa_mempool_free(pool_a
);
170 pa_mempool_free(pool_b
);
171 pa_mempool_free(pool_c
);