Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/hda/core/array.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* generic arrays
4
*/
5
6
#include <linux/slab.h>
7
#include <sound/core.h>
8
#include <sound/hdaudio.h>
9
10
/**
11
* snd_array_new - get a new element from the given array
12
* @array: the array object
13
*
14
* Get a new element from the given array. If it exceeds the
15
* pre-allocated array size, re-allocate the array.
16
*
17
* Returns NULL if allocation failed.
18
*/
19
void *snd_array_new(struct snd_array *array)
20
{
21
if (snd_BUG_ON(!array->elem_size))
22
return NULL;
23
if (array->used >= array->alloced) {
24
int num = array->alloced + array->alloc_align;
25
int oldsize = array->alloced * array->elem_size;
26
int size = (num + 1) * array->elem_size;
27
void *nlist;
28
if (snd_BUG_ON(num >= 4096))
29
return NULL;
30
nlist = krealloc(array->list, size, GFP_KERNEL);
31
if (!nlist)
32
return NULL;
33
memset(nlist + oldsize, 0, size - oldsize);
34
array->list = nlist;
35
array->alloced = num;
36
}
37
return snd_array_elem(array, array->used++);
38
}
39
EXPORT_SYMBOL_GPL(snd_array_new);
40
41
/**
42
* snd_array_free - free the given array elements
43
* @array: the array object
44
*/
45
void snd_array_free(struct snd_array *array)
46
{
47
kfree(array->list);
48
array->used = 0;
49
array->alloced = 0;
50
array->list = NULL;
51
}
52
EXPORT_SYMBOL_GPL(snd_array_free);
53
54