• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is part of the openHiTLS project.
3  *
4  * openHiTLS is licensed under the Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *
8  *     http://license.coscl.org.cn/MulanPSL2
9  *
10  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13  * See the Mulan PSL v2 for more details.
14  */
15 
16 #include <stddef.h>
17 #include <pthread.h>
18 
19 #include "hitls_build.h"
20 
21 #include "bsl_binlog_id.h"
22 #include "bsl_log_internal.h"
23 #include "bsl_log.h"
24 #include "bsl_errno.h"
25 #include "sal_lockimpl.h"
26 #include "bsl_sal.h"
27 
28 static BSL_SAL_ThreadCallback g_threadCallback = {0};
29 
BSL_SAL_ThreadLockNew(BSL_SAL_ThreadLockHandle * lock)30 int32_t BSL_SAL_ThreadLockNew(BSL_SAL_ThreadLockHandle *lock)
31 {
32     if ((g_threadCallback.pfThreadLockNew != NULL) && (g_threadCallback.pfThreadLockNew != BSL_SAL_ThreadLockNew)) {
33         return g_threadCallback.pfThreadLockNew(lock);
34     }
35 #if defined (HITLS_BSL_SAL_LOCK) && defined(HITLS_BSL_SAL_LINUX)
36     return SAL_RwLockNew(lock);
37 #else
38     return BSL_SUCCESS;
39 #endif
40 }
41 
BSL_SAL_ThreadReadLock(BSL_SAL_ThreadLockHandle lock)42 int32_t BSL_SAL_ThreadReadLock(BSL_SAL_ThreadLockHandle lock)
43 {
44     if ((g_threadCallback.pfThreadReadLock != NULL) && (g_threadCallback.pfThreadReadLock != BSL_SAL_ThreadReadLock)) {
45         return g_threadCallback.pfThreadReadLock(lock);
46     }
47 #if defined (HITLS_BSL_SAL_LOCK) && defined(HITLS_BSL_SAL_LINUX)
48     return SAL_RwReadLock(lock);
49 #else
50     return BSL_SUCCESS;
51 #endif
52 }
53 
BSL_SAL_ThreadWriteLock(BSL_SAL_ThreadLockHandle lock)54 int32_t BSL_SAL_ThreadWriteLock(BSL_SAL_ThreadLockHandle lock)
55 {
56     if ((g_threadCallback.pfThreadWriteLock != NULL) &&
57         (g_threadCallback.pfThreadWriteLock != BSL_SAL_ThreadWriteLock)) {
58         return g_threadCallback.pfThreadWriteLock(lock);
59     }
60 #if defined (HITLS_BSL_SAL_LOCK) && defined(HITLS_BSL_SAL_LINUX)
61     return SAL_RwWriteLock(lock);
62 #else
63     return BSL_SUCCESS;
64 #endif
65 }
66 
BSL_SAL_ThreadUnlock(BSL_SAL_ThreadLockHandle lock)67 int32_t BSL_SAL_ThreadUnlock(BSL_SAL_ThreadLockHandle lock)
68 {
69     if ((g_threadCallback.pfThreadUnlock != NULL) && (g_threadCallback.pfThreadUnlock != BSL_SAL_ThreadUnlock)) {
70         return g_threadCallback.pfThreadUnlock(lock);
71     }
72 #if defined (HITLS_BSL_SAL_LOCK) && defined(HITLS_BSL_SAL_LINUX)
73     return SAL_RwUnlock(lock);
74 #else
75     return BSL_SUCCESS;
76 #endif
77 }
78 
BSL_SAL_ThreadLockFree(BSL_SAL_ThreadLockHandle lock)79 void BSL_SAL_ThreadLockFree(BSL_SAL_ThreadLockHandle lock)
80 {
81     if ((g_threadCallback.pfThreadLockFree != NULL) && (g_threadCallback.pfThreadLockFree != BSL_SAL_ThreadLockFree)) {
82         g_threadCallback.pfThreadLockFree(lock);
83         return;
84     }
85 #if defined (HITLS_BSL_SAL_LOCK) && defined(HITLS_BSL_SAL_LINUX)
86     SAL_RwLockFree(lock);
87 #endif
88 }
89 
BSL_SAL_ThreadGetId(void)90 uint64_t BSL_SAL_ThreadGetId(void)
91 {
92     if ((g_threadCallback.pfThreadGetId != NULL) && (g_threadCallback.pfThreadGetId != BSL_SAL_ThreadGetId)) {
93         return g_threadCallback.pfThreadGetId();
94     }
95 #if defined (HITLS_BSL_SAL_THREAD) && defined(HITLS_BSL_SAL_LINUX)
96     return SAL_GetPid();
97 #else
98     return BSL_SUCCESS;
99 #endif
100 }
101 
BSL_SAL_ThreadRunOnce(uint32_t * onceControl,BSL_SAL_ThreadInitRoutine initFunc)102 int32_t BSL_SAL_ThreadRunOnce(uint32_t *onceControl, BSL_SAL_ThreadInitRoutine initFunc)
103 {
104     if (onceControl == NULL || initFunc == NULL) {
105         return BSL_SAL_ERR_BAD_PARAM;
106     }
107 #if defined (HITLS_BSL_SAL_THREAD) && defined(HITLS_BSL_SAL_LINUX)
108     return SAL_PthreadRunOnce(onceControl, initFunc);
109 #else
110     if (*onceControl == 1) {
111         return BSL_SUCCESS;
112     }
113     initFunc();
114     *onceControl = 1;
115     return BSL_SUCCESS;
116 #endif
117 }
118 
SAL_ThreadCallback_Ctrl(BSL_SAL_CB_FUNC_TYPE type,void * funcCb)119 int32_t SAL_ThreadCallback_Ctrl(BSL_SAL_CB_FUNC_TYPE type, void *funcCb)
120 {
121     if (type > BSL_SAL_THREAD_GET_ID_CB_FUNC || type < BSL_SAL_THREAD_LOCK_NEW_CB_FUNC) {
122         return BSL_SAL_ERR_BAD_PARAM;
123     }
124     uint32_t offset = (uint32_t)(type - BSL_SAL_THREAD_LOCK_NEW_CB_FUNC);
125     ((void **)&g_threadCallback)[offset] = funcCb;
126     return BSL_SUCCESS;
127 }
128