xref: /linux/tools/perf/util/sharded_mutex.c (revision cdd5b5a9761fd66d17586e4f4ba6588c70e640ea)
1*0650b2b2SIan Rogers // SPDX-License-Identifier: GPL-2.0
2*0650b2b2SIan Rogers #include "sharded_mutex.h"
3*0650b2b2SIan Rogers 
4*0650b2b2SIan Rogers #include <stdlib.h>
5*0650b2b2SIan Rogers 
sharded_mutex__new(size_t num_shards)6*0650b2b2SIan Rogers struct sharded_mutex *sharded_mutex__new(size_t num_shards)
7*0650b2b2SIan Rogers {
8*0650b2b2SIan Rogers 	struct sharded_mutex *result;
9*0650b2b2SIan Rogers 	size_t size;
10*0650b2b2SIan Rogers 	unsigned int bits;
11*0650b2b2SIan Rogers 
12*0650b2b2SIan Rogers 	for (bits = 0; ((size_t)1 << bits) < num_shards; bits++)
13*0650b2b2SIan Rogers 		;
14*0650b2b2SIan Rogers 
15*0650b2b2SIan Rogers 	size = sizeof(*result) + sizeof(struct mutex) * (1 << bits);
16*0650b2b2SIan Rogers 	result = malloc(size);
17*0650b2b2SIan Rogers 	if (!result)
18*0650b2b2SIan Rogers 		return NULL;
19*0650b2b2SIan Rogers 
20*0650b2b2SIan Rogers 	result->cap_bits = bits;
21*0650b2b2SIan Rogers 	for (size_t i = 0; i < ((size_t)1 << bits); i++)
22*0650b2b2SIan Rogers 		mutex_init(&result->mutexes[i]);
23*0650b2b2SIan Rogers 
24*0650b2b2SIan Rogers 	return result;
25*0650b2b2SIan Rogers }
26*0650b2b2SIan Rogers 
sharded_mutex__delete(struct sharded_mutex * sm)27*0650b2b2SIan Rogers void sharded_mutex__delete(struct sharded_mutex *sm)
28*0650b2b2SIan Rogers {
29*0650b2b2SIan Rogers 	for (size_t i = 0; i < ((size_t)1 << sm->cap_bits); i++)
30*0650b2b2SIan Rogers 		mutex_destroy(&sm->mutexes[i]);
31*0650b2b2SIan Rogers 
32*0650b2b2SIan Rogers 	free(sm);
33*0650b2b2SIan Rogers }
34