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, see <http://www.gnu.org/licenses/>. 18***/ 19 20#ifdef HAVE_CONFIG_H 21#include <config.h> 22#endif 23 24#include <stdio.h> 25#include <stdlib.h> 26#include <string.h> 27#include <errno.h> 28 29#include <pulsecore/macro.h> 30#include <pulsecore/core-util.h> 31 32#include "memchunk.h" 33 34pa_memchunk* pa_memchunk_make_writable(pa_memchunk *c, size_t min) { 35 pa_mempool *pool; 36 pa_memblock *n; 37 size_t l; 38 void *tdata, *sdata; 39 40 pa_assert(c); 41 pa_assert(c->memblock); 42 43 if (pa_memblock_ref_is_one(c->memblock) && 44 !pa_memblock_is_read_only(c->memblock) && 45 pa_memblock_get_length(c->memblock) >= c->index+min) 46 return c; 47 48 l = PA_MAX(c->length, min); 49 50 pool = pa_memblock_get_pool(c->memblock); 51 n = pa_memblock_new(pool, l); 52 pa_mempool_unref(pool), pool = NULL; 53 54 sdata = pa_memblock_acquire(c->memblock); 55 tdata = pa_memblock_acquire(n); 56 57 memcpy(tdata, (uint8_t*) sdata + c->index, c->length); 58 59 pa_memblock_release(c->memblock); 60 pa_memblock_release(n); 61 62 pa_memblock_unref(c->memblock); 63 64 c->memblock = n; 65 c->index = 0; 66 67 return c; 68} 69 70pa_memchunk* pa_memchunk_reset(pa_memchunk *c) { 71 pa_assert(c); 72 73 memset(c, 0, sizeof(*c)); 74 75 return c; 76} 77 78pa_memchunk *pa_memchunk_will_need(const pa_memchunk *c) { 79 void *p; 80 81 pa_assert(c); 82 pa_assert(c->memblock); 83 84 /* A version of pa_memblock_will_need() that works on memchunks 85 * instead of memblocks */ 86 87 p = pa_memblock_acquire_chunk(c); 88 pa_will_need(p, c->length); 89 pa_memblock_release(c->memblock); 90 91 return (pa_memchunk*) c; 92} 93 94pa_memchunk* pa_memchunk_memcpy(pa_memchunk *dst, pa_memchunk *src) { 95 void *p, *q; 96 97 pa_assert(dst); 98 pa_assert(src); 99 pa_assert(dst->length == src->length); 100 101 p = pa_memblock_acquire(dst->memblock); 102 q = pa_memblock_acquire(src->memblock); 103 104 memmove((uint8_t*) p + dst->index, 105 (uint8_t*) q + src->index, 106 dst->length); 107 108 pa_memblock_release(dst->memblock); 109 pa_memblock_release(src->memblock); 110 111 return dst; 112} 113 114bool pa_memchunk_isset(pa_memchunk *chunk) { 115 pa_assert(chunk); 116 117 return 118 chunk->memblock || 119 chunk->index > 0 || 120 chunk->length > 0; 121} 122