diff --git a/kal/posix/BUILD.gn b/kal/posix/BUILD.gn index 2c2a676642f469e136bdd68b7475ae3b2bf66d85..81a5ccaf85e968abcb1006d045edca32990ad2f2 100644 --- a/kal/posix/BUILD.gn +++ b/kal/posix/BUILD.gn @@ -35,6 +35,7 @@ kernel_module(module_name) { sources = [ "src/errno.c", "src/libc.c", + "src/map_error.c", ] configs += [ "$LITEOSTOPDIR:warn_config" ] diff --git a/kal/posix/src/map_error.c b/kal/posix/src/map_error.c new file mode 100644 index 0000000000000000000000000000000000000000..5a2a9578d70a78e453ba6714562d0af286faa60c --- /dev/null +++ b/kal/posix/src/map_error.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "los_mux.h" +#include "los_queue.h" +#include "los_sem.h" +#include "los_task.h" +#include + +INT32 map_errno(UINT32 err) +{ + if (err == LOS_OK) { + return 0; + } + switch (err) { + case LOS_ERRNO_QUEUE_INVALID: + case LOS_ERRNO_QUEUE_WRITE_PTR_NULL: + case LOS_ERRNO_QUEUE_WRITESIZE_ISZERO: + case LOS_ERRNO_QUEUE_SIZE_TOO_BIG: + case LOS_ERRNO_QUEUE_CREAT_PTR_NULL: + case LOS_ERRNO_QUEUE_PARA_ISZERO: + case LOS_ERRNO_QUEUE_WRITE_SIZE_TOO_BIG: + case LOS_ERRNO_TSK_ID_INVALID: + case LOS_ERRNO_TSK_PTR_NULL: + case LOS_ERRNO_TSK_NAME_EMPTY: + case LOS_ERRNO_TSK_ENTRY_NULL: + case LOS_ERRNO_TSK_PRIOR_ERROR: + case LOS_ERRNO_TSK_STKSZ_TOO_LARGE: + case LOS_ERRNO_TSK_STKSZ_TOO_SMALL: + case LOS_ERRNO_TSK_NOT_CREATED: + case OS_ERROR: + case LOS_ERRNO_SEM_INVALID: + case LOS_ERRNO_SEM_UNAVAILABLE: + errno = EINVAL; + break; + case LOS_ERRNO_QUEUE_ISFULL: + case LOS_ERRNO_QUEUE_ISEMPTY: + errno = EAGAIN; + break; + case LOS_ERRNO_QUEUE_CREATE_NO_MEMORY: + case LOS_ERRNO_TSK_TCB_UNAVAILABLE: + case LOS_ERRNO_SEM_ALL_BUSY: + errno = ENOSPC; + break; + case LOS_ERRNO_QUEUE_TIMEOUT: + case LOS_ERRNO_SEM_TIMEOUT: + errno = ETIMEDOUT; + break; + case LOS_ERRNO_QUEUE_CB_UNAVAILABLE: + errno = ENFILE; + break; + case LOS_ERRNO_QUEUE_READ_IN_INTERRUPT: + case LOS_ERRNO_QUEUE_WRITE_IN_INTERRUPT: + case LOS_ERRNO_SEM_PEND_INTERR: + errno = EINTR; + break; + case LOS_ERRNO_TSK_NO_MEMORY: + case LOS_ERRNO_SEM_OVERFLOW: + errno = ENOMEM; + break; + case LOS_ERRNO_SEM_PENDED: + errno = EBUSY; + break; + case LOS_ERRNO_SEM_PEND_IN_LOCK: + errno = EPERM; + break; + default: + errno = EINVAL; + break; + } + return errno; +} + diff --git a/kal/posix/src/map_error.h b/kal/posix/src/map_error.h new file mode 100644 index 0000000000000000000000000000000000000000..0afe80defbec3ad224237246ad940a4829441976 --- /dev/null +++ b/kal/posix/src/map_error.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _POSIX_MAP_ERROR_H +#define _POSIX_MAP_ERROR_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +INT32 map_errno(UINT32 err); + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif diff --git a/kal/posix/src/pthread.c b/kal/posix/src/pthread.c index e365842efeb72a719b4a2979e0f4eece25b2029a..695eb1edcdf65dc8931ce8ad5e4960da264760c6 100644 --- a/kal/posix/src/pthread.c +++ b/kal/posix/src/pthread.c @@ -40,6 +40,7 @@ #include "los_config.h" #include "los_task.h" #include "los_debug.h" +#include "map_error.h" #define PTHREAD_DEFAULT_NAME "pthread" #define PTHREAD_DEFAULT_NAME_LEN 8 @@ -207,9 +208,10 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr, return ret; } - if (LOS_TaskCreateOnly(&taskID, &taskInitParam) != LOS_OK) { + ret = LOS_TaskCreateOnly(&taskID, &taskInitParam); + if (ret != LOS_OK) { free((VOID *)(UINTPTR)taskInitParam.uwArg); - return EINVAL; + return map_errno(ret); } PthreadData *pthreadData = (PthreadData *)taskInitParam.uwArg;