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)30int32_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)42int32_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)54int32_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)67int32_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)79void 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)90uint64_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)102int32_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)119int32_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