diff options
author | Chia-I Wu <[email protected]> | 2010-12-06 14:38:23 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2010-12-06 15:40:37 +0800 |
commit | 5ae4b6693a8254236435960ef84701fe405fe59b (patch) | |
tree | d42b857ee61de76f8b12f5d71c61f6e738977d4e /src/egl/main/eglarray.c | |
parent | 2b1469340bbf910469449354eeb5c02a9acfedba (diff) |
egl: _eglFilterArray should not allocate.
Otherwise, when it is called from within a driver, the caller cannot
free the returned data (on Windows).
Diffstat (limited to 'src/egl/main/eglarray.c')
-rw-r--r-- | src/egl/main/eglarray.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/egl/main/eglarray.c b/src/egl/main/eglarray.c index d686fa162d5..fe2f1a7f32f 100644 --- a/src/egl/main/eglarray.c +++ b/src/egl/main/eglarray.c @@ -118,38 +118,39 @@ _eglFindArray(_EGLArray *array, void *elem) /** - * Filter an array and return the filtered data. The returned data pointer - * should be freed. + * Filter an array and return the number of filtered elements. */ -void ** -_eglFilterArray(_EGLArray *array, EGLint *size, +EGLint +_eglFilterArray(_EGLArray *array, void **data, EGLint size, _EGLArrayForEach filter, void *filter_data) { - void **data; EGLint count = 0, i; - if (!array) { - *size = 0; - return malloc(0); - } - - data = malloc(array->Size * sizeof(array->Elements[0])); - if (!data) - return NULL; + if (!array) + return 0; if (filter) { for (i = 0; i < array->Size; i++) { - if (filter(array->Elements[i], filter_data)) - data[count++] = array->Elements[i]; + if (filter(array->Elements[i], filter_data)) { + if (data && count < size) + data[count] = array->Elements[i]; + count++; + } + if (data && count >= size) + break; } } else { - memcpy(data, array->Elements, array->Size * sizeof(array->Elements[0])); + if (data) { + count = (size < array->Size) ? size : array->Size; + memcpy(data, array->Elements, count * sizeof(array->Elements[0])); + } + else { + count = array->Size; + } } - *size = count; - - return data; + return count; } |