Branch data Line data Source code
1 : : /***
2 : : This file is part of PulseAudio.
3 : :
4 : : Copyright 2004-2006 Lennart Poettering
5 : :
6 : : PulseAudio is free software; you can redistribute it and/or modify
7 : : it under the terms of the GNU Lesser General Public License as
8 : : published by the Free Software Foundation; either version 2.1 of the
9 : : License, or (at your option) any later version.
10 : :
11 : : PulseAudio is distributed in the hope that it will be useful, but
12 : : WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : : Lesser General Public License for more details.
15 : :
16 : : You should have received a copy of the GNU Lesser General Public
17 : : License along with PulseAudio; if not, write to the Free Software
18 : : Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 : : USA.
20 : : ***/
21 : :
22 : : #ifdef HAVE_CONFIG_H
23 : : #include <config.h>
24 : : #endif
25 : :
26 : : #include <stdio.h>
27 : : #include <stdlib.h>
28 : : #include <string.h>
29 : : #include <errno.h>
30 : :
31 : : #include <pulsecore/macro.h>
32 : : #include <pulsecore/core-util.h>
33 : :
34 : : #include "memchunk.h"
35 : :
36 : 13 : pa_memchunk* pa_memchunk_make_writable(pa_memchunk *c, size_t min) {
37 : : pa_memblock *n;
38 : : size_t l;
39 : : void *tdata, *sdata;
40 : :
41 [ - + ]: 13 : pa_assert(c);
42 [ - + ]: 13 : pa_assert(c->memblock);
43 : :
44 [ - + # # ]: 13 : if (pa_memblock_ref_is_one(c->memblock) &&
45 [ # # ]: 0 : !pa_memblock_is_read_only(c->memblock) &&
46 : 0 : pa_memblock_get_length(c->memblock) >= c->index+min)
47 : : return c;
48 : :
49 : 13 : l = PA_MAX(c->length, min);
50 : :
51 : 13 : n = pa_memblock_new(pa_memblock_get_pool(c->memblock), l);
52 : :
53 : 13 : sdata = pa_memblock_acquire(c->memblock);
54 : 13 : tdata = pa_memblock_acquire(n);
55 : :
56 : 13 : memcpy(tdata, (uint8_t*) sdata + c->index, c->length);
57 : :
58 : 13 : pa_memblock_release(c->memblock);
59 : 13 : pa_memblock_release(n);
60 : :
61 : 13 : pa_memblock_unref(c->memblock);
62 : :
63 : 13 : c->memblock = n;
64 : 13 : c->index = 0;
65 : :
66 : 13 : return c;
67 : : }
68 : :
69 : 318 : pa_memchunk* pa_memchunk_reset(pa_memchunk *c) {
70 [ - + ]: 318 : pa_assert(c);
71 : :
72 : : memset(c, 0, sizeof(*c));
73 : :
74 : 318 : return c;
75 : : }
76 : :
77 : 0 : pa_memchunk *pa_memchunk_will_need(const pa_memchunk *c) {
78 : : void *p;
79 : :
80 [ # # ]: 0 : pa_assert(c);
81 [ # # ]: 0 : pa_assert(c->memblock);
82 : :
83 : : /* A version of pa_memblock_will_need() that works on memchunks
84 : : * instead of memblocks */
85 : :
86 : 0 : p = (uint8_t*) pa_memblock_acquire(c->memblock) + c->index;
87 : 0 : pa_will_need(p, c->length);
88 : 0 : pa_memblock_release(c->memblock);
89 : :
90 : 0 : return (pa_memchunk*) c;
91 : : }
92 : :
93 : 62 : pa_memchunk* pa_memchunk_memcpy(pa_memchunk *dst, pa_memchunk *src) {
94 : : void *p, *q;
95 : :
96 [ - + ]: 62 : pa_assert(dst);
97 [ - + ]: 62 : pa_assert(src);
98 [ - + ]: 62 : pa_assert(dst->length == src->length);
99 : :
100 : 62 : p = pa_memblock_acquire(dst->memblock);
101 : 62 : q = pa_memblock_acquire(src->memblock);
102 : :
103 : 124 : memmove((uint8_t*) p + dst->index,
104 : 62 : (uint8_t*) q + src->index,
105 : : dst->length);
106 : :
107 : 62 : pa_memblock_release(dst->memblock);
108 : 62 : pa_memblock_release(src->memblock);
109 : :
110 : 62 : return dst;
111 : : }
112 : :
113 : 0 : pa_bool_t pa_memchunk_isset(pa_memchunk *chunk) {
114 [ # # ]: 0 : assert(chunk);
115 : :
116 : 0 : return
117 [ # # ]: 0 : chunk->memblock ||
118 [ # # ][ # # ]: 0 : chunk->index > 0 ||
119 : 0 : chunk->length > 0;
120 : : }
|