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