xref: /aosp_15_r20/external/mesa3d/src/util/u_call_once.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Yonggang Luo
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "u_call_once.h"
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker struct util_call_once_context_t
9*61046927SAndroid Build Coastguard Worker {
10*61046927SAndroid Build Coastguard Worker    const void *data;
11*61046927SAndroid Build Coastguard Worker    util_call_once_data_func func;
12*61046927SAndroid Build Coastguard Worker };
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker static thread_local struct util_call_once_context_t call_once_context;
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker static void
util_call_once_data_slow_once(void)17*61046927SAndroid Build Coastguard Worker util_call_once_data_slow_once(void)
18*61046927SAndroid Build Coastguard Worker {
19*61046927SAndroid Build Coastguard Worker    struct util_call_once_context_t *once_context = &call_once_context;
20*61046927SAndroid Build Coastguard Worker    once_context->func(once_context->data);
21*61046927SAndroid Build Coastguard Worker }
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker void
util_call_once_data_slow(once_flag * once,util_call_once_data_func func,const void * data)24*61046927SAndroid Build Coastguard Worker util_call_once_data_slow(once_flag *once, util_call_once_data_func func, const void *data)
25*61046927SAndroid Build Coastguard Worker {
26*61046927SAndroid Build Coastguard Worker    struct util_call_once_context_t *once_context = &call_once_context;
27*61046927SAndroid Build Coastguard Worker    once_context->data = data;
28*61046927SAndroid Build Coastguard Worker    once_context->func = func;
29*61046927SAndroid Build Coastguard Worker    call_once(once, util_call_once_data_slow_once);
30*61046927SAndroid Build Coastguard Worker }
31