pb_bufmgr_mm.c revision b47836225185c8d2e2ccf3e191230304709d0a57
1b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/************************************************************************** 2b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 3b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas. 4b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * All Rights Reserved. 5b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 6b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * copy of this software and associated documentation files (the 8b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * "Software"), to deal in the Software without restriction, including 9b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * the following conditions: 13b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 14b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * The above copyright notice and this permission notice (including the 15b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * next paragraph) shall be included in all copies or substantial portions 16b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * of the Software. 17b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 18b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 26b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca **************************************************************************/ 27b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 28b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/** 29b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * \file 30b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Buffer manager using the old texture memory manager. 31b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 32b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * \author Jos� Fonseca <jrfonseca@tungstengraphics.com> 33b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 36b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include <assert.h> 37b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include <stdlib.h> 38b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include <unistd.h> 39b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 40b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "main/imports.h" 41b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "glapi/glthread.h" 42b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "main/mm.h" 43b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "linked_list.h" 44b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 45b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "p_defines.h" 46b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_buffer.h" 47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_bufmgr.h" 48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 50b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/** 51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Convenience macro (type safe). 52b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 53b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#define SUPER(__derived) (&(__derived)->base) 54b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 55b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 56b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct mm_buffer_manager 57b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 58b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct buffer_manager base; 59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_Mutex mutex; 61b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 62b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t size; 63b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mem_block *heap; 64b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t align2; 66b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 67b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pipe_buffer *buffer; 68b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca void *map; 69b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 70b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 71b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 72b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic inline struct mm_buffer_manager * 73b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_manager(struct buffer_manager *mgr) 74b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 75b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(mgr); 76b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (struct mm_buffer_manager *)mgr; 77b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 78b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 79b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 80b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct mm_buffer 81b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 82b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pipe_buffer base; 83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 84b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer_manager *mgr; 85b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 86b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mem_block *block; 87b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 88b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 89b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 90b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic inline struct mm_buffer * 91b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer(struct pipe_buffer *buf) 92b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 93b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(buf); 94b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (struct mm_buffer *)buf; 95b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 96b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 97b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 98b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 99b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_reference(struct pipe_buffer *buf) 100b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 101b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 102b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 103b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 104b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 105b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 106b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_release(struct pipe_buffer *buf) 107b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 108b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 109b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer_manager *mm = mm_buf->mgr; 110b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 111b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(mm->mutex); 112b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmFreeMem(mm_buf->block); 113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca free(buf); 114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(mm->mutex); 115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 118b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void * 119b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_map(struct pipe_buffer *buf, 120b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca unsigned flags) 121b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 123b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer_manager *mm = mm_buf->mgr; 124b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (unsigned char *) mm->map + mm_buf->block->ofs; 126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 127b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 128b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 129b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 130b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_unmap(struct pipe_buffer *buf) 131b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 133b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 134b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 135b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 136b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 137b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_get_base_buffer(struct pipe_buffer *buf, 138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pipe_buffer **base_buf, 139b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca unsigned *offset) 140b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 141b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 142b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer_manager *mm = mm_buf->mgr; 143b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca buffer_get_base_buffer(mm->buffer, base_buf, offset); 144b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset += mm_buf->block->ofs; 145b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 146b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 147b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 148b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic const struct pipe_buffer_vtbl 149b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_vtbl = { 150b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_reference, 151b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_release, 152b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_map, 153b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_unmap, 154b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_get_base_buffer 155b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 156b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 157b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 158b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic struct pipe_buffer * 159b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_bufmgr_create_buffer(struct buffer_manager *mgr, 160b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t size) 161b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 162b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer_manager *mm = mm_buffer_manager(mgr); 163b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf; 164b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 165b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(mm->mutex); 166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 167b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf = (struct mm_buffer *)malloc(sizeof(*mm_buf)); 168b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm_buf) { 169b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(mm->mutex); 170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->base.vtbl = &mm_buffer_vtbl; 174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->mgr = mm; 176b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->block = mmAllocMem(mm->heap, size, mm->align2, 0); 178b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!mm_buf->block) { 179b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca fprintf(stderr, "warning: heap full\n"); 180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#if 0 181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmDumpMemInfo(mm->heap); 182b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#endif 183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->block = mmAllocMem(mm->heap, size, mm->align2, 0); 185b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!mm_buf->block) { 186b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(0); 187b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca free(mm_buf); 188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(mm->mutex); 189b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 190b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 191b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* Some sanity checks */ 194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(0 <= mm_buf->block->ofs && mm_buf->block->ofs < mm->size); 195b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(size <= mm_buf->block->size && mm_buf->block->ofs + mm_buf->block->size <= mm->size); 196b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 197b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(mm->mutex); 198b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(mm_buf); 199b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 200b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 201b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 202b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 203b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_bufmgr_destroy(struct buffer_manager *mgr) 204b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 205b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer_manager *mm = mm_buffer_manager(mgr); 206b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(mm->mutex); 208b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmDestroy(mm->heap); 210b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 211b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca buffer_unmap(mm->buffer); 212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca buffer_release(mm->buffer); 213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 214b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(mm->mutex); 215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca free(mgr); 217b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 219b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 220b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct buffer_manager * 221b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_bufmgr_create(struct buffer_manager *provider, 222b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t size, size_t align2) 223b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 224b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer_manager *mm; 225b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 226b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm = (struct mm_buffer_manager *)calloc(1, sizeof(*mm)); 227b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm) 228b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 229b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 230b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(provider); 231b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(provider->create_buffer); 232b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->base.create_buffer = mm_bufmgr_create_buffer; 233b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->base.destroy = mm_bufmgr_destroy; 234b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 235b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->size = size; 236b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->align2 = align2; /* 64-byte alignment */ 237b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 238b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_INIT_MUTEX(mm->mutex); 239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 240b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->buffer = provider->create_buffer(provider, size); 241b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm->buffer) 242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 243b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->map = buffer_map(mm->buffer, 245b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca PIPE_BUFFER_FLAG_READ | PIPE_BUFFER_FLAG_WRITE ); 246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!mm->map) 247b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 248b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 249b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->heap = mmInit(0, size); 250b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm->heap) 251b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 253b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(mm); 254b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 255b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure: 256b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecaif(mm->heap) 257b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmDestroy(mm->heap); 258b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(mm->map) 259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca buffer_unmap(mm->buffer); 260b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(mm->buffer) 261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca buffer_release(mm->buffer); 262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(mm) 263b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca free(mm); 264b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 265b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 266