From 8e0e00d21146a84c18f9cf9409e187b4fb0248aa Mon Sep 17 00:00:00 2001 From: Riku Nomoto Date: Thu, 19 Nov 2020 12:45:32 +0900 Subject: Init basesystem source codes. Signed-off-by: Riku Nomoto Change-Id: I55aa2f1406ce7f751ae14140b613b53b68995528 --- .../library/src/_pbWaitforsingleobject.cpp | 358 +++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100755 vehicleservice/positioning_base_library/library/src/_pbWaitforsingleobject.cpp (limited to 'vehicleservice/positioning_base_library/library/src/_pbWaitforsingleobject.cpp') diff --git a/vehicleservice/positioning_base_library/library/src/_pbWaitforsingleobject.cpp b/vehicleservice/positioning_base_library/library/src/_pbWaitforsingleobject.cpp new file mode 100755 index 0000000..2111b3a --- /dev/null +++ b/vehicleservice/positioning_base_library/library/src/_pbWaitforsingleobject.cpp @@ -0,0 +1,358 @@ +/* + * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/**************************************************************************** +@file waitforsingleobject.cpp +@detail Functions that implement waitforsingleobject in PosixBasedOS001
+ Functions to register/delete a table to determine the handle and its type +*****************************************************************************/ + +#include "_pbWaitforsingleobject.h" +#include +#include "WPF_STD_private.h" +#include "_pbInternalProc.h" + +typedef struct HandleTypeTable { + HANDLE h_handle; /* Registration handle */ + HANDLE_KIND l_kind; /* Type of Mutex/Semaphre/Event... */ + struct HandleTypeTable *next; +} HANDLE_TYPE; + +static HANDLE_TYPE *g_pst_handle_kind_table = NULL; +static pthread_mutex_t g_func_lock_mutex = PTHREAD_MUTEX_INITIALIZER; /* Consider replacing it later */ + +/* Prototype declarations */ +static BOOL FindList(HANDLE_TYPE **p_list, HANDLE h_obj); +static BOOL AddList(HANDLE_TYPE *p_add_list); +static BOOL DelList(HANDLE_TYPE *h_del_obj); +static BOOL FunctionLock(void); +static BOOL FunctionUnlock(void); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* Public APIs +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* _sys Internally Used APIs +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/**************************************************************************** +@brief WaitObjectInit
+ Initialization processing for each process +@outline WaitObjectInit
+ Initialization processing for each process +@type Completion return type +@return BOOL +@retval TRUE : Normal +@retval FALSE : Error +*****************************************************************************/ +BOOL WaitObjectInit(void) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + g_pst_handle_kind_table = NULL; + return TRUE; +} +// LCOV_EXCL_STOP + +/**************************************************************************** +@brief WaitObjectTerm
+ Termination processing for each process +@outline WaitObjectTerm
+ Termination processing for each process +@type Completion return type +@return BOOL +@retval TRUE : Normal +@retval FALSE : Error +*****************************************************************************/ +BOOL WaitObjectTerm(void) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + if (NULL != g_pst_handle_kind_table) { + /* Should be Deleted a List? */ + } + return TRUE; +} +// LCOV_EXCL_STOP + +/**************************************************************************** +@brief WaitObjectAdd
+ Register a handle and a handle-type in a list +@outline WaitObjectAdd
+ Register a handle and a handle-type in a list +@type Completion return type +@param[in] HANDLE h_obj : Handle to register +@param[in] HANDLE_KIND l_kind : Handle type + +@return BOOL +@retval TRUE : Normal + FALSE : Error +*****************************************************************************/ +BOOL WaitObjectAdd(HANDLE h_obj, HANDLE_KIND l_kind) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + BOOL bret = FALSE; + HANDLE_TYPE *p_add_list = NULL; + + if ((NULL != h_obj) + && (PB_HANDLE_INVAL < l_kind) + && (PB_HANDLE_KIND_MAX > l_kind)) { + FunctionLock(); + bret = FindList(&p_add_list, h_obj); + if (TRUE == bret) { + /* Handle already registered */ + if (l_kind == p_add_list->l_kind) { + /* re-register the same item */ + bret = TRUE; + } else { + /* An attempt was made to re-register the same handle with different type */ + bret = FALSE; /** Consider whether to win or not later */ + } + } else { + p_add_list = reinterpret_cast(malloc(sizeof(HANDLE_TYPE))); + if (NULL == p_add_list) { + /* Memory acquisition failed */ + bret = FALSE; + } else { + memset(p_add_list, 0, sizeof(HANDLE_TYPE)); + p_add_list->h_handle = h_obj; + p_add_list->l_kind = l_kind; + p_add_list->next = NULL; + bret = AddList(p_add_list); + if (FALSE == bret) { + /* Registration failure */ + free(p_add_list); + bret = FALSE; + } else { + bret = TRUE; + } + } + } + + FunctionUnlock(); + + } else { + bret = FALSE; /** Parameter error */ + } + return bret; +} +// LCOV_EXCL_STOP + +/**************************************************************************** +@brief WaitObjectDel
+ Remove handle and handle-type from the list +@outline WaitObjectDel
+ Remove handle and handle-type from the list +@type Completion return type +@param[in] HANDLE h_obj : Handle to delete + +@return BOOL +@retval TRUE : Normal + FALSE : Error +*****************************************************************************/ +BOOL WaitObjectDel(HANDLE h_obj) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + BOOL bret = FALSE; + HANDLE_TYPE *p_del_list = NULL; + + if (NULL != h_obj) { + FunctionLock(); + bret = FindList(&p_del_list, h_obj); + if (TRUE == bret) { + /* handle already registered */ + if (TRUE == DelList(p_del_list)) { + free(p_del_list); + bret = TRUE; + } else { + bret = FALSE; + } + } else { + bret = FALSE; /* no handles */ + } + + FunctionUnlock(); + + } else { + bret = FALSE; /* Parameter error */ + } + return bret; +} +// LCOV_EXCL_STOP + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* Private API +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/**************************************************************************** +@brief FindList
+ Searching for a Handle in the List +@outline FindList
+ Searching for a Handle in the List +@type Completion return type +@param[out] HANDLE_TYPE** p_list : Found list pointer +@param[in] HANDLE h_obj : Handle to look for + +@return BOOL +@retval TRUE : Normal (p_list != NULL) + FALSE : Error (p_list == NULL) +*****************************************************************************/ +static BOOL FindList(HANDLE_TYPE **p_list, HANDLE h_obj) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + HANDLE_TYPE *p_now = NULL; + BOOL bret = FALSE; + + if ((NULL != h_obj) && (NULL != p_list)) { + /* Search list */ + p_now = g_pst_handle_kind_table; + while (NULL != p_now) { + /* h_obj and p_now->h_handle are pointer type.*/ + if ((int64_t)h_obj == (int64_t)p_now->h_handle) { + *p_list = p_now; + bret = TRUE; + break; + } + p_now = p_now->next; + } + } else { + bret = FALSE; /** Parameter error */ + } + + return bret; +} +// LCOV_EXCL_STOP + +/**************************************************************************** +@brief AddList
+ Append data to the end of the list +@outline AddList
+ Append data to the end of the list +@type Completion return type +@param[in] HANDLE_TYPE* p_list : Data to add + +@return BOOL +@retval TRUE : Normal + FALSE : Error +*****************************************************************************/ +static BOOL AddList(HANDLE_TYPE *p_add_list) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + HANDLE_TYPE *p_now = NULL; + BOOL bret = FALSE; + + if (NULL != p_add_list) { + /* Add unregistered data */ + if (NULL == g_pst_handle_kind_table) { + g_pst_handle_kind_table = p_add_list; + bret = TRUE; + } else { + /* Add to end of list */ + p_now = g_pst_handle_kind_table; + while (NULL != p_now) { + if (NULL == p_now->next) { + p_now->next = p_add_list; + bret = TRUE; + break; + } + p_now = p_now->next; + } + } + } else { + bret = FALSE; /** Parameter error */ + } + + return bret; +} +// LCOV_EXCL_STOP + +/**************************************************************************** +@brief DelList
+ Remove specified data from a List +@outline DelList
+ Remove specified data from a List +@type Completion return type +@param[in,out] HANDLE_TYPE* h_del_obj : + +@return BOOL +@retval TRUE : Normal + FALSE : End +*****************************************************************************/ +static BOOL DelList(HANDLE_TYPE *h_del_obj) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + HANDLE_TYPE *p_now = NULL; + HANDLE_TYPE *pBef = NULL; + BOOL bret = FALSE; + + if (NULL != h_del_obj) { + /* Add to end of list */ + p_now = g_pst_handle_kind_table; + while (NULL != p_now) { + if (h_del_obj == p_now) { + if (NULL == pBef) { + /* Delete first */ + g_pst_handle_kind_table = p_now->next; + } else { + /* Others */ + pBef->next = h_del_obj->next; + } + bret = TRUE; + break; + } + pBef = p_now; + p_now = p_now->next; + } + } else { + bret = FALSE; /** Parameter error */ + } + + return bret; +} +// LCOV_EXCL_STOP + +/**************************************************************************** +@brief FunctionLock
+ Start locking of g_pst_handle_kind_table +@outline FunctionLock
+ Start locking of g_pst_handle_kind_table +@type Completion return type +@return BOOL +@retval TRUE : Normal +@retval FALSE : Error +*****************************************************************************/ +static BOOL FunctionLock(void) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + BOOL bret = FALSE; + if (EOK == pthread_mutex_lock(&g_func_lock_mutex)) { + bret = TRUE; + } + return bret; +} +// LCOV_EXCL_STOP + +/**************************************************************************** +@brief FunctionUnlock
+ Terminate locking of g_pst_handle_kind_table +@outline FunctionUnlock
+ Terminate locking of g_pst_handle_kind_table +@type Completion return type +@return BOOL +@retval TRUE : Normal +@retval FALSE : Error +*****************************************************************************/ +static BOOL FunctionUnlock(void) { // LCOV_EXCL_START 8:dead code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + BOOL bret = FALSE; + if (EOK == pthread_mutex_unlock(&g_func_lock_mutex)) { + bret = TRUE; + } + return bret; +} +// LCOV_EXCL_STOP + -- cgit 1.2.3-korg