From 2562b1f8f0c7b6da3304f13628e0c09d4e77fce2 Mon Sep 17 00:00:00 2001 From: astrogeco <59618057+astrogeco@users.noreply.github.com> Date: Tue, 3 Nov 2020 14:59:23 -0500 Subject: [PATCH 001/111] Bump to v5.1.0-rc1+dev68 and update ReadMe Small edit to REVISION version comment in osapi-version.h --- README.md | 12 ++++++++++++ src/os/inc/osapi-version.h | 7 +++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dac9b1f06..69ce4e7ed 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,18 @@ The autogenerated OSAL user's guide can be viewed at + ### Development Build: 5.1.0-rc1+dev60 - Appliy standard formating, whitespace-only changes diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index 26adec058..98d95a4a8 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 60 +#define OS_BUILD_NUMBER 67 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* @@ -38,9 +38,8 @@ */ #define OS_MAJOR_VERSION 5 /*!< @brief ONLY APPLY for OFFICIAL releases. Major version number. */ #define OS_MINOR_VERSION 0 /*!< @brief ONLY APPLY for OFFICIAL releases. Minor version number. */ -#define OS_REVISION \ - 99 /*!< @brief ONLY APPLY for OFFICIAL releases. Revision version number. If set to "99" it indicates a \ - development version. */ +#define OS_REVISION 99 /*!< @brief ONLY APPLY for OFFICIAL releases. Revision version number. A value of "99" indicates an unreleased development version. */ + #define OS_MISSION_REV 0 /*!< @brief ONLY USED by MISSION Implementations. Mission revision */ /* From ba6375cc6c156e9b45c5d89b89e16f952af5f99b Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 2 Nov 2020 11:58:38 -0500 Subject: [PATCH 002/111] Fix #637, static module unload fix Mark static modules with a different type, and check that type at unload. Only call unload low level implementation if type is dynamic. --- src/os/shared/inc/os-shared-module.h | 16 ++++++++++++---- src/os/shared/src/osapi-module.c | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/os/shared/inc/os-shared-module.h b/src/os/shared/inc/os-shared-module.h index 3c93c2345..4ce5386d4 100644 --- a/src/os/shared/inc/os-shared-module.h +++ b/src/os/shared/inc/os-shared-module.h @@ -30,12 +30,20 @@ #include +typedef enum +{ + OS_MODULE_TYPE_UNKNOWN = 0, /**< Default/unspecified (reserved value) */ + OS_MODULE_TYPE_DYNAMIC = 1, /**< Module is dynamically loaded via the OS loader */ + OS_MODULE_TYPE_STATIC = 2 /**< Module is statically linked and is a placeholder */ +} OS_module_type_t; + typedef struct { - char module_name[OS_MAX_API_NAME]; - char file_name[OS_MAX_PATH_LEN]; - uint32 flags; - cpuaddr entry_point; + char module_name[OS_MAX_API_NAME]; + char file_name[OS_MAX_PATH_LEN]; + OS_module_type_t module_type; + uint32 flags; + cpuaddr entry_point; } OS_module_internal_record_t; /* diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 8b690e7d4..3f4c2af1d 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -232,7 +232,12 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f * returns OS_ERR_NAME_NOT_FOUND. */ return_code = OS_ModuleLoad_Static(module_name); - if (return_code != OS_SUCCESS) + if (return_code == OS_SUCCESS) + { + /* mark this as a statically loaded module */ + OS_module_table[local_id].module_type = OS_MODULE_TYPE_STATIC; + } + else { /* * If this is NOT a static module, then the module file must be loaded by normal @@ -248,6 +253,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f { /* supplied filename was valid, so store a copy for future reference */ strncpy(OS_module_table[local_id].file_name, filename, OS_MAX_PATH_LEN); + OS_module_table[local_id].module_type = OS_MODULE_TYPE_DYNAMIC; /* Now call the OS-specific implementation. This reads info from the module table. */ return_code = OS_ModuleLoad_Impl(local_id, translated_path); @@ -280,9 +286,14 @@ int32 OS_ModuleUnload(osal_id_t module_id) if (return_code == OS_SUCCESS) { /* - * Only call the implementation if the loader is enabled + * Only call the implementation if the file was actually loaded. + * If this is a static module, then this is just a placeholder and + * it means there was no file actually loaded. */ - return_code = OS_ModuleUnload_Impl(local_id); + if (OS_module_table[local_id].module_type == OS_MODULE_TYPE_DYNAMIC) + { + return_code = OS_ModuleUnload_Impl(local_id); + } /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, record); From c70936eadfe1ff963a2d55d2d7d5e70e87207972 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Wed, 4 Nov 2020 10:06:25 -0500 Subject: [PATCH 003/111] Fix #641, add flags to OS_ModuleLoad Add flags to indicate symbol visibility for OS_ModuleLoad(). By default (flags=0) symbols will have global visibility, which should be the same as existing behavior. --- src/os/inc/osapi-os-loader.h | 59 ++++++++++++- src/os/portable/os-impl-no-symtab.c | 20 ++++- src/os/portable/os-impl-posix-dl-loader.c | 31 ++++++- src/os/portable/os-impl-posix-dl-symtab.c | 81 ++++++++++++++---- src/os/shared/inc/os-shared-module.h | 16 +++- src/os/shared/src/osapi-module.c | 80 +++++++++++++---- src/os/vxworks/src/os-impl-symtab.c | 44 +++++++++- .../shared/adaptors/inc/ut-adaptor-module.h | 2 +- .../shared/adaptors/src/ut-adaptor-module.c | 4 +- .../shared/src/coveragetest-module.c | 40 ++++++--- .../ut-stubs/src/osapi-loader-impl-stubs.c | 3 +- .../vxworks/src/coveragetest-symtab.c | 28 ++++-- .../osloader-test/ut_osloader_module_test.c | 22 ++--- .../osloader-test/ut_osloader_symtable_test.c | 85 ++++++++++++++++++- .../osloader-test/ut_osloader_symtable_test.h | 1 + .../osloader-test/ut_osloader_test.c | 1 + src/ut-stubs/osapi-utstub-module.c | 36 +++++++- 17 files changed, 473 insertions(+), 80 deletions(-) diff --git a/src/os/inc/osapi-os-loader.h b/src/os/inc/osapi-os-loader.h index 811bc4cef..e71801427 100644 --- a/src/os/inc/osapi-os-loader.h +++ b/src/os/inc/osapi-os-loader.h @@ -34,6 +34,44 @@ ** Defines */ +/** + * @brief Requests OS_ModuleLoad() to add the symbols to the global symbol table + * + * When supplied as the "flags" argument to OS_ModuleLoad(), this indicates + * that the symbols in the loaded module should be added to the global symbol + * table. This will make symbols in this library available for use when + * resolving symbols in future module loads. + * + * This is the default mode of operation for OS_ModuleLoad(). + * + * @note On some operating systems, use of this option may make it difficult + * to unload the module in the future, if the symbols are in use by other entities. + * + */ +#define OS_MODULE_FLAG_GLOBAL_SYMBOLS 0x00 + +/** + * @brief Requests OS_ModuleLoad() to keep the symbols local/private to this module + * + * When supplied as the "flags" argument to OS_ModuleLoad(), this indicates + * that the symbols in the loaded module should NOT be added to the global + * symbol table. This means the symbols in the loaded library will not available + * to for use by other modules. + * + * Use this option is recommended for cases where no other entities will need + * to reference symbols within this module. This helps ensure that the module + * can be more safely unloaded in the future, by preventing other modules from + * binding to it. It also helps reduce the likelihood of symbol name conflicts + * among modules. + * + * @note To look up symbols within a module loaded with this flag, use + * OS_SymbolLookupInModule() instead of OS_SymbolLookup(). Also note that + * references obtained using this method are not tracked by the OS; the + * application must ensure that all references obtained in this manner have + * been cleaned up/released before unloading the module. + */ +#define OS_MODULE_FLAG_LOCAL_SYMBOLS 0x01 + /* ** Typedefs */ @@ -105,6 +143,25 @@ typedef const struct */ int32 OS_SymbolLookup(cpuaddr *symbol_address, const char *symbol_name); +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find the Address of a Symbol within a module + * + * This is similar to OS_SymbolLookup() but for a specific module ID. + * This should be used to look up a symbol in a module that has been + * loaded with the #OS_MODULE_FLAG_LOCAL_SYMBOLS flag. + * + * @param[in] module_id Module ID that should contain the symbol + * @param[out] symbol_address Set to the address of the symbol + * @param[in] symbol_name Name of the symbol to look up + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the symbol could not be found + * @retval #OS_INVALID_POINTER if one of the pointers passed in are NULL + */ +int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *SymbolAddress, const char *SymbolName); + /*-------------------------------------------------------------------------------------*/ /** * @brief Dumps the system symbol table to a file @@ -138,7 +195,7 @@ int32 OS_SymbolTableDump(const char *filename, uint32 size_limit); * @retval #OS_ERR_NO_FREE_IDS if the module table is full * @retval #OS_ERR_NAME_TAKEN if the name is in use */ -int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename); +int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename, uint32 flags); /*-------------------------------------------------------------------------------------*/ /** diff --git a/src/os/portable/os-impl-no-symtab.c b/src/os/portable/os-impl-no-symtab.c index fb602ecae..72fe4f1b2 100644 --- a/src/os/portable/os-impl-no-symtab.c +++ b/src/os/portable/os-impl-no-symtab.c @@ -32,17 +32,31 @@ /*---------------------------------------------------------------- * - * Function: OS_SymbolLookup_Impl + * Function: OS_GlobalSymbolLookup_Impl * * Purpose: Implemented per internal OSAL API * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SymbolLookup_Impl */ +} /* end OS_GlobalSymbolLookup_Impl */ + +/*---------------------------------------------------------------- + * + * Function: OS_ModuleSymbolLookup_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName) +{ + return OS_ERR_NOT_IMPLEMENTED; + +} /* end OS_ModuleSymbolLookup_Impl */ /*---------------------------------------------------------------- * diff --git a/src/os/portable/os-impl-posix-dl-loader.c b/src/os/portable/os-impl-posix-dl-loader.c index 55aa9ac3c..a946eb65a 100644 --- a/src/os/portable/os-impl-posix-dl-loader.c +++ b/src/os/portable/os-impl-posix-dl-loader.c @@ -64,9 +64,38 @@ int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) { int32 status = OS_ERROR; + int dl_mode; + + /* + * RTLD_NOW should instruct dlopen() to resolve all the symbols in the + * module immediately, as opposed to waiting until they are used. + * The latter (lazy mode) is non-deterministic - a resolution error on + * a rarely-used symbol could cause a random failure far in the future. + */ + dl_mode = RTLD_NOW; + + if ((OS_module_table[module_id].flags & OS_MODULE_FLAG_LOCAL_SYMBOLS) != 0) + { + /* + * Do not add the symbols in this module to the global symbol table. + * This mode helps prevent any unanticipated references into this + * module, which can in turn prevent unloading via dlclose(). + */ + dl_mode |= RTLD_LOCAL; + } + else + { + /* + * Default mode - add symbols to the global symbol table, so they + * will be available to resolve symbols in future module loads. + * However, any such references will prevent unloading of this + * module via dlclose(). + */ + dl_mode |= RTLD_GLOBAL; + } dlerror(); - OS_impl_module_table[module_id].dl_handle = dlopen(translated_path, RTLD_NOW | RTLD_GLOBAL); + OS_impl_module_table[module_id].dl_handle = dlopen(translated_path, dl_mode); if (OS_impl_module_table[module_id].dl_handle != NULL) { status = OS_SUCCESS; diff --git a/src/os/portable/os-impl-posix-dl-symtab.c b/src/os/portable/os-impl-posix-dl-symtab.c index 98d861e55..8ed33bf53 100644 --- a/src/os/portable/os-impl-posix-dl-symtab.c +++ b/src/os/portable/os-impl-posix-dl-symtab.c @@ -60,16 +60,12 @@ * Otherwise, check if the C library provides an "RTLD_DEFAULT" symbol - * This symbol is not POSIX standard but many implementations do provide it. * - * Lastly, if nothing else works, use NULL. This is technically undefined - * behavior per POSIX, but most implementations do seem to interpret this - * as referring to the complete process (base executable + all loaded modules). + * Lastly, if nothing no special handle that indicates the global symbol + * table is defined, then OS_GlobalSymbolLookup_Impl() will return + * OS_ERR_NOT_IMPLEMENTED rather than relying on undefined behavior. */ -#ifndef OSAL_DLSYM_DEFAULT_HANDLE -#ifdef RTLD_DEFAULT -#define OSAL_DLSYM_DEFAULT_HANDLE RTLD_DEFAULT -#else -#define OSAL_DLSYM_DEFAULT_HANDLE NULL -#endif +#if !defined(OSAL_DLSYM_GLOBAL_HANDLE) && defined(RTLD_DEFAULT) +#define OSAL_DLSYM_GLOBAL_HANDLE RTLD_DEFAULT #endif /**************************************************************************************** @@ -78,23 +74,25 @@ /*---------------------------------------------------------------- * - * Function: OS_SymbolLookup_Impl + * Function: OS_GenericSymbolLookup_Impl * * Purpose: Implemented per internal OSAL API * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_GenericSymbolLookup_Impl(void *dl_handle, cpuaddr *SymbolAddress, const char *SymbolName) { - int32 status = OS_ERROR; const char *dlError; /* Pointer to error string */ - void * Function; + void *Function; + int32 status; + + status = OS_ERROR; /* * call dlerror() to clear any prior error that might have occurred. */ dlerror(); - Function = dlsym(OSAL_DLSYM_DEFAULT_HANDLE, SymbolName); + Function = dlsym(dl_handle, SymbolName); dlError = dlerror(); /* @@ -110,16 +108,65 @@ int32 OS_SymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) * and as such all valid symbols should be non-NULL, so NULL is considered * an error even if the C library doesn't consider this an error. */ - if (dlError == NULL && Function != NULL) + if (dlError != NULL) + { + OS_DEBUG("Error: %s: %s\n", SymbolName, dlError); + } + else if (Function == NULL) { - *SymbolAddress = (cpuaddr)Function; - status = OS_SUCCESS; + /* technically not an error per POSIX, but in practice should not happen */ + OS_DEBUG("Error: %s: dlsym() returned NULL\n", SymbolName); + } + else + { + status = OS_SUCCESS; } + *SymbolAddress = (cpuaddr)Function; + + return status; +} + +/*---------------------------------------------------------------- + * + * Function: OS_GlobalSymbolLookup_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) +{ + int32 status; + +#ifdef OSAL_DLSYM_DEFAULT_HANDLE + status = OS_GenericSymbolLookup_Impl(OSAL_DLSYM_DEFAULT_HANDLE, SymbolAddress, SymbolName); +#else + status = OS_ERR_NOT_IMPLEMENTED; +#endif + return status; } /* end OS_SymbolLookup_Impl */ +/*---------------------------------------------------------------- + * + * Function: OS_ModuleSymbolLookup_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName) +{ + int32 status; + + status = OS_GenericSymbolLookup_Impl(OS_impl_module_table[local_id].dl_handle, SymbolAddress, SymbolName); + + return status; + +} /* end OS_ModuleSymbolLookup_Impl */ + /*---------------------------------------------------------------- * * Function: OS_SymbolTableDump_Impl diff --git a/src/os/shared/inc/os-shared-module.h b/src/os/shared/inc/os-shared-module.h index 3c93c2345..37b766e07 100644 --- a/src/os/shared/inc/os-shared-module.h +++ b/src/os/shared/inc/os-shared-module.h @@ -85,15 +85,25 @@ int32 OS_ModuleUnload_Impl(uint32 module_id); ------------------------------------------------------------------*/ int32 OS_ModuleGetInfo_Impl(uint32 module_id, OS_module_prop_t *module_prop); +/*---------------------------------------------------------------- + Function: OS_GlobalSymbolLookup_Impl + + Purpose: Find the Address of a Symbol in the global symbol table. + The address of the symbol will be stored in the pointer that is passed in. + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName); + /*---------------------------------------------------------------- Function: OS_SymbolLookup_Impl - Purpose: Find the Address of a Symbol + Purpose: Find the Address of a Symbol within a specific module. The address of the symbol will be stored in the pointer that is passed in. Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName); +int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName); /*---------------------------------------------------------------- Function: OS_SymbolTableDump_Impl @@ -109,6 +119,6 @@ int32 OS_SymbolTableDump_Impl(const char *filename, uint32 size_limit); * These need to be exposed for unit testing */ int32 OS_ModuleLoad_Static(const char *ModuleName); -int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName); +int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName); #endif /* INCLUDE_OS_SHARED_MODULE_H_ */ diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 8b690e7d4..0487fa5da 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -90,7 +90,7 @@ extern OS_static_symbol_record_t OS_STATIC_SYMTABLE_SOURCE[]; * Checks for a symbol name in the static symbol table * *-----------------------------------------------------------------*/ -int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName) { int32 return_code = OS_ERR_NOT_IMPLEMENTED; OS_static_symbol_record_t *StaticSym = OS_STATIC_SYMTABLE_SOURCE; @@ -105,7 +105,8 @@ int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName) return_code = OS_ERROR; break; } - if (strcmp(StaticSym->Name, SymbolName) == 0) + if (strcmp(StaticSym->Name, SymbolName) == 0 && + (ModuleName == NULL || strcmp(StaticSym->Module, ModuleName) == 0)) { /* found matching symbol */ *SymbolAddress = (cpuaddr)StaticSym->Address; @@ -178,7 +179,7 @@ int32 OS_ModuleAPI_Init(void) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename) +int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename, uint32 flags) { char translated_path[OS_MAX_LOCAL_PATH_LEN]; int32 return_code; @@ -220,6 +221,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f memset(&OS_module_table[local_id], 0, sizeof(OS_module_internal_record_t)); strncpy(OS_module_table[local_id].module_name, module_name, OS_MAX_API_NAME); record->name_entry = OS_module_table[local_id].module_name; + OS_module_table[local_id].flags = flags; /* save user-supplied flags */ /* * Check the statically-linked module list. @@ -339,7 +341,7 @@ int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_prop) int32 OS_SymbolLookup(cpuaddr *SymbolAddress, const char *SymbolName) { int32 return_code; - int32 status; + int32 staticsym_status; /* ** Check parameters @@ -350,10 +352,9 @@ int32 OS_SymbolLookup(cpuaddr *SymbolAddress, const char *SymbolName) } /* - * if the module loader is included, then call the - * OS symbol lookup implementation function first. + * attempt to find the symbol in the global symbol table. */ - return_code = OS_SymbolLookup_Impl(SymbolAddress, SymbolName); + return_code = OS_GlobalSymbolLookup_Impl(SymbolAddress, SymbolName); /* * If the OS call did not find the symbol or the loader is @@ -361,20 +362,15 @@ int32 OS_SymbolLookup(cpuaddr *SymbolAddress, const char *SymbolName) */ if (return_code != OS_SUCCESS) { - status = OS_SymbolLookup_Static(SymbolAddress, SymbolName); + staticsym_status = OS_SymbolLookup_Static(SymbolAddress, SymbolName, NULL); /* - * NOTE: - * The OS_ERR_NOT_IMPLEMENTED code should only be returned - * if _neither_ the SymbolLookup_Impl _nor_ the static table - * lookup capabilities are implemented. - * - * If either of these are implemented then the returned - * value should be OS_ERROR for a not-found result. + * Only overwrite the return code if static lookup was successful. + * Otherwise keep the error code from the low level implementation. */ - if (status == OS_SUCCESS || return_code == OS_ERR_NOT_IMPLEMENTED) + if (staticsym_status == OS_SUCCESS) { - return_code = status; + return_code = staticsym_status; } } @@ -382,6 +378,56 @@ int32 OS_SymbolLookup(cpuaddr *SymbolAddress, const char *SymbolName) } /* end OS_SymbolLookup */ +/*---------------------------------------------------------------- + * + * Function: OS_ModuleSymbolLookup + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *SymbolAddress, const char *SymbolName) +{ + int32 return_code; + int32 staticsym_status; + OS_common_record_t *record; + uint32 local_id; + + /* + ** Check parameters + */ + if ((SymbolAddress == NULL) || (SymbolName == NULL)) + { + return (OS_INVALID_POINTER); + } + + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, module_id, &local_id, &record); + if (return_code == OS_SUCCESS) + { + return_code = OS_ModuleSymbolLookup_Impl(local_id, SymbolAddress, SymbolName); + if (return_code != OS_SUCCESS) + { + /* look for a static symbol that also matches this module name */ + staticsym_status = OS_SymbolLookup_Static(SymbolAddress, SymbolName, record->name_entry); + + /* + * Only overwrite the return code if static lookup was successful. + * Otherwise keep the error code from the low level implementation. + */ + if (staticsym_status == OS_SUCCESS) + { + return_code = staticsym_status; + } + } + OS_Unlock_Global(LOCAL_OBJID_TYPE); + } + + return (return_code); + +} /* end OS_ModuleSymbolLookup */ + + + /*---------------------------------------------------------------- * * Function: OS_SymbolTableDump diff --git a/src/os/vxworks/src/os-impl-symtab.c b/src/os/vxworks/src/os-impl-symtab.c index d3ebaf85a..31b2db5c4 100644 --- a/src/os/vxworks/src/os-impl-symtab.c +++ b/src/os/vxworks/src/os-impl-symtab.c @@ -64,13 +64,13 @@ extern SYMTAB_ID sysSymTbl; /*---------------------------------------------------------------- * - * Function: OS_SymbolLookup_Impl + * Function: OS_GenericSymbolLookup_Impl * * Purpose: Implemented per internal OSAL API * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_GenericSymbolLookup_Impl(SYMTAB_ID SymTab, cpuaddr *SymbolAddress, const char *SymbolName) { STATUS vxStatus; SYMBOL_DESC SymDesc; @@ -94,7 +94,7 @@ int32 OS_SymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) SymDesc.mask = SYM_FIND_BY_NAME; SymDesc.name = (char *)SymbolName; - vxStatus = symFind(sysSymTbl, &SymDesc); + vxStatus = symFind(SymTab, &SymDesc); *SymbolAddress = (cpuaddr)SymDesc.value; if (vxStatus == ERROR) @@ -104,7 +104,43 @@ int32 OS_SymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) return (OS_SUCCESS); -} /* end OS_SymbolLookup_Impl */ +} /* end OS_GenericSymbolLookup_Impl */ + +/*---------------------------------------------------------------- + * + * Function: OS_GlobalSymbolLookup_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) +{ + return OS_GenericSymbolLookup_Impl(sysSymTbl, SymbolAddress, SymbolName); +} /* end OS_GlobalSymbolLookup_Impl */ + + +/*---------------------------------------------------------------- + * + * Function: OS_ModuleSymbolLookup_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName) +{ + /* + * NOTE: this is currently exactly the same as OS_GlobalSymbolLookup_Impl(). + * + * Ideally this should get a SYMTAB_ID from the MODULE_ID and search only + * for the symbols provided by that module - but it is not clear if vxWorks + * offers this capability. + */ + return OS_GenericSymbolLookup_Impl(sysSymTbl, SymbolAddress, SymbolName); +} /* end OS_ModuleSymbolLookup_Impl */ + + /*---------------------------------------------------------------- * diff --git a/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h b/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h index 354027f89..d65a2b2b3 100644 --- a/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h +++ b/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h @@ -49,7 +49,7 @@ void Osapi_Internal_ResetState(void); /* A dummy function for the static symbol lookup test. Not called */ void Test_DummyFunc(void); -int32 Osapi_Call_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName); +int32 Osapi_Call_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName); int32 Osapi_Call_ModuleLoad_Static(const char *ModuleName); #endif /* INCLUDE_UT_ADAPTOR_MODULE_H_ */ diff --git a/src/unit-test-coverage/shared/adaptors/src/ut-adaptor-module.c b/src/unit-test-coverage/shared/adaptors/src/ut-adaptor-module.c index 8963abdc7..1be553798 100644 --- a/src/unit-test-coverage/shared/adaptors/src/ut-adaptor-module.c +++ b/src/unit-test-coverage/shared/adaptors/src/ut-adaptor-module.c @@ -28,9 +28,9 @@ #include "ut-adaptor-module.h" #include "os-shared-module.h" -int32 Osapi_Call_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName) +int32 Osapi_Call_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName) { - return OS_SymbolLookup_Static(SymbolAddress, SymbolName); + return OS_SymbolLookup_Static(SymbolAddress, SymbolName, ModuleName); } int32 Osapi_Call_ModuleLoad_Static(const char *ModuleName) diff --git a/src/unit-test-coverage/shared/src/coveragetest-module.c b/src/unit-test-coverage/shared/src/coveragetest-module.c index 7cd0146b3..69d71290e 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-module.c +++ b/src/unit-test-coverage/shared/src/coveragetest-module.c @@ -68,7 +68,7 @@ void Test_OS_ModuleLoad(void) */ int32 expected = OS_SUCCESS; osal_id_t objid; - int32 actual = OS_ModuleLoad(&objid, "UT", "File"); + int32 actual = OS_ModuleLoad(&objid, "UT", "File", OS_MODULE_FLAG_GLOBAL_SYMBOLS); UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_SUCCESS", (long)actual); actual = UT_GetStubCount(UT_KEY(OS_ModuleLoad_Impl)); @@ -76,25 +76,32 @@ void Test_OS_ModuleLoad(void) OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); /* for a static module, it should also return a valid objid, but should NOT invoke OS_ModuleLoad_Impl */ - actual = OS_ModuleLoad(&objid, "UTS", "File2"); + actual = OS_ModuleLoad(&objid, "UTS", "File2", OS_MODULE_FLAG_GLOBAL_SYMBOLS); UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_SUCCESS", (long)actual); actual = UT_GetStubCount(UT_KEY(OS_ModuleLoad_Impl)); UtAssert_True(actual == 1, "OS_ModuleLoad_Impl() called (%ld) == 1", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); + /* a dynamic module with local symbols */ + actual = OS_ModuleLoad(&objid, "UT", "File3", OS_MODULE_FLAG_LOCAL_SYMBOLS); + UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_SUCCESS", (long)actual); + actual = UT_GetStubCount(UT_KEY(OS_ModuleLoad_Impl)); + UtAssert_True(actual == 2, "OS_ModuleLoad_Impl() called (%ld) == 2", (long)actual); + OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); + /* error cases */ - actual = OS_ModuleLoad(NULL, NULL, NULL); + actual = OS_ModuleLoad(NULL, NULL, NULL, OS_MODULE_FLAG_GLOBAL_SYMBOLS); expected = OS_INVALID_POINTER; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_INVALID_POINTER", (long)actual); UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); - actual = OS_ModuleLoad(&objid, "UTS", "File2"); + actual = OS_ModuleLoad(&objid, "UTS", "File2", OS_MODULE_FLAG_GLOBAL_SYMBOLS); expected = OS_ERR_NAME_TOO_LONG; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); UT_ResetState(UT_KEY(OCS_strlen)); UT_SetForceFail(UT_KEY(OS_TranslatePath), OS_ERROR); - actual = OS_ModuleLoad(&objid, "UT", "FileBad"); + actual = OS_ModuleLoad(&objid, "UT", "FileBad", OS_MODULE_FLAG_GLOBAL_SYMBOLS); expected = OS_ERROR; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_ERROR", (long)actual); } @@ -127,8 +134,8 @@ void Test_OS_SymbolLookup(void) actual = OS_SymbolLookup(&symaddr, "uttestsym0"); UtAssert_True(actual == expected, "OS_SymbolLookup(name=%s) (%ld) == OS_SUCCESS", "uttestsym0", (long)actual); - UT_ResetState(UT_KEY(OS_SymbolLookup_Impl)); - UT_SetForceFail(UT_KEY(OS_SymbolLookup_Impl), OS_ERROR); + UT_ResetState(UT_KEY(OS_GlobalSymbolLookup_Impl)); + UT_SetForceFail(UT_KEY(OS_GlobalSymbolLookup_Impl), OS_ERROR); /* this lookup should always fail */ symaddr = 0; @@ -167,8 +174,14 @@ void Test_OS_StaticSymbolLookup(void) cpuaddr addr; /* nominal */ - actual = OS_SymbolLookup_Static(&addr, "UT_staticsym"); - UtAssert_True(actual == expected, "OS_SymbolLookup_Static(name=%s) (%ld) == OS_SUCCESS", "Test_Func1", + actual = OS_SymbolLookup_Static(&addr, "UT_staticsym", NULL); + UtAssert_True(actual == expected, "OS_SymbolLookup_Static(name=%s, NULL) (%ld) == OS_SUCCESS", "Test_Func1", + (long)actual); + UtAssert_True(addr == (cpuaddr)&Test_DummyFunc, "OS_SymbolLookup_Static(address=%lx) == %lx", (unsigned long)addr, + (unsigned long)&Test_DummyFunc); + + actual = OS_SymbolLookup_Static(&addr, "UT_staticsym", "UTS"); + UtAssert_True(actual == expected, "OS_SymbolLookup_Static(name=%s, UTS) (%ld) == OS_SUCCESS", "Test_Func1", (long)actual); UtAssert_True(addr == (cpuaddr)&Test_DummyFunc, "OS_SymbolLookup_Static(address=%lx) == %lx", (unsigned long)addr, (unsigned long)&Test_DummyFunc); @@ -177,7 +190,14 @@ void Test_OS_StaticSymbolLookup(void) UtAssert_True(actual == expected, "OS_ModuleLoad_Static(name=%s) (%ld) == OS_SUCCESS", "UT", (long)actual); expected = OS_ERROR; - actual = OS_SymbolLookup_Static(&addr, "Invalid"); + actual = OS_SymbolLookup_Static(&addr, "UT_staticsym", "NoModuleMatch"); + UtAssert_True(actual == expected, "OS_SymbolLookup_Static(name=%s, NoModuleMatch) (%ld) == OS_ERROR", "Test_Func1", + (long)actual); + UtAssert_True(addr == (cpuaddr)&Test_DummyFunc, "OS_SymbolLookup_Static(address=%lx) == %lx", (unsigned long)addr, + (unsigned long)&Test_DummyFunc); + + expected = OS_ERROR; + actual = OS_SymbolLookup_Static(&addr, "Invalid", NULL); UtAssert_True(actual == expected, "OS_SymbolLookup_Static(name=%s) (%ld) == OS_ERROR", "Invalid", (long)actual); expected = OS_ERR_NAME_NOT_FOUND; diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c index 8c5d7aa77..621bcab7c 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c @@ -39,5 +39,6 @@ UT_DEFAULT_STUB(OS_ModuleLoad_Impl, (uint32 module_id, const char *translated_path)) UT_DEFAULT_STUB(OS_ModuleUnload_Impl, (uint32 module_id)) UT_DEFAULT_STUB(OS_ModuleGetInfo_Impl, (uint32 module_id, OS_module_prop_t *module_prop)) -UT_DEFAULT_STUB(OS_SymbolLookup_Impl, (cpuaddr * SymbolAddress, const char *SymbolName)) +UT_DEFAULT_STUB(OS_GlobalSymbolLookup_Impl, (cpuaddr * SymbolAddress, const char *SymbolName)) +UT_DEFAULT_STUB(OS_ModuleSymbolLookup_Impl, (uint32 module_id, cpuaddr * SymbolAddress, const char *SymbolName)) UT_DEFAULT_STUB(OS_SymbolTableDump_Impl, (const char *filename, uint32 size_limit)) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index 890fd480d..b2f107f08 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -33,16 +33,31 @@ #include #include -void Test_OS_SymbolLookup_Impl(void) +void Test_OS_GlobalSymbolLookup_Impl(void) { /* Test Case For: - * int32 OS_SymbolLookup_Impl( cpuaddr *SymbolAddress, const char *SymbolName ) + * int32 OS_GlobalSymbolLookup_Impl( cpuaddr *SymbolAddress, const char *SymbolName ) */ cpuaddr SymAddr; - OSAPI_TEST_FUNCTION_RC(OS_SymbolLookup_Impl(&SymAddr, "symname"), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_SymbolLookup_Impl(NULL, NULL), OS_INVALID_POINTER); + + OSAPI_TEST_FUNCTION_RC(OS_GlobalSymbolLookup_Impl(&SymAddr, "symname"), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_GlobalSymbolLookup_Impl(NULL, NULL), OS_INVALID_POINTER); + UT_SetForceFail(UT_KEY(OCS_symFind), OCS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GlobalSymbolLookup_Impl(&SymAddr, "symname"), OS_ERROR); + +} + +void Test_OS_ModuleSymbolLookup_Impl(void) +{ + /* Test Case For: + * int32 OS_ModuleSymbolLookup_Impl( uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName ) + */ + cpuaddr SymAddr; + + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(0, &SymAddr, "symname"), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(0, NULL, NULL), OS_INVALID_POINTER); UT_SetForceFail(UT_KEY(OCS_symFind), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_SymbolLookup_Impl(&SymAddr, "symname"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(0, &SymAddr, "symname"), OS_ERROR); } void Test_OS_SymTableIterator_Impl(void) @@ -101,6 +116,7 @@ void Osapi_Test_Teardown(void) {} void UtTest_Setup(void) { ADD_TEST(OS_SymTableIterator_Impl); - ADD_TEST(OS_SymbolLookup_Impl); + ADD_TEST(OS_GlobalSymbolLookup_Impl); + ADD_TEST(OS_ModuleSymbolLookup_Impl); ADD_TEST(OS_SymbolTableDump_Impl); } diff --git a/src/unit-tests/osloader-test/ut_osloader_module_test.c b/src/unit-tests/osloader-test/ut_osloader_module_test.c index ba8d6ffcc..9c5489097 100644 --- a/src/unit-tests/osloader-test/ut_osloader_module_test.c +++ b/src/unit-tests/osloader-test/ut_osloader_module_test.c @@ -79,7 +79,7 @@ void UT_os_module_load_test() /*-----------------------------------------------------*/ testDesc = "API Not implemented"; - res = OS_ModuleLoad(0, "TestModule", UT_OS_GENERIC_MODULE_NAME1); + res = OS_ModuleLoad(0, "TestModule", UT_OS_GENERIC_MODULE_NAME1, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res == OS_ERR_NOT_IMPLEMENTED) { UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); @@ -89,7 +89,7 @@ void UT_os_module_load_test() /*-----------------------------------------------------*/ testDesc = "#1 Null-pointer-arg-1"; - res = OS_ModuleLoad(0, "TestModule", UT_OS_GENERIC_MODULE_NAME1); + res = OS_ModuleLoad(0, "TestModule", UT_OS_GENERIC_MODULE_NAME1, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -98,7 +98,7 @@ void UT_os_module_load_test() /*-----------------------------------------------------*/ testDesc = "#2 Null-pointer-arg-2"; - res = OS_ModuleLoad(&module_id, 0, UT_OS_GENERIC_MODULE_NAME1); + res = OS_ModuleLoad(&module_id, 0, UT_OS_GENERIC_MODULE_NAME1, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -107,7 +107,7 @@ void UT_os_module_load_test() /*-----------------------------------------------------*/ testDesc = "#3 Null-pointer-arg-3"; - res = OS_ModuleLoad(&module_id, "TestModule", 0); + res = OS_ModuleLoad(&module_id, "TestModule", 0, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -121,7 +121,7 @@ void UT_os_module_load_test() { snprintf(module_name, sizeof(module_name), UT_OS_GENERIC_MODULE_NAME_TEMPLATE, i); snprintf(module_file_name, sizeof(module_file_name), UT_OS_GENERIC_MODULE_FILE_TEMPLATE, i); - res = OS_ModuleLoad(&module_id, module_name, module_file_name); + res = OS_ModuleLoad(&module_id, module_name, module_file_name, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res != OS_SUCCESS) { testDesc = "#4 No-free-IDs - Module Load failed"; @@ -133,7 +133,7 @@ void UT_os_module_load_test() if (test_setup_invalid == 0) { - res = OS_ModuleLoad(&module_id, "OneTooMany", UT_OS_GENERIC_MODULE_NAME2); + res = OS_ModuleLoad(&module_id, "OneTooMany", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res == OS_ERR_NO_FREE_IDS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -146,7 +146,7 @@ void UT_os_module_load_test() testDesc = "#5 Duplicate-name"; /* Setup */ - res = OS_ModuleLoad(&module_id2, "DUPLICATE", UT_OS_GENERIC_MODULE_NAME2); + res = OS_ModuleLoad(&module_id2, "DUPLICATE", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res != OS_SUCCESS) { testDesc = "#5 Duplicate-name - Module Load failed"; @@ -154,7 +154,7 @@ void UT_os_module_load_test() } else { - res = OS_ModuleLoad(&module_id, "DUPLICATE", UT_OS_GENERIC_MODULE_NAME2); + res = OS_ModuleLoad(&module_id, "DUPLICATE", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res == OS_ERR_NAME_TAKEN) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -172,7 +172,7 @@ void UT_os_module_load_test() /*-----------------------------------------------------*/ testDesc = "#7 Nominal"; - res = OS_ModuleLoad(&module_id, "Good", UT_OS_GENERIC_MODULE_NAME2); + res = OS_ModuleLoad(&module_id, "Good", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -227,7 +227,7 @@ void UT_os_module_unload_test() testDesc = "#3 Nominal"; /* Setup */ - res = OS_ModuleLoad(&module_id, "Good", UT_OS_GENERIC_MODULE_NAME2); + res = OS_ModuleLoad(&module_id, "Good", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res != OS_SUCCESS) { testDesc = "#3 Nominal - Module Load failed"; @@ -293,7 +293,7 @@ void UT_os_module_info_test() testDesc = "#3 Nominal"; /* Setup */ - res = OS_ModuleLoad(&module_id, "Good", UT_OS_GENERIC_MODULE_NAME2); + res = OS_ModuleLoad(&module_id, "Good", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_LOCAL_SYMBOLS); if (res != OS_SUCCESS) { testDesc = "#3 Nominal - Module Load failed"; diff --git a/src/unit-tests/osloader-test/ut_osloader_symtable_test.c b/src/unit-tests/osloader-test/ut_osloader_symtable_test.c index aa951f616..1ccf5a5c4 100644 --- a/src/unit-tests/osloader-test/ut_osloader_symtable_test.c +++ b/src/unit-tests/osloader-test/ut_osloader_symtable_test.c @@ -109,10 +109,10 @@ void UT_os_symbol_lookup_test() UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); /*-----------------------------------------------------*/ - testDesc = "#4 Nominal"; + testDesc = "#4 Nominal, Global Symbols"; /* Setup */ - res = OS_ModuleLoad(&module_id, "Mod1", UT_OS_GENERIC_MODULE_NAME2); + res = OS_ModuleLoad(&module_id, "Mod1", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_GLOBAL_SYMBOLS); if (res != OS_SUCCESS) { UT_OS_TEST_RESULT("#4 Nominal - Module Load failed", UTASSERT_CASETYPE_TSF); @@ -122,6 +122,8 @@ void UT_os_symbol_lookup_test() res = OS_SymbolLookup(&symbol_addr, "module1"); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else if (res == OS_ERR_NOT_IMPLEMENTED) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); else UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); @@ -133,6 +135,85 @@ void UT_os_symbol_lookup_test() return; } +/*--------------------------------------------------------------------------------* +** Syntax: OS_ModuleSymbolLookup +** Purpose: Returns the memory address of a symbol +** Parameters: To-be-filled-in +** Returns: OS_INVALID_POINTER if any of the pointers passed in is null +** OS_ERROR if the symbol name is not found +** OS_SUCCESS if succeeded +**--------------------------------------------------------------------------------*/ + +void UT_os_module_symbol_lookup_test() +{ + int32 res = 0; + const char *testDesc; + cpuaddr symbol_addr; + osal_id_t module_id; + + /*-----------------------------------------------------*/ + testDesc = "API Not implemented"; + + res = OS_ModuleSymbolLookup(OS_OBJECT_ID_UNDEFINED, &symbol_addr, "main"); + if (res == OS_ERR_NOT_IMPLEMENTED) + { + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); + goto UT_os_module_symbol_lookup_test_exit_tag; + } + + /*-----------------------------------------------------*/ + testDesc = "#1 Invalid-pointer-arg-1"; + + res = OS_ModuleSymbolLookup(OS_OBJECT_ID_UNDEFINED, 0, "main"); + if (res == OS_INVALID_POINTER) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /*-----------------------------------------------------*/ + testDesc = "#2 Invalid-pointer-arg-2"; + + res = OS_ModuleSymbolLookup(OS_OBJECT_ID_UNDEFINED, &symbol_addr, 0); + if (res == OS_INVALID_POINTER) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /*-----------------------------------------------------*/ + /* Setup for remainder of tests */ + res = OS_ModuleLoad(&module_id, "Mod1", UT_OS_GENERIC_MODULE_NAME2, OS_MODULE_FLAG_LOCAL_SYMBOLS); + if (res != OS_SUCCESS) + { + UT_OS_TEST_RESULT("Module Load failed", UTASSERT_CASETYPE_TSF); + goto UT_os_module_symbol_lookup_test_exit_tag; + } + + /*-----------------------------------------------------*/ + testDesc = "#3 Symbol-not-found"; + + res = OS_ModuleSymbolLookup(module_id, &symbol_addr, "ThisSymbolIsNotFound"); + if (res == OS_ERROR) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /*-----------------------------------------------------*/ + testDesc = "#4 Nominal, Local Symbols"; + + res = OS_ModuleSymbolLookup(module_id, &symbol_addr, "module1"); + if (res == OS_SUCCESS) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /* Reset test environment */ + res = OS_ModuleUnload(module_id); + +UT_os_module_symbol_lookup_test_exit_tag: + return; +} + + /*--------------------------------------------------------------------------------* ** Syntax: OS_SymbolTableDump ** Purpose: Dumps the system symbol table to the given filename diff --git a/src/unit-tests/osloader-test/ut_osloader_symtable_test.h b/src/unit-tests/osloader-test/ut_osloader_symtable_test.h index eae16753a..a98972cac 100644 --- a/src/unit-tests/osloader-test/ut_osloader_symtable_test.h +++ b/src/unit-tests/osloader-test/ut_osloader_symtable_test.h @@ -54,6 +54,7 @@ **--------------------------------------------------------------------------------*/ void UT_os_symbol_lookup_test(void); +void UT_os_module_symbol_lookup_test(void); void UT_os_symbol_table_dump_test(void); /*--------------------------------------------------------------------------------*/ diff --git a/src/unit-tests/osloader-test/ut_osloader_test.c b/src/unit-tests/osloader-test/ut_osloader_test.c index f3821e748..7dc7d9c6c 100644 --- a/src/unit-tests/osloader-test/ut_osloader_test.c +++ b/src/unit-tests/osloader-test/ut_osloader_test.c @@ -82,6 +82,7 @@ void UtTest_Setup(void) UtTest_Add(UT_os_module_unload_test, NULL, NULL, "OS_ModuleUnload"); UtTest_Add(UT_os_module_info_test, NULL, NULL, "OS_ModuleInfo"); + UtTest_Add(UT_os_module_symbol_lookup_test, NULL, NULL, "OS_ModuleSymbolLookup"); UtTest_Add(UT_os_symbol_lookup_test, NULL, NULL, "OS_SymbolLookup"); UtTest_Add(UT_os_symbol_table_dump_test, NULL, NULL, "OS_SymbolTableDump"); } diff --git a/src/ut-stubs/osapi-utstub-module.c b/src/ut-stubs/osapi-utstub-module.c index e5d4e4054..1b2ddc30b 100644 --- a/src/ut-stubs/osapi-utstub-module.c +++ b/src/ut-stubs/osapi-utstub-module.c @@ -80,11 +80,12 @@ int32 dummy_function(void) ** Returns either a user-defined status flag or OS_SUCCESS. ** ******************************************************************************/ -int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename) +int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename, uint32 flags) { UT_Stub_RegisterContext(UT_KEY(OS_ModuleLoad), module_id); UT_Stub_RegisterContext(UT_KEY(OS_ModuleLoad), module_name); UT_Stub_RegisterContext(UT_KEY(OS_ModuleLoad), filename); + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ModuleLoad), flags); int32 status; @@ -223,6 +224,39 @@ int32 OS_SymbolLookup(cpuaddr *symbol_address, const char *symbol_name) return status; } +/***************************************************************************** + * + * Stub function for OS_SymbolTableDump() + * + *****************************************************************************/ +int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const char *symbol_name) +{ + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ModuleSymbolLookup), module_id); + UT_Stub_RegisterContext(UT_KEY(OS_ModuleSymbolLookup), symbol_address); + UT_Stub_RegisterContext(UT_KEY(OS_ModuleSymbolLookup), symbol_name); + + int32 status; + + /* + * Register the context so a hook can do something with the parameters + */ + + status = UT_DEFAULT_IMPL(OS_ModuleSymbolLookup); + + if (status != OS_SUCCESS) + { + *symbol_address = 0xDEADBEEFU; + } + else if (UT_Stub_CopyToLocal(UT_KEY(OS_ModuleSymbolLookup), symbol_address, sizeof(*symbol_address)) < + sizeof(*symbol_address)) + { + /* return the dummy function when test didn't register anything else */ + *symbol_address = (cpuaddr)&dummy_function; + } + + return status; +} + /***************************************************************************** * * Stub function for OS_SymbolTableDump() From a32392a1ce1bd66877727fe114a3428e4bdd43bc Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Wed, 4 Nov 2020 13:34:29 -0500 Subject: [PATCH 004/111] Update #641, revert change to OS_SymbolLookup() This restores the original behavior when using OS_SymbolLookup on POSIX, so it doesn't return OS_ERR_NOT_IMPLEMENTED. This is required for transitional purposes. Will submit a separate bug about use platform-dependent logic here. --- src/os/portable/os-impl-posix-dl-symtab.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/os/portable/os-impl-posix-dl-symtab.c b/src/os/portable/os-impl-posix-dl-symtab.c index 8ed33bf53..2ce8e1acc 100644 --- a/src/os/portable/os-impl-posix-dl-symtab.c +++ b/src/os/portable/os-impl-posix-dl-symtab.c @@ -60,12 +60,16 @@ * Otherwise, check if the C library provides an "RTLD_DEFAULT" symbol - * This symbol is not POSIX standard but many implementations do provide it. * - * Lastly, if nothing no special handle that indicates the global symbol - * table is defined, then OS_GlobalSymbolLookup_Impl() will return - * OS_ERR_NOT_IMPLEMENTED rather than relying on undefined behavior. + * Lastly, if nothing else works, use NULL. This is technically undefined + * behavior per POSIX, but most implementations do seem to interpret this + * as referring to the complete process (base executable + all loaded modules). */ -#if !defined(OSAL_DLSYM_GLOBAL_HANDLE) && defined(RTLD_DEFAULT) -#define OSAL_DLSYM_GLOBAL_HANDLE RTLD_DEFAULT +#ifndef OSAL_DLSYM_DEFAULT_HANDLE +#ifdef RTLD_DEFAULT +#define OSAL_DLSYM_DEFAULT_HANDLE RTLD_DEFAULT +#else +#define OSAL_DLSYM_DEFAULT_HANDLE NULL +#endif #endif /**************************************************************************************** @@ -139,11 +143,7 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) { int32 status; -#ifdef OSAL_DLSYM_DEFAULT_HANDLE status = OS_GenericSymbolLookup_Impl(OSAL_DLSYM_DEFAULT_HANDLE, SymbolAddress, SymbolName); -#else - status = OS_ERR_NOT_IMPLEMENTED; -#endif return status; From 3f5e8f31d7ecdbbcee17f8c4ef7f305a1cb66463 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Thu, 12 Nov 2020 17:23:22 -0500 Subject: [PATCH 005/111] Update #641, Doxygen comment corrections Add doxygen comment for flags parameter on OS_ModuleLoad Also correct the capitalization of parameters to the OS_ModuleSymbolLookup which caused them to be reported as undocumented. --- src/os/inc/osapi-os-loader.h | 7 ++++++- src/os/shared/src/osapi-module.c | 8 ++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/os/inc/osapi-os-loader.h b/src/os/inc/osapi-os-loader.h index e71801427..c5a49053e 100644 --- a/src/os/inc/osapi-os-loader.h +++ b/src/os/inc/osapi-os-loader.h @@ -160,7 +160,7 @@ int32 OS_SymbolLookup(cpuaddr *symbol_address, const char *symbol_name); * @retval #OS_ERROR if the symbol could not be found * @retval #OS_INVALID_POINTER if one of the pointers passed in are NULL */ -int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *SymbolAddress, const char *SymbolName); +int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const char *symbol_name); /*-------------------------------------------------------------------------------------*/ /** @@ -184,9 +184,14 @@ int32 OS_SymbolTableDump(const char *filename, uint32 size_limit); * * Loads an object file into the running operating system * + * The "flags" parameter may influence how the loaded module symbols are made + * available for use in the application. See #OS_MODULE_FLAG_LOCAL_SYMBOLS + * and #OS_MODULE_FLAG_GLOBAL_SYMBOLS for descriptions. + * * @param[out] module_id Non-zero OSAL ID corresponding to the loaded module * @param[in] module_name Name of module * @param[in] filename File containing the object code to load + * @param[in] flags Options for the loaded module * * @return Execution status, see @ref OSReturnCodes * @retval #OS_SUCCESS @copybrief OS_SUCCESS diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 1c325d85e..96bbe4abb 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -397,7 +397,7 @@ int32 OS_SymbolLookup(cpuaddr *SymbolAddress, const char *SymbolName) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const char *symbol_name) { int32 return_code; int32 staticsym_status; @@ -407,7 +407,7 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *SymbolAddress, const c /* ** Check parameters */ - if ((SymbolAddress == NULL) || (SymbolName == NULL)) + if ((symbol_address == NULL) || (symbol_name == NULL)) { return (OS_INVALID_POINTER); } @@ -415,11 +415,11 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *SymbolAddress, const c return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, module_id, &local_id, &record); if (return_code == OS_SUCCESS) { - return_code = OS_ModuleSymbolLookup_Impl(local_id, SymbolAddress, SymbolName); + return_code = OS_ModuleSymbolLookup_Impl(local_id, symbol_address, symbol_name); if (return_code != OS_SUCCESS) { /* look for a static symbol that also matches this module name */ - staticsym_status = OS_SymbolLookup_Static(SymbolAddress, SymbolName, record->name_entry); + staticsym_status = OS_SymbolLookup_Static(symbol_address, symbol_name, record->name_entry); /* * Only overwrite the return code if static lookup was successful. From 52ee87136d915a0c10547b15a88c39a253eca8bd Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Thu, 5 Nov 2020 09:38:35 -0500 Subject: [PATCH 006/111] fix #559 Refactoring UT_SetForceFail to UT_SetDefaultReturnValue --- .../portable/src/coveragetest-bsd-select.c | 6 +-- .../portable/src/coveragetest-posix-files.c | 14 +++---- .../portable/src/coveragetest-posix-gettime.c | 4 +- .../portable/src/coveragetest-posix-io.c | 14 +++---- .../shared/src/coveragetest-binsem.c | 4 +- .../shared/src/coveragetest-common.c | 10 ++--- .../shared/src/coveragetest-countsem.c | 4 +- .../shared/src/coveragetest-file.c | 14 +++---- .../shared/src/coveragetest-filesys.c | 40 +++++++++---------- .../shared/src/coveragetest-idmap.c | 4 +- .../shared/src/coveragetest-module.c | 8 ++-- .../shared/src/coveragetest-mutex.c | 4 +- .../shared/src/coveragetest-network.c | 4 +- .../shared/src/coveragetest-printf.c | 4 +- .../shared/src/coveragetest-queue.c | 4 +- .../shared/src/coveragetest-select.c | 2 +- .../shared/src/coveragetest-sockets.c | 6 +-- .../shared/src/coveragetest-task.c | 16 ++++---- .../shared/src/coveragetest-time.c | 22 +++++----- .../shared/src/coveragetest-timebase.c | 16 ++++---- .../vxworks/src/coveragetest-binsem.c | 10 ++--- .../vxworks/src/coveragetest-common.c | 6 +-- .../vxworks/src/coveragetest-console.c | 6 +-- .../vxworks/src/coveragetest-countsem.c | 4 +- .../vxworks/src/coveragetest-dirs.c | 8 ++-- .../vxworks/src/coveragetest-filesys.c | 18 ++++----- .../vxworks/src/coveragetest-heap.c | 2 +- .../vxworks/src/coveragetest-idmap.c | 6 +-- .../vxworks/src/coveragetest-loader.c | 8 ++-- .../vxworks/src/coveragetest-mutex.c | 2 +- .../vxworks/src/coveragetest-network.c | 6 +-- .../vxworks/src/coveragetest-no-module.c | 8 ++-- .../vxworks/src/coveragetest-queues.c | 10 ++--- .../vxworks/src/coveragetest-shell.c | 2 +- .../vxworks/src/coveragetest-symtab.c | 8 ++-- .../vxworks/src/coveragetest-tasks.c | 12 +++--- .../vxworks/src/coveragetest-timebase.c | 12 +++--- ut_assert/inc/utstubs.h | 24 +++++++++-- ut_assert/src/utstubs.c | 9 ++++- 39 files changed, 193 insertions(+), 168 deletions(-) diff --git a/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c b/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c index 5c0c90acc..388267b8e 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c +++ b/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c @@ -50,7 +50,7 @@ void Test_OS_SelectSingle_Impl(void) SelectFlags = 0; OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_select), 0); + UT_SetDefaultReturnValue(UT_KEY(OCS_select), 0); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; nowtime.tv_sec = 1; nowtime.tv_nsec = 500000000; @@ -60,7 +60,7 @@ void Test_OS_SelectSingle_Impl(void) UT_SetDataBuffer(UT_KEY(OCS_clock_gettime), &latertime, sizeof(latertime), false); OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 999), OS_ERROR_TIMEOUT); - UT_SetForceFail(UT_KEY(OCS_select), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_select), -1); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; nowtime.tv_sec = 1; nowtime.tv_nsec = 0; @@ -84,7 +84,7 @@ void Test_OS_SelectMultiple_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_SelectMultiple_Impl, (&ReadSet, &WriteSet, 0), OS_SUCCESS); memset(&ReadSet, 0xff, sizeof(ReadSet)); memset(&WriteSet, 0, sizeof(WriteSet)); - UT_SetForceFail(UT_KEY(OCS_select), 0); + UT_SetDefaultReturnValue(UT_KEY(OCS_select), 0); OSAPI_TEST_FUNCTION_RC(OS_SelectMultiple_Impl, (&ReadSet, &WriteSet, 1), OS_ERROR_TIMEOUT); } /* end OS_SelectMultiple_Impl */ diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index 7f1080e27..34c9fa500 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -47,7 +47,7 @@ void Test_OS_FileOpen_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", 0, -1234), OS_ERROR); /* failure mode */ - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", 0, OS_READ_ONLY), OS_ERROR); } @@ -61,7 +61,7 @@ void Test_OS_FileStat_Impl(void) struct OCS_stat RefStat; /* failure mode */ - UT_SetForceFail(UT_KEY(OCS_stat), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_stat), -1); OSAPI_TEST_FUNCTION_RC(OS_FileStat_Impl, ("local", &FileStats), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_stat)); @@ -97,17 +97,17 @@ void Test_OS_FileChmod_Impl(void) struct OCS_stat RefStat; /* failure mode 0 (open) */ - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); /* failure mode 1 (fstat) */ - UT_SetForceFail(UT_KEY(OCS_fstat), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_fstat), -1); OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_fstat)); /* failure mode 2 (fchmod) */ - UT_SetForceFail(UT_KEY(OCS_fchmod), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_fchmod), -1); OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_fchmod)); @@ -142,7 +142,7 @@ void Test_OS_FileRemove_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileRemove_Impl, ("local"), OS_SUCCESS); /* failure mode */ - UT_SetForceFail(UT_KEY(OCS_remove), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_remove), -1); OSAPI_TEST_FUNCTION_RC(OS_FileRemove_Impl, ("local"), OS_ERROR); } @@ -155,7 +155,7 @@ void Test_OS_FileRename_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileRename_Impl, ("old", "new"), OS_SUCCESS); /* failure mode */ - UT_SetForceFail(UT_KEY(OCS_rename), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_rename), -1); OSAPI_TEST_FUNCTION_RC(OS_FileRename_Impl, ("old", "new"), OS_ERROR); } diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c b/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c index dc63e8d18..8dc31a951 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c @@ -40,7 +40,7 @@ void Test_OS_GetLocalTime_Impl(void) timeval.microsecs = 1; OSAPI_TEST_FUNCTION_RC(OS_GetLocalTime_Impl, (&timeval), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_clock_gettime), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_clock_gettime), -1); OSAPI_TEST_FUNCTION_RC(OS_GetLocalTime_Impl, (&timeval), OS_ERROR); } @@ -55,7 +55,7 @@ void Test_OS_SetLocalTime_Impl(void) timeval.microsecs = 1; OSAPI_TEST_FUNCTION_RC(OS_SetLocalTime_Impl, (&timeval), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_clock_settime), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_clock_settime), -1); OSAPI_TEST_FUNCTION_RC(OS_SetLocalTime_Impl, (&timeval), OS_ERROR); } diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c index 26fdf3059..71ef6f58e 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c @@ -49,7 +49,7 @@ void Test_OS_GenericClose_Impl(void) * Test path where underlying close() fails. * Should still return success. */ - UT_SetForceFail(UT_KEY(OCS_close), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_close), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (0), OS_SUCCESS); } @@ -61,18 +61,18 @@ void Test_OS_GenericSeek_Impl(void) */ /* note on success this wrapper returns the result of lseek(), not OS_SUCCESS */ - UT_SetForceFail(UT_KEY(OCS_lseek), 111); + UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 111); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_CUR), 111); - UT_SetForceFail(UT_KEY(OCS_lseek), 222); + UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 222); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_SET), 222); - UT_SetForceFail(UT_KEY(OCS_lseek), 333); + UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 333); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_END), 333); /* bad whence */ OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, -1234), OS_ERROR); /* generic failure of lseek() */ - UT_SetForceFail(UT_KEY(OCS_lseek), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_END), OS_ERROR); /* The seek implementation also checks for this specific pipe errno */ @@ -102,7 +102,7 @@ void Test_OS_GenericRead_Impl(void) UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* read() failure */ - UT_SetForceFail(UT_KEY(OCS_read), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_read), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (0, DestData, sizeof(DestData), 0), OS_ERROR); } @@ -128,7 +128,7 @@ void Test_OS_GenericWrite_Impl(void) UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* write() failure */ - UT_SetForceFail(UT_KEY(OCS_write), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_write), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (0, DestData, sizeof(DestData), 0), OS_ERROR); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-binsem.c b/src/unit-test-coverage/shared/src/coveragetest-binsem.c index 07c605722..801821f76 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-binsem.c @@ -62,7 +62,7 @@ void Test_OS_BinSemCreate(void) OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate(NULL, NULL, 0, 0), OS_INVALID_POINTER); - UT_SetForceFail(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate(&objid, "UT", 0, 0), OS_ERR_NAME_TOO_LONG); } @@ -146,7 +146,7 @@ void Test_OS_BinSemGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_BinSemGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_BinSemGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); diff --git a/src/unit-test-coverage/shared/src/coveragetest-common.c b/src/unit-test-coverage/shared/src/coveragetest-common.c index c200e96be..a8c3d8706 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-common.c +++ b/src/unit-test-coverage/shared/src/coveragetest-common.c @@ -108,17 +108,17 @@ void Test_OS_API_Init(void) /* other error paths */ OS_SharedGlobalVars.Initialized = false; - UT_SetForceFail(UT_KEY(OS_ObjectIdInit), -222); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdInit), -222); OSAPI_TEST_FUNCTION_RC(OS_API_Init(), -222); UT_ResetState(UT_KEY(OS_ObjectIdInit)); OS_SharedGlobalVars.Initialized = false; - UT_SetForceFail(UT_KEY(OS_API_Impl_Init), -333); + UT_SetDefaultReturnValue(UT_KEY(OS_API_Impl_Init), -333); OSAPI_TEST_FUNCTION_RC(OS_API_Init(), -333); UT_ResetState(UT_KEY(OS_API_Impl_Init)); OS_SharedGlobalVars.Initialized = false; - UT_SetForceFail(UT_KEY(OS_TaskAPI_Init), -444); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskAPI_Init), -444); OSAPI_TEST_FUNCTION_RC(OS_API_Init(), -444); UT_ResetState(UT_KEY(OS_TaskAPI_Init)); } @@ -151,7 +151,7 @@ void Test_OS_CleanUpObject(void) while (objtype < OS_OBJECT_TYPE_USER) { UT_ResetState(0); - UT_SetForceFail(UT_KEY(OS_IdentifyObject), objtype); + UT_SetDefaultReturnValue(UT_KEY(OS_IdentifyObject), objtype); switch (objtype) { @@ -195,7 +195,7 @@ void Test_OS_CleanUpObject(void) /* note the return code here is ignored - * the goal is simply to defeat the default * check that the objid was valid (it isn't) */ - UT_SetForceFail(delhandler, OS_ERROR); + UT_SetDefaultReturnValue(delhandler, OS_ERROR); OS_CleanUpObject(OS_OBJECT_ID_UNDEFINED, &ActualObjs); CallCount = UT_GetStubCount(delhandler); diff --git a/src/unit-test-coverage/shared/src/coveragetest-countsem.c b/src/unit-test-coverage/shared/src/coveragetest-countsem.c index 5afc26277..7d4767515 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-countsem.c @@ -64,7 +64,7 @@ void Test_OS_CountSemCreate(void) #endif OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate(NULL, NULL, 0, 0), OS_INVALID_POINTER); - UT_SetForceFail(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate(&objid, "UT", 0, 0), OS_ERR_NAME_TOO_LONG); } @@ -134,7 +134,7 @@ void Test_OS_CountSemGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_CountSemGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_CountSemGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); diff --git a/src/unit-test-coverage/shared/src/coveragetest-file.c b/src/unit-test-coverage/shared/src/coveragetest-file.c index 74893e81a..79e02584c 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-file.c +++ b/src/unit-test-coverage/shared/src/coveragetest-file.c @@ -78,7 +78,7 @@ void Test_OS_OpenCreate(void) UtAssert_True(actual == expected, "OS_OpenCreate() (%ld) == OS_ERROR (bad flags)", (long)actual); /* Test failure to convert path */ - UT_SetForceFail(UT_KEY(OS_TranslatePath), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_TranslatePath), OS_ERROR); expected = OS_ERROR; actual = OS_OpenCreate(&filedes, "/cf/file", OS_FILE_FLAG_NONE, OS_READ_WRITE); UtAssert_True(actual == OS_ERROR, "OS_OpenCreate() (%ld) == OS_ERROR (bad path)", (long)actual); @@ -267,19 +267,19 @@ void Test_OS_cp(void) UtAssert_True(actual == expected, "OS_cp() (%ld) == OS_SUCCESS", (long)actual); - UT_SetForceFail(UT_KEY(OS_GenericRead_Impl), -444); + UT_SetDefaultReturnValue(UT_KEY(OS_GenericRead_Impl), -444); expected = -444; actual = OS_cp("/cf/file1", "/cf/file2"); UtAssert_True(actual == expected, "OS_cp() (%ld) == -444", (long)actual); UT_ClearForceFail(UT_KEY(OS_GenericRead_Impl)); UT_SetDataBuffer(UT_KEY(OS_GenericRead_Impl), ReadBuf, sizeof(ReadBuf), false); - UT_SetForceFail(UT_KEY(OS_GenericWrite_Impl), -555); + UT_SetDefaultReturnValue(UT_KEY(OS_GenericWrite_Impl), -555); expected = -555; actual = OS_cp("/cf/file1", "/cf/file2"); UtAssert_True(actual == expected, "OS_cp() (%ld) == -555", (long)actual); - UT_SetForceFail(UT_KEY(OS_TranslatePath), OS_INVALID_POINTER); + UT_SetDefaultReturnValue(UT_KEY(OS_TranslatePath), OS_INVALID_POINTER); expected = OS_INVALID_POINTER; actual = OS_cp("/cf/file1", "/cf/file2"); UtAssert_True(actual == expected, "OS_cp() (%ld) == OS_INVALID_POINTER", (long)actual); @@ -299,7 +299,7 @@ void Test_OS_mv(void) /* In the default case, the implementation tries to rename first. * Force rename to fail so it does a full copy and remove */ - UT_SetForceFail(UT_KEY(OS_FileRename_Impl), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_FileRename_Impl), OS_ERROR); actual = OS_mv("/cf/file1", "/cf/file2"); UtAssert_True(actual == expected, "OS_mv() (%ld) == OS_SUCCESS", (long)actual); } @@ -344,7 +344,7 @@ void Test_OS_FileOpenCheck(void) UtAssert_True(actual == expected, "OS_FileOpenCheck() (%ld) == OS_ERROR", (long)actual); OS_global_stream_table[0].active_id = UT_OBJID_1; - UT_SetForceFail(UT_KEY(OCS_strcmp), 0); + UT_SetDefaultReturnValue(UT_KEY(OCS_strcmp), 0); expected = OS_SUCCESS; actual = OS_FileOpenCheck("/cf/file"); @@ -369,7 +369,7 @@ void Test_OS_CloseFileByName(void) /* setup for success */ expected = OS_SUCCESS; OS_global_stream_table[0].active_id = UT_OBJID_1; - UT_SetForceFail(UT_KEY(OCS_strcmp), 0); + UT_SetDefaultReturnValue(UT_KEY(OCS_strcmp), 0); actual = OS_CloseFileByName("/cf/file"); UtAssert_True(actual == expected, "OS_CloseFileByName() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 528d33886..433fb0c00 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -64,7 +64,7 @@ void Test_OS_FileSysAddFixedMap(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_ERR_NAME_TOO_LONG); UT_ResetState(UT_KEY(OCS_strlen)); - UT_SetForceFail(UT_KEY(OCS_strrchr), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_strrchr), -1); UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 3, 2 + OS_FS_DEV_NAME_LEN); OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_ERR_NAME_TOO_LONG); UT_ResetState(UT_KEY(OCS_strlen)); @@ -99,7 +99,7 @@ void Test_OS_mkfs(void) actual = OS_mkfs(NULL, NULL, NULL, 0, 0); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", 0, 0); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -111,13 +111,13 @@ void Test_OS_mkfs(void) UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); /* set up for failure due to formatting */ - UT_SetForceFail(UT_KEY(OS_FileSysFormatVolume_Impl), OS_FS_ERR_DRIVE_NOT_CREATED); + UT_SetDefaultReturnValue(UT_KEY(OS_FileSysFormatVolume_Impl), OS_FS_ERR_DRIVE_NOT_CREATED); expected = OS_FS_ERR_DRIVE_NOT_CREATED; actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", 0, 0); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_DRIVE_NOT_CREATED (format failure)", (long)actual); /* set up for failure due to no free slots */ - UT_SetForceFail(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); expected = OS_FS_ERR_DEVICE_NOT_FREE; actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", 0, 0); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_DEVICE_NOT_FREE", (long)actual); @@ -136,7 +136,7 @@ void Test_OS_rmfs(void) UtAssert_True(actual == expected, "OS_rmfs() (%ld) == OS_SUCCESS", (long)actual); /* check error paths */ - UT_SetForceFail(UT_KEY(OS_ObjectIdGetByName), OS_ERR_NAME_NOT_FOUND); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetByName), OS_ERR_NAME_NOT_FOUND); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_rmfs("/ramdev4"); UtAssert_True(actual == expected, "OS_rmfs() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); @@ -146,7 +146,7 @@ void Test_OS_rmfs(void) actual = OS_rmfs(NULL); UtAssert_True(actual == expected, "OS_rmfs() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_rmfs("/ramdev4"); UtAssert_True(actual == expected, "OS_rmfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -174,14 +174,14 @@ void Test_OS_initfs(void) actual = OS_initfs(NULL, NULL, NULL, 0, 0); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_initfs(TestBuffer, "/ramdev0", "vol", 0, 0); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); /* set up for failure */ - UT_SetForceFail(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); expected = OS_FS_ERR_DEVICE_NOT_FREE; actual = OS_initfs(TestBuffer, "/ramdev0", "vol", 0, 0); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_FS_ERR_DEVICE_NOT_FREE", (long)actual); @@ -217,7 +217,7 @@ void Test_OS_mount(void) actual = OS_mount(NULL, NULL); UtAssert_True(actual == expected, "OS_mount() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_mount("/ramdev0", "/ram0"); UtAssert_True(actual == expected, "OS_mount() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -247,7 +247,7 @@ void Test_OS_unmount(void) actual = OS_unmount(NULL); UtAssert_True(actual == expected, "OS_unmount() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_unmount("/ram0"); UtAssert_True(actual == expected, "OS_unmount() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -277,13 +277,13 @@ void Test_OS_fsBlocksFree(void) actual = OS_fsBlocksFree(NULL); UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_fsBlocksFree("/cf"); UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); - UT_SetForceFail(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); expected = OS_FS_ERR_PATH_INVALID; actual = OS_fsBlocksFree("invalid"); UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); @@ -316,13 +316,13 @@ void Test_OS_fsBytesFree(void) actual = OS_fsBytesFree(NULL, NULL); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_fsBytesFree("/cf", &bytes_free); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); - UT_SetForceFail(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); expected = OS_FS_ERR_PATH_INVALID; actual = OS_fsBytesFree("invalid", &bytes_free); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); @@ -346,14 +346,14 @@ void Test_OS_chkfs(void) actual = OS_chkfs(NULL, false); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_chkfs("/cf", false); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); /* Test Fail due to no matching VolTab entry */ - UT_SetForceFail(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_chkfs("none", true); UtAssert_True(actual == expected, "OS_chkfs() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); @@ -371,7 +371,7 @@ void Test_OS_FS_GetPhysDriveName(void) UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), OS_MAX_PATH_LEN + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_PATH_LEN + 10); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -388,7 +388,7 @@ void Test_OS_FS_GetPhysDriveName(void) UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_SUCCESS", (long)actual); /* Test Fail due to no matching VolTab entry */ - UT_SetForceFail(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); @@ -451,7 +451,7 @@ void Test_OS_TranslatePath(void) actual = OS_TranslatePath(NULL, NULL); UtAssert_True(actual == expected, "OS_TranslatePath(NULL,NULL) (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), OS_MAX_PATH_LEN + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_PATH_LEN + 10); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -472,7 +472,7 @@ void Test_OS_TranslatePath(void) actual = OS_TranslatePath("invalid/", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); - UT_SetForceFail(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); UT_ClearForceFail(UT_KEY(OS_ObjectIdGetBySearch)); diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 07fc471de..67250a778 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -96,7 +96,7 @@ void Test_OS_LockUnlockGlobal(void) OS_Lock_Global(55555); OS_Unlock_Global(55555); - UT_SetForceFail(UT_KEY(OS_TaskGetId), 0); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId), 0); OS_Lock_Global(OS_OBJECT_TYPE_OS_BINSEM); OS_Unlock_Global(OS_OBJECT_TYPE_OS_BINSEM); } @@ -294,7 +294,7 @@ void Test_OS_ObjectIdFindByName(void) /* * Pass in a name that is beyond OS_MAX_API_NAME */ - UT_SetForceFail(UT_KEY(OCS_strlen), OS_MAX_API_NAME + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_API_NAME + 10); expected = OS_ERR_NAME_TOO_LONG; actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_OS_TASK, TaskName, &objid); UtAssert_True(actual == expected, "OS_ObjectFindIdByName(%s) (%ld) == OS_ERR_NAME_TOO_LONG", TaskName, diff --git a/src/unit-test-coverage/shared/src/coveragetest-module.c b/src/unit-test-coverage/shared/src/coveragetest-module.c index 7cd0146b3..62ec81860 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-module.c +++ b/src/unit-test-coverage/shared/src/coveragetest-module.c @@ -87,13 +87,13 @@ void Test_OS_ModuleLoad(void) expected = OS_INVALID_POINTER; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); actual = OS_ModuleLoad(&objid, "UTS", "File2"); expected = OS_ERR_NAME_TOO_LONG; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); UT_ResetState(UT_KEY(OCS_strlen)); - UT_SetForceFail(UT_KEY(OS_TranslatePath), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_TranslatePath), OS_ERROR); actual = OS_ModuleLoad(&objid, "UT", "FileBad"); expected = OS_ERROR; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_ERROR", (long)actual); @@ -128,7 +128,7 @@ void Test_OS_SymbolLookup(void) UtAssert_True(actual == expected, "OS_SymbolLookup(name=%s) (%ld) == OS_SUCCESS", "uttestsym0", (long)actual); UT_ResetState(UT_KEY(OS_SymbolLookup_Impl)); - UT_SetForceFail(UT_KEY(OS_SymbolLookup_Impl), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_SymbolLookup_Impl), OS_ERROR); /* this lookup should always fail */ symaddr = 0; @@ -197,7 +197,7 @@ void Test_OS_SymbolTableDump(void) actual = OS_SymbolTableDump(NULL, 555); UtAssert_True(actual == expected, "OS_SymbolTableDump() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OS_TranslatePath), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_TranslatePath), OS_ERROR); expected = OS_ERROR; actual = OS_SymbolTableDump("test", 555); UtAssert_True(actual == expected, "OS_SymbolTableDump() (%ld) == OS_ERROR", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-mutex.c b/src/unit-test-coverage/shared/src/coveragetest-mutex.c index ad13a1539..1c9d74d80 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/shared/src/coveragetest-mutex.c @@ -61,7 +61,7 @@ void Test_OS_MutSemCreate(void) OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate(NULL, NULL, 0), OS_INVALID_POINTER); - UT_SetForceFail(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate(&objid, "UT", 0), OS_ERR_NAME_TOO_LONG); } @@ -117,7 +117,7 @@ void Test_OS_MutSemGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_MutSemGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_MutSemGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); diff --git a/src/unit-test-coverage/shared/src/coveragetest-network.c b/src/unit-test-coverage/shared/src/coveragetest-network.c index 871992d1f..a48a75589 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-network.c +++ b/src/unit-test-coverage/shared/src/coveragetest-network.c @@ -52,7 +52,7 @@ void Test_OS_NetworkGetHostName(void) actual = OS_NetworkGetHostName(Buffer, sizeof(Buffer)); UtAssert_True(actual == expected, "OS_NetworkGetHostName() (%ld) == OS_SUCCESS", (long)actual); - UT_SetForceFail(UT_KEY(OS_NetworkGetHostName_Impl), -4444); + UT_SetDefaultReturnValue(UT_KEY(OS_NetworkGetHostName_Impl), -4444); expected = -4444; actual = OS_NetworkGetHostName(Buffer, sizeof(Buffer)); UtAssert_True(actual == expected, "OS_NetworkGetHostName(impl error) (%ld) == -4444", (long)actual); @@ -79,7 +79,7 @@ void Test_OS_NetworkGetID(void) actual = OS_NetworkGetID(); UtAssert_True(actual == expected, "OS_NetworkGetID(nominal) (%ld) == 42", (long)actual); - UT_SetForceFail(UT_KEY(OS_NetworkGetID_Impl), -5555); + UT_SetDefaultReturnValue(UT_KEY(OS_NetworkGetID_Impl), -5555); expected = -1; actual = OS_NetworkGetID(); UtAssert_True(actual == expected, "OS_NetworkGetID(error) (%ld) == -1", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-printf.c b/src/unit-test-coverage/shared/src/coveragetest-printf.c index 8d6a888d6..c7f0fb9ac 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-printf.c +++ b/src/unit-test-coverage/shared/src/coveragetest-printf.c @@ -93,10 +93,10 @@ void Test_OS_printf(void) /* * For coverage, exercise different paths depending on the return value */ - UT_SetForceFail(UT_KEY(OCS_vsnprintf), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_vsnprintf), -1); OS_printf("UnitTest6"); - UT_SetForceFail(UT_KEY(OCS_vsnprintf), OS_BUFFER_SIZE + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_vsnprintf), OS_BUFFER_SIZE + 10); OS_printf("UnitTest7"); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-queue.c b/src/unit-test-coverage/shared/src/coveragetest-queue.c index 4c8bfa89a..d7c03cc48 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-queue.c +++ b/src/unit-test-coverage/shared/src/coveragetest-queue.c @@ -65,7 +65,7 @@ void Test_OS_QueueCreate(void) actual = OS_QueueCreate(NULL, "UT", 0, 0, 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); expected = OS_ERR_NAME_TOO_LONG; actual = OS_QueueCreate(&objid, "UT", 0, 0, 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); @@ -146,7 +146,7 @@ void Test_OS_QueueGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_QueueGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_QueueGetIdByName() (%ld) == OS_SUCCESS", (long)actual); UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); diff --git a/src/unit-test-coverage/shared/src/coveragetest-select.c b/src/unit-test-coverage/shared/src/coveragetest-select.c index 79c43f004..bb27e6451 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-select.c +++ b/src/unit-test-coverage/shared/src/coveragetest-select.c @@ -107,7 +107,7 @@ void Test_OS_SelectFdAddClearOps(void) UtAssert_True(!OS_SelectFdIsSet(&UtSet, UT_OBJID_2), "OS_SelectFdIsSet(2) == false"); expected = -42; - UT_SetForceFail(UT_KEY(OS_ObjectIdToArrayIndex), expected); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdToArrayIndex), expected); actual = OS_SelectFdAdd(&UtSet, UT_OBJID_2); UtAssert_True(actual == expected, "OS_SelectFdAdd() (%ld) == %ld", (long)actual, (long)expected); actual = OS_SelectFdClear(&UtSet, UT_OBJID_1); diff --git a/src/unit-test-coverage/shared/src/coveragetest-sockets.c b/src/unit-test-coverage/shared/src/coveragetest-sockets.c index 13c7314a6..482a5e95a 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-sockets.c +++ b/src/unit-test-coverage/shared/src/coveragetest-sockets.c @@ -60,7 +60,7 @@ void Test_OS_CreateSocketName(void) */ OS_SockAddr_t testaddr; - UT_SetForceFail(UT_KEY(OS_SocketAddrToString_Impl), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_SocketAddrToString_Impl), OS_ERROR); OS_CreateSocketName(0, &testaddr, "ut"); /* @@ -191,7 +191,7 @@ void Test_OS_SocketAccept(void) */ OS_stream_table[1].stream_state = OS_STREAM_STATE_BOUND; expected = -1234; - UT_SetForceFail(UT_KEY(OS_SocketAccept_Impl), -1234); + UT_SetDefaultReturnValue(UT_KEY(OS_SocketAccept_Impl), -1234); actual = OS_SocketAccept(UT_OBJID_1, &connsock_id, &Addr, 0); UtAssert_True(actual == expected, "OS_SocketAccept() underlying failure (%ld) == -1234", (long)actual); } @@ -353,7 +353,7 @@ void Test_OS_SocketGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_SocketGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_SocketGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); diff --git a/src/unit-test-coverage/shared/src/coveragetest-task.c b/src/unit-test-coverage/shared/src/coveragetest-task.c index f1e640c6d..da9d81abb 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-task.c +++ b/src/unit-test-coverage/shared/src/coveragetest-task.c @@ -115,7 +115,7 @@ void Test_OS_TaskCreate(void) OSAPI_TEST_FUNCTION_RC(OS_TaskCreate(&objid, "UT", UT_TestHook, NULL, 0, 0, 0), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_TaskCreate(&objid, "UT", UT_TestHook, NULL, 128, 10 + OS_MAX_TASK_PRIORITY, 0), OS_ERR_INVALID_PRIORITY); - UT_SetForceFail(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); OSAPI_TEST_FUNCTION_RC(OS_TaskCreate(&objid, "UT", UT_TestHook, NULL, 128, 0, 0), OS_ERR_NAME_TOO_LONG); } @@ -135,7 +135,7 @@ void Test_OS_TaskDelete(void) UtAssert_True(actual == expected, "OS_TaskDelete() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(UT_TestHook_Count == 1, "UT_TestHook_Count (%lu) == 1", (unsigned long)UT_TestHook_Count); - UT_SetForceFail(UT_KEY(OS_TaskDelete_Impl), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskDelete_Impl), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_TaskDelete(UT_OBJID_1), OS_ERROR); UtAssert_True(UT_TestHook_Count == 1, "UT_TestHook_Count (%lu) == 1", (unsigned long)UT_TestHook_Count); @@ -207,11 +207,11 @@ void Test_OS_TaskGetId(void) osal_id_t objid; idbuf.val = 5555; - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), idbuf.val); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), idbuf.val); objid = OS_TaskGetId(); OSAPI_TEST_OBJID(objid, ==, idbuf.id); - UT_SetForceFail(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); objid = OS_TaskGetId(); OSAPI_TEST_OBJID(objid, ==, OS_OBJECT_ID_UNDEFINED); } @@ -226,7 +226,7 @@ void Test_OS_TaskGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid = OS_OBJECT_ID_UNDEFINED; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_TaskGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_TaskGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); @@ -283,7 +283,7 @@ void Test_OS_TaskInstallDeleteHandler(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1); actual = OS_TaskInstallDeleteHandler(UT_TestHook); UtAssert_True(actual == expected, "OS_TaskInstallDeleteHandler() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(OS_task_table[1].delete_hook_pointer == UT_TestHook, @@ -325,14 +325,14 @@ void Test_OS_TaskFindIdBySystemData(void) actual = OS_TaskFindIdBySystemData(NULL, &test_sysdata, sizeof(test_sysdata)); UtAssert_True(actual == expected, "OS_TaskFindIdBySystemData() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OS_TaskValidateSystemData_Impl), expected); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskValidateSystemData_Impl), expected); actual = OS_TaskFindIdBySystemData(&task_id, &test_sysdata, sizeof(test_sysdata)); UtAssert_True(actual == expected, "OS_TaskFindIdBySystemData() (%ld) == OS_INVALID_POINTER", (long)actual); UT_ClearForceFail(UT_KEY(OS_TaskValidateSystemData_Impl)); /* Test search failure */ expected = OS_ERR_NAME_NOT_FOUND; - UT_SetForceFail(UT_KEY(OS_ObjectIdGetBySearch), expected); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), expected); actual = OS_TaskFindIdBySystemData(&task_id, &test_sysdata, sizeof(test_sysdata)); UtAssert_True(actual == expected, "OS_TaskFindIdBySystemData() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); UT_ClearForceFail(UT_KEY(OS_ObjectIdGetBySearch)); diff --git a/src/unit-test-coverage/shared/src/coveragetest-time.c b/src/unit-test-coverage/shared/src/coveragetest-time.c index d62a28fb1..391c3acbc 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-time.c +++ b/src/unit-test-coverage/shared/src/coveragetest-time.c @@ -81,7 +81,7 @@ void Test_OS_TimerAdd(void) actual = OS_TimerAdd(NULL, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); @@ -91,19 +91,19 @@ void Test_OS_TimerAdd(void) actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, NULL, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_TIMER_ERR_INVALID_ARGS", (long)actual); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); UT_ClearForceFail(UT_KEY(OS_TaskGetId_Impl)); - UT_SetForceFail(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); expected = OS_ERROR; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERROR", (long)actual); UT_ClearForceFail(UT_KEY(OS_ObjectIdGetById)); - UT_SetForceFail(UT_KEY(OS_ObjectIdAllocateNew), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew), OS_ERROR); expected = OS_ERROR; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERROR", (long)actual); @@ -143,13 +143,13 @@ void Test_OS_TimerCreate(void) actual = OS_TimerCreate(&objid, "UT", &accuracy, NULL); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_TIMER_ERR_INVALID_ARGS", (long)actual); - UT_SetForceFail(UT_KEY(OS_TimeBaseCreate), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_TimeBaseCreate), OS_ERROR); expected = OS_ERROR; actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERROR", (long)actual); UT_ClearForceFail(UT_KEY(OS_TimeBaseCreate)); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); @@ -181,7 +181,7 @@ void Test_OS_TimerSet(void) actual = OS_TimerSet(UT_OBJID_2, UINT32_MAX, UINT32_MAX); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_TIMER_ERR_INVALID_ARGS", (long)actual); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerSet(UT_OBJID_2, 0, 1); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); @@ -223,7 +223,7 @@ void Test_OS_TimerDelete(void) memset(OS_timecb_table, 0, sizeof(OS_timecb_table)); memset(OS_timebase_table, 0, sizeof(OS_timebase_table)); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerDelete(UT_OBJID_2); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); @@ -240,7 +240,7 @@ void Test_OS_TimerGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_TimerGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_TimerGetIdByName() (%ld) == OS_SUCCESS", (long)actual); UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); @@ -253,7 +253,7 @@ void Test_OS_TimerGetIdByName(void) actual = OS_TimerGetIdByName(NULL, "NF"); UtAssert_True(actual == expected, "OS_TimerGetIdByName() (%ld) == %ld", (long)actual, (long)expected); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerGetIdByName(&objid, "NF"); UtAssert_True(actual == expected, "OS_TimerGetIdByName() (%ld) == %ld", (long)actual, (long)expected); @@ -293,7 +293,7 @@ void Test_OS_TimerGetInfo(void) actual = OS_TimerGetInfo(UT_OBJID_1, NULL); UtAssert_True(actual == expected, "OS_TimerGetInfo() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerGetInfo(UT_OBJID_1, &timer_prop); UtAssert_True(actual == expected, "OS_TimerGetInfo() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index 9484cb9c0..bf37a52cd 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -99,13 +99,13 @@ void Test_OS_TimeBaseCreate(void) actual = OS_TimeBaseCreate(NULL, NULL, NULL); UtAssert_True(actual == expected, "OS_TimeBaseCreate() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimeBaseCreate(&objid, "UT", UT_TimerSync); UtAssert_True(actual == expected, "OS_TimeBaseCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimeBaseCreate(&objid, "UT", UT_TimerSync); UtAssert_True(actual == expected, "OS_TimeBaseCreate() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); @@ -128,7 +128,7 @@ void Test_OS_TimeBaseSet(void) UtAssert_True(actual == expected, "OS_TimeBaseSet() (%ld) == OS_TIMER_ERR_INVALID_ARGS", (long)actual); /* test error paths */ - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimeBaseSet(UT_OBJID_1, 1000, 1000); UtAssert_True(actual == expected, "OS_TimeBaseSet() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); @@ -146,7 +146,7 @@ void Test_OS_TimeBaseDelete(void) UtAssert_True(actual == expected, "OS_TimeBaseDelete() (%ld) == OS_SUCCESS", (long)actual); /* test error paths */ - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimeBaseDelete(UT_OBJID_1); UtAssert_True(actual == expected, "OS_TimeBaseDelete() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); @@ -162,7 +162,7 @@ void Test_OS_TimeBaseGetIdByName(void) int32 actual = ~OS_SUCCESS; osal_id_t objid; - UT_SetForceFail(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_TimeBaseGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_TimeBaseGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); @@ -177,7 +177,7 @@ void Test_OS_TimeBaseGetIdByName(void) actual = OS_TimeBaseGetIdByName(NULL, NULL); UtAssert_True(actual == expected, "OS_TimeBaseGetIdByName() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimeBaseGetIdByName(&objid, "NF"); UtAssert_True(actual == expected, "OS_TimeBaseGetIdByName() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); @@ -222,7 +222,7 @@ void Test_OS_TimeBaseGetInfo(void) actual = OS_TimeBaseGetInfo(UT_OBJID_1, NULL); UtAssert_True(actual == expected, "OS_TimeBaseGetInfo() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetForceFail(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); + UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimeBaseGetInfo(UT_OBJID_1, &timebase_prop); UtAssert_True(actual == expected, "OS_TimeBaseGetInfo() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); @@ -281,7 +281,7 @@ void Test_OS_TimeBase_CallbackThread(void) /* Check that the TimeCB function was called */ UtAssert_True(TimeCB > 0, "TimeCB (%lu) > 0", (unsigned long)TimeCB); - UT_SetForceFail(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); OS_TimeBase_CallbackThread(UT_OBJID_2); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c b/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c index 931f7f37d..715704301 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c @@ -52,7 +52,7 @@ void Test_OS_BinSemCreate_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(0, 0, 0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semBInitialize), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_semBInitialize), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(0, 0, 0), OS_SEM_FAILURE); } @@ -73,7 +73,7 @@ void Test_OS_BinSemGive_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(0), OS_SUCCESS); - UT_SetForceFail(UT_StubKey_GenericSemGive, OS_SEM_FAILURE); + UT_SetDefaultReturnValue(UT_StubKey_GenericSemGive, OS_SEM_FAILURE); OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(0), OS_SEM_FAILURE); } @@ -85,7 +85,7 @@ void Test_OS_BinSemFlush_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semFlush), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_semFlush), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(0), OS_SEM_FAILURE); } @@ -106,10 +106,10 @@ void Test_OS_BinSemTimedWait_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(0, 100), OS_SUCCESS); - UT_SetForceFail(UT_StubKey_GenericSemTake, OS_SEM_FAILURE); + UT_SetDefaultReturnValue(UT_StubKey_GenericSemTake, OS_SEM_FAILURE); OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(0, 100), OS_SEM_FAILURE); - UT_SetForceFail(UT_KEY(OS_Milli2Ticks), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_Milli2Ticks), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(0, 100), OS_ERROR); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-common.c b/src/unit-test-coverage/vxworks/src/coveragetest-common.c index 874ac2ae7..e8737479d 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-common.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-common.c @@ -42,7 +42,7 @@ void Test_OS_API_Impl_Init(void) * int32 OS_API_Impl_Init(uint32 idtype) */ OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(0), OS_SUCCESS); - UT_SetForceFail(UT_StubKey_OS_VxWorks_TableMutex_Init, OS_ERROR); + UT_SetDefaultReturnValue(UT_StubKey_OS_VxWorks_TableMutex_Init, OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); UT_ClearForceFail(UT_StubKey_OS_VxWorks_TableMutex_Init); OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); @@ -85,7 +85,7 @@ void Test_OS_VxWorks_GenericSemGive(void) OCS_SEM_ID SemID = NULL; OSAPI_TEST_FUNCTION_RC(OS_VxWorks_GenericSemGive(SemID), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semGive), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_semGive), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_VxWorks_GenericSemGive(SemID), OS_SEM_FAILURE); } /* end OS_VxWorks_GenericSemGive */ @@ -98,7 +98,7 @@ void Test_OS_VxWorks_GenericSemTake(void) OCS_SEM_ID SemID = NULL; OSAPI_TEST_FUNCTION_RC(OS_VxWorks_GenericSemTake(SemID, 10), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semTake), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_semTake), OCS_ERROR); OCS_errno = OCS_S_objLib_OBJ_TIMEOUT; OSAPI_TEST_FUNCTION_RC(OS_VxWorks_GenericSemTake(SemID, 0), OS_SEM_TIMEOUT); OCS_errno = OCS_S_objLib_OBJ_ID_ERROR; diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-console.c b/src/unit-test-coverage/vxworks/src/coveragetest-console.c index c39910841..f3a358f32 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-console.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-console.c @@ -47,7 +47,7 @@ void Test_OS_ConsoleWakeup_Impl(void) OS_ConsoleWakeup_Impl(0); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_semGive)) == 1, "semGive() called in async mode"); - UT_SetForceFail(UT_KEY(OCS_semGive), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_semGive), -1); OS_ConsoleWakeup_Impl(0); UT_ConsoleTest_SetConsoleAsync(0, false); @@ -61,11 +61,11 @@ void Test_OS_ConsoleCreate_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(0), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskSpawn)) == 1, "taskSpawn() called"); - UT_SetForceFail(UT_KEY(OCS_semCInitialize), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_semCInitialize), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(0), OS_SEM_FAILURE); UT_ClearForceFail(UT_KEY(OCS_semCInitialize)); - UT_SetForceFail(UT_KEY(OCS_taskSpawn), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_taskSpawn), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_taskSpawn)); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c b/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c index f29a015c4..8773d065e 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c @@ -48,7 +48,7 @@ void Test_OS_CountSemCreate_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(0, 0, 0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semCInitialize), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_semCInitialize), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(0, 0, 0), OS_SEM_FAILURE); } @@ -87,7 +87,7 @@ void Test_OS_CountSemTimedWait_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(0, 100), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OS_Milli2Ticks), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_Milli2Ticks), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(0, 100), OS_ERROR); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c index f896cb598..0251f01be 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c @@ -53,7 +53,7 @@ void Test_OS_DirCreate_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl("dir", 0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_mkdir), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_mkdir), -1); OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl("dir", 0), OS_ERROR); } @@ -64,7 +64,7 @@ void Test_OS_DirOpen_Impl(void) * int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) */ OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(0, "dir"), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_opendir), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_opendir), -1); OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(0, "dir"), OS_ERROR); } @@ -87,7 +87,7 @@ void Test_OS_DirRead_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(0, &dirent_buff), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_readdir), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_readdir), -1); OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(0, &dirent_buff), OS_ERROR); } @@ -108,7 +108,7 @@ void Test_OS_DirRemove_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_DirRemove_Impl("dir"), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_rmdir), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_rmdir), -1); OSAPI_TEST_FUNCTION_RC(OS_DirRemove_Impl("dir"), OS_ERROR); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c index 6cdf934ec..f10632e2b 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c @@ -70,11 +70,11 @@ void Test_OS_FileSysStartVolume_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(2), expected); /* Failure to create XBD layer */ - UT_SetForceFail(UT_KEY(OCS_xbdBlkDevCreateSync), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_xbdBlkDevCreateSync), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(1), OS_FS_ERR_DRIVE_NOT_CREATED); /* Failure to create low level block dev */ - UT_SetForceFail(UT_KEY(OCS_ramDevCreate), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_ramDevCreate), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(1), OS_FS_ERR_DRIVE_NOT_CREATED); } @@ -110,7 +110,7 @@ void Test_OS_FileSysFormatVolume_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(0), OS_SUCCESS); /* Failure of the dosFsVolFormat() call */ - UT_SetForceFail(UT_KEY(OCS_dosFsVolFormat), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_dosFsVolFormat), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(0), OS_FS_ERR_DRIVE_NOT_CREATED); } @@ -122,7 +122,7 @@ void Test_OS_FileSysMountVolume_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); } @@ -135,11 +135,11 @@ void Test_OS_FileSysUnmountVolume_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); - UT_SetForceFail(UT_KEY(OCS_ioctl), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_ioctl), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_ioctl)); } @@ -153,7 +153,7 @@ void Test_OS_FileSysStatVolume_Impl(void) OS_statvfs_t stat; OSAPI_TEST_FUNCTION_RC(OS_FileSysStatVolume_Impl(0, &stat), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_statvfs), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_statvfs), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysStatVolume_Impl(0, &stat), OS_ERROR); } @@ -165,11 +165,11 @@ void Test_OS_FileSysCheckVolume_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(0, true), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(0, false), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); - UT_SetForceFail(UT_KEY(OCS_ioctl), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_ioctl), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(0, false), OS_ERROR); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-heap.c b/src/unit-test-coverage/vxworks/src/coveragetest-heap.c index 10d68a79a..06b04b7a5 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-heap.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-heap.c @@ -40,7 +40,7 @@ void Test_OS_HeapGetInfo_Impl(void) memset(&heap_prop, 0xEE, sizeof(heap_prop)); OSAPI_TEST_FUNCTION_RC(OS_HeapGetInfo_Impl(&heap_prop), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_memPartInfoGet), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_memPartInfoGet), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_HeapGetInfo_Impl(&heap_prop), OS_ERROR); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c index 124f7d322..89f140b4c 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c @@ -55,7 +55,7 @@ void Test_OS_Lock_Global_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_semTake)) == 1, "semTake() called"); - UT_SetForceFail(UT_KEY(OCS_semTake), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_semTake), -1); OSAPI_TEST_FUNCTION_RC(OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); } @@ -68,7 +68,7 @@ void Test_OS_Unlock_Global_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(10000), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(0), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semGive), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_semGive), -1); OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); } @@ -79,7 +79,7 @@ void Test_OS_API_Impl_Init(void) * int32 OS_API_Impl_Init(uint32 idtype) */ OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TableMutex_Init(0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semMInitialize), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_semMInitialize), -1); OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TableMutex_Init(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_semMInitialize)); OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TableMutex_Init(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c index 4fede680c..1a1c1171c 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c @@ -51,10 +51,10 @@ void Test_OS_ModuleLoad_Impl(void) * int32 OS_ModuleLoad_Impl ( uint32 module_id, char *translated_path ) */ OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); - UT_SetForceFail(UT_KEY(OCS_loadModule), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_loadModule), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_loadModule)); } @@ -65,7 +65,7 @@ void Test_OS_ModuleUnload_Impl(void) * int32 OS_ModuleUnload_Impl ( uint32 module_id ) */ OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_unldByModuleId), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_unldByModuleId), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_unldByModuleId)); } @@ -86,7 +86,7 @@ void Test_OS_ModuleGetInfo_Impl(void) * but the boolean in the output struct should be false. */ memset(&module_prop, 0, sizeof(module_prop)); - UT_SetForceFail(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(0, &module_prop), OS_SUCCESS); UT_ClearForceFail(UT_KEY(OCS_moduleInfoGet)); UtAssert_True(!module_prop.addr.valid, "addresses in output not valid"); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c b/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c index bceac85b3..993d8c1b8 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c @@ -45,7 +45,7 @@ void Test_OS_MutSemCreate_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(0, 0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_semMInitialize), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_semMInitialize), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(0, 0), OS_SEM_FAILURE); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-network.c b/src/unit-test-coverage/vxworks/src/coveragetest-network.c index e196dc5cc..e241c74f2 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-network.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-network.c @@ -49,7 +49,7 @@ void Test_OS_NetworkGetHostName_Impl(void) char buffer[16]; OSAPI_TEST_FUNCTION_RC(OS_NetworkGetHostName_Impl(buffer, sizeof(buffer)), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_gethostname), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_gethostname), -1); OSAPI_TEST_FUNCTION_RC(OS_NetworkGetHostName_Impl(buffer, sizeof(buffer)), OS_ERROR); } /* end OS_NetworkGetHostName_Impl */ @@ -63,10 +63,10 @@ void Test_OS_NetworkGetID_Impl(void) */ int32 IdBuf; - UT_SetForceFail(UT_KEY(OCS_hostGetByName), 1234); + UT_SetDefaultReturnValue(UT_KEY(OCS_hostGetByName), 1234); OSAPI_TEST_FUNCTION_RC(OS_NetworkGetID_Impl(&IdBuf), OS_SUCCESS); UtAssert_True(IdBuf == 1234, "IdBuf (%ld) == 1234", (long)IdBuf); - UT_SetForceFail(UT_KEY(OCS_hostGetByName), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_hostGetByName), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_NetworkGetID_Impl(&IdBuf), OS_ERROR); } /* end OS_NetworkGetID_Impl */ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c b/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c index 7983ad49e..ed9b3083d 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c @@ -49,10 +49,10 @@ void Test_OS_ModuleLoad_Impl(void) * int32 OS_ModuleLoad_Impl ( uint32 module_id, char *translated_path ) */ OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); - UT_SetForceFail(UT_KEY(OCS_loadModule), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_loadModule), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_loadModule)); } @@ -63,7 +63,7 @@ void Test_OS_ModuleUnload_Impl(void) * int32 OS_ModuleUnload_Impl ( uint32 module_id ) */ OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_unldByModuleId), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_unldByModuleId), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_unldByModuleId)); } @@ -84,7 +84,7 @@ void Test_OS_ModuleGetInfo_Impl(void) * but the boolean in the output struct should be false. */ memset(&module_prop, 0, sizeof(module_prop)); - UT_SetForceFail(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(0, &module_prop), OS_SUCCESS); UT_ClearForceFail(UT_KEY(OCS_moduleInfoGet)); UtAssert_True(!module_prop.addr.valid, "addresses in output not valid"); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-queues.c b/src/unit-test-coverage/vxworks/src/coveragetest-queues.c index 7c059a148..1d1311142 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-queues.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-queues.c @@ -49,7 +49,7 @@ void Test_OS_QueueCreate_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(0, 0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_msgQCreate), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_msgQCreate), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(0, 0), OS_ERROR); } @@ -61,7 +61,7 @@ void Test_OS_QueueDelete_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_msgQDelete), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_msgQDelete), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(0), OS_ERROR); } @@ -78,10 +78,10 @@ void Test_OS_QueueGet_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_SUCCESS); OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, 100), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OS_Milli2Ticks), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_Milli2Ticks), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, 100), OS_ERROR); - UT_SetForceFail(UT_KEY(OCS_msgQReceive), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_msgQReceive), OCS_ERROR); OCS_errno = OCS_S_objLib_OBJ_TIMEOUT; OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_TIMEOUT); OCS_errno = OCS_S_objLib_OBJ_UNAVAILABLE; @@ -99,7 +99,7 @@ void Test_OS_QueuePut_Impl(void) char Data[16] = "Test"; OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(0, Data, sizeof(Data), 0), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_msgQSend), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_msgQSend), OCS_ERROR); OCS_errno = OCS_S_objLib_OBJ_UNAVAILABLE; OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(0, Data, sizeof(Data), 0), OS_QUEUE_FULL); OCS_errno = 0; diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-shell.c b/src/unit-test-coverage/vxworks/src/coveragetest-shell.c index af2897453..ea0110f41 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-shell.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-shell.c @@ -53,7 +53,7 @@ void Test_OS_ShellOutputToFile_Impl(void) UtAssert_True(UT_GetStubCount(UT_KEY(OCS_shellGenericInit)) == 1, "shellGenericInit() called"); /* failure to open the output file */ - UT_SetForceFail(UT_KEY(OS_OpenCreate), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_OpenCreate), OS_ERROR); expected = OS_ERROR; actual = OS_ShellOutputToFile_Impl(0, "TestCmd"); UtAssert_True(actual == expected, "OS_ShellOutputToFile_Impl() (%ld) == OS_ERROR", (long)actual); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index 890fd480d..3e729ed60 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -41,7 +41,7 @@ void Test_OS_SymbolLookup_Impl(void) cpuaddr SymAddr; OSAPI_TEST_FUNCTION_RC(OS_SymbolLookup_Impl(&SymAddr, "symname"), OS_SUCCESS); OSAPI_TEST_FUNCTION_RC(OS_SymbolLookup_Impl(NULL, NULL), OS_INVALID_POINTER); - UT_SetForceFail(UT_KEY(OCS_symFind), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_symFind), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_SymbolLookup_Impl(&SymAddr, "symname"), OS_ERROR); } @@ -54,10 +54,10 @@ void Test_OS_SymTableIterator_Impl(void) OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), true); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 101), false); - UT_SetForceFail(UT_KEY(OCS_strlen), OS_MAX_SYM_LEN + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_SYM_LEN + 10); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), false); UT_ClearForceFail(UT_KEY(OCS_strlen)); - UT_SetForceFail(UT_KEY(OCS_write), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_write), -1); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), false); UT_ClearForceFail(UT_KEY(OCS_write)); } @@ -68,7 +68,7 @@ void Test_OS_SymbolTableDump_Impl(void) * int32 OS_SymbolTableDump_Impl ( const char *filename, uint32 SizeLimit ) */ OSAPI_TEST_FUNCTION_RC(OS_SymbolTableDump_Impl("file", 10000), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_open), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_SymbolTableDump_Impl("file", 10000), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c index 0fd7b96ab..720f5edeb 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c @@ -70,7 +70,7 @@ void Test_OS_TaskCreate_Impl(void) /* create task with stack size of 250 - this should invoke malloc() to get the stack. * The first call checks the failure path and ensures that a malloc failure gets handled */ OS_task_table[0].stack_size = 250; - UT_SetForceFail(UT_KEY(OCS_malloc), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_malloc), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(0, 0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_malloc)); @@ -97,7 +97,7 @@ void Test_OS_TaskCreate_Impl(void) UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskActivate)) == 3, "taskActivate() called"); /* other failure modes */ - UT_SetForceFail(UT_KEY(OCS_taskInit), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_taskInit), -1); OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(0, 0), OS_ERROR); } @@ -122,7 +122,7 @@ void Test_OS_TaskDelete_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(0), OS_SUCCESS); /* failure mode */ - UT_SetForceFail(UT_KEY(OCS_taskDelete), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_taskDelete), -1); OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(0), OS_ERROR); } @@ -144,10 +144,10 @@ void Test_OS_TaskDelay_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_TaskDelay_Impl(100), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_taskDelay), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_taskDelay), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_TaskDelay_Impl(100), OS_ERROR); - UT_SetForceFail(UT_KEY(OS_Milli2Ticks), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OS_Milli2Ticks), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_TaskDelay_Impl(100), OS_ERROR); } @@ -159,7 +159,7 @@ void Test_OS_TaskSetPriority_Impl(void) */ OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(0, 100), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_taskPrioritySet), OCS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_taskPrioritySet), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(0, 100), OS_ERROR); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c index 92ad9198a..4e3fed283 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c @@ -41,7 +41,7 @@ void Test_OS_VxWorks_TimeBaseAPI_Impl_Init(void) * int32 OS_VxWorks_TimeBaseAPI_Impl_Init(void) */ OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TimeBaseAPI_Impl_Init(), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_sysClkRateGet), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_sysClkRateGet), -1); OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TimeBaseAPI_Impl_Init(), OS_ERROR); } @@ -110,17 +110,17 @@ void Test_OS_TimeBaseCreate_Impl(void) memset(&id, 0x01, sizeof(id)); OS_global_timebase_table[1].active_id = id; UT_TimeBaseTest_Setup(1, OCS_SIGRTMIN, false); - UT_SetForceFail(UT_KEY(OCS_sigismember), true); + UT_SetDefaultReturnValue(UT_KEY(OCS_sigismember), true); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_TIMER_ERR_UNAVAILABLE); UT_ResetState(UT_KEY(OCS_sigismember)); /* fail to initialize the sem */ - UT_SetForceFail(UT_KEY(OCS_semMInitialize), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_semMInitialize), -1); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_TIMER_ERR_INTERNAL); UT_ClearForceFail(UT_KEY(OCS_semMInitialize)); /* fail to spawn the task */ - UT_SetForceFail(UT_KEY(OCS_taskSpawn), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_taskSpawn), -1); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_TIMER_ERR_INTERNAL); UT_ClearForceFail(UT_KEY(OCS_taskSpawn)); @@ -152,7 +152,7 @@ void Test_OS_TimeBaseCreate_Impl(void) UtAssert_True(UT_TimeBaseTest_CheckTimeBaseRegisteredState(0), "timer successfully registered"); UT_TimeBaseTest_ClearTimeBaseRegState(0); - UT_SetForceFail(UT_KEY(OCS_timer_create), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_timer_create), -1); UT_TimeBaseTest_CallRegisterTimer(0); UtAssert_True(UT_TimeBaseTest_CheckTimeBaseErrorState(0), "timer registration failure state"); } @@ -200,7 +200,7 @@ void Test_OS_TimeBaseSet_Impl(void) UT_TimeBaseTest_Setup(0, OCS_SIGRTMIN, false); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(0, 1, 1), OS_SUCCESS); - UT_SetForceFail(UT_KEY(OCS_timer_settime), -1); + UT_SetDefaultReturnValue(UT_KEY(OCS_timer_settime), -1); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(0, 1, 1), OS_TIMER_ERR_INVALID_ARGS); } diff --git a/ut_assert/inc/utstubs.h b/ut_assert/inc/utstubs.h index 429c7519b..74e3c6fb3 100644 --- a/ut_assert/inc/utstubs.h +++ b/ut_assert/inc/utstubs.h @@ -191,12 +191,30 @@ void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, uint32 *MaxSize, * \param FuncKey The stub function to add the return code to. * \param Value Arbitrary failure mode value (may or may not be used by the stub) */ +void UT_SetDefaultReturnValue(UT_EntryKey_t FuncKey, int32 Value); + +#ifndef OSAL_OMIT_DEPRECATED +/** + * Enable or disable the forced failure mode for the given stub function + * + * This triggers a constant failure mode from the stub function, if implemented. + * The stub function will invoke a given failure path as defined by + * the stub implementation. + * + * A count of the number of times the failure mode is invoked will be maintained. + * + * \param FuncKey The stub function to add the return code to. + * \param Value Arbitrary failure mode value (may or may not be used by the stub) + * + * @deprecated replaced by UT_SetDefaultReturnValue + */ void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value); +#endif /** * Disable the forced failure mode for the given stub function * - * This undoes the action of UT_SetForceFail() + * This undoes the action of UT_SetDefaultReturnValue() * * \param FuncKey The stub function entry to clear. */ @@ -293,11 +311,11 @@ bool UT_Stub_CheckDeferredRetcode(UT_EntryKey_t FuncKey, int32 *Retcode); /** * Check for a forced failure mode entry for the given stub function * - * If a UT_SetForceFail() option is in place for the given function this + * If a UT_SetDefaultReturnValue() option is in place for the given function this * will return true and increment the internal usage counter. * * \param FuncKey The stub function to check the return code. - * \param Value Set to the value supplied to UT_SetForceFail() + * \param Value Set to the value supplied to UT_SetDefaultReturnValue() * \returns true if force fail mode is active */ bool UT_Stub_CheckForceFail(UT_EntryKey_t FuncKey, int32 *Value); diff --git a/ut_assert/src/utstubs.c b/ut_assert/src/utstubs.c index 79693e2f6..b97404d3e 100644 --- a/ut_assert/src/utstubs.c +++ b/ut_assert/src/utstubs.c @@ -308,7 +308,7 @@ bool UT_Stub_CheckDeferredRetcode(UT_EntryKey_t FuncKey, int32 *Retcode) return (Result); } -void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value) +void UT_SetDefaultReturnValue(UT_EntryKey_t FuncKey, int32 Value) { UT_StubTableEntry_t *Rc; @@ -335,6 +335,13 @@ void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value) } } +#ifndef OSAL_OMIT_DEPRECATED +void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value) +{ + UT_SetDefaultReturnValue(FuncKey, Value); +} +#endif + void UT_ClearForceFail(UT_EntryKey_t FuncKey) { UT_StubTableEntry_t *StubPtr; From 2b5b4b18c9acc89512687718e41ab42cacbba532 Mon Sep 17 00:00:00 2001 From: astrogeco <59618057+astrogeco@users.noreply.github.com> Date: Fri, 13 Nov 2020 15:49:07 -0500 Subject: [PATCH 007/111] Bump to v5.1.0-rc1+dev75 and update ReadMe --- README.md | 9 +++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 69ce4e7ed..b8741f519 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,15 @@ The autogenerated OSAL user's guide can be viewed at + ### Development Build: 5.1.0-rc1+dev68 - When `OS_DEBUG` is enabled, this adds a message if mutex give/take actions occur outside the expected sequence. This informs the user (via the debug console) if a lock is taken more than once or if a lock is given by a different task than the one that originally took it: diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index 98d95a4a8..f8df9294b 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 67 +#define OS_BUILD_NUMBER 75 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* From 2899dfec30cf31aa3d2c49ec43eef3cc2fc55373 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Thu, 29 Oct 2020 10:24:20 -0400 Subject: [PATCH 008/111] Fix #635, add typedefs for osal stack and priority Adds typedefs for: - osal_priority_t - osal_stackptr_t - osal_index_t - osal_objtype_t - osal_blockcount_t Note that by using `uint8` as the priority type, all values are valid and it is no longer possible to pass a value which is out of range. Checks/tests for this are no longer valid and would cause compiler warnings. --- src/bsp/generic-linux/src/bsp_console.c | 2 +- src/bsp/generic-linux/src/bsp_start.c | 2 +- src/bsp/generic-vxworks/src/bsp_console.c | 2 +- src/bsp/shared/inc/bsp-impl.h | 10 +- src/os/inc/common_types.h | 36 ++++++ src/os/inc/osapi-os-core.h | 57 ++++++--- src/os/inc/osapi-os-filesys.h | 14 +-- src/os/inc/osapi-os-loader.h | 2 +- src/os/inc/osapi-os-net.h | 10 +- src/os/inc/osapi-os-timer.h | 4 +- src/os/portable/os-impl-bsd-select.c | 24 ++-- src/os/portable/os-impl-bsd-sockets.c | 21 ++-- src/os/portable/os-impl-console-bsp.c | 8 +- src/os/portable/os-impl-no-loader.c | 6 +- src/os/portable/os-impl-no-network.c | 2 +- src/os/portable/os-impl-no-shell.c | 2 +- src/os/portable/os-impl-no-sockets.c | 4 +- src/os/portable/os-impl-no-symtab.c | 2 +- src/os/portable/os-impl-posix-dirs.c | 8 +- src/os/portable/os-impl-posix-dl-loader.c | 8 +- src/os/portable/os-impl-posix-dl-symtab.c | 6 +- src/os/portable/os-impl-posix-files.c | 2 +- src/os/portable/os-impl-posix-io.c | 8 +- src/os/portable/os-impl-posix-network.c | 2 +- src/os/posix/inc/os-impl-io.h | 4 +- src/os/posix/inc/os-posix.h | 8 +- src/os/posix/src/os-impl-binsem.c | 14 +-- src/os/posix/src/os-impl-common.c | 2 +- src/os/posix/src/os-impl-console.c | 12 +- src/os/posix/src/os-impl-countsem.c | 12 +- src/os/posix/src/os-impl-files.c | 4 +- src/os/posix/src/os-impl-filesys.c | 20 ++-- src/os/posix/src/os-impl-idmap.c | 6 +- src/os/posix/src/os-impl-mutex.c | 10 +- src/os/posix/src/os-impl-queues.c | 14 +-- src/os/posix/src/os-impl-shell.c | 2 +- src/os/posix/src/os-impl-tasks.c | 20 ++-- src/os/posix/src/os-impl-timebase.c | 33 ++--- src/os/rtems/inc/os-rtems.h | 2 +- src/os/rtems/src/os-impl-binsem.c | 14 +-- src/os/rtems/src/os-impl-common.c | 2 +- src/os/rtems/src/os-impl-console.c | 4 +- src/os/rtems/src/os-impl-countsem.c | 12 +- src/os/rtems/src/os-impl-filesys.c | 14 +-- src/os/rtems/src/os-impl-idmap.c | 6 +- src/os/rtems/src/os-impl-loader.c | 6 +- src/os/rtems/src/os-impl-mutex.c | 10 +- src/os/rtems/src/os-impl-queues.c | 10 +- src/os/rtems/src/os-impl-tasks.c | 12 +- src/os/rtems/src/os-impl-timebase.c | 16 +-- src/os/shared/inc/os-shared-binsem.h | 14 +-- src/os/shared/inc/os-shared-common.h | 2 +- src/os/shared/inc/os-shared-countsem.h | 12 +- src/os/shared/inc/os-shared-dir.h | 8 +- src/os/shared/inc/os-shared-file.h | 12 +- src/os/shared/inc/os-shared-filesys.h | 36 +++--- src/os/shared/inc/os-shared-globaldefs.h | 2 +- src/os/shared/inc/os-shared-idmap.h | 41 ++++--- src/os/shared/inc/os-shared-module.h | 10 +- src/os/shared/inc/os-shared-mutex.h | 10 +- src/os/shared/inc/os-shared-network.h | 2 +- src/os/shared/inc/os-shared-printf.h | 12 +- src/os/shared/inc/os-shared-queue.h | 16 +-- src/os/shared/inc/os-shared-select.h | 2 +- src/os/shared/inc/os-shared-shell.h | 2 +- src/os/shared/inc/os-shared-sockets.h | 19 +-- src/os/shared/inc/os-shared-task.h | 20 ++-- src/os/shared/inc/os-shared-time.h | 6 +- src/os/shared/inc/os-shared-timebase.h | 12 +- src/os/shared/src/osapi-binsem.c | 14 +-- src/os/shared/src/osapi-common.c | 6 +- src/os/shared/src/osapi-countsem.c | 12 +- src/os/shared/src/osapi-dir.c | 8 +- src/os/shared/src/osapi-file.c | 44 +++---- src/os/shared/src/osapi-filesys.c | 40 +++---- src/os/shared/src/osapi-idmap.c | 82 +++++++------ src/os/shared/src/osapi-module.c | 10 +- src/os/shared/src/osapi-mutex.c | 10 +- src/os/shared/src/osapi-network.c | 2 +- src/os/shared/src/osapi-printf.c | 10 +- src/os/shared/src/osapi-queue.c | 17 +-- src/os/shared/src/osapi-select.c | 14 +-- src/os/shared/src/osapi-shell.c | 2 +- src/os/shared/src/osapi-sockets.c | 27 +++-- src/os/shared/src/osapi-task.c | 59 ++++----- src/os/shared/src/osapi-time.c | 40 ++++--- src/os/shared/src/osapi-timebase.c | 44 +++---- src/os/vxworks/inc/os-impl-io.h | 4 +- src/os/vxworks/inc/os-impl-symtab.h | 4 +- src/os/vxworks/inc/os-vxworks.h | 6 +- src/os/vxworks/src/os-impl-binsem.c | 14 +-- src/os/vxworks/src/os-impl-common.c | 2 +- src/os/vxworks/src/os-impl-console.c | 6 +- src/os/vxworks/src/os-impl-countsem.c | 12 +- src/os/vxworks/src/os-impl-dirs.c | 8 +- src/os/vxworks/src/os-impl-files.c | 4 +- src/os/vxworks/src/os-impl-filesys.c | 20 ++-- src/os/vxworks/src/os-impl-heap.c | 6 +- src/os/vxworks/src/os-impl-idmap.c | 6 +- src/os/vxworks/src/os-impl-loader.c | 6 +- src/os/vxworks/src/os-impl-mutex.c | 10 +- src/os/vxworks/src/os-impl-network.c | 2 +- src/os/vxworks/src/os-impl-queues.c | 12 +- src/os/vxworks/src/os-impl-shell.c | 12 +- src/os/vxworks/src/os-impl-symtab.c | 12 +- src/os/vxworks/src/os-impl-tasks.c | 22 ++-- src/os/vxworks/src/os-impl-timebase.c | 27 +++-- .../bin-sem-flush-test/bin-sem-flush-test.c | 9 +- src/tests/bin-sem-test/bin-sem-test.c | 3 +- .../bin-sem-timeout-test.c | 3 +- src/tests/count-sem-test/count-sem-test.c | 9 +- src/tests/file-api-test/file-api-test.c | 47 ++++---- src/tests/idmap-api-test/idmap-api-test.c | 11 +- src/tests/mutex-test/mutex-test.c | 9 +- src/tests/network-api-test/network-api-test.c | 25 ++-- src/tests/osal-core-test/osal-core-test.c | 44 ++++--- .../queue-timeout-test/queue-timeout-test.c | 9 +- src/tests/sem-speed-test/sem-speed-test.c | 6 +- .../time-base-api-test/time-base-api-test.c | 2 +- src/tests/timer-test/timer-test.c | 22 ++-- .../inc/ut-adaptor-portable-posix-io.h | 2 +- .../src/ut-adaptor-portable-posix-io.c | 2 +- .../portable/src/coveragetest-bsd-select.c | 8 +- .../portable/src/coveragetest-no-loader.c | 6 +- .../portable/src/coveragetest-no-shell.c | 2 +- .../portable/src/coveragetest-posix-files.c | 10 +- .../portable/src/coveragetest-posix-io.c | 36 +++--- .../portable/src/os-portable-coveragetest.h | 11 ++ .../shared/src/coveragetest-binsem.c | 2 +- .../shared/src/coveragetest-countsem.c | 2 +- .../shared/src/coveragetest-file.c | 2 +- .../shared/src/coveragetest-filesys.c | 36 +++--- .../shared/src/coveragetest-idmap.c | 69 +++++------ .../shared/src/coveragetest-module.c | 9 +- .../shared/src/coveragetest-mutex.c | 2 +- .../shared/src/coveragetest-queue.c | 12 +- .../shared/src/coveragetest-sockets.c | 32 ++--- .../shared/src/coveragetest-task.c | 36 +++--- .../shared/src/coveragetest-time.c | 26 ++-- .../shared/src/coveragetest-timebase.c | 13 +- .../shared/src/os-shared-coveragetest.h | 4 + .../ut-stubs/inc/OCS_bsp-impl.h | 2 +- .../ut-stubs/src/bsp-console-impl-stubs.c | 2 +- .../ut-stubs/src/libc-stdio-stubs.c | 2 +- .../ut-stubs/src/libc-stdlib-stubs.c | 4 +- .../ut-stubs/src/osapi-binsem-impl-stubs.c | 14 +-- .../ut-stubs/src/osapi-common-impl-stubs.c | 2 +- .../ut-stubs/src/osapi-console-impl-stubs.c | 4 +- .../ut-stubs/src/osapi-countsem-impl-stubs.c | 12 +- .../ut-stubs/src/osapi-file-impl-stubs.c | 20 ++-- .../ut-stubs/src/osapi-filesys-impl-stubs.c | 14 +-- .../ut-stubs/src/osapi-idmap-impl-stubs.c | 4 +- .../ut-stubs/src/osapi-loader-impl-stubs.c | 10 +- .../ut-stubs/src/osapi-mutex-impl-stubs.c | 10 +- .../ut-stubs/src/osapi-network-impl-stubs.c | 21 ++-- .../ut-stubs/src/osapi-queue-impl-stubs.c | 10 +- .../ut-stubs/src/osapi-select-impl-stubs.c | 2 +- .../ut-stubs/src/osapi-task-impl-stubs.c | 14 +-- .../ut-stubs/src/osapi-timer-impl-stubs.c | 14 +-- .../src/portable-console-bsp-impl-stubs.c | 2 +- .../ut-stubs/src/posix-unistd-stubs.c | 4 +- .../ut-stubs/src/vxworks-intLib-stubs.c | 2 +- .../vxworks/adaptors/inc/ut-adaptor-console.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-files.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-filesys.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-idmap.h | 4 +- .../vxworks/adaptors/inc/ut-adaptor-symtab.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-tasks.h | 4 +- .../adaptors/inc/ut-adaptor-timebase.h | 14 +-- .../vxworks/adaptors/src/ut-adaptor-console.c | 2 +- .../vxworks/adaptors/src/ut-adaptor-files.c | 2 +- .../vxworks/adaptors/src/ut-adaptor-filesys.c | 2 +- .../adaptors/src/ut-adaptor-filetable-stub.c | 2 +- .../vxworks/adaptors/src/ut-adaptor-idmap.c | 4 +- .../vxworks/adaptors/src/ut-adaptor-symtab.c | 2 +- .../vxworks/adaptors/src/ut-adaptor-tasks.c | 4 +- .../adaptors/src/ut-adaptor-timebase.c | 14 +-- .../vxworks/src/coveragetest-binsem.c | 24 ++-- .../vxworks/src/coveragetest-countsem.c | 16 +-- .../vxworks/src/coveragetest-dirs.c | 12 +- .../vxworks/src/coveragetest-loader.c | 14 +-- .../vxworks/src/coveragetest-mutex.c | 12 +- .../vxworks/src/coveragetest-queues.c | 32 ++--- .../vxworks/src/coveragetest-shell.c | 4 +- .../vxworks/src/coveragetest-symtab.c | 6 +- .../vxworks/src/coveragetest-tasks.c | 36 +++--- .../vxworks/src/coveragetest-timebase.c | 56 ++++----- .../vxworks/src/os-vxworks-coveragetest.h | 4 + .../src/vxworks-os-impl-common-stubs.c | 2 +- .../oscore-test/ut_oscore_misc_test.c | 14 ++- .../oscore-test/ut_oscore_queue_test.c | 90 +++++++------- .../oscore-test/ut_oscore_select_test.c | 2 +- .../oscore-test/ut_oscore_task_test.c | 113 ++++++++---------- .../osfile-test/ut_osfile_fileio_test.c | 5 +- src/unit-tests/osfile-test/ut_osfile_test.c | 2 +- .../osfilesys-test/ut_osfilesys_diskio_test.c | 12 +- .../osfilesys-test/ut_osfilesys_test.c | 4 +- src/ut-stubs/osapi-utstub-dir.c | 2 +- src/ut-stubs/osapi-utstub-file.c | 22 ++-- src/ut-stubs/osapi-utstub-filesys.c | 4 +- src/ut-stubs/osapi-utstub-heap.c | 6 +- src/ut-stubs/osapi-utstub-idmap.c | 64 ++++++---- src/ut-stubs/osapi-utstub-module.c | 2 +- src/ut-stubs/osapi-utstub-network.c | 2 +- src/ut-stubs/osapi-utstub-printf.c | 2 +- src/ut-stubs/osapi-utstub-queue.c | 7 +- src/ut-stubs/osapi-utstub-sockets.c | 12 +- src/ut-stubs/osapi-utstub-task.c | 12 +- ut_assert/inc/utstubs.h | 8 +- ut_assert/src/utstubs.c | 20 ++-- 210 files changed, 1439 insertions(+), 1321 deletions(-) diff --git a/src/bsp/generic-linux/src/bsp_console.c b/src/bsp/generic-linux/src/bsp_console.c index 766640952..ddae03c99 100644 --- a/src/bsp/generic-linux/src/bsp_console.c +++ b/src/bsp/generic-linux/src/bsp_console.c @@ -72,7 +72,7 @@ static void OS_BSP_ExecTput(const char *cap, const char *param) OS_BSP_ConsoleOutput_Impl See full description in header ------------------------------------------------------------------*/ -void OS_BSP_ConsoleOutput_Impl(const char *Str, uint32 DataLen) +void OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen) { ssize_t WriteLen; diff --git a/src/bsp/generic-linux/src/bsp_start.c b/src/bsp/generic-linux/src/bsp_start.c index 0254ec8e0..1267b18d3 100644 --- a/src/bsp/generic-linux/src/bsp_start.c +++ b/src/bsp/generic-linux/src/bsp_start.c @@ -69,7 +69,7 @@ void OS_BSP_Initialize(void) { if (fgets(buffer, sizeof(buffer), fp) != NULL) { - OS_BSP_Global.MaxQueueDepth = strtoul(buffer, NULL, 10); + OS_BSP_Global.MaxQueueDepth = OSAL_BLOCKCOUNT_C(strtoul(buffer, NULL, 10)); BSP_DEBUG("Maximum user msg queue depth = %u\n", (unsigned int)OS_BSP_Global.MaxQueueDepth); } fclose(fp); diff --git a/src/bsp/generic-vxworks/src/bsp_console.c b/src/bsp/generic-vxworks/src/bsp_console.c index b96ffe13b..660d8319b 100644 --- a/src/bsp/generic-vxworks/src/bsp_console.c +++ b/src/bsp/generic-vxworks/src/bsp_console.c @@ -40,7 +40,7 @@ OS_BSP_ConsoleOutput_Impl See full description in header ------------------------------------------------------------------*/ -void OS_BSP_ConsoleOutput_Impl(const char *Str, uint32 DataLen) +void OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen) { while (DataLen > 0) { diff --git a/src/bsp/shared/inc/bsp-impl.h b/src/bsp/shared/inc/bsp-impl.h index 1f67853a6..4c26a9b63 100644 --- a/src/bsp/shared/inc/bsp-impl.h +++ b/src/bsp/shared/inc/bsp-impl.h @@ -90,10 +90,10 @@ */ typedef struct { - uint32 ArgC; /* number of boot/startup parameters in ArgV */ - char **ArgV; /* strings for boot/startup parameters */ - int32 AppStatus; /* value which can be returned to the OS (0=nominal) */ - uint32 MaxQueueDepth; /* Queue depth limit supported by BSP (0=no limit) */ + uint32 ArgC; /* number of boot/startup parameters in ArgV */ + char ** ArgV; /* strings for boot/startup parameters */ + int32 AppStatus; /* value which can be returned to the OS (0=nominal) */ + osal_blockcount_t MaxQueueDepth; /* Queue depth limit supported by BSP (0=no limit) */ } OS_BSP_GlobalData_t; /* @@ -118,7 +118,7 @@ extern OS_BSP_GlobalData_t OS_BSP_Global; Note: This should write the string as-is without buffering. ------------------------------------------------------------------*/ -void OS_BSP_ConsoleOutput_Impl(const char *Str, uint32 DataLen); +void OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen); /*---------------------------------------------------------------- Function: OS_BSP_ConsoleSetMode_Impl diff --git a/src/os/inc/common_types.h b/src/os/inc/common_types.h index a9bc35762..258f55a3b 100644 --- a/src/os/inc/common_types.h +++ b/src/os/inc/common_types.h @@ -101,6 +101,28 @@ extern "C" */ typedef uint32_t osal_id_t; + /** + * A type used to represent a number of blocks or buffers + * + * This is used with file system and queue implementations. + */ + typedef size_t osal_blockcount_t; + + /** + * A type used to represent an index into a table structure + * + * This is used when referring directly to a table index as + * opposed to an object ID. It is primarily intended for + * internal use, but is also output from public APIs such as + * OS_ObjectIdToArrayIndex(). + */ + typedef uint32 osal_index_t; + + /** + * A type used to represent the runtime type or category of an OSAL object + */ + typedef uint32 osal_objtype_t; + #ifndef NULL /* pointer to nothing */ #define NULL ((void *)0) #endif @@ -150,4 +172,18 @@ extern "C" } #endif +/* + * Type macros for literals + * + * These macros enforce that a literal or other value is + * interpreted as the intended type. Although implicit + * conversions between these types are often possible, using + * this makes it explicit in the code where a type conversion + * is expected. + */ +#define OSAL_SIZE_C(X) ((size_t) {X}) +#define OSAL_BLOCKCOUNT_C(X) ((osal_blockcount_t) {X}) +#define OSAL_INDEX_C(X) ((osal_index_t) {X}) +#define OSAL_OBJTYPE_C(X) ((osal_objtype_t) {X}) + #endif /* _common_types_ */ diff --git a/src/os/inc/osapi-os-core.h b/src/os/inc/osapi-os-core.h index a6fa0d47c..befa5583f 100644 --- a/src/os/inc/osapi-os-core.h +++ b/src/os/inc/osapi-os-core.h @@ -86,15 +86,34 @@ */ #define OS_ERROR_NAME_LENGTH 35 +/** + * @brief Type to be used for OSAL task priorities. + * + * OSAL priorities are in reverse order, and range + * from 0 (highest; will preempt all other tasks) to + * 255 (lowest; will not preempt any other task). + */ +typedef uint8_t osal_priority_t; + +#define OSAL_PRIORITY_C(X) ((osal_priority_t) {X}) + +/** + * @brief Type to be used for OSAL stack pointer. + */ +typedef void *osal_stackptr_t; + +#define OSAL_STACKPTR_C(X) ((osal_stackptr_t) {X}) +#define OSAL_TASK_STACK_ALLOCATE OSAL_STACKPTR_C(NULL) + /* Object property structures */ /** @brief OSAL task properties */ typedef struct { - char name[OS_MAX_API_NAME]; - osal_id_t creator; - uint32 stack_size; - uint32 priority; + char name[OS_MAX_API_NAME]; + osal_id_t creator; + size_t stack_size; + osal_priority_t priority; } OS_task_prop_t; /** @brief OSAL queue properties */ @@ -140,9 +159,9 @@ typedef struct */ typedef struct { - uint32 free_bytes; - uint32 free_blocks; - uint32 largest_free_block; + size_t free_bytes; + osal_blockcount_t free_blocks; + size_t largest_free_block; } OS_heap_prop_t; /** @@ -467,7 +486,7 @@ static inline bool OS_ObjectIdDefined(osal_id_t object_id) * #OS_INVALID_POINTER if the passed-in buffer is invalid * #OS_ERR_NAME_TOO_LONG if the name will not fit in the buffer provided */ -int32 OS_GetResourceName(osal_id_t object_id, char *buffer, uint32 buffer_size); +int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size); /*-------------------------------------------------------------------------------------*/ /** @@ -480,7 +499,7 @@ int32 OS_GetResourceName(osal_id_t object_id, char *buffer, uint32 buffer_size); * @return The object type portion of the object_id, see @ref OSObjectTypes for * expected values */ -uint32 OS_IdentifyObject(osal_id_t object_id); +osal_objtype_t OS_IdentifyObject(osal_id_t object_id); /*-------------------------------------------------------------------------------------*/ /** @@ -506,7 +525,7 @@ uint32 OS_IdentifyObject(osal_id_t object_id); * @retval #OS_SUCCESS @copybrief OS_SUCCESS * @retval #OS_ERR_INCORRECT_OBJ_TYPE @copybrief OS_ERR_INCORRECT_OBJ_TYPE */ -int32 OS_ConvertToArrayIndex(osal_id_t object_id, uint32 *ArrayIndex); +int32 OS_ConvertToArrayIndex(osal_id_t object_id, osal_index_t *ArrayIndex); /*-------------------------------------------------------------------------------------*/ /** @@ -537,7 +556,7 @@ int32 OS_ConvertToArrayIndex(osal_id_t object_id, uint32 *ArrayIndex); * @retval #OS_SUCCESS @copybrief OS_SUCCESS * @retval #OS_ERR_INCORRECT_OBJ_TYPE @copybrief OS_ERR_INCORRECT_OBJ_TYPE * */ -int32 OS_ObjectIdToArrayIndex(uint32 idtype, osal_id_t object_id, uint32 *ArrayIndex); +int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t object_id, osal_index_t *ArrayIndex); /*-------------------------------------------------------------------------------------*/ /** @@ -566,7 +585,8 @@ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void * @param[in] callback_ptr Function to invoke for each matching object ID * @param[in] callback_arg Opaque Argument to pass to callback function */ -void OS_ForEachObjectOfType(uint32 objtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg); +void OS_ForEachObjectOfType(osal_objtype_t objtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, + void *callback_arg); /*-------------------------------------------------------------------------------------*/ /** @@ -617,8 +637,8 @@ int32 OS_RegisterEventHandler(OS_EventHandler_t handler); * @retval #OS_ERR_NAME_TAKEN if the name specified is already used by a task * @retval #OS_ERROR if an unspecified/other error occurs */ -int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, uint32 *stack_pointer, - uint32 stack_size, uint32 priority, uint32 flags); +int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, + osal_stackptr_t stack_pointer, size_t stack_size, osal_priority_t priority, uint32 flags); /*-------------------------------------------------------------------------------------*/ /** @@ -687,7 +707,7 @@ int32 OS_TaskDelay(uint32 millisecond); * @retval #OS_ERR_INVALID_PRIORITY if the priority is greater than the max allowed * @retval #OS_ERROR if the OS call to change the priority fails */ -int32 OS_TaskSetPriority(osal_id_t task_id, uint32 new_priority); +int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority); /*-------------------------------------------------------------------------------------*/ /** @@ -797,7 +817,8 @@ int32 OS_TaskFindIdBySystemData(osal_id_t *task_id, const void *sysdata, size_t * @retval #OS_QUEUE_INVALID_SIZE if the queue depth exceeds the limit * @retval #OS_ERROR if the OS create call fails */ -int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, uint32 queue_depth, uint32 data_size, uint32 flags); +int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, + uint32 flags); /*-------------------------------------------------------------------------------------*/ /** @@ -839,7 +860,7 @@ int32 OS_QueueDelete(osal_id_t queue_id); * @retval #OS_QUEUE_TIMEOUT if the timeout was OS_PEND and the time expired * @retval #OS_QUEUE_INVALID_SIZE if the size copied from the queue was not correct */ -int32 OS_QueueGet(osal_id_t queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout); +int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout); /*-------------------------------------------------------------------------------------*/ /** @@ -857,7 +878,7 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, uint32 size, uint32 *size_copi * @retval #OS_QUEUE_FULL if the queue cannot accept another message * @retval #OS_ERROR if the OS call returns an error */ -int32 OS_QueuePut(osal_id_t queue_id, const void *data, uint32 size, uint32 flags); +int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flags); /*-------------------------------------------------------------------------------------*/ /** diff --git a/src/os/inc/osapi-os-filesys.h b/src/os/inc/osapi-os-filesys.h index 764ae0d4e..d09c2616d 100644 --- a/src/os/inc/osapi-os-filesys.h +++ b/src/os/inc/osapi-os-filesys.h @@ -112,7 +112,7 @@ typedef struct { uint32 FileModeBits; int32 FileTime; - uint32 FileSize; + size_t FileSize; } os_fstat_t; /** @@ -285,7 +285,7 @@ int32 OS_close(osal_id_t filedes); * @retval #OS_ERROR if OS call failed * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid */ -int32 OS_read(osal_id_t filedes, void *buffer, uint32 nbytes); +int32 OS_read(osal_id_t filedes, void *buffer, size_t nbytes); /*-------------------------------------------------------------------------------------*/ /** @@ -306,7 +306,7 @@ int32 OS_read(osal_id_t filedes, void *buffer, uint32 nbytes); * @retval #OS_ERROR if OS call failed * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid */ -int32 OS_write(osal_id_t filedes, const void *buffer, uint32 nbytes); +int32 OS_write(osal_id_t filedes, const void *buffer, size_t nbytes); /*-------------------------------------------------------------------------------------*/ /** @@ -337,7 +337,7 @@ int32 OS_write(osal_id_t filedes, const void *buffer, uint32 nbytes); * @return Byte count on success, zero for timeout, or appropriate error code, * see @ref OSReturnCodes */ -int32 OS_TimedRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeout); +int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout); /*-------------------------------------------------------------------------------------*/ /** @@ -368,7 +368,7 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeout * @return Byte count on success, zero for timeout, or appropriate error code, * see @ref OSReturnCodes */ -int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, uint32 nbytes, int32 timeout); +int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout); /*-------------------------------------------------------------------------------------*/ /** @@ -715,7 +715,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const * @retval #OS_FS_ERR_DEVICE_NOT_FREE if the volume table is full * @retval #OS_SUCCESS on creating the disk */ -int32 OS_mkfs(char *address, const char *devname, const char *volname, uint32 blocksize, uint32 numblocks); +int32 OS_mkfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks); /*-------------------------------------------------------------------------------------*/ /** * @brief Mounts a file system @@ -754,7 +754,7 @@ int32 OS_mount(const char *devname, const char *mountpoint); * @retval #OS_FS_ERR_DEVICE_NOT_FREE if the volume table is full * @retval #OS_FS_ERR_DRIVE_NOT_CREATED on error */ -int32 OS_initfs(char *address, const char *devname, const char *volname, uint32 blocksize, uint32 numblocks); +int32 OS_initfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks); /*-------------------------------------------------------------------------------------*/ /** diff --git a/src/os/inc/osapi-os-loader.h b/src/os/inc/osapi-os-loader.h index c5a49053e..8aff625fc 100644 --- a/src/os/inc/osapi-os-loader.h +++ b/src/os/inc/osapi-os-loader.h @@ -176,7 +176,7 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const * @retval #OS_ERR_NOT_IMPLEMENTED @copybrief OS_ERR_NOT_IMPLEMENTED * @retval #OS_ERROR if the symbol table could not be read or dumped */ -int32 OS_SymbolTableDump(const char *filename, uint32 size_limit); +int32 OS_SymbolTableDump(const char *filename, size_t size_limit); /*-------------------------------------------------------------------------------------*/ /** diff --git a/src/os/inc/osapi-os-net.h b/src/os/inc/osapi-os-net.h index 5a270266f..2283ef2d6 100644 --- a/src/os/inc/osapi-os-net.h +++ b/src/os/inc/osapi-os-net.h @@ -102,7 +102,7 @@ typedef union */ typedef struct { - uint32 ActualLength; /**< @brief Length of the actual address data */ + size_t ActualLength; /**< @brief Length of the actual address data */ OS_SockAddrData_t AddrData; /**< @brief Abstract Address data */ } OS_SockAddr_t; @@ -162,7 +162,7 @@ int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain); * * @return Execution status, see @ref OSReturnCodes */ -int32 OS_SocketAddrToString(char *buffer, uint32 buflen, const OS_SockAddr_t *Addr); +int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Addr); /*-------------------------------------------------------------------------------------*/ /** @@ -317,7 +317,7 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * * * @return Count of actual bytes received or error status, see @ref OSReturnCodes */ -int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, uint32 buflen, OS_SockAddr_t *RemoteAddr, int32 timeout); +int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout); /*-------------------------------------------------------------------------------------*/ /** @@ -334,7 +334,7 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, uint32 buflen, OS_SockA * * @return Count of actual bytes sent or error status, see @ref OSReturnCodes */ -int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, uint32 buflen, const OS_SockAddr_t *RemoteAddr); +int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr); /*-------------------------------------------------------------------------------------*/ /** @@ -400,7 +400,7 @@ int32 OS_NetworkGetID(void); * * @return Execution status, see @ref OSReturnCodes */ -int32 OS_NetworkGetHostName(char *host_name, uint32 name_len); +int32 OS_NetworkGetHostName(char *host_name, size_t name_len); /**@}*/ #endif diff --git a/src/os/inc/osapi-os-timer.h b/src/os/inc/osapi-os-timer.h index 8cf2a2d58..e9b7ef3c6 100644 --- a/src/os/inc/osapi-os-timer.h +++ b/src/os/inc/osapi-os-timer.h @@ -33,8 +33,8 @@ /* ** Typedefs */ -typedef void (*OS_TimerCallback_t)(osal_id_t timer_id); /**< @brief Timer callback */ -typedef uint32 (*OS_TimerSync_t)(uint32 timer_id); /**< @brief Timer sync */ +typedef void (*OS_TimerCallback_t)(osal_id_t timer_id); /**< @brief Timer callback */ +typedef uint32 (*OS_TimerSync_t)(osal_index_t timer_id); /**< @brief Timer sync */ /** @brief Timer properties */ typedef struct diff --git a/src/os/portable/os-impl-bsd-select.c b/src/os/portable/os-impl-bsd-select.c index 67ae82bed..145d603fb 100644 --- a/src/os/portable/os-impl-bsd-select.c +++ b/src/os/portable/os-impl-bsd-select.c @@ -74,12 +74,12 @@ *-----------------------------------------------------------------*/ static int OS_FdSet_ConvertIn_Impl(fd_set *os_set, OS_FdSet *OSAL_set) { - uint32 offset; - uint32 bit; - uint32 id; - uint8 objids; - int osfd; - int maxfd; + size_t offset; + size_t bit; + osal_index_t id; + uint8 objids; + int osfd; + int maxfd; maxfd = -1; for (offset = 0; offset < sizeof(OSAL_set->object_ids); ++offset) @@ -122,11 +122,11 @@ static int OS_FdSet_ConvertIn_Impl(fd_set *os_set, OS_FdSet *OSAL_set) *-----------------------------------------------------------------*/ static void OS_FdSet_ConvertOut_Impl(fd_set *output, OS_FdSet *Input) { - uint32 offset; - uint32 bit; - uint32 id; - uint8 objids; - int osfd; + size_t offset; + size_t bit; + osal_index_t id; + uint8 objids; + int osfd; for (offset = 0; offset < sizeof(Input->object_ids); ++offset) { @@ -249,7 +249,7 @@ static int32 OS_DoSelect(int maxfd, fd_set *rd_set, fd_set *wr_set, int32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SelectSingle_Impl(uint32 stream_id, uint32 *SelectFlags, int32 msecs) +int32 OS_SelectSingle_Impl(osal_index_t stream_id, uint32 *SelectFlags, int32 msecs) { int32 return_code; fd_set wr_set; diff --git a/src/os/portable/os-impl-bsd-sockets.c b/src/os/portable/os-impl-bsd-sockets.c index 524fe42a3..655dc0287 100644 --- a/src/os/portable/os-impl-bsd-sockets.c +++ b/src/os/portable/os-impl-bsd-sockets.c @@ -84,7 +84,7 @@ typedef union * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketOpen_Impl(uint32 sock_id) +int32 OS_SocketOpen_Impl(osal_index_t sock_id) { int os_domain; int os_type; @@ -175,7 +175,7 @@ int32 OS_SocketOpen_Impl(uint32 sock_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketBind_Impl(uint32 sock_id, const OS_SockAddr_t *Addr) +int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr) { int os_result; socklen_t addrlen; @@ -231,7 +231,7 @@ int32 OS_SocketBind_Impl(uint32 sock_id, const OS_SockAddr_t *Addr) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketConnect_Impl(uint32 sock_id, const OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int32 timeout) { int32 return_code; int os_status; @@ -309,7 +309,7 @@ int32 OS_SocketConnect_Impl(uint32 sock_id, const OS_SockAddr_t *Addr, int32 tim * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketAccept_Impl(uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_SockAddr_t *Addr, int32 timeout) { int32 return_code; uint32 operation; @@ -370,7 +370,8 @@ int32 OS_SocketAccept_Impl(uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Ad * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, uint32 buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) +int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, + int32 timeout) { int32 return_code; int os_result; @@ -458,7 +459,7 @@ int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, uint32 buflen, OS_Soc * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, uint32 buflen, const OS_SockAddr_t *RemoteAddr) +int32 OS_SocketSendTo_Impl(osal_index_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) { int os_result; socklen_t addrlen; @@ -503,7 +504,7 @@ int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, uint32 buflen, co * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketGetInfo_Impl(uint32 sock_id, OS_socket_prop_t *sock_prop) +int32 OS_SocketGetInfo_Impl(osal_index_t sock_id, OS_socket_prop_t *sock_prop) { return OS_SUCCESS; } /* end OS_SocketGetInfo_Impl */ @@ -539,7 +540,7 @@ int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) #endif default: sa_family = 0; - addrlen = 0; + addrlen = 0; break; } @@ -548,7 +549,7 @@ int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) return OS_ERR_NOT_IMPLEMENTED; } - Addr->ActualLength = addrlen; + Addr->ActualLength = OSAL_SIZE_C(addrlen); Accessor->sockaddr.sa_family = sa_family; return OS_SUCCESS; @@ -562,7 +563,7 @@ int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketAddrToString_Impl(char *buffer, uint32 buflen, const OS_SockAddr_t *Addr) +int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) { const void * addrbuffer; const OS_SockAddr_Accessor_t *Accessor; diff --git a/src/os/portable/os-impl-console-bsp.c b/src/os/portable/os-impl-console-bsp.c index ddc6369eb..815c423d5 100644 --- a/src/os/portable/os-impl-console-bsp.c +++ b/src/os/portable/os-impl-console-bsp.c @@ -52,11 +52,11 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleOutput_Impl(uint32 local_id) +void OS_ConsoleOutput_Impl(osal_index_t local_id) { - uint32 StartPos; - uint32 EndPos; - long WriteSize; + size_t StartPos; + size_t EndPos; + size_t WriteSize; OS_console_internal_record_t *console; console = &OS_console_table[local_id]; diff --git a/src/os/portable/os-impl-no-loader.c b/src/os/portable/os-impl-no-loader.c index 37713589a..046fe3419 100644 --- a/src/os/portable/os-impl-no-loader.c +++ b/src/os/portable/os-impl-no-loader.c @@ -38,7 +38,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) { return OS_ERR_NOT_IMPLEMENTED; @@ -52,7 +52,7 @@ int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(uint32 module_id) +int32 OS_ModuleUnload_Impl(osal_index_t module_id) { return OS_ERR_NOT_IMPLEMENTED; @@ -66,7 +66,7 @@ int32 OS_ModuleUnload_Impl(uint32 module_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(uint32 module_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop) { return OS_ERR_NOT_IMPLEMENTED; diff --git a/src/os/portable/os-impl-no-network.c b/src/os/portable/os-impl-no-network.c index b7dba2fb0..30d725937 100644 --- a/src/os/portable/os-impl-no-network.c +++ b/src/os/portable/os-impl-no-network.c @@ -56,7 +56,7 @@ int32 OS_NetworkGetID_Impl(int32 *IdBuf) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_NetworkGetHostName_Impl(char *host_name, uint32 name_len) +int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len) { return OS_ERR_NOT_IMPLEMENTED; } /* end OS_NetworkGetHostName_Impl */ diff --git a/src/os/portable/os-impl-no-shell.c b/src/os/portable/os-impl-no-shell.c index 31bead6e3..5f86dc1af 100644 --- a/src/os/portable/os-impl-no-shell.c +++ b/src/os/portable/os-impl-no-shell.c @@ -34,7 +34,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(uint32 file_id, const char *Cmd) +int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) { return OS_ERR_NOT_IMPLEMENTED; } diff --git a/src/os/portable/os-impl-no-sockets.c b/src/os/portable/os-impl-no-sockets.c index f2ed25204..b87bb3395 100644 --- a/src/os/portable/os-impl-no-sockets.c +++ b/src/os/portable/os-impl-no-sockets.c @@ -101,7 +101,7 @@ int32 OS_SocketAccept_Impl(uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Ad * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, uint32 buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) +int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) { return OS_ERR_NOT_IMPLEMENTED; } /* end OS_SocketRecvFrom_Impl */ @@ -114,7 +114,7 @@ int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, uint32 buflen, OS_Soc * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, uint32 buflen, const OS_SockAddr_t *RemoteAddr) +int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) { return OS_ERR_NOT_IMPLEMENTED; } /* end OS_SocketSendTo_Impl */ diff --git a/src/os/portable/os-impl-no-symtab.c b/src/os/portable/os-impl-no-symtab.c index 72fe4f1b2..3525d5b81 100644 --- a/src/os/portable/os-impl-no-symtab.c +++ b/src/os/portable/os-impl-no-symtab.c @@ -66,7 +66,7 @@ int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SymbolTableDump_Impl(const char *filename, uint32 SizeLimit) +int32 OS_SymbolTableDump_Impl(const char *filename, size_t SizeLimit) { return (OS_ERR_NOT_IMPLEMENTED); diff --git a/src/os/portable/os-impl-posix-dirs.c b/src/os/portable/os-impl-posix-dirs.c index 740a8fb73..e840ed089 100644 --- a/src/os/portable/os-impl-posix-dirs.c +++ b/src/os/portable/os-impl-posix-dirs.c @@ -104,7 +104,7 @@ int32 OS_DirCreate_Impl(const char *local_path, uint32 access) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) +int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path) { DIR *dp = opendir(local_path); if (dp == NULL) @@ -123,7 +123,7 @@ int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirClose_Impl(uint32 local_id) +int32 OS_DirClose_Impl(osal_index_t local_id) { closedir(OS_impl_dir_table[local_id].dp); OS_impl_dir_table[local_id].dp = NULL; @@ -138,7 +138,7 @@ int32 OS_DirClose_Impl(uint32 local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent) +int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) { struct dirent *de; @@ -171,7 +171,7 @@ int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRewind_Impl(uint32 local_id) +int32 OS_DirRewind_Impl(osal_index_t local_id) { rewinddir(OS_impl_dir_table[local_id].dp); return OS_SUCCESS; diff --git a/src/os/portable/os-impl-posix-dl-loader.c b/src/os/portable/os-impl-posix-dl-loader.c index a946eb65a..2a8036dcc 100644 --- a/src/os/portable/os-impl-posix-dl-loader.c +++ b/src/os/portable/os-impl-posix-dl-loader.c @@ -61,10 +61,10 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) { int32 status = OS_ERROR; - int dl_mode; + int dl_mode; /* * RTLD_NOW should instruct dlopen() to resolve all the symbols in the @@ -117,7 +117,7 @@ int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(uint32 module_id) +int32 OS_ModuleUnload_Impl(osal_index_t module_id) { int32 status = OS_ERROR; @@ -147,7 +147,7 @@ int32 OS_ModuleUnload_Impl(uint32 module_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(uint32 module_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop) { /* * Limiting strictly to POSIX-defined API means there is no defined diff --git a/src/os/portable/os-impl-posix-dl-symtab.c b/src/os/portable/os-impl-posix-dl-symtab.c index 2ce8e1acc..ff78c19d5 100644 --- a/src/os/portable/os-impl-posix-dl-symtab.c +++ b/src/os/portable/os-impl-posix-dl-symtab.c @@ -87,7 +87,7 @@ int32 OS_GenericSymbolLookup_Impl(void *dl_handle, cpuaddr *SymbolAddress, const char *SymbolName) { const char *dlError; /* Pointer to error string */ - void *Function; + void * Function; int32 status; status = OS_ERROR; @@ -157,7 +157,7 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_ModuleSymbolLookup_Impl(osal_index_t local_id, cpuaddr *SymbolAddress, const char *SymbolName) { int32 status; @@ -177,7 +177,7 @@ int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const * POSIX DL does not provide * *-----------------------------------------------------------------*/ -int32 OS_SymbolTableDump_Impl(const char *filename, uint32 SizeLimit) +int32 OS_SymbolTableDump_Impl(const char *filename, size_t SizeLimit) { /* * Limiting strictly to POSIX-defined API means there is no defined diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index 43628d5df..9ce3008fe 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -63,7 +63,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileOpen_Impl(uint32 local_id, const char *local_path, int32 flags, int32 access) +int32 OS_FileOpen_Impl(osal_index_t local_id, const char *local_path, int32 flags, int32 access) { int os_perm; int os_mode; diff --git a/src/os/portable/os-impl-posix-io.c b/src/os/portable/os-impl-posix-io.c index 1f9860cb1..38e45918d 100644 --- a/src/os/portable/os-impl-posix-io.c +++ b/src/os/portable/os-impl-posix-io.c @@ -66,7 +66,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericClose_Impl(uint32 local_id) +int32 OS_GenericClose_Impl(osal_index_t local_id) { int result; @@ -98,7 +98,7 @@ int32 OS_GenericClose_Impl(uint32 local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericSeek_Impl(uint32 local_id, int32 offset, uint32 whence) +int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) { int where; int32 result; @@ -153,7 +153,7 @@ int32 OS_GenericSeek_Impl(uint32 local_id, int32 offset, uint32 whence) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericRead_Impl(uint32 local_id, void *buffer, uint32 nbytes, int32 timeout) +int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, int32 timeout) { int32 return_code; int os_result; @@ -204,7 +204,7 @@ int32 OS_GenericRead_Impl(uint32 local_id, void *buffer, uint32 nbytes, int32 ti * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericWrite_Impl(uint32 local_id, const void *buffer, uint32 nbytes, int32 timeout) +int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nbytes, int32 timeout) { int32 return_code; int os_result; diff --git a/src/os/portable/os-impl-posix-network.c b/src/os/portable/os-impl-posix-network.c index bd114b645..f6d5f540a 100644 --- a/src/os/portable/os-impl-posix-network.c +++ b/src/os/portable/os-impl-posix-network.c @@ -58,7 +58,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_NetworkGetHostName_Impl(char *host_name, uint32 name_len) +int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len) { int32 return_code; diff --git a/src/os/posix/inc/os-impl-io.h b/src/os/posix/inc/os-impl-io.h index a6154b8ca..f8cf65f62 100644 --- a/src/os/posix/inc/os-impl-io.h +++ b/src/os/posix/inc/os-impl-io.h @@ -39,13 +39,13 @@ typedef struct { int fd; bool selectable; -} OS_Posix_file_internal_record_t; +} OS_impl_file_internal_record_t; /* * The global file handle table. * * This is shared by all OSAL entities that perform low-level I/O. */ -extern OS_Posix_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; +extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; #endif /* INCLUDE_OS_IMPL_IO_H_ */ diff --git a/src/os/posix/inc/os-posix.h b/src/os/posix/inc/os-posix.h index 965ba58f5..c84391db6 100644 --- a/src/os/posix/inc/os-posix.h +++ b/src/os/posix/inc/os-posix.h @@ -74,7 +74,7 @@ typedef struct typedef struct { bool EnableTaskPriorities; - uint32 TruncateQueueDepth; + osal_blockcount_t TruncateQueueDepth; uint32 ClockAccuracyNsec; pthread_key_t ThreadKey; sigset_t MaximumSigMask; @@ -105,10 +105,10 @@ int32 OS_Posix_StreamAPI_Impl_Init(void); int32 OS_Posix_DirAPI_Impl_Init(void); int32 OS_Posix_FileSysAPI_Impl_Init(void); -int32 OS_Posix_TableMutex_Init(uint32 idtype); +int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype); -int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, uint32 priority, size_t stacksz, PthreadFuncPtr_t entry, - void *entry_arg); +int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority, size_t stacksz, + PthreadFuncPtr_t entry, void *entry_arg); void OS_Posix_CompAbsDelayTime(uint32 msecs, struct timespec *tm); #endif /* INCLUDE_OS_POSIX_H_ */ diff --git a/src/os/posix/src/os-impl-binsem.c b/src/os/posix/src/os-impl-binsem.c index 6e27cbb41..89227a2f4 100644 --- a/src/os/posix/src/os-impl-binsem.c +++ b/src/os/posix/src/os-impl-binsem.c @@ -118,7 +118,7 @@ int32 OS_Posix_BinSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 initial_value, uint32 options) +int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 initial_value, uint32 options) { int ret; int attr_created; @@ -240,7 +240,7 @@ int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 initial_value, uint32 options) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(uint32 sem_id) +int32 OS_BinSemDelete_Impl(osal_index_t sem_id) { OS_impl_binsem_internal_record_t *sem; int32 return_code; @@ -279,7 +279,7 @@ int32 OS_BinSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(uint32 sem_id) +int32 OS_BinSemGive_Impl(osal_index_t sem_id) { OS_impl_binsem_internal_record_t *sem; @@ -324,7 +324,7 @@ int32 OS_BinSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(uint32 sem_id) +int32 OS_BinSemFlush_Impl(osal_index_t sem_id) { OS_impl_binsem_internal_record_t *sem; @@ -441,7 +441,7 @@ static int32 OS_GenericBinSemTake_Impl(OS_impl_binsem_internal_record_t *sem, co * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(uint32 sem_id) +int32 OS_BinSemTake_Impl(osal_index_t sem_id) { return (OS_GenericBinSemTake_Impl(&OS_impl_bin_sem_table[sem_id], NULL)); } /* end OS_BinSemTake_Impl */ @@ -454,7 +454,7 @@ int32 OS_BinSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs) +int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) { struct timespec ts; @@ -474,7 +474,7 @@ int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(uint32 sem_id, OS_bin_sem_prop_t *sem_prop) +int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *sem_prop) { /* put the info into the stucture */ sem_prop->value = OS_impl_bin_sem_table[sem_id].current_value; diff --git a/src/os/posix/src/os-impl-common.c b/src/os/posix/src/os-impl-common.c index 4412dba35..23452b603 100644 --- a/src/os/posix/src/os-impl-common.c +++ b/src/os/posix/src/os-impl-common.c @@ -52,7 +52,7 @@ POSIX_GlobalVars_t POSIX_GlobalVars = {0}; returns: OS_SUCCESS or OS_ERROR ---------------------------------------------------------------------------------------*/ -int32 OS_API_Impl_Init(uint32 idtype) +int32 OS_API_Impl_Init(osal_objtype_t idtype) { int32 return_code; diff --git a/src/os/posix/src/os-impl-console.c b/src/os/posix/src/os-impl-console.c index a97799683..be6197a6f 100644 --- a/src/os/posix/src/os-impl-console.c +++ b/src/os/posix/src/os-impl-console.c @@ -59,7 +59,7 @@ OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(uint32 local_id) +void OS_ConsoleWakeup_Impl(osal_index_t local_id) { OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; @@ -89,10 +89,10 @@ static void *OS_ConsoleTask_Entry(void *arg) OS_impl_console_internal_record_t *local; local_arg.opaque_arg = arg; - local = &OS_impl_console_table[local_arg.value]; + local = &OS_impl_console_table[local_arg.idx]; while (true) { - OS_ConsoleOutput_Impl(local_arg.value); + OS_ConsoleOutput_Impl(local_arg.idx); sem_wait(&local->data_sem); } return NULL; @@ -106,7 +106,7 @@ static void *OS_ConsoleTask_Entry(void *arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(uint32 local_id) +int32 OS_ConsoleCreate_Impl(osal_index_t local_id) { OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; pthread_t consoletask; @@ -126,8 +126,8 @@ int32 OS_ConsoleCreate_Impl(uint32 local_id) } else { - local_arg.value = local_id; - return_code = OS_Posix_InternalTaskCreate_Impl(&consoletask, OS_CONSOLE_TASK_PRIORITY, 0, + local_arg.idx = local_id; + return_code = OS_Posix_InternalTaskCreate_Impl(&consoletask, OS_CONSOLE_TASK_PRIORITY, 0, OS_ConsoleTask_Entry, local_arg.opaque_arg); if (return_code != OS_SUCCESS) diff --git a/src/os/posix/src/os-impl-countsem.c b/src/os/posix/src/os-impl-countsem.c index 22fd5cc71..d399e0857 100644 --- a/src/os/posix/src/os-impl-countsem.c +++ b/src/os/posix/src/os-impl-countsem.c @@ -74,7 +74,7 @@ int32 OS_Posix_CountSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) { if (sem_initial_value > SEM_VALUE_MAX) { @@ -98,7 +98,7 @@ int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 opt * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(uint32 sem_id) +int32 OS_CountSemDelete_Impl(osal_index_t sem_id) { if (sem_destroy(&OS_impl_count_sem_table[sem_id].id) < 0) { @@ -117,7 +117,7 @@ int32 OS_CountSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(uint32 sem_id) +int32 OS_CountSemGive_Impl(osal_index_t sem_id) { if (sem_post(&OS_impl_count_sem_table[sem_id].id) < 0) { @@ -136,7 +136,7 @@ int32 OS_CountSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(uint32 sem_id) +int32 OS_CountSemTake_Impl(osal_index_t sem_id) { if (sem_wait(&OS_impl_count_sem_table[sem_id].id) < 0) { @@ -154,7 +154,7 @@ int32 OS_CountSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs) +int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) { struct timespec ts; int result; @@ -189,7 +189,7 @@ int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(uint32 sem_id, OS_count_sem_prop_t *count_prop) +int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop) { int sval; diff --git a/src/os/posix/src/os-impl-files.c b/src/os/posix/src/os-impl-files.c index 320867963..c828947b0 100644 --- a/src/os/posix/src/os-impl-files.c +++ b/src/os/posix/src/os-impl-files.c @@ -48,7 +48,7 @@ * * This is shared by all OSAL entities that perform low-level I/O. */ -OS_Posix_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; +OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; /* * These two constants (EUID and EGID) are local cache of the @@ -85,7 +85,7 @@ const int OS_IMPL_REGULAR_FILE_FLAGS = O_NONBLOCK; ---------------------------------------------------------------------------------------*/ int32 OS_Posix_StreamAPI_Impl_Init(void) { - uint32 local_id; + osal_index_t local_id; /* * init all filehandles to -1, which is always invalid. diff --git a/src/os/posix/src/os-impl-filesys.c b/src/os/posix/src/os-impl-filesys.c index bd67779cb..6e71e3321 100644 --- a/src/os/posix/src/os-impl-filesys.c +++ b/src/os/posix/src/os-impl-filesys.c @@ -82,7 +82,7 @@ int32 OS_Posix_FileSysAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(uint32 filesys_id) +int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; struct stat stat_buf; @@ -184,7 +184,7 @@ int32 OS_FileSysStartVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(uint32 filesys_id) +int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) { /* * This is a no-op. @@ -207,7 +207,7 @@ int32 OS_FileSysStopVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id) +int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) { /* * In theory, this should wipe any existing files in the ramdisk, @@ -230,7 +230,7 @@ int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(uint32 filesys_id) +int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; struct stat stat_buf; @@ -282,7 +282,7 @@ int32 OS_FileSysMountVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id) +int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) { /* * NOTE: Mounting/Unmounting on POSIX is not implemented. @@ -303,7 +303,7 @@ int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; struct statvfs stat_buf; @@ -313,9 +313,9 @@ int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) return OS_ERROR; } - result->block_size = stat_buf.f_bsize; - result->blocks_free = stat_buf.f_bfree; - result->total_blocks = stat_buf.f_blocks; + result->block_size = OSAL_SIZE_C(stat_buf.f_bsize); + result->blocks_free = OSAL_BLOCKCOUNT_C(stat_buf.f_bfree); + result->total_blocks = OSAL_BLOCKCOUNT_C(stat_buf.f_blocks); return (OS_SUCCESS); } /* end OS_FileSysStatVolume_Impl */ @@ -328,7 +328,7 @@ int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(uint32 filesys_id, bool repair) +int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair) { return OS_ERR_NOT_IMPLEMENTED; } /* end OS_FileSysCheckVolume_Impl */ diff --git a/src/os/posix/src/os-impl-idmap.c b/src/os/posix/src/os-impl-idmap.c index 233d81d15..64b29aeef 100644 --- a/src/os/posix/src/os-impl-idmap.c +++ b/src/os/posix/src/os-impl-idmap.c @@ -83,7 +83,7 @@ enum * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(uint32 idtype) +int32 OS_Lock_Global_Impl(osal_objtype_t idtype) { POSIX_GlobalLock_t *mut; sigset_t previous; @@ -119,7 +119,7 @@ int32 OS_Lock_Global_Impl(uint32 idtype) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(uint32 idtype) +int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) { POSIX_GlobalLock_t *mut; sigset_t previous; @@ -158,7 +158,7 @@ int32 OS_Unlock_Global_Impl(uint32 idtype) returns: OS_SUCCESS or OS_ERROR ---------------------------------------------------------------------------------------*/ -int32 OS_Posix_TableMutex_Init(uint32 idtype) +int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) { int ret; int32 return_code = OS_SUCCESS; diff --git a/src/os/posix/src/os-impl-mutex.c b/src/os/posix/src/os-impl-mutex.c index 3fbd17479..8d6de200a 100644 --- a/src/os/posix/src/os-impl-mutex.c +++ b/src/os/posix/src/os-impl-mutex.c @@ -61,7 +61,7 @@ int32 OS_Posix_MutexAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options) +int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) { int return_code; pthread_mutexattr_t mutex_attr; @@ -121,7 +121,7 @@ int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(uint32 sem_id) +int32 OS_MutSemDelete_Impl(osal_index_t sem_id) { int status; @@ -144,7 +144,7 @@ int32 OS_MutSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(uint32 sem_id) +int32 OS_MutSemGive_Impl(osal_index_t sem_id) { int status; @@ -168,7 +168,7 @@ int32 OS_MutSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(uint32 sem_id) +int32 OS_MutSemTake_Impl(osal_index_t sem_id) { int status; @@ -192,7 +192,7 @@ int32 OS_MutSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(uint32 sem_id, OS_mut_sem_prop_t *mut_prop) +int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop) { return OS_SUCCESS; diff --git a/src/os/posix/src/os-impl-queues.c b/src/os/posix/src/os-impl-queues.c index bb5f505d8..913d0773b 100644 --- a/src/os/posix/src/os-impl-queues.c +++ b/src/os/posix/src/os-impl-queues.c @@ -67,7 +67,7 @@ int32 OS_Posix_QueueAPI_Impl_Init(void) /* * Initialize this to zero to indicate no limit */ - POSIX_GlobalVars.TruncateQueueDepth = 0; + POSIX_GlobalVars.TruncateQueueDepth = OSAL_BLOCKCOUNT_C(0); #endif return OS_SUCCESS; @@ -81,7 +81,7 @@ int32 OS_Posix_QueueAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags) +int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) { int return_code; mqd_t queueDesc; @@ -159,7 +159,7 @@ int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(uint32 queue_id) +int32 OS_QueueDelete_Impl(osal_index_t queue_id) { int32 return_code; @@ -185,7 +185,7 @@ int32 OS_QueueDelete_Impl(uint32 queue_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) +int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout) { int32 return_code; ssize_t sizeCopied; @@ -240,7 +240,7 @@ int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_co /* Figure out the return code */ if (sizeCopied == -1) { - *size_copied = 0; + *size_copied = OSAL_SIZE_C(0); /* Map the system errno to the most appropriate OSAL return code */ if (errno == EMSGSIZE) @@ -266,7 +266,7 @@ int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_co } else { - *size_copied = sizeCopied; + *size_copied = OSAL_SIZE_C(sizeCopied); return_code = OS_SUCCESS; } @@ -281,7 +281,7 @@ int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_co * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(uint32 queue_id, const void *data, uint32 size, uint32 flags) +int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uint32 flags) { int32 return_code; int result; diff --git a/src/os/posix/src/os-impl-shell.c b/src/os/posix/src/os-impl-shell.c index 76cb1538c..e85654380 100644 --- a/src/os/posix/src/os-impl-shell.c +++ b/src/os/posix/src/os-impl-shell.c @@ -57,7 +57,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(uint32 file_id, const char *Cmd) +int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) { pid_t cpid; uint32 local_id; diff --git a/src/os/posix/src/os-impl-tasks.c b/src/os/posix/src/os-impl-tasks.c index ab6cdf4aa..a529264ee 100644 --- a/src/os/posix/src/os-impl-tasks.c +++ b/src/os/posix/src/os-impl-tasks.c @@ -61,7 +61,7 @@ OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; * to be within the range of [0,OS_MAX_TASK_PRIORITY] * ----------------------------------------------------------------------------*/ -static int OS_PriorityRemap(uint32 InputPri) +static int OS_PriorityRemap(osal_priority_t InputPri) { int OutputPri; @@ -429,8 +429,8 @@ int32 OS_Posix_TaskAPI_Impl_Init(void) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, uint32 priority, size_t stacksz, PthreadFuncPtr_t entry, - void *entry_arg) +int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority, size_t stacksz, + PthreadFuncPtr_t entry, void *entry_arg) { int return_code = 0; pthread_attr_t custom_attr; @@ -564,7 +564,7 @@ int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, uint32 priority, size_t * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) +int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) { OS_U32ValueWrapper_t arg; int32 return_code; @@ -587,7 +587,7 @@ int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(uint32 task_id) +int32 OS_TaskMatch_Impl(osal_index_t task_id) { if (pthread_equal(pthread_self(), OS_impl_task_table[task_id].id) == 0) { @@ -605,7 +605,7 @@ int32 OS_TaskMatch_Impl(uint32 task_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(uint32 task_id) +int32 OS_TaskDelete_Impl(osal_index_t task_id) { /* ** Try to delete the task @@ -678,7 +678,7 @@ int32 OS_TaskDelay_Impl(uint32 millisecond) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(uint32 task_id, uint32 new_priority) +int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority) { int os_priority; int ret; @@ -758,7 +758,7 @@ osal_id_t OS_TaskGetId_Impl(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(uint32 task_id, OS_task_prop_t *task_prop) +int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop) { return OS_SUCCESS; } /* end OS_TaskGetInfo_Impl */ @@ -771,7 +771,7 @@ int32 OS_TaskGetInfo_Impl(uint32 task_id, OS_task_prop_t *task_prop) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { const pthread_t *target = (const pthread_t *)ref; @@ -786,7 +786,7 @@ bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_r * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskValidateSystemData_Impl(const void *sysdata, uint32 sysdata_size) +int32 OS_TaskValidateSystemData_Impl(const void *sysdata, size_t sysdata_size) { if (sysdata == NULL || sysdata_size != sizeof(pthread_t)) { diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index c4c23b13e..a576332d9 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -108,7 +108,7 @@ static void OS_UsecToTimespec(uint32 usecs, struct timespec *time_spec) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(uint32 local_id) +void OS_TimeBaseLock_Impl(osal_index_t local_id) { pthread_mutex_lock(&OS_impl_timebase_table[local_id].handler_mutex); } /* end OS_TimeBaseLock_Impl */ @@ -121,7 +121,7 @@ void OS_TimeBaseLock_Impl(uint32 local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(uint32 local_id) +void OS_TimeBaseUnlock_Impl(osal_index_t local_id) { pthread_mutex_unlock(&OS_impl_timebase_table[local_id].handler_mutex); } /* end OS_TimeBaseUnlock_Impl */ @@ -133,7 +133,7 @@ void OS_TimeBaseUnlock_Impl(uint32 local_id) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -static uint32 OS_TimeBase_SigWaitImpl(uint32 timer_id) +static uint32 OS_TimeBase_SigWaitImpl(osal_index_t timer_id) { int ret; OS_impl_timebase_internal_record_t *local; @@ -190,7 +190,7 @@ static uint32 OS_TimeBase_SigWaitImpl(uint32 timer_id) int32 OS_Posix_TimeBaseAPI_Impl_Init(void) { int status; - int i; + osal_index_t idx; pthread_mutexattr_t mutex_attr; struct timespec clock_resolution; int32 return_code; @@ -253,14 +253,14 @@ int32 OS_Posix_TimeBaseAPI_Impl_Init(void) break; } - for (i = 0; i < OS_MAX_TIMEBASES; ++i) + for (idx = 0; idx < OS_MAX_TIMEBASES; ++idx) { /* ** create the timebase sync mutex ** This gives a mechanism to synchronize updates to the timer chain with the ** expiration of the timer and processing the chain. */ - status = pthread_mutex_init(&OS_impl_timebase_table[i].handler_mutex, &mutex_attr); + status = pthread_mutex_init(&OS_impl_timebase_table[idx].handler_mutex, &mutex_attr); if (status != 0) { OS_DEBUG("Error: Mutex could not be created: %s\n", strerror(status)); @@ -314,11 +314,12 @@ static void *OS_TimeBasePthreadEntry(void *arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(uint32 timer_id) +int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) { int32 return_code; int status; int i; + osal_index_t idx; struct sigevent evp; struct timespec ts; OS_impl_timebase_internal_record_t *local; @@ -340,8 +341,8 @@ int32 OS_TimeBaseCreate_Impl(uint32 timer_id) */ arg.opaque_arg = NULL; arg.id = global->active_id; - return_code = - OS_Posix_InternalTaskCreate_Impl(&local->handler_thread, 0, 0, OS_TimeBasePthreadEntry, arg.opaque_arg); + return_code = OS_Posix_InternalTaskCreate_Impl(&local->handler_thread, OSAL_PRIORITY_C(0), 0, + OS_TimeBasePthreadEntry, arg.opaque_arg); if (return_code != OS_SUCCESS) { return return_code; @@ -368,12 +369,12 @@ int32 OS_TimeBaseCreate_Impl(uint32 timer_id) * This is all done while the global lock is held so no chance of the * underlying tables changing */ - for (i = 0; i < OS_MAX_TIMEBASES; ++i) + for (idx = 0; idx < OS_MAX_TIMEBASES; ++idx) { - if (i != timer_id && OS_ObjectIdDefined(OS_global_timebase_table[i].active_id) && - OS_impl_timebase_table[i].assigned_signal != 0) + if (idx != timer_id && OS_ObjectIdDefined(OS_global_timebase_table[idx].active_id) && + OS_impl_timebase_table[idx].assigned_signal != 0) { - sigaddset(&local->sigset, OS_impl_timebase_table[i].assigned_signal); + sigaddset(&local->sigset, OS_impl_timebase_table[idx].assigned_signal); } } @@ -479,7 +480,7 @@ int32 OS_TimeBaseCreate_Impl(uint32 timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time) +int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, int32 start_time, int32 interval_time) { OS_impl_timebase_internal_record_t *local; struct itimerspec timeout; @@ -533,7 +534,7 @@ int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(uint32 timer_id) +int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) { OS_impl_timebase_internal_record_t *local; int status; @@ -568,7 +569,7 @@ int32 OS_TimeBaseDelete_Impl(uint32 timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(uint32 timer_id, OS_timebase_prop_t *timer_prop) +int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop) { return OS_SUCCESS; diff --git a/src/os/rtems/inc/os-rtems.h b/src/os/rtems/inc/os-rtems.h index c8cf01159..4f4a1a76a 100644 --- a/src/os/rtems/inc/os-rtems.h +++ b/src/os/rtems/inc/os-rtems.h @@ -84,6 +84,6 @@ int32 OS_Rtems_StreamAPI_Impl_Init(void); int32 OS_Rtems_DirAPI_Impl_Init(void); int32 OS_Rtems_FileSysAPI_Impl_Init(void); -int32 OS_Rtems_TableMutex_Init(uint32 idtype); +int32 OS_Rtems_TableMutex_Init(osal_objtype_t idtype); #endif /* INCLUDE_OS_RTEMS_H_ */ diff --git a/src/os/rtems/src/os-impl-binsem.c b/src/os/rtems/src/os-impl-binsem.c index 5d34c2079..d3a8933bf 100644 --- a/src/os/rtems/src/os-impl-binsem.c +++ b/src/os/rtems/src/os-impl-binsem.c @@ -87,7 +87,7 @@ int32 OS_Rtems_BinSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) { rtems_status_code status; rtems_name r_name; @@ -128,7 +128,7 @@ int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 optio * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(uint32 sem_id) +int32 OS_BinSemDelete_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -151,7 +151,7 @@ int32 OS_BinSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(uint32 sem_id) +int32 OS_BinSemGive_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -173,7 +173,7 @@ int32 OS_BinSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(uint32 sem_id) +int32 OS_BinSemFlush_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -197,7 +197,7 @@ int32 OS_BinSemFlush_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(uint32 sem_id) +int32 OS_BinSemTake_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -228,7 +228,7 @@ int32 OS_BinSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs) +int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) { rtems_status_code status; int TimeInTicks; @@ -264,7 +264,7 @@ int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(uint32 sem_id, OS_bin_sem_prop_t *bin_prop) +int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop) { /* RTEMS has no API for obtaining the current value of a semaphore */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-common.c b/src/os/rtems/src/os-impl-common.c index 2d396901b..4e0720103 100644 --- a/src/os/rtems/src/os-impl-common.c +++ b/src/os/rtems/src/os-impl-common.c @@ -52,7 +52,7 @@ RTEMS_GlobalVars_t RTEMS_GlobalVars = {0}; returns: OS_SUCCESS or OS_ERROR ---------------------------------------------------------------------------------------*/ -int32 OS_API_Impl_Init(uint32 idtype) +int32 OS_API_Impl_Init(osal_objtype_t idtype) { int32 return_code; diff --git a/src/os/rtems/src/os-impl-console.c b/src/os/rtems/src/os-impl-console.c index 84c84ae0c..7bad84748 100644 --- a/src/os/rtems/src/os-impl-console.c +++ b/src/os/rtems/src/os-impl-console.c @@ -86,7 +86,7 @@ OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(uint32 local_id) +void OS_ConsoleWakeup_Impl(osal_index_t local_id) { OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; @@ -130,7 +130,7 @@ static void OS_ConsoleTask_Entry(rtems_task_argument arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(uint32 local_id) +int32 OS_ConsoleCreate_Impl(osal_index_t local_id) { OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; int32 return_code; diff --git a/src/os/rtems/src/os-impl-countsem.c b/src/os/rtems/src/os-impl-countsem.c index 21b3caeee..11c294918 100644 --- a/src/os/rtems/src/os-impl-countsem.c +++ b/src/os/rtems/src/os-impl-countsem.c @@ -84,7 +84,7 @@ int32 OS_Rtems_CountSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) { rtems_status_code status; rtems_name r_name; @@ -125,7 +125,7 @@ int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 opt * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(uint32 sem_id) +int32 OS_CountSemDelete_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -148,7 +148,7 @@ int32 OS_CountSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(uint32 sem_id) +int32 OS_CountSemGive_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -171,7 +171,7 @@ int32 OS_CountSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(uint32 sem_id) +int32 OS_CountSemTake_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -194,7 +194,7 @@ int32 OS_CountSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs) +int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) { rtems_status_code status; int TimeInTicks; @@ -228,7 +228,7 @@ int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(uint32 sem_id, OS_count_sem_prop_t *count_prop) +int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop) { /* RTEMS does not provide an API to get the value */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-filesys.c b/src/os/rtems/src/os-impl-filesys.c index 1ad989e03..3583303c7 100644 --- a/src/os/rtems/src/os-impl-filesys.c +++ b/src/os/rtems/src/os-impl-filesys.c @@ -104,7 +104,7 @@ int32 OS_Rtems_FileSysAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(uint32 filesys_id) +int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; @@ -205,7 +205,7 @@ int32 OS_FileSysStartVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(uint32 filesys_id) +int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) { OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; @@ -229,7 +229,7 @@ int32 OS_FileSysStopVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id) +int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; @@ -291,7 +291,7 @@ int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(uint32 filesys_id) +int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; @@ -345,7 +345,7 @@ int32 OS_FileSysMountVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id) +int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; @@ -373,7 +373,7 @@ int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; struct statvfs stat_buf; @@ -415,7 +415,7 @@ int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(uint32 filesys_id, bool repair) +int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair) { return OS_ERR_NOT_IMPLEMENTED; } /* end OS_FileSysCheckVolume_Impl */ diff --git a/src/os/rtems/src/os-impl-idmap.c b/src/os/rtems/src/os-impl-idmap.c index 6d6b15f00..7e08b6986 100644 --- a/src/os/rtems/src/os-impl-idmap.c +++ b/src/os/rtems/src/os-impl-idmap.c @@ -86,7 +86,7 @@ enum * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(uint32 idtype) +int32 OS_Lock_Global_Impl(osal_objtype_t idtype) { rtems_id *mut; @@ -120,7 +120,7 @@ int32 OS_Lock_Global_Impl(uint32 idtype) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(uint32 idtype) +int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) { rtems_id *mut; @@ -158,7 +158,7 @@ int32 OS_Unlock_Global_Impl(uint32 idtype) returns: OS_SUCCESS or OS_ERROR ---------------------------------------------------------------------------------------*/ -int32 OS_Rtems_TableMutex_Init(uint32 idtype) +int32 OS_Rtems_TableMutex_Init(osal_objtype_t idtype) { int32 return_code = OS_SUCCESS; rtems_status_code rtems_sc; diff --git a/src/os/rtems/src/os-impl-loader.c b/src/os/rtems/src/os-impl-loader.c index 89fbbedce..f3f1fb1d8 100644 --- a/src/os/rtems/src/os-impl-loader.c +++ b/src/os/rtems/src/os-impl-loader.c @@ -104,7 +104,7 @@ static bool OS_rtems_rtl_check_unresolved(rtems_rtl_unresolv_rec_t *rec, void *d * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) { int32 status = OS_ERROR; int unresolved; @@ -177,7 +177,7 @@ int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(uint32 module_id) +int32 OS_ModuleUnload_Impl(osal_index_t module_id) { int32 status = OS_ERROR; @@ -207,7 +207,7 @@ int32 OS_ModuleUnload_Impl(uint32 module_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(uint32 module_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop) { /* ** RTEMS does not specify a way to get these values diff --git a/src/os/rtems/src/os-impl-mutex.c b/src/os/rtems/src/os-impl-mutex.c index 4ae538954..c02b95665 100644 --- a/src/os/rtems/src/os-impl-mutex.c +++ b/src/os/rtems/src/os-impl-mutex.c @@ -85,7 +85,7 @@ int32 OS_Rtems_MutexAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options) +int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) { rtems_status_code status; rtems_name r_name; @@ -114,7 +114,7 @@ int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(uint32 sem_id) +int32 OS_MutSemDelete_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -138,7 +138,7 @@ int32 OS_MutSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(uint32 sem_id) +int32 OS_MutSemGive_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -163,7 +163,7 @@ int32 OS_MutSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(uint32 sem_id) +int32 OS_MutSemTake_Impl(osal_index_t sem_id) { rtems_status_code status; @@ -187,7 +187,7 @@ int32 OS_MutSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(uint32 sem_id, OS_mut_sem_prop_t *mut_prop) +int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop) { /* RTEMS provides no additional info */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-queues.c b/src/os/rtems/src/os-impl-queues.c index dcd9ddbe8..f94385f5c 100644 --- a/src/os/rtems/src/os-impl-queues.c +++ b/src/os/rtems/src/os-impl-queues.c @@ -78,7 +78,7 @@ int32 OS_Rtems_QueueAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags) +int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) { rtems_status_code status; rtems_name r_name; @@ -125,7 +125,7 @@ int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(uint32 queue_id) +int32 OS_QueueDelete_Impl(osal_index_t queue_id) { rtems_status_code status; @@ -149,7 +149,7 @@ int32 OS_QueueDelete_Impl(uint32 queue_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) +int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) { int32 return_code; rtems_status_code status; @@ -243,7 +243,7 @@ int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_co * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(uint32 queue_id, const void *data, uint32 size, uint32 flags) +int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, uint32 size, uint32 flags) { rtems_status_code status; rtems_id rtems_queue_id; @@ -287,7 +287,7 @@ int32 OS_QueuePut_Impl(uint32 queue_id, const void *data, uint32 size, uint32 fl * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGetInfo_Impl(uint32 queue_id, OS_queue_prop_t *queue_prop) +int32 OS_QueueGetInfo_Impl(osal_index_t queue_id, OS_queue_prop_t *queue_prop) { /* No extra info for queues in the OS implementation */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-tasks.c b/src/os/rtems/src/os-impl-tasks.c index 8db7432fe..cc278e422 100644 --- a/src/os/rtems/src/os-impl-tasks.c +++ b/src/os/rtems/src/os-impl-tasks.c @@ -90,7 +90,7 @@ int32 OS_Rtems_TaskAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) +int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) { rtems_status_code status; rtems_name r_name; @@ -151,7 +151,7 @@ int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(uint32 task_id) +int32 OS_TaskDelete_Impl(osal_index_t task_id) { /* ** Try to delete the task @@ -221,7 +221,7 @@ int32 OS_TaskDelay_Impl(uint32 milli_second) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(uint32 task_id, uint32 new_priority) +int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority) { rtems_task_priority old_pri; rtems_status_code status; @@ -246,7 +246,7 @@ int32 OS_TaskSetPriority_Impl(uint32 task_id, uint32 new_priority) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(uint32 task_id) +int32 OS_TaskMatch_Impl(osal_index_t task_id) { /* ** Get RTEMS Task Id @@ -329,7 +329,7 @@ osal_id_t OS_TaskGetId_Impl(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(uint32 task_id, OS_task_prop_t *task_prop) +int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop) { return OS_SUCCESS; @@ -360,7 +360,7 @@ int32 OS_TaskValidateSystemData_Impl(const void *sysdata, uint32 sysdata_size) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { const rtems_id *target = (const rtems_id *)ref; diff --git a/src/os/rtems/src/os-impl-timebase.c b/src/os/rtems/src/os-impl-timebase.c index 8d047ec75..935386edc 100644 --- a/src/os/rtems/src/os-impl-timebase.c +++ b/src/os/rtems/src/os-impl-timebase.c @@ -89,7 +89,7 @@ OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(uint32 local_id) +void OS_TimeBaseLock_Impl(osal_index_t local_id) { rtems_semaphore_obtain(OS_impl_timebase_table[local_id].handler_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); } /* end OS_TimeBaseLock_Impl */ @@ -102,7 +102,7 @@ void OS_TimeBaseLock_Impl(uint32 local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(uint32 local_id) +void OS_TimeBaseUnlock_Impl(osal_index_t local_id) { rtems_semaphore_release(OS_impl_timebase_table[local_id].handler_mutex); } /* end OS_TimeBaseUnlock_Impl */ @@ -119,7 +119,7 @@ void OS_TimeBaseUnlock_Impl(uint32 local_id) static rtems_timer_service_routine OS_TimeBase_ISR(rtems_id rtems_timer_id, void *arg) { OS_U32ValueWrapper_t user_data; - uint32 local_id; + osal_index_t local_id; OS_impl_timebase_internal_record_t *local; user_data.opaque_arg = arg; @@ -154,7 +154,7 @@ static rtems_timer_service_routine OS_TimeBase_ISR(rtems_id rtems_timer_id, void * Pends on the semaphore for the next timer tick * *-----------------------------------------------------------------*/ -static uint32 OS_TimeBase_WaitImpl(uint32 local_id) +static uint32 OS_TimeBase_WaitImpl(osal_index_t local_id) { OS_impl_timebase_internal_record_t *local; uint32 tick_time; @@ -280,7 +280,7 @@ void OS_UsecsToTicks(uint32 usecs, rtems_interval *ticks) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(uint32 timer_id) +int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) { int32 return_code; rtems_status_code rtems_sc; @@ -410,7 +410,7 @@ int32 OS_TimeBaseCreate_Impl(uint32 timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time) +int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, int32 start_time, int32 interval_time) { OS_U32ValueWrapper_t user_data; OS_impl_timebase_internal_record_t *local; @@ -512,7 +512,7 @@ int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(uint32 timer_id) +int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) { rtems_status_code rtems_sc; OS_impl_timebase_internal_record_t *local; @@ -576,7 +576,7 @@ int32 OS_TimeBaseDelete_Impl(uint32 timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(uint32 timer_id, OS_timebase_prop_t *timer_prop) +int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop) { return OS_SUCCESS; diff --git a/src/os/shared/inc/os-shared-binsem.h b/src/os/shared/inc/os-shared-binsem.h index 8304d2b2e..f9b743f62 100644 --- a/src/os/shared/inc/os-shared-binsem.h +++ b/src/os/shared/inc/os-shared-binsem.h @@ -62,7 +62,7 @@ int32 OS_BinSemAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 options); +int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options); /*---------------------------------------------------------------- Function: OS_BinSemFlush_Impl @@ -72,7 +72,7 @@ int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 optio Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(uint32 sem_id); +int32 OS_BinSemFlush_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_BinSemGive_Impl @@ -81,7 +81,7 @@ int32 OS_BinSemFlush_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(uint32 sem_id); +int32 OS_BinSemGive_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_BinSemTake_Impl @@ -91,7 +91,7 @@ int32 OS_BinSemGive_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(uint32 sem_id); +int32 OS_BinSemTake_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_BinSemTimedWait_Impl @@ -101,7 +101,7 @@ int32 OS_BinSemTake_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code OS_SEM_TIMEOUT must be returned if the time limit was reached ------------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs); +int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs); /*---------------------------------------------------------------- Function: OS_BinSemDelete_Impl @@ -110,7 +110,7 @@ int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(uint32 sem_id); +int32 OS_BinSemDelete_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_BinSemGetInfo_Impl @@ -119,6 +119,6 @@ int32 OS_BinSemDelete_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(uint32 sem_id, OS_bin_sem_prop_t *bin_prop); +int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop); #endif /* INCLUDE_OS_SHARED_BINSEM_H_ */ diff --git a/src/os/shared/inc/os-shared-common.h b/src/os/shared/inc/os-shared-common.h index e98858a33..e3654138e 100644 --- a/src/os/shared/inc/os-shared-common.h +++ b/src/os/shared/inc/os-shared-common.h @@ -87,7 +87,7 @@ int32 OS_NotifyEvent(OS_Event_t event, osal_id_t object_id, void *data); returns: OS_SUCCESS on success, or relevant error code ---------------------------------------------------------------------------------------*/ -int32 OS_API_Impl_Init(uint32 idtype); +int32 OS_API_Impl_Init(osal_objtype_t idtype); /* * This functions implement a the OS-specific portion diff --git a/src/os/shared/inc/os-shared-countsem.h b/src/os/shared/inc/os-shared-countsem.h index 8298aad38..fc4715d62 100644 --- a/src/os/shared/inc/os-shared-countsem.h +++ b/src/os/shared/inc/os-shared-countsem.h @@ -62,7 +62,7 @@ int32 OS_CountSemAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 options); +int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options); /*---------------------------------------------------------------- Function: OS_CountSemGive_Impl @@ -71,7 +71,7 @@ int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 opt Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(uint32 sem_id); +int32 OS_CountSemGive_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_CountSemTake_Impl @@ -81,7 +81,7 @@ int32 OS_CountSemGive_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(uint32 sem_id); +int32 OS_CountSemTake_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_CountSemTimedWait_Impl @@ -91,7 +91,7 @@ int32 OS_CountSemTake_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code OS_SEM_TIMEOUT must be returned if the time limit was reached ------------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs); +int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs); /*---------------------------------------------------------------- Function: OS_CountSemDelete_Impl @@ -100,7 +100,7 @@ int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(uint32 sem_id); +int32 OS_CountSemDelete_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_CountSemGetInfo_Impl @@ -109,6 +109,6 @@ int32 OS_CountSemDelete_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(uint32 sem_id, OS_count_sem_prop_t *count_prop); +int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop); #endif /* INCLUDE_OS_SHARED_COUNTSEM_H_ */ diff --git a/src/os/shared/inc/os-shared-dir.h b/src/os/shared/inc/os-shared-dir.h index 79d783e86..e52d682ad 100644 --- a/src/os/shared/inc/os-shared-dir.h +++ b/src/os/shared/inc/os-shared-dir.h @@ -72,7 +72,7 @@ int32 OS_DirCreate_Impl(const char *local_path, uint32 access); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path); +int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path); /*---------------------------------------------------------------- Function: OS_DirClose_Impl @@ -81,7 +81,7 @@ int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirClose_Impl(uint32 local_id); +int32 OS_DirClose_Impl(osal_index_t local_id); /*---------------------------------------------------------------- Function: OS_DirRead_Impl @@ -90,7 +90,7 @@ int32 OS_DirClose_Impl(uint32 local_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent); +int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent); /*---------------------------------------------------------------- Function: OS_DirRewind_Impl @@ -99,7 +99,7 @@ int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirRewind_Impl(uint32 local_id); +int32 OS_DirRewind_Impl(osal_index_t local_id); /*---------------------------------------------------------------- Function: OS_DirRemove_Impl diff --git a/src/os/shared/inc/os-shared-file.h b/src/os/shared/inc/os-shared-file.h index 75c8fc912..547bde042 100644 --- a/src/os/shared/inc/os-shared-file.h +++ b/src/os/shared/inc/os-shared-file.h @@ -78,7 +78,7 @@ int32 OS_FileAPI_Init(void); Returns: File position (non-negative) on success, or relevant error code (negative) ------------------------------------------------------------------*/ -int32 OS_GenericSeek_Impl(uint32 local_id, int32 offset, uint32 whence); +int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence); /*---------------------------------------------------------------- Function: OS_GenericRead_Impl @@ -88,7 +88,7 @@ int32 OS_GenericSeek_Impl(uint32 local_id, int32 offset, uint32 whence); Returns: Number of bytes read (non-negative) on success, or relevant error code (negative) ------------------------------------------------------------------*/ -int32 OS_GenericRead_Impl(uint32 local_id, void *buffer, uint32 nbytes, int32 timeout); +int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, int32 timeout); /*---------------------------------------------------------------- Function: OS_GenericWrite_Impl @@ -98,7 +98,7 @@ int32 OS_GenericRead_Impl(uint32 local_id, void *buffer, uint32 nbytes, int32 ti Returns: Number of bytes written (non-negative) on success, or relevant error code (negative) ------------------------------------------------------------------*/ -int32 OS_GenericWrite_Impl(uint32 local_id, const void *buffer, uint32 nbytes, int32 timeout); +int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nbytes, int32 timeout); /*---------------------------------------------------------------- Function: OS_GenericClose_Impl @@ -108,7 +108,7 @@ int32 OS_GenericWrite_Impl(uint32 local_id, const void *buffer, uint32 nbytes, i Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_GenericClose_Impl(uint32 local_id); +int32 OS_GenericClose_Impl(osal_index_t local_id); /*---------------------------------------------------------------- Function: OS_FileOpen_Impl @@ -118,7 +118,7 @@ int32 OS_GenericClose_Impl(uint32 local_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileOpen_Impl(uint32 local_id, const char *local_path, int32 flags, int32 access); +int32 OS_FileOpen_Impl(osal_index_t local_id, const char *local_path, int32 flags, int32 access); /*---------------------------------------------------------------- Function: OS_ShellOutputToFile_Impl @@ -127,7 +127,7 @@ int32 OS_FileOpen_Impl(uint32 local_id, const char *local_path, int32 flags, int Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(uint32 stream_id, const char *Cmd); +int32 OS_ShellOutputToFile_Impl(osal_index_t stream_id, const char *Cmd); /**************************************************************************************** Filename-based Operations diff --git a/src/os/shared/inc/os-shared-filesys.h b/src/os/shared/inc/os-shared-filesys.h index c4227ce59..110a23697 100644 --- a/src/os/shared/inc/os-shared-filesys.h +++ b/src/os/shared/inc/os-shared-filesys.h @@ -94,9 +94,9 @@ enum */ typedef struct { - uint32 block_size; - uint64 total_blocks; - uint64 blocks_free; + size_t block_size; + osal_blockcount_t total_blocks; + osal_blockcount_t blocks_free; } OS_statvfs_t; typedef struct @@ -107,11 +107,11 @@ typedef struct operating system */ char virtual_mountpt[OS_MAX_PATH_LEN]; /**< The name/prefix in the OSAL Virtual File system exposed to applications */ - char * address; - uint32 blocksize; - uint32 numblocks; - uint8 flags; - uint8 fstype; + char * address; + size_t blocksize; + osal_blockcount_t numblocks; + uint8 flags; + uint8 fstype; } OS_filesys_internal_record_t; /* @@ -140,7 +140,7 @@ int32 OS_FileSysAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(uint32 filesys_id); +int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id); /*---------------------------------------------------------------- Function: OS_FileSysStopVolume_Impl @@ -149,7 +149,7 @@ int32 OS_FileSysStartVolume_Impl(uint32 filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(uint32 filesys_id); +int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id); /*---------------------------------------------------------------- Function: OS_FileSysFormatVolume_Impl @@ -158,7 +158,7 @@ int32 OS_FileSysStopVolume_Impl(uint32 filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id); +int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id); /*---------------------------------------------------------------- Function: OS_FileSysCheckVolume_Impl @@ -167,7 +167,7 @@ int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(uint32 filesys_id, bool repair); +int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair); /*---------------------------------------------------------------- Function: OS_FileSysStatVolume_Impl @@ -176,7 +176,7 @@ int32 OS_FileSysCheckVolume_Impl(uint32 filesys_id, bool repair); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result); +int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result); /*---------------------------------------------------------------- Function: OS_FileSysMountVolume_Impl @@ -185,7 +185,7 @@ int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(uint32 filesys_id); +int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id); /*---------------------------------------------------------------- Function: OS_FileSysUnmountVolume_Impl @@ -194,7 +194,7 @@ int32 OS_FileSysMountVolume_Impl(uint32 filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id); +int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id); /* * Internal helper functions @@ -202,8 +202,8 @@ int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id); * Not normally invoked outside this unit, except for unit testing */ -bool OS_FileSys_FindVirtMountPoint(void *ref, uint32 local_id, const OS_common_record_t *obj); -int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, uint32 blocksize, - uint32 numblocks, bool should_format); +bool OS_FileSys_FindVirtMountPoint(void *ref, osal_index_t local_id, const OS_common_record_t *obj); +int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, size_t blocksize, + osal_blockcount_t numblocks, bool should_format); #endif /* INCLUDE_OS_SHARED_FILESYS_H_ */ diff --git a/src/os/shared/inc/os-shared-globaldefs.h b/src/os/shared/inc/os-shared-globaldefs.h index cbca0704c..3a85a80f8 100644 --- a/src/os/shared/inc/os-shared-globaldefs.h +++ b/src/os/shared/inc/os-shared-globaldefs.h @@ -61,7 +61,7 @@ typedef union OS_TimerCallback_t timer_callback_func; osal_task_entry entry_func; osal_id_t id; - uint32 value; + osal_index_t idx; } OS_U32ValueWrapper_t; /* diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index 30f128bc2..7b5b6b30e 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -65,7 +65,7 @@ typedef enum * * Returns true if the id/obj matches the reference, false otherwise. */ -typedef bool (*OS_ObjectMatchFunc_t)(void *ref, uint32 local_id, const OS_common_record_t *obj); +typedef bool (*OS_ObjectMatchFunc_t)(void *ref, osal_index_t local_id, const OS_common_record_t *obj); /* * Global instantiations @@ -109,7 +109,7 @@ int32 OS_ObjectIdInit(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -void OS_Lock_Global(uint32 idtype); +void OS_Lock_Global(osal_objtype_t idtype); /*---------------------------------------------------------------- Function: OS_Lock_Global @@ -118,7 +118,7 @@ void OS_Lock_Global(uint32 idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(uint32 idtype); +int32 OS_Lock_Global_Impl(osal_objtype_t idtype); /*---------------------------------------------------------------- Function: OS_Unlock_Global @@ -127,7 +127,7 @@ int32 OS_Lock_Global_Impl(uint32 idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -void OS_Unlock_Global(uint32 idtype); +void OS_Unlock_Global(osal_objtype_t idtype); /*---------------------------------------------------------------- Function: OS_Unlock_Global @@ -136,7 +136,7 @@ void OS_Unlock_Global(uint32 idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(uint32 idtype); +int32 OS_Unlock_Global_Impl(osal_objtype_t idtype); /* Function prototypes for routines implemented in common layers but private to OSAL @@ -161,7 +161,7 @@ static inline uint32 OS_ObjectIdToSerialNumber_Impl(osal_id_t id) Purpose: Obtain the object type component of a generic OSAL Object ID ------------------------------------------------------------------*/ -static inline uint32 OS_ObjectIdToType_Impl(osal_id_t id) +static inline osal_objtype_t OS_ObjectIdToType_Impl(osal_id_t id) { return (OS_ObjectIdToInteger(id) >> OS_OBJECT_TYPE_SHIFT); } @@ -171,7 +171,7 @@ static inline uint32 OS_ObjectIdToType_Impl(osal_id_t id) Purpose: Convert an object serial number and resource type into an external 32-bit OSAL ID ------------------------------------------------------------------*/ -static inline void OS_ObjectIdCompose_Impl(uint32 idtype, uint32 idserial, osal_id_t *result) +static inline void OS_ObjectIdCompose_Impl(osal_objtype_t idtype, uint32 idserial, osal_id_t *result) { *result = OS_ObjectIdFromInteger((idtype << OS_OBJECT_TYPE_SHIFT) | idserial); } @@ -183,7 +183,7 @@ static inline void OS_ObjectIdCompose_Impl(uint32 idtype, uint32 idserial, osal_ Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -uint32 OS_GetMaxForObjectType(uint32 idtype); +uint32 OS_GetMaxForObjectType(osal_objtype_t idtype); /*---------------------------------------------------------------- Function: OS_GetBaseForObjectType @@ -192,7 +192,7 @@ uint32 OS_GetMaxForObjectType(uint32 idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -uint32 OS_GetBaseForObjectType(uint32 idtype); +uint32 OS_GetBaseForObjectType(osal_objtype_t idtype); /*---------------------------------------------------------------- Function: OS_ObjectIdFindByName @@ -201,7 +201,7 @@ uint32 OS_GetBaseForObjectType(uint32 idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdFindByName(uint32 idtype, const char *name, osal_id_t *object_id); +int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t *object_id); /*---------------------------------------------------------------- Function: OS_ObjectIdGetBySearch @@ -212,7 +212,7 @@ int32 OS_ObjectIdFindByName(uint32 idtype, const char *name, osal_id_t *object_i Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, uint32 idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, +int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record); /*---------------------------------------------------------------- @@ -223,7 +223,8 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, uint32 idtype, OS_ObjectM Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, uint32 idtype, const char *name, OS_common_record_t **record); +int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, + OS_common_record_t **record); /*---------------------------------------------------------------- Function: OS_ObjectIdGetById @@ -233,7 +234,7 @@ int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, uint32 idtype, const char * Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, uint32 idtype, osal_id_t id, uint32 *array_index, +int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, osal_index_t *array_index, OS_common_record_t **record); /*---------------------------------------------------------------- @@ -246,7 +247,8 @@ int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, uint32 idtype, osal_id_t id, Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdAllocateNew(uint32 idtype, const char *name, uint32 *array_index, OS_common_record_t **record); +int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index_t *array_index, + OS_common_record_t **record); /*---------------------------------------------------------------- Function: OS_ObjectIdFinalizeNew @@ -287,10 +289,11 @@ int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record); * These are not normally called outside this unit, but need * to be exposed for unit testing. */ -bool OS_ObjectNameMatch(void *ref, uint32 local_id, const OS_common_record_t *obj); -void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, uint32 idtype); -int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, uint32 idtype, osal_id_t reference_id, OS_common_record_t *obj); -int32 OS_ObjectIdSearch(uint32 idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record); -int32 OS_ObjectIdFindNext(uint32 idtype, uint32 *array_index, OS_common_record_t **record); +bool OS_ObjectNameMatch(void *ref, osal_index_t local_id, const OS_common_record_t *obj); +void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype); +int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t reference_id, + OS_common_record_t *obj); +int32 OS_ObjectIdSearch(osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record); +int32 OS_ObjectIdFindNext(osal_objtype_t idtype, osal_index_t *array_index, OS_common_record_t **record); #endif /* INCLUDE_OS_SHARED_IDMAP_H_ */ diff --git a/src/os/shared/inc/os-shared-module.h b/src/os/shared/inc/os-shared-module.h index abae2cdd0..4f9284264 100644 --- a/src/os/shared/inc/os-shared-module.h +++ b/src/os/shared/inc/os-shared-module.h @@ -72,7 +72,7 @@ int32 OS_ModuleAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path); +int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path); /*---------------------------------------------------------------- @@ -82,7 +82,7 @@ int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(uint32 module_id); +int32 OS_ModuleUnload_Impl(osal_index_t module_id); /*---------------------------------------------------------------- Function: OS_ModuleGetInfo_Impl @@ -91,7 +91,7 @@ int32 OS_ModuleUnload_Impl(uint32 module_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(uint32 module_id, OS_module_prop_t *module_prop); +int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop); /*---------------------------------------------------------------- Function: OS_GlobalSymbolLookup_Impl @@ -111,7 +111,7 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName); +int32 OS_ModuleSymbolLookup_Impl(osal_index_t local_id, cpuaddr *SymbolAddress, const char *SymbolName); /*---------------------------------------------------------------- Function: OS_SymbolTableDump_Impl @@ -120,7 +120,7 @@ int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SymbolTableDump_Impl(const char *filename, uint32 size_limit); +int32 OS_SymbolTableDump_Impl(const char *filename, size_t size_limit); /* * Helper functions within the shared layer that are not normally invoked outside the local module diff --git a/src/os/shared/inc/os-shared-mutex.h b/src/os/shared/inc/os-shared-mutex.h index 218c60343..576540228 100644 --- a/src/os/shared/inc/os-shared-mutex.h +++ b/src/os/shared/inc/os-shared-mutex.h @@ -58,7 +58,7 @@ int32 OS_MutexAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options); +int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options); /*---------------------------------------------------------------- Function: OS_MutSemGive_Impl @@ -67,7 +67,7 @@ int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(uint32 sem_id); +int32 OS_MutSemGive_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_MutSemTake_Impl @@ -76,7 +76,7 @@ int32 OS_MutSemGive_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(uint32 sem_id); +int32 OS_MutSemTake_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_MutSemDelete_Impl @@ -85,7 +85,7 @@ int32 OS_MutSemTake_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(uint32 sem_id); +int32 OS_MutSemDelete_Impl(osal_index_t sem_id); /*---------------------------------------------------------------- Function: OS_MutSemGetInfo_Impl @@ -94,6 +94,6 @@ int32 OS_MutSemDelete_Impl(uint32 sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(uint32 sem_id, OS_mut_sem_prop_t *mut_prop); +int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop); #endif /* INCLUDE_OS_SHARED_MUTEX_H_ */ diff --git a/src/os/shared/inc/os-shared-network.h b/src/os/shared/inc/os-shared-network.h index 818f8ea84..f933ee166 100644 --- a/src/os/shared/inc/os-shared-network.h +++ b/src/os/shared/inc/os-shared-network.h @@ -51,7 +51,7 @@ int32 OS_NetworkAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_NetworkGetHostName_Impl(char *host_name, uint32 name_len); +int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len); /*---------------------------------------------------------------- Function: OS_NetworkGetID_Impl diff --git a/src/os/shared/inc/os-shared-printf.h b/src/os/shared/inc/os-shared-printf.h index b4f0e3d86..165dd3dec 100644 --- a/src/os/shared/inc/os-shared-printf.h +++ b/src/os/shared/inc/os-shared-printf.h @@ -45,9 +45,9 @@ typedef struct char device_name[OS_MAX_API_NAME]; char * BufBase; /**< Start of the buffer memory */ - uint32 BufSize; /**< Total size of the buffer */ - volatile uint32 ReadPos; /**< Offset of next byte to read */ - volatile uint32 WritePos; /**< Offset of next byte to write */ + size_t BufSize; /**< Total size of the buffer */ + volatile size_t ReadPos; /**< Offset of next byte to read */ + volatile size_t WritePos; /**< Offset of next byte to write */ uint32 OverflowEvents; /**< Number of lines dropped due to overflow */ } OS_console_internal_record_t; @@ -73,7 +73,7 @@ int32 OS_ConsoleAPI_Init(void); Purpose: Prepare a console device for use For Async devices, this sets up the background writer task ------------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(uint32 local_id); +int32 OS_ConsoleCreate_Impl(osal_index_t local_id); /*---------------------------------------------------------------- Function: OS_ConsoleOutput_Impl @@ -85,7 +85,7 @@ int32 OS_ConsoleCreate_Impl(uint32 local_id); The data is already formatted, this just writes the characters. ------------------------------------------------------------------*/ -void OS_ConsoleOutput_Impl(uint32 local_id); +void OS_ConsoleOutput_Impl(osal_index_t local_id); /*---------------------------------------------------------------- Function: OS_ConsoleOutput_Impl @@ -100,6 +100,6 @@ void OS_ConsoleOutput_Impl(uint32 local_id); service, this should wakeup the actual console servicing thread. ------------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(uint32 local_id); +void OS_ConsoleWakeup_Impl(osal_index_t local_id); #endif /* INCLUDE_OS_SHARED_PRINTF_H_ */ diff --git a/src/os/shared/inc/os-shared-queue.h b/src/os/shared/inc/os-shared-queue.h index b60e4a279..752c61f89 100644 --- a/src/os/shared/inc/os-shared-queue.h +++ b/src/os/shared/inc/os-shared-queue.h @@ -32,9 +32,9 @@ typedef struct { - char queue_name[OS_MAX_API_NAME]; - uint32 max_size; - uint32 max_depth; + char queue_name[OS_MAX_API_NAME]; + size_t max_size; + osal_blockcount_t max_depth; } OS_queue_internal_record_t; /* @@ -63,7 +63,7 @@ int32 OS_QueueAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags); +int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags); /*---------------------------------------------------------------- Function: OS_QueueDelete_Impl @@ -72,7 +72,7 @@ int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(uint32 queue_id); +int32 OS_QueueDelete_Impl(osal_index_t queue_id); /*---------------------------------------------------------------- Function: OS_QueueGet_Impl @@ -85,7 +85,7 @@ int32 OS_QueueDelete_Impl(uint32 queue_id); OS_QUEUE_EMPTY must be returned if the queue is empty when polled (OS_CHECK) OS_QUEUE_INVALID_SIZE must be returned if the supplied buffer is too small ------------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout); +int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout); /*---------------------------------------------------------------- Function: OS_QueuePut_Impl @@ -95,7 +95,7 @@ int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_co Returns: OS_SUCCESS on success, or relevant error code OS_QUEUE_FULL must be returned if the queue is full. ------------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(uint32 queue_id, const void *data, uint32 size, uint32 flags); +int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uint32 flags); /*---------------------------------------------------------------- Function: OS_QueueGetInfo_Impl @@ -104,6 +104,6 @@ int32 OS_QueuePut_Impl(uint32 queue_id, const void *data, uint32 size, uint32 fl Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_QueueGetInfo_Impl(uint32 queue_id, OS_queue_prop_t *queue_prop); +int32 OS_QueueGetInfo_Impl(osal_index_t queue_id, OS_queue_prop_t *queue_prop); #endif /* INCLUDE_OS_SHARED_QUEUE_H_ */ diff --git a/src/os/shared/inc/os-shared-select.h b/src/os/shared/inc/os-shared-select.h index b2bc847a5..a1d7e9c85 100644 --- a/src/os/shared/inc/os-shared-select.h +++ b/src/os/shared/inc/os-shared-select.h @@ -50,7 +50,7 @@ Returns: OS_SUCCESS on success, or relevant error code OS_ERR_OPERATION_NOT_SUPPORTED if the specified file handle does not support select ------------------------------------------------------------------*/ -int32 OS_SelectSingle_Impl(uint32 stream_id, uint32 *SelectFlags, int32 msecs); +int32 OS_SelectSingle_Impl(osal_index_t stream_id, uint32 *SelectFlags, int32 msecs); /*---------------------------------------------------------------- diff --git a/src/os/shared/inc/os-shared-shell.h b/src/os/shared/inc/os-shared-shell.h index 582f1e3fa..a26044648 100644 --- a/src/os/shared/inc/os-shared-shell.h +++ b/src/os/shared/inc/os-shared-shell.h @@ -41,6 +41,6 @@ Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(uint32 stream_id, const char *Cmd); +int32 OS_ShellOutputToFile_Impl(osal_index_t stream_id, const char *Cmd); #endif /* INCLUDE_OS_SHARED_SHELL_H_ */ diff --git a/src/os/shared/inc/os-shared-sockets.h b/src/os/shared/inc/os-shared-sockets.h index a50e0a45c..8bd9fcfb6 100644 --- a/src/os/shared/inc/os-shared-sockets.h +++ b/src/os/shared/inc/os-shared-sockets.h @@ -50,7 +50,7 @@ int32 OS_SocketAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketOpen_Impl(uint32 sock_id); +int32 OS_SocketOpen_Impl(osal_index_t sock_id); /*---------------------------------------------------------------- Function: OS_SocketBind_Impl @@ -59,7 +59,7 @@ int32 OS_SocketOpen_Impl(uint32 sock_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketBind_Impl(uint32 sock_id, const OS_SockAddr_t *Addr); +int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr); /*---------------------------------------------------------------- Function: OS_SocketAccept_Impl @@ -70,7 +70,7 @@ int32 OS_SocketBind_Impl(uint32 sock_id, const OS_SockAddr_t *Addr); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketAccept_Impl(uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Addr, int32 timeout); +int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_SockAddr_t *Addr, int32 timeout); /*---------------------------------------------------------------- Function: OS_SocketConnect_Impl @@ -80,7 +80,7 @@ int32 OS_SocketAccept_Impl(uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Ad Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketConnect_Impl(uint32 sock_id, const OS_SockAddr_t *Addr, int32 timeout); +int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int32 timeout); /*---------------------------------------------------------------- Function: OS_SocketRecvFrom_Impl @@ -93,7 +93,8 @@ int32 OS_SocketConnect_Impl(uint32 sock_id, const OS_SockAddr_t *Addr, int32 tim Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, uint32 buflen, OS_SockAddr_t *RemoteAddr, int32 timeout); +int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, + int32 timeout); /*---------------------------------------------------------------- Function: OS_SocketSendTo_Impl @@ -104,7 +105,7 @@ int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, uint32 buflen, OS_Soc Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, uint32 buflen, const OS_SockAddr_t *RemoteAddr); +int32 OS_SocketSendTo_Impl(osal_index_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr); /*---------------------------------------------------------------- @@ -114,7 +115,7 @@ int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, uint32 buflen, co Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketGetInfo_Impl(uint32 sock_id, OS_socket_prop_t *sock_prop); +int32 OS_SocketGetInfo_Impl(osal_index_t sock_id, OS_socket_prop_t *sock_prop); /*---------------------------------------------------------------- @@ -134,7 +135,7 @@ int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketAddrToString_Impl(char *buffer, uint32 buflen, const OS_SockAddr_t *Addr); +int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_t *Addr); /*---------------------------------------------------------------- Function: OS_SocketAddrFromString_Impl @@ -174,6 +175,6 @@ int32 OS_SocketAddrSetPort_Impl(OS_SockAddr_t *Addr, uint16 PortNum); * Internal helper functions * Not normally called outside the local unit, except during unit test */ -void OS_CreateSocketName(uint32 local_id, const OS_SockAddr_t *Addr, const char *parent_name); +void OS_CreateSocketName(osal_index_t local_id, const OS_SockAddr_t *Addr, const char *parent_name); #endif /* INCLUDE_OS_SHARED_SOCKETS_H_ */ diff --git a/src/os/shared/inc/os-shared-task.h b/src/os/shared/inc/os-shared-task.h index 4adb87fe2..74ba5386a 100644 --- a/src/os/shared/inc/os-shared-task.h +++ b/src/os/shared/inc/os-shared-task.h @@ -34,12 +34,12 @@ typedef struct { char task_name[OS_MAX_API_NAME]; - uint32 stack_size; - uint32 priority; + size_t stack_size; + osal_priority_t priority; osal_task_entry entry_function_pointer; osal_task_entry delete_hook_pointer; void * entry_arg; - uint32 * stack_pointer; + osal_stackptr_t stack_pointer; } OS_task_internal_record_t; /* @@ -81,7 +81,7 @@ void OS_TaskEntryPoint(osal_id_t global_task_id); Returns: OS_SUCCESS on match, any other code on non-match ------------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(uint32 task_id); +int32 OS_TaskMatch_Impl(osal_index_t task_id); /*---------------------------------------------------------------- @@ -92,7 +92,7 @@ int32 OS_TaskMatch_Impl(uint32 task_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags); +int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags); /*---------------------------------------------------------------- Function: OS_TaskDelete_Impl @@ -101,7 +101,7 @@ int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(uint32 task_id); +int32 OS_TaskDelete_Impl(osal_index_t task_id); /*---------------------------------------------------------------- Function: OS_TaskExit_Impl @@ -128,7 +128,7 @@ int32 OS_TaskDelay_Impl(uint32 millisecond); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(uint32 task_id, uint32 new_priority); +int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority); /*---------------------------------------------------------------- Function: OS_TaskGetId_Impl @@ -146,7 +146,7 @@ osal_id_t OS_TaskGetId_Impl(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(uint32 task_id, OS_task_prop_t *task_prop); +int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop); /*---------------------------------------------------------------- @@ -169,7 +169,7 @@ int32 OS_TaskRegister_Impl(osal_id_t global_task_id); Compatible with the "OS_ObjectIdFindBySearch" routine ------------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_record_t *obj); +bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj); /*---------------------------------------------------------------- @@ -179,6 +179,6 @@ bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_r compatible/reasonable for the underlying OS. ------------------------------------------------------------------*/ -int32 OS_TaskValidateSystemData_Impl(const void *sysdata, uint32 sysdata_size); +int32 OS_TaskValidateSystemData_Impl(const void *sysdata, size_t sysdata_size); #endif /* INCLUDE_OS_SHARED_TASK_H_ */ diff --git a/src/os/shared/inc/os-shared-time.h b/src/os/shared/inc/os-shared-time.h index f8397cd54..1fb7aa3e1 100644 --- a/src/os/shared/inc/os-shared-time.h +++ b/src/os/shared/inc/os-shared-time.h @@ -36,9 +36,9 @@ typedef struct { char timer_name[OS_MAX_API_NAME]; uint32 flags; - uint32 timebase_ref; - uint32 prev_ref; - uint32 next_ref; + osal_index_t timebase_ref; + osal_index_t prev_ref; + osal_index_t next_ref; uint32 backlog_resets; int32 wait_time; int32 interval_time; diff --git a/src/os/shared/inc/os-shared-timebase.h b/src/os/shared/inc/os-shared-timebase.h index cf88e82a2..109f05b10 100644 --- a/src/os/shared/inc/os-shared-timebase.h +++ b/src/os/shared/inc/os-shared-timebase.h @@ -73,7 +73,7 @@ int32 OS_TimeBaseAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(uint32 timebase_id); +int32 OS_TimeBaseCreate_Impl(osal_index_t timebase_id); /*---------------------------------------------------------------- Function: OS_TimeBaseSet_Impl @@ -82,7 +82,7 @@ int32 OS_TimeBaseCreate_Impl(uint32 timebase_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(uint32 timebase_id, int32 start_time, int32 interval_time); +int32 OS_TimeBaseSet_Impl(osal_index_t timebase_id, int32 start_time, int32 interval_time); /*---------------------------------------------------------------- Function: OS_TimeBaseDelete_Impl @@ -91,7 +91,7 @@ int32 OS_TimeBaseSet_Impl(uint32 timebase_id, int32 start_time, int32 interval_t Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(uint32 timebase_id); +int32 OS_TimeBaseDelete_Impl(osal_index_t timebase_id); /**************************************************************************************** INTERNAL FUNCTIONS @@ -103,7 +103,7 @@ int32 OS_TimeBaseDelete_Impl(uint32 timebase_id); Purpose: Get exclusive access to the given timebase Add/remove of application callbacks is prevented ------------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(uint32 timebase_id); +void OS_TimeBaseLock_Impl(osal_index_t timebase_id); /*---------------------------------------------------------------- Function: OS_TimeBaseLock_Impl @@ -111,7 +111,7 @@ void OS_TimeBaseLock_Impl(uint32 timebase_id); Purpose: Release exclusive access to the given timebase Add/remove of application callbacks is allowed ------------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(uint32 timebase_id); +void OS_TimeBaseUnlock_Impl(osal_index_t timebase_id); /*---------------------------------------------------------------- Function: OS_TimeBaseGetInfo_Impl @@ -120,7 +120,7 @@ void OS_TimeBaseUnlock_Impl(uint32 timebase_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(uint32 timer_id, OS_timebase_prop_t *timer_prop); +int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop); /*---------------------------------------------------------------- Function: OS_TimeBase_CallbackThread diff --git a/src/os/shared/src/osapi-binsem.c b/src/os/shared/src/osapi-binsem.c index 3cb6dbfc6..6d323faff 100644 --- a/src/os/shared/src/osapi-binsem.c +++ b/src/os/shared/src/osapi-binsem.c @@ -98,7 +98,7 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check for NULL pointers */ if (sem_id == NULL || sem_name == NULL) @@ -141,7 +141,7 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia int32 OS_BinSemDelete(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); @@ -168,7 +168,7 @@ int32 OS_BinSemDelete(osal_id_t sem_id) int32 OS_BinSemGive(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -193,7 +193,7 @@ int32 OS_BinSemGive(osal_id_t sem_id) int32 OS_BinSemFlush(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -217,7 +217,7 @@ int32 OS_BinSemFlush(osal_id_t sem_id) int32 OS_BinSemTake(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -241,7 +241,7 @@ int32 OS_BinSemTake(osal_id_t sem_id) int32 OS_BinSemTimedWait(osal_id_t sem_id, uint32 msecs) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -287,7 +287,7 @@ int32 OS_BinSemGetIdByName(osal_id_t *sem_id, const char *sem_name) int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check parameters */ diff --git a/src/os/shared/src/osapi-common.c b/src/os/shared/src/osapi-common.c index c6f317625..609fbe045 100644 --- a/src/os/shared/src/osapi-common.c +++ b/src/os/shared/src/osapi-common.c @@ -108,9 +108,9 @@ int32 OS_NotifyEvent(OS_Event_t event, osal_id_t object_id, void *data) *-----------------------------------------------------------------*/ int32 OS_API_Init(void) { - int32 return_code = OS_SUCCESS; - uint32 idtype; - uint32 microSecPerSec; + int32 return_code = OS_SUCCESS; + osal_objtype_t idtype; + uint32 microSecPerSec; if (OS_SharedGlobalVars.Initialized != false) { diff --git a/src/os/shared/src/osapi-countsem.c b/src/os/shared/src/osapi-countsem.c index 00cd9d930..d0e248167 100644 --- a/src/os/shared/src/osapi-countsem.c +++ b/src/os/shared/src/osapi-countsem.c @@ -90,7 +90,7 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check for NULL pointers */ if (sem_id == NULL || sem_name == NULL) @@ -133,7 +133,7 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init int32 OS_CountSemDelete(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); @@ -160,7 +160,7 @@ int32 OS_CountSemDelete(osal_id_t sem_id) int32 OS_CountSemGive(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -185,7 +185,7 @@ int32 OS_CountSemGive(osal_id_t sem_id) int32 OS_CountSemTake(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -209,7 +209,7 @@ int32 OS_CountSemTake(osal_id_t sem_id) int32 OS_CountSemTimedWait(osal_id_t sem_id, uint32 msecs) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -255,7 +255,7 @@ int32 OS_CountSemGetIdByName(osal_id_t *sem_id, const char *sem_name) int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check parameters */ diff --git a/src/os/shared/src/osapi-dir.c b/src/os/shared/src/osapi-dir.c index 42153431e..5246d9a31 100644 --- a/src/os/shared/src/osapi-dir.c +++ b/src/os/shared/src/osapi-dir.c @@ -113,7 +113,7 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) { char local_path[OS_MAX_LOCAL_PATH_LEN]; OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; if (dir_id == NULL || path == NULL) @@ -154,7 +154,7 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) int32 OS_DirectoryClose(osal_id_t dir_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Make sure the file descriptor is legit before using it */ @@ -181,7 +181,7 @@ int32 OS_DirectoryClose(osal_id_t dir_id) int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; if (dirent == NULL) @@ -223,7 +223,7 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) int32 OS_DirectoryRewind(osal_id_t dir_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Make sure the file descriptor is legit before using it */ diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 37837b9e2..06cc795e8 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -90,7 +90,7 @@ int32 OS_FileAPI_Init(void) int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 access) { int32 return_code; - uint32 local_id; + osal_index_t local_id; OS_common_record_t *record; char local_path[OS_MAX_LOCAL_PATH_LEN]; @@ -228,7 +228,7 @@ int32 OS_open(const char *path, int32 access, uint32 mode) int32 OS_close(osal_id_t filedes) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Make sure the file descriptor is legit before using it */ @@ -253,10 +253,10 @@ int32 OS_close(osal_id_t filedes) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_TimedRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeout) +int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -283,10 +283,10 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeout * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, uint32 nbytes, int32 timeout) +int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -313,7 +313,7 @@ int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, uint32 nbytes, int32 * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_read(osal_id_t filedes, void *buffer, uint32 nbytes) +int32 OS_read(osal_id_t filedes, void *buffer, size_t nbytes) { return OS_TimedRead(filedes, buffer, nbytes, OS_PEND); } /* end OS_read */ @@ -326,7 +326,7 @@ int32 OS_read(osal_id_t filedes, void *buffer, uint32 nbytes) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_write(osal_id_t filedes, const void *buffer, uint32 nbytes) +int32 OS_write(osal_id_t filedes, const void *buffer, size_t nbytes) { return OS_TimedWrite(filedes, buffer, nbytes, OS_PEND); } /* end OS_write */ @@ -394,7 +394,7 @@ int32 OS_stat(const char *path, os_fstat_t *filestats) int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Make sure the file descriptor is legit before using it */ @@ -441,10 +441,10 @@ int32 OS_remove(const char *path) *-----------------------------------------------------------------*/ int32 OS_rename(const char *old, const char *new) { - int i; - int32 return_code; - char old_path[OS_MAX_LOCAL_PATH_LEN]; - char new_path[OS_MAX_LOCAL_PATH_LEN]; + osal_index_t i; + int32 return_code; + char old_path[OS_MAX_LOCAL_PATH_LEN]; + char new_path[OS_MAX_LOCAL_PATH_LEN]; return_code = OS_TranslatePath(old, old_path); if (return_code == OS_SUCCESS) @@ -583,7 +583,7 @@ int32 OS_mv(const char *src, const char *dest) int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check parameters */ @@ -618,8 +618,8 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) *-----------------------------------------------------------------*/ int32 OS_FileOpenCheck(const char *Filename) { - int32 return_code; - uint32 i; + int32 return_code; + osal_index_t i; if (Filename == NULL) { @@ -656,9 +656,9 @@ int32 OS_FileOpenCheck(const char *Filename) *-----------------------------------------------------------------*/ int32 OS_CloseFileByName(const char *Filename) { - int32 return_code; - int32 close_code; - uint32 i; + int32 return_code; + int32 close_code; + osal_index_t i; if (Filename == NULL) { @@ -703,9 +703,9 @@ int32 OS_CloseFileByName(const char *Filename) *-----------------------------------------------------------------*/ int32 OS_CloseAllFiles(void) { - int32 return_code; - int32 close_code; - uint32 i; + int32 return_code; + int32 close_code; + osal_index_t i; return_code = OS_SUCCESS; diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index 30d562aa4..ed8effd21 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -74,7 +74,7 @@ const char OS_FILESYS_RAMDISK_VOLNAME_PREFIX[] = "RAM"; * Returns: true if the entry matches, false if it does not match * *-----------------------------------------------------------------*/ -bool OS_FileSys_FindVirtMountPoint(void *ref, uint32 local_id, const OS_common_record_t *obj) +bool OS_FileSys_FindVirtMountPoint(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { OS_filesys_internal_record_t *rec = &OS_filesys_table[local_id]; const char * target = (const char *)ref; @@ -101,13 +101,13 @@ bool OS_FileSys_FindVirtMountPoint(void *ref, uint32 local_id, const OS_common_r * Returns: OS_SUCCESS on creating the disk, or appropriate error code. * *-----------------------------------------------------------------*/ -int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, uint32 blocksize, - uint32 numblocks, bool should_format) +int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, size_t blocksize, + osal_blockcount_t numblocks, bool should_format) { OS_common_record_t * global; OS_filesys_internal_record_t *local; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* ** Check parameters @@ -229,7 +229,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const OS_common_record_t * global; OS_filesys_internal_record_t *local; int32 return_code; - uint32 local_id; + osal_index_t local_id; const char * dev_name; /* @@ -316,7 +316,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_mkfs(char *address, const char *devname, const char *volname, uint32 blocksize, uint32 numblocks) +int32 OS_mkfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks) { int32 return_code; @@ -349,7 +349,7 @@ int32 OS_mkfs(char *address, const char *devname, const char *volname, uint32 bl int32 OS_rmfs(const char *devname) { int32 return_code; - uint32 local_id; + osal_index_t local_id; OS_common_record_t *global; if (devname == NULL) @@ -402,7 +402,7 @@ int32 OS_rmfs(const char *devname) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_initfs(char *address, const char *devname, const char *volname, uint32 blocksize, uint32 numblocks) +int32 OS_initfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks) { int32 return_code; @@ -435,7 +435,7 @@ int32 OS_initfs(char *address, const char *devname, const char *volname, uint32 int32 OS_mount(const char *devname, const char *mountpoint) { int32 return_code; - uint32 local_id; + osal_index_t local_id; OS_common_record_t * global; OS_filesys_internal_record_t *local; @@ -511,7 +511,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) int32 OS_unmount(const char *mountpoint) { int32 return_code; - uint32 local_id; + osal_index_t local_id; OS_common_record_t * global; OS_filesys_internal_record_t *local; @@ -582,7 +582,7 @@ int32 OS_fsBlocksFree(const char *name) { int32 return_code; OS_statvfs_t statfs; - uint32 local_id; + osal_index_t local_id; OS_common_record_t *global; if (name == NULL) @@ -633,7 +633,7 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) { int32 return_code; OS_statvfs_t statfs; - uint32 local_id; + osal_index_t local_id; OS_common_record_t *global; if (name == NULL || bytes_free == NULL) @@ -682,7 +682,7 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) *-----------------------------------------------------------------*/ int32 OS_chkfs(const char *name, bool repair) { - uint32 local_id; + osal_index_t local_id; int32 return_code; OS_common_record_t *global; @@ -729,7 +729,7 @@ int32 OS_chkfs(const char *name, bool repair) *-----------------------------------------------------------------*/ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) { - uint32 local_id; + osal_index_t local_id; int32 return_code; OS_common_record_t * global; OS_filesys_internal_record_t *local; @@ -783,7 +783,7 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) *-----------------------------------------------------------------*/ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) { - int i; + osal_index_t idx; /* ** Check to see if the file pointers are NULL @@ -800,9 +800,9 @@ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) OS_Lock_Global(OS_OBJECT_TYPE_OS_STREAM); - for (i = 0; i < OS_MAX_NUM_OPEN_FILES; i++) + for (idx = 0; idx < OS_MAX_NUM_OPEN_FILES; idx++) { - if (!OS_ObjectIdDefined(OS_global_stream_table[i].active_id)) + if (!OS_ObjectIdDefined(OS_global_stream_table[idx].active_id)) { filesys_info->FreeFds++; } @@ -812,9 +812,9 @@ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) OS_Lock_Global(OS_OBJECT_TYPE_OS_FILESYS); - for (i = 0; i < OS_MAX_FILE_SYSTEMS; i++) + for (idx = 0; idx < OS_MAX_FILE_SYSTEMS; idx++) { - if (!OS_ObjectIdDefined(OS_global_filesys_table[i].active_id)) + if (!OS_ObjectIdDefined(OS_global_filesys_table[idx].active_id)) { filesys_info->FreeVolumes++; } @@ -835,7 +835,7 @@ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) *-----------------------------------------------------------------*/ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) { - uint32 local_id; + osal_index_t local_id; int32 return_code; const char * name_ptr; OS_common_record_t * global; diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 0c0bf1af7..858c583cd 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -132,7 +132,7 @@ int32 OS_ObjectIdInit(void) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -uint32 OS_GetMaxForObjectType(uint32 idtype) +uint32 OS_GetMaxForObjectType(osal_objtype_t idtype) { switch (idtype) { @@ -172,7 +172,7 @@ uint32 OS_GetMaxForObjectType(uint32 idtype) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -uint32 OS_GetBaseForObjectType(uint32 idtype) +uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) { switch (idtype) { @@ -224,7 +224,7 @@ uint32 OS_GetBaseForObjectType(uint32 idtype) * returns: true if match, false otherwise * *-----------------------------------------------------------------*/ -bool OS_ObjectNameMatch(void *ref, uint32 local_id, const OS_common_record_t *obj) +bool OS_ObjectNameMatch(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { return (obj->name_entry != NULL && strcmp((const char *)ref, obj->name_entry) == 0); } /* end OS_ObjectNameMatch */ @@ -245,7 +245,7 @@ bool OS_ObjectNameMatch(void *ref, uint32 local_id, const OS_common_record_t *ob * lock type requested (lock_mode). * *-----------------------------------------------------------------*/ -void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, uint32 idtype) +void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype) { if (lock_mode != OS_LOCK_MODE_NONE) { @@ -291,7 +291,8 @@ void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, uint32 idtype) * all lock modes other than OS_LOCK_MODE_NONE. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, uint32 idtype, osal_id_t reference_id, OS_common_record_t *obj) +int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t reference_id, + OS_common_record_t *obj) { int32 return_code = OS_ERROR; uint32 exclusive_bits = 0; @@ -420,11 +421,11 @@ int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, uint32 idtype, osal_id_t * returns: OS_ERR_NAME_NOT_FOUND if not found, OS_SUCCESS if match is found * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdSearch(uint32 idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record) +int32 OS_ObjectIdSearch(osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record) { int32 return_code; uint32 obj_count; - uint32 local_id; + osal_index_t local_id; OS_common_record_t *obj; return_code = OS_ERR_NAME_NOT_FOUND; @@ -475,7 +476,7 @@ int32 OS_ObjectIdSearch(uint32 idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg * * returns: OS_SUCCESS if an empty location was found. *-----------------------------------------------------------------*/ -int32 OS_ObjectIdFindNext(uint32 idtype, uint32 *array_index, OS_common_record_t **record) +int32 OS_ObjectIdFindNext(osal_objtype_t idtype, osal_index_t *array_index, OS_common_record_t **record) { uint32 max_id; uint32 base_id; @@ -537,7 +538,7 @@ int32 OS_ObjectIdFindNext(uint32 idtype, uint32 *array_index, OS_common_record_t if (array_index != NULL) { - *array_index = local_id; + *array_index = OSAL_INDEX_C(local_id); } if (record != NULL) { @@ -561,7 +562,7 @@ int32 OS_ObjectIdFindNext(uint32 idtype, uint32 *array_index, OS_common_record_t Purpose: Locks the global table identified by "idtype" ------------------------------------------------------------------*/ -void OS_Lock_Global(uint32 idtype) +void OS_Lock_Global(osal_objtype_t idtype) { int32 return_code; osal_id_t self_task_id; @@ -622,7 +623,7 @@ void OS_Lock_Global(uint32 idtype) Purpose: Unlocks the global table identified by "idtype" ------------------------------------------------------------------*/ -void OS_Unlock_Global(uint32 idtype) +void OS_Unlock_Global(osal_objtype_t idtype) { int32 return_code; osal_id_t self_task_id; @@ -695,8 +696,8 @@ void OS_Unlock_Global(uint32 idtype) *-----------------------------------------------------------------*/ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, osal_id_t *outid) { - uint32 idtype = OS_ObjectIdToType_Impl(record->active_id); - osal_id_t callback_id; + osal_objtype_t idtype = OS_ObjectIdToType_Impl(record->active_id); + osal_id_t callback_id; /* if operation was unsuccessful, then clear * the active_id field within the record, so @@ -750,8 +751,8 @@ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, ------------------------------------------------------------------*/ int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *record) { - uint32 idtype = OS_ObjectIdToType_Impl(record->active_id); - osal_id_t callback_id; + osal_objtype_t idtype = OS_ObjectIdToType_Impl(record->active_id); + osal_id_t callback_id; /* Clear the OSAL ID if successful - this returns the record to the pool */ if (operation_status == OS_SUCCESS) @@ -790,7 +791,7 @@ int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *reco * returns: OS_ERR_NAME_NOT_FOUND if not found, OS_SUCCESS if match is found * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, uint32 idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, +int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record) { int32 return_code; @@ -836,7 +837,8 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, uint32 idtype, OS_ObjectM * returns: OS_ERR_NAME_NOT_FOUND if not found, OS_SUCCESS if match is found * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, uint32 idtype, const char *name, OS_common_record_t **record) +int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, + OS_common_record_t **record) { return OS_ObjectIdGetBySearch(lock_mode, idtype, OS_ObjectNameMatch, (void *)name, record); @@ -853,7 +855,7 @@ int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, uint32 idtype, const char * * returns: OS_ERR_NAME_NOT_FOUND if not found, OS_SUCCESS if match is found * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdFindByName(uint32 idtype, const char *name, osal_id_t *object_id) +int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t *object_id) { int32 return_code; OS_common_record_t *global; @@ -900,7 +902,7 @@ int32 OS_ObjectIdFindByName(uint32 idtype, const char *name, osal_id_t *object_i * If this returns something other than OS_SUCCESS then the global is NOT locked. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, uint32 idtype, osal_id_t id, uint32 *array_index, +int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, osal_index_t *array_index, OS_common_record_t **record) { int32 return_code; @@ -955,8 +957,8 @@ int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, uint32 idtype, osal_id_t id, *-----------------------------------------------------------------*/ int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record) { - int32 return_code; - uint32 idtype = OS_ObjectIdToType_Impl(record->active_id); + int32 return_code; + osal_objtype_t idtype = OS_ObjectIdToType_Impl(record->active_id); if (idtype == 0 || !OS_ObjectIdDefined(record->active_id)) { @@ -1012,7 +1014,8 @@ int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record) * manipulate the global lock at all. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdAllocateNew(uint32 idtype, const char *name, uint32 *array_index, OS_common_record_t **record) +int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index_t *array_index, + OS_common_record_t **record) { int32 return_code; @@ -1079,7 +1082,7 @@ int32 OS_ObjectIdAllocateNew(uint32 idtype, const char *name, uint32 *array_inde * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_ConvertToArrayIndex(osal_id_t object_id, uint32 *ArrayIndex) +int32 OS_ConvertToArrayIndex(osal_id_t object_id, osal_index_t *ArrayIndex) { /* just pass to the generic internal conversion routine */ return OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_UNDEFINED, object_id, ArrayIndex); @@ -1095,7 +1098,7 @@ int32 OS_ConvertToArrayIndex(osal_id_t object_id, uint32 *ArrayIndex) *-----------------------------------------------------------------*/ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg) { - uint32 idtype; + osal_objtype_t idtype; for (idtype = 0; idtype < OS_OBJECT_TYPE_USER; ++idtype) { @@ -1111,11 +1114,12 @@ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void * See description in API and header file for detail * *-----------------------------------------------------------------*/ -void OS_ForEachObjectOfType(uint32 idtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg) +void OS_ForEachObjectOfType(osal_objtype_t idtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, + void *callback_arg) { - uint32 obj_index; - uint32 obj_max; - osal_id_t obj_id; + osal_index_t obj_index; + uint32 obj_max; + osal_id_t obj_id; obj_max = OS_GetMaxForObjectType(idtype); if (obj_max > 0) @@ -1170,7 +1174,7 @@ void OS_ForEachObjectOfType(uint32 idtype, osal_id_t creator_id, OS_ArgCallback_ * See description in API and header file for detail * *-----------------------------------------------------------------*/ -uint32 OS_IdentifyObject(osal_id_t object_id) +osal_objtype_t OS_IdentifyObject(osal_id_t object_id) { return OS_ObjectIdToType_Impl(object_id); } /* end OS_IdentifyObject */ @@ -1183,13 +1187,13 @@ uint32 OS_IdentifyObject(osal_id_t object_id) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_GetResourceName(osal_id_t object_id, char *buffer, uint32 buffer_size) +int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size) { - uint32 idtype; + osal_objtype_t idtype; OS_common_record_t *record; int32 return_code; - uint32 name_len; - uint32 local_id; + size_t name_len; + osal_index_t local_id; /* sanity check the passed-in buffer and size */ if (buffer == NULL || buffer_size == 0) @@ -1241,12 +1245,12 @@ int32 OS_GetResourceName(osal_id_t object_id, char *buffer, uint32 buffer_size) * Otherwise OS_SUCCESS is returned. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdToArrayIndex(uint32 idtype, osal_id_t object_id, uint32 *ArrayIndex) +int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t object_id, osal_index_t *ArrayIndex) { - uint32 max_id; - uint32 obj_index; - uint32 actual_type; - int32 return_code; + uint32 max_id; + uint32 obj_index; + osal_objtype_t actual_type; + int32 return_code; obj_index = OS_ObjectIdToSerialNumber_Impl(object_id); actual_type = OS_ObjectIdToType_Impl(object_id); @@ -1269,7 +1273,7 @@ int32 OS_ObjectIdToArrayIndex(uint32 idtype, osal_id_t object_id, uint32 *ArrayI else { return_code = OS_SUCCESS; - *ArrayIndex = obj_index % max_id; + *ArrayIndex = OSAL_INDEX_C(obj_index % max_id); } } diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 96bbe4abb..2bd14899f 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -184,7 +184,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f char translated_path[OS_MAX_LOCAL_PATH_LEN]; int32 return_code; int32 filename_status; - uint32 local_id; + osal_index_t local_id; OS_common_record_t *record; /* @@ -282,7 +282,7 @@ int32 OS_ModuleUnload(osal_id_t module_id) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, module_id, &local_id, &record); if (return_code == OS_SUCCESS) @@ -316,7 +316,7 @@ int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_prop) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check parameters */ if (module_prop == NULL) @@ -402,7 +402,7 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const int32 return_code; int32 staticsym_status; OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; /* ** Check parameters @@ -447,7 +447,7 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_SymbolTableDump(const char *filename, uint32 SizeLimit) +int32 OS_SymbolTableDump(const char *filename, size_t SizeLimit) { int32 return_code; char translated_path[OS_MAX_LOCAL_PATH_LEN]; diff --git a/src/os/shared/src/osapi-mutex.c b/src/os/shared/src/osapi-mutex.c index 28cbc73ee..5e1a282ff 100644 --- a/src/os/shared/src/osapi-mutex.c +++ b/src/os/shared/src/osapi-mutex.c @@ -90,7 +90,7 @@ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check for NULL pointers */ if (sem_id == NULL || sem_name == NULL) @@ -133,7 +133,7 @@ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) int32 OS_MutSemDelete(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); @@ -160,7 +160,7 @@ int32 OS_MutSemDelete(osal_id_t sem_id) int32 OS_MutSemGive(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; osal_id_t self_task; @@ -198,7 +198,7 @@ int32 OS_MutSemGive(osal_id_t sem_id) int32 OS_MutSemTake(osal_id_t sem_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; osal_id_t self_task; @@ -262,7 +262,7 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check parameters */ if (mut_prop == NULL) diff --git a/src/os/shared/src/osapi-network.c b/src/os/shared/src/osapi-network.c index 3864288e3..e43e05561 100644 --- a/src/os/shared/src/osapi-network.c +++ b/src/os/shared/src/osapi-network.c @@ -63,7 +63,7 @@ int32 OS_NetworkAPI_Init(void) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_NetworkGetHostName(char *host_name, uint32 name_len) +int32 OS_NetworkGetHostName(char *host_name, size_t name_len) { uint32 return_code; diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index e420dfeab..0a5359656 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -78,7 +78,7 @@ int32 OS_ConsoleAPI_Init(void) { OS_console_internal_record_t *console; int32 return_code; - uint32 local_id; + osal_index_t local_id; OS_common_record_t * record; memset(&OS_console_table, 0, sizeof(OS_console_table)); @@ -137,10 +137,10 @@ int32 OS_ConsoleAPI_Init(void) * Either the entire string should be written, or none of it. * *-----------------------------------------------------------------*/ -static int32 OS_Console_CopyOut(OS_console_internal_record_t *console, const char *Str, uint32 *NextWritePos) +static int32 OS_Console_CopyOut(OS_console_internal_record_t *console, const char *Str, size_t *NextWritePos) { const char *pmsg; - uint32 WriteOffset; + size_t WriteOffset; int32 return_code; return_code = OS_ERROR; @@ -193,9 +193,9 @@ int32 OS_ConsoleWrite(osal_id_t console_id, const char *Str) { int32 return_code; OS_common_record_t * record; - uint32 local_id; + osal_index_t local_id; OS_console_internal_record_t *console; - uint32 PendingWritePos; + size_t PendingWritePos; return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_CONSOLE, console_id, &local_id, &record); if (return_code == OS_SUCCESS) diff --git a/src/os/shared/src/osapi-queue.c b/src/os/shared/src/osapi-queue.c index 9400f0f3b..51833c843 100644 --- a/src/os/shared/src/osapi-queue.c +++ b/src/os/shared/src/osapi-queue.c @@ -87,11 +87,12 @@ int32 OS_QueueAPI_Init(void) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, uint32 queue_depth, uint32 data_size, uint32 flags) +int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, + uint32 flags) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; if (queue_name == NULL || queue_id == NULL) { @@ -140,7 +141,7 @@ int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, uint32 queue_d int32 OS_QueueDelete(osal_id_t queue_id) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, queue_id, &local_id, &record); @@ -164,10 +165,10 @@ int32 OS_QueueDelete(osal_id_t queue_id) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet(osal_id_t queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) +int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -206,10 +207,10 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, uint32 size, uint32 *size_copi * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut(osal_id_t queue_id, const void *data, uint32 size, uint32 flags) +int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flags) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -264,7 +265,7 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check parameters */ if (queue_prop == NULL) diff --git a/src/os/shared/src/osapi-select.c b/src/os/shared/src/osapi-select.c index 5a3fe885f..f48c27a34 100644 --- a/src/os/shared/src/osapi-select.c +++ b/src/os/shared/src/osapi-select.c @@ -61,7 +61,7 @@ int32 OS_SelectSingle(osal_id_t objid, uint32 *StateFlags, int32 msecs) { int32 return_code; - uint32 local_id; + osal_index_t local_id; OS_common_record_t *record; if (StateFlags == NULL) @@ -126,8 +126,8 @@ int32 OS_SelectFdZero(OS_FdSet *Set) *-----------------------------------------------------------------*/ int32 OS_SelectFdAdd(OS_FdSet *Set, osal_id_t objid) { - int32 return_code; - uint32 local_id; + int32 return_code; + osal_index_t local_id; if (Set == NULL) return OS_INVALID_POINTER; @@ -151,8 +151,8 @@ int32 OS_SelectFdAdd(OS_FdSet *Set, osal_id_t objid) *-----------------------------------------------------------------*/ int32 OS_SelectFdClear(OS_FdSet *Set, osal_id_t objid) { - int32 return_code; - uint32 local_id; + int32 return_code; + osal_index_t local_id; if (Set == NULL) return OS_INVALID_POINTER; @@ -176,8 +176,8 @@ int32 OS_SelectFdClear(OS_FdSet *Set, osal_id_t objid) *-----------------------------------------------------------------*/ bool OS_SelectFdIsSet(OS_FdSet *Set, osal_id_t objid) { - int32 return_code; - uint32 local_id; + int32 return_code; + osal_index_t local_id; if (Set == NULL) return false; diff --git a/src/os/shared/src/osapi-shell.c b/src/os/shared/src/osapi-shell.c index d59668210..50e195068 100644 --- a/src/os/shared/src/osapi-shell.c +++ b/src/os/shared/src/osapi-shell.c @@ -53,7 +53,7 @@ int32 OS_ShellOutputToFile(const char *Cmd, osal_id_t filedes) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 4a66c5fdb..cca5aee01 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -84,9 +84,9 @@ int32 OS_SocketAPI_Init(void) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -void OS_CreateSocketName(uint32 local_id, const OS_SockAddr_t *Addr, const char *parent_name) +void OS_CreateSocketName(osal_index_t local_id, const OS_SockAddr_t *Addr, const char *parent_name) { - int32 len; + size_t len; uint16 port; OS_stream_internal_record_t *sock = &OS_stream_table[local_id]; @@ -122,7 +122,7 @@ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_ { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check for NULL pointers */ if (sock_id == NULL) @@ -160,7 +160,7 @@ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -214,8 +214,8 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * { OS_common_record_t *record; OS_common_record_t *connrecord; - uint32 local_id; - uint32 conn_id = 0; + osal_index_t local_id; + osal_index_t conn_id; int32 return_code; /* Check Parameters */ @@ -232,6 +232,7 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * * set to OS_SUCCESS when connrecord is also initialized) */ connrecord = NULL; + conn_id = OSAL_INDEX_C(0); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &local_id, &record); if (return_code == OS_SUCCESS) @@ -310,7 +311,7 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeout) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -364,10 +365,10 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, uint32 buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) +int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -407,10 +408,10 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, uint32 buflen, OS_SockA * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, uint32 buflen, const OS_SockAddr_t *RemoteAddr) +int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check Parameters */ @@ -470,7 +471,7 @@ int32 OS_SocketGetIdByName(osal_id_t *sock_id, const char *sock_name) int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; int32 return_code; /* Check parameters */ @@ -520,7 +521,7 @@ int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_SocketAddrToString(char *buffer, uint32 buflen, const OS_SockAddr_t *Addr) +int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) { if (Addr == NULL || buffer == NULL || buflen == 0) { diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index 05817443e..0bb3b96d0 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -81,8 +81,8 @@ OS_task_internal_record_t OS_task_table[LOCAL_NUM_OBJECTS]; *-----------------------------------------------------------------*/ static int32 OS_TaskPrepare(osal_id_t task_id, osal_task_entry *entrypt) { - int32 return_code; - uint32 local_id; + int32 return_code; + osal_index_t local_id; return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TASK, task_id, &local_id); if (return_code == OS_SUCCESS) @@ -186,18 +186,12 @@ int32 OS_TaskAPI_Init(void) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, uint32 *stack_pointer, - uint32 stack_size, uint32 priority, uint32 flags) +int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, + osal_stackptr_t stack_pointer, size_t stack_size, osal_priority_t priority, uint32 flags) { OS_common_record_t *record; int32 return_code; - uint32 local_id; - - /* Check for bad priority */ - if (priority > OS_MAX_TASK_PRIORITY) - { - return OS_ERR_INVALID_PRIORITY; - } + osal_index_t local_id; /* Check for NULL pointers */ if (task_name == NULL || task_id == NULL || function_pointer == NULL) @@ -255,7 +249,7 @@ int32 OS_TaskDelete(osal_id_t task_id) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; osal_task_entry delete_hook; delete_hook = NULL; @@ -294,7 +288,7 @@ void OS_TaskExit() { OS_common_record_t *record; osal_id_t task_id; - uint32 local_id; + osal_index_t local_id; task_id = OS_TaskGetId_Impl(); if (OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &local_id, &record) == OS_SUCCESS) @@ -331,33 +325,26 @@ int32 OS_TaskDelay(uint32 millisecond) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_TaskSetPriority(osal_id_t task_id, uint32 new_priority) +int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; - if (new_priority > OS_MAX_TASK_PRIORITY) - { - return_code = OS_ERR_INVALID_PRIORITY; - } - else + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &local_id, &record); + if (return_code == OS_SUCCESS) { - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &local_id, &record); + return_code = OS_TaskSetPriority_Impl(local_id, new_priority); + if (return_code == OS_SUCCESS) { - return_code = OS_TaskSetPriority_Impl(local_id, new_priority); - - if (return_code == OS_SUCCESS) - { - /* Use the abstracted priority, not the OS one */ - /* Change the priority in the table as well */ - OS_task_table[local_id].priority = new_priority; - } - - /* Unlock the global from OS_ObjectIdGetAndLock() */ - OS_Unlock_Global(LOCAL_OBJID_TYPE); + /* Use the abstracted priority, not the OS one */ + /* Change the priority in the table as well */ + OS_task_table[local_id].priority = new_priority; } + + /* Unlock the global from OS_ObjectIdGetAndLock() */ + OS_Unlock_Global(LOCAL_OBJID_TYPE); } return return_code; @@ -374,7 +361,7 @@ int32 OS_TaskSetPriority(osal_id_t task_id, uint32 new_priority) int32 OS_TaskRegister(void) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; /* * Just to retain compatibility (really, only the unit test cares) @@ -394,7 +381,7 @@ int32 OS_TaskRegister(void) osal_id_t OS_TaskGetId(void) { OS_common_record_t *record; - uint32 local_id; + osal_index_t local_id; osal_id_t task_id; task_id = OS_TaskGetId_Impl(); @@ -444,7 +431,7 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check parameters */ if (task_prop == NULL) @@ -487,7 +474,7 @@ int32 OS_TaskInstallDeleteHandler(osal_task_entry function_pointer) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; osal_id_t task_id; task_id = OS_TaskGetId_Impl(); diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index 93b71532f..b73f4b1cb 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -94,10 +94,11 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ OS_common_record_t * record; OS_timecb_internal_record_t *local; int32 return_code; - uint32 local_id; - uint32 timebase_local_id; + osal_objtype_t objtype; + osal_index_t local_id; + osal_index_t timebase_local_id; osal_id_t cb_list; - uint32 attach_id; + osal_index_t attach_id; /* ** Check Parameters @@ -128,8 +129,8 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -313,7 +314,8 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) OS_common_record_t * record; OS_timecb_internal_record_t *local; int32 return_code; - uint32 local_id; + osal_objtype_t objtype; + osal_index_t local_id; osal_id_t dedicated_timebase_id; dedicated_timebase_id = OS_OBJECT_ID_UNDEFINED; @@ -332,8 +334,8 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -393,7 +395,8 @@ int32 OS_TimerDelete(osal_id_t timer_id) OS_common_record_t * record; OS_common_record_t * timebase = NULL; int32 return_code; - uint32 local_id; + osal_objtype_t objtype; + osal_index_t local_id; osal_id_t dedicated_timebase_id; dedicated_timebase_id = OS_OBJECT_ID_UNDEFINED; @@ -402,8 +405,8 @@ int32 OS_TimerDelete(osal_id_t timer_id) * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -483,8 +486,8 @@ int32 OS_TimerDelete(osal_id_t timer_id) *-----------------------------------------------------------------*/ int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name) { - int32 return_code; - uint32 local_id; + int32 return_code; + osal_objtype_t objtype; if (timer_id == NULL || timer_name == NULL) { @@ -495,8 +498,8 @@ int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name) * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -518,7 +521,8 @@ int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; + osal_objtype_t objtype; /* Check parameters */ if (timer_prop == NULL) @@ -530,8 +534,8 @@ int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop) * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index e881954b7..17b2a67f1 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -100,7 +100,8 @@ int32 OS_TimeBaseCreate(osal_id_t *timer_id, const char *timebase_name, OS_Timer { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_objtype_t objtype; + osal_index_t local_id; /* * Specifying a NULL sync function means the timebase is not externally synchronized. @@ -128,8 +129,8 @@ int32 OS_TimeBaseCreate(osal_id_t *timer_id, const char *timebase_name, OS_Timer * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -175,7 +176,8 @@ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_objtype_t objtype; + osal_index_t local_id; /* * Internally the implementation represents the interval as a @@ -194,8 +196,8 @@ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -235,14 +237,15 @@ int32 OS_TimeBaseDelete(osal_id_t timer_id) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_objtype_t objtype; + osal_index_t local_id; /* * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -269,8 +272,8 @@ int32 OS_TimeBaseDelete(osal_id_t timer_id) *-----------------------------------------------------------------*/ int32 OS_TimeBaseGetIdByName(osal_id_t *timer_id, const char *timebase_name) { - int32 return_code; - uint32 local_id; + int32 return_code; + osal_objtype_t objtype; if (timer_id == NULL || timebase_name == NULL) { @@ -281,8 +284,8 @@ int32 OS_TimeBaseGetIdByName(osal_id_t *timer_id, const char *timebase_name) * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -304,7 +307,8 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_objtype_t objtype; + osal_index_t local_id; /* Check parameters */ if (timebase_prop == NULL) @@ -316,8 +320,8 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro * Check our context. Not allowed to use the timer API from a timer callback. * Just interested in the object type returned. */ - local_id = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); - if (local_id == OS_OBJECT_TYPE_OS_TIMEBASE) + objtype = OS_ObjectIdToType_Impl(OS_TaskGetId_Impl()); + if (objtype == OS_OBJECT_TYPE_OS_TIMEBASE) { return OS_ERR_INCORRECT_OBJ_STATE; } @@ -353,7 +357,7 @@ int32 OS_TimeBaseGetFreeRun(osal_id_t timebase_id, uint32 *freerun_val) { OS_common_record_t *record; int32 return_code; - uint32 local_id; + osal_index_t local_id; /* Check parameters */ return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, timebase_id, &local_id, &record); @@ -390,9 +394,9 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) OS_timebase_internal_record_t *timebase; OS_timecb_internal_record_t * timecb; OS_common_record_t * record; - uint32 local_id; - uint32 timer_id; - uint32 curr_cb_local_id; + osal_index_t local_id; + osal_index_t timer_id; + osal_index_t curr_cb_local_id; osal_id_t curr_cb_public_id; uint32 tick_time; uint32 spin_cycles; diff --git a/src/os/vxworks/inc/os-impl-io.h b/src/os/vxworks/inc/os-impl-io.h index 0bf73c3bc..04034d807 100644 --- a/src/os/vxworks/inc/os-impl-io.h +++ b/src/os/vxworks/inc/os-impl-io.h @@ -38,7 +38,7 @@ typedef struct { int fd; bool selectable; -} OS_VxWorks_filehandle_entry_t; +} OS_impl_file_internal_record_t; /* * The global file handle table. @@ -46,7 +46,7 @@ typedef struct * This table is shared across multiple units (files, sockets, etc) and they will share * the same file handle table from the basic file I/O. */ -extern OS_VxWorks_filehandle_entry_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; +extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; /* * VxWorks needs to cast the argument to "write()" to avoid a warning. diff --git a/src/os/vxworks/inc/os-impl-symtab.h b/src/os/vxworks/inc/os-impl-symtab.h index 373d9b60c..9f0caa46c 100644 --- a/src/os/vxworks/inc/os-impl-symtab.h +++ b/src/os/vxworks/inc/os-impl-symtab.h @@ -33,8 +33,8 @@ typedef struct { - uint32 Sizelimit; - uint32 CurrSize; + size_t Sizelimit; + size_t CurrSize; int32 StatusCode; int fd; } SymbolDumpState_t; diff --git a/src/os/vxworks/inc/os-vxworks.h b/src/os/vxworks/inc/os-vxworks.h index 9b993db96..997a12aaa 100644 --- a/src/os/vxworks/inc/os-vxworks.h +++ b/src/os/vxworks/inc/os-vxworks.h @@ -92,14 +92,14 @@ int32 OS_VxWorks_DirAPI_Impl_Init(void); int OS_VxWorks_TaskEntry(int arg); int OS_VxWorks_ConsoleTask_Entry(int arg); -uint32 OS_VxWorks_SigWait(uint32 local_id); +uint32 OS_VxWorks_SigWait(osal_index_t local_id); int OS_VxWorks_TimeBaseTask(int arg); -void OS_VxWorks_RegisterTimer(uint32 local_id); +void OS_VxWorks_RegisterTimer(osal_index_t local_id); void OS_VxWorks_UsecToTimespec(uint32 usecs, struct timespec *time_spec); int32 OS_VxWorks_GenericSemTake(SEM_ID vxid, int sys_ticks); int32 OS_VxWorks_GenericSemGive(SEM_ID vxid); -int32 OS_VxWorks_TableMutex_Init(uint32 idtype); +int32 OS_VxWorks_TableMutex_Init(osal_objtype_t idtype); #endif /* INCLUDE_OS_VXWORKS_H_ */ diff --git a/src/os/vxworks/src/os-impl-binsem.c b/src/os/vxworks/src/os-impl-binsem.c index c2c0c4e96..0f90efd2b 100644 --- a/src/os/vxworks/src/os-impl-binsem.c +++ b/src/os/vxworks/src/os-impl-binsem.c @@ -70,7 +70,7 @@ int32 OS_VxWorks_BinSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) { SEM_ID tmp_sem_id; @@ -98,7 +98,7 @@ int32 OS_BinSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 optio * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(uint32 sem_id) +int32 OS_BinSemDelete_Impl(osal_index_t sem_id) { /* * As the memory for the sem is statically allocated, delete is a no-op. @@ -116,7 +116,7 @@ int32 OS_BinSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(uint32 sem_id) +int32 OS_BinSemGive_Impl(osal_index_t sem_id) { /* Use common routine */ return OS_VxWorks_GenericSemGive(OS_impl_bin_sem_table[sem_id].vxid); @@ -130,7 +130,7 @@ int32 OS_BinSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(uint32 sem_id) +int32 OS_BinSemFlush_Impl(osal_index_t sem_id) { /* Flush VxWorks Semaphore */ if (semFlush(OS_impl_bin_sem_table[sem_id].vxid) != OK) @@ -150,7 +150,7 @@ int32 OS_BinSemFlush_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(uint32 sem_id) +int32 OS_BinSemTake_Impl(osal_index_t sem_id) { /* Use common routine */ return OS_VxWorks_GenericSemTake(OS_impl_bin_sem_table[sem_id].vxid, WAIT_FOREVER); @@ -165,7 +165,7 @@ int32 OS_BinSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs) +int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) { int ticks; int32 status; @@ -188,7 +188,7 @@ int32 OS_BinSemTimedWait_Impl(uint32 sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(uint32 sem_id, OS_bin_sem_prop_t *bin_prop) +int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop) { /* VxWorks has no API for obtaining the current value of a semaphore */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-common.c b/src/os/vxworks/src/os-impl-common.c index 6c3dc4aa8..beed30470 100644 --- a/src/os/vxworks/src/os-impl-common.c +++ b/src/os/vxworks/src/os-impl-common.c @@ -60,7 +60,7 @@ static TASK_ID OS_idle_task_id; * about objects * *-----------------------------------------------------------------*/ -int32 OS_API_Impl_Init(uint32 idtype) +int32 OS_API_Impl_Init(osal_objtype_t idtype) { int32 return_code; diff --git a/src/os/vxworks/src/os-impl-console.c b/src/os/vxworks/src/os-impl-console.c index 52f82aa64..7accef4bb 100644 --- a/src/os/vxworks/src/os-impl-console.c +++ b/src/os/vxworks/src/os-impl-console.c @@ -66,7 +66,7 @@ OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(uint32 local_id) +void OS_ConsoleWakeup_Impl(osal_index_t local_id) { OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; @@ -94,7 +94,7 @@ void OS_ConsoleWakeup_Impl(uint32 local_id) *-----------------------------------------------------------------*/ int OS_VxWorks_ConsoleTask_Entry(int arg) { - uint32 local_id = arg; + osal_index_t local_id = OSAL_INDEX_C(arg); OS_impl_console_internal_record_t *local; local = &OS_impl_console_table[local_id]; @@ -119,7 +119,7 @@ int OS_VxWorks_ConsoleTask_Entry(int arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(uint32 local_id) +int32 OS_ConsoleCreate_Impl(osal_index_t local_id) { OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; int32 return_code; diff --git a/src/os/vxworks/src/os-impl-countsem.c b/src/os/vxworks/src/os-impl-countsem.c index c22f847d4..41cff591d 100644 --- a/src/os/vxworks/src/os-impl-countsem.c +++ b/src/os/vxworks/src/os-impl-countsem.c @@ -69,7 +69,7 @@ int32 OS_VxWorks_CountSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) { SEM_ID tmp_sem_id; @@ -97,7 +97,7 @@ int32 OS_CountSemCreate_Impl(uint32 sem_id, uint32 sem_initial_value, uint32 opt * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(uint32 sem_id) +int32 OS_CountSemDelete_Impl(osal_index_t sem_id) { /* * As the memory for the sem is statically allocated, delete is a no-op. @@ -115,7 +115,7 @@ int32 OS_CountSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(uint32 sem_id) +int32 OS_CountSemGive_Impl(osal_index_t sem_id) { /* Give VxWorks Semaphore */ return OS_VxWorks_GenericSemGive(OS_impl_count_sem_table[sem_id].vxid); @@ -129,7 +129,7 @@ int32 OS_CountSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(uint32 sem_id) +int32 OS_CountSemTake_Impl(osal_index_t sem_id) { return OS_VxWorks_GenericSemTake(OS_impl_count_sem_table[sem_id].vxid, WAIT_FOREVER); } /* end OS_CountSemTake_Impl */ @@ -142,7 +142,7 @@ int32 OS_CountSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs) +int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) { int ticks; int32 status; @@ -165,7 +165,7 @@ int32 OS_CountSemTimedWait_Impl(uint32 sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(uint32 sem_id, OS_count_sem_prop_t *count_prop) +int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop) { /* VxWorks does not provide an API to get the value */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-dirs.c b/src/os/vxworks/src/os-impl-dirs.c index 9e6cff52f..513b8b878 100644 --- a/src/os/vxworks/src/os-impl-dirs.c +++ b/src/os/vxworks/src/os-impl-dirs.c @@ -83,7 +83,7 @@ int32 OS_DirCreate_Impl(const char *local_path, uint32 access) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) +int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path) { OS_impl_dir_table[local_id].dp = opendir(local_path); if (OS_impl_dir_table[local_id].dp == NULL) @@ -101,7 +101,7 @@ int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirClose_Impl(uint32 local_id) +int32 OS_DirClose_Impl(osal_index_t local_id) { closedir(OS_impl_dir_table[local_id].dp); OS_impl_dir_table[local_id].dp = NULL; @@ -116,7 +116,7 @@ int32 OS_DirClose_Impl(uint32 local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent) +int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) { struct dirent *de; @@ -149,7 +149,7 @@ int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRewind_Impl(uint32 local_id) +int32 OS_DirRewind_Impl(osal_index_t local_id) { rewinddir(OS_impl_dir_table[local_id].dp); return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-files.c b/src/os/vxworks/src/os-impl-files.c index cb024ebd1..c839fe469 100644 --- a/src/os/vxworks/src/os-impl-files.c +++ b/src/os/vxworks/src/os-impl-files.c @@ -38,7 +38,7 @@ * * This is shared by all OSAL entities that perform low-level I/O. */ -OS_VxWorks_filehandle_entry_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; +OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; /*---------------------------------------------------------------- * @@ -49,7 +49,7 @@ OS_VxWorks_filehandle_entry_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; *-----------------------------------------------------------------*/ int32 OS_VxWorks_StreamAPI_Impl_Init(void) { - uint32 local_id; + osal_index_t local_id; /* * init all filehandles to -1, which is always invalid. diff --git a/src/os/vxworks/src/os-impl-filesys.c b/src/os/vxworks/src/os-impl-filesys.c index 1a3a3ff32..2876348e4 100644 --- a/src/os/vxworks/src/os-impl-filesys.c +++ b/src/os/vxworks/src/os-impl-filesys.c @@ -76,7 +76,7 @@ OS_impl_filesys_internal_record_t OS_impl_filesys_table[OS_MAX_FILE_SYSTEMS]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(uint32 filesys_id) +int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; @@ -192,7 +192,7 @@ int32 OS_FileSysStartVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(uint32 filesys_id) +int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; @@ -231,7 +231,7 @@ int32 OS_FileSysStopVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id) +int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; int32 return_code = OS_ERR_NOT_IMPLEMENTED; @@ -282,7 +282,7 @@ int32 OS_FileSysFormatVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(uint32 filesys_id) +int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; int32 status; @@ -315,7 +315,7 @@ int32 OS_FileSysMountVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id) +int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; int32 status; @@ -355,7 +355,7 @@ int32 OS_FileSysUnmountVolume_Impl(uint32 filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; struct statfs stat_buf; @@ -368,9 +368,9 @@ int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) } else { - result->block_size = stat_buf.f_bsize; - result->blocks_free = stat_buf.f_bfree; - result->total_blocks = stat_buf.f_blocks; + result->block_size = OSAL_SIZE_C(stat_buf.f_bsize); + result->blocks_free = OSAL_BLOCKCOUNT_C(stat_buf.f_bfree); + result->total_blocks = OSAL_BLOCKCOUNT_C(stat_buf.f_blocks); return_code = OS_SUCCESS; } @@ -386,7 +386,7 @@ int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(uint32 filesys_id, bool repair) +int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair) { OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; STATUS chk_status; diff --git a/src/os/vxworks/src/os-impl-heap.c b/src/os/vxworks/src/os-impl-heap.c index fb46f0780..8931130c0 100644 --- a/src/os/vxworks/src/os-impl-heap.c +++ b/src/os/vxworks/src/os-impl-heap.c @@ -57,9 +57,9 @@ int32 OS_HeapGetInfo_Impl(OS_heap_prop_t *heap_prop) return OS_ERROR; } - heap_prop->free_bytes = stats.numBytesFree; - heap_prop->free_blocks = stats.numBlocksFree; - heap_prop->largest_free_block = stats.maxBlockSizeFree; + heap_prop->free_bytes = OSAL_SIZE_C(stats.numBytesFree); + heap_prop->free_blocks = OSAL_BLOCKCOUNT_C(stats.numBlocksFree); + heap_prop->largest_free_block = OSAL_SIZE_C(stats.maxBlockSizeFree); return (OS_SUCCESS); } /* end OS_HeapGetInfo_Impl */ diff --git a/src/os/vxworks/src/os-impl-idmap.c b/src/os/vxworks/src/os-impl-idmap.c index 41752a387..4ec8d728d 100644 --- a/src/os/vxworks/src/os-impl-idmap.c +++ b/src/os/vxworks/src/os-impl-idmap.c @@ -86,7 +86,7 @@ enum * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(uint32 idtype) +int32 OS_Lock_Global_Impl(osal_objtype_t idtype) { VxWorks_GlobalMutex_t *mut; @@ -118,7 +118,7 @@ int32 OS_Lock_Global_Impl(uint32 idtype) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(uint32 idtype) +int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) { VxWorks_GlobalMutex_t *mut; @@ -154,7 +154,7 @@ int32 OS_Unlock_Global_Impl(uint32 idtype) * about objects * *-----------------------------------------------------------------*/ -int32 OS_VxWorks_TableMutex_Init(uint32 idtype) +int32 OS_VxWorks_TableMutex_Init(osal_objtype_t idtype) { int32 return_code = OS_SUCCESS; SEM_ID semid; diff --git a/src/os/vxworks/src/os-impl-loader.c b/src/os/vxworks/src/os-impl-loader.c index 7ab65fae6..ba9a607c2 100644 --- a/src/os/vxworks/src/os-impl-loader.c +++ b/src/os/vxworks/src/os-impl-loader.c @@ -71,7 +71,7 @@ int32 OS_VxWorks_ModuleAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(uint32 local_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(osal_index_t local_id, const char *translated_path) { int32 return_code; int fd; @@ -126,7 +126,7 @@ int32 OS_ModuleLoad_Impl(uint32 local_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(uint32 local_id) +int32 OS_ModuleUnload_Impl(osal_index_t local_id) { STATUS vxStatus; @@ -152,7 +152,7 @@ int32 OS_ModuleUnload_Impl(uint32 local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(uint32 local_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(osal_index_t local_id, OS_module_prop_t *module_prop) { MODULE_INFO vxModuleInfo; STATUS vxStatus; diff --git a/src/os/vxworks/src/os-impl-mutex.c b/src/os/vxworks/src/os-impl-mutex.c index 54273f14e..72e09afe5 100644 --- a/src/os/vxworks/src/os-impl-mutex.c +++ b/src/os/vxworks/src/os-impl-mutex.c @@ -67,7 +67,7 @@ int32 OS_VxWorks_MutexAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options) +int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) { SEM_ID tmp_sem_id; @@ -93,7 +93,7 @@ int32 OS_MutSemCreate_Impl(uint32 sem_id, uint32 options) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(uint32 sem_id) +int32 OS_MutSemDelete_Impl(osal_index_t sem_id) { /* * As the memory for the sem is statically allocated, delete is a no-op. @@ -111,7 +111,7 @@ int32 OS_MutSemDelete_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(uint32 sem_id) +int32 OS_MutSemGive_Impl(osal_index_t sem_id) { /* Give VxWorks Semaphore */ return OS_VxWorks_GenericSemGive(OS_impl_mutex_table[sem_id].vxid); @@ -125,7 +125,7 @@ int32 OS_MutSemGive_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(uint32 sem_id) +int32 OS_MutSemTake_Impl(osal_index_t sem_id) { /* Take VxWorks Semaphore */ return OS_VxWorks_GenericSemTake(OS_impl_mutex_table[sem_id].vxid, WAIT_FOREVER); @@ -139,7 +139,7 @@ int32 OS_MutSemTake_Impl(uint32 sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(uint32 sem_id, OS_mut_sem_prop_t *mut_prop) +int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop) { /* VxWorks provides no additional info */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-network.c b/src/os/vxworks/src/os-impl-network.c index 63c526be6..6180c1439 100644 --- a/src/os/vxworks/src/os-impl-network.c +++ b/src/os/vxworks/src/os-impl-network.c @@ -43,7 +43,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_NetworkGetHostName_Impl(char *host_name, uint32 name_len) +int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len) { int32 return_code; diff --git a/src/os/vxworks/src/os-impl-queues.c b/src/os/vxworks/src/os-impl-queues.c index 319d5e1dd..bbc95b175 100644 --- a/src/os/vxworks/src/os-impl-queues.c +++ b/src/os/vxworks/src/os-impl-queues.c @@ -63,7 +63,7 @@ int32 OS_VxWorks_QueueAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags) +int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) { MSG_Q_ID tmp_msgq_id; int queue_depth = OS_queue_table[queue_id].max_depth; /* maximum number of messages in queue (queue depth) */ @@ -92,7 +92,7 @@ int32 OS_QueueCreate_Impl(uint32 queue_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(uint32 queue_id) +int32 OS_QueueDelete_Impl(osal_index_t queue_id) { /* Try to delete the queue */ if (msgQDelete(OS_impl_queue_table[queue_id].vxid) != OK) @@ -114,7 +114,7 @@ int32 OS_QueueDelete_Impl(uint32 queue_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) +int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout) { int32 return_code; STATUS status; @@ -159,7 +159,7 @@ int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_co } else { - *size_copied = status; + *size_copied = OSAL_SIZE_C(status); return_code = OS_SUCCESS; } @@ -174,7 +174,7 @@ int32 OS_QueueGet_Impl(uint32 queue_id, void *data, uint32 size, uint32 *size_co * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(uint32 queue_id, const void *data, uint32 size, uint32 flags) +int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uint32 flags) { int32 return_code; @@ -204,7 +204,7 @@ int32 OS_QueuePut_Impl(uint32 queue_id, const void *data, uint32 size, uint32 fl * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGetInfo_Impl(uint32 queue_id, OS_queue_prop_t *queue_prop) +int32 OS_QueueGetInfo_Impl(osal_index_t queue_id, OS_queue_prop_t *queue_prop) { /* No extra info for queues in the OS implementation */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-shell.c b/src/os/vxworks/src/os-impl-shell.c index a43fce496..2b942a41d 100644 --- a/src/os/vxworks/src/os-impl-shell.c +++ b/src/os/vxworks/src/os-impl-shell.c @@ -52,13 +52,13 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(uint32 file_id, const char *Cmd) +int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) { - int32 ReturnCode = OS_ERROR; - int32 Result; - osal_id_t fdCmd; - uint32 cmdidx; - char * shellName; + int32 ReturnCode = OS_ERROR; + int32 Result; + osal_id_t fdCmd; + osal_index_t cmdidx; + char * shellName; /* Create a file to write the command to (or write over the old one) */ Result = diff --git a/src/os/vxworks/src/os-impl-symtab.c b/src/os/vxworks/src/os-impl-symtab.c index 31b2db5c4..be689df95 100644 --- a/src/os/vxworks/src/os-impl-symtab.c +++ b/src/os/vxworks/src/os-impl-symtab.c @@ -128,7 +128,7 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_ModuleSymbolLookup_Impl(osal_index_t local_id, cpuaddr *SymbolAddress, const char *SymbolName) { /* * NOTE: this is currently exactly the same as OS_GlobalSymbolLookup_Impl(). @@ -165,7 +165,7 @@ int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const BOOL OS_SymTableIterator_Impl(char *name, SYM_VALUE val, SYM_TYPE type, _Vx_usr_arg_t arg, SYM_GROUP group) { SymbolRecord_t symRecord; - uint32 NextSize; + size_t NextSize; int status; SymbolDumpState_t *state; @@ -234,7 +234,7 @@ BOOL OS_SymTableIterator_Impl(char *name, SYM_VALUE val, SYM_TYPE type, _Vx_usr_ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SymbolTableDump_Impl(const char *local_filename, uint32 SizeLimit) +int32 OS_SymbolTableDump_Impl(const char *filename, size_t size_limit) { SymbolDumpState_t *state; @@ -245,15 +245,15 @@ int32 OS_SymbolTableDump_Impl(const char *local_filename, uint32 SizeLimit) state = &OS_VxWorks_SymbolDumpState; memset(state, 0, sizeof(*state)); - state->Sizelimit = SizeLimit; + state->Sizelimit = size_limit; /* ** Open file */ - state->fd = open(local_filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); + state->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (state->fd < 0) { - OS_DEBUG("open(%s): error: %s\n", local_filename, strerror(errno)); + OS_DEBUG("open(%s): error: %s\n", filename, strerror(errno)); state->StatusCode = OS_ERROR; } else diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index fac9ae90e..22d65332e 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -117,7 +117,7 @@ int32 OS_VxWorks_TaskAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) +int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) { STATUS status; int vxflags; @@ -268,7 +268,7 @@ int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(uint32 task_id) +int32 OS_TaskDelete_Impl(osal_index_t task_id) { /* ** Try to delete the task @@ -336,7 +336,7 @@ int32 OS_TaskDelay_Impl(uint32 milli_second) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(uint32 task_id, uint32 new_priority) +int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority) { /* Set VxWorks Task Priority */ if (taskPrioritySet(OS_impl_task_table[task_id].vxid, new_priority) != OK) @@ -356,7 +356,7 @@ int32 OS_TaskSetPriority_Impl(uint32 task_id, uint32 new_priority) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(uint32 task_id) +int32 OS_TaskMatch_Impl(osal_index_t task_id) { /* ** Get VxWorks Task Id @@ -393,7 +393,7 @@ int32 OS_TaskRegister_Impl(osal_id_t global_task_id) osal_id_t OS_TaskGetId_Impl(void) { OS_impl_task_internal_record_t *lrec; - size_t index; + size_t idx; osal_id_t id; id = OS_OBJECT_ID_UNDEFINED; @@ -401,10 +401,10 @@ osal_id_t OS_TaskGetId_Impl(void) if (lrec != NULL) { - index = lrec - &OS_impl_task_table[0]; - if (index < OS_MAX_TASKS) + idx = lrec - &OS_impl_task_table[0]; + if (idx < OS_MAX_TASKS) { - id = OS_global_task_table[index].active_id; + id = OS_global_task_table[idx].active_id; } } @@ -420,7 +420,7 @@ osal_id_t OS_TaskGetId_Impl(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(uint32 task_id, OS_task_prop_t *task_prop) +int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop) { return OS_SUCCESS; @@ -434,7 +434,7 @@ int32 OS_TaskGetInfo_Impl(uint32 task_id, OS_task_prop_t *task_prop) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskValidateSystemData_Impl(const void *sysdata, uint32 sysdata_size) +int32 OS_TaskValidateSystemData_Impl(const void *sysdata, size_t sysdata_size) { if (sysdata == NULL || sysdata_size != sizeof(TASK_ID)) { @@ -451,7 +451,7 @@ int32 OS_TaskValidateSystemData_Impl(const void *sysdata, uint32 sysdata_size) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { const TASK_ID *target = (const TASK_ID *)ref; diff --git a/src/os/vxworks/src/os-impl-timebase.c b/src/os/vxworks/src/os-impl-timebase.c index 28955632e..e3d159317 100644 --- a/src/os/vxworks/src/os-impl-timebase.c +++ b/src/os/vxworks/src/os-impl-timebase.c @@ -93,7 +93,7 @@ static uint32 OS_ClockAccuracyNsec; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(uint32 local_id) +void OS_TimeBaseLock_Impl(osal_index_t local_id) { semTake(OS_impl_timebase_table[local_id].handler_mutex, WAIT_FOREVER); } /* end OS_TimeBaseLock_Impl */ @@ -106,7 +106,7 @@ void OS_TimeBaseLock_Impl(uint32 local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(uint32 local_id) +void OS_TimeBaseUnlock_Impl(osal_index_t local_id) { semGive(OS_impl_timebase_table[local_id].handler_mutex); } /* end OS_TimeBaseUnlock_Impl */ @@ -140,7 +140,7 @@ void OS_VxWorks_UsecToTimespec(uint32 usecs, struct timespec *time_spec) * Blocks the calling task until the timer tick arrives * *-----------------------------------------------------------------*/ -uint32 OS_VxWorks_SigWait(uint32 local_id) +uint32 OS_VxWorks_SigWait(osal_index_t local_id) { OS_impl_timebase_internal_record_t *local; OS_common_record_t * global; @@ -204,7 +204,7 @@ uint32 OS_VxWorks_SigWait(uint32 local_id) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -void OS_VxWorks_RegisterTimer(uint32 local_id) +void OS_VxWorks_RegisterTimer(osal_index_t local_id) { OS_impl_timebase_internal_record_t *local; struct sigevent evp; @@ -253,7 +253,7 @@ void OS_VxWorks_RegisterTimer(uint32 local_id) int OS_VxWorks_TimeBaseTask(int arg) { VxWorks_ID_Buffer_t id; - uint32 local_id; + osal_index_t local_id; id.arg = arg; if (OS_ConvertToArrayIndex(id.id, &local_id) == OS_SUCCESS) @@ -323,7 +323,7 @@ int32 OS_VxWorks_TimeBaseAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(uint32 timer_id) +int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) { /* * The tick_sem is a simple semaphore posted by the ISR and taken by the @@ -334,6 +334,7 @@ int32 OS_TimeBaseCreate_Impl(uint32 timer_id) OS_common_record_t * global; int signo; sigset_t inuse; + osal_index_t idx; uint32 i; VxWorks_ID_Buffer_t idbuf; @@ -367,13 +368,13 @@ int32 OS_TimeBaseCreate_Impl(uint32 timer_id) */ sigemptyset(&inuse); - for (i = 0; i < OS_MAX_TIMEBASES; ++i) + for (idx = 0; idx < OS_MAX_TIMEBASES; ++idx) { - if (OS_ObjectIdDefined(OS_global_timebase_table[i].active_id) && - OS_impl_timebase_table[i].assigned_signal > 0) + if (OS_ObjectIdDefined(OS_global_timebase_table[idx].active_id) && + OS_impl_timebase_table[idx].assigned_signal > 0) { /* mark signal as in-use */ - sigaddset(&inuse, OS_impl_timebase_table[i].assigned_signal); + sigaddset(&inuse, OS_impl_timebase_table[idx].assigned_signal); } } @@ -500,7 +501,7 @@ int32 OS_TimeBaseCreate_Impl(uint32 timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time) +int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, int32 start_time, int32 interval_time) { OS_impl_timebase_internal_record_t *local; struct itimerspec timeout; @@ -588,7 +589,7 @@ int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(uint32 timer_id) +int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) { OS_impl_timebase_internal_record_t *local; int32 return_code; @@ -622,7 +623,7 @@ int32 OS_TimeBaseDelete_Impl(uint32 timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(uint32 timer_id, OS_timebase_prop_t *timer_prop) +int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop) { return OS_SUCCESS; diff --git a/src/tests/bin-sem-flush-test/bin-sem-flush-test.c b/src/tests/bin-sem-flush-test/bin-sem-flush-test.c index 12c6b1ac8..67bf0a553 100644 --- a/src/tests/bin-sem-flush-test/bin-sem-flush-test.c +++ b/src/tests/bin-sem-flush-test/bin-sem-flush-test.c @@ -222,13 +222,16 @@ void BinSemFlushSetup(void) /* ** Create the tasks */ - status = OS_TaskCreate(&task_1_id, "Task 1", task_1, task_1_stack, TASK_STACK_SIZE, TASK_1_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_STACKPTR_C(task_1_stack), sizeof(task_1_stack), + OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); - status = OS_TaskCreate(&task_2_id, "Task 2", task_2, task_2_stack, TASK_STACK_SIZE, TASK_2_PRIORITY, 0); + status = OS_TaskCreate(&task_2_id, "Task 2", task_2, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), + OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 2 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_2_id), (int)status); - status = OS_TaskCreate(&task_3_id, "Task 3", task_3, task_3_stack, TASK_STACK_SIZE, TASK_3_PRIORITY, 0); + status = OS_TaskCreate(&task_3_id, "Task 3", task_3, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), + OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 3 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_3_id), (int)status); /* diff --git a/src/tests/bin-sem-test/bin-sem-test.c b/src/tests/bin-sem-test/bin-sem-test.c index 0e645c6ea..4f6b6557c 100644 --- a/src/tests/bin-sem-test/bin-sem-test.c +++ b/src/tests/bin-sem-test/bin-sem-test.c @@ -224,7 +224,8 @@ void BinSemSetup(void) /* ** Create the "consumer" task. */ - status = OS_TaskCreate(&task_1_id, "Task 1", task_1, task_1_stack, TASK_1_STACK_SIZE, TASK_1_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_STACKPTR_C(task_1_stack), sizeof(task_1_stack), + OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); /* diff --git a/src/tests/bin-sem-timeout-test/bin-sem-timeout-test.c b/src/tests/bin-sem-timeout-test/bin-sem-timeout-test.c index b368f12d3..54af1b7ef 100644 --- a/src/tests/bin-sem-timeout-test/bin-sem-timeout-test.c +++ b/src/tests/bin-sem-timeout-test/bin-sem-timeout-test.c @@ -220,7 +220,8 @@ void BinSemTimeoutSetup(void) /* ** Create the "consumer" task. */ - status = OS_TaskCreate(&task_1_id, "Task 1", task_1, task_1_stack, TASK_1_STACK_SIZE, TASK_1_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_STACKPTR_C(task_1_stack), sizeof(task_1_stack), + OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); /* diff --git a/src/tests/count-sem-test/count-sem-test.c b/src/tests/count-sem-test/count-sem-test.c index 6ee4c92fb..61239a590 100644 --- a/src/tests/count-sem-test/count-sem-test.c +++ b/src/tests/count-sem-test/count-sem-test.c @@ -191,13 +191,16 @@ void CountSemSetup(void) /* ** Create the tasks */ - status = OS_TaskCreate(&task_1_id, "Task 1", task_1, task_1_stack, TASK_STACK_SIZE, TASK_1_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_STACKPTR_C(task_1_stack), sizeof(task_1_stack), + OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); - status = OS_TaskCreate(&task_2_id, "Task 2", task_2, task_2_stack, TASK_STACK_SIZE, TASK_2_PRIORITY, 0); + status = OS_TaskCreate(&task_2_id, "Task 2", task_2, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), + OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 2 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_2_id), (int)status); - status = OS_TaskCreate(&task_3_id, "Task 3", task_3, task_3_stack, TASK_STACK_SIZE, TASK_3_PRIORITY, 0); + status = OS_TaskCreate(&task_3_id, "Task 3", task_3, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), + OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 3 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_3_id), (int)status); /* diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index 8bfda6ea0..3fdb8087f 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -89,7 +89,7 @@ void TestMkfsMount(void) int32 status; /* Make the file system */ - status = OS_mkfs(0, "/ramdev0", "RAM", 512, 200); + status = OS_mkfs(0, "/ramdev0", "RAM", OSAL_SIZE_C(512), OSAL_BLOCKCOUNT_C(200)); UtAssert_True(status == OS_SUCCESS, "status after mkfs = %d", (int)status); status = OS_mount("/ramdev0", "/drive0"); @@ -249,8 +249,8 @@ void TestReadWriteLseek(void) char copyofbuffer[30]; char seekbuffer[30]; char newbuffer[30]; - int offset; - int size; + size_t offset; + size_t size; int32 status; osal_id_t fd; @@ -274,7 +274,7 @@ void TestReadWriteLseek(void) /* test write portion of R/W mode */ status = OS_write(fd, (void *)buffer, size); - UtAssert_True(status == size, "status after write = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write = %d size = %lu", (int)status, (unsigned long)size); strcpy(buffer, ""); @@ -284,7 +284,7 @@ void TestReadWriteLseek(void) /*Read what we wrote to the file */ status = OS_read(fd, (void *)buffer, size); - UtAssert_True(status == size, "status after read = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after read = %d size = %lu", (int)status, (unsigned long)size); if (status >= OS_SUCCESS) { UtAssert_True(strcmp(buffer, copyofbuffer) == 0, "Read: %s, Written: %s", buffer, copyofbuffer); @@ -305,7 +305,7 @@ void TestReadWriteLseek(void) /* try to read in READ ONLY MODE */ status = OS_read(fd, (void *)buffer, size); - UtAssert_True(status == size, "status after read = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after read = %d size = %lu", (int)status, (unsigned long)size); if (status >= OS_SUCCESS) { UtAssert_True(strcmp(buffer, copyofbuffer) == 0, "Read: %s, Written: %s", buffer, copyofbuffer); @@ -317,8 +317,9 @@ void TestReadWriteLseek(void) /* now try to read out only the last chars of the file */ - status = OS_read(fd, (void *)newbuffer, (size - offset)); - UtAssert_True(status == (size - offset), "status after read = %d size = %d", (int)status, (int)(size - offset)); + status = OS_read(fd, (void *)newbuffer, OSAL_SIZE_C(size - offset)); + UtAssert_True(status == (size - offset), "status after read = %d size = %lu", (int)status, + (unsigned long)(size - offset)); if (status >= OS_SUCCESS) { UtAssert_True(strncmp(newbuffer, seekbuffer, size - offset) == 0, "Read: %s, Written: %s", newbuffer, @@ -335,7 +336,7 @@ void TestReadWriteLseek(void) /* test write in WRITE ONLY mode */ status = OS_write(fd, (void *)buffer, size); - UtAssert_True(status == size, "status after write = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write = %d size = %lu", (int)status, (unsigned long)size); /* try to read in WRITE ONLY MODE */ status = OS_read(fd, (void *)buffer, size); @@ -346,7 +347,7 @@ void TestReadWriteLseek(void) UtAssert_True(status >= OS_SUCCESS, "status after lseek = %d", (int)status); /* now try to read out only the last chars of the file */ - status = OS_read(fd, (void *)newbuffer, (size - offset)); + status = OS_read(fd, (void *)newbuffer, OSAL_SIZE_C(size - offset)); UtAssert_True(status < OS_SUCCESS, "status after read = %d", (int)status); /* close the file */ @@ -374,7 +375,7 @@ void TestMkRmDirFreeBytes(void) char copybuffer2[OS_MAX_PATH_LEN]; osal_id_t fd1; osal_id_t fd2; - int size; + size_t size; /* make the directory names for testing, as well as the filenames and the buffers * to put in the files */ @@ -410,11 +411,11 @@ void TestMkRmDirFreeBytes(void) /* write the propper buffers into each of the files */ size = strlen(buffer1); status = OS_write(fd1, buffer1, size); - UtAssert_True(status == size, "status after write 1 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write 1 = %d size = %lu", (int)status, (unsigned long)size); size = strlen(buffer2); status = OS_write(fd2, buffer2, size); - UtAssert_True(status == size, "status after write 2 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write 2 = %d size = %lu", (int)status, (unsigned long)size); /* lseek back to the beginning of the file */ status = OS_lseek(fd1, 0, 0); @@ -431,7 +432,7 @@ void TestMkRmDirFreeBytes(void) /* read back out of the files what we wrote into them */ size = strlen(copybuffer1); status = OS_read(fd1, (void *)buffer1, size); - UtAssert_True(status == size, "status after read 1 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after read 1 = %d size = %lu", (int)status, (unsigned long)size); if (status >= OS_SUCCESS) { UtAssert_True(strncmp(buffer1, copybuffer1, size) == 0, "Read: %s, Written: %s", buffer1, copybuffer1); @@ -439,7 +440,7 @@ void TestMkRmDirFreeBytes(void) size = strlen(copybuffer2); status = OS_read(fd2, (void *)buffer2, size); - UtAssert_True(status == size, "status after read 2 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after read 2 = %d size = %lu", (int)status, (unsigned long)size); if (status >= OS_SUCCESS) { UtAssert_True(strncmp(buffer2, copybuffer2, size) == 0, "Read: %s, Written: %s", buffer1, copybuffer1); @@ -481,7 +482,7 @@ void TestOpenReadCloseDir(void) char dir2[OS_MAX_PATH_LEN]; char buffer1[OS_MAX_PATH_LEN]; char buffer2[OS_MAX_PATH_LEN]; - int size; + size_t size; osal_id_t fd1; osal_id_t fd2; osal_id_t dirh; @@ -516,11 +517,11 @@ void TestOpenReadCloseDir(void) /* write the proper buffers into each of the files */ size = strlen(buffer1); status = OS_write(fd1, buffer1, size); - UtAssert_True(status == size, "status after write 1 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write 1 = %d size = %lu", (int)status, (unsigned long)size); size = strlen(buffer2); status = OS_write(fd2, buffer2, size); - UtAssert_True(status == size, "status after write 2 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write 2 = %d size = %lu", (int)status, (unsigned long)size); /* close the files */ @@ -690,7 +691,7 @@ void TestRename(void) char newfilename1[OS_MAX_PATH_LEN]; osal_id_t fd1; - int size; + size_t size; /* make the directory names for testing, as well as the filenames and the buffers * to put in the files */ @@ -719,7 +720,7 @@ void TestRename(void) size = strlen(buffer1); status = OS_write(fd1, buffer1, size); - UtAssert_True(status == size, "status after write 1 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write 1 = %d size = %lu", (int)status, (unsigned long)size); /* close the file */ @@ -745,7 +746,7 @@ void TestRename(void) size = strlen(copybuffer1); status = OS_read(fd1, buffer1, size); - UtAssert_True(status == size, "status after read 1 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after read 1 = %d size = %lu", (int)status, (unsigned long)size); if (status >= OS_SUCCESS) { UtAssert_True(strncmp(buffer1, copybuffer1, size) == 0, "Read and Written Results are equal"); @@ -775,7 +776,7 @@ void TestStat(void) char buffer1[OS_MAX_PATH_LEN]; os_fstat_t StatBuff; osal_id_t fd1; - int size; + size_t size; strcpy(dir1, "/drive0/DirectoryName"); strcpy(dir1slash, dir1); @@ -795,7 +796,7 @@ void TestStat(void) size = strlen(buffer1); status = OS_write(fd1, buffer1, size); - UtAssert_True(status == size, "status after write 1 = %d size = %d", (int)status, (int)size); + UtAssert_True(status == size, "status after write 1 = %d size = %lu", (int)status, (unsigned long)size); status = OS_close(fd1); UtAssert_True(status == OS_SUCCESS, "status after close 1 = %d", (int)status); diff --git a/src/tests/idmap-api-test/idmap-api-test.c b/src/tests/idmap-api-test/idmap-api-test.c index c91aec89c..3a9ab8327 100644 --- a/src/tests/idmap-api-test/idmap-api-test.c +++ b/src/tests/idmap-api-test/idmap-api-test.c @@ -109,9 +109,10 @@ void TestIdMapApi_Setup(void) /* * Create all allowed objects */ - status = OS_TaskCreate(&task_id, "Task", Test_Void_Fn, NULL, 4096, 50, 0); + status = OS_TaskCreate(&task_id, "Task", Test_Void_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(4096), + OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); - status = OS_QueueCreate(&queue_id, "Queue", 5, 5, 0); + status = OS_QueueCreate(&queue_id, "Queue", OSAL_BLOCKCOUNT_C(5), OSAL_SIZE_C(5), 0); UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate() (%ld) == OS_SUCCESS", (long)status); status = OS_CountSemCreate(&count_sem_id, "CountSem", 1, 0); UtAssert_True(status == OS_SUCCESS, "OS_CountSemCreate() (%ld) == OS_SUCCESS", (long)status); @@ -141,9 +142,9 @@ void TestIdMapApi(void) { int32 expected; int32 actual; - uint32 TestArrayIndex; - uint32 TestMutex1Index; - uint32 TestMutex2Index; + osal_index_t TestArrayIndex; + osal_index_t TestMutex1Index; + osal_index_t TestMutex2Index; osal_id_t badid; Test_OS_ObjTypeCount_t Count; diff --git a/src/tests/mutex-test/mutex-test.c b/src/tests/mutex-test/mutex-test.c index 67baef8e7..dbe69950d 100644 --- a/src/tests/mutex-test/mutex-test.c +++ b/src/tests/mutex-test/mutex-test.c @@ -259,13 +259,16 @@ void MutexSetup(void) /* ** Create the tasks */ - status = OS_TaskCreate(&task_1_id, "Task 1", task_1, task_1_stack, TASK_STACK_SIZE, TASK_1_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_STACKPTR_C(task_1_stack), sizeof(task_1_stack), + OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); - status = OS_TaskCreate(&task_2_id, "Task 2", task_2, task_2_stack, TASK_STACK_SIZE, TASK_2_PRIORITY, 0); + status = OS_TaskCreate(&task_2_id, "Task 2", task_2, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), + OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 2 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_2_id), (int)status); - status = OS_TaskCreate(&task_3_id, "Task 3", task_3, task_3_stack, TASK_STACK_SIZE, TASK_3_PRIORITY, 0); + status = OS_TaskCreate(&task_3_id, "Task 3", task_3, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), + OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 3 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_3_id), (int)status); /* diff --git a/src/tests/network-api-test/network-api-test.c b/src/tests/network-api-test/network-api-test.c index 5dfee1f34..93a275c62 100644 --- a/src/tests/network-api-test/network-api-test.c +++ b/src/tests/network-api-test/network-api-test.c @@ -266,43 +266,43 @@ void TestDatagramNetworkApi(void) /* OS_SocketSendTo */ expected = OS_INVALID_POINTER; - actual = OS_SocketSendTo(p1_socket_id, NULL, 0, NULL); + actual = OS_SocketSendTo(p1_socket_id, NULL, OSAL_SIZE_C(0), NULL); UtAssert_True(actual == expected, "OS_SocketSendTo(NULL) (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketSendTo(p1_socket_id, NULL, 1, &p2_addr); + actual = OS_SocketSendTo(p1_socket_id, NULL, OSAL_SIZE_C(1), &p2_addr); UtAssert_True(actual == expected, "OS_SocketSendTo() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_ERR_INVALID_ID; objid = OS_ObjectIdFromInteger(0xFFFFFFFF); - actual = OS_SocketSendTo(objid, &Buf1, 1, &p2_addr); + actual = OS_SocketSendTo(objid, &Buf1, sizeof(Buf1), &p2_addr); UtAssert_True(actual == expected, "OS_SocketSendTo() (%ld) == OS_ERR_INVALID_ID", (long)actual); /* OS_SocketRecvFrom */ expected = OS_INVALID_POINTER; - actual = OS_SocketRecvFrom(p2_socket_id, NULL, 1, NULL, 100); + actual = OS_SocketRecvFrom(p2_socket_id, NULL, OSAL_SIZE_C(1), NULL, 100); UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketRecvFrom(p2_socket_id, NULL, 0, NULL, 0); + actual = OS_SocketRecvFrom(p2_socket_id, NULL, OSAL_SIZE_C(0), NULL, 0); UtAssert_True(actual == expected, "OS_SocketRecvFrom(NULL) (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_ERR_INVALID_ID; objid = OS_ObjectIdFromInteger(0xFFFFFFFF); - actual = OS_SocketRecvFrom(objid, &Buf2, 1, &l_addr, 100); + actual = OS_SocketRecvFrom(objid, &Buf2, sizeof(Buf2), &l_addr, 100); UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_ERR_INVALID_ID", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketRecvFrom(p2_socket_id, &Buf2, 0, &l_addr, 100); + actual = OS_SocketRecvFrom(p2_socket_id, &Buf2, OSAL_SIZE_C(0), &l_addr, 100); UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketRecvFrom(p2_socket_id, &Buf2, 0, NULL, 100); + actual = OS_SocketRecvFrom(p2_socket_id, &Buf2, OSAL_SIZE_C(0), NULL, 100); UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_INVALID_POINTER", (long)actual); /* OS_SocketAddrToString */ expected = OS_INVALID_POINTER; - actual = OS_SocketAddrToString(NULL, 0, NULL); + actual = OS_SocketAddrToString(NULL, OSAL_SIZE_C(0), NULL); UtAssert_True(actual == expected, "OS_SocketAddrToString() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_INVALID_POINTER; @@ -310,7 +310,7 @@ void TestDatagramNetworkApi(void) UtAssert_True(actual == expected, "OS_SocketAddrToString() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketAddrToString(0, 0, &p2_addr); + actual = OS_SocketAddrToString(NULL, OSAL_SIZE_C(0), &p2_addr); UtAssert_True(actual == expected, "OS_SocketAddrToString() (%ld) == OS_INVALID_POINTER", (long)actual); /* OS_SocketAddrGetPort */ @@ -319,7 +319,7 @@ void TestDatagramNetworkApi(void) UtAssert_True(actual == expected, "OS_SocketAddrGetPort() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketAddrGetPort(0, &l_addr); + actual = OS_SocketAddrGetPort(NULL, &l_addr); UtAssert_True(actual == expected, "OS_SocketAddrGetPort() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_INVALID_POINTER; @@ -477,7 +477,8 @@ void TestStreamNetworkApi(void) */ /* Create a server task/thread */ - status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, 0, 16384, 50, 0); + status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); /* Connect to a server */ diff --git a/src/tests/osal-core-test/osal-core-test.c b/src/tests/osal-core-test/osal-core-test.c index d5c04748e..b2771cd6c 100644 --- a/src/tests/osal-core-test/osal-core-test.c +++ b/src/tests/osal-core-test/osal-core-test.c @@ -123,8 +123,9 @@ void TestTasks(void) for (tasknum = 0; tasknum < (OS_MAX_TASKS + 1); ++tasknum) { snprintf(taskname, sizeof(taskname), "Task %d", tasknum); - status = OS_TaskCreate(&TaskData[tasknum].task_id, taskname, task_generic_no_exit, TaskData[tasknum].task_stack, - TASK_0_STACK_SIZE, (250 - OS_MAX_TASKS) + tasknum, 0); + status = OS_TaskCreate(&TaskData[tasknum].task_id, taskname, task_generic_no_exit, + OSAL_STACKPTR_C(TaskData[tasknum].task_stack), sizeof(TaskData[tasknum].task_stack), + OSAL_PRIORITY_C(250 - OS_MAX_TASKS + tasknum), 0); UtDebug("Create %s Status = %d, Id = %lx\n", taskname, (int)status, OS_ObjectIdToInteger(TaskData[tasknum].task_id)); @@ -161,7 +162,8 @@ void TestTasks(void) { snprintf(taskname, sizeof(taskname), "Task %d", tasknum); status = OS_TaskCreate(&TaskData[tasknum].task_id, taskname, task_generic_with_exit, - TaskData[tasknum].task_stack, TASK_0_STACK_SIZE, (250 - OS_MAX_TASKS) + tasknum, 0); + OSAL_STACKPTR_C(TaskData[tasknum].task_stack), sizeof(TaskData[tasknum].task_stack), + OSAL_PRIORITY_C((250 - OS_MAX_TASKS) + tasknum), 0); UtDebug("Create %s Status = %d, Id = %lx\n", taskname, (int)status, OS_ObjectIdToInteger(TaskData[tasknum].task_id)); @@ -193,19 +195,23 @@ void TestTasks(void) InitializeTaskIds(); /* Create Task 0 again */ - status = OS_TaskCreate(&task_0_id, "Task 0", task_0, task_0_stack, TASK_0_STACK_SIZE, TASK_0_PRIORITY, 0); + status = OS_TaskCreate(&task_0_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); /*UtDebug("Create Status = %d, Id = %d\n",status,task_0_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 0"); /* Try and create another "Task 0", should fail as we already have one named "Task 0" */ - status = OS_TaskCreate(&task_1_id, "Task 0", task_0, task_0_stack, TASK_0_STACK_SIZE, TASK_0_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status != OS_SUCCESS, "OS_TaskCreate, dupe name 0"); - status = OS_TaskCreate(&task_2_id, "Task 2", task_2, task_2_stack, TASK_2_STACK_SIZE, TASK_2_PRIORITY, 0); + status = OS_TaskCreate(&task_2_id, "Task 2", task_2, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), + OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); /* UtDebug("Create Status = %d, Id = %d\n",status,task_2_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 2"); - status = OS_TaskCreate(&task_3_id, "Task 3", task_3, task_3_stack, TASK_3_STACK_SIZE, TASK_3_PRIORITY, 0); + status = OS_TaskCreate(&task_3_id, "Task 3", task_3, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), + OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); /* UtDebug("Create Status = %d, Id = %d\n",status,task_3_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 3"); @@ -255,7 +261,7 @@ void TestQueues(void) for (qnum = 0; qnum < (OS_MAX_QUEUES + 1); ++qnum) { snprintf(qname, sizeof(qname), "q %d", qnum); - status = OS_QueueCreate(&msgq_ids[qnum], qname, MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_ids[qnum], qname, OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); UtAssert_True((qnum < OS_MAX_QUEUES && status == OS_SUCCESS) || (qnum >= OS_MAX_QUEUES && status != OS_SUCCESS), "OS_QueueCreate, nominal"); @@ -275,20 +281,20 @@ void TestQueues(void) /* Create Some more Queues for trying to get the id by name */ InitializeQIds(); - status = OS_QueueCreate(&msgq_0, "q 0", MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_0, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); /* UtDebug("Status after Creating q 0: %d,%d\n",status,msgq_0);*/ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate, recreate 0"); /* This one should fail */ - status = OS_QueueCreate(&msgq_1, "q 0", MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_1, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); /* UtDebug("Status after Creating q 0 again: %d,%d\n",status,msgq_1); */ UtAssert_True(status != OS_SUCCESS, "OS_QueueCreate, dupe name 0"); - status = OS_QueueCreate(&msgq_2, "q 2", MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_2, "q 2", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); /* UtDebug("Status after Creating q 2: %d,%d\n",status,msgq_2); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate, recreate 2"); - status = OS_QueueCreate(&msgq_3, "q 3", MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_3, "q 3", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); /* UtDebug("Status after Creating q 3: %d,%d\n",status,msgq_3); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate, recreate 3"); @@ -613,10 +619,11 @@ void TestGetInfos(void) /* first step is to create an object to to get the properties of */ - status = OS_TaskCreate(&task_0_id, "Task 0", task_0, task_0_stack, TASK_0_STACK_SIZE, TASK_0_PRIORITY, 0); + status = OS_TaskCreate(&task_0_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate"); - status = OS_QueueCreate(&msgq_0, "q 0", MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_0, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); /* UtDebug("Status after Creating q 0: %d,%d\n",status,msgq_0); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate"); @@ -668,10 +675,11 @@ void TestGenericQueries(void) TestCallbackState_t State; char ResourceName[OS_MAX_API_NAME]; - status = OS_TaskCreate(&task_0_id, "Task 0", task_0, task_0_stack, TASK_0_STACK_SIZE, TASK_0_PRIORITY, 0); + status = OS_TaskCreate(&task_0_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate (%ld) == OS_SUCCESS", (long)status); - status = OS_QueueCreate(&msgq_0, "q 0", MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_0, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate (%ld) == OS_SUCCESS", (long)status); status = OS_BinSemCreate(&bin_0, "Bin 0", 1, 0); @@ -711,7 +719,7 @@ void TestGenericQueries(void) UtAssert_True(State.NumInvocations >= 4, "State.NumInvocations (%lu) >= 4", (unsigned long)State.NumInvocations); /* Test the OS_GetResourceName() API function */ - status = OS_GetResourceName(mut_0, ResourceName, 0); + status = OS_GetResourceName(mut_0, ResourceName, OSAL_SIZE_C(0)); UtAssert_True(status == OS_INVALID_POINTER, "OS_GetResourceName (%lx,%ld) == OS_INVALID_POINTER", OS_ObjectIdToInteger(mut_0), (long)status); @@ -724,7 +732,7 @@ void TestGenericQueries(void) UtAssert_True(status == OS_ERR_INVALID_ID, "OS_GetResourceName (%lx,%ld) == OS_ERR_INVALID_ID", OS_ObjectIdToInteger(OS_OBJECT_ID_UNDEFINED), (long)status); - status = OS_GetResourceName(bin_0, ResourceName, 1); + status = OS_GetResourceName(bin_0, ResourceName, OSAL_SIZE_C(1)); UtAssert_True(status == OS_ERR_NAME_TOO_LONG, "OS_GetResourceName (%lx,%ld) == OS_ERR_NAME_TOO_LONG", OS_ObjectIdToInteger(bin_0), (long)status); diff --git a/src/tests/queue-timeout-test/queue-timeout-test.c b/src/tests/queue-timeout-test/queue-timeout-test.c index 0e05b6d5e..e8271b51c 100644 --- a/src/tests/queue-timeout-test/queue-timeout-test.c +++ b/src/tests/queue-timeout-test/queue-timeout-test.c @@ -65,7 +65,7 @@ void task_1(void) { int32 status; uint32 data_received; - uint32 data_size; + size_t data_size; OS_printf("Starting task 1\n"); @@ -78,7 +78,7 @@ void task_1(void) while (task_1_failures < 20) { - status = OS_QueueGet(msgq_id, (void *)&data_received, MSGQ_SIZE, &data_size, 1000); + status = OS_QueueGet(msgq_id, (void *)&data_received, OSAL_SIZE_C(MSGQ_SIZE), &data_size, 1000); if (status == OS_SUCCESS) { @@ -149,13 +149,14 @@ void QueueTimeoutSetup(void) task_1_messages = 0; task_1_timeouts = 0; - status = OS_QueueCreate(&msgq_id, "MsgQ", MSGQ_DEPTH, MSGQ_SIZE, 0); + status = OS_QueueCreate(&msgq_id, "MsgQ", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); UtAssert_True(status == OS_SUCCESS, "MsgQ create Id=%lx Rc=%d", OS_ObjectIdToInteger(msgq_id), (int)status); /* ** Create the "consumer" task. */ - status = OS_TaskCreate(&task_1_id, "Task 1", task_1, task_1_stack, TASK_1_STACK_SIZE, TASK_1_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_STACKPTR_C(task_1_stack), sizeof(task_1_stack), + OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); /* diff --git a/src/tests/sem-speed-test/sem-speed-test.c b/src/tests/sem-speed-test/sem-speed-test.c index 6a9b59ca3..797ed8af7 100644 --- a/src/tests/sem-speed-test/sem-speed-test.c +++ b/src/tests/sem-speed-test/sem-speed-test.c @@ -176,10 +176,12 @@ void SemSetup(void) /* ** Create the tasks */ - status = OS_TaskCreate(&task_1_id, "Task 1", task_1, NULL, 4096, SEMTEST_TASK_PRIORITY, 0); + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(4096), + OSAL_PRIORITY_C(SEMTEST_TASK_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); - status = OS_TaskCreate(&task_2_id, "Task 2", task_2, NULL, 4096, SEMTEST_TASK_PRIORITY, 0); + status = OS_TaskCreate(&task_2_id, "Task 2", task_2, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(4096), + OSAL_PRIORITY_C(SEMTEST_TASK_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Task 2 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_2_id), (int)status); /* A small delay just to allow the tasks diff --git a/src/tests/time-base-api-test/time-base-api-test.c b/src/tests/time-base-api-test/time-base-api-test.c index 95ff39e73..4a589a845 100644 --- a/src/tests/time-base-api-test/time-base-api-test.c +++ b/src/tests/time-base-api-test/time-base-api-test.c @@ -35,7 +35,7 @@ #include "uttest.h" #include "utbsp.h" -static uint32 UT_TimerSync(uint32 timer_id) +static uint32 UT_TimerSync(osal_index_t timer_id) { OS_TaskDelay(1); return 1; diff --git a/src/tests/timer-test/timer-test.c b/src/tests/timer-test/timer-test.c index 83a58d923..9d2e82fc3 100644 --- a/src/tests/timer-test/timer-test.c +++ b/src/tests/timer-test/timer-test.c @@ -59,9 +59,9 @@ uint32 timer_idlookup[OS_MAX_TIMERS]; */ void test_func(osal_id_t timer_id) { - uint32 indx; - OS_ConvertToArrayIndex(timer_id, &indx); - timer_counter[timer_idlookup[indx]]++; + osal_index_t idx; + OS_ConvertToArrayIndex(timer_id, &idx); + timer_counter[timer_idlookup[idx]]++; } /* ********************** MAIN **************************** */ @@ -89,8 +89,8 @@ void TimerTestSetup(void) * In the new versions of OSAL, timers do NOT work in the "main" thread, * so we must create a task to handle them. */ - status = OS_TaskCreate(&TimerTestTaskId, "Task 1", TimerTestTask, TimerTestTaskStack, TASK_1_STACK_SIZE, - TASK_1_PRIORITY, 0); + status = OS_TaskCreate(&TimerTestTaskId, "Task 1", TimerTestTask, OSAL_STACKPTR_C(TimerTestTaskStack), + sizeof(TimerTestTaskStack), OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "Timer Test Task Created RC=%d", (int)status); /* @@ -111,12 +111,12 @@ void TimerTestSetup(void) void TimerTestTask(void) { - int i = 0; - int32 TimerStatus[NUMBER_OF_TIMERS]; - uint32 TableId; - osal_id_t TimerID[NUMBER_OF_TIMERS]; - char TimerName[NUMBER_OF_TIMERS][20] = {"TIMER1", "TIMER2", "TIMER3", "TIMER4"}; - uint32 ClockAccuracy; + int i = 0; + int32 TimerStatus[NUMBER_OF_TIMERS]; + osal_index_t TableId; + osal_id_t TimerID[NUMBER_OF_TIMERS]; + char TimerName[NUMBER_OF_TIMERS][20] = {"TIMER1", "TIMER2", "TIMER3", "TIMER4"}; + uint32 ClockAccuracy; for (i = 0; i < NUMBER_OF_TIMERS && i < OS_MAX_TIMERS; i++) { diff --git a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h index 98f4377b5..1ec92754d 100644 --- a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h +++ b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h @@ -48,7 +48,7 @@ * but are not exposed directly through the implementation API. * *****************************************************/ -void UT_PortablePosixIOTest_Set_Selectable(uint32 local_id, bool is_selectable); +void UT_PortablePosixIOTest_Set_Selectable(osal_index_t local_id, bool is_selectable); #endif /* _UT_OSFILEAPI_H_ */ diff --git a/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-io.c b/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-io.c index 0f54a9677..dea9b84d5 100644 --- a/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-io.c +++ b/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-io.c @@ -31,7 +31,7 @@ #include -void UT_PortablePosixIOTest_Set_Selectable(uint32 local_id, bool is_selectable) +void UT_PortablePosixIOTest_Set_Selectable(osal_index_t local_id, bool is_selectable) { OS_impl_filehandle_table[local_id].selectable = is_selectable; } diff --git a/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c b/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c index 5c0c90acc..39e8fb3e6 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c +++ b/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c @@ -35,15 +35,15 @@ void Test_OS_SelectSingle_Impl(void) * int32 OS_SelectSingle_Impl(uint32 stream_id, uint32 *SelectFlags, int32 msecs) */ uint32 SelectFlags; - uint32 StreamID; + osal_index_t StreamID; struct OCS_timespec nowtime; struct OCS_timespec latertime; - StreamID = 0; - UT_PortablePosixIOTest_Set_Selectable(0, false); + StreamID = UT_INDEX_0; + UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, false); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 0), OS_ERR_OPERATION_NOT_SUPPORTED); - UT_PortablePosixIOTest_Set_Selectable(0, true); + UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, true); OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 0), OS_SUCCESS); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, -1), OS_SUCCESS); diff --git a/src/unit-test-coverage/portable/src/coveragetest-no-loader.c b/src/unit-test-coverage/portable/src/coveragetest-no-loader.c index c3df0c998..7d64ed5c1 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-no-loader.c +++ b/src/unit-test-coverage/portable/src/coveragetest-no-loader.c @@ -32,7 +32,7 @@ void Test_OS_ModuleLoad_Impl(void) /* Test Case For: * int32 OS_ModuleLoad_Impl ( uint32 module_id, char *translated_path ) */ - OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl, (0, "local"), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl, (UT_INDEX_0, "local"), OS_ERR_NOT_IMPLEMENTED); } void Test_OS_ModuleUnload_Impl(void) @@ -40,7 +40,7 @@ void Test_OS_ModuleUnload_Impl(void) /* Test Case For: * int32 OS_ModuleUnload_Impl ( uint32 module_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl, (0), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl, (UT_INDEX_0), OS_ERR_NOT_IMPLEMENTED); } void Test_OS_ModuleGetInfo_Impl(void) @@ -51,7 +51,7 @@ void Test_OS_ModuleGetInfo_Impl(void) OS_module_prop_t module_prop; memset(&module_prop, 0, sizeof(module_prop)); - OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl, (0, &module_prop), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl, (UT_INDEX_0, &module_prop), OS_ERR_NOT_IMPLEMENTED); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/portable/src/coveragetest-no-shell.c b/src/unit-test-coverage/portable/src/coveragetest-no-shell.c index 1973e407d..776612532 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-no-shell.c +++ b/src/unit-test-coverage/portable/src/coveragetest-no-shell.c @@ -33,7 +33,7 @@ void Test_OS_ShellOutputToFile_Impl(void) /* Test Case For: * int32 OS_ShellOutputToFile_Impl(uint32 stream_id, const char* Cmd) */ - OSAPI_TEST_FUNCTION_RC(OS_ShellOutputToFile_Impl, (0, "ut"), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_ShellOutputToFile_Impl, (UT_INDEX_0, "ut"), OS_ERR_NOT_IMPLEMENTED); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index 7f1080e27..d151748e5 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -41,14 +41,14 @@ void Test_OS_FileOpen_Impl(void) * Test Case For: * int32 OS_FileOpen_Impl(uint32 local_id, const char *local_path, int32 flags, int32 access) */ - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", OS_FILE_FLAG_TRUNCATE, OS_WRITE_ONLY), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", 0, OS_READ_ONLY), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", OS_FILE_FLAG_CREATE, OS_READ_WRITE), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", 0, -1234), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", OS_FILE_FLAG_TRUNCATE, OS_WRITE_ONLY), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, OS_READ_ONLY), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", OS_FILE_FLAG_CREATE, OS_READ_WRITE), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, -1234), OS_ERROR); /* failure mode */ UT_SetForceFail(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", 0, OS_READ_ONLY), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, OS_READ_ONLY), OS_ERROR); } void Test_OS_FileStat_Impl(void) diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c index 26fdf3059..a6d62de90 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c @@ -43,14 +43,14 @@ void Test_OS_GenericClose_Impl(void) * Test Case For: * int32 OS_GenericClose_Impl(uint32 local_id) */ - OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (UT_INDEX_0), OS_SUCCESS); /* * Test path where underlying close() fails. * Should still return success. */ UT_SetForceFail(UT_KEY(OCS_close), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (UT_INDEX_0), OS_SUCCESS); } void Test_OS_GenericSeek_Impl(void) @@ -62,22 +62,22 @@ void Test_OS_GenericSeek_Impl(void) /* note on success this wrapper returns the result of lseek(), not OS_SUCCESS */ UT_SetForceFail(UT_KEY(OCS_lseek), 111); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_CUR), 111); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_CUR), 111); UT_SetForceFail(UT_KEY(OCS_lseek), 222); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_SET), 222); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_SET), 222); UT_SetForceFail(UT_KEY(OCS_lseek), 333); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_END), 333); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), 333); /* bad whence */ - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, -1234), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, -1234), OS_ERROR); /* generic failure of lseek() */ UT_SetForceFail(UT_KEY(OCS_lseek), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_END), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), OS_ERROR); /* The seek implementation also checks for this specific pipe errno */ OCS_errno = OCS_ESPIPE; - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_END), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), OS_ERR_NOT_IMPLEMENTED); } void Test_OS_GenericRead_Impl(void) @@ -90,20 +90,20 @@ void Test_OS_GenericRead_Impl(void) char DestData[sizeof(SrcData)] = {0}; UT_SetDataBuffer(UT_KEY(OCS_read), SrcData, sizeof(SrcData), false); - UT_PortablePosixIOTest_Set_Selectable(0, false); - OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (0, DestData, sizeof(DestData), 0), sizeof(DestData)); + UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, false); + OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), sizeof(DestData)); UtAssert_MemCmp(SrcData, DestData, sizeof(SrcData), "read() data Valid"); /* test invocation of select() in nonblocking mode */ UT_ResetState(UT_KEY(OCS_read)); UT_SetDataBuffer(UT_KEY(OCS_read), SrcData, sizeof(SrcData), false); - UT_PortablePosixIOTest_Set_Selectable(0, true); - OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (0, DestData, sizeof(DestData), 0), sizeof(DestData)); + UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, true); + OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), sizeof(DestData)); UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* read() failure */ UT_SetForceFail(UT_KEY(OCS_read), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (0, DestData, sizeof(DestData), 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), OS_ERROR); } void Test_OS_GenericWrite_Impl(void) @@ -116,20 +116,20 @@ void Test_OS_GenericWrite_Impl(void) char DestData[sizeof(SrcData)] = {0}; UT_SetDataBuffer(UT_KEY(OCS_write), DestData, sizeof(DestData), false); - UT_PortablePosixIOTest_Set_Selectable(0, false); - OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (0, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); + UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, false); + OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (UT_INDEX_0, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); UtAssert_MemCmp(SrcData, DestData, sizeof(SrcData), "write() data valid"); /* test invocation of select() in nonblocking mode */ UT_ResetState(UT_KEY(OCS_write)); UT_SetDataBuffer(UT_KEY(OCS_write), DestData, sizeof(DestData), false); - UT_PortablePosixIOTest_Set_Selectable(0, true); - OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (0, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); + UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, true); + OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (UT_INDEX_0, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* write() failure */ UT_SetForceFail(UT_KEY(OCS_write), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (0, DestData, sizeof(DestData), 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), OS_ERROR); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/portable/src/os-portable-coveragetest.h b/src/unit-test-coverage/portable/src/os-portable-coveragetest.h index 287d4c005..127fc14dd 100644 --- a/src/unit-test-coverage/portable/src/os-portable-coveragetest.h +++ b/src/unit-test-coverage/portable/src/os-portable-coveragetest.h @@ -57,6 +57,17 @@ #define ADD_TEST(test) UtTest_Add((Test_##test), Osapi_Test_Setup, Osapi_Test_Teardown, #test) +/* + * The default/primary table index used by most coverage tests. + */ +#define UT_INDEX_0 OSAL_INDEX_C(0) + +/* + * A secondary table index for coverage tests which require + * more than one entry + */ +#define UT_INDEX_1 OSAL_INDEX_C(1) + /* Osapi_Test_Setup * * Purpose: diff --git a/src/unit-test-coverage/shared/src/coveragetest-binsem.c b/src/unit-test-coverage/shared/src/coveragetest-binsem.c index 07c605722..28c7c82ea 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-binsem.c @@ -168,7 +168,7 @@ void Test_OS_BinSemGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_bin_sem_prop_t prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; diff --git a/src/unit-test-coverage/shared/src/coveragetest-countsem.c b/src/unit-test-coverage/shared/src/coveragetest-countsem.c index 5afc26277..4e59c4062 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-countsem.c @@ -156,7 +156,7 @@ void Test_OS_CountSemGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_count_sem_prop_t prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; diff --git a/src/unit-test-coverage/shared/src/coveragetest-file.c b/src/unit-test-coverage/shared/src/coveragetest-file.c index 74893e81a..72b06b924 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-file.c +++ b/src/unit-test-coverage/shared/src/coveragetest-file.c @@ -313,7 +313,7 @@ void Test_OS_FDGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_file_prop_t file_prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 528d33886..2f9234c89 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -86,40 +86,40 @@ void Test_OS_mkfs(void) char TestBuffer[128]; - actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", 0, 0); + actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_SUCCESS", (long)actual); /* * Test an entry NOT found in the OS_VolumeTable */ - actual = OS_mkfs(TestBuffer, "/rd1", "vol1", 0, 0); + actual = OS_mkfs(TestBuffer, "/rd1", "vol1", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_SUCCESS", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_mkfs(NULL, NULL, NULL, 0, 0); + actual = OS_mkfs(NULL, NULL, NULL, OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_INVALID_POINTER", (long)actual); UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; - actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", 0, 0); + actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); /* set up for failure due to empty strings */ expected = OS_FS_ERR_PATH_INVALID; - actual = OS_mkfs(TestBuffer, "", "", 0, 0); + actual = OS_mkfs(TestBuffer, "", "", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); /* set up for failure due to formatting */ UT_SetForceFail(UT_KEY(OS_FileSysFormatVolume_Impl), OS_FS_ERR_DRIVE_NOT_CREATED); expected = OS_FS_ERR_DRIVE_NOT_CREATED; - actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", 0, 0); + actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_DRIVE_NOT_CREATED (format failure)", (long)actual); /* set up for failure due to no free slots */ UT_SetForceFail(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); expected = OS_FS_ERR_DEVICE_NOT_FREE; - actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", 0, 0); + actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_DEVICE_NOT_FREE", (long)actual); } @@ -164,26 +164,26 @@ void Test_OS_initfs(void) char TestBuffer[128]; - actual = OS_initfs(TestBuffer, "/ramdev0", "vol", 0, 0); + actual = OS_initfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_SUCCESS", (long)actual); - actual = OS_initfs(NULL, "/hda2", "vol2", 0, 0); + actual = OS_initfs(NULL, "/hda2", "vol2", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_SUCCESS", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_initfs(NULL, NULL, NULL, 0, 0); + actual = OS_initfs(NULL, NULL, NULL, OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_INVALID_POINTER", (long)actual); UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); expected = OS_FS_ERR_PATH_TOO_LONG; - actual = OS_initfs(TestBuffer, "/ramdev0", "vol", 0, 0); + actual = OS_initfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); /* set up for failure */ UT_SetForceFail(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); expected = OS_FS_ERR_DEVICE_NOT_FREE; - actual = OS_initfs(TestBuffer, "/ramdev0", "vol", 0, 0); + actual = OS_initfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_FS_ERR_DEVICE_NOT_FREE", (long)actual); } @@ -263,9 +263,9 @@ void Test_OS_fsBlocksFree(void) int32 actual = ~OS_SUCCESS; OS_statvfs_t statval; - statval.block_size = 1024; - statval.blocks_free = 1111; - statval.total_blocks = 2222; + statval.block_size = OSAL_SIZE_C(1024); + statval.blocks_free = OSAL_BLOCKCOUNT_C(1111); + statval.total_blocks = OSAL_BLOCKCOUNT_C(2222); UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statval, sizeof(statval), false); OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; @@ -300,9 +300,9 @@ void Test_OS_fsBytesFree(void) OS_statvfs_t statval; uint64 bytes_free = 0; - statval.block_size = 1024; - statval.blocks_free = 1111; - statval.total_blocks = 2222; + statval.block_size = OSAL_SIZE_C(1024); + statval.blocks_free = OSAL_BLOCKCOUNT_C(1111); + statval.total_blocks = OSAL_BLOCKCOUNT_C(2222); UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statval, sizeof(statval), false); OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 07fc471de..5e3498693 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -39,7 +39,7 @@ typedef struct } Test_OS_ObjTypeCount_t; /* a match function that always matches */ -static bool TestAlwaysMatch(void *ref, uint32 local_id, const OS_common_record_t *obj) +static bool TestAlwaysMatch(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { return true; } @@ -113,7 +113,7 @@ void Test_OS_ObjectIdConvertLock(void) */ int32 expected; int32 actual; - uint32 array_index; + osal_index_t array_index; OS_common_record_t *record; osal_id_t objid; UT_idbuf_t corrupt_objid; @@ -186,9 +186,9 @@ void Test_OS_GetMaxForObjectType(void) * Test Case For: * uint32 OS_GetMaxForObjectType(uint32 idtype); */ - uint32 idtype = 0; - uint32 expected = 0xFFFFFFFF; - uint32 max = 0; + osal_objtype_t idtype; + uint32 expected = 0xFFFFFFFF; + uint32 max = 0; for (idtype = 0; idtype < OS_OBJECT_TYPE_USER; ++idtype) { @@ -219,9 +219,9 @@ void Test_OS_GetBaseForObjectType(void) * Test Case For: * uint32 OS_GetBaseForObjectType(uint32 idtype); */ - uint32 idtype = 0; - uint32 expected = 0xFFFFFFFF; - uint32 max = 0; + osal_objtype_t idtype; + uint32 expected = 0xFFFFFFFF; + uint32 max = 0; for (idtype = 0; idtype < OS_OBJECT_TYPE_USER; ++idtype) { @@ -256,10 +256,10 @@ void Test_OS_ObjectIdToArrayIndex(void) * different test case. The only additional test here is to provide a value * which is out of range. */ - osal_id_t objid; - uint32 local_idx = 0xFFFFFFFF; - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; + osal_id_t objid; + osal_index_t local_idx; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; /* need to get a "valid" objid for the nominal case */ OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TASK, 1, &objid); @@ -271,7 +271,7 @@ void Test_OS_ObjectIdToArrayIndex(void) /* coverage for off-nominal case */ expected = OS_ERR_INVALID_ID; - actual = OS_ObjectIdToArrayIndex(0xFFFFFFFF, UT_OBJID_OTHER, &local_idx); + actual = OS_ObjectIdToArrayIndex(0xFFFF, UT_OBJID_OTHER, &local_idx); UtAssert_True(actual == expected, "OS_ObjectIdToArrayIndex() (%ld) == OS_ERR_INVALID_ID", (long)actual); } @@ -335,8 +335,8 @@ void Test_OS_ObjectIdGetById(void) int32 actual = ~OS_SUCCESS; int32 expected = OS_SUCCESS; osal_id_t refobjid; - uint32 local_idx = 0xFFFFFFFF; - OS_common_record_t *rptr = NULL; + osal_index_t local_idx; + OS_common_record_t *rptr = NULL; /* verify that the call returns ERROR when not initialized */ OS_SharedGlobalVars.Initialized = false; @@ -373,7 +373,7 @@ void Test_OS_ObjectIdGetById(void) /* attempt to get lock for invalid type object should fail */ expected = OS_ERR_INVALID_ID; - actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, 0xFFFFFFFF, refobjid, &local_idx, &rptr); + actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, 0xFFFF, refobjid, &local_idx, &rptr); UtAssert_True(actual == expected, "OS_ObjectIdGetById() (%ld) == OS_ERR_INVALID_ID", (long)actual); OS_SharedGlobalVars.ShutdownFlag = 0; @@ -532,32 +532,32 @@ void Test_OS_ObjectIdAllocateNew(void) */ int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; - uint32 indx; + osal_index_t idx; OS_common_record_t *rptr = NULL; - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &indx, &rptr); + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &idx, &rptr); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(rptr != NULL, "rptr (%p) != NULL", (void *)rptr); /* Passing a NULL name also should work here (used for internal objects) */ - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, NULL, &indx, &rptr); + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, NULL, &idx, &rptr); UtAssert_True(actual == expected, "OS_ObjectIdAllocate(NULL) (%ld) == OS_SUCCESS", (long)actual); rptr->name_entry = "UT_alloc"; expected = OS_ERR_NAME_TAKEN; - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &indx, &rptr); + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &idx, &rptr); UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_NAME_TAKEN", (long)actual); OS_SharedGlobalVars.ShutdownFlag = OS_SHUTDOWN_MAGIC_NUMBER; expected = OS_ERROR; - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &indx, &rptr); + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &idx, &rptr); OS_SharedGlobalVars.ShutdownFlag = 0; UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_NAME_TAKEN", (long)actual); expected = OS_ERR_INCORRECT_OBJ_TYPE; - actual = OS_ObjectIdAllocateNew(0xFFFFFFFF, "UT_alloc", &indx, &rptr); + actual = OS_ObjectIdAllocateNew(0xFFFF, "UT_alloc", &idx, &rptr); UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_INCORRECT_OBJ_TYPE", (long)actual); } @@ -569,11 +569,11 @@ void Test_OS_ConvertToArrayIndex(void) * * */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; // OS_ConvertToArrayIndex(); - uint32 local_idx1 = 0xFFFFFFF0; - uint32 local_idx2 = 0xFFFFFFF1; - OS_common_record_t *rptr = NULL; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; // OS_ConvertToArrayIndex(); + osal_index_t local_idx1; + osal_index_t local_idx2; + OS_common_record_t *rptr = NULL; /* Need a valid ID to work with */ OS_ObjectIdFindNext(OS_OBJECT_TYPE_OS_TASK, &local_idx1, &rptr); @@ -593,9 +593,9 @@ void Test_OS_ForEachObject(void) * Test Case For: * void OS_ForEachObject (uint32 creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg); */ - uint32 objtype = OS_OBJECT_TYPE_UNDEFINED; - OS_common_record_t * rptr = NULL; - uint32 local_idx = 0xFFFFFFFF; + osal_objtype_t objtype; + OS_common_record_t * rptr = NULL; + osal_index_t local_idx; UT_idbuf_t self_id; Test_OS_ObjTypeCount_t Count; @@ -603,6 +603,7 @@ void Test_OS_ForEachObject(void) memset(&Count, 0, sizeof(Count)); + objtype = OS_OBJECT_TYPE_UNDEFINED; while (objtype < OS_OBJECT_TYPE_USER) { OS_ObjectIdFindNext(objtype, &local_idx, &rptr); @@ -641,8 +642,8 @@ void Test_OS_GetResourceName(void) * Test Case For: * int32 OS_GetResourceName(uint32 id, char *buffer, uint32 buffer_size) */ - uint32 local_idx = 0xFFFFFFFF; - OS_common_record_t *rptr = NULL; + osal_index_t local_idx; + OS_common_record_t *rptr = NULL; char NameBuffer[OS_MAX_API_NAME]; int32 expected; int32 actual; @@ -659,11 +660,11 @@ void Test_OS_GetResourceName(void) UtAssert_True(strcmp(NameBuffer, "UTTask") == 0, "NameBuffer (%s) == UTTask", NameBuffer); expected = OS_ERR_NAME_TOO_LONG; - actual = OS_GetResourceName(rptr->active_id, NameBuffer, 2); + actual = OS_GetResourceName(rptr->active_id, NameBuffer, OSAL_SIZE_C(2)); UtAssert_True(actual == expected, "OS_GetResourceName() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_GetResourceName(rptr->active_id, NULL, 0); + actual = OS_GetResourceName(rptr->active_id, NULL, OSAL_SIZE_C(0)); UtAssert_True(actual == expected, "OS_GetResourceName() (%ld) == OS_INVALID_POINTER", (long)actual); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-module.c b/src/unit-test-coverage/shared/src/coveragetest-module.c index 69d71290e..d553629ff 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-module.c +++ b/src/unit-test-coverage/shared/src/coveragetest-module.c @@ -210,16 +210,16 @@ void Test_OS_SymbolTableDump(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; - actual = OS_SymbolTableDump("test", 555); + actual = OS_SymbolTableDump("test", OSAL_SIZE_C(555)); UtAssert_True(actual == expected, "OS_SymbolTableDump() (%ld) == OS_SUCCESS", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SymbolTableDump(NULL, 555); + actual = OS_SymbolTableDump(NULL, OSAL_SIZE_C(555)); UtAssert_True(actual == expected, "OS_SymbolTableDump() (%ld) == OS_INVALID_POINTER", (long)actual); UT_SetForceFail(UT_KEY(OS_TranslatePath), OS_ERROR); expected = OS_ERROR; - actual = OS_SymbolTableDump("test", 555); + actual = OS_SymbolTableDump("test", OSAL_SIZE_C(555)); UtAssert_True(actual == expected, "OS_SymbolTableDump() (%ld) == OS_ERROR", (long)actual); } @@ -232,10 +232,11 @@ void Test_OS_ModuleGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_module_prop_t module_prop; - uint32 local_index = 1; + osal_index_t local_index; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; + local_index = UT_INDEX_1; memset(&utrec, 0, sizeof(utrec)); utrec.creator = UT_OBJID_OTHER; utrec.name_entry = "ABC"; diff --git a/src/unit-test-coverage/shared/src/coveragetest-mutex.c b/src/unit-test-coverage/shared/src/coveragetest-mutex.c index ad13a1539..4d2cd0728 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/shared/src/coveragetest-mutex.c @@ -139,7 +139,7 @@ void Test_OS_MutSemGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_mut_sem_prop_t prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; diff --git a/src/unit-test-coverage/shared/src/coveragetest-queue.c b/src/unit-test-coverage/shared/src/coveragetest-queue.c index 4c8bfa89a..3dd21200f 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-queue.c +++ b/src/unit-test-coverage/shared/src/coveragetest-queue.c @@ -56,23 +56,23 @@ void Test_OS_QueueCreate(void) */ int32 expected = OS_SUCCESS; osal_id_t objid; - int32 actual = OS_QueueCreate(&objid, "UT", 0, 0, 0); + int32 actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(0), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_SUCCESS", (long)actual); /* test error cases */ expected = OS_INVALID_POINTER; - actual = OS_QueueCreate(NULL, "UT", 0, 0, 0); + actual = OS_QueueCreate(NULL, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(0), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_INVALID_POINTER", (long)actual); UT_SetForceFail(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); expected = OS_ERR_NAME_TOO_LONG; - actual = OS_QueueCreate(&objid, "UT", 0, 0, 0); + actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(0), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); UT_ClearForceFail(UT_KEY(OCS_strlen)); expected = OS_QUEUE_INVALID_SIZE; - actual = OS_QueueCreate(&objid, "UT", 1 + OS_QUEUE_MAX_DEPTH, 0, 0); + actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(1 + OS_QUEUE_MAX_DEPTH), OSAL_SIZE_C(0), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_QUEUE_INVALID_SIZE", (long)actual); } @@ -98,7 +98,7 @@ void Test_OS_QueueGet(void) */ int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; - uint32 actual_size; + size_t actual_size; char Buf[4]; actual = OS_QueueGet(UT_OBJID_1, Buf, sizeof(Buf), &actual_size, 0); @@ -170,7 +170,7 @@ void Test_OS_QueueGetInfo(void) int32 actual = ~OS_SUCCESS; OS_queue_prop_t queue_prop; osal_id_t id; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; diff --git a/src/unit-test-coverage/shared/src/coveragetest-sockets.c b/src/unit-test-coverage/shared/src/coveragetest-sockets.c index 13c7314a6..9c7acd65b 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-sockets.c +++ b/src/unit-test-coverage/shared/src/coveragetest-sockets.c @@ -150,10 +150,11 @@ void Test_OS_SocketAccept(void) */ int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; - uint32 local_id = 0; + osal_index_t local_id; osal_id_t connsock_id; OS_SockAddr_t Addr; + local_id = UT_INDEX_0; connsock_id = OS_OBJECT_ID_UNDEFINED; OS_stream_table[local_id].socket_type = OS_SocketType_STREAM; @@ -210,10 +211,10 @@ void Test_OS_SocketConnect(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_SockAddr_t Addr; - uint32 idbuf; + osal_index_t idbuf; memset(&Addr, 0, sizeof(Addr)); - idbuf = 1; + idbuf = UT_INDEX_1; UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); OS_stream_table[idbuf].socket_domain = OS_SocketDomain_INET; OS_stream_table[idbuf].socket_type = OS_SocketType_STREAM; @@ -263,19 +264,20 @@ void Test_OS_SocketRecvFrom(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_SockAddr_t Addr; - uint32 idbuf; + osal_index_t idbuf; memset(&Addr, 0, sizeof(Addr)); - idbuf = 1; + idbuf = UT_INDEX_1; UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); OS_stream_table[idbuf].socket_type = OS_SocketType_DATAGRAM; OS_stream_table[idbuf].stream_state = OS_STREAM_STATE_BOUND; actual = OS_SocketRecvFrom(UT_OBJID_1, &Buf, 1, &Addr, 0); + actual = OS_SocketRecvFrom(UT_OBJID_1, &Buf, sizeof(Buf), &Addr, 0); UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_SUCCESS", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketRecvFrom(UT_OBJID_1, NULL, 0, NULL, 0); + actual = OS_SocketRecvFrom(UT_OBJID_1, NULL, OSAL_SIZE_C(0), NULL, 0); UtAssert_True(actual == expected, "OS_SocketRecvFrom(NULL) (%ld) == OS_INVALID_POINTER", (long)actual); /* @@ -283,7 +285,7 @@ void Test_OS_SocketRecvFrom(void) */ OS_stream_table[1].socket_type = OS_SocketType_INVALID; expected = OS_ERR_INCORRECT_OBJ_TYPE; - actual = OS_SocketRecvFrom(UT_OBJID_1, &Buf, 1, &Addr, 0); + actual = OS_SocketRecvFrom(UT_OBJID_1, &Buf, sizeof(Buf), &Addr, 0); UtAssert_True(actual == expected, "OS_SocketRecvFrom() non-datagram (%ld) == OS_ERR_INCORRECT_OBJ_TYPE", (long)actual); @@ -293,7 +295,7 @@ void Test_OS_SocketRecvFrom(void) OS_stream_table[1].socket_type = OS_SocketType_DATAGRAM; OS_stream_table[1].stream_state = 0; expected = OS_ERR_INCORRECT_OBJ_STATE; - actual = OS_SocketRecvFrom(UT_OBJID_1, &Buf, 1, &Addr, 0); + actual = OS_SocketRecvFrom(UT_OBJID_1, &Buf, sizeof(Buf), &Addr, 0); UtAssert_True(actual == expected, "OS_SocketRecvFrom() non-bound (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); } @@ -313,19 +315,19 @@ void Test_OS_SocketSendTo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_SockAddr_t Addr; - uint32 idbuf; + osal_index_t idbuf; memset(&Addr, 0, sizeof(Addr)); - idbuf = 1; + idbuf = UT_INDEX_1; UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); OS_stream_table[idbuf].socket_type = OS_SocketType_DATAGRAM; OS_stream_table[idbuf].stream_state = OS_STREAM_STATE_BOUND; - actual = OS_SocketSendTo(UT_OBJID_1, &Buf, 1, &Addr); + actual = OS_SocketSendTo(UT_OBJID_1, &Buf, sizeof(Buf), &Addr); UtAssert_True(actual == expected, "OS_SocketSendTo() (%ld) == OS_SUCCESS", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketSendTo(UT_OBJID_1, NULL, 0, NULL); + actual = OS_SocketSendTo(UT_OBJID_1, NULL, OSAL_SIZE_C(0), NULL); UtAssert_True(actual == expected, "OS_SocketSendTo(NULL) (%ld) == OS_INVALID_POINTER", (long)actual); /* @@ -333,7 +335,7 @@ void Test_OS_SocketSendTo(void) */ OS_stream_table[1].socket_type = OS_SocketType_INVALID; expected = OS_ERR_INCORRECT_OBJ_TYPE; - actual = OS_SocketSendTo(UT_OBJID_1, &Buf, 1, &Addr); + actual = OS_SocketSendTo(UT_OBJID_1, &Buf, sizeof(Buf), &Addr); UtAssert_True(actual == expected, "OS_SocketSendTo() non-datagram (%ld) == OS_ERR_INCORRECT_OBJ_TYPE", (long)actual); } @@ -382,7 +384,7 @@ void Test_OS_SocketGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_socket_prop_t prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; @@ -439,7 +441,7 @@ void Test_OS_SocketAddr(void) actual = OS_SocketAddrInit(NULL, OS_SocketDomain_INVALID); UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_INVALID_POINTER", (long)actual); - actual = OS_SocketAddrToString(NULL, 0, NULL); + actual = OS_SocketAddrToString(NULL, OSAL_SIZE_C(0), NULL); UtAssert_True(actual == expected, "OS_SocketAddrToString() (%ld) == OS_INVALID_POINTER", (long)actual); actual = OS_SocketAddrFromString(NULL, NULL); diff --git a/src/unit-test-coverage/shared/src/coveragetest-task.c b/src/unit-test-coverage/shared/src/coveragetest-task.c index f1e640c6d..7a0e9c63f 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-task.c +++ b/src/unit-test-coverage/shared/src/coveragetest-task.c @@ -106,17 +106,23 @@ void Test_OS_TaskCreate(void) */ int32 expected = OS_SUCCESS; osal_id_t objid; - int32 actual = OS_TaskCreate(&objid, "UT", UT_TestHook, NULL, 128, 0, 0); + int32 actual; + + actual = OS_TaskCreate(&objid, "UT", UT_TestHook, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(128), OSAL_PRIORITY_C(0), 0); UtAssert_True(actual == expected, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate(NULL, NULL, NULL, NULL, 0, 0, 0), OS_INVALID_POINTER); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate(&objid, "UT", UT_TestHook, NULL, 0, 0, 0), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate(&objid, "UT", UT_TestHook, NULL, 128, 10 + OS_MAX_TASK_PRIORITY, 0), - OS_ERR_INVALID_PRIORITY); + OSAPI_TEST_FUNCTION_RC( + OS_TaskCreate(NULL, NULL, NULL, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(0), OSAL_PRIORITY_C(0), 0), + OS_INVALID_POINTER); + OSAPI_TEST_FUNCTION_RC( + OS_TaskCreate(&objid, "UT", UT_TestHook, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(0), OSAL_PRIORITY_C(0), 0), + OS_ERROR); UT_SetForceFail(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate(&objid, "UT", UT_TestHook, NULL, 128, 0, 0), OS_ERR_NAME_TOO_LONG); + OSAPI_TEST_FUNCTION_RC( + OS_TaskCreate(&objid, "UT", UT_TestHook, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(128), OSAL_PRIORITY_C(0), 0), + OS_ERR_NAME_TOO_LONG); } void Test_OS_TaskDelete(void) @@ -148,7 +154,7 @@ void Test_OS_TaskExit(void) * Test Case For: * void OS_TaskExit() */ - uint32 local_index = 0; + osal_index_t local_index = UT_INDEX_0; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; @@ -180,11 +186,9 @@ void Test_OS_TaskSetPriority(void) * int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority) */ int32 expected = OS_SUCCESS; - int32 actual = OS_TaskSetPriority(UT_OBJID_1, 1); + int32 actual = OS_TaskSetPriority(UT_OBJID_1, OSAL_PRIORITY_C(1)); UtAssert_True(actual == expected, "OS_TaskSetPriority() (%ld) == OS_SUCCESS", (long)actual); - - OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority(UT_OBJID_1, 10 + OS_MAX_TASK_PRIORITY), OS_ERR_INVALID_PRIORITY); } void Test_OS_TaskRegister(void) { @@ -248,15 +252,15 @@ void Test_OS_TaskGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_task_prop_t task_prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; memset(&utrec, 0, sizeof(utrec)); utrec.creator = UT_OBJID_OTHER; utrec.name_entry = "ABC"; - OS_task_table[1].stack_size = 222; - OS_task_table[1].priority = 333; + OS_task_table[1].stack_size = OSAL_SIZE_C(222); + OS_task_table[1].priority = OSAL_PRIORITY_C(133); UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); actual = OS_TaskGetInfo(UT_OBJID_1, &task_prop); @@ -266,10 +270,10 @@ void Test_OS_TaskGetInfo(void) UtAssert_True(strcmp(task_prop.name, "ABC") == 0, "task_prop.name (%s) == ABC", task_prop.name); UtAssert_True(task_prop.stack_size == 222, "task_prop.stack_size (%lu) == 222", (unsigned long)task_prop.stack_size); - UtAssert_True(task_prop.priority == 333, "task_prop.priority (%lu) == 333", (unsigned long)task_prop.priority); + UtAssert_True(task_prop.priority == 133, "task_prop.priority (%lu) == 133", (unsigned long)task_prop.priority); - OS_task_table[1].stack_size = 0; - OS_task_table[1].priority = 0; + OS_task_table[1].stack_size = OSAL_SIZE_C(0); + OS_task_table[1].priority = OSAL_PRIORITY_C(0); OSAPI_TEST_FUNCTION_RC(OS_TaskGetInfo(OS_OBJECT_ID_UNDEFINED, NULL), OS_INVALID_POINTER); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-time.c b/src/unit-test-coverage/shared/src/coveragetest-time.c index d62a28fb1..6c3f0b17d 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-time.c +++ b/src/unit-test-coverage/shared/src/coveragetest-time.c @@ -116,11 +116,11 @@ void Test_OS_TimerCreate(void) * Test Case For: * int32 OS_TimerCreate(uint32 *timer_id, const char *timer_name, uint32 *accuracy, OS_TimerCallback_t callback_ptr) */ - int32 expected = OS_SUCCESS; - osal_id_t objid = OS_OBJECT_ID_UNDEFINED; - uint32 local_id = 0xFFFFFFFF; - uint32 accuracy = 0xFFFFFFFF; - int32 actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); + int32 expected = OS_SUCCESS; + osal_id_t objid = OS_OBJECT_ID_UNDEFINED; + osal_index_t local_id; + uint32 accuracy = 0xFFFFFFFF; + int32 actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_SUCCESS", (long)actual); @@ -170,7 +170,7 @@ void Test_OS_TimerSet(void) actual = OS_TimerSet(UT_OBJID_1, 0, 1); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_SUCCESS", (long)actual); - OS_timecb_table[2].timebase_ref = 0; + OS_timecb_table[2].timebase_ref = UT_INDEX_0; OS_timecb_table[2].flags = TIMECB_FLAG_DEDICATED_TIMEBASE; OS_global_timebase_table[0].active_id = UT_OBJID_2; actual = OS_TimerSet(UT_OBJID_2, 0, 1); @@ -199,10 +199,10 @@ void Test_OS_TimerDelete(void) UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); - OS_timecb_table[1].timebase_ref = 0; - OS_timecb_table[2].timebase_ref = 0; - OS_timecb_table[2].next_ref = 1; - OS_timecb_table[1].next_ref = 1; + OS_timecb_table[1].timebase_ref = UT_INDEX_0; + OS_timecb_table[2].timebase_ref = UT_INDEX_0; + OS_timecb_table[2].next_ref = UT_INDEX_1; + OS_timecb_table[1].next_ref = UT_INDEX_1; OS_timebase_table[0].first_cb = UT_OBJID_2; actual = OS_TimerDelete(UT_OBJID_2); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); @@ -215,7 +215,7 @@ void Test_OS_TimerDelete(void) * these are implicitly created as part of timer creation for API compatibility */ OS_TimeBaseCreate(&OS_global_timebase_table[0].active_id, "ut", NULL); OS_timecb_table[1].flags = TIMECB_FLAG_DEDICATED_TIMEBASE; - OS_timecb_table[1].timebase_ref = 0; + OS_timecb_table[1].timebase_ref = UT_INDEX_0; actual = OS_TimerDelete(UT_OBJID_1); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(UT_GetStubCount(UT_KEY(OS_TimeBaseDelete)) == 1, "OS_TimerDelete() invoked OS_TimeBaseDelete()"); @@ -269,7 +269,7 @@ void Test_OS_TimerGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_timer_prop_t timer_prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; @@ -277,7 +277,7 @@ void Test_OS_TimerGetInfo(void) utrec.creator = UT_OBJID_OTHER; utrec.name_entry = "ABC"; OS_timecb_table[1].interval_time = 2222; - OS_timecb_table[1].timebase_ref = 0; + OS_timecb_table[1].timebase_ref = UT_INDEX_0; OS_timebase_table[0].accuracy_usec = 3333; UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index 9484cb9c0..544b4c052 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -38,7 +38,7 @@ static uint32 TimerSyncCount = 0; static uint32 TimerSyncRetVal = 0; static uint32 TimeCB = 0; -static uint32 UT_TimerSync(uint32 timer_id) +static uint32 UT_TimerSync(osal_index_t timer_id) { ++TimerSyncCount; return TimerSyncRetVal; @@ -192,7 +192,7 @@ void Test_OS_TimeBaseGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_timebase_prop_t timebase_prop; - uint32 local_index = 1; + osal_index_t local_index = UT_INDEX_1; OS_common_record_t utrec; OS_common_record_t *rptr = &utrec; @@ -249,8 +249,9 @@ void Test_OS_TimeBase_CallbackThread(void) */ OS_common_record_t fake_record; OS_common_record_t *recptr = &fake_record; - osal_id_t idbuf; + osal_index_t local_index; + local_index = UT_INDEX_2; memset(&fake_record, 0, sizeof(fake_record)); fake_record.active_id = UT_OBJID_2; @@ -260,8 +261,7 @@ void Test_OS_TimeBase_CallbackThread(void) TimerSyncCount = 0; TimerSyncRetVal = 0; TimeCB = 0; - idbuf = UT_OBJID_2; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); + UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &recptr, sizeof(recptr), false); UT_SetHookFunction(UT_KEY(OS_TimeBaseLock_Impl), ClearObjectsHook, recptr); OS_TimeBase_CallbackThread(UT_OBJID_2); @@ -272,8 +272,7 @@ void Test_OS_TimeBase_CallbackThread(void) TimerSyncCount = 0; TimerSyncRetVal = 1000; fake_record.active_id = UT_OBJID_2; - idbuf = UT_OBJID_2; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); + UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &recptr, sizeof(recptr), false); UT_SetHookFunction(UT_KEY(OS_TimeBaseLock_Impl), ClearObjectsHook, recptr); OS_TimeBase_CallbackThread(UT_OBJID_2); diff --git a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h index 86c23d952..55397f6fb 100644 --- a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h +++ b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h @@ -74,6 +74,10 @@ typedef union #define UT_OBJID_OTHER ((osal_id_t) {0x12345}) #define UT_OBJID_MAX ((osal_id_t) {0xFFFFFFFF}) +#define UT_INDEX_0 OSAL_INDEX_C(0) +#define UT_INDEX_1 OSAL_INDEX_C(1) +#define UT_INDEX_2 OSAL_INDEX_C(2) + /* * Setup function prior to every test */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h index 5cefc0938..8a6a906e2 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h @@ -70,7 +70,7 @@ Note: This should write the string as-is without buffering. ------------------------------------------------------------------*/ -extern void OCS_OS_BSP_ConsoleOutput_Impl(const char *Str, uint32_t DataLen); +extern void OCS_OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen); /*---------------------------------------------------------------- Function: OS_BSP_ConsoleSetMode_Impl diff --git a/src/unit-test-coverage/ut-stubs/src/bsp-console-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/bsp-console-impl-stubs.c index 23aeb900c..d3ed86ea3 100644 --- a/src/unit-test-coverage/ut-stubs/src/bsp-console-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/bsp-console-impl-stubs.c @@ -43,7 +43,7 @@ Note: This should write the string as-is without buffering. ------------------------------------------------------------------*/ -void OCS_OS_BSP_ConsoleOutput_Impl(const char *Str, uint32_t DataLen) +void OCS_OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen) { int32_t retcode = UT_DEFAULT_IMPL(OCS_OS_BSP_ConsoleOutput_Impl); diff --git a/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c b/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c index aa67f8aa2..5ffc9c262 100644 --- a/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c @@ -45,7 +45,7 @@ int OCS_fclose(OCS_FILE *stream) char *OCS_fgets(char *s, int n, OCS_FILE *stream) { int32 Status; - uint32 CopySize; + size_t CopySize; Status = UT_DEFAULT_IMPL_RC(OCS_fgets, OCS_STDIO_MAX_SIZE); diff --git a/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c b/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c index 88eabb995..721dece9b 100644 --- a/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c @@ -92,7 +92,7 @@ void *OCS_malloc(size_t sz) cpuaddr PoolEnd; cpuaddr NextBlock; size_t NextSize; - uint32 PoolSize; + size_t PoolSize; uint32 CallCnt; struct MPOOL_REC *Rec; @@ -163,7 +163,7 @@ void OCS_free(void *ptr) int32 Status; cpuaddr BlockAddr; void * PoolPtr; - uint32 PoolSize; + size_t PoolSize; struct MPOOL_REC *Rec; /* diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c index c54b742e1..d1b8bfede 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c @@ -38,10 +38,10 @@ ** Semaphore API */ -UT_DEFAULT_STUB(OS_BinSemCreate_Impl, (uint32 sem_id, uint32 sem_initial_value, uint32 options)) -UT_DEFAULT_STUB(OS_BinSemFlush_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_BinSemGive_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_BinSemTake_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_BinSemTimedWait_Impl, (uint32 sem_id, uint32 msecs)) -UT_DEFAULT_STUB(OS_BinSemDelete_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_BinSemGetInfo_Impl, (uint32 sem_id, OS_bin_sem_prop_t *bin_prop)) +UT_DEFAULT_STUB(OS_BinSemCreate_Impl, (osal_index_t sem_id, uint32 sem_initial_value, uint32 options)) +UT_DEFAULT_STUB(OS_BinSemFlush_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_BinSemGive_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_BinSemTake_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_BinSemTimedWait_Impl, (osal_index_t sem_id, uint32 msecs)) +UT_DEFAULT_STUB(OS_BinSemDelete_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_BinSemGetInfo_Impl, (osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c index 07393f74f..5f3ee077a 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c @@ -34,7 +34,7 @@ #include "os-shared-common.h" -UT_DEFAULT_STUB(OS_API_Impl_Init, (uint32 idtype)) +UT_DEFAULT_STUB(OS_API_Impl_Init, (osal_objtype_t idtype)) void OS_IdleLoop_Impl(void) { diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c index 6a0d202fb..ec77389bb 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c @@ -37,11 +37,11 @@ /* ** Console output API (printf) */ -void OS_ConsoleWakeup_Impl(uint32 local_id) +void OS_ConsoleWakeup_Impl(osal_index_t local_id) { UT_DEFAULT_IMPL(OS_ConsoleWakeup_Impl); } -int32 OS_ConsoleCreate_Impl(uint32 local_id) +int32 OS_ConsoleCreate_Impl(osal_index_t local_id) { return UT_DEFAULT_IMPL(OS_ConsoleCreate_Impl); } diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c index caa024050..c48a8168b 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c @@ -38,9 +38,9 @@ ** Semaphore API */ -UT_DEFAULT_STUB(OS_CountSemCreate_Impl, (uint32 sem_id, uint32 sem_initial_value, uint32 options)) -UT_DEFAULT_STUB(OS_CountSemGive_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_CountSemTake_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_CountSemTimedWait_Impl, (uint32 sem_id, uint32 msecs)) -UT_DEFAULT_STUB(OS_CountSemDelete_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_CountSemGetInfo_Impl, (uint32 sem_id, OS_count_sem_prop_t *count_prop)) +UT_DEFAULT_STUB(OS_CountSemCreate_Impl, (osal_index_t sem_id, uint32 sem_initial_value, uint32 options)) +UT_DEFAULT_STUB(OS_CountSemGive_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_CountSemTake_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_CountSemTimedWait_Impl, (osal_index_t sem_id, uint32 msecs)) +UT_DEFAULT_STUB(OS_CountSemDelete_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_CountSemGetInfo_Impl, (osal_index_t sem_id, OS_count_sem_prop_t *count_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c index 26fec0ba1..ae3b5ac87 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c @@ -39,27 +39,27 @@ * File API abstraction layer */ -UT_DEFAULT_STUB(OS_FileOpen_Impl, (uint32 file_id, const char *local_path, int32 flags, int32 access)) +UT_DEFAULT_STUB(OS_FileOpen_Impl, (osal_index_t file_id, const char *local_path, int32 flags, int32 access)) UT_DEFAULT_STUB(OS_FileStat_Impl, (const char *local_path, os_fstat_t *filestat)) UT_DEFAULT_STUB(OS_FileRemove_Impl, (const char *local_path)) UT_DEFAULT_STUB(OS_FileRename_Impl, (const char *old_path, const char *new_path)) UT_DEFAULT_STUB(OS_FileChmod_Impl, (const char *local_path, uint32 access)) -UT_DEFAULT_STUB(OS_ShellOutputToFile_Impl, (uint32 file_id, const char *Cmd)) +UT_DEFAULT_STUB(OS_ShellOutputToFile_Impl, (osal_index_t file_id, const char *Cmd)) /* * Directory API abstraction layer */ UT_DEFAULT_STUB(OS_DirCreate_Impl, (const char *local_path, uint32 access)) -UT_DEFAULT_STUB(OS_DirOpen_Impl, (uint32 dir_id, const char *local_path)) -UT_DEFAULT_STUB(OS_DirClose_Impl, (uint32 dir_id)) -UT_DEFAULT_STUB(OS_DirRead_Impl, (uint32 dir_id, os_dirent_t *dirent)) -UT_DEFAULT_STUB(OS_DirRewind_Impl, (uint32 dir_id)) +UT_DEFAULT_STUB(OS_DirOpen_Impl, (osal_index_t dir_id, const char *local_path)) +UT_DEFAULT_STUB(OS_DirClose_Impl, (osal_index_t dir_id)) +UT_DEFAULT_STUB(OS_DirRead_Impl, (osal_index_t dir_id, os_dirent_t *dirent)) +UT_DEFAULT_STUB(OS_DirRewind_Impl, (osal_index_t dir_id)) UT_DEFAULT_STUB(OS_DirRemove_Impl, (const char *local_path)) /* * Stream abstraction layer (applies to sockets and files) */ -int32 OS_GenericRead_Impl(uint32 stream_id, void *buffer, uint32 nbytes, int32 timeout) +int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, int32 timeout) { int32 Status = UT_DEFAULT_IMPL(OS_GenericRead_Impl); @@ -71,7 +71,7 @@ int32 OS_GenericRead_Impl(uint32 stream_id, void *buffer, uint32 nbytes, int32 t return Status; } -int32 OS_GenericWrite_Impl(uint32 stream_id, const void *buffer, uint32 nbytes, int32 timeout) +int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nbytes, int32 timeout) { int32 Status = UT_DEFAULT_IMPL(OS_GenericWrite_Impl); @@ -83,5 +83,5 @@ int32 OS_GenericWrite_Impl(uint32 stream_id, const void *buffer, uint32 nbytes, return Status; } -UT_DEFAULT_STUB(OS_GenericSeek_Impl, (uint32 file_id, int32 offset, uint32 whence)) -UT_DEFAULT_STUB(OS_GenericClose_Impl, (uint32 file_id)) +UT_DEFAULT_STUB(OS_GenericSeek_Impl, (osal_index_t file_id, int32 offset, uint32 whence)) +UT_DEFAULT_STUB(OS_GenericClose_Impl, (osal_index_t file_id)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c index 8c0ac6f24..e3f5d1037 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c @@ -36,14 +36,14 @@ /* * File system abstraction layer */ -UT_DEFAULT_STUB(OS_FileSysStartVolume_Impl, (uint32 filesys_id)) -UT_DEFAULT_STUB(OS_FileSysStopVolume_Impl, (uint32 filesys_id)) -UT_DEFAULT_STUB(OS_FileSysFormatVolume_Impl, (uint32 filesys_id)) -UT_DEFAULT_STUB(OS_FileSysCheckVolume_Impl, (uint32 filesys_id, bool repair)) -UT_DEFAULT_STUB(OS_FileSysMountVolume_Impl, (uint32 filesys_id)) -UT_DEFAULT_STUB(OS_FileSysUnmountVolume_Impl, (uint32 filesys_id)) +UT_DEFAULT_STUB(OS_FileSysStartVolume_Impl, (osal_index_t filesys_id)) +UT_DEFAULT_STUB(OS_FileSysStopVolume_Impl, (osal_index_t filesys_id)) +UT_DEFAULT_STUB(OS_FileSysFormatVolume_Impl, (osal_index_t filesys_id)) +UT_DEFAULT_STUB(OS_FileSysCheckVolume_Impl, (osal_index_t filesys_id, bool repair)) +UT_DEFAULT_STUB(OS_FileSysMountVolume_Impl, (osal_index_t filesys_id)) +UT_DEFAULT_STUB(OS_FileSysUnmountVolume_Impl, (osal_index_t filesys_id)) -int32 OS_FileSysStatVolume_Impl(uint32 filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) { int32 Status = UT_DEFAULT_IMPL(OS_FileSysStatVolume_Impl); diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c index f3546e9f9..93440c93d 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c @@ -38,5 +38,5 @@ * Table locking and unlocking for global objects can be done at the shared code * layer but the actual implementation is OS-specific */ -UT_DEFAULT_STUB(OS_Lock_Global_Impl, (uint32 idtype)) -UT_DEFAULT_STUB(OS_Unlock_Global_Impl, (uint32 idtype)) +UT_DEFAULT_STUB(OS_Lock_Global_Impl, (osal_objtype_t idtype)) +UT_DEFAULT_STUB(OS_Unlock_Global_Impl, (osal_objtype_t idtype)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c index 621bcab7c..c92e8ce31 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c @@ -36,9 +36,9 @@ /* * Module Loader API */ -UT_DEFAULT_STUB(OS_ModuleLoad_Impl, (uint32 module_id, const char *translated_path)) -UT_DEFAULT_STUB(OS_ModuleUnload_Impl, (uint32 module_id)) -UT_DEFAULT_STUB(OS_ModuleGetInfo_Impl, (uint32 module_id, OS_module_prop_t *module_prop)) +UT_DEFAULT_STUB(OS_ModuleLoad_Impl, (osal_index_t module_id, const char *translated_path)) +UT_DEFAULT_STUB(OS_ModuleUnload_Impl, (osal_index_t module_id)) +UT_DEFAULT_STUB(OS_ModuleGetInfo_Impl, (osal_index_t module_id, OS_module_prop_t *module_prop)) UT_DEFAULT_STUB(OS_GlobalSymbolLookup_Impl, (cpuaddr * SymbolAddress, const char *SymbolName)) -UT_DEFAULT_STUB(OS_ModuleSymbolLookup_Impl, (uint32 module_id, cpuaddr * SymbolAddress, const char *SymbolName)) -UT_DEFAULT_STUB(OS_SymbolTableDump_Impl, (const char *filename, uint32 size_limit)) +UT_DEFAULT_STUB(OS_ModuleSymbolLookup_Impl, (osal_index_t module_id, cpuaddr *SymbolAddress, const char *SymbolName)) +UT_DEFAULT_STUB(OS_SymbolTableDump_Impl, (const char *filename, size_t size_limit)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c index 7bc4230bc..6bbe47829 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c @@ -38,8 +38,8 @@ ** Mutex API */ -UT_DEFAULT_STUB(OS_MutSemCreate_Impl, (uint32 sem_id, uint32 options)) -UT_DEFAULT_STUB(OS_MutSemGive_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_MutSemTake_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_MutSemDelete_Impl, (uint32 sem_id)) -UT_DEFAULT_STUB(OS_MutSemGetInfo_Impl, (uint32 sem_id, OS_mut_sem_prop_t *mut_prop)) +UT_DEFAULT_STUB(OS_MutSemCreate_Impl, (osal_index_t sem_id, uint32 options)) +UT_DEFAULT_STUB(OS_MutSemGive_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_MutSemTake_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_MutSemDelete_Impl, (osal_index_t sem_id)) +UT_DEFAULT_STUB(OS_MutSemGetInfo_Impl, (osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c index e576d35ca..32cb5e40c 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c @@ -37,23 +37,24 @@ /* * Sockets API abstraction layer */ -UT_DEFAULT_STUB(OS_SocketOpen_Impl, (uint32 sock_id)) -UT_DEFAULT_STUB(OS_SocketClose_Impl, (uint32 sock_id)) -UT_DEFAULT_STUB(OS_SocketBind_Impl, (uint32 sock_id, const OS_SockAddr_t *Addr)) -UT_DEFAULT_STUB(OS_SocketAccept_Impl, (uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Addr, int32 timeout)) -UT_DEFAULT_STUB(OS_SocketConnect_Impl, (uint32 sock_id, const OS_SockAddr_t *Addr, int32 timeout)) +UT_DEFAULT_STUB(OS_SocketOpen_Impl, (osal_index_t sock_id)) +UT_DEFAULT_STUB(OS_SocketClose_Impl, (osal_index_t sock_id)) +UT_DEFAULT_STUB(OS_SocketBind_Impl, (osal_index_t sock_id, const OS_SockAddr_t *Addr)) +UT_DEFAULT_STUB(OS_SocketAccept_Impl, + (osal_index_t sock_id, osal_index_t connsock_id, OS_SockAddr_t *Addr, int32 timeout)) +UT_DEFAULT_STUB(OS_SocketConnect_Impl, (osal_index_t sock_id, const OS_SockAddr_t *Addr, int32 timeout)) UT_DEFAULT_STUB(OS_SocketRecvFrom_Impl, - (uint32 sock_id, void *buffer, uint32 buflen, OS_SockAddr_t *RemoteAddr, int32 timeout)) + (osal_index_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout)) UT_DEFAULT_STUB(OS_SocketSendTo_Impl, - (uint32 sock_id, const void *buffer, uint32 buflen, const OS_SockAddr_t *RemoteAddr)) -UT_DEFAULT_STUB(OS_SocketGetInfo_Impl, (uint32 sock_id, OS_socket_prop_t *sock_prop)) + (osal_index_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr)) +UT_DEFAULT_STUB(OS_SocketGetInfo_Impl, (osal_index_t sock_id, OS_socket_prop_t *sock_prop)) UT_DEFAULT_STUB(OS_SocketAddrInit_Impl, (OS_SockAddr_t * Addr, OS_SocketDomain_t Domain)) -UT_DEFAULT_STUB(OS_SocketAddrToString_Impl, (char *buffer, uint32 buflen, const OS_SockAddr_t *Addr)) +UT_DEFAULT_STUB(OS_SocketAddrToString_Impl, (char *buffer, size_t buflen, const OS_SockAddr_t *Addr)) UT_DEFAULT_STUB(OS_SocketAddrGetPort_Impl, (uint16 * PortNum, const OS_SockAddr_t *Addr)) UT_DEFAULT_STUB(OS_SocketAddrFromString_Impl, (OS_SockAddr_t * Addr, const char *string)) UT_DEFAULT_STUB(OS_SocketAddrSetPort_Impl, (OS_SockAddr_t * Addr, uint16 PortNum)) -UT_DEFAULT_STUB(OS_NetworkGetHostName_Impl, (char *host_name, uint32 name_len)) +UT_DEFAULT_STUB(OS_NetworkGetHostName_Impl, (char *host_name, size_t name_len)) int32 OS_NetworkGetID_Impl(int32 *IdBuf) { diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c index 306733f5b..222204017 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c @@ -38,8 +38,8 @@ ** Message Queue API */ -UT_DEFAULT_STUB(OS_QueueCreate_Impl, (uint32 queue_id, uint32 flags)) -UT_DEFAULT_STUB(OS_QueueDelete_Impl, (uint32 queue_id)) -UT_DEFAULT_STUB(OS_QueueGet_Impl, (uint32 queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout)) -UT_DEFAULT_STUB(OS_QueuePut_Impl, (uint32 queue_id, const void *data, uint32 size, uint32 flags)) -UT_DEFAULT_STUB(OS_QueueGetInfo_Impl, (uint32 queue_id, OS_queue_prop_t *queue_prop)) +UT_DEFAULT_STUB(OS_QueueCreate_Impl, (osal_index_t queue_id, uint32 flags)) +UT_DEFAULT_STUB(OS_QueueDelete_Impl, (osal_index_t queue_id)) +UT_DEFAULT_STUB(OS_QueueGet_Impl, (osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout)) +UT_DEFAULT_STUB(OS_QueuePut_Impl, (osal_index_t queue_id, const void *data, size_t size, uint32 flags)) +UT_DEFAULT_STUB(OS_QueueGetInfo_Impl, (osal_index_t queue_id, OS_queue_prop_t *queue_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c index f30e43840..1e3d84f25 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c @@ -33,5 +33,5 @@ #include "utstubs.h" #include "os-shared-select.h" -UT_DEFAULT_STUB(OS_SelectSingle_Impl, (uint32 stream_id, uint32 *SelectFlags, int32 msecs)) +UT_DEFAULT_STUB(OS_SelectSingle_Impl, (osal_index_t stream_id, uint32 *SelectFlags, int32 msecs)) UT_DEFAULT_STUB(OS_SelectMultiple_Impl, (OS_FdSet * ReadSet, OS_FdSet *WriteSet, int32 msecs)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c index 76acb04f9..56ad1c2ff 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c @@ -37,16 +37,16 @@ /* ** Task API */ -UT_DEFAULT_STUB(OS_TaskMatch_Impl, (uint32 task_id)) -UT_DEFAULT_STUB(OS_TaskCreate_Impl, (uint32 task_id, uint32 flags)) -UT_DEFAULT_STUB(OS_TaskDelete_Impl, (uint32 task_id)) +UT_DEFAULT_STUB(OS_TaskMatch_Impl, (osal_index_t task_id)) +UT_DEFAULT_STUB(OS_TaskCreate_Impl, (osal_index_t task_id, uint32 flags)) +UT_DEFAULT_STUB(OS_TaskDelete_Impl, (osal_index_t task_id)) void OS_TaskExit_Impl(void) { UT_DEFAULT_IMPL(OS_TaskExit_Impl); } UT_DEFAULT_STUB(OS_TaskDelay_Impl, (uint32 millisecond)) -UT_DEFAULT_STUB(OS_TaskSetPriority_Impl, (uint32 task_id, uint32 new_priority)) +UT_DEFAULT_STUB(OS_TaskSetPriority_Impl, (osal_index_t task_id, osal_priority_t new_priority)) osal_id_t OS_TaskGetId_Impl(void) { int32 status; @@ -60,12 +60,12 @@ osal_id_t OS_TaskGetId_Impl(void) return id; } -UT_DEFAULT_STUB(OS_TaskGetInfo_Impl, (uint32 task_id, OS_task_prop_t *task_prop)) +UT_DEFAULT_STUB(OS_TaskGetInfo_Impl, (osal_index_t task_id, OS_task_prop_t *task_prop)) UT_DEFAULT_STUB(OS_TaskRegister_Impl, (osal_id_t global_task_id)) -bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { return UT_DEFAULT_IMPL(OS_TaskIdMatchSystemData_Impl); } -UT_DEFAULT_STUB(OS_TaskValidateSystemData_Impl, (const void *sysdata, uint32 sysdata_size)) +UT_DEFAULT_STUB(OS_TaskValidateSystemData_Impl, (const void *sysdata, size_t sysdata_size)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c index 5d7e89fe6..31a28c24c 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c @@ -37,22 +37,22 @@ /* ** OS Time/Tick related API */ -UT_DEFAULT_STUB(OS_TimeBaseCreate_Impl, (uint32 timer_id)) -UT_DEFAULT_STUB(OS_TimeBaseSet_Impl, (uint32 timer_id, int32 start_time, int32 interval_time)) -UT_DEFAULT_STUB(OS_TimeBaseDelete_Impl, (uint32 timer_id)) -void OS_TimeBaseLock_Impl(uint32 timebase_id) +UT_DEFAULT_STUB(OS_TimeBaseCreate_Impl, (osal_index_t timer_id)) +UT_DEFAULT_STUB(OS_TimeBaseSet_Impl, (osal_index_t timer_id, int32 start_time, int32 interval_time)) +UT_DEFAULT_STUB(OS_TimeBaseDelete_Impl, (osal_index_t timer_id)) +void OS_TimeBaseLock_Impl(osal_index_t timebase_id) { UT_DEFAULT_IMPL(OS_TimeBaseLock_Impl); } -void OS_TimeBaseUnlock_Impl(uint32 timebase_id) +void OS_TimeBaseUnlock_Impl(osal_index_t timebase_id) { UT_DEFAULT_IMPL(OS_TimeBaseUnlock_Impl); } -UT_DEFAULT_STUB(OS_TimeBaseGetInfo_Impl, (uint32 timer_id, OS_timebase_prop_t *timer_prop)) +UT_DEFAULT_STUB(OS_TimeBaseGetInfo_Impl, (osal_index_t timer_id, OS_timebase_prop_t *timer_prop)) -UT_DEFAULT_STUB(OS_TimeBaseRegister_Impl, (uint32 timebase_id)) +UT_DEFAULT_STUB(OS_TimeBaseRegister_Impl, (osal_index_t timebase_id)) /* * Clock API low-level handlers */ diff --git a/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c index 58778d7f0..c4fdbee58 100644 --- a/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c @@ -37,7 +37,7 @@ /* ** Console output API (printf) */ -void OS_ConsoleOutput_Impl(uint32 local_id) +void OS_ConsoleOutput_Impl(osal_index_t local_id) { UT_DEFAULT_IMPL(OS_ConsoleOutput_Impl); } diff --git a/src/unit-test-coverage/ut-stubs/src/posix-unistd-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-unistd-stubs.c index 20cff601a..b23a44845 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-unistd-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-unistd-stubs.c @@ -99,7 +99,7 @@ OCS_off_t OCS_lseek(int fd, OCS_off_t offset, int whence) OCS_ssize_t OCS_read(int fd, void *buf, size_t n) { int32 Status; - uint32 CopySize; + size_t CopySize; Status = UT_DEFAULT_IMPL_RC(OCS_read, OCS_MAX_RDWR_SIZE); @@ -159,7 +159,7 @@ long int OCS_sysconf(int name) OCS_ssize_t OCS_write(int fd, const void *buf, size_t n) { int32 Status; - uint32 CopySize; + size_t CopySize; Status = UT_DEFAULT_IMPL_RC(OCS_write, OCS_MAX_RDWR_SIZE); diff --git a/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c b/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c index d72d25a91..61499b1a3 100644 --- a/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c @@ -53,7 +53,7 @@ OCS_VOIDFUNCPTR *OCS_INUM_TO_IVEC(unsigned int ui) int32 Status = UT_DEFAULT_IMPL(OCS_INUM_TO_IVEC); OCS_VOIDFUNCPTR *VecTbl; OCS_VOIDFUNCPTR DummyVec; - uint32 VecTblSize; + size_t VecTblSize; if (Status == 0) { diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h index 72dec2e7a..09e32d736 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h @@ -42,6 +42,6 @@ extern void UT_ConsoleTest_TaskEntry(int arg); /** * Force the "is_async" field to a given state for coverage testing */ -extern void UT_ConsoleTest_SetConsoleAsync(uint32 local_id, bool is_async); +extern void UT_ConsoleTest_SetConsoleAsync(osal_index_t local_id, bool is_async); #endif /* INCLUDE_UT_ADAPTOR_CONSOLE_H_ */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h index 23ddfad9d..949902ff8 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h @@ -53,6 +53,6 @@ extern int32 UT_Call_OS_VxWorks_StreamAPI_Impl_Init(void); unsigned int UT_FileTest_GetSelfEUID(void); unsigned int UT_FileTest_GetSelfEGID(void); -void UT_FileTest_Set_Selectable(uint32 local_id, bool is_selectable); +void UT_FileTest_Set_Selectable(osal_index_t local_id, bool is_selectable); #endif /* INCLUDE_UT_ADAPTOR_FILES_H_ */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h index 8049ee0d9..8bba10b82 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h @@ -34,6 +34,6 @@ extern void *const UT_Ref_OS_impl_filesys_table; extern size_t const UT_Ref_OS_impl_filesys_table_SIZE; -void UT_FileSysTest_SetupFileSysEntry(uint32 id, OCS_BLK_DEV *blkdev, OCS_device_t xbddev, uint32 MaxParts); +void UT_FileSysTest_SetupFileSysEntry(osal_index_t id, OCS_BLK_DEV *blkdev, OCS_device_t xbddev, uint32 MaxParts); #endif /* INCLUDE_UT_ADAPTOR_FILESYS_H_ */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h index cd8b50127..53e158e1e 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h @@ -39,7 +39,7 @@ * but are not part of the implementation API. * *****************************************************/ -int32 UT_Call_OS_VxWorks_TableMutex_Init(uint32 idtype); -void UT_IdMapTest_SetImplTableMutex(uint32 idtype, OCS_SEM_ID vxid); +int32 UT_Call_OS_VxWorks_TableMutex_Init(osal_objtype_t idtype); +void UT_IdMapTest_SetImplTableMutex(osal_objtype_t idtype, OCS_SEM_ID vxid); #endif /* INCLUDE_UT_ADAPTOR_IDMAP_H_ */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h index b29ec05c4..a234335fe 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h @@ -30,6 +30,6 @@ #include -int32 UT_SymTabTest_CallIteratorFunc(const char *name, void *val, uint32 TestSize, uint32 SizeLimit); +int32 UT_SymTabTest_CallIteratorFunc(const char *name, void *val, size_t TestSize, size_t SizeLimit); #endif /* INCLUDE_UT_ADAPTOR_SYMTAB_H_ */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h index d2b3a44bc..e63fc68a6 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h @@ -44,8 +44,8 @@ extern size_t const UT_Ref_OS_impl_task_table_SIZE; *****************************************************/ int32 UT_Call_OS_VxWorks_TaskAPI_Impl_Init(void); -void UT_TaskTest_SetImplTaskId(uint32 local_id, OCS_TASK_ID TaskId); +void UT_TaskTest_SetImplTaskId(osal_index_t local_id, OCS_TASK_ID TaskId); int UT_TaskTest_CallEntryPoint(int arg); -OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(uint32 local_id); +OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(osal_index_t local_id); #endif /* INCLUDE_UT_ADAPTOR_TASKS_H_ */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h index 19cac7f67..6bb020cfd 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h @@ -37,27 +37,27 @@ extern size_t const UT_Ref_OS_impl_timebase_table_SIZE; int32 UT_Call_OS_VxWorks_TimeBaseAPI_Impl_Init(void); -void UT_TimeBaseTest_Setup(uint32 local_id, int signo, bool reset_flag); +void UT_TimeBaseTest_Setup(osal_index_t local_id, int signo, bool reset_flag); /** * Invokes OS_VxWorks_SigWait() with the given arguments. * This is normally a static function but exposed via a non-static wrapper for UT purposes. */ -int32 UT_TimeBaseTest_CallSigWaitFunc(uint32 local_id); +int32 UT_TimeBaseTest_CallSigWaitFunc(osal_index_t local_id); /* Invokes the static OS_VxWorks_TimeBaseTask() function with given argument */ int UT_TimeBaseTest_CallHelperTaskFunc(int arg); /* Invokes the static OS_VxWorks_RegisterTimer() function with given argument */ -void UT_TimeBaseTest_CallRegisterTimer(uint32 local_id); +void UT_TimeBaseTest_CallRegisterTimer(osal_index_t local_id); /* Hook functions which set the timer registration state */ -void UT_TimeBaseTest_SetTimeBaseRegState(uint32 local_id, bool is_success); -void UT_TimeBaseTest_ClearTimeBaseRegState(uint32 local_id); +void UT_TimeBaseTest_SetTimeBaseRegState(osal_index_t local_id, bool is_success); +void UT_TimeBaseTest_ClearTimeBaseRegState(osal_index_t local_id); /* Hook functions which test the timer registration state */ -bool UT_TimeBaseTest_CheckTimeBaseRegisteredState(uint32 local_id); -bool UT_TimeBaseTest_CheckTimeBaseErrorState(uint32 local_id); +bool UT_TimeBaseTest_CheckTimeBaseRegisteredState(osal_index_t local_id); +bool UT_TimeBaseTest_CheckTimeBaseErrorState(osal_index_t local_id); /* Invoke the internal UsecToTimespec API */ void UT_TimeBaseTest_UsecToTimespec(uint32 usecs, struct OCS_timespec *time_spec); diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-console.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-console.c index b0f280feb..8d474d81c 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-console.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-console.c @@ -40,7 +40,7 @@ void UT_ConsoleTest_TaskEntry(int arg) OS_VxWorks_ConsoleTask_Entry(arg); } -void UT_ConsoleTest_SetConsoleAsync(uint32 local_id, bool is_async) +void UT_ConsoleTest_SetConsoleAsync(osal_index_t local_id, bool is_async) { OS_impl_console_table[local_id].is_async = is_async; } diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-files.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-files.c index 2cdd8d7c2..017750b9e 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-files.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-files.c @@ -53,7 +53,7 @@ unsigned int UT_FileTest_GetSelfEGID(void) return OS_IMPL_SELF_EGID; } -void UT_FileTest_Set_Selectable(uint32 local_id, bool is_selectable) +void UT_FileTest_Set_Selectable(osal_index_t local_id, bool is_selectable) { OS_impl_filehandle_table[local_id].selectable = is_selectable; } diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filesys.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filesys.c index 9094de350..0e5331f22 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filesys.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filesys.c @@ -34,7 +34,7 @@ void *const UT_Ref_OS_impl_filesys_table = OS_impl_filesys_table; size_t const UT_Ref_OS_impl_filesys_table_SIZE = sizeof(OS_impl_filesys_table); -void UT_FileSysTest_SetupFileSysEntry(uint32 id, OCS_BLK_DEV *blkdev, OCS_device_t xbddev, uint32 MaxParts) +void UT_FileSysTest_SetupFileSysEntry(osal_index_t id, OCS_BLK_DEV *blkdev, OCS_device_t xbddev, uint32 MaxParts) { OS_impl_filesys_table[id].blkDev = blkdev; OS_impl_filesys_table[id].xbd = xbddev; diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filetable-stub.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filetable-stub.c index 9af7e1383..20af8c951 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filetable-stub.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-filetable-stub.c @@ -31,7 +31,7 @@ #include #include -OS_VxWorks_filehandle_entry_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; +OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; void *const UT_FileTableTest_OS_impl_filehandle_table = OS_impl_filehandle_table; size_t const UT_FileTableTest_OS_impl_filehandle_table_SIZE = sizeof(OS_impl_filehandle_table); diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c index f4053559b..4b4440eb7 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c @@ -32,12 +32,12 @@ #include #include "ut-adaptor-idmap.h" -int32 UT_Call_OS_VxWorks_TableMutex_Init(uint32 idtype) +int32 UT_Call_OS_VxWorks_TableMutex_Init(osal_objtype_t idtype) { return OS_VxWorks_TableMutex_Init(idtype); } -void UT_IdMapTest_SetImplTableMutex(uint32 idtype, OCS_SEM_ID vxid) +void UT_IdMapTest_SetImplTableMutex(osal_objtype_t idtype, OCS_SEM_ID vxid) { VX_MUTEX_TABLE[idtype].vxid = vxid; } diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-symtab.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-symtab.c index 61e5a37a7..5cdbb8d10 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-symtab.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-symtab.c @@ -36,7 +36,7 @@ * A UT-specific wrapper function to invoke the Symbol Table Iterator. * This is normally static so it needs this wrapper to call it. */ -int32 UT_SymTabTest_CallIteratorFunc(const char *name, void *val, uint32 TestSize, uint32 SizeLimit) +int32 UT_SymTabTest_CallIteratorFunc(const char *name, void *val, size_t TestSize, size_t SizeLimit) { OS_VxWorks_SymbolDumpState.Sizelimit = SizeLimit; OS_VxWorks_SymbolDumpState.CurrSize = TestSize; diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c index 10f06f39e..2b2d19edf 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c @@ -40,7 +40,7 @@ int32 UT_Call_OS_VxWorks_TaskAPI_Impl_Init(void) return OS_VxWorks_TaskAPI_Impl_Init(); } -void UT_TaskTest_SetImplTaskId(uint32 local_id, OCS_TASK_ID TaskId) +void UT_TaskTest_SetImplTaskId(osal_index_t local_id, OCS_TASK_ID TaskId) { OS_impl_task_table[local_id].vxid = TaskId; } @@ -55,7 +55,7 @@ int UT_TaskTest_CallEntryPoint(int arg) return OS_VxWorks_TaskEntry(arg); } -OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(uint32 local_id) +OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(osal_index_t local_id) { return &OS_impl_task_table[local_id].tcb; } diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c index 0806059b8..0ec0b7a2b 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c @@ -40,7 +40,7 @@ int32 UT_Call_OS_VxWorks_TimeBaseAPI_Impl_Init(void) return OS_VxWorks_TimeBaseAPI_Impl_Init(); } -int32 UT_TimeBaseTest_CallSigWaitFunc(uint32 local_id) +int32 UT_TimeBaseTest_CallSigWaitFunc(osal_index_t local_id) { return OS_VxWorks_SigWait(local_id); } @@ -50,27 +50,27 @@ int UT_TimeBaseTest_CallHelperTaskFunc(int arg) return OS_VxWorks_TimeBaseTask(arg); } -void UT_TimeBaseTest_CallRegisterTimer(uint32 local_id) +void UT_TimeBaseTest_CallRegisterTimer(osal_index_t local_id) { OS_VxWorks_RegisterTimer(local_id); } -bool UT_TimeBaseTest_CheckTimeBaseRegisteredState(uint32 local_id) +bool UT_TimeBaseTest_CheckTimeBaseRegisteredState(osal_index_t local_id) { return (OS_impl_timebase_table[local_id].timer_state == OS_TimerRegState_SUCCESS); } -bool UT_TimeBaseTest_CheckTimeBaseErrorState(uint32 local_id) +bool UT_TimeBaseTest_CheckTimeBaseErrorState(osal_index_t local_id) { return (OS_impl_timebase_table[local_id].timer_state == OS_TimerRegState_ERROR); } -void UT_TimeBaseTest_ClearTimeBaseRegState(uint32 local_id) +void UT_TimeBaseTest_ClearTimeBaseRegState(osal_index_t local_id) { OS_impl_timebase_table[local_id].timer_state = OS_TimerRegState_INIT; } -void UT_TimeBaseTest_SetTimeBaseRegState(uint32 local_id, bool is_success) +void UT_TimeBaseTest_SetTimeBaseRegState(osal_index_t local_id, bool is_success) { /* Mimic the setting of the Reg state global, which * is typically done by the task after spawning @@ -90,7 +90,7 @@ void UT_TimeBaseTest_UsecToTimespec(uint32 usecs, struct OCS_timespec *time_spec OS_VxWorks_UsecToTimespec(usecs, time_spec); } -void UT_TimeBaseTest_Setup(uint32 local_id, int signo, bool reset_flag) +void UT_TimeBaseTest_Setup(osal_index_t local_id, int signo, bool reset_flag) { static OCS_WIND_TCB FAKE_TASK; static OCS_SEM FAKE_SEM; diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c b/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c index 931f7f37d..646205e51 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c @@ -50,10 +50,10 @@ void Test_OS_BinSemCreate_Impl(void) * Test Case For: * int32 OS_BinSemCreate_Impl (uint32 sem_id, uint32 initial_value, uint32 options) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(0, 0, 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_semBInitialize), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(0, 0, 0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SEM_FAILURE); } void Test_OS_BinSemDelete_Impl(void) @@ -62,7 +62,7 @@ void Test_OS_BinSemDelete_Impl(void) * Test Case For: * int32 OS_BinSemDelete_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemDelete_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemDelete_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_BinSemGive_Impl(void) @@ -71,10 +71,10 @@ void Test_OS_BinSemGive_Impl(void) * Test Case For: * int32 OS_BinSemGive_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(UT_INDEX_0), OS_SUCCESS); UT_SetForceFail(UT_StubKey_GenericSemGive, OS_SEM_FAILURE); - OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(UT_INDEX_0), OS_SEM_FAILURE); } void Test_OS_BinSemFlush_Impl(void) @@ -83,10 +83,10 @@ void Test_OS_BinSemFlush_Impl(void) * Test Case For: * int32 OS_BinSemFlush_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(UT_INDEX_0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_semFlush), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(UT_INDEX_0), OS_SEM_FAILURE); } void Test_OS_BinSemTake_Impl(void) @@ -95,7 +95,7 @@ void Test_OS_BinSemTake_Impl(void) * Test Case For: * int32 OS_BinSemTake_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemTake_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemTake_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_BinSemTimedWait_Impl(void) @@ -104,13 +104,13 @@ void Test_OS_BinSemTimedWait_Impl(void) * Test Case For: * int32 OS_BinSemTimedWait_Impl ( uint32 sem_id, uint32 msecs ) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(0, 100), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(UT_INDEX_0, 100), OS_SUCCESS); UT_SetForceFail(UT_StubKey_GenericSemTake, OS_SEM_FAILURE); - OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(0, 100), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(UT_INDEX_0, 100), OS_SEM_FAILURE); UT_SetForceFail(UT_KEY(OS_Milli2Ticks), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(0, 100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(UT_INDEX_0, 100), OS_ERROR); } void Test_OS_BinSemGetInfo_Impl(void) @@ -121,7 +121,7 @@ void Test_OS_BinSemGetInfo_Impl(void) */ OS_bin_sem_prop_t sem_prop; memset(&sem_prop, 0xEE, sizeof(sem_prop)); - OSAPI_TEST_FUNCTION_RC(OS_BinSemGetInfo_Impl(0, &sem_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemGetInfo_Impl(UT_INDEX_0, &sem_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c b/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c index f29a015c4..77e3e5a81 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c @@ -46,10 +46,10 @@ void Test_OS_CountSemCreate_Impl(void) * Test Case For: * int32 OS_CountSemCreate_Impl (uint32 sem_id, uint32 sem_initial_value, uint32 options) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(0, 0, 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_semCInitialize), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(0, 0, 0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SEM_FAILURE); } void Test_OS_CountSemDelete_Impl(void) @@ -58,7 +58,7 @@ void Test_OS_CountSemDelete_Impl(void) * Test Case For: * int32 OS_CountSemDelete_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemDelete_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_CountSemDelete_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_CountSemGive_Impl(void) @@ -67,7 +67,7 @@ void Test_OS_CountSemGive_Impl(void) * Test Case For: * int32 OS_CountSemGive_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemGive_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_CountSemGive_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_CountSemTake_Impl(void) @@ -76,7 +76,7 @@ void Test_OS_CountSemTake_Impl(void) * Test Case For: * int32 OS_CountSemTake_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemTake_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_CountSemTake_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_CountSemTimedWait_Impl(void) @@ -85,10 +85,10 @@ void Test_OS_CountSemTimedWait_Impl(void) * Test Case For: * int32 OS_CountSemTimedWait_Impl ( uint32 sem_id, uint32 msecs ) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(0, 100), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(UT_INDEX_0, 100), OS_SUCCESS); UT_SetForceFail(UT_KEY(OS_Milli2Ticks), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(0, 100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(UT_INDEX_0, 100), OS_ERROR); } void Test_OS_CountSemGetInfo_Impl(void) @@ -99,7 +99,7 @@ void Test_OS_CountSemGetInfo_Impl(void) */ OS_count_sem_prop_t count_prop; memset(&count_prop, 0xEE, sizeof(count_prop)); - OSAPI_TEST_FUNCTION_RC(OS_CountSemGetInfo_Impl(0, &count_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_CountSemGetInfo_Impl(UT_INDEX_0, &count_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c index f896cb598..62c981df6 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c @@ -63,9 +63,9 @@ void Test_OS_DirOpen_Impl(void) * Test Case For: * int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) */ - OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(0, "dir"), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(UT_INDEX_0, "dir"), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_opendir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(0, "dir"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(UT_INDEX_0, "dir"), OS_ERROR); } void Test_OS_DirClose_Impl(void) @@ -74,7 +74,7 @@ void Test_OS_DirClose_Impl(void) * Test Case For: * int32 OS_DirClose_Impl(uint32 local_id) */ - OSAPI_TEST_FUNCTION_RC(OS_DirClose_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirClose_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_DirRead_Impl(void) @@ -85,10 +85,10 @@ void Test_OS_DirRead_Impl(void) */ os_dirent_t dirent_buff; - OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(0, &dirent_buff), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(UT_INDEX_0, &dirent_buff), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_readdir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(0, &dirent_buff), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(UT_INDEX_0, &dirent_buff), OS_ERROR); } void Test_OS_DirRewind_Impl(void) @@ -97,7 +97,7 @@ void Test_OS_DirRewind_Impl(void) * Test Case For: * int32 OS_DirRewind_Impl(uint32 local_id) */ - OSAPI_TEST_FUNCTION_RC(OS_DirRewind_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirRewind_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_DirRemove_Impl(void) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c index 4fede680c..c22d56229 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c @@ -50,12 +50,12 @@ void Test_OS_ModuleLoad_Impl(void) /* Test Case For: * int32 OS_ModuleLoad_Impl ( uint32 module_id, char *translated_path ) */ - OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(UT_INDEX_0, "local"), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(UT_INDEX_0, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); UT_SetForceFail(UT_KEY(OCS_loadModule), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(UT_INDEX_0, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_loadModule)); } @@ -64,9 +64,9 @@ void Test_OS_ModuleUnload_Impl(void) /* Test Case For: * int32 OS_ModuleUnload_Impl ( uint32 module_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(UT_INDEX_0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_unldByModuleId), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(UT_INDEX_0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_unldByModuleId)); } @@ -78,7 +78,7 @@ void Test_OS_ModuleGetInfo_Impl(void) OS_module_prop_t module_prop; memset(&module_prop, 0, sizeof(module_prop)); - OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(0, &module_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(UT_INDEX_0, &module_prop), OS_SUCCESS); UtAssert_True(module_prop.addr.valid, "addresses in output valid"); /* @@ -87,7 +87,7 @@ void Test_OS_ModuleGetInfo_Impl(void) */ memset(&module_prop, 0, sizeof(module_prop)); UT_SetForceFail(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(0, &module_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(UT_INDEX_0, &module_prop), OS_SUCCESS); UT_ClearForceFail(UT_KEY(OCS_moduleInfoGet)); UtAssert_True(!module_prop.addr.valid, "addresses in output not valid"); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c b/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c index bceac85b3..b9bcf518f 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c @@ -43,10 +43,10 @@ void Test_OS_MutSemCreate_Impl(void) * Test Case For: * int32 OS_MutSemCreate_Impl (uint32 sem_id, uint32 options) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(0, 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(UT_INDEX_0, 0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_semMInitialize), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(0, 0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(UT_INDEX_0, 0), OS_SEM_FAILURE); } void Test_OS_MutSemDelete_Impl(void) @@ -55,7 +55,7 @@ void Test_OS_MutSemDelete_Impl(void) * Test Case For: * int32 OS_MutSemDelete_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemDelete_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_MutSemDelete_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_MutSemGive_Impl(void) @@ -64,7 +64,7 @@ void Test_OS_MutSemGive_Impl(void) * Test Case For: * int32 OS_MutSemGive_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemGive_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_MutSemGive_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_MutSemTake_Impl(void) @@ -73,7 +73,7 @@ void Test_OS_MutSemTake_Impl(void) * Test Case For: * int32 OS_MutSemTake_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemTake_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_MutSemTake_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_MutSemGetInfo_Impl(void) @@ -84,7 +84,7 @@ void Test_OS_MutSemGetInfo_Impl(void) */ OS_mut_sem_prop_t mut_prop; memset(&mut_prop, 0xEE, sizeof(mut_prop)); - OSAPI_TEST_FUNCTION_RC(OS_MutSemGetInfo_Impl(0, &mut_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_MutSemGetInfo_Impl(UT_INDEX_0, &mut_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-queues.c b/src/unit-test-coverage/vxworks/src/coveragetest-queues.c index 7c059a148..3df7923ad 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-queues.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-queues.c @@ -47,10 +47,10 @@ void Test_OS_QueueCreate_Impl(void) * Test Case For: * int32 OS_QueueCreate_Impl (uint32 queue_id, uint32 flags) */ - OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(0, 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(UT_INDEX_0, 0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_msgQCreate), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(0, 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(UT_INDEX_0, 0), OS_ERROR); } void Test_OS_QueueDelete_Impl(void) @@ -59,10 +59,10 @@ void Test_OS_QueueDelete_Impl(void) * Test Case For: * int32 OS_QueueDelete_Impl (uint32 queue_id) */ - OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(UT_INDEX_0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_msgQDelete), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(UT_INDEX_0), OS_ERROR); } void Test_OS_QueueGet_Impl(void) @@ -72,22 +72,22 @@ void Test_OS_QueueGet_Impl(void) * int32 OS_QueueGet_Impl (uint32 queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) */ char Data[16]; - uint32 ActSz; + size_t ActSz; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, OS_PEND), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, 100), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_PEND), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, 100), OS_SUCCESS); UT_SetForceFail(UT_KEY(OS_Milli2Ticks), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, 100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, 100), OS_ERROR); UT_SetForceFail(UT_KEY(OCS_msgQReceive), OCS_ERROR); OCS_errno = OCS_S_objLib_OBJ_TIMEOUT; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_TIMEOUT); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_TIMEOUT); OCS_errno = OCS_S_objLib_OBJ_UNAVAILABLE; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_EMPTY); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_EMPTY); OCS_errno = 0; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_ERROR); } void Test_OS_QueuePut_Impl(void) @@ -97,13 +97,13 @@ void Test_OS_QueuePut_Impl(void) * int32 OS_QueuePut_Impl (uint32 queue_id, const void *data, uint32 size, uint32 flags) */ char Data[16] = "Test"; - OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(0, Data, sizeof(Data), 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(UT_INDEX_0, Data, sizeof(Data), 0), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_msgQSend), OCS_ERROR); OCS_errno = OCS_S_objLib_OBJ_UNAVAILABLE; - OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(0, Data, sizeof(Data), 0), OS_QUEUE_FULL); + OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(UT_INDEX_0, Data, sizeof(Data), 0), OS_QUEUE_FULL); OCS_errno = 0; - OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(0, Data, sizeof(Data), 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(UT_INDEX_0, Data, sizeof(Data), 0), OS_ERROR); } void Test_OS_QueueGetInfo_Impl(void) @@ -114,7 +114,7 @@ void Test_OS_QueueGetInfo_Impl(void) */ OS_queue_prop_t queue_prop; memset(&queue_prop, 0xEE, sizeof(queue_prop)); - OSAPI_TEST_FUNCTION_RC(OS_QueueGetInfo_Impl(0, &queue_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGetInfo_Impl(UT_INDEX_0, &queue_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-shell.c b/src/unit-test-coverage/vxworks/src/coveragetest-shell.c index af2897453..f60a15d07 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-shell.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-shell.c @@ -47,7 +47,7 @@ void Test_OS_ShellOutputToFile_Impl(void) */ UT_SetDeferredRetcode(UT_KEY(OCS_taskNameToId), 2, -1); - actual = OS_ShellOutputToFile_Impl(0, "TestCmd"); + actual = OS_ShellOutputToFile_Impl(UT_INDEX_0, "TestCmd"); UtAssert_True(actual == expected, "OS_ShellOutputToFile_Impl() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_shellGenericInit)) == 1, "shellGenericInit() called"); @@ -55,7 +55,7 @@ void Test_OS_ShellOutputToFile_Impl(void) /* failure to open the output file */ UT_SetForceFail(UT_KEY(OS_OpenCreate), OS_ERROR); expected = OS_ERROR; - actual = OS_ShellOutputToFile_Impl(0, "TestCmd"); + actual = OS_ShellOutputToFile_Impl(UT_INDEX_0, "TestCmd"); UtAssert_True(actual == expected, "OS_ShellOutputToFile_Impl() (%ld) == OS_ERROR", (long)actual); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index b2f107f08..af92067f8 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -54,10 +54,10 @@ void Test_OS_ModuleSymbolLookup_Impl(void) */ cpuaddr SymAddr; - OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(0, &SymAddr, "symname"), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(0, NULL, NULL), OS_INVALID_POINTER); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, &SymAddr, "symname"), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, NULL, NULL), OS_INVALID_POINTER); UT_SetForceFail(UT_KEY(OCS_symFind), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(0, &SymAddr, "symname"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, &SymAddr, "symname"), OS_ERROR); } void Test_OS_SymTableIterator_Impl(void) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c index 0fd7b96ab..f67a8822e 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c @@ -71,10 +71,10 @@ void Test_OS_TaskCreate_Impl(void) * The first call checks the failure path and ensures that a malloc failure gets handled */ OS_task_table[0].stack_size = 250; UT_SetForceFail(UT_KEY(OCS_malloc), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(0, 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, 0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_malloc)); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(0, OS_FP_ENABLED), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, OS_FP_ENABLED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_malloc)) == 2, "malloc() called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_free)) == 0, "free() not called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskInit)) == 1, "taskInit() called"); @@ -82,7 +82,7 @@ void Test_OS_TaskCreate_Impl(void) /* create again with smaller stack - this should re-use existing buffer */ OS_task_table[0].stack_size = 100; - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(0, OS_FP_ENABLED), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, OS_FP_ENABLED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_malloc)) == 2, "malloc() not called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_free)) == 0, "free() not called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskInit)) == 2, "taskInit() called"); @@ -90,7 +90,7 @@ void Test_OS_TaskCreate_Impl(void) /* create again with larger stack - this should free existing and malloc() new buffer */ OS_task_table[0].stack_size = 400; - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(0, OS_FP_ENABLED), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, OS_FP_ENABLED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_malloc)) == 3, "malloc() called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_free)) == 1, "free() called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskInit)) == 3, "taskInit() called"); @@ -98,7 +98,7 @@ void Test_OS_TaskCreate_Impl(void) /* other failure modes */ UT_SetForceFail(UT_KEY(OCS_taskInit), -1); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(0, 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, 0), OS_ERROR); } void Test_OS_TaskMatch_Impl(void) @@ -107,10 +107,10 @@ void Test_OS_TaskMatch_Impl(void) * Test Case For: * int32 OS_TaskMatch_Impl(uint32 task_id) */ - UT_TaskTest_SetImplTaskId(0, OCS_taskIdSelf()); - OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(0), OS_SUCCESS); - UT_TaskTest_SetImplTaskId(0, (OCS_TASK_ID)0); - OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(0), OS_ERROR); + UT_TaskTest_SetImplTaskId(UT_INDEX_0, OCS_taskIdSelf()); + OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(UT_INDEX_0), OS_SUCCESS); + UT_TaskTest_SetImplTaskId(UT_INDEX_0, (OCS_TASK_ID)0); + OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(UT_INDEX_0), OS_ERROR); } void Test_OS_TaskDelete_Impl(void) @@ -119,11 +119,11 @@ void Test_OS_TaskDelete_Impl(void) * Test Case For: * int32 OS_TaskDelete_Impl (uint32 task_id) */ - OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(UT_INDEX_0), OS_SUCCESS); /* failure mode */ UT_SetForceFail(UT_KEY(OCS_taskDelete), -1); - OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(UT_INDEX_0), OS_ERROR); } void Test_OS_TaskExit_Impl(void) @@ -157,10 +157,10 @@ void Test_OS_TaskSetPriority_Impl(void) * Test Case For: * int32 OS_TaskSetPriority_Impl (uint32 task_id, uint32 new_priority) */ - OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(0, 100), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(UT_INDEX_0, OSAL_PRIORITY_C(100)), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_taskPrioritySet), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(0, 100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(UT_INDEX_0, OSAL_PRIORITY_C(100)), OS_ERROR); } void Test_OS_TaskRegister_Impl(void) @@ -184,7 +184,7 @@ void Test_OS_TaskGetId_Impl(void) memset(&id1, 0x11, sizeof(osal_id_t)); OS_global_task_table[1].active_id = id1; - TaskTcb = UT_TaskTest_GetTaskTcb(1); + TaskTcb = UT_TaskTest_GetTaskTcb(UT_INDEX_1); UT_SetDataBuffer(UT_KEY(OCS_taskTcb), &TaskTcb, sizeof(TaskTcb), false); id2 = OS_TaskGetId_Impl(); UtAssert_MemCmp(&id1, &id2, sizeof(osal_id_t), "OS_TaskGetId_Impl()"); @@ -198,7 +198,7 @@ void Test_OS_TaskGetInfo_Impl(void) */ OS_task_prop_t task_prop; memset(&task_prop, 0xEE, sizeof(task_prop)); - OSAPI_TEST_FUNCTION_RC(OS_TaskGetInfo_Impl(0, &task_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskGetInfo_Impl(UT_INDEX_0, &task_prop), OS_SUCCESS); } void Test_OS_TaskValidateSystemData_Impl(void) @@ -226,11 +226,11 @@ void Test_OS_TaskIdMatchSystemData_Impl(void) memset(&test_sys_id, 'x', sizeof(test_sys_id)); - UT_TaskTest_SetImplTaskId(0, test_sys_id); - OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, 0, NULL), true); + UT_TaskTest_SetImplTaskId(UT_INDEX_0, test_sys_id); + OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, UT_INDEX_0, NULL), true); memset(&test_sys_id, 'y', sizeof(test_sys_id)); - OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, 0, NULL), false); + OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, UT_INDEX_0, NULL), false); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c index 92ad9198a..36a747985 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c @@ -50,7 +50,7 @@ void Test_OS_TimeBaseLock_Impl(void) /* Test Case For: * void OS_TimeBaseLock_Impl(uint32 local_id) */ - OS_TimeBaseLock_Impl(0); + OS_TimeBaseLock_Impl(UT_INDEX_0); } void Test_OS_TimeBaseUnlock_Impl(void) @@ -58,13 +58,13 @@ void Test_OS_TimeBaseUnlock_Impl(void) /* Test Case For: * void OS_TimeBaseUnlock_Impl(uint32 local_id) */ - OS_TimeBaseUnlock_Impl(0); + OS_TimeBaseUnlock_Impl(UT_INDEX_0); } static int32 UT_TimeBaseTest_TimeBaseRegHook(void *UserObj, int32 StubRetcode, uint32 CallCount, const UT_StubContext_t *Context) { - UT_TimeBaseTest_SetTimeBaseRegState(0, true); + UT_TimeBaseTest_SetTimeBaseRegState(UT_INDEX_0, true); return 0; } @@ -109,19 +109,19 @@ void Test_OS_TimeBaseCreate_Impl(void) */ memset(&id, 0x01, sizeof(id)); OS_global_timebase_table[1].active_id = id; - UT_TimeBaseTest_Setup(1, OCS_SIGRTMIN, false); + UT_TimeBaseTest_Setup(UT_INDEX_1, OCS_SIGRTMIN, false); UT_SetForceFail(UT_KEY(OCS_sigismember), true); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_TIMER_ERR_UNAVAILABLE); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_UNAVAILABLE); UT_ResetState(UT_KEY(OCS_sigismember)); /* fail to initialize the sem */ UT_SetForceFail(UT_KEY(OCS_semMInitialize), -1); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_TIMER_ERR_INTERNAL); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_INTERNAL); UT_ClearForceFail(UT_KEY(OCS_semMInitialize)); /* fail to spawn the task */ UT_SetForceFail(UT_KEY(OCS_taskSpawn), -1); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_TIMER_ERR_INTERNAL); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_INTERNAL); UT_ClearForceFail(UT_KEY(OCS_taskSpawn)); /* @@ -129,7 +129,7 @@ void Test_OS_TimeBaseCreate_Impl(void) * this mimics the situation where the reg global is never * set past OS_TimerRegState_INIT */ - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_TIMER_ERR_INTERNAL); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_INTERNAL); /* * Do Nominal/success case now. @@ -137,7 +137,7 @@ void Test_OS_TimeBaseCreate_Impl(void) * mimic registration success */ UT_SetHookFunction(UT_KEY(OCS_taskSpawn), UT_TimeBaseTest_TimeBaseRegHook, NULL); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_SUCCESS); /* * For coverage, call the OS_VxWorks_TimeBaseTask() function. @@ -147,14 +147,14 @@ void Test_OS_TimeBaseCreate_Impl(void) /* * Check outputs of OS_VxWorks_RegisterTimer() function. */ - UT_TimeBaseTest_ClearTimeBaseRegState(0); - UT_TimeBaseTest_CallRegisterTimer(0); - UtAssert_True(UT_TimeBaseTest_CheckTimeBaseRegisteredState(0), "timer successfully registered"); + UT_TimeBaseTest_ClearTimeBaseRegState(UT_INDEX_0); + UT_TimeBaseTest_CallRegisterTimer(UT_INDEX_0); + UtAssert_True(UT_TimeBaseTest_CheckTimeBaseRegisteredState(UT_INDEX_0), "timer successfully registered"); - UT_TimeBaseTest_ClearTimeBaseRegState(0); + UT_TimeBaseTest_ClearTimeBaseRegState(UT_INDEX_0); UT_SetForceFail(UT_KEY(OCS_timer_create), -1); - UT_TimeBaseTest_CallRegisterTimer(0); - UtAssert_True(UT_TimeBaseTest_CheckTimeBaseErrorState(0), "timer registration failure state"); + UT_TimeBaseTest_CallRegisterTimer(UT_INDEX_0); + UtAssert_True(UT_TimeBaseTest_CheckTimeBaseErrorState(UT_INDEX_0), "timer registration failure state"); } void Test_OS_VxWorks_SigWait(void) @@ -175,17 +175,17 @@ void Test_OS_VxWorks_SigWait(void) memset(&config_value, 0, sizeof(config_value)); UT_SetDataBuffer(UT_KEY(OCS_timer_settime), &config_value, sizeof(config_value), false); UT_SetDataBuffer(UT_KEY(OCS_timer_gettime), &config_value, sizeof(config_value), false); - UT_TimeBaseTest_Setup(0, signo, true); - OS_TimeBaseSet_Impl(0, 1111111, 2222222); + UT_TimeBaseTest_Setup(UT_INDEX_0, signo, true); + OS_TimeBaseSet_Impl(UT_INDEX_0, 1111111, 2222222); UT_SetDataBuffer(UT_KEY(OCS_sigwait), &signo, sizeof(signo), false); - OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(0), 1111111); + OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(UT_INDEX_0), 1111111); UT_SetDataBuffer(UT_KEY(OCS_sigwait), &signo, sizeof(signo), false); - OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(0), 2222222); + OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(UT_INDEX_0), 2222222); UT_SetDataBuffer(UT_KEY(OCS_sigwait), &signo, sizeof(signo), false); - OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(0), 2222222); + OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(UT_INDEX_0), 2222222); - UT_TimeBaseTest_Setup(0, 0, false); + UT_TimeBaseTest_Setup(UT_INDEX_0, 0, false); OS_global_timebase_table[0].active_id = OS_OBJECT_ID_UNDEFINED; OS_timebase_table[0].nominal_interval_time = 0; } @@ -195,13 +195,13 @@ void Test_OS_TimeBaseSet_Impl(void) /* Test Case For: * int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time) */ - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(0, 1, 1), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(UT_INDEX_0, 1, 1), OS_ERR_NOT_IMPLEMENTED); - UT_TimeBaseTest_Setup(0, OCS_SIGRTMIN, false); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(0, 1, 1), OS_SUCCESS); + UT_TimeBaseTest_Setup(UT_INDEX_0, OCS_SIGRTMIN, false); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(UT_INDEX_0, 1, 1), OS_SUCCESS); UT_SetForceFail(UT_KEY(OCS_timer_settime), -1); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(0, 1, 1), OS_TIMER_ERR_INVALID_ARGS); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(UT_INDEX_0, 1, 1), OS_TIMER_ERR_INVALID_ARGS); } void Test_OS_TimeBaseDelete_Impl(void) @@ -209,8 +209,8 @@ void Test_OS_TimeBaseDelete_Impl(void) /* Test Case For: * int32 OS_TimeBaseDelete_Impl(uint32 timer_id) */ - UT_TimeBaseTest_Setup(0, OCS_SIGRTMIN, false); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseDelete_Impl(0), OS_SUCCESS); + UT_TimeBaseTest_Setup(UT_INDEX_0, OCS_SIGRTMIN, false); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseDelete_Impl(UT_INDEX_0), OS_SUCCESS); } void Test_OS_TimeBaseGetInfo_Impl(void) @@ -219,7 +219,7 @@ void Test_OS_TimeBaseGetInfo_Impl(void) * int32 OS_TimeBaseGetInfo_Impl (uint32 timer_id, OS_timebase_prop_t *timer_prop) */ OS_timebase_prop_t timer_prop; - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseGetInfo_Impl(0, &timer_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseGetInfo_Impl(UT_INDEX_0, &timer_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h index d51d0fb41..989f27da7 100644 --- a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h +++ b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h @@ -43,6 +43,10 @@ #define ADD_TEST(test) UtTest_Add((Test_##test), Osapi_Test_Setup, Osapi_Test_Teardown, #test) +#define UT_INDEX_0 OSAL_INDEX_C(0) +#define UT_INDEX_1 OSAL_INDEX_C(1) +#define UT_INDEX_2 OSAL_INDEX_C(2) + /* Osapi_Test_Setup * * Purpose: diff --git a/src/unit-test-coverage/vxworks/ut-stubs/src/vxworks-os-impl-common-stubs.c b/src/unit-test-coverage/vxworks/ut-stubs/src/vxworks-os-impl-common-stubs.c index 3457f101d..27339e688 100644 --- a/src/unit-test-coverage/vxworks/ut-stubs/src/vxworks-os-impl-common-stubs.c +++ b/src/unit-test-coverage/vxworks/ut-stubs/src/vxworks-os-impl-common-stubs.c @@ -31,7 +31,7 @@ #include #include -UT_DEFAULT_STUB(OS_API_Impl_Init, (uint32 idtype)) +UT_DEFAULT_STUB(OS_API_Impl_Init, (osal_objtype_t idtype)) int OS_VxWorks_GenericSemTake(OCS_SEM_ID vxid, int sys_ticks) { diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.c b/src/unit-tests/oscore-test/ut_oscore_misc_test.c index 07b066140..f54ca186e 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.c @@ -88,12 +88,14 @@ *--------------------------------------------------------------------------------*/ void UT_os_apiinit_test() { - int32 res = 0; - const char *testDesc; - osal_id_t qId; - uint32 qDepth = 10, qSize = 4, qFlags = 0; - osal_id_t semIds[3]; - uint32 semInitValue = 1, semOptions = 0; + int32 res = 0; + const char * testDesc; + osal_id_t qId; + osal_blockcount_t qDepth = OSAL_BLOCKCOUNT_C(10); + size_t qSize = OSAL_SIZE_C(4); + uint32 qFlags = 0; + osal_id_t semIds[3]; + uint32 semInitValue = 1, semOptions = 0; /*-----------------------------------------------------*/ testDesc = "#1 Init-not-call-first"; diff --git a/src/unit-tests/oscore-test/ut_oscore_queue_test.c b/src/unit-tests/oscore-test/ut_oscore_queue_test.c index d47dc6629..c991f3324 100644 --- a/src/unit-tests/oscore-test/ut_oscore_queue_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_queue_test.c @@ -83,7 +83,7 @@ void UT_os_queue_create_test() /*-----------------------------------------------------*/ testDesc = "API not implemented"; - res = OS_QueueCreate(&queue_id, "Good", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "Good", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res == OS_ERR_NOT_IMPLEMENTED) { UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); @@ -95,7 +95,7 @@ void UT_os_queue_create_test() /*-----------------------------------------------------*/ testDesc = "#1 Null-pointer-arg-1"; - res = OS_QueueCreate(NULL, "Queue1", 10, 4, 0); + res = OS_QueueCreate(NULL, "Queue1", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -104,7 +104,7 @@ void UT_os_queue_create_test() /*-----------------------------------------------------*/ testDesc = "#2 Null-pointer-arg-2"; - res = OS_QueueCreate(&queue_id, NULL, 10, 4, 0); + res = OS_QueueCreate(&queue_id, NULL, OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -115,7 +115,7 @@ void UT_os_queue_create_test() memset(long_queue_name, 'X', sizeof(long_queue_name)); long_queue_name[sizeof(long_queue_name) - 1] = '\0'; - res = OS_QueueCreate(&queue_id, long_queue_name, 10, 4, 0); + res = OS_QueueCreate(&queue_id, long_queue_name, OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res == OS_ERR_NAME_TOO_LONG) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -129,7 +129,7 @@ void UT_os_queue_create_test() { memset(queue_name, '\0', sizeof(queue_name)); UT_os_sprintf(queue_name, "QUEUE%d", i); - res = OS_QueueCreate(&queue_id, queue_name, 2, 4, 0); + res = OS_QueueCreate(&queue_id, queue_name, OSAL_BLOCKCOUNT_C(2), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#4 No-free-IDs - Queue Create failed"; @@ -141,7 +141,7 @@ void UT_os_queue_create_test() if (test_setup_invalid == 0) { - res = OS_QueueCreate(&queue_id, "OneTooMany", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "OneTooMany", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res == OS_ERR_NO_FREE_IDS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -155,14 +155,14 @@ void UT_os_queue_create_test() testDesc = "#5 Duplicate-name"; /* Setup */ - res = OS_QueueCreate(&queue_id2, "DUPLICATE", 10, 4, 0); + res = OS_QueueCreate(&queue_id2, "DUPLICATE", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { UT_OS_TEST_RESULT("Queue Create failed", UTASSERT_CASETYPE_TSF); } else { - res = OS_QueueCreate(&queue_id, "DUPLICATE", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "DUPLICATE", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res == OS_ERR_NAME_TAKEN) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -180,7 +180,7 @@ void UT_os_queue_create_test() /*-----------------------------------------------------*/ testDesc = "#7 Nominal"; - res = OS_QueueCreate(&queue_id, "Good", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "Good", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -235,7 +235,7 @@ void UT_os_queue_delete_test() testDesc = "#3 Nominal"; /* Setup */ - res = OS_QueueCreate(&queue_id, "DeleteTest", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "DeleteTest", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#3 Nominal - Queue Create failed"; @@ -272,13 +272,13 @@ void UT_os_queue_get_test() osal_id_t queue_id; uint32 queue_data_out; uint32 queue_data_in; - uint32 size_copied; - uint32 data_size; + size_t size_copied; + size_t data_size; /*-----------------------------------------------------*/ testDesc = "API not implemented"; - res = OS_QueueGet(OS_OBJECT_ID_UNDEFINED, (void *)&queue_data_in, 4, &size_copied, OS_CHECK); + res = OS_QueueGet(OS_OBJECT_ID_UNDEFINED, (void *)&queue_data_in, sizeof(uint32), &size_copied, OS_CHECK); if (res == OS_ERR_NOT_IMPLEMENTED) { UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); @@ -288,7 +288,7 @@ void UT_os_queue_get_test() /*-----------------------------------------------------*/ testDesc = "#1 Invalid-ID-arg"; - res = OS_QueueGet(UT_OBJID_INCORRECT, (void *)&queue_data_in, 4, &size_copied, OS_CHECK); + res = OS_QueueGet(UT_OBJID_INCORRECT, (void *)&queue_data_in, sizeof(uint32), &size_copied, OS_CHECK); if (res == OS_ERR_INVALID_ID) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -298,7 +298,7 @@ void UT_os_queue_get_test() testDesc = "#2 Invalid-pointer-arg-1"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueGet", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueGet", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#2 Invalid-pointer-arg-1 - Queue Create failed"; @@ -306,7 +306,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, NULL, 4, &size_copied, OS_CHECK); + res = OS_QueueGet(queue_id, NULL, sizeof(uint32), &size_copied, OS_CHECK); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -319,7 +319,7 @@ void UT_os_queue_get_test() testDesc = "#3 Invalid-pointer-arg-2"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueGet", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueGet", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#3 Invalid-pointer-arg-2 - Queue Create failed"; @@ -327,7 +327,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, (void *)&queue_data_in, 4, NULL, OS_CHECK); + res = OS_QueueGet(queue_id, (void *)&queue_data_in, sizeof(uint32), NULL, OS_CHECK); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -340,7 +340,7 @@ void UT_os_queue_get_test() testDesc = "#4 Queue-empty"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueEmpty", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueEmpty", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#4 Queue-empty - Queue Create failed"; @@ -348,7 +348,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, (void *)&queue_data_in, 4, &data_size, OS_CHECK); + res = OS_QueueGet(queue_id, (void *)&queue_data_in, sizeof(uint32), &data_size, OS_CHECK); if (res == OS_QUEUE_EMPTY) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -361,7 +361,7 @@ void UT_os_queue_get_test() testDesc = "#5 Queue-timed-out"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueTimeout", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueTimeout", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#5 Queue-timed-out - Queue Create failed"; @@ -369,7 +369,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, (void *)&queue_data_in, 4, &data_size, 2); + res = OS_QueueGet(queue_id, (void *)&queue_data_in, sizeof(uint32), &data_size, 2); if (res == OS_QUEUE_TIMEOUT) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -382,7 +382,7 @@ void UT_os_queue_get_test() testDesc = "#6 Invalid-queue-size"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueuePut", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueuePut", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#6 Invalid-queue-size - Queue Create failed"; @@ -391,7 +391,7 @@ void UT_os_queue_get_test() else { queue_data_out = 0x11223344; - res = OS_QueuePut(queue_id, (void *)&queue_data_out, 2, 0); + res = OS_QueuePut(queue_id, (void *)&queue_data_out, OSAL_SIZE_C(2), 0); if (res != OS_SUCCESS) { testDesc = "#6 Invalid-queue-size - Queue Put failed"; @@ -399,7 +399,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, (void *)&queue_data_in, 3, &data_size, OS_CHECK); + res = OS_QueueGet(queue_id, (void *)&queue_data_in, OSAL_SIZE_C(3), &data_size, OS_CHECK); if (res == OS_QUEUE_INVALID_SIZE) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -417,7 +417,7 @@ void UT_os_queue_get_test() testDesc = "#8 Nominal Pend"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueGet", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueGet", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#8 Nominal Pend - Queue Create failed"; @@ -426,7 +426,7 @@ void UT_os_queue_get_test() else { queue_data_out = 0x11223344; - res = OS_QueuePut(queue_id, (void *)&queue_data_out, 4, 0); + res = OS_QueuePut(queue_id, (void *)&queue_data_out, sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#8 Nominal Pend - Queue Put failed"; @@ -434,7 +434,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, (void *)&queue_data_in, 4, &data_size, OS_PEND); + res = OS_QueueGet(queue_id, (void *)&queue_data_in, sizeof(uint32), &data_size, OS_PEND); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -447,7 +447,7 @@ void UT_os_queue_get_test() testDesc = "#9 Nominal timeout"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueGet", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueGet", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#9 Nominal timeout - Queue Create failed"; @@ -456,7 +456,7 @@ void UT_os_queue_get_test() else { queue_data_out = 0x11223344; - res = OS_QueuePut(queue_id, (void *)&queue_data_out, 4, 0); + res = OS_QueuePut(queue_id, (void *)&queue_data_out, sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#9 Nominal timeout - Queue Put failed"; @@ -464,7 +464,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, (void *)&queue_data_in, 4, &data_size, 20); + res = OS_QueueGet(queue_id, (void *)&queue_data_in, sizeof(uint32), &data_size, 20); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -477,7 +477,7 @@ void UT_os_queue_get_test() testDesc = "#10 Nominal check"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueGet", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueGet", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#10 Nominal check - Queue Create failed"; @@ -486,7 +486,7 @@ void UT_os_queue_get_test() else { queue_data_out = 0x11223344; - res = OS_QueuePut(queue_id, (void *)&queue_data_out, 4, 0); + res = OS_QueuePut(queue_id, (void *)&queue_data_out, sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#10 Nominal check - Queue Put failed"; @@ -494,7 +494,7 @@ void UT_os_queue_get_test() } else { - res = OS_QueueGet(queue_id, (void *)&queue_data_in, 4, &data_size, OS_CHECK); + res = OS_QueueGet(queue_id, (void *)&queue_data_in, sizeof(uint32), &data_size, OS_CHECK); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -528,7 +528,7 @@ void UT_os_queue_put_test() /*-----------------------------------------------------*/ testDesc = "API not implemented"; - res = OS_QueuePut(OS_OBJECT_ID_UNDEFINED, (void *)&queue_data_out, 4, 0); + res = OS_QueuePut(OS_OBJECT_ID_UNDEFINED, (void *)&queue_data_out, sizeof(uint32), 0); if (res == OS_ERR_NOT_IMPLEMENTED) { UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); @@ -538,7 +538,7 @@ void UT_os_queue_put_test() /*-----------------------------------------------------*/ testDesc = "#1 Invalid-ID-arg"; - res = OS_QueuePut(UT_OBJID_INCORRECT, (void *)&queue_data_out, 4, 0); + res = OS_QueuePut(UT_OBJID_INCORRECT, (void *)&queue_data_out, sizeof(uint32), 0); if (res == OS_ERR_INVALID_ID) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -548,7 +548,7 @@ void UT_os_queue_put_test() testDesc = "#2 Invalid-pointer-arg"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueuePut", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueuePut", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#2 Invalid-pointer-arg - Queue Create failed"; @@ -556,7 +556,7 @@ void UT_os_queue_put_test() } else { - res = OS_QueuePut(queue_id, NULL, 4, 0); + res = OS_QueuePut(queue_id, NULL, sizeof(uint32), 0); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -573,7 +573,7 @@ void UT_os_queue_put_test() testDesc = "#4 Queue-full"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueuePut", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueuePut", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#4 Queue-full - Queue Create failed"; @@ -584,7 +584,7 @@ void UT_os_queue_put_test() queue_data_out = 0x11223344; for (i = 0; i < 100; i++) { - res = OS_QueuePut(queue_id, (void *)&queue_data_out, 4, 0); + res = OS_QueuePut(queue_id, (void *)&queue_data_out, sizeof(uint32), 0); if (res == OS_QUEUE_FULL) break; } @@ -601,7 +601,7 @@ void UT_os_queue_put_test() testDesc = "#5 Nominal"; /* Setup */ - res = OS_QueueCreate(&queue_id, "QueueGet", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "QueueGet", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#5 Nominal - Queue Create failed"; @@ -610,7 +610,7 @@ void UT_os_queue_put_test() else { queue_data_out = 0x11223344; - res = OS_QueuePut(queue_id, (void *)&queue_data_out, 4, 0); + res = OS_QueuePut(queue_id, (void *)&queue_data_out, sizeof(uint32), 0); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -690,7 +690,7 @@ void UT_os_queue_get_id_by_name_test() testDesc = "#5 Nominal"; /* Setup */ - res = OS_QueueCreate(&queue_id, "GetIDByName", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "GetIDByName", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#5 Nominal - Queue Create failed"; @@ -749,7 +749,7 @@ void UT_os_queue_get_info_test() testDesc = "#2 Invalid-pointer-arg"; /* Setup */ - res = OS_QueueCreate(&queue_id, "GetInfo", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "GetInfo", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#2 Invalid-pointer-arg - Queue Create failed"; @@ -770,7 +770,7 @@ void UT_os_queue_get_info_test() testDesc = "#3 Nominal"; /* Setup */ - res = OS_QueueCreate(&queue_id, "GetInfo", 10, 4, 0); + res = OS_QueueCreate(&queue_id, "GetInfo", OSAL_BLOCKCOUNT_C(10), sizeof(uint32), 0); if (res != OS_SUCCESS) { testDesc = "#3 Nominal - Queue Create failed"; diff --git a/src/unit-tests/oscore-test/ut_oscore_select_test.c b/src/unit-tests/oscore-test/ut_oscore_select_test.c index 567fc9fbc..3ebba4844 100644 --- a/src/unit-tests/oscore-test/ut_oscore_select_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_select_test.c @@ -64,7 +64,7 @@ char * fsAddrPtr = NULL; static osal_id_t setup_file(void) { osal_id_t id; - UT_SETUP(OS_mkfs(fsAddrPtr, "/ramdev3", "RAM3", 512, 20)); + UT_SETUP(OS_mkfs(fsAddrPtr, "/ramdev3", "RAM3", OSAL_SIZE_C(512), OSAL_BLOCKCOUNT_C(20))); UT_SETUP(OS_mount("/ramdev3", "/drive3")); UT_SETUP(OS_OpenCreate(&id, "/drive3/select_test.txt", OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE, OS_READ_WRITE)); return id; diff --git a/src/unit-tests/oscore-test/ut_oscore_task_test.c b/src/unit-tests/oscore-test/ut_oscore_task_test.c index 7f0cd5ae3..bb3d5b9da 100644 --- a/src/unit-tests/oscore-test/ut_oscore_task_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_task_test.c @@ -37,9 +37,6 @@ #define UT_TASK_STACK_SIZE 0x2000 #define UT_TASK_PRIORITY 111 -/* This is not global in the OSAL */ -#define MAX_PRIORITY 255 - /*--------------------------------------------------------------------------------* ** Data types **--------------------------------------------------------------------------------*/ @@ -58,7 +55,10 @@ extern char g_long_task_name[UT_OS_NAME_BUFF_SIZE]; uint32 g_task_result = 0; osal_id_t g_task_sync_sem; osal_id_t g_task_ids[UT_OS_TASK_LIST_LEN]; -uint32 g_task_stacks[UT_OS_TASK_LIST_LEN][UT_TASK_STACK_SIZE]; +struct +{ + uint32 words[UT_TASK_STACK_SIZE]; +} g_task_stacks[UT_OS_TASK_LIST_LEN]; /*--------------------------------------------------------------------------------* ** External function prototypes @@ -113,8 +113,8 @@ void UT_os_task_create_test() /*-----------------------------------------------------*/ testDesc = "API not implemented"; - res = OS_TaskCreate(&g_task_ids[0], g_task_names[0], generic_test_task, g_task_stacks[0], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[0], g_task_names[0], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[0]), + sizeof(g_task_stacks[0]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res == OS_ERR_NOT_IMPLEMENTED) { UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); @@ -130,8 +130,8 @@ void UT_os_task_create_test() /*-----------------------------------------------------*/ testDesc = "#1 Null-pointer-arg-1"; - res = OS_TaskCreate(NULL, g_task_names[1], generic_test_task, g_task_stacks[1], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(NULL, g_task_names[1], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[1]), + sizeof(g_task_stacks[1]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -140,8 +140,8 @@ void UT_os_task_create_test() /*-----------------------------------------------------*/ testDesc = "#2 Null-pointer-arg-2"; - res = OS_TaskCreate(&g_task_ids[2], NULL, generic_test_task, g_task_stacks[2], UT_TASK_STACK_SIZE, UT_TASK_PRIORITY, - 0); + res = OS_TaskCreate(&g_task_ids[2], NULL, generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[2]), + sizeof(g_task_stacks[2]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -150,8 +150,8 @@ void UT_os_task_create_test() /*-----------------------------------------------------*/ testDesc = "#3 Null-pointer-arg-3"; - res = - OS_TaskCreate(&g_task_ids[3], g_task_names[3], NULL, g_task_stacks[3], UT_TASK_STACK_SIZE, UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[3], g_task_names[3], NULL, OSAL_STACKPTR_C(&g_task_stacks[3]), + sizeof(g_task_stacks[3]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -160,23 +160,13 @@ void UT_os_task_create_test() /*-----------------------------------------------------*/ testDesc = "#4 Name-too-long"; - res = OS_TaskCreate(&g_task_ids[4], g_long_task_name, generic_test_task, g_task_stacks[4], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[4], g_long_task_name, generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[4]), + sizeof(g_task_stacks[4]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res == OS_ERR_NAME_TOO_LONG) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - /*-----------------------------------------------------*/ - testDesc = "#5 Invalid-priority"; - - res = OS_TaskCreate(&g_task_ids[5], g_task_names[5], generic_test_task, g_task_stacks[5], UT_TASK_STACK_SIZE, - MAX_PRIORITY + 1, 0); - if (res == OS_ERR_INVALID_PRIORITY) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - /*-----------------------------------------------------*/ testDesc = "#6 No-free-IDs"; @@ -185,8 +175,8 @@ void UT_os_task_create_test() { memset(task_name, '\0', sizeof(task_name)); UT_os_sprintf(task_name, "CREATE_TASK%d", (int)i); - res = OS_TaskCreate(&g_task_ids[i], task_name, generic_test_task, g_task_stacks[i], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[i], task_name, generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[i]), + sizeof(g_task_stacks[i]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { break; @@ -211,8 +201,8 @@ void UT_os_task_create_test() testDesc = "#7 Duplicate-name"; /* Setup */ - res = OS_TaskCreate(&g_task_ids[7], g_task_names[7], generic_test_task, g_task_stacks[7], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[7], g_task_names[7], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[7]), + sizeof(g_task_stacks[7]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#7 Duplicate-name - Task-Create failed"; @@ -220,8 +210,8 @@ void UT_os_task_create_test() } else { - res = OS_TaskCreate(&g_task_ids[8], g_task_names[7], generic_test_task, g_task_stacks[8], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[8], g_task_names[7], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[8]), + sizeof(g_task_stacks[8]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res == OS_ERR_NAME_TAKEN) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -242,8 +232,8 @@ void UT_os_task_create_test() /*-----------------------------------------------------*/ testDesc = "#9 Nominal"; - res = OS_TaskCreate(&g_task_ids[9], g_task_names[9], generic_test_task, g_task_stacks[9], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[9], g_task_names[9], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[9]), + sizeof(g_task_stacks[9]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -300,8 +290,8 @@ void UT_os_task_delete_test() testDesc = "#3 Nominal"; /* Setup */ - res = OS_TaskCreate(&g_task_ids[3], g_task_names[3], generic_test_task, g_task_stacks[3], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[3], g_task_names[3], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[3]), + sizeof(g_task_stacks[3]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#3 Nominal - Task-Create failed"; @@ -407,8 +397,9 @@ void UT_os_task_install_delete_handler_test(void) { OS_BinSemTake(g_task_sync_sem); - res = OS_TaskCreate(&g_task_ids[2], g_task_names[2], delete_handler_test_task, g_task_stacks[2], - UT_TASK_STACK_SIZE, UT_TASK_PRIORITY, 0); + res = + OS_TaskCreate(&g_task_ids[2], g_task_names[2], delete_handler_test_task, OSAL_STACKPTR_C(&g_task_stacks[2]), + sizeof(g_task_stacks[2]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#2 Nominal - Task-Create-failed"; @@ -489,8 +480,8 @@ void UT_os_task_exit_test(void) { OS_BinSemTake(g_task_sync_sem); - res = OS_TaskCreate(&g_task_ids[1], g_task_names[1], exit_test_task, g_task_stacks[1], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[1], g_task_names[1], exit_test_task, OSAL_STACKPTR_C(&g_task_stacks[1]), + sizeof(g_task_stacks[1]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#1 Nominal - Task-Create failed"; @@ -579,8 +570,8 @@ void UT_os_task_set_priority_test() /*-----------------------------------------------------*/ testDesc = "API not implemented"; - res = OS_TaskCreate(&g_task_ids[0], g_task_names[0], generic_test_task, g_task_stacks[0], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[0], g_task_names[0], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[0]), + sizeof(g_task_stacks[0]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#0 API not implemented - Task-Create failed"; @@ -589,7 +580,7 @@ void UT_os_task_set_priority_test() } else { - res = OS_TaskSetPriority(g_task_ids[0], UT_TASK_PRIORITY); + res = OS_TaskSetPriority(g_task_ids[0], OSAL_PRIORITY_C(UT_TASK_PRIORITY)); if (res == OS_ERR_NOT_IMPLEMENTED) { UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); @@ -606,7 +597,7 @@ void UT_os_task_set_priority_test() /*-----------------------------------------------------*/ testDesc = "#1 Invalid-ID-arg"; - res = OS_TaskSetPriority(UT_OBJID_INCORRECT, 100); + res = OS_TaskSetPriority(UT_OBJID_INCORRECT, OSAL_PRIORITY_C(100)); if (res == OS_ERR_INVALID_ID) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -615,8 +606,8 @@ void UT_os_task_set_priority_test() /*-----------------------------------------------------*/ testDesc = "#2 Invalid-priority"; - res = OS_TaskCreate(&g_task_ids[2], g_task_names[2], generic_test_task, g_task_stacks[2], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[2], g_task_names[2], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[2]), + sizeof(g_task_stacks[2]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#2 Invalid-priority - Task-Create failed"; @@ -624,12 +615,6 @@ void UT_os_task_set_priority_test() } else { - res = OS_TaskSetPriority(g_task_ids[2], MAX_PRIORITY + 1); - if (res == OS_ERR_INVALID_PRIORITY) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - /* Delay to let child task run */ OS_TaskDelay(500); @@ -645,8 +630,8 @@ void UT_os_task_set_priority_test() /*-----------------------------------------------------*/ testDesc = "#4 Nominal"; - res = OS_TaskCreate(&g_task_ids[4], g_task_names[4], generic_test_task, g_task_stacks[4], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[4], g_task_names[4], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[4]), + sizeof(g_task_stacks[4]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#4 Nominal - Task-Create failed"; @@ -654,7 +639,7 @@ void UT_os_task_set_priority_test() } else { - res = OS_TaskSetPriority(g_task_ids[4], UT_TASK_PRIORITY - 10); + res = OS_TaskSetPriority(g_task_ids[4], OSAL_PRIORITY_C(UT_TASK_PRIORITY - 10)); if (res == OS_SUCCESS) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else @@ -664,7 +649,7 @@ void UT_os_task_set_priority_test() OS_TaskDelay(500); /* Reset test environment */ - OS_TaskSetPriority(g_task_ids[4], UT_TASK_PRIORITY); + OS_TaskSetPriority(g_task_ids[4], OSAL_PRIORITY_C(UT_TASK_PRIORITY)); OS_TaskDelete(g_task_ids[4]); } @@ -750,8 +735,8 @@ void UT_os_task_register_test(void) { OS_BinSemTake(g_task_sync_sem); - res = OS_TaskCreate(&g_task_ids[3], g_task_names[3], register_test_task, g_task_stacks[3], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[3], g_task_names[3], register_test_task, OSAL_STACKPTR_C(&g_task_stacks[3]), + sizeof(g_task_stacks[3]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#3 Nominal - Task-Create failed"; @@ -818,8 +803,8 @@ void UT_os_task_get_id_test() testDesc = "#1 Nominal"; /* Setup */ - res = OS_TaskCreate(&g_task_ids[1], g_task_names[1], getid_test_task, g_task_stacks[1], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[1], g_task_names[1], getid_test_task, OSAL_STACKPTR_C(&g_task_stacks[1]), + sizeof(g_task_stacks[1]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#1 Nominal - Task-Create failed"; @@ -902,8 +887,8 @@ void UT_os_task_get_id_by_name_test() testDesc = "#5 Nominal"; /* Setup */ - res = OS_TaskCreate(&g_task_ids[5], g_task_names[5], generic_test_task, g_task_stacks[5], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[5], g_task_names[5], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[5]), + sizeof(g_task_stacks[5]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#5 Nominal - Task-Create failed"; @@ -962,8 +947,8 @@ void UT_os_task_get_info_test() testDesc = "#2 Invalid-pointer-arg"; /* Setup */ - res = OS_TaskCreate(&g_task_ids[2], g_task_names[2], generic_test_task, g_task_stacks[2], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[2], g_task_names[2], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[2]), + sizeof(g_task_stacks[2]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#2 Invalid-pointer-arg - Task-Create failed"; @@ -988,8 +973,8 @@ void UT_os_task_get_info_test() testDesc = "#3 Nominal"; /* Setup */ - res = OS_TaskCreate(&g_task_ids[3], g_task_names[3], generic_test_task, g_task_stacks[3], UT_TASK_STACK_SIZE, - UT_TASK_PRIORITY, 0); + res = OS_TaskCreate(&g_task_ids[3], g_task_names[3], generic_test_task, OSAL_STACKPTR_C(&g_task_stacks[3]), + sizeof(g_task_stacks[3]), OSAL_PRIORITY_C(UT_TASK_PRIORITY), 0); if (res != OS_SUCCESS) { testDesc = "#3 Nominal - Task-Create failed"; diff --git a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c index 6ab152a27..dbb8479a2 100644 --- a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c @@ -1037,7 +1037,8 @@ void UT_os_writefile_test() void UT_os_lseekfile_test() { const char *testDesc; - int32 buffLen = 0, pos1 = 0, pos2 = 0, pos3 = 0; + size_t buffLen; + int32 pos1 = 0, pos2 = 0, pos3 = 0; /*-----------------------------------------------------*/ testDesc = "API not implemented"; @@ -1101,7 +1102,7 @@ void UT_os_lseekfile_test() memset(g_writeBuff, '\0', sizeof(g_writeBuff)); strcpy(g_writeBuff, "THE BROWN FOX JUMPS OVER THE LAZY DOG."); - buffLen = (int32)strlen(g_writeBuff); + buffLen = strlen(g_writeBuff); if (OS_write(g_fDescs[0], g_writeBuff, buffLen) != buffLen) { diff --git a/src/unit-tests/osfile-test/ut_osfile_test.c b/src/unit-tests/osfile-test/ut_osfile_test.c index a2c84d821..fc6d6cea3 100644 --- a/src/unit-tests/osfile-test/ut_osfile_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_test.c @@ -76,7 +76,7 @@ int32 UT_os_setup_fs() { int32 res; - res = OS_mkfs(g_fsAddrPtr, g_devName, "RAM3", 512, 64); + res = OS_mkfs(g_fsAddrPtr, g_devName, "RAM3", OSAL_SIZE_C(512), OSAL_BLOCKCOUNT_C(64)); if (res != OS_SUCCESS) { UT_OS_LOG("OS_mkfs() returns %d\n", (int)res); diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c index 1002252fd..ebbc668b8 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c @@ -44,8 +44,8 @@ extern char *g_fsAddrPtr; -extern int32 g_blkSize; -extern int32 g_blkCnt; +extern size_t g_blkSize; +extern osal_blockcount_t g_blkCnt; extern char g_fsLongName[UT_OS_PATH_BUFF_SIZE]; extern char g_physDriveName[UT_OS_PHYS_NAME_BUFF_SIZE]; @@ -141,8 +141,8 @@ void UT_os_initfs_test() /*-----------------------------------------------------*/ testDesc = "#1 Null-pointer-arg"; - if ((OS_initfs(g_fsAddrPtr, NULL, g_volNames[1], 0, 0) == OS_INVALID_POINTER) && - (OS_initfs(g_fsAddrPtr, g_devNames[1], NULL, 0, 0) == OS_INVALID_POINTER)) + if ((OS_initfs(g_fsAddrPtr, NULL, g_volNames[1], OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)) == OS_INVALID_POINTER) && + (OS_initfs(g_fsAddrPtr, g_devNames[1], NULL, OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)) == OS_INVALID_POINTER)) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); @@ -274,8 +274,8 @@ void UT_os_makefs_test() /*-----------------------------------------------------*/ testDesc = "#1 Null-pointer-arg"; - if ((OS_mkfs(g_fsAddrPtr, NULL, g_volNames[1], 0, 0) == OS_INVALID_POINTER) && - (OS_mkfs(g_fsAddrPtr, g_devNames[1], NULL, 0, 0) == OS_INVALID_POINTER)) + if ((OS_mkfs(g_fsAddrPtr, NULL, g_volNames[1], OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)) == OS_INVALID_POINTER) && + (OS_mkfs(g_fsAddrPtr, g_devNames[1], NULL, OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)) == OS_INVALID_POINTER)) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c index 719da6629..16a147d97 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c @@ -51,8 +51,8 @@ char *g_fsAddrPtr = NULL; -int32 g_blkSize = UT_OS_FS_BLOCK_SIZE; -int32 g_blkCnt = UT_OS_FS_MAX_BLOCKS; +size_t g_blkSize = {UT_OS_FS_BLOCK_SIZE}; +osal_blockcount_t g_blkCnt = {UT_OS_FS_MAX_BLOCKS}; char g_fsLongName[UT_OS_PATH_BUFF_SIZE]; char g_physDriveName[UT_OS_PHYS_NAME_BUFF_SIZE]; diff --git a/src/ut-stubs/osapi-utstub-dir.c b/src/ut-stubs/osapi-utstub-dir.c index a918974d1..7d4bc977f 100644 --- a/src/ut-stubs/osapi-utstub-dir.c +++ b/src/ut-stubs/osapi-utstub-dir.c @@ -143,7 +143,7 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) UT_Stub_RegisterContext(UT_KEY(OS_DirectoryRead), dirent); int32 Status; - uint32 CopySize; + size_t CopySize; Status = UT_DEFAULT_IMPL(OS_DirectoryRead); diff --git a/src/ut-stubs/osapi-utstub-file.c b/src/ut-stubs/osapi-utstub-file.c index 710accaed..196d9a74e 100644 --- a/src/ut-stubs/osapi-utstub-file.c +++ b/src/ut-stubs/osapi-utstub-file.c @@ -41,10 +41,10 @@ UT_DEFAULT_STUB(OS_FileAPI_Init, (void)) * Local Stub helper function for reading * *****************************************************************************/ -static int32 UT_GenericReadStub(const char *fname, UT_EntryKey_t fkey, void *buffer, uint32 bsize) +static int32 UT_GenericReadStub(const char *fname, UT_EntryKey_t fkey, void *buffer, size_t bsize) { int32 status; - uint32 CopySize; + size_t CopySize; status = UT_DefaultStubImpl(fname, fkey, 0x7FFFFFFF); @@ -79,10 +79,10 @@ static int32 UT_GenericReadStub(const char *fname, UT_EntryKey_t fkey, void *buf * Local Stub helper function for writing * *****************************************************************************/ -static int32 UT_GenericWriteStub(const char *fname, UT_EntryKey_t fkey, const void *buffer, uint32 bsize) +static int32 UT_GenericWriteStub(const char *fname, UT_EntryKey_t fkey, const void *buffer, size_t bsize) { int32 status; - uint32 CopySize; + size_t CopySize; status = UT_DefaultStubImpl(fname, fkey, 0x7FFFFFFF); @@ -209,7 +209,7 @@ int32 OS_close(osal_id_t filedes) * Stub function for OS_StreamRead() * *****************************************************************************/ -int32 OS_StreamRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeout) +int32 OS_StreamRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout) { return UT_GenericReadStub(__func__, UT_KEY(OS_StreamRead), buffer, nbytes); } @@ -219,7 +219,7 @@ int32 OS_StreamRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeou * Stub function for OS_StreamWrite() * *****************************************************************************/ -int32 OS_StreamWrite(osal_id_t filedes, const void *buffer, uint32 nbytes, int32 timeout) +int32 OS_StreamWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout) { return UT_GenericWriteStub(__func__, UT_KEY(OS_StreamWrite), buffer, nbytes); } @@ -229,7 +229,7 @@ int32 OS_StreamWrite(osal_id_t filedes, const void *buffer, uint32 nbytes, int32 * Stub function for OS_read() * *****************************************************************************/ -int32 OS_read(osal_id_t filedes, void *buffer, uint32 nbytes) +int32 OS_read(osal_id_t filedes, void *buffer, size_t nbytes) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_read), filedes); UT_Stub_RegisterContext(UT_KEY(OS_read), buffer); @@ -243,7 +243,7 @@ int32 OS_read(osal_id_t filedes, void *buffer, uint32 nbytes) * Stub function for OS_write() * *****************************************************************************/ -int32 OS_write(osal_id_t filedes, const void *buffer, uint32 nbytes) +int32 OS_write(osal_id_t filedes, const void *buffer, size_t nbytes) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_write), filedes); UT_Stub_RegisterContext(UT_KEY(OS_write), buffer); @@ -257,7 +257,7 @@ int32 OS_write(osal_id_t filedes, const void *buffer, uint32 nbytes) * Stub function for OS_TimedRead() * *****************************************************************************/ -int32 OS_TimedRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeout) +int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TimedRead), filedes); UT_Stub_RegisterContext(UT_KEY(OS_TimedRead), buffer); @@ -272,7 +272,7 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, uint32 nbytes, int32 timeout * Stub function for OS_TimedWrite() * *****************************************************************************/ -int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, uint32 nbytes, int32 timeout) +int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TimedWrite), filedes); UT_Stub_RegisterContext(UT_KEY(OS_TimedWrite), buffer); @@ -416,7 +416,7 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) UT_Stub_RegisterContext(UT_KEY(OS_FDGetInfo), fd_prop); int32 status; - uint32 CopySize; + size_t CopySize; status = UT_DEFAULT_IMPL(OS_FDGetInfo); diff --git a/src/ut-stubs/osapi-utstub-filesys.c b/src/ut-stubs/osapi-utstub-filesys.c index 12437d88c..de1d2a5b9 100644 --- a/src/ut-stubs/osapi-utstub-filesys.c +++ b/src/ut-stubs/osapi-utstub-filesys.c @@ -68,7 +68,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const * Stub function for OS_mkfs() * *****************************************************************************/ -int32 OS_mkfs(char *address, const char *devname, const char *volname, uint32 blocksize, uint32 numblocks) +int32 OS_mkfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks) { UT_Stub_RegisterContext(UT_KEY(OS_mkfs), address); UT_Stub_RegisterContext(UT_KEY(OS_mkfs), devname); @@ -104,7 +104,7 @@ int32 OS_rmfs(const char *devname) * Stub function for OS_initfs() * *****************************************************************************/ -int32 OS_initfs(char *address, const char *devname, const char *volname, uint32 blocksize, uint32 numblocks) +int32 OS_initfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks) { UT_Stub_RegisterContext(UT_KEY(OS_initfs), address); UT_Stub_RegisterContext(UT_KEY(OS_initfs), devname); diff --git a/src/ut-stubs/osapi-utstub-heap.c b/src/ut-stubs/osapi-utstub-heap.c index 3fdf50c6d..b2229da86 100644 --- a/src/ut-stubs/osapi-utstub-heap.c +++ b/src/ut-stubs/osapi-utstub-heap.c @@ -51,9 +51,9 @@ int32 OS_HeapGetInfo(OS_heap_prop_t *heap_prop) UT_Stub_CopyToLocal(UT_KEY(OS_HeapGetInfo), heap_prop, sizeof(*heap_prop)) < sizeof(*heap_prop)) { /* Return some random data */ - heap_prop->free_bytes = (uint32)12345; - heap_prop->free_blocks = (uint32)6789; - heap_prop->largest_free_block = (uint32)100; + heap_prop->free_bytes = OSAL_SIZE_C(12345); + heap_prop->free_blocks = OSAL_BLOCKCOUNT_C(6789); + heap_prop->largest_free_block = OSAL_SIZE_C(100); } return status; diff --git a/src/ut-stubs/osapi-utstub-idmap.c b/src/ut-stubs/osapi-utstub-idmap.c index a1dbfbfbc..594c4812f 100644 --- a/src/ut-stubs/osapi-utstub-idmap.c +++ b/src/ut-stubs/osapi-utstub-idmap.c @@ -42,11 +42,11 @@ UT_DEFAULT_STUB(OS_ObjectIdInit, (void)) /* Lock/Unlock for global tables */ -void OS_Lock_Global(uint32 idtype) +void OS_Lock_Global(osal_objtype_t idtype) { UT_DEFAULT_IMPL(OS_Lock_Global); } -void OS_Unlock_Global(uint32 idtype) +void OS_Unlock_Global(osal_objtype_t idtype) { UT_DEFAULT_IMPL(OS_Unlock_Global); } @@ -56,7 +56,7 @@ void OS_Unlock_Global(uint32 idtype) * Stub function for OS_GetMaxForObjectType() * *****************************************************************************/ -uint32 OS_GetMaxForObjectType(uint32 idtype) +uint32 OS_GetMaxForObjectType(osal_objtype_t idtype) { int32 max; @@ -77,7 +77,7 @@ uint32 OS_GetMaxForObjectType(uint32 idtype) * Stub function for OS_GetBaseForObjectType() * *****************************************************************************/ -uint32 OS_GetBaseForObjectType(uint32 idtype) +uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) { int32 base; @@ -98,10 +98,11 @@ uint32 OS_GetBaseForObjectType(uint32 idtype) * Stub function for OS_ObjectIdToArrayIndex() * *****************************************************************************/ -int32 OS_ObjectIdToArrayIndex(uint32 idtype, osal_id_t id, uint32 *ArrayIndex) +int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t id, osal_index_t *ArrayIndex) { int32 Status; UT_ObjType_t checktype; + uint32 tempserial; Status = UT_DEFAULT_IMPL(OS_ObjectIdToArrayIndex); @@ -109,7 +110,8 @@ int32 OS_ObjectIdToArrayIndex(uint32 idtype, osal_id_t id, uint32 *ArrayIndex) UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdToArrayIndex), ArrayIndex, sizeof(*ArrayIndex)) < sizeof(*ArrayIndex)) { /* this needs to output something valid or code will break */ - UT_ObjIdDecompose(id, ArrayIndex, &checktype); + UT_ObjIdDecompose(id, &tempserial, &checktype); + *ArrayIndex = OSAL_INDEX_C(tempserial); } return Status; @@ -155,7 +157,7 @@ int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *reco * Stub function for OS_ObjectIdFindMatch() * *****************************************************************************/ -int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, uint32 idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, +int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record) { int32 Status; @@ -184,7 +186,7 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, uint32 idtype, OS_ObjectM * Stub function for OS_ObjectIdFindByName(, &fake_record.active_id) * *****************************************************************************/ -int32 OS_ObjectIdFindByName(uint32 idtype, const char *name, osal_id_t *object_id) +int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t *object_id) { int32 Status; @@ -209,7 +211,8 @@ int32 OS_ObjectIdFindByName(uint32 idtype, const char *name, osal_id_t *object_i * Stub function for OS_ObjectIdGetByName(,object_id) * *****************************************************************************/ -int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, uint32 idtype, const char *name, OS_common_record_t **record) +int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, + OS_common_record_t **record) { int32 Status; OS_common_record_t * local_record; @@ -242,11 +245,12 @@ int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, uint32 idtype, const char * * Stub function for OS_ObjectIdGetById(, &fake_record.active_id) * *****************************************************************************/ -int32 OS_ObjectIdGetById(OS_lock_mode_t check_mode, uint32 idtype, osal_id_t id, uint32 *array_index, +int32 OS_ObjectIdGetById(OS_lock_mode_t check_mode, osal_objtype_t idtype, osal_id_t id, osal_index_t *array_index, OS_common_record_t **record) { int32 Status; - uint32 local_id; + uint32 tempserial; + osal_index_t local_id; UT_ObjType_t checktype; OS_common_record_t * local_record; static OS_common_record_t fake_record; @@ -257,7 +261,8 @@ int32 OS_ObjectIdGetById(OS_lock_mode_t check_mode, uint32 idtype, osal_id_t id, { if (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetById), &local_id, sizeof(local_id)) < sizeof(local_id)) { - UT_ObjIdDecompose(id, &local_id, &checktype); + UT_ObjIdDecompose(id, &tempserial, &checktype); + local_id = OSAL_INDEX_C(tempserial); } if (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetById), &local_record, sizeof(local_record)) < sizeof(local_record)) @@ -300,7 +305,7 @@ int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record) * Stub function for OS_ObjectIdGetNext() * *****************************************************************************/ -int32 OS_ObjectIdGetNext(uint32 idtype, uint32 *curr_index, OS_common_record_t **record) +int32 OS_ObjectIdGetNext(osal_objtype_t idtype, uint32 *curr_index, OS_common_record_t **record) { int32 Status; uint32 local_id; @@ -350,10 +355,11 @@ int32 OS_ObjectIdGetNext(uint32 idtype, uint32 *curr_index, OS_common_record_t * * Stub function for OS_ObjectIdAllocateNew(, &fake_record.active_id) * *****************************************************************************/ -int32 OS_ObjectIdAllocateNew(uint32 idtype, const char *name, uint32 *array_index, OS_common_record_t **record) +int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index_t *array_index, + OS_common_record_t **record) { int32 Status; - uint32 local_id; + osal_index_t local_id; OS_common_record_t * local_record; static OS_common_record_t fake_record; @@ -389,7 +395,7 @@ int32 OS_ObjectIdAllocateNew(uint32 idtype, const char *name, uint32 *array_inde returns: status ---------------------------------------------------------------------------------------*/ -int32 OS_GetResourceName(osal_id_t object_id, char *buffer, uint32 buffer_size) +int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_GetResourceName), object_id); UT_Stub_RegisterContext(UT_KEY(OS_GetResourceName), buffer); @@ -421,22 +427,23 @@ int32 OS_GetResourceName(osal_id_t object_id, char *buffer, uint32 buffer_size) returns: status ---------------------------------------------------------------------------------------*/ -int32 OS_ConvertToArrayIndex(osal_id_t object_id, uint32 *ArrayIndex) +int32 OS_ConvertToArrayIndex(osal_id_t object_id, osal_index_t *ArrayIndex) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ConvertToArrayIndex), object_id); UT_Stub_RegisterContext(UT_KEY(OS_ConvertToArrayIndex), ArrayIndex); - int32 return_code; + int32 return_code; + uint32 tempserial; return_code = UT_DEFAULT_IMPL(OS_ConvertToArrayIndex); if (return_code == OS_SUCCESS) { UT_ObjType_t ObjType; - UT_ObjIdDecompose(object_id, ArrayIndex, &ObjType); + UT_ObjIdDecompose(object_id, &tempserial, &ObjType); if (ObjType != UT_OBJTYPE_NONE && ObjType < UT_OBJTYPE_MAX) { - *ArrayIndex %= UT_MAXOBJS[ObjType]; + tempserial %= UT_MAXOBJS[ObjType]; } } else @@ -445,9 +452,11 @@ int32 OS_ConvertToArrayIndex(osal_id_t object_id, uint32 *ArrayIndex) * If set to fail, then set the output to something bizarre - if the code * actually tries to use this, chances are it will segfault and be fixed */ - *ArrayIndex = 0xDEADBEEFU; + tempserial = 0xDEADBEEFU; } + *ArrayIndex = OSAL_INDEX_C(tempserial); + return return_code; } /* end OS_ConvertToArrayIndex */ @@ -458,7 +467,8 @@ int32 OS_ConvertToArrayIndex(osal_id_t object_id, uint32 *ArrayIndex) returns: None ---------------------------------------------------------------------------------------*/ -void OS_ForEachObjectOfType(uint32 objtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg) +void OS_ForEachObjectOfType(osal_objtype_t objtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, + void *callback_arg) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ForEachObjectOfType), objtype); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ForEachObjectOfType), creator_id); @@ -466,7 +476,7 @@ void OS_ForEachObjectOfType(uint32 objtype, osal_id_t creator_id, OS_ArgCallback UT_Stub_RegisterContext(UT_KEY(OS_ForEachObjectOfType), callback_arg); osal_id_t NextId; - uint32 IdSize; + size_t IdSize; /* Although this is "void", Invoke the default impl to log it and invoke any hooks */ UT_DEFAULT_IMPL(OS_ForEachObjectOfType); @@ -497,7 +507,7 @@ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void UT_Stub_RegisterContext(UT_KEY(OS_ForEachObject), callback_arg); osal_id_t NextId; - uint32 IdSize; + size_t IdSize; /* Although this is "void", Invoke the default impl to log it and invoke any hooks */ UT_DEFAULT_IMPL(OS_ForEachObject); @@ -520,7 +530,7 @@ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void returns: The type of object that the ID represents ---------------------------------------------------------------------------------------*/ -uint32 OS_IdentifyObject(osal_id_t object_id) +osal_objtype_t OS_IdentifyObject(osal_id_t object_id) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_IdentifyObject), object_id); @@ -570,5 +580,7 @@ uint32 OS_IdentifyObject(osal_id_t object_id) break; } - return UT_DEFAULT_IMPL_RC(OS_IdentifyObject, DefaultType); + DefaultType = UT_DEFAULT_IMPL_RC(OS_IdentifyObject, DefaultType); + + return DefaultType; } diff --git a/src/ut-stubs/osapi-utstub-module.c b/src/ut-stubs/osapi-utstub-module.c index 1b2ddc30b..0d4839e91 100644 --- a/src/ut-stubs/osapi-utstub-module.c +++ b/src/ut-stubs/osapi-utstub-module.c @@ -262,7 +262,7 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const * Stub function for OS_SymbolTableDump() * *****************************************************************************/ -int32 OS_SymbolTableDump(const char *filename, uint32 size_limit) +int32 OS_SymbolTableDump(const char *filename, size_t size_limit) { UT_Stub_RegisterContext(UT_KEY(OS_SymbolTableDump), filename); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SymbolTableDump), size_limit); diff --git a/src/ut-stubs/osapi-utstub-network.c b/src/ut-stubs/osapi-utstub-network.c index de3c9a240..d7348d062 100644 --- a/src/ut-stubs/osapi-utstub-network.c +++ b/src/ut-stubs/osapi-utstub-network.c @@ -36,7 +36,7 @@ UT_DEFAULT_STUB(OS_NetworkAPI_Init, (void)) -int32 OS_NetworkGetHostName(char *host_name, uint32 name_len) +int32 OS_NetworkGetHostName(char *host_name, size_t name_len) { UT_Stub_RegisterContext(UT_KEY(OS_NetworkGetHostName), host_name); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_NetworkGetHostName), name_len); diff --git a/src/ut-stubs/osapi-utstub-printf.c b/src/ut-stubs/osapi-utstub-printf.c index 2ed283e95..cdbed0bf6 100644 --- a/src/ut-stubs/osapi-utstub-printf.c +++ b/src/ut-stubs/osapi-utstub-printf.c @@ -60,7 +60,7 @@ void OS_printf(const char *string, ...) UT_Stub_RegisterContext(UT_KEY(OS_printf), string); int32 status; - int32 length = strlen(string); + size_t length = strlen(string); va_list va; va_start(va, string); diff --git a/src/ut-stubs/osapi-utstub-queue.c b/src/ut-stubs/osapi-utstub-queue.c index bcd09e65b..9a94a937b 100644 --- a/src/ut-stubs/osapi-utstub-queue.c +++ b/src/ut-stubs/osapi-utstub-queue.c @@ -61,7 +61,8 @@ UT_DEFAULT_STUB(OS_QueueAPI_Init, (void)) ** or OS_SUCCESS. ** ******************************************************************************/ -int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, uint32 queue_depth, uint32 data_size, uint32 flags) +int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, + uint32 flags) { UT_Stub_RegisterContext(UT_KEY(OS_QueueCreate), queue_id); UT_Stub_RegisterContext(UT_KEY(OS_QueueCreate), queue_name); @@ -149,7 +150,7 @@ int32 OS_QueueDelete(osal_id_t queue_id) ** or OS_SUCCESS. ** ******************************************************************************/ -int32 OS_QueueGet(osal_id_t queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) +int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_QueueGet), queue_id); UT_Stub_RegisterContext(UT_KEY(OS_QueueGet), data); @@ -196,7 +197,7 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, uint32 size, uint32 *size_copi ** OS_INVALID_POINTER, OS_QUEUE_FULL, or OS_SUCCESS. ** ******************************************************************************/ -int32 OS_QueuePut(osal_id_t queue_id, const void *data, uint32 size, uint32 flags) +int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flags) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_QueuePut), queue_id); UT_Stub_RegisterContext(UT_KEY(OS_QueuePut), data); diff --git a/src/ut-stubs/osapi-utstub-sockets.c b/src/ut-stubs/osapi-utstub-sockets.c index 5563a0980..78e0264c7 100644 --- a/src/ut-stubs/osapi-utstub-sockets.c +++ b/src/ut-stubs/osapi-utstub-sockets.c @@ -115,7 +115,7 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 timeo * Stub function for OS_SocketRecvFrom() * *****************************************************************************/ -int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, uint32 buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) +int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SocketRecvFrom), sock_id); UT_Stub_RegisterContext(UT_KEY(OS_SocketRecvFrom), buffer); @@ -124,7 +124,7 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, uint32 buflen, OS_SockA UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SocketRecvFrom), timeout); int32 status; - uint32 CopySize; + size_t CopySize; status = UT_DEFAULT_IMPL(OS_SocketRecvFrom); @@ -159,7 +159,7 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, uint32 buflen, OS_SockA * Stub function for OS_SocketSendTo() * *****************************************************************************/ -int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, uint32 buflen, const OS_SockAddr_t *RemoteAddr) +int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SocketSendTo), sock_id); UT_Stub_RegisterContext(UT_KEY(OS_SocketSendTo), buffer); @@ -167,7 +167,7 @@ int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, uint32 buflen, cons UT_Stub_RegisterContext(UT_KEY(OS_SocketSendTo), RemoteAddr); int32 status; - uint32 CopySize; + size_t CopySize; status = UT_DEFAULT_IMPL_RC(OS_SocketSendTo, 0x7FFFFFFF); @@ -225,7 +225,7 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) UT_Stub_RegisterContext(UT_KEY(OS_SocketGetInfo), sock_prop); int32 status; - uint32 CopySize; + size_t CopySize; status = UT_DEFAULT_IMPL(OS_SocketGetInfo); @@ -260,7 +260,7 @@ int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) return status; } -int32 OS_SocketAddrToString(char *buffer, uint32 buflen, const OS_SockAddr_t *Addr) +int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) { UT_Stub_RegisterContext(UT_KEY(OS_SocketAddrToString), buffer); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SocketAddrToString), buflen); diff --git a/src/ut-stubs/osapi-utstub-task.c b/src/ut-stubs/osapi-utstub-task.c index 097cf8083..ea980de68 100644 --- a/src/ut-stubs/osapi-utstub-task.c +++ b/src/ut-stubs/osapi-utstub-task.c @@ -52,13 +52,13 @@ UT_DEFAULT_STUB(OS_TaskAPI_Init, (void)) ** Returns either OS_SUCCESS or OS_ERROR. ** ******************************************************************************/ -int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, uint32 *stack_pointer, - uint32 stack_size, uint32 priority, uint32 flags) +int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, + osal_stackptr_t stack_pointer, size_t stack_size, osal_priority_t priority, uint32 flags) { UT_Stub_RegisterContext(UT_KEY(OS_TaskCreate), task_id); UT_Stub_RegisterContext(UT_KEY(OS_TaskCreate), task_name); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TaskCreate), function_pointer); - UT_Stub_RegisterContext(UT_KEY(OS_TaskCreate), stack_pointer); + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TaskCreate), stack_pointer); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TaskCreate), stack_size); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TaskCreate), priority); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TaskCreate), flags); @@ -165,7 +165,7 @@ int32 OS_TaskDelay(uint32 millisecond) * Stub function for OS_TaskSetPriority() * *****************************************************************************/ -int32 OS_TaskSetPriority(osal_id_t task_id, uint32 new_priority) +int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TaskSetPriority), task_id); UT_Stub_RegisterContextGenericArg(UT_KEY(OS_TaskSetPriority), new_priority); @@ -281,8 +281,8 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) UT_Stub_CopyToLocal(UT_KEY(OS_TaskGetInfo), task_prop, sizeof(*task_prop)) < sizeof(*task_prop)) { UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &task_prop->creator); - task_prop->stack_size = 100; - task_prop->priority = 150; + task_prop->stack_size = OSAL_SIZE_C(100); + task_prop->priority = OSAL_PRIORITY_C(150); strncpy(task_prop->name, "UnitTest", OS_MAX_API_NAME - 1); task_prop->name[OS_MAX_API_NAME - 1] = '\0'; } diff --git a/ut_assert/inc/utstubs.h b/ut_assert/inc/utstubs.h index 429c7519b..ab8f3810f 100644 --- a/ut_assert/inc/utstubs.h +++ b/ut_assert/inc/utstubs.h @@ -161,7 +161,7 @@ void UT_SetDeferredRetcode(UT_EntryKey_t FuncKey, int32 Count, int32 Retcode); * is false then the DataBuffer pointer is used directly, and must remain valid for the duration * of the current test case. */ -void UT_SetDataBuffer(UT_EntryKey_t FuncKey, void *DataBuffer, uint32 BufferSize, bool AllocateCopy); +void UT_SetDataBuffer(UT_EntryKey_t FuncKey, void *DataBuffer, size_t BufferSize, bool AllocateCopy); /** * Gets the data buffer for a given stub function @@ -177,7 +177,7 @@ void UT_SetDataBuffer(UT_EntryKey_t FuncKey, void *DataBuffer, uint32 BufferSize * \param BufferSize Set to Maximum Size of data buffer (output) * \param Position Set to current position in data buffer (output) */ -void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, uint32 *MaxSize, uint32 *Position); +void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, size_t *MaxSize, size_t *Position); /** * Enable or disable the forced failure mode for the given stub function @@ -314,7 +314,7 @@ bool UT_Stub_CheckForceFail(UT_EntryKey_t FuncKey, int32 *Value); * \returns The actual size of data copied. If no data buffer is * supplied by the test harness this will return 0. */ -uint32 UT_Stub_CopyToLocal(UT_EntryKey_t FuncKey, void *LocalBuffer, uint32 MaxSize); +size_t UT_Stub_CopyToLocal(UT_EntryKey_t FuncKey, void *LocalBuffer, size_t MaxSize); /** * Copies data from a local buffer to the test-supplied buffer @@ -328,7 +328,7 @@ uint32 UT_Stub_CopyToLocal(UT_EntryKey_t FuncKey, void *LocalBuffer, uint32 MaxS * \returns The actual size of data copied. If no data buffer is * supplied by the test harness this will return 0. */ -uint32 UT_Stub_CopyFromLocal(UT_EntryKey_t FuncKey, const void *LocalBuffer, uint32 MaxSize); +size_t UT_Stub_CopyFromLocal(UT_EntryKey_t FuncKey, const void *LocalBuffer, size_t MaxSize); /** * Registers a single context element for the hook callback diff --git a/ut_assert/src/utstubs.c b/ut_assert/src/utstubs.c index 79693e2f6..9751fb287 100644 --- a/ut_assert/src/utstubs.c +++ b/ut_assert/src/utstubs.c @@ -69,8 +69,8 @@ typedef struct typedef struct { - uint32 Position; - uint32 TotalSize; + size_t Position; + size_t TotalSize; uint8 *BasePtr; } UT_BufferEntry_t; @@ -401,7 +401,7 @@ bool UT_Stub_CheckForceFail(UT_EntryKey_t FuncKey, int32 *Value) return (Result); } -void UT_SetDataBuffer(UT_EntryKey_t FuncKey, void *DataBuffer, uint32 BufferSize, bool AllocateCopy) +void UT_SetDataBuffer(UT_EntryKey_t FuncKey, void *DataBuffer, size_t BufferSize, bool AllocateCopy) { UT_StubTableEntry_t *StubPtr; @@ -441,12 +441,12 @@ void UT_SetDataBuffer(UT_EntryKey_t FuncKey, void *DataBuffer, uint32 BufferSize } } -void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, uint32 *MaxSize, uint32 *Position) +void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, size_t *MaxSize, size_t *Position) { UT_StubTableEntry_t *StubPtr; void * ResultDataBuffer; - uint32 ResultMaxSize; - uint32 ResultPosition; + size_t ResultMaxSize; + size_t ResultPosition; StubPtr = UT_GetStubEntry(FuncKey, UT_ENTRYTYPE_DATA_BUFFER); @@ -477,9 +477,9 @@ void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, uint32 *MaxSize, } } -uint32 UT_Stub_CopyToLocal(UT_EntryKey_t FuncKey, void *LocalBuffer, uint32 MaxSize) +size_t UT_Stub_CopyToLocal(UT_EntryKey_t FuncKey, void *LocalBuffer, size_t MaxSize) { - uint32 ActualCopy; + size_t ActualCopy; UT_StubTableEntry_t *StubPtr; ActualCopy = 0; @@ -510,9 +510,9 @@ uint32 UT_Stub_CopyToLocal(UT_EntryKey_t FuncKey, void *LocalBuffer, uint32 MaxS return ActualCopy; } -uint32 UT_Stub_CopyFromLocal(UT_EntryKey_t FuncKey, const void *LocalBuffer, uint32 MaxSize) +size_t UT_Stub_CopyFromLocal(UT_EntryKey_t FuncKey, const void *LocalBuffer, size_t MaxSize) { - uint32 ActualCopy; + size_t ActualCopy; UT_StubTableEntry_t *StubPtr; ActualCopy = 0; From c98192bd1042e7769ee402a0753b0c7c3ff7b74d Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 17 Nov 2020 09:08:44 -0500 Subject: [PATCH 009/111] Fix #655, use 3 argument form of open --- src/os/portable/os-impl-posix-files.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index 43628d5df..a6113f381 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -199,7 +199,7 @@ int32 OS_FileChmod_Impl(const char *local_path, uint32 access) int fd; /* Open file to avoid filename race potential */ - fd = open(local_path, O_RDONLY); + fd = open(local_path, O_RDONLY, 0); if (fd < 0) { return OS_ERROR; From 9c081dcf388cf84fcdf173115616001498c1c0a6 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 17 Nov 2020 12:12:17 -0500 Subject: [PATCH 010/111] Update #635, type corrections to avoid conversion Additional type corrections to avoid implicit sign and width conversions. --- src/os/inc/common_types.h | 8 ++-- src/os/portable/os-impl-bsd-select.c | 4 +- src/os/portable/os-impl-posix-io.c | 40 ++++++++++++------- src/os/posix/src/os-impl-timebase.c | 2 +- src/os/rtems/src/os-impl-timebase.c | 2 +- src/os/shared/inc/os-shared-common.h | 4 +- src/os/shared/inc/os-shared-timebase.h | 2 +- src/os/vxworks/src/os-impl-timebase.c | 2 +- .../inc/ut-adaptor-portable-posix-files.h | 5 ++- .../src/ut-adaptor-portable-posix-files.c | 4 +- .../portable/src/coveragetest-posix-files.c | 4 +- .../portable/src/coveragetest-posix-io.c | 2 +- .../ut-stubs/src/osapi-timer-impl-stubs.c | 2 +- 13 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/os/inc/common_types.h b/src/os/inc/common_types.h index 258f55a3b..d29c0b7e0 100644 --- a/src/os/inc/common_types.h +++ b/src/os/inc/common_types.h @@ -181,9 +181,9 @@ extern "C" * this makes it explicit in the code where a type conversion * is expected. */ -#define OSAL_SIZE_C(X) ((size_t) {X}) -#define OSAL_BLOCKCOUNT_C(X) ((osal_blockcount_t) {X}) -#define OSAL_INDEX_C(X) ((osal_index_t) {X}) -#define OSAL_OBJTYPE_C(X) ((osal_objtype_t) {X}) +#define OSAL_SIZE_C(X) ((size_t)(X)) +#define OSAL_BLOCKCOUNT_C(X) ((osal_blockcount_t)(X)) +#define OSAL_INDEX_C(X) ((osal_index_t)(X)) +#define OSAL_OBJTYPE_C(X) ((osal_objtype_t)(X)) #endif /* _common_types_ */ diff --git a/src/os/portable/os-impl-bsd-select.c b/src/os/portable/os-impl-bsd-select.c index 145d603fb..29c677f36 100644 --- a/src/os/portable/os-impl-bsd-select.c +++ b/src/os/portable/os-impl-bsd-select.c @@ -90,7 +90,7 @@ static int OS_FdSet_ConvertIn_Impl(fd_set *os_set, OS_FdSet *OSAL_set) { if (objids & 0x01) { - id = (offset * 8) + bit; + id = OSAL_INDEX_C((offset * 8) + bit); osfd = OS_impl_filehandle_table[id].fd; if (osfd >= 0 && OS_impl_filehandle_table[id].selectable) { @@ -136,7 +136,7 @@ static void OS_FdSet_ConvertOut_Impl(fd_set *output, OS_FdSet *Input) { if (objids & 0x01) { - id = (offset * 8) + bit; + id = OSAL_INDEX_C((offset * 8) + bit); osfd = OS_impl_filehandle_table[id].fd; if (osfd < 0 || !FD_ISSET(osfd, output)) { diff --git a/src/os/portable/os-impl-posix-io.c b/src/os/portable/os-impl-posix-io.c index 38e45918d..429e931b0 100644 --- a/src/os/portable/os-impl-posix-io.c +++ b/src/os/portable/os-impl-posix-io.c @@ -101,7 +101,8 @@ int32 OS_GenericClose_Impl(osal_index_t local_id) int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) { int where; - int32 result; + off_t os_result; + int32 retval; switch (whence) { @@ -118,8 +119,8 @@ int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) return OS_ERROR; } - result = lseek(OS_impl_filehandle_table[local_id].fd, (off_t)offset, where); - if (result < 0) + os_result = lseek(OS_impl_filehandle_table[local_id].fd, (off_t)offset, where); + if (os_result == (off_t)-1) { if (errno == ESPIPE) { @@ -130,7 +131,7 @@ int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) * Use a different error code to differentiate from an * error involving a bad whence/offset */ - result = OS_ERR_NOT_IMPLEMENTED; + retval = OS_ERR_NOT_IMPLEMENTED; } else { @@ -138,11 +139,20 @@ int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) * Most likely the "whence" and/or "offset" combo was not valid. */ OS_DEBUG("lseek: %s\n", strerror(errno)); - result = OS_ERROR; + retval = OS_ERROR; } } + else + { + /* + * convert value to int32 type for returning to caller. + * Note that this could potentially overflow an int32 + * for a large file seek. + */ + retval = (int32)os_result; + } - return result; + return retval; } /* end OS_GenericSeek_Impl */ /*---------------------------------------------------------------- @@ -155,9 +165,9 @@ int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) *-----------------------------------------------------------------*/ int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, int32 timeout) { - int32 return_code; - int os_result; - uint32 operation; + int32 return_code; + ssize_t os_result; + uint32 operation; return_code = OS_SUCCESS; @@ -188,7 +198,8 @@ int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, in } else { - return_code = os_result; + /* type conversion from ssize_t to int32 for return */ + return_code = (int32)os_result; } } } @@ -206,9 +217,9 @@ int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, in *-----------------------------------------------------------------*/ int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nbytes, int32 timeout) { - int32 return_code; - int os_result; - uint32 operation; + int32 return_code; + ssize_t os_result; + uint32 operation; return_code = OS_SUCCESS; @@ -241,7 +252,8 @@ int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nby } else { - return_code = os_result; + /* type conversion from ssize_t to int32 for return */ + return_code = (int32)os_result; } } } diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index a576332d9..a618435ac 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -480,7 +480,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, int32 start_time, int32 interval_time) +int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 interval_time) { OS_impl_timebase_internal_record_t *local; struct itimerspec timeout; diff --git a/src/os/rtems/src/os-impl-timebase.c b/src/os/rtems/src/os-impl-timebase.c index 935386edc..c5c74370c 100644 --- a/src/os/rtems/src/os-impl-timebase.c +++ b/src/os/rtems/src/os-impl-timebase.c @@ -410,7 +410,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, int32 start_time, int32 interval_time) +int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 interval_time) { OS_U32ValueWrapper_t user_data; OS_impl_timebase_internal_record_t *local; diff --git a/src/os/shared/inc/os-shared-common.h b/src/os/shared/inc/os-shared-common.h index e3654138e..7ad513e24 100644 --- a/src/os/shared/inc/os-shared-common.h +++ b/src/os/shared/inc/os-shared-common.h @@ -52,8 +52,8 @@ struct OS_shared_global_vars */ volatile bool PrintfEnabled; volatile uint32 ShutdownFlag; - int32 MicroSecPerTick; - int32 TicksPerSecond; + uint32 MicroSecPerTick; + uint32 TicksPerSecond; /* * The event handler is an application-defined callback diff --git a/src/os/shared/inc/os-shared-timebase.h b/src/os/shared/inc/os-shared-timebase.h index 109f05b10..9b8c9fe57 100644 --- a/src/os/shared/inc/os-shared-timebase.h +++ b/src/os/shared/inc/os-shared-timebase.h @@ -82,7 +82,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timebase_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timebase_id, int32 start_time, int32 interval_time); +int32 OS_TimeBaseSet_Impl(osal_index_t timebase_id, uint32 start_time, uint32 interval_time); /*---------------------------------------------------------------- Function: OS_TimeBaseDelete_Impl diff --git a/src/os/vxworks/src/os-impl-timebase.c b/src/os/vxworks/src/os-impl-timebase.c index e3d159317..8b75c100d 100644 --- a/src/os/vxworks/src/os-impl-timebase.c +++ b/src/os/vxworks/src/os-impl-timebase.c @@ -501,7 +501,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, int32 start_time, int32 interval_time) +int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 interval_time) { OS_impl_timebase_internal_record_t *local; struct itimerspec timeout; diff --git a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h index f5f62aceb..e048f5aa2 100644 --- a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h +++ b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h @@ -29,8 +29,9 @@ #define INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_FILES_H_ #include +#include -unsigned int UT_PortablePosixFileTest_GetSelfEUID(void); -unsigned int UT_PortablePosixFileTest_GetSelfEGID(void); +OCS_uid_t UT_PortablePosixFileTest_GetSelfEUID(void); +OCS_gid_t UT_PortablePosixFileTest_GetSelfEGID(void); #endif /* INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_FILES_H_ */ diff --git a/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-files.c b/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-files.c index 969dab756..e7a5bc79d 100644 --- a/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-files.c +++ b/src/unit-test-coverage/portable/adaptors/src/ut-adaptor-portable-posix-files.c @@ -31,12 +31,12 @@ #include -unsigned int UT_PortablePosixFileTest_GetSelfEUID(void) +OCS_uid_t UT_PortablePosixFileTest_GetSelfEUID(void) { return OS_IMPL_SELF_EUID; } -unsigned int UT_PortablePosixFileTest_GetSelfEGID(void) +OCS_gid_t UT_PortablePosixFileTest_GetSelfEGID(void) { return OS_IMPL_SELF_EGID; } diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index d151748e5..9297ba9d9 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -73,7 +73,7 @@ void Test_OS_FileStat_Impl(void) /* all permission bits with uid/gid match */ RefStat.st_uid = UT_PortablePosixFileTest_GetSelfEUID(); RefStat.st_gid = UT_PortablePosixFileTest_GetSelfEGID(); - RefStat.st_mode = ~0; + RefStat.st_mode = ~((OCS_mode_t)0); RefStat.st_size = 1234; RefStat.st_mtime = 5678; UT_SetDataBuffer(UT_KEY(OCS_stat), &RefStat, sizeof(RefStat), false); @@ -114,7 +114,7 @@ void Test_OS_FileChmod_Impl(void) /* all permission bits with uid/gid match */ RefStat.st_uid = UT_PortablePosixFileTest_GetSelfEUID(); RefStat.st_gid = UT_PortablePosixFileTest_GetSelfEGID(); - RefStat.st_mode = ~0; + RefStat.st_mode = ~((OCS_mode_t)0); RefStat.st_size = 1234; RefStat.st_mtime = 5678; UT_SetDataBuffer(UT_KEY(OCS_fstat), &RefStat, sizeof(RefStat), false); diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c index a6d62de90..a91c4f849 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c @@ -69,7 +69,7 @@ void Test_OS_GenericSeek_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), 333); /* bad whence */ - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, -1234), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, 1234), OS_ERROR); /* generic failure of lseek() */ UT_SetForceFail(UT_KEY(OCS_lseek), -1); diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c index 31a28c24c..29bb94214 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c @@ -38,7 +38,7 @@ ** OS Time/Tick related API */ UT_DEFAULT_STUB(OS_TimeBaseCreate_Impl, (osal_index_t timer_id)) -UT_DEFAULT_STUB(OS_TimeBaseSet_Impl, (osal_index_t timer_id, int32 start_time, int32 interval_time)) +UT_DEFAULT_STUB(OS_TimeBaseSet_Impl, (osal_index_t timer_id, uint32 start_time, uint32 interval_time)) UT_DEFAULT_STUB(OS_TimeBaseDelete_Impl, (osal_index_t timer_id)) void OS_TimeBaseLock_Impl(osal_index_t timebase_id) { From 66ad32e80e37fb2f790dfc70ec4c762701445d5d Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 17 Nov 2020 12:03:12 -0500 Subject: [PATCH 011/111] Fix #651, use unsigned types in VxWorks stack calculation This should avoid any inconsistencies in the event that the memory address translates to a negative numeric value. --- src/os/vxworks/inc/os-impl-tasks.h | 2 +- src/os/vxworks/src/os-impl-tasks.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/os/vxworks/inc/os-impl-tasks.h b/src/os/vxworks/inc/os-impl-tasks.h index 87cb15818..8ae32d36b 100644 --- a/src/os/vxworks/inc/os-impl-tasks.h +++ b/src/os/vxworks/inc/os-impl-tasks.h @@ -37,7 +37,7 @@ typedef struct WIND_TCB tcb; /* Must be first */ TASK_ID vxid; void * heap_block; /* set non-null if the stack was obtained with malloc() */ - long heap_block_size; + size_t heap_block_size; } OS_impl_task_internal_record_t; /* Tables where the OS object information is stored */ diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index fac9ae90e..5a20f266f 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -51,7 +51,7 @@ #if defined(_STACK_ALIGN_SIZE) #define VX_IMPL_STACK_ALIGN_SIZE _STACK_ALIGN_SIZE #else -#define VX_IMPL_STACK_ALIGN_SIZE 16 +#define VX_IMPL_STACK_ALIGN_SIZE ((size_t)16) #endif #if defined(STACK_ROUND_DOWN) @@ -122,9 +122,9 @@ int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) STATUS status; int vxflags; int vxpri; - long actualsz; - long userstackbase; - long actualstackbase; + size_t actualsz; + unsigned long userstackbase; + unsigned long actualstackbase; OS_impl_task_internal_record_t *lrec; VxWorks_ID_Buffer_t id; @@ -147,7 +147,7 @@ int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) */ vxpri = OS_task_table[task_id].priority; actualsz = OS_task_table[task_id].stack_size; - userstackbase = (long)OS_task_table[task_id].stack_pointer; + userstackbase = (unsigned long)OS_task_table[task_id].stack_pointer; /* * NOTE: Using taskInit() here rather than taskSpawn() allows us @@ -213,7 +213,7 @@ int32 OS_TaskCreate_Impl(uint32 task_id, uint32 flags) } } - userstackbase = (long)lrec->heap_block; + userstackbase = (unsigned long)lrec->heap_block; } if (userstackbase == 0) From 309b23728561837fcb6b075dd1842fe82ba7a34a Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Mon, 23 Nov 2020 13:48:13 -0500 Subject: [PATCH 012/111] Fix #559 cleaning up Rebasing --- .../portable/src/coveragetest-posix-files.c | 5 --- .../portable/src/coveragetest-posix-io.c | 33 ++----------------- 2 files changed, 2 insertions(+), 36 deletions(-) diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index e07a87905..372914b28 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -47,13 +47,8 @@ void Test_OS_FileOpen_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, -1234), OS_ERROR); /* failure mode */ -<<<<<<< HEAD UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (0, "local", 0, OS_READ_ONLY), OS_ERROR); -======= - UT_SetForceFail(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, OS_READ_ONLY), OS_ERROR); ->>>>>>> refs/rewritten/onto } void Test_OS_FileStat_Impl(void) diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c index af27b0cda..b272d9792 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c @@ -49,13 +49,8 @@ void Test_OS_GenericClose_Impl(void) * Test path where underlying close() fails. * Should still return success. */ -<<<<<<< HEAD UT_SetDefaultReturnValue(UT_KEY(OCS_close), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (0), OS_SUCCESS); -======= - UT_SetForceFail(UT_KEY(OCS_close), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (UT_INDEX_0), OS_SUCCESS); ->>>>>>> refs/rewritten/onto } void Test_OS_GenericSeek_Impl(void) @@ -66,33 +61,19 @@ void Test_OS_GenericSeek_Impl(void) */ /* note on success this wrapper returns the result of lseek(), not OS_SUCCESS */ -<<<<<<< HEAD UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 111); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_CUR), 111); - UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 222); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_SET), 222); - UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 333); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_END), 333); -======= - UT_SetForceFail(UT_KEY(OCS_lseek), 111); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_CUR), 111); - UT_SetForceFail(UT_KEY(OCS_lseek), 222); + UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 222); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_SET), 222); - UT_SetForceFail(UT_KEY(OCS_lseek), 333); + UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 333); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), 333); ->>>>>>> refs/rewritten/onto /* bad whence */ OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, 1234), OS_ERROR); /* generic failure of lseek() */ -<<<<<<< HEAD UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (0, 0, OS_SEEK_END), OS_ERROR); -======= - UT_SetForceFail(UT_KEY(OCS_lseek), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), OS_ERROR); ->>>>>>> refs/rewritten/onto /* The seek implementation also checks for this specific pipe errno */ OCS_errno = OCS_ESPIPE; @@ -121,13 +102,8 @@ void Test_OS_GenericRead_Impl(void) UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* read() failure */ -<<<<<<< HEAD UT_SetDefaultReturnValue(UT_KEY(OCS_read), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (0, DestData, sizeof(DestData), 0), OS_ERROR); -======= - UT_SetForceFail(UT_KEY(OCS_read), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), OS_ERROR); ->>>>>>> refs/rewritten/onto } void Test_OS_GenericWrite_Impl(void) @@ -152,13 +128,8 @@ void Test_OS_GenericWrite_Impl(void) UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* write() failure */ -<<<<<<< HEAD UT_SetDefaultReturnValue(UT_KEY(OCS_write), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (0, DestData, sizeof(DestData), 0), OS_ERROR); -======= - UT_SetForceFail(UT_KEY(OCS_write), -1); OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), OS_ERROR); ->>>>>>> refs/rewritten/onto } /* ------------------- End of test cases --------------------------------------*/ From b7680650312742436c31572c6db7259ebbaee509 Mon Sep 17 00:00:00 2001 From: Alan Cudmore Date: Wed, 25 Nov 2020 12:59:27 -0500 Subject: [PATCH 013/111] Fix #608 - Add RTEMS 5.x support --- src/bsp/pc-rtems/CMakeLists.txt | 7 +++++++ src/bsp/pc-rtems/src/bsp_start.c | 14 +++++++++----- src/bsp/pc-rtems/src/pcrtems_bsp_internal.h | 9 +++++++++ src/os/rtems/inc/os-rtems.h | 14 ++++++++++++++ src/os/rtems/src/os-impl-heap.c | 4 ++-- src/os/rtems/src/os-impl-loader.c | 8 ++++---- 6 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/bsp/pc-rtems/CMakeLists.txt b/src/bsp/pc-rtems/CMakeLists.txt index 9b5a0af99..c6f6a1b29 100644 --- a/src/bsp/pc-rtems/CMakeLists.txt +++ b/src/bsp/pc-rtems/CMakeLists.txt @@ -9,6 +9,13 @@ add_library(osal_pc-rtems_impl OBJECT src/bsp_console.c ) +# This definition is needed for the gethostname call +# By defining this, it avoids the need to use the -std=gnu99 +# instead of the preferred -std=c99 GCC switch +target_compile_definitions(osal_pc-rtems_impl PUBLIC + _BSD_SOURCE +) + # This BSP only works with "rtems" OS layer. # Confirming this reduces risk of accidental misconfiguration set(OSAL_EXPECTED_OSTYPE "rtems" PARENT_SCOPE) diff --git a/src/bsp/pc-rtems/src/bsp_start.c b/src/bsp/pc-rtems/src/bsp_start.c index 2bbad651b..ce6ef503e 100644 --- a/src/bsp/pc-rtems/src/bsp_start.c +++ b/src/bsp/pc-rtems/src/bsp_start.c @@ -83,10 +83,10 @@ void OS_BSP_Setup(void) cmdlinestr = bsp_cmdline(); printf("\n\n*** RTEMS Info ***\n"); - printf("%s", _Copyright_Notice); - printf("%s\n\n", _RTEMS_version); - printf(" Stack size=%d\n", (int)Configuration.stack_space_size); - printf(" Workspace size=%d\n", (int)Configuration.work_space_size); + printf("%s", OSAL_BSP_COPYRIGHT_NOTICE); + printf("%s\n\n", rtems_get_version_string()); + printf(" Stack size=%d\n", (int)rtems_configuration_get_stack_space_size()); + printf(" Workspace size=%d\n", (int)rtems_configuration_get_work_space_size()); if (cmdlinestr != NULL) { printf(" Bootloader Command Line: %s\n", cmdlinestr); @@ -374,9 +374,13 @@ rtems_task Init(rtems_task_argument ignored) #define CONFIGURE_MAXIMUM_TIMERS (OS_MAX_TIMERS + 2) #define CONFIGURE_MAXIMUM_SEMAPHORES (OS_MAX_BIN_SEMAPHORES + OS_MAX_COUNT_SEMAPHORES + OS_MAX_MUTEXES + 16) #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES (OS_MAX_QUEUES + 4) -#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS (OS_MAX_NUM_OPEN_FILES + 8) #define CONFIGURE_MAXIMUM_DRIVERS 10 #define CONFIGURE_MAXIMUM_POSIX_KEYS 4 +#ifdef _RTEMS_5_ + #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS (OS_MAX_NUM_OPEN_FILES + 8) +#else + #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS (OS_MAX_NUM_OPEN_FILES + 8) +#endif #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER diff --git a/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h b/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h index 8d3690596..12c04509c 100644 --- a/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h +++ b/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h @@ -40,6 +40,15 @@ #define RTEMS_MAX_USER_OPTIONS 4 #define RTEMS_MAX_CMDLINE 256 +/* + * Handle the differences between RTEMS 5 and 4.11 copyright notice + */ +#ifdef _RTEMS_5_ + #define OSAL_BSP_COPYRIGHT_NOTICE rtems_get_copyright_notice() +#else + #define OSAL_BSP_COPYRIGHT_NOTICE _Copyright_Notice +#endif + /* * The location which the general purpose file system will be mounted */ diff --git a/src/os/rtems/inc/os-rtems.h b/src/os/rtems/inc/os-rtems.h index c8cf01159..5e37bad1a 100644 --- a/src/os/rtems/inc/os-rtems.h +++ b/src/os/rtems/inc/os-rtems.h @@ -52,6 +52,20 @@ /**************************************************************************************** DEFINES ***************************************************************************************/ +/* + * Handle the data structure and API name changes between RTEMS 4.11 and RTEMS 5.1 + */ +#ifdef _RTEMS_5_ + #define OSAL_HEAP_INFO_BLOCK Heap_Information_block + #define OSAL_UNRESOLV_REC_TYPE rtems_rtl_unresolv_rec + #define OSAL_UNRESOLVED_SYMBOL rtems_rtl_unresolved_symbol + #define OSAL_UNRESOLVED_ITERATE rtems_rtl_unresolved_iterate +#else + #define OSAL_HEAP_INFO_BLOCK region_information_block + #define OSAL_UNRESOLV_REC_TYPE rtems_rtl_unresolv_rec_t + #define OSAL_UNRESOLVED_SYMBOL rtems_rtl_unresolved_name + #define OSAL_UNRESOLVED_ITERATE rtems_rtl_unresolved_interate +#endif /**************************************************************************************** TYPEDEFS diff --git a/src/os/rtems/src/os-impl-heap.c b/src/os/rtems/src/os-impl-heap.c index 17addccc0..4e67125cb 100644 --- a/src/os/rtems/src/os-impl-heap.c +++ b/src/os/rtems/src/os-impl-heap.c @@ -46,8 +46,8 @@ *-----------------------------------------------------------------*/ int32 OS_HeapGetInfo_Impl(OS_heap_prop_t *heap_prop) { - region_information_block info; - int status; + OSAL_HEAP_INFO_BLOCK info; + int status; status = malloc_info(&info); diff --git a/src/os/rtems/src/os-impl-loader.c b/src/os/rtems/src/os-impl-loader.c index 89fbbedce..3f174080c 100644 --- a/src/os/rtems/src/os-impl-loader.c +++ b/src/os/rtems/src/os-impl-loader.c @@ -73,14 +73,14 @@ int32 OS_Rtems_ModuleAPI_Impl_Init(void) * This could be fine-tuned later. * *-----------------------------------------------------------------*/ -static bool OS_rtems_rtl_check_unresolved(rtems_rtl_unresolv_rec_t *rec, void *data) +static bool OS_rtems_rtl_check_unresolved(OSAL_UNRESOLV_REC_TYPE *rec, void *data) { int32 *status = data; switch (rec->type) { - case rtems_rtl_unresolved_name: - OS_DEBUG("unresolved name: %s\n", rec->rec.name.name); + case OSAL_UNRESOLVED_SYMBOL: + OS_DEBUG("unresolved symbol: %s\n", rec->rec.name.name); *status = OS_ERROR; break; case rtems_rtl_unresolved_reloc: @@ -142,7 +142,7 @@ int32 OS_ModuleLoad_Impl(uint32 module_id, const char *translated_path) OS_DEBUG("module has has unresolved externals\n"); status = OS_SUCCESS; /* note - not final, probably overridden */ - rtems_rtl_unresolved_interate(OS_rtems_rtl_check_unresolved, &status); + OSAL_UNRESOLVED_ITERATE(OS_rtems_rtl_check_unresolved, &status); } else { From 7af2c3f7b5187a6e21ba3f3e9931de864f2dde99 Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Mon, 30 Nov 2020 23:17:58 -0500 Subject: [PATCH 014/111] HOTFIX #662, add missing UT_SetDefaultReturnValue --- src/unit-test-coverage/vxworks/src/coveragetest-symtab.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index 2b2607a2a..c7fddf233 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -56,8 +56,7 @@ void Test_OS_ModuleSymbolLookup_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, &SymAddr, "symname"), OS_SUCCESS); OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, NULL, NULL), OS_INVALID_POINTER); - UT_SetForceFail(UT_KEY(OCS_symFind), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, &SymAddr, "symname"), OS_ERROR); + UT_SetDefaultReturnValue(UT_KEY(OCS_symFind), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, &SymAddr, "symname"), OS_ERROR); } void Test_OS_SymTableIterator_Impl(void) From 720c76779a57a06139c51b1e6d975c8dcd818949 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Wed, 11 Nov 2020 09:46:12 -0500 Subject: [PATCH 015/111] fix #586 add functional test of one shot timer. --- src/tests/timer-test/timer-test.c | 55 ++++++++++++++++++------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/tests/timer-test/timer-test.c b/src/tests/timer-test/timer-test.c index 9d2e82fc3..4d86367d1 100644 --- a/src/tests/timer-test/timer-test.c +++ b/src/tests/timer-test/timer-test.c @@ -33,7 +33,7 @@ #include "uttest.h" #include "utbsp.h" -#define NUMBER_OF_TIMERS 4 +#define NUMBER_OF_TIMERS 5 #define TASK_1_ID 1 #define TASK_1_STACK_SIZE 4096 @@ -45,8 +45,8 @@ void TimerTestCheck(void); OS_time_t StartTime; OS_time_t EndTime; -uint32 TimerStart[NUMBER_OF_TIMERS] = {1000, 2000000, 3000000, 4000000}; -uint32 TimerInterval[NUMBER_OF_TIMERS] = {500000, 400000, 800000, 600000}; +uint32 TimerStart[NUMBER_OF_TIMERS] = {1000, 2000000, 3000000, 4000000, 1000000}; +uint32 TimerInterval[NUMBER_OF_TIMERS] = {500000, 400000, 800000, 600000, 0}; uint32 TimerTestTaskStack[TASK_1_STACK_SIZE]; int32 timer_counter[NUMBER_OF_TIMERS]; @@ -111,12 +111,12 @@ void TimerTestSetup(void) void TimerTestTask(void) { - int i = 0; - int32 TimerStatus[NUMBER_OF_TIMERS]; - osal_index_t TableId; - osal_id_t TimerID[NUMBER_OF_TIMERS]; - char TimerName[NUMBER_OF_TIMERS][20] = {"TIMER1", "TIMER2", "TIMER3", "TIMER4"}; - uint32 ClockAccuracy; + int i = 0; + int32 TimerStatus[NUMBER_OF_TIMERS]; + osal_index_t TableId; + osal_id_t TimerID[NUMBER_OF_TIMERS]; + char TimerName[NUMBER_OF_TIMERS][20] = {"TIMER1", "TIMER2", "TIMER3", "TIMER4", "TIMER5"}; + uint32 ClockAccuracy; for (i = 0; i < NUMBER_OF_TIMERS && i < OS_MAX_TIMERS; i++) { @@ -202,18 +202,29 @@ void TimerTestCheck(void) /* Make sure the ratio of the timers are OK */ for (i = 0; i < NUMBER_OF_TIMERS && i < OS_MAX_TIMERS; i++) { - /* - * Expect one tick after the start time (i.e. first tick) - * Plus one tick for every interval that occurred during the test - */ - expected = 1 + (microsecs - TimerStart[i]) / TimerInterval[i]; - UtAssert_True(expected > 0, "Expected ticks = %u", (unsigned int)expected); - - /* - * Since all these counts are affected by test system load, - * allow for some fudge factor before declaring failure - */ - UtAssert_True(timer_counter[i] >= (expected - 3), "Timer %d count >= %d", (int)i, (int)(expected - 3)); - UtAssert_True(timer_counter[i] <= (expected + 3), "Timer %d count <= %d", (int)i, (int)(expected + 3)); + if (TimerInterval[i] == 0) + { + /* + * When the Timer Interval is 0, it's a one shot so expect eaxctly 1 tick + */ + expected = 1; + UtAssert_True(timer_counter[i] == (expected), "Timer %d count = %d", (int)i, (int)(expected)); + } + else + { + /* + * Expect one tick after the start time (i.e. first tick) + * Plus one tick for every interval that occurred during the test + */ + expected = 1 + (microsecs - TimerStart[i]) / TimerInterval[i]; + UtAssert_True(expected > 0, "Expected ticks = %u", (unsigned int)expected); + + /* + * Since all these counts are affected by test system load, + * allow for some fudge factor before declaring failure + */ + UtAssert_True(timer_counter[i] >= (expected - 3), "Timer %d count >= %d", (int)i, (int)(expected - 3)); + UtAssert_True(timer_counter[i] <= (expected + 3), "Timer %d count <= %d", (int)i, (int)(expected + 3)); + } } } From 0ecfba4585eebc41f2fc6f6287818be9ca6ab4dd Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Tue, 1 Dec 2020 10:34:57 -0500 Subject: [PATCH 016/111] fix #650 OS_chmod uses read or write access. --- src/os/portable/os-impl-posix-files.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index ba59fcba0..9fe58401a 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -202,7 +202,11 @@ int32 OS_FileChmod_Impl(const char *local_path, uint32 access) fd = open(local_path, O_RDONLY, 0); if (fd < 0) { - return OS_ERROR; + fd = open(local_path, O_WRONLY, 0); + if (fd < 0) + { + return OS_ERROR; + } } /* From af7beaf8879f6571fc14260bb08b5ef48efd123d Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Tue, 1 Dec 2020 16:21:29 -0500 Subject: [PATCH 017/111] fix #631 add new functional tests for OS_chmod --- src/tests/file-api-test/file-api-test.c | 64 ++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index 8bfda6ea0..9dd62f9a9 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -33,6 +33,7 @@ void TestMkfsMount(void); void TestCreatRemove(void); void TestOpenClose(void); +void TestChmod(void); void TestReadWriteLseek(void); void TestMkRmDirFreeBytes(void); void TestOpenReadCloseDir(void); @@ -75,6 +76,7 @@ void UtTest_Setup(void) UtTest_Add(TestMkfsMount, NULL, NULL, "TestMkfsMount"); UtTest_Add(TestCreatRemove, NULL, NULL, "TestCreatRemove"); UtTest_Add(TestOpenClose, NULL, NULL, "TestOpenClose"); + UtTest_Add(TestChmod, NULL, NULL, "TestChmod"); UtTest_Add(TestReadWriteLseek, NULL, NULL, "TestReadWriteLseek"); UtTest_Add(TestMkRmDirFreeBytes, NULL, NULL, "TestMkRmDirFreeBytes"); UtTest_Add(TestOpenReadCloseDir, NULL, NULL, "TestOpenReadCloseDir"); @@ -238,10 +240,68 @@ void TestOpenClose(void) status = OS_remove(filename); UtAssert_True(status == OS_SUCCESS, "status after remove = %d", (int)status); } + /*--------------------------------------------------------------------------------------- - * Name TestReadWriteLseek + * Name TestChmod ---------------------------------------------------------------------------------------*/ +void TestChmod(void) +{ + char filename[OS_MAX_PATH_LEN]; + int32 status; + osal_id_t fd; + + /*Make a file to test on. Start in Read only mode */ + strncpy(filename, "/drive0/Filename1", sizeof(filename) - 1); + filename[sizeof(filename) - 1] = 0; + status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE, OS_READ_ONLY); + UtAssert_True(status >= OS_SUCCESS, "status after creat = %d", (int)status); + status = OS_close(fd); + UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); + + /*Testing Write Only */ + status = OS_chmod(filename, OS_WRITE_ONLY); + if(status != OS_ERR_NOT_IMPLEMENTED){ + UtAssert_True(status == OS_SUCCESS, "status after chmod = %d", (int)status); + status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_NONE, OS_WRITE_ONLY); + UtAssert_True(status >= OS_SUCCESS, "status after reopen = %d", (int)status); + status = OS_close(fd); + UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); + }else{ + UtPrintf("OS_chmod not implemented for write only\n"); + } + + /*Testing Read Only */ + status = OS_chmod(filename, OS_READ_ONLY); + if(status != OS_ERR_NOT_IMPLEMENTED){ + UtAssert_True(status == OS_SUCCESS, "status after chmod = %d", (int)status); + status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_NONE, OS_READ_ONLY); + UtAssert_True(status >= OS_SUCCESS, "status after reopen = %d", (int)status); + status = OS_close(fd); + UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); + }else{ + UtPrintf("OS_chmod not implemented for read only\n"); + } + + /*Testing Read Write */ + status = OS_chmod(filename, OS_READ_WRITE); + if(status != OS_ERR_NOT_IMPLEMENTED){ + UtAssert_True(status == OS_SUCCESS, "status after chmod = %d", (int)status); + status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_NONE, OS_READ_WRITE); + UtAssert_True(status >= OS_SUCCESS, "status after reopen = %d", (int)status); + status = OS_close(fd); + UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); + }else{ + UtPrintf("OS_chmod not implemented for read write\n"); + } + + /*Removing the file */ + status = OS_remove(filename); + UtAssert_True(status == OS_SUCCESS, "status after remove = %d", (int)status); +} +/*--------------------------------------------------------------------------------------- + * Name TestReadWriteLseek +---------------------------------------------------------------------------------------*/ void TestReadWriteLseek(void) { char filename[OS_MAX_PATH_LEN]; @@ -468,6 +528,7 @@ void TestMkRmDirFreeBytes(void) status = OS_fsBlocksFree("/drive0"); UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status >= OS_SUCCESS, "Checking Free Blocks: %d", (int)status); } + /*--------------------------------------------------------------------------------------- * Name TestOpenReadCloseDir(); ---------------------------------------------------------------------------------------*/ @@ -762,6 +823,7 @@ void TestRename(void) status = OS_rmdir(newdir1); UtAssert_True(status == OS_SUCCESS, "status after rmdir 1 = %d", (int)status); } + /*--------------------------------------------------------------------------------------- * Name TestStat() ---------------------------------------------------------------------------------------*/ From 42d6de68900d2b24367f0e9df29d96efef94f277 Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Wed, 2 Dec 2020 09:29:11 -0500 Subject: [PATCH 018/111] Bump to v5.1.0-rc1+dev91 and update README Integration Candidate 2020-11-24 --- README.md | 10 ++++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b8741f519..8be71b9c4 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,16 @@ The autogenerated OSAL user's guide can be viewed at + + ### Development Build: 5.1.0-rc1+dev75 - Ensure that the handle is not NULL before invoking dlclose(). In particular the handle will be NULL for static modules. Shutdown after CTRL+C occurs normally (no segfault). diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index f8df9294b..66d55dab0 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 75 +#define OS_BUILD_NUMBER 91 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* From 51ced9442acd3e35e48bd29b9663c13868ba1e72 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 30 Nov 2020 22:11:46 -0500 Subject: [PATCH 019/111] Fix #648, scrub array references in shared layer Introduce the OS_object_token_t type which tracks a reference to an OSAL resource. This contains all information about the original reference, including the ID, object type, lock type, and the table index. Therefore, since the token type contains all relevant info, it can be used in all places where a bare index was used. This also considerably simplifies the code, as some functions which previously output multiple objects only need to operate on tokens, and the functions which called these functions only need to instantiate a token. --- src/os/shared/inc/os-shared-globaldefs.h | 9 + src/os/shared/inc/os-shared-idmap.h | 227 +++++++- src/os/shared/inc/os-shared-time.h | 21 +- src/os/shared/src/osapi-binsem.c | 77 ++- src/os/shared/src/osapi-countsem.c | 68 +-- src/os/shared/src/osapi-dir.c | 52 +- src/os/shared/src/osapi-file.c | 175 +++--- src/os/shared/src/osapi-filesys.c | 151 ++--- src/os/shared/src/osapi-idmap.c | 548 ++++++++++++------ src/os/shared/src/osapi-module.c | 79 +-- src/os/shared/src/osapi-mutex.c | 87 +-- src/os/shared/src/osapi-printf.c | 27 +- src/os/shared/src/osapi-queue.c | 79 ++- src/os/shared/src/osapi-select.c | 12 +- src/os/shared/src/osapi-shell.c | 11 +- src/os/shared/src/osapi-sockets.c | 197 ++++--- src/os/shared/src/osapi-task.c | 162 +++--- src/os/shared/src/osapi-time.c | 150 ++--- src/os/shared/src/osapi-timebase.c | 119 ++-- src/unit-test-coverage/shared/CMakeLists.txt | 5 + .../shared/src/coveragetest-binsem.c | 18 +- .../shared/src/coveragetest-countsem.c | 18 +- .../shared/src/coveragetest-file.c | 31 +- .../shared/src/coveragetest-idmap.c | 334 ++++++----- .../shared/src/coveragetest-module.c | 19 +- .../shared/src/coveragetest-mutex.c | 18 +- .../shared/src/coveragetest-printf.c | 12 +- .../shared/src/coveragetest-queue.c | 23 +- .../shared/src/coveragetest-sockets.c | 25 +- .../shared/src/coveragetest-task.c | 30 +- .../shared/src/coveragetest-time.c | 66 ++- .../shared/src/coveragetest-timebase.c | 41 +- .../shared/src/os-shared-coverage-support.c | 113 ++++ .../shared/src/os-shared-coveragetest.h | 25 + src/ut-stubs/osapi-utstub-idmap.c | 242 +++++--- 35 files changed, 1937 insertions(+), 1334 deletions(-) create mode 100644 src/unit-test-coverage/shared/src/os-shared-coverage-support.c diff --git a/src/os/shared/inc/os-shared-globaldefs.h b/src/os/shared/inc/os-shared-globaldefs.h index 3a85a80f8..b94009722 100644 --- a/src/os/shared/inc/os-shared-globaldefs.h +++ b/src/os/shared/inc/os-shared-globaldefs.h @@ -48,6 +48,15 @@ typedef struct OS_common_record OS_common_record_t; struct OS_shared_global_vars; typedef struct OS_shared_global_vars OS_SharedGlobalVars_t; +/* + * The "OS_object_token" tracks to the type of lock currently held + * and the specific object record the requested operation should + * execute on. All operations start by obtaining a token, which must + * be released when the operation is complete. + */ +struct OS_object_token; +typedef struct OS_object_token OS_object_token_t; + /* * Wrapper for encoding of other types into a generic void* type required as argument * to callbacks and pthread entry/return values, etc. diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index 7b5b6b30e..1413c30a7 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -57,6 +57,32 @@ typedef enum OS_LOCK_MODE_REFCOUNT, /**< If operation succeeds, increment refcount and unlock global table */ } OS_lock_mode_t; +/* + * Actual (non-abstract) definition of "OS_object_token_t" + */ +struct OS_object_token +{ + OS_lock_mode_t lock_mode; + osal_objtype_t obj_type; + osal_index_t obj_idx; + osal_id_t obj_id; +}; + +/* + * Macro to retrieve an entry from an object table, based on a token + */ +#define OS_OBJECT_TABLE_GET(tbl, tok) (&tbl[OS_ObjectIndexFromToken(&(tok))]) + +/* + * Macro to clear a table entry and reset its name + */ +#define OS_OBJECT_INIT(tok, ref, namefield, nameval) \ + { \ + memset(ref, 0, sizeof(*ref)); \ + strncpy(ref->namefield, nameval, sizeof(ref->namefield) - 1); \ + OS_ObjectIdGlobalFromToken(&tok)->name_entry = ref->namefield; \ + } + /* * A function to perform arbitrary record matching. * @@ -67,6 +93,18 @@ typedef enum */ typedef bool (*OS_ObjectMatchFunc_t)(void *ref, osal_index_t local_id, const OS_common_record_t *obj); +/* + * State object associated with an object iterator + */ +typedef struct +{ + OS_common_record_t * base; + OS_ObjectMatchFunc_t match; + void * arg; + osal_index_t limit; + OS_object_token_t token; +} OS_object_iter_t; + /* * Global instantiations */ @@ -194,6 +232,91 @@ uint32 OS_GetMaxForObjectType(osal_objtype_t idtype); ------------------------------------------------------------------*/ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype); +/*---------------------------------------------------------------- + Function: OS_ObjectIndexFromToken + + Purpose: Gets the index referenced by the token + + Returns: None + ------------------------------------------------------------------*/ +static inline osal_objtype_t OS_ObjectTypeFromToken(const OS_object_token_t *token) +{ + return token->obj_type; +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIndexFromToken + + Purpose: Gets the index referenced by the token + + Returns: None + ------------------------------------------------------------------*/ +static inline osal_index_t OS_ObjectIndexFromToken(const OS_object_token_t *token) +{ + return token->obj_idx; +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIdFromToken + + Purpose: Gets the object ID referenced by the token + + Returns: None + ------------------------------------------------------------------*/ +static inline osal_id_t OS_ObjectIdFromToken(const OS_object_token_t *token) +{ + return token->obj_id; +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIdGlobalFromToken + + Purpose: Obtains the global record corresponding to the token + + Returns: Pointer to global object + ------------------------------------------------------------------*/ +OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdTransactionInit + + Purpose: Initiates a transaction by obtaining the global table lock + and preparing the object token value + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_object_token_t *token); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdTransactionCancel + + Purpose: Cancels/Releases the lock obtained by OS_ObjectIdTransactionInit() + without making any modification to global IDs. + + Returns: None + ------------------------------------------------------------------*/ +void OS_ObjectIdTransactionCancel(OS_object_token_t *token); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdTransactionFinish + + Purpose: Releases the lock obtained by OS_ObjectIdTransactionInit() + with an optional synchronized ID update for new/deleted IDs. + + Returns: None + ------------------------------------------------------------------*/ +void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdConvertToken + + Purpose: Converts a token from OS_ObjectIdTransactionInit() to the + type that was requested by the user. + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_ObjectIdConvertToken(OS_object_token_t *token); + /*---------------------------------------------------------------- Function: OS_ObjectIdFindByName @@ -213,7 +336,7 @@ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t * Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, - OS_common_record_t **record); + OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_ObjectIdGetByName @@ -223,8 +346,7 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, - OS_common_record_t **record); +int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_ObjectIdGetById @@ -234,8 +356,27 @@ int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, cons Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, osal_index_t *array_index, - OS_common_record_t **record); +int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, OS_object_token_t *token); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdRelease + + Purpose: Releases (unlocks) the object token previously obtained using + OS_ObjectIdGetById() or OS_ObjectIdGetBySearch(). + + Returns: none + ------------------------------------------------------------------*/ +void OS_ObjectIdRelease(OS_object_token_t *token); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdTransferToken + + Purpose: Transfers ownership of a object token without unlocking/releasing. + The original token will become benign and the new token becomes active. + + Returns: none + ------------------------------------------------------------------*/ +void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t *token_to); /*---------------------------------------------------------------- Function: OS_ObjectIdAllocateNew @@ -247,8 +388,7 @@ int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_i Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index_t *array_index, - OS_common_record_t **record); +int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_ObjectIdFinalizeNew @@ -260,7 +400,7 @@ int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, osal_id_t *outid); +int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, osal_id_t *outid); /*---------------------------------------------------------------- Function: OS_ObjectIdFinalizeDelete @@ -272,17 +412,69 @@ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *record); +int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_object_token_t *token); /*---------------------------------------------------------------- - Function: OS_ObjectIdRefcountDecr + Function: OS_ObjectIdIteratorInit - Purpose: Decrement the reference count - This releases objects obtained with OS_LOCK_MODE_REFCOUNT mode + Purpose: Initialize a generic object iterator of the given type. + Note This obtains and holds a global lock on the internal table, so + this call must be followed by a call to OS_ObjectIdIteratorDestroy() - Returns: OS_SUCCESS on success, or relevant error code + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, osal_objtype_t objtype, + OS_object_iter_t *iter); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIterateActive + + Purpose: Initialize a object iterator of the given type that will + return only active/valid OSAL objects. + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_ObjectIdIterateActive(osal_objtype_t objtype, OS_object_iter_t *iter); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorGetNext + + Purpose: Move then token to the next matching iterator entry + + Returns: true if successful, false if at last entry/end of table + ------------------------------------------------------------------*/ +bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorDestroy + + Purpose: Releases an iterator from OS_ObjectIdIteratorInit() + + Returns: None + ------------------------------------------------------------------*/ +void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter); + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorRef + + Purpose: Gets the token indicating current iterator position + The returned token can be used to access the relevant entry + + Returns: None + ------------------------------------------------------------------*/ +static inline const OS_object_token_t *OS_ObjectIdIteratorRef(OS_object_iter_t *iter) +{ + return &iter->token; +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorProcessEntry + + Purpose: Calls a function using the ID of the entry from the iterator + + Returns: None ------------------------------------------------------------------*/ -int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record); +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t)); /* * Internal helper functions @@ -290,10 +482,7 @@ int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record); * to be exposed for unit testing. */ bool OS_ObjectNameMatch(void *ref, osal_index_t local_id, const OS_common_record_t *obj); -void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype); -int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t reference_id, - OS_common_record_t *obj); -int32 OS_ObjectIdSearch(osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record); -int32 OS_ObjectIdFindNext(osal_objtype_t idtype, osal_index_t *array_index, OS_common_record_t **record); +int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_object_token_t *token); +int32 OS_ObjectIdFindNextFree(OS_object_token_t *token); #endif /* INCLUDE_OS_SHARED_IDMAP_H_ */ diff --git a/src/os/shared/inc/os-shared-time.h b/src/os/shared/inc/os-shared-time.h index 1fb7aa3e1..6c0ac43f9 100644 --- a/src/os/shared/inc/os-shared-time.h +++ b/src/os/shared/inc/os-shared-time.h @@ -29,21 +29,22 @@ #define INCLUDE_OS_SHARED_TIME_H_ #include +#include #define TIMECB_FLAG_DEDICATED_TIMEBASE 0x1 typedef struct { - char timer_name[OS_MAX_API_NAME]; - uint32 flags; - osal_index_t timebase_ref; - osal_index_t prev_ref; - osal_index_t next_ref; - uint32 backlog_resets; - int32 wait_time; - int32 interval_time; - OS_ArgCallback_t callback_ptr; - void * callback_arg; + char timer_name[OS_MAX_API_NAME]; + uint32 flags; + OS_object_token_t timebase_token; + osal_index_t prev_ref; + osal_index_t next_ref; + uint32 backlog_resets; + int32 wait_time; + int32 interval_time; + OS_ArgCallback_t callback_ptr; + void * callback_arg; } OS_timecb_internal_record_t; /* diff --git a/src/os/shared/src/osapi-binsem.c b/src/os/shared/src/osapi-binsem.c index 6d323faff..d46bfee21 100644 --- a/src/os/shared/src/osapi-binsem.c +++ b/src/os/shared/src/osapi-binsem.c @@ -96,9 +96,9 @@ int32 OS_BinSemAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initial_value, uint32 options) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_bin_sem_internal_record_t *binsem; /* Check for NULL pointers */ if (sem_id == NULL || sem_name == NULL) @@ -112,18 +112,19 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal table */ - strcpy(OS_bin_sem_table[local_id].obj_name, sem_name); - record->name_entry = OS_bin_sem_table[local_id].obj_name; + binsem = OS_OBJECT_TABLE_GET(OS_bin_sem_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, binsem, obj_name, sem_name); /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_BinSemCreate_Impl(local_id, sem_initial_value, options); + return_code = OS_BinSemCreate_Impl(OS_ObjectIndexFromToken(&token), sem_initial_value, options); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, sem_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, sem_id); } return return_code; @@ -140,17 +141,16 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia *-----------------------------------------------------------------*/ int32 OS_BinSemDelete(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemDelete_Impl(local_id); + return_code = OS_BinSemDelete_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -167,15 +167,14 @@ int32 OS_BinSemDelete(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_BinSemGive(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemGive_Impl(local_id); + return_code = OS_BinSemGive_Impl(OS_ObjectIndexFromToken(&token)); } return return_code; @@ -192,15 +191,14 @@ int32 OS_BinSemGive(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_BinSemFlush(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemFlush_Impl(local_id); + return_code = OS_BinSemFlush_Impl(OS_ObjectIndexFromToken(&token)); } return return_code; @@ -216,15 +214,14 @@ int32 OS_BinSemFlush(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_BinSemTake(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemTake_Impl(local_id); + return_code = OS_BinSemTake_Impl(OS_ObjectIndexFromToken(&token)); } return return_code; @@ -240,15 +237,14 @@ int32 OS_BinSemTake(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_BinSemTimedWait(osal_id_t sem_id, uint32 msecs) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemTimedWait_Impl(local_id, msecs); + return_code = OS_BinSemTimedWait_Impl(OS_ObjectIndexFromToken(&token), msecs); } return return_code; @@ -287,7 +283,7 @@ int32 OS_BinSemGetIdByName(osal_id_t *sem_id, const char *sem_name) int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) { OS_common_record_t *record; - osal_index_t local_id; + OS_object_token_t token; int32 return_code; /* Check parameters */ @@ -299,13 +295,16 @@ int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) memset(bin_prop, 0, sizeof(OS_bin_sem_prop_t)); /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_bin_sem_table, token); + strncpy(bin_prop->name, record->name_entry, OS_MAX_API_NAME - 1); bin_prop->creator = record->creator; - return_code = OS_BinSemGetInfo_Impl(local_id, bin_prop); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + return_code = OS_BinSemGetInfo_Impl(OS_ObjectIndexFromToken(&token), bin_prop); + + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-countsem.c b/src/os/shared/src/osapi-countsem.c index d0e248167..a47988841 100644 --- a/src/os/shared/src/osapi-countsem.c +++ b/src/os/shared/src/osapi-countsem.c @@ -88,9 +88,9 @@ int32 OS_CountSemAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initial_value, uint32 options) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_count_sem_internal_record_t *countsem; /* Check for NULL pointers */ if (sem_id == NULL || sem_name == NULL) @@ -104,18 +104,19 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal table */ - strcpy(OS_count_sem_table[local_id].obj_name, sem_name); - record->name_entry = OS_count_sem_table[local_id].obj_name; + countsem = OS_OBJECT_TABLE_GET(OS_count_sem_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, countsem, obj_name, sem_name); /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_CountSemCreate_Impl(local_id, sem_initial_value, options); + return_code = OS_CountSemCreate_Impl(OS_ObjectIndexFromToken(&token), sem_initial_value, options); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, sem_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, sem_id); } return return_code; @@ -132,17 +133,16 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init *-----------------------------------------------------------------*/ int32 OS_CountSemDelete(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemDelete_Impl(local_id); + return_code = OS_CountSemDelete_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -159,15 +159,14 @@ int32 OS_CountSemDelete(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_CountSemGive(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemGive_Impl(local_id); + return_code = OS_CountSemGive_Impl(OS_ObjectIndexFromToken(&token)); } return return_code; @@ -184,15 +183,14 @@ int32 OS_CountSemGive(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_CountSemTake(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemTake_Impl(local_id); + return_code = OS_CountSemTake_Impl(OS_ObjectIndexFromToken(&token)); } return return_code; @@ -208,15 +206,14 @@ int32 OS_CountSemTake(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_CountSemTimedWait(osal_id_t sem_id, uint32 msecs) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemTimedWait_Impl(local_id, msecs); + return_code = OS_CountSemTimedWait_Impl(OS_ObjectIndexFromToken(&token), msecs); } return return_code; @@ -255,7 +252,7 @@ int32 OS_CountSemGetIdByName(osal_id_t *sem_id, const char *sem_name) int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) { OS_common_record_t *record; - osal_index_t local_id; + OS_object_token_t token; int32 return_code; /* Check parameters */ @@ -267,14 +264,17 @@ int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) memset(count_prop, 0, sizeof(OS_count_sem_prop_t)); /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_count_sem_table, token); + strncpy(count_prop->name, record->name_entry, OS_MAX_API_NAME - 1); count_prop->creator = record->creator; - return_code = OS_CountSemGetInfo_Impl(local_id, count_prop); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + return_code = OS_CountSemGetInfo_Impl(OS_ObjectIndexFromToken(&token), count_prop); + + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-dir.c b/src/os/shared/src/osapi-dir.c index 5246d9a31..7f9ac053b 100644 --- a/src/os/shared/src/osapi-dir.c +++ b/src/os/shared/src/osapi-dir.c @@ -111,10 +111,10 @@ int32 OS_mkdir(const char *path, uint32 access) *-----------------------------------------------------------------*/ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) { - char local_path[OS_MAX_LOCAL_PATH_LEN]; - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + char local_path[OS_MAX_LOCAL_PATH_LEN]; + OS_object_token_t token; + OS_dir_internal_record_t *dir; + int32 return_code; if (dir_id == NULL || path == NULL) { @@ -125,18 +125,19 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) if (return_code == OS_SUCCESS) { /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal table */ - memset(&OS_dir_table[local_id], 0, sizeof(OS_dir_internal_record_t)); - strncpy(OS_dir_table[local_id].dir_name, path, OS_MAX_PATH_LEN - 1); + dir = OS_OBJECT_TABLE_GET(OS_dir_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, dir, dir_name, path); /* Now call the OS-specific implementation. */ - return_code = OS_DirOpen_Impl(local_id, local_path); + return_code = OS_DirOpen_Impl(OS_ObjectIndexFromToken(&token), local_path); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, dir_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, dir_id); } } @@ -153,18 +154,17 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) *-----------------------------------------------------------------*/ int32 OS_DirectoryClose(osal_id_t dir_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Make sure the file descriptor is legit before using it */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, dir_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, dir_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_DirClose_Impl(local_id); + return_code = OS_DirClose_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -180,9 +180,8 @@ int32 OS_DirectoryClose(osal_id_t dir_id) *-----------------------------------------------------------------*/ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; if (dirent == NULL) { @@ -190,7 +189,7 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) } /* Make sure the file descriptor is legit before using it */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, dir_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, dir_id, &token); if (return_code == OS_SUCCESS) { /* @@ -203,9 +202,9 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) * reads the "/" directory, the application will see the * real name (eeprom) and not the virtualized name (cf). */ - return_code = OS_DirRead_Impl(local_id, dirent); + return_code = OS_DirRead_Impl(OS_ObjectIndexFromToken(&token), dirent); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; @@ -222,15 +221,14 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) *-----------------------------------------------------------------*/ int32 OS_DirectoryRewind(osal_id_t dir_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Make sure the file descriptor is legit before using it */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, dir_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, dir_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_DirRewind_Impl(local_id); + return_code = OS_DirRewind_Impl(OS_ObjectIndexFromToken(&token)); } return return_code; diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 06cc795e8..1dc99247a 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -89,10 +89,10 @@ int32 OS_FileAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 access) { - int32 return_code; - osal_index_t local_id; - OS_common_record_t *record; - char local_path[OS_MAX_LOCAL_PATH_LEN]; + int32 return_code; + char local_path[OS_MAX_LOCAL_PATH_LEN]; + OS_object_token_t token; + OS_stream_internal_record_t *stream; if (filedes == NULL) { @@ -115,19 +115,19 @@ int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 acc if (return_code == OS_SUCCESS) { /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal table */ - memset(&OS_stream_table[local_id], 0, sizeof(OS_stream_internal_record_t)); - strcpy(OS_stream_table[local_id].stream_name, path); - record->name_entry = OS_stream_table[local_id].stream_name; + stream = OS_OBJECT_TABLE_GET(OS_stream_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, stream, stream_name, path); /* Now call the OS-specific implementation. */ - return_code = OS_FileOpen_Impl(local_id, local_path, flags, access); + return_code = OS_FileOpen_Impl(OS_ObjectIndexFromToken(&token), local_path, flags, access); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, filedes); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, filedes); } } @@ -227,18 +227,17 @@ int32 OS_open(const char *path, int32 access, uint32 mode) *-----------------------------------------------------------------*/ int32 OS_close(osal_id_t filedes) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Make sure the file descriptor is legit before using it */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, filedes, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericClose_Impl(local_id); + return_code = OS_GenericClose_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -255,9 +254,8 @@ int32 OS_close(osal_id_t filedes) *-----------------------------------------------------------------*/ int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ if (buffer == NULL || nbytes == 0) @@ -265,11 +263,11 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout return OS_INVALID_POINTER; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericRead_Impl(local_id, buffer, nbytes, timeout); - OS_ObjectIdRefcountDecr(record); + return_code = OS_GenericRead_Impl(OS_ObjectIndexFromToken(&token), buffer, nbytes, timeout); + OS_ObjectIdRelease(&token); } return return_code; @@ -285,9 +283,8 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout *-----------------------------------------------------------------*/ int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ if (buffer == NULL || nbytes == 0) @@ -295,11 +292,11 @@ int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 return OS_INVALID_POINTER; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericWrite_Impl(local_id, buffer, nbytes, timeout); - OS_ObjectIdRefcountDecr(record); + return_code = OS_GenericWrite_Impl(OS_ObjectIndexFromToken(&token), buffer, nbytes, timeout); + OS_ObjectIdRelease(&token); } return return_code; @@ -393,16 +390,15 @@ int32 OS_stat(const char *path, os_fstat_t *filestats) *-----------------------------------------------------------------*/ int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Make sure the file descriptor is legit before using it */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericSeek_Impl(local_id, offset, whence); - OS_ObjectIdRefcountDecr(record); + return_code = OS_GenericSeek_Impl(OS_ObjectIndexFromToken(&token), offset, whence); + OS_ObjectIdRelease(&token); } return return_code; @@ -441,10 +437,11 @@ int32 OS_remove(const char *path) *-----------------------------------------------------------------*/ int32 OS_rename(const char *old, const char *new) { - osal_index_t i; - int32 return_code; - char old_path[OS_MAX_LOCAL_PATH_LEN]; - char new_path[OS_MAX_LOCAL_PATH_LEN]; + OS_object_iter_t iter; + OS_stream_internal_record_t *stream; + int32 return_code; + char old_path[OS_MAX_LOCAL_PATH_LEN]; + char new_path[OS_MAX_LOCAL_PATH_LEN]; return_code = OS_TranslatePath(old, old_path); if (return_code == OS_SUCCESS) @@ -459,17 +456,19 @@ int32 OS_rename(const char *old, const char *new) if (return_code == OS_SUCCESS) { - OS_Lock_Global(LOCAL_OBJID_TYPE); - for (i = 0; i < OS_MAX_NUM_OPEN_FILES; i++) + OS_ObjectIdIterateActive(LOCAL_OBJID_TYPE, &iter); + + while (OS_ObjectIdIteratorGetNext(&iter)) { - if (OS_ObjectIdDefined(OS_global_stream_table[i].active_id) && - OS_stream_table[i].socket_domain == OS_SocketDomain_INVALID && - strcmp(OS_stream_table[i].stream_name, old) == 0) + stream = OS_OBJECT_TABLE_GET(OS_stream_table, iter.token); + + if (stream->socket_domain == OS_SocketDomain_INVALID && strcmp(stream->stream_name, old) == 0) { - strcpy(OS_stream_table[i].stream_name, new); + strcpy(stream->stream_name, new); } } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + + OS_ObjectIdIteratorDestroy(&iter); } return return_code; @@ -583,7 +582,7 @@ int32 OS_mv(const char *src, const char *dest) int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) { OS_common_record_t *record; - osal_index_t local_id; + OS_object_token_t token; int32 return_code; /* Check parameters */ @@ -595,13 +594,16 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) memset(fd_prop, 0, sizeof(OS_file_prop_t)); /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, filedes, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); + strncpy(fd_prop->Path, record->name_entry, OS_MAX_PATH_LEN - 1); fd_prop->User = record->creator; fd_prop->IsValid = true; - OS_Unlock_Global(LOCAL_OBJID_TYPE); + + OS_ObjectIdRelease(&token); } return return_code; @@ -618,8 +620,9 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) *-----------------------------------------------------------------*/ int32 OS_FileOpenCheck(const char *Filename) { - int32 return_code; - osal_index_t i; + int32 return_code; + OS_object_iter_t iter; + OS_stream_internal_record_t *stream; if (Filename == NULL) { @@ -628,20 +631,19 @@ int32 OS_FileOpenCheck(const char *Filename) return_code = OS_ERROR; - OS_Lock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdIterateActive(LOCAL_OBJID_TYPE, &iter); - for (i = 0; i < OS_MAX_NUM_OPEN_FILES; i++) + while (OS_ObjectIdIteratorGetNext(&iter)) { - if (OS_ObjectIdDefined(OS_global_stream_table[i].active_id) && - OS_stream_table[i].socket_domain == OS_SocketDomain_INVALID && - (strcmp(OS_stream_table[i].stream_name, Filename) == 0)) + stream = OS_OBJECT_TABLE_GET(OS_stream_table, iter.token); + if (stream->socket_domain == OS_SocketDomain_INVALID && (strcmp(stream->stream_name, Filename) == 0)) { return_code = OS_SUCCESS; break; } - } /* end for */ + } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdIteratorDestroy(&iter); return return_code; } /* end OS_FileOpenCheck */ @@ -656,9 +658,10 @@ int32 OS_FileOpenCheck(const char *Filename) *-----------------------------------------------------------------*/ int32 OS_CloseFileByName(const char *Filename) { - int32 return_code; - int32 close_code; - osal_index_t i; + int32 return_code; + int32 close_code; + OS_object_iter_t iter; + OS_stream_internal_record_t *stream; if (Filename == NULL) { @@ -667,27 +670,25 @@ int32 OS_CloseFileByName(const char *Filename) return_code = OS_FS_ERR_PATH_INVALID; - OS_Lock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdIterateActive(LOCAL_OBJID_TYPE, &iter); - for (i = 0; i < OS_MAX_NUM_OPEN_FILES; i++) + while (OS_ObjectIdIteratorGetNext(&iter)) { - if (OS_ObjectIdDefined(OS_global_stream_table[i].active_id) && - OS_stream_table[i].socket_domain == OS_SocketDomain_INVALID && - (strcmp(OS_stream_table[i].stream_name, Filename) == 0)) + stream = OS_OBJECT_TABLE_GET(OS_stream_table, iter.token); + + if (stream->socket_domain == OS_SocketDomain_INVALID && (strcmp(stream->stream_name, Filename) == 0)) { - close_code = OS_GenericClose_Impl(i); - if (close_code == OS_SUCCESS) - { - OS_global_stream_table[i].active_id = OS_OBJECT_ID_UNDEFINED; - } + /* call OS_close() on the entry referred to by the iterator */ + close_code = OS_ObjectIdIteratorProcessEntry(&iter, OS_close); + if (return_code == OS_FS_ERR_PATH_INVALID || close_code != OS_SUCCESS) { return_code = close_code; } } - } /* end for */ + } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdIteratorDestroy(&iter); return (return_code); @@ -703,31 +704,25 @@ int32 OS_CloseFileByName(const char *Filename) *-----------------------------------------------------------------*/ int32 OS_CloseAllFiles(void) { - int32 return_code; - int32 close_code; - osal_index_t i; + int32 return_code; + int32 close_code; + OS_object_iter_t iter; return_code = OS_SUCCESS; - OS_Lock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdIterateActive(LOCAL_OBJID_TYPE, &iter); - for (i = 0; i < OS_MAX_NUM_OPEN_FILES; i++) + while (OS_ObjectIdIteratorGetNext(&iter)) { - if (OS_ObjectIdDefined(OS_global_stream_table[i].active_id)) + /* call OS_close() on the entry referred to by the iterator */ + close_code = OS_ObjectIdIteratorProcessEntry(&iter, OS_close); + if (close_code != OS_SUCCESS) { - close_code = OS_GenericClose_Impl(i); - if (close_code == OS_SUCCESS) - { - OS_global_stream_table[i].active_id = OS_OBJECT_ID_UNDEFINED; - } - if (close_code != OS_SUCCESS) - { - return_code = close_code; - } + return_code = close_code; } - } /* end for */ + } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdIteratorDestroy(&iter); return (return_code); diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index ed8effd21..711ef7fb5 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -104,10 +104,9 @@ bool OS_FileSys_FindVirtMountPoint(void *ref, osal_index_t local_id, const OS_co int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, size_t blocksize, osal_blockcount_t numblocks, bool should_format) { - OS_common_record_t * global; OS_filesys_internal_record_t *local; int32 return_code; - osal_index_t local_id; + OS_object_token_t token; /* ** Check parameters @@ -129,14 +128,13 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs return OS_FS_ERR_PATH_TOO_LONG; } - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, fsdevname, &local_id, &global); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, fsdevname, &token); if (return_code == OS_SUCCESS) { - local = &OS_filesys_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); - memset(local, 0, sizeof(*local)); - global->name_entry = local->device_name; - strcpy(local->device_name, fsdevname); + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, local, device_name, fsdevname); /* populate the VolumeName and BlockSize ahead of the Impl call, * so the implementation can reference this info if necessary */ @@ -159,7 +157,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs local->fstype = OS_FILESYS_TYPE_VOLATILE_DISK; } - return_code = OS_FileSysStartVolume_Impl(local_id); + return_code = OS_FileSysStartVolume_Impl(OS_ObjectIndexFromToken(&token)); if (return_code == OS_SUCCESS) { @@ -169,7 +167,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs */ if (should_format) { - return_code = OS_FileSysFormatVolume_Impl(local_id); + return_code = OS_FileSysFormatVolume_Impl(OS_ObjectIndexFromToken(&token)); } if (return_code == OS_SUCCESS) @@ -178,18 +176,18 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs } else { - /* + /* * To avoid leaving in an intermediate state, * this also stops the volume if formatting failed. * Cast to void to repress analysis warnings for * ignored return value. */ - (void)OS_FileSysStopVolume_Impl(local_id); + (void)OS_FileSysStopVolume_Impl(OS_ObjectIndexFromToken(&token)); } } /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, global, NULL); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, NULL); } return return_code; @@ -226,10 +224,9 @@ int32 OS_FileSysAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const char *virt_path) { - OS_common_record_t * global; OS_filesys_internal_record_t *local; int32 return_code; - osal_index_t local_id; + OS_object_token_t token; const char * dev_name; /* @@ -263,14 +260,14 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const return OS_ERR_NAME_TOO_LONG; } - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, dev_name, &local_id, &global); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, dev_name, &token); if (return_code == OS_SUCCESS) { - local = &OS_filesys_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, local, device_name, dev_name); - memset(local, 0, sizeof(*local)); - global->name_entry = local->device_name; - strncpy(local->device_name, dev_name, sizeof(local->device_name) - 1); strncpy(local->volume_name, dev_name, sizeof(local->volume_name) - 1); strncpy(local->system_mountpt, phys_path, sizeof(local->system_mountpt) - 1); strncpy(local->virtual_mountpt, virt_path, sizeof(local->virtual_mountpt) - 1); @@ -285,12 +282,12 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const * The "mount" implementation is required as it will * create the mountpoint if it does not already exist */ - return_code = OS_FileSysStartVolume_Impl(local_id); + return_code = OS_FileSysStartVolume_Impl(OS_ObjectIndexFromToken(&token)); if (return_code == OS_SUCCESS) { local->flags |= OS_FILESYS_FLAG_IS_READY; - return_code = OS_FileSysMountVolume_Impl(local_id); + return_code = OS_FileSysMountVolume_Impl(OS_ObjectIndexFromToken(&token)); } if (return_code == OS_SUCCESS) @@ -302,7 +299,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const } /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, global, filesys_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, filesys_id); } return return_code; @@ -348,9 +345,8 @@ int32 OS_mkfs(char *address, const char *devname, const char *volname, size_t bl *-----------------------------------------------------------------*/ int32 OS_rmfs(const char *devname) { - int32 return_code; - osal_index_t local_id; - OS_common_record_t *global; + int32 return_code; + OS_object_token_t token; if (devname == NULL) { @@ -362,11 +358,9 @@ int32 OS_rmfs(const char *devname) return OS_FS_ERR_PATH_TOO_LONG; } - return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, devname, &global); + return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, devname, &token); if (return_code == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); - /* * NOTE: It is likely that if the file system is mounted, * this call to stop the volume will fail. @@ -375,16 +369,10 @@ int32 OS_rmfs(const char *devname) * the filesystem is unmounted first, but this would break * compatibility with the existing unit tests. */ - return_code = OS_FileSysStopVolume_Impl(local_id); - - /* Free the entry in the master table now while still locked */ - if (return_code == OS_SUCCESS) - { - /* Only need to clear the ID as zero is the "unused" flag */ - global->active_id = OS_OBJECT_ID_UNDEFINED; - } + return_code = OS_FileSysStopVolume_Impl(OS_ObjectIndexFromToken(&token)); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + /* Free the entry in the master table */ + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } else { @@ -435,8 +423,7 @@ int32 OS_initfs(char *address, const char *devname, const char *volname, size_t int32 OS_mount(const char *devname, const char *mountpoint) { int32 return_code; - osal_index_t local_id; - OS_common_record_t * global; + OS_object_token_t token; OS_filesys_internal_record_t *local; /* Check parameters */ @@ -450,11 +437,10 @@ int32 OS_mount(const char *devname, const char *mountpoint) return OS_FS_ERR_PATH_TOO_LONG; } - return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, devname, &global); + return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, devname, &token); if (return_code == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); - local = &OS_filesys_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); /* * READY flag should be set (mkfs/initfs must have been called on this FS) @@ -477,7 +463,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) } else { - return_code = OS_FileSysMountVolume_Impl(local_id); + return_code = OS_FileSysMountVolume_Impl(OS_ObjectIndexFromToken(&token)); } if (return_code == OS_SUCCESS) @@ -488,7 +474,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) strcpy(local->virtual_mountpt, mountpoint); } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } if (return_code != OS_SUCCESS) @@ -511,8 +497,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) int32 OS_unmount(const char *mountpoint) { int32 return_code; - osal_index_t local_id; - OS_common_record_t * global; + OS_object_token_t token; OS_filesys_internal_record_t *local; /* Check parameters */ @@ -526,13 +511,12 @@ int32 OS_unmount(const char *mountpoint) return OS_FS_ERR_PATH_TOO_LONG; } - return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, - (void *)mountpoint, &global); + return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, + (void *)mountpoint, &token); if (return_code == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); - local = &OS_filesys_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); /* * FIXED flag should always be unset (these don't support mount/unmount at all) @@ -549,7 +533,7 @@ int32 OS_unmount(const char *mountpoint) } else { - return_code = OS_FileSysUnmountVolume_Impl(local_id); + return_code = OS_FileSysUnmountVolume_Impl(OS_ObjectIndexFromToken(&token)); } if (return_code == OS_SUCCESS) @@ -559,7 +543,7 @@ int32 OS_unmount(const char *mountpoint) local->flags &= ~(OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL); } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } if (return_code != OS_SUCCESS) @@ -580,10 +564,9 @@ int32 OS_unmount(const char *mountpoint) *-----------------------------------------------------------------*/ int32 OS_fsBlocksFree(const char *name) { - int32 return_code; - OS_statvfs_t statfs; - osal_index_t local_id; - OS_common_record_t *global; + int32 return_code; + OS_statvfs_t statfs; + OS_object_token_t token; if (name == NULL) { @@ -596,15 +579,13 @@ int32 OS_fsBlocksFree(const char *name) } return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, - (void *)name, &global); + (void *)name, &token); if (return_code == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); - - return_code = OS_FileSysStatVolume_Impl(local_id, &statfs); + return_code = OS_FileSysStatVolume_Impl(OS_ObjectIndexFromToken(&token), &statfs); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); if (return_code == OS_SUCCESS) { @@ -631,10 +612,9 @@ int32 OS_fsBlocksFree(const char *name) *-----------------------------------------------------------------*/ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) { - int32 return_code; - OS_statvfs_t statfs; - osal_index_t local_id; - OS_common_record_t *global; + int32 return_code; + OS_statvfs_t statfs; + OS_object_token_t token; if (name == NULL || bytes_free == NULL) { @@ -647,15 +627,13 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) } return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, - (void *)name, &global); + (void *)name, &token); if (return_code == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); + return_code = OS_FileSysStatVolume_Impl(OS_ObjectIndexFromToken(&token), &statfs); - return_code = OS_FileSysStatVolume_Impl(local_id, &statfs); - - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); if (return_code == OS_SUCCESS) { @@ -682,9 +660,8 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) *-----------------------------------------------------------------*/ int32 OS_chkfs(const char *name, bool repair) { - osal_index_t local_id; - int32 return_code; - OS_common_record_t *global; + OS_object_token_t token; + int32 return_code; /* ** Check for a null pointer @@ -704,15 +681,13 @@ int32 OS_chkfs(const char *name, bool repair) /* Get a reference lock, as a filesystem check could take some time. */ return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, - (void *)name, &global); + (void *)name, &token); if (return_code == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); - - return_code = OS_FileSysCheckVolume_Impl(local_id, repair); + return_code = OS_FileSysCheckVolume_Impl(OS_ObjectIndexFromToken(&token), repair); - OS_ObjectIdRefcountDecr(global); + OS_ObjectIdRelease(&token); } return return_code; @@ -729,9 +704,8 @@ int32 OS_chkfs(const char *name, bool repair) *-----------------------------------------------------------------*/ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) { - osal_index_t local_id; + OS_object_token_t token; int32 return_code; - OS_common_record_t * global; OS_filesys_internal_record_t *local; if (MountPoint == NULL || PhysDriveName == NULL) @@ -746,12 +720,11 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) /* Get a reference lock, as a filesystem check could take some time. */ return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, - (void *)MountPoint, &global); + (void *)MountPoint, &token); if (return_code == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); - local = &OS_filesys_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); if ((local->flags & OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM) != 0) { @@ -763,7 +736,7 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) return_code = OS_ERR_INCORRECT_OBJ_STATE; } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } else { @@ -835,10 +808,9 @@ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) *-----------------------------------------------------------------*/ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) { - osal_index_t local_id; + OS_object_token_t token; int32 return_code; const char * name_ptr; - OS_common_record_t * global; OS_filesys_internal_record_t *local; size_t SysMountPointLen; size_t VirtPathLen; @@ -888,7 +860,7 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) /* Get a reference lock, as a filesystem check could take some time. */ return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, - (void *)VirtualPath, &global); + (void *)VirtualPath, &token); if (return_code != OS_SUCCESS) { @@ -896,8 +868,7 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) } else { - OS_ObjectIdToArrayIndex(LOCAL_OBJID_TYPE, global->active_id, &local_id); - local = &OS_filesys_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); if ((local->flags & OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM) != 0) { @@ -913,7 +884,7 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) return_code = OS_ERR_INCORRECT_OBJ_STATE; } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } if (return_code == OS_SUCCESS) diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 858c583cd..44fee7580 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -210,6 +210,22 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) * (not used outside of this unit) **************************************************************/ +/*---------------------------------------------------------------- + * + * Function: OS_ObjectIdGlobalFromToken + * + * Purpose: Local helper routine, not part of OSAL API. + * Gets the global/common record associated with the token + * + * returns: pointer to record (never NULL - token MUST be valid) + * + *-----------------------------------------------------------------*/ +OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) +{ + uint32 base_idx = OS_GetBaseForObjectType(token->obj_type); + return &OS_common_table[base_idx + token->obj_idx]; +} + /*---------------------------------------------------------------- * * Function: OS_ObjectNameMatch @@ -219,7 +235,7 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) * a reference value (which must be a const char* string). * * This allows OS_ObjectIdFindByName() to be implemented using the - * generic OS_ObjectIdSearch() routine. + * generic OS_ObjectIdFindNextMatch() routine. * * returns: true if match, false otherwise * @@ -231,7 +247,7 @@ bool OS_ObjectNameMatch(void *ref, osal_index_t local_id, const OS_common_record /*---------------------------------------------------------------- * - * Function: OS_ObjectIdInitiateLock + * Function: OS_ObjectIdTransactionInit * * Purpose: Local helper routine, not part of OSAL API. * Initiate the locking process for the given mode and ID type, prior @@ -240,22 +256,67 @@ bool OS_ObjectNameMatch(void *ref, osal_index_t local_id, const OS_common_record * For any lock_mode other than OS_LOCK_MODE_NONE, this acquires the * global table lock for that ID type. * - * Once the lookup operation is completed, the OS_ObjectIdConvertLock() + * Once the lookup operation is completed, the OS_ObjectIdConvertToken() * routine should be used to convert this global lock into the actual * lock type requested (lock_mode). * *-----------------------------------------------------------------*/ -void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype) +int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_object_token_t *token) { + memset(token, 0, sizeof(*token)); + + if (OS_SharedGlobalVars.Initialized == false) + { + return OS_ERROR; + } + + /* + * only "exclusive" locks allowed after shutdown request (this is mode used for delete). + * All regular ops will be blocked. + */ + if (OS_SharedGlobalVars.ShutdownFlag == OS_SHUTDOWN_MAGIC_NUMBER && lock_mode != OS_LOCK_MODE_EXCLUSIVE) + { + return OS_ERR_INCORRECT_OBJ_STATE; + } + + if (idtype >= OS_OBJECT_TYPE_USER) + { + return OS_ERR_INCORRECT_OBJ_TYPE; + } + if (lock_mode != OS_LOCK_MODE_NONE) { OS_Lock_Global(idtype); } -} /* end OS_ObjectIdInitiateLock */ + + token->lock_mode = lock_mode; + token->obj_type = idtype; + token->obj_idx = OSAL_INDEX_C(-1); + + return OS_SUCCESS; + +} /* end OS_ObjectIdTransactionInit */ + +/*---------------------------------------------------------------- + * + * Function: OS_ObjectIdTransactionInit + * + * Purpose: Local helper routine, not part of OSAL API. + * Cancels/aborts a previously initialized transaction + * + *-----------------------------------------------------------------*/ +void OS_ObjectIdTransactionCancel(OS_object_token_t *token) +{ + if (token->lock_mode != OS_LOCK_MODE_NONE) + { + OS_Unlock_Global(token->obj_type); + token->lock_mode = OS_LOCK_MODE_NONE; + } +} /*---------------------------------------------------------------- * - * Function: OS_ObjectIdConvertLock + * Function: OS_ObjectIdConvertToken * * Purpose: Local helper routine, not part of OSAL API. * @@ -291,18 +352,19 @@ void OS_ObjectIdInitiateLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype) * all lock modes other than OS_LOCK_MODE_NONE. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t reference_id, - OS_common_record_t *obj) +int32 OS_ObjectIdConvertToken(OS_object_token_t *token) { int32 return_code = OS_ERROR; uint32 exclusive_bits = 0; uint32 attempts = 0; + OS_common_record_t *obj = OS_ObjectIdGlobalFromToken(token); + while (true) { /* Validate the integrity of the ID. As the "active_id" is a single * integer, we can do this check regardless of whether global is locked or not. */ - if (!OS_ObjectIdEqual(obj->active_id, reference_id)) + if (!OS_ObjectIdEqual(obj->active_id, OS_ObjectIdFromToken(token))) { /* The ID does not match, so unlock and return error. * This basically means the ID was stale or otherwise no longer invalid */ @@ -314,7 +376,7 @@ int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, os * The REFCOUNT and EXCLUSIVE lock modes require additional * conditions on before they can be successful. */ - if (lock_mode == OS_LOCK_MODE_REFCOUNT) + if (token->lock_mode == OS_LOCK_MODE_REFCOUNT) { /* As long as no exclusive request is pending, we can increment the * refcount and good to go. */ @@ -325,7 +387,7 @@ int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, os break; } } - else if (lock_mode == OS_LOCK_MODE_EXCLUSIVE) + else if (token->lock_mode == OS_LOCK_MODE_EXCLUSIVE) { /* * Set the exclusive request flag -- this will prevent anyone else from @@ -371,9 +433,9 @@ int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, os break; } - OS_Unlock_Global(idtype); + OS_Unlock_Global(token->obj_type); OS_TaskDelay_Impl(attempts); - OS_Lock_Global(idtype); + OS_Lock_Global(token->obj_type); } /* @@ -382,7 +444,7 @@ int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, os * If lock_mode is OS_LOCK_MODE_NONE, then the table was never locked * to begin with, and therefore never needs to be unlocked. */ - if (lock_mode != OS_LOCK_MODE_NONE) + if (token->lock_mode != OS_LOCK_MODE_NONE) { /* * In case any exclusive bits were set locally, unset them now @@ -391,25 +453,23 @@ int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, os obj->flags &= ~exclusive_bits; /* - * If the operation failed, then we always unlock the global table. - * * On a successful operation, the global is unlocked if it is a REFCOUNT * style lock. For other styles (GLOBAL or EXCLUSIVE) the global lock * should be maintained and returned to the caller. */ - if (return_code != OS_SUCCESS || lock_mode == OS_LOCK_MODE_REFCOUNT) + if (return_code == OS_SUCCESS && token->lock_mode == OS_LOCK_MODE_REFCOUNT) { - OS_Unlock_Global(idtype); + OS_Unlock_Global(token->obj_type); } } return return_code; -} /* end OS_ObjectIdConvertLock */ +} /* end OS_ObjectIdConvertToken */ /*---------------------------------------------------------------- * - * Function: OS_ObjectIdSearch + * Function: OS_ObjectIdFindNextMatch * * Purpose: Local helper routine, not part of OSAL API. * Locate an existing object using the supplied Match function. @@ -421,47 +481,43 @@ int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, osal_objtype_t idtype, os * returns: OS_ERR_NAME_NOT_FOUND if not found, OS_SUCCESS if match is found * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdSearch(osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_common_record_t **record) +int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_object_token_t *token) { int32 return_code; uint32 obj_count; - osal_index_t local_id; - OS_common_record_t *obj; + OS_common_record_t *base; + OS_common_record_t *record; - return_code = OS_ERR_NAME_NOT_FOUND; - obj = &OS_common_table[OS_GetBaseForObjectType(idtype)]; - obj_count = OS_GetMaxForObjectType(idtype); - local_id = 0; + return_code = OS_ERR_NAME_NOT_FOUND; + base = &OS_common_table[OS_GetBaseForObjectType(token->obj_type)]; + obj_count = OS_GetMaxForObjectType(token->obj_type); + token->obj_id = OS_OBJECT_ID_UNDEFINED; while (true) { - if (obj_count == 0) + ++token->obj_idx; + + if (token->obj_idx >= obj_count) { - obj = NULL; break; } - --obj_count; - if (OS_ObjectIdDefined(obj->active_id) && MatchFunc(arg, local_id, obj)) + record = OS_OBJECT_TABLE_GET(base, *token); + + if (OS_ObjectIdDefined(record->active_id) && MatchFunc(arg, token->obj_idx, record)) { - return_code = OS_SUCCESS; + return_code = OS_SUCCESS; + token->obj_id = record->active_id; break; } - ++obj; - ++local_id; - } - - if (record != NULL) - { - *record = obj; } return return_code; -} /* end OS_ObjectIdSearch */ +} /* end OS_ObjectIdFindNextMatch */ /*---------------------------------------------------------------- * - * Function: OS_ObjectIdFindNext + * Function: OS_ObjectIdFindNextFree * * Purpose: Local helper routine, not part of OSAL API. * Find the next available Object ID of the given type @@ -476,18 +532,20 @@ int32 OS_ObjectIdSearch(osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, v * * returns: OS_SUCCESS if an empty location was found. *-----------------------------------------------------------------*/ -int32 OS_ObjectIdFindNext(osal_objtype_t idtype, osal_index_t *array_index, OS_common_record_t **record) +int32 OS_ObjectIdFindNextFree(OS_object_token_t *token) { uint32 max_id; uint32 base_id; - uint32 local_id = 0; - uint32 idvalue; + uint32 local_id; + uint32 serial; uint32 i; int32 return_code; OS_common_record_t *obj = NULL; + OS_objtype_state_t *objtype_state; - base_id = OS_GetBaseForObjectType(idtype); - max_id = OS_GetMaxForObjectType(idtype); + base_id = OS_GetBaseForObjectType(token->obj_type); + max_id = OS_GetMaxForObjectType(token->obj_type); + objtype_state = &OS_objtype_state[token->obj_type]; if (max_id == 0) { @@ -496,21 +554,21 @@ int32 OS_ObjectIdFindNext(osal_objtype_t idtype, osal_index_t *array_index, OS_c * Return the "not implemented" to differentiate between * this case vs. running out of valid slots */ return_code = OS_ERR_NOT_IMPLEMENTED; - idvalue = 0; + serial = 0; } else { return_code = OS_ERR_NO_FREE_IDS; - idvalue = OS_ObjectIdToSerialNumber_Impl(OS_objtype_state[idtype].last_id_issued); + serial = OS_ObjectIdToSerialNumber_Impl(objtype_state->last_id_issued); } for (i = 0; i < max_id; ++i) { - local_id = (++idvalue) % max_id; - if (idvalue >= OS_OBJECT_INDEX_MASK) + local_id = (++serial) % max_id; + if (serial >= OS_OBJECT_INDEX_MASK) { /* reset to beginning of ID space */ - idvalue = local_id; + serial = local_id; } obj = &OS_common_table[local_id + base_id]; if (!OS_ObjectIdDefined(obj->active_id)) @@ -522,31 +580,27 @@ int32 OS_ObjectIdFindNext(osal_objtype_t idtype, osal_index_t *array_index, OS_c if (return_code == OS_SUCCESS) { - OS_ObjectIdCompose_Impl(idtype, idvalue, &obj->active_id); + token->obj_idx = OSAL_INDEX_C(local_id); + OS_ObjectIdCompose_Impl(token->obj_type, serial, &token->obj_id); /* Ensure any data in the record has been cleared */ + obj->active_id = token->obj_id; obj->name_entry = NULL; obj->creator = OS_TaskGetId(); obj->refcount = 0; - } - if (return_code != OS_SUCCESS) - { - obj = NULL; - local_id = 0; + /* preemptively update the last id issued */ + objtype_state->last_id_issued = token->obj_id; } - if (array_index != NULL) - { - *array_index = OSAL_INDEX_C(local_id); - } - if (record != NULL) + if (return_code != OS_SUCCESS) { - *record = obj; + token->obj_idx = OSAL_INDEX_C(-1); + token->obj_id = OS_OBJECT_ID_UNDEFINED; } return return_code; -} /* end OS_ObjectIdFindNext */ +} /* end OS_ObjectIdFindNextFree */ /* ********************************************************************************* @@ -694,10 +748,9 @@ void OS_Unlock_Global(osal_objtype_t idtype) * were detected while validating the ID. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, osal_id_t *outid) +int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, osal_id_t *outid) { - osal_objtype_t idtype = OS_ObjectIdToType_Impl(record->active_id); - osal_id_t callback_id; + osal_id_t final_id; /* if operation was unsuccessful, then clear * the active_id field within the record, so @@ -706,72 +759,61 @@ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, * Otherwise, ensure that the record_id to be * exported is sane (it always should be) */ - if (operation_status != OS_SUCCESS) - { - record->active_id = OS_OBJECT_ID_UNDEFINED; - } - else if (idtype == 0 || idtype >= OS_OBJECT_TYPE_USER) + if (operation_status == OS_SUCCESS) { - /* should never happen - indicates a bug. */ - operation_status = OS_ERR_INVALID_ID; - record->active_id = OS_OBJECT_ID_UNDEFINED; + final_id = token->obj_id; } else { - /* success */ - OS_objtype_state[idtype].last_id_issued = record->active_id; + final_id = OS_OBJECT_ID_UNDEFINED; } - /* snapshot the ID for callback - will be needed after unlock */ - callback_id = record->active_id; + /* Either way we must unlock the object type */ + OS_ObjectIdTransactionFinish(token, &final_id); - if (outid != NULL) + /* Give event callback to the application */ + if (operation_status == OS_SUCCESS) { - /* always write the final value to the output buffer */ - *outid = record->active_id; + OS_NotifyEvent(OS_EVENT_RESOURCE_CREATED, token->obj_id, NULL); } - /* Either way we must unlock the object type */ - OS_Unlock_Global(idtype); - - /* Give event callback to the application */ - if (OS_ObjectIdDefined(callback_id)) + if (outid != NULL) { - OS_NotifyEvent(OS_EVENT_RESOURCE_CREATED, callback_id, NULL); + /* always write the final value to the output buffer */ + *outid = final_id; } return operation_status; -} /* end OS_ObjectIdFinalizeNew */ +} /* end OS_ObjectIdFinalizeNew(, &token, ) */ /*---------------------------------------------------------------- - Function: OS_ObjectIdFinalizeDelete + Function: OS_ObjectIdFinalizeDelete(, &token) Purpose: Helper routine, not part of OSAL public API. See description in prototype ------------------------------------------------------------------*/ -int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *record) +int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_object_token_t *token) { - osal_objtype_t idtype = OS_ObjectIdToType_Impl(record->active_id); - osal_id_t callback_id; + osal_id_t final_id; /* Clear the OSAL ID if successful - this returns the record to the pool */ if (operation_status == OS_SUCCESS) { - callback_id = record->active_id; - record->active_id = OS_OBJECT_ID_UNDEFINED; + final_id = OS_OBJECT_ID_UNDEFINED; } else { - callback_id = OS_OBJECT_ID_UNDEFINED; + /* this restores the original ID */ + final_id = token->obj_id; } /* Either way we must unlock the object type */ - OS_Unlock_Global(idtype); + OS_ObjectIdTransactionFinish(token, &final_id); /* Give event callback to the application */ - if (OS_ObjectIdDefined(callback_id)) + if (operation_status == OS_SUCCESS) { - OS_NotifyEvent(OS_EVENT_RESOURCE_DELETED, callback_id, NULL); + OS_NotifyEvent(OS_EVENT_RESOURCE_DELETED, token->obj_id, NULL); } return operation_status; @@ -792,32 +834,26 @@ int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *reco * *-----------------------------------------------------------------*/ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, - OS_common_record_t **record) + OS_object_token_t *token) { - int32 return_code; - OS_common_record_t *obj; + int32 return_code; - OS_ObjectIdInitiateLock(lock_mode, idtype); + OS_ObjectIdTransactionInit(lock_mode, idtype, token); - return_code = OS_ObjectIdSearch(idtype, MatchFunc, arg, &obj); + return_code = OS_ObjectIdFindNextMatch(MatchFunc, arg, token); if (return_code == OS_SUCCESS) { /* - * The "ConvertLock" routine will return with the global lock + * The "ConvertToken" routine will return with the global lock * in a state appropriate for returning to the caller, as indicated * by the "check_mode" parameter. */ - return_code = OS_ObjectIdConvertLock(lock_mode, idtype, obj->active_id, obj); + return_code = OS_ObjectIdConvertToken(token); } else if (lock_mode != OS_LOCK_MODE_NONE) { - OS_Unlock_Global(idtype); - } - - if (record != NULL) - { - *record = obj; + OS_ObjectIdTransactionCancel(token); } return return_code; @@ -837,10 +873,9 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS * returns: OS_ERR_NAME_NOT_FOUND if not found, OS_SUCCESS if match is found * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, - OS_common_record_t **record) +int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, OS_object_token_t *token) { - return OS_ObjectIdGetBySearch(lock_mode, idtype, OS_ObjectNameMatch, (void *)name, record); + return OS_ObjectIdGetBySearch(lock_mode, idtype, OS_ObjectNameMatch, (void *)name, token); } /* end OS_ObjectIdGetByName */ @@ -857,8 +892,8 @@ int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, cons *-----------------------------------------------------------------*/ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t *object_id) { - int32 return_code; - OS_common_record_t *global; + int32 return_code; + OS_object_token_t token; /* * As this is an internal-only function, calling it will NULL is allowed. @@ -875,11 +910,12 @@ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t * return OS_ERR_NAME_TOO_LONG; } - return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_GLOBAL, idtype, name, &global); + return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_GLOBAL, idtype, name, &token); if (return_code == OS_SUCCESS) { - *object_id = global->active_id; - OS_Unlock_Global(idtype); + *object_id = token.obj_id; + + OS_ObjectIdRelease(&token); } return return_code; @@ -902,87 +938,118 @@ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t * * If this returns something other than OS_SUCCESS then the global is NOT locked. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, osal_index_t *array_index, - OS_common_record_t **record) +int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, OS_object_token_t *token) { int32 return_code; - if (OS_SharedGlobalVars.Initialized == false) + return_code = OS_ObjectIdTransactionInit(lock_mode, idtype, token); + if (return_code != OS_SUCCESS) { - return OS_ERROR; + return return_code; } - /* - * Special case to allow only OS_LOCK_MODE_EXCLUSIVE during shutdowns - * (This is the lock mode used to delete objects) - */ - if (OS_SharedGlobalVars.ShutdownFlag == OS_SHUTDOWN_MAGIC_NUMBER && lock_mode != OS_LOCK_MODE_EXCLUSIVE) + return_code = OS_ObjectIdToArrayIndex(idtype, id, &token->obj_idx); + if (return_code == OS_SUCCESS) { - return OS_ERR_INCORRECT_OBJ_STATE; + token->obj_id = id; + + /* + * The "ConvertToken" routine will return with the global lock + * in a state appropriate for returning to the caller, as indicated + * by the "check_mode" paramter. + * + * Note If this operation fails, then it always unlocks the global for + * all check_mode's other than NONE. + */ + return_code = OS_ObjectIdConvertToken(token); } - return_code = OS_ObjectIdToArrayIndex(idtype, id, array_index); if (return_code != OS_SUCCESS) { - return return_code; + OS_ObjectIdTransactionCancel(token); } - *record = &OS_common_table[*array_index + OS_GetBaseForObjectType(idtype)]; - - OS_ObjectIdInitiateLock(lock_mode, idtype); - - /* - * The "ConvertLock" routine will return with the global lock - * in a state appropriate for returning to the caller, as indicated - * by the "check_mode" paramter. - * - * Note If this operation fails, then it always unlocks the global for - * all check_mode's other than NONE. - */ - return_code = OS_ObjectIdConvertLock(lock_mode, idtype, id, *record); - return return_code; } /* end OS_ObjectIdGetById */ /*---------------------------------------------------------------- * - * Function: OS_ObjectIdRefcountDecr + * Function: OS_ObjectIdTransactionFinish * - * Purpose: Local helper routine, not part of OSAL API. - * Decrement the reference count on the resource record, which must have been - * acquired (incremented) by the caller prior to this. + * Purpose: Complete a transaction which was previously obtained via + * OS_ObjectIdGetById() or OS_ObjectIdGetBySearch(). + * + * This also updates the ID from the value in the final_id parameter, which + * is used for create/delete. * - * returns: OS_SUCCESS if decremented successfully. + * If no ID update is pending, then NULL may be passed and the ID will not + * be changed. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record) +void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id) { - int32 return_code; - osal_objtype_t idtype = OS_ObjectIdToType_Impl(record->active_id); + OS_common_record_t *record; - if (idtype == 0 || !OS_ObjectIdDefined(record->active_id)) + if (token->lock_mode == OS_LOCK_MODE_NONE) { - return_code = OS_ERR_INVALID_ID; + /* nothing to do */ + return; } - else + + record = OS_ObjectIdGlobalFromToken(token); + + /* re-acquire global table lock to adjust refcount */ + if (token->lock_mode == OS_LOCK_MODE_REFCOUNT) { - OS_Lock_Global(idtype); + OS_Lock_Global(token->obj_type); if (record->refcount > 0) { --record->refcount; - return_code = OS_SUCCESS; - } - else - { - return_code = OS_ERR_INCORRECT_OBJ_STATE; } + } - OS_Unlock_Global(idtype); + /* + * at this point the global mutex is always held, either + * from re-acquiring it above or it is still held from + * the original lock when using OS_LOCK_MODE_GLOBAL. + * + * If an ID update was pending (i.e. for a create/delete op) + * then do the ID update now while holding the mutex. + */ + if (final_id != NULL) + { + record->active_id = *final_id; } - return return_code; -} /* end OS_ObjectIdRefcountDecr */ + /* always unlock (this also covers OS_LOCK_MODE_GLOBAL case) */ + OS_Unlock_Global(token->obj_type); + + /* + * Setting to "NONE" indicates that this token has been + * released, and should not be released again. + */ + token->lock_mode = OS_LOCK_MODE_NONE; +} + +/*---------------------------------------------------------------- + * + * Function: OS_ObjectIdRelease + * + * Purpose: Release/Unlock a transaction token which was previously obtained via + * OS_ObjectIdGetById() or OS_ObjectIdGetBySearch(). + * + * This is used for completing normal operations other than create/delete - + * that is where the same ID exists before and after the transaction without + * change. + * + * (There is a dedicated routine for finalization of create and delete ops) + * + *-----------------------------------------------------------------*/ +void OS_ObjectIdRelease(OS_object_token_t *token) +{ + OS_ObjectIdTransactionFinish(token, NULL); +} /*---------------------------------------------------------------- * @@ -1014,30 +1081,28 @@ int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record) * manipulate the global lock at all. * *-----------------------------------------------------------------*/ -int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index_t *array_index, - OS_common_record_t **record) +int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, OS_object_token_t *token) { int32 return_code; - if (OS_SharedGlobalVars.Initialized == false || OS_SharedGlobalVars.ShutdownFlag == OS_SHUTDOWN_MAGIC_NUMBER) + if (OS_SharedGlobalVars.ShutdownFlag == OS_SHUTDOWN_MAGIC_NUMBER) { - return OS_ERROR; + return OS_ERR_INCORRECT_OBJ_STATE; } - if (idtype >= OS_OBJECT_TYPE_USER) + return_code = OS_ObjectIdTransactionInit(OS_LOCK_MODE_EXCLUSIVE, idtype, token); + if (return_code != OS_SUCCESS) { - return OS_ERR_INCORRECT_OBJ_TYPE; + return return_code; } - OS_Lock_Global(idtype); - /* * Check if an object of the same name already exits. * If so, a new object cannot be allocated. */ if (name != NULL) { - return_code = OS_ObjectIdSearch(idtype, OS_ObjectNameMatch, (void *)name, record); + return_code = OS_ObjectIdFindNextMatch(OS_ObjectNameMatch, (void *)name, token); } else { @@ -1050,24 +1115,140 @@ int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index } else { - return_code = OS_ObjectIdFindNext(idtype, array_index, record); + return_code = OS_ObjectIdFindNextFree(token); } if (return_code == OS_SUCCESS) { - return_code = OS_NotifyEvent(OS_EVENT_RESOURCE_ALLOCATED, (*record)->active_id, NULL); + return_code = OS_NotifyEvent(OS_EVENT_RESOURCE_ALLOCATED, token->obj_id, NULL); } /* If allocation failed for any reason, unlock the global. * otherwise the global should stay locked so remaining initialization can be done */ if (return_code != OS_SUCCESS) { - OS_Unlock_Global(idtype); + OS_ObjectIdTransactionCancel(token); } return return_code; } /* end OS_ObjectIdAllocateNew */ +/*---------------------------------------------------------------- + Function: OS_ObjectIdTransferToken + + Purpose: Transfer ownership of a token to another buffer + ------------------------------------------------------------------*/ +void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t *token_to) +{ + /* start with a simple copy */ + *token_to = *token_from; + + /* + * nullify the old token, such that if release/cancel + * is invoked it will have no effect (the real lock is + * now on token_to). + */ + token_from->lock_mode = OS_LOCK_MODE_NONE; +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorInit + + Purpose: Start the process of iterating through OSAL objects + ------------------------------------------------------------------*/ +int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, osal_objtype_t objtype, + OS_object_iter_t *iter) +{ + iter->match = matchfunc; + iter->arg = matcharg; + iter->limit = OS_GetMaxForObjectType(objtype); + iter->base = &OS_common_table[OS_GetBaseForObjectType(objtype)]; + + return OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, objtype, &iter->token); +} + +/*---------------------------------------------------------------- + Function: OS_ObjectFilterActive + + Purpose: Match function to iterate only active objects + ------------------------------------------------------------------*/ +bool OS_ObjectFilterActive(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +{ + return OS_ObjectIdDefined(obj->active_id); +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIterateActive + + Purpose: Start the process of iterating through OSAL objects + ------------------------------------------------------------------*/ +int32 OS_ObjectIdIterateActive(osal_objtype_t objtype, OS_object_iter_t *iter) +{ + return OS_ObjectIdIteratorInit(OS_ObjectFilterActive, NULL, objtype, iter); +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorGetNext + + Purpose: Move iterator to the next entry + ------------------------------------------------------------------*/ +bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter) +{ + OS_common_record_t *record; + bool got_next; + + got_next = false; + iter->token.obj_id = OS_OBJECT_ID_UNDEFINED; + + do + { + ++iter->token.obj_idx; + if (iter->token.obj_idx >= iter->limit) + { + break; + } + + record = OS_OBJECT_TABLE_GET(iter->base, iter->token); + if (iter->match == NULL || iter->match(iter->arg, iter->token.obj_idx, record)) + { + iter->token.obj_id = record->active_id; + got_next = true; + } + } while (!got_next); + + return got_next; +} /* end OS_ObjectIdIteratorGetNext */ + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorDestroy + + Purpose: Release iterator resources + ------------------------------------------------------------------*/ +void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter) +{ + OS_ObjectIdTransactionCancel(&iter->token); +} + +/*---------------------------------------------------------------- + Function: OS_ObjectIdIteratorProcessEntry + + Purpose: Call a handler function on an iterator object ID + ------------------------------------------------------------------*/ +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t)) +{ + int32 status; + + /* + * This needs to temporarily unlock the global, + * call the handler function, then re-lock. + */ + OS_Unlock_Global(iter->token.obj_type); + status = func(iter->token.obj_id); + OS_Lock_Global(iter->token.obj_type); + + return status; +} + /* ********************************************************************************* * PUBLIC API (these functions may be called externally) @@ -1189,11 +1370,10 @@ osal_objtype_t OS_IdentifyObject(osal_id_t object_id) *-----------------------------------------------------------------*/ int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size) { - osal_objtype_t idtype; OS_common_record_t *record; int32 return_code; size_t name_len; - osal_index_t local_id; + OS_object_token_t token; /* sanity check the passed-in buffer and size */ if (buffer == NULL || buffer_size == 0) @@ -1208,10 +1388,11 @@ int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size) */ buffer[0] = 0; - idtype = OS_ObjectIdToType_Impl(object_id); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, idtype, object_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_ObjectIdToType_Impl(object_id), object_id, &token); if (return_code == OS_SUCCESS) { + record = OS_ObjectIdGlobalFromToken(&token); + if (record->name_entry != NULL) { name_len = strlen(record->name_entry); @@ -1224,7 +1405,8 @@ int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size) memcpy(buffer, record->name_entry, name_len); buffer[name_len] = 0; } - OS_Unlock_Global(idtype); + + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 2bd14899f..6510bf44c 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -181,11 +181,11 @@ int32 OS_ModuleAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename, uint32 flags) { - char translated_path[OS_MAX_LOCAL_PATH_LEN]; - int32 return_code; - int32 filename_status; - osal_index_t local_id; - OS_common_record_t *record; + char translated_path[OS_MAX_LOCAL_PATH_LEN]; + int32 return_code; + int32 filename_status; + OS_object_token_t token; + OS_module_internal_record_t *module; /* ** Check parameters @@ -215,13 +215,15 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f filename_status = OS_TranslatePath(filename, translated_path); /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, module_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, module_name, &token); if (return_code == OS_SUCCESS) { - memset(&OS_module_table[local_id], 0, sizeof(OS_module_internal_record_t)); - strncpy(OS_module_table[local_id].module_name, module_name, OS_MAX_API_NAME); - record->name_entry = OS_module_table[local_id].module_name; - OS_module_table[local_id].flags = flags; /* save user-supplied flags */ + module = OS_OBJECT_TABLE_GET(OS_module_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, module, module_name, module_name); + + module->flags = flags; /* save user-supplied flags */ /* * Check the statically-linked module list. @@ -237,7 +239,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f if (return_code == OS_SUCCESS) { /* mark this as a statically loaded module */ - OS_module_table[local_id].module_type = OS_MODULE_TYPE_STATIC; + module->module_type = OS_MODULE_TYPE_STATIC; } else { @@ -254,16 +256,16 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f else { /* supplied filename was valid, so store a copy for future reference */ - strncpy(OS_module_table[local_id].file_name, filename, OS_MAX_PATH_LEN); - OS_module_table[local_id].module_type = OS_MODULE_TYPE_DYNAMIC; + strncpy(module->file_name, filename, OS_MAX_PATH_LEN); + module->module_type = OS_MODULE_TYPE_DYNAMIC; /* Now call the OS-specific implementation. This reads info from the module table. */ - return_code = OS_ModuleLoad_Impl(local_id, translated_path); + return_code = OS_ModuleLoad_Impl(OS_ObjectIndexFromToken(&token), translated_path); } } /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, module_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, module_id); } return (return_code); @@ -280,25 +282,27 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f *-----------------------------------------------------------------*/ int32 OS_ModuleUnload(osal_id_t module_id) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + OS_module_internal_record_t *module; + int32 return_code; + OS_object_token_t token; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, module_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, module_id, &token); if (return_code == OS_SUCCESS) { + module = OS_OBJECT_TABLE_GET(OS_module_table, token); + /* * Only call the implementation if the file was actually loaded. * If this is a static module, then this is just a placeholder and * it means there was no file actually loaded. */ - if (OS_module_table[local_id].module_type == OS_MODULE_TYPE_DYNAMIC) + if (module->module_type == OS_MODULE_TYPE_DYNAMIC) { - return_code = OS_ModuleUnload_Impl(local_id); + return_code = OS_ModuleUnload_Impl(OS_ObjectIndexFromToken(&token)); } /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -314,9 +318,10 @@ int32 OS_ModuleUnload(osal_id_t module_id) *-----------------------------------------------------------------*/ int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_prop) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + OS_common_record_t * record; + OS_module_internal_record_t *module; + int32 return_code; + OS_object_token_t token; /* Check parameters */ if (module_prop == NULL) @@ -326,15 +331,18 @@ int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_prop) memset(module_prop, 0, sizeof(OS_module_prop_t)); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, module_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, module_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_module_table, token); + module = OS_OBJECT_TABLE_GET(OS_module_table, token); + strncpy(module_prop->name, record->name_entry, OS_MAX_API_NAME - 1); - strncpy(module_prop->filename, OS_module_table[local_id].file_name, OS_MAX_API_NAME - 1); + strncpy(module_prop->filename, module->file_name, OS_MAX_API_NAME - 1); - return_code = OS_ModuleGetInfo_Impl(local_id, module_prop); + return_code = OS_ModuleGetInfo_Impl(OS_ObjectIndexFromToken(&token), module_prop); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; @@ -402,7 +410,7 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const int32 return_code; int32 staticsym_status; OS_common_record_t *record; - osal_index_t local_id; + OS_object_token_t token; /* ** Check parameters @@ -412,10 +420,12 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const return (OS_INVALID_POINTER); } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, module_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, module_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_ModuleSymbolLookup_Impl(local_id, symbol_address, symbol_name); + record = OS_OBJECT_TABLE_GET(OS_global_module_table, token); + + return_code = OS_ModuleSymbolLookup_Impl(OS_ObjectIndexFromToken(&token), symbol_address, symbol_name); if (return_code != OS_SUCCESS) { /* look for a static symbol that also matches this module name */ @@ -430,15 +440,14 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const return_code = staticsym_status; } } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + + OS_ObjectIdRelease(&token); } return (return_code); } /* end OS_ModuleSymbolLookup */ - - /*---------------------------------------------------------------- * * Function: OS_SymbolTableDump diff --git a/src/os/shared/src/osapi-mutex.c b/src/os/shared/src/osapi-mutex.c index 5e1a282ff..73c9adab1 100644 --- a/src/os/shared/src/osapi-mutex.c +++ b/src/os/shared/src/osapi-mutex.c @@ -88,9 +88,9 @@ int32 OS_MutexAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_mutex_internal_record_t *mutex; /* Check for NULL pointers */ if (sem_id == NULL || sem_name == NULL) @@ -104,18 +104,19 @@ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal table */ - strcpy(OS_mutex_table[local_id].obj_name, sem_name); - record->name_entry = OS_mutex_table[local_id].obj_name; + mutex = OS_OBJECT_TABLE_GET(OS_mutex_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, mutex, obj_name, sem_name); /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_MutSemCreate_Impl(local_id, options); + return_code = OS_MutSemCreate_Impl(OS_ObjectIndexFromToken(&token), options); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, sem_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, sem_id); } return return_code; @@ -132,17 +133,16 @@ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) *-----------------------------------------------------------------*/ int32 OS_MutSemDelete(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_MutSemDelete_Impl(local_id); + return_code = OS_MutSemDelete_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -159,28 +159,28 @@ int32 OS_MutSemDelete(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_MutSemGive(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; - osal_id_t self_task; + OS_mutex_internal_record_t *mutex; + OS_object_token_t token; + int32 return_code; + osal_id_t self_task; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { + mutex = OS_OBJECT_TABLE_GET(OS_mutex_table, token); + self_task = OS_TaskGetId(); - if (!OS_ObjectIdEqual(OS_mutex_table[local_id].last_owner, self_task)) + if (!OS_ObjectIdEqual(mutex->last_owner, self_task)) { - OS_DEBUG("WARNING: Task %lu giving mutex %lu while owned by task %lu\n", - OS_ObjectIdToInteger(self_task), - OS_ObjectIdToInteger(sem_id), - OS_ObjectIdToInteger(OS_mutex_table[local_id].last_owner)); + OS_DEBUG("WARNING: Task %lu giving mutex %lu while owned by task %lu\n", OS_ObjectIdToInteger(self_task), + OS_ObjectIdToInteger(sem_id), OS_ObjectIdToInteger(mutex->last_owner)); } - OS_mutex_table[local_id].last_owner = OS_OBJECT_ID_UNDEFINED; + mutex->last_owner = OS_OBJECT_ID_UNDEFINED; - return_code = OS_MutSemGive_Impl(local_id); + return_code = OS_MutSemGive_Impl(OS_ObjectIndexFromToken(&token)); } return return_code; @@ -197,29 +197,30 @@ int32 OS_MutSemGive(osal_id_t sem_id) *-----------------------------------------------------------------*/ int32 OS_MutSemTake(osal_id_t sem_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; - osal_id_t self_task; + OS_mutex_internal_record_t *mutex; + OS_object_token_t token; + int32 return_code; + osal_id_t self_task; /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_MutSemTake_Impl(local_id); + mutex = OS_OBJECT_TABLE_GET(OS_mutex_table, token); + + return_code = OS_MutSemTake_Impl(OS_ObjectIndexFromToken(&token)); if (return_code == OS_SUCCESS) { self_task = OS_TaskGetId(); - if (OS_ObjectIdDefined(OS_mutex_table[local_id].last_owner)) + if (OS_ObjectIdDefined(mutex->last_owner)) { OS_DEBUG("WARNING: Task %lu taking mutex %lu while owned by task %lu\n", - OS_ObjectIdToInteger(self_task), - OS_ObjectIdToInteger(sem_id), - OS_ObjectIdToInteger(OS_mutex_table[local_id].last_owner)); + OS_ObjectIdToInteger(self_task), OS_ObjectIdToInteger(sem_id), + OS_ObjectIdToInteger(mutex->last_owner)); } - OS_mutex_table[local_id].last_owner = self_task; + mutex->last_owner = self_task; } } @@ -262,7 +263,7 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) { OS_common_record_t *record; int32 return_code; - osal_index_t local_id; + OS_object_token_t token; /* Check parameters */ if (mut_prop == NULL) @@ -272,15 +273,17 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) memset(mut_prop, 0, sizeof(OS_mut_sem_prop_t)); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sem_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_mutex_table, token); + strncpy(mut_prop->name, record->name_entry, OS_MAX_API_NAME - 1); mut_prop->creator = record->creator; - return_code = OS_MutSemGetInfo_Impl(local_id, mut_prop); + return_code = OS_MutSemGetInfo_Impl(OS_ObjectIndexFromToken(&token), mut_prop); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index 0a5359656..edcc033b5 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -78,22 +78,20 @@ int32 OS_ConsoleAPI_Init(void) { OS_console_internal_record_t *console; int32 return_code; - osal_index_t local_id; - OS_common_record_t * record; + OS_object_token_t token; memset(&OS_console_table, 0, sizeof(OS_console_table)); /* * Configure a console device to be used for OS_printf() calls. */ - return_code = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_CONSOLE, OS_PRINTF_CONSOLE_NAME, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_CONSOLE, OS_PRINTF_CONSOLE_NAME, &token); if (return_code == OS_SUCCESS) { - console = &OS_console_table[local_id]; + console = OS_OBJECT_TABLE_GET(OS_console_table, token); - record->name_entry = console->device_name; - strncpy(console->device_name, OS_PRINTF_CONSOLE_NAME, sizeof(console->device_name) - 1); - console->device_name[sizeof(console->device_name) - 1] = 0; + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, console, device_name, OS_PRINTF_CONSOLE_NAME); /* * Initialize the ring buffer pointers @@ -101,10 +99,10 @@ int32 OS_ConsoleAPI_Init(void) console->BufBase = OS_printf_buffer_mem; console->BufSize = sizeof(OS_printf_buffer_mem); - return_code = OS_ConsoleCreate_Impl(local_id); + return_code = OS_ConsoleCreate_Impl(OS_ObjectIndexFromToken(&token)); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, &OS_SharedGlobalVars.PrintfConsoleId); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, &OS_SharedGlobalVars.PrintfConsoleId); /* * Printf can be enabled by default now that the buffer is configured. @@ -192,15 +190,14 @@ static int32 OS_Console_CopyOut(OS_console_internal_record_t *console, const cha int32 OS_ConsoleWrite(osal_id_t console_id, const char *Str) { int32 return_code; - OS_common_record_t * record; - osal_index_t local_id; + OS_object_token_t token; OS_console_internal_record_t *console; size_t PendingWritePos; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_CONSOLE, console_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_CONSOLE, console_id, &token); if (return_code == OS_SUCCESS) { - console = &OS_console_table[local_id]; + console = OS_OBJECT_TABLE_GET(OS_console_table, token); /* * The entire string should be put to the ring buffer, @@ -236,9 +233,9 @@ int32 OS_ConsoleWrite(osal_id_t console_id, const char *Str) * This is done while still locked, so it can support * either a synchronous or asynchronous implementation. */ - OS_ConsoleWakeup_Impl(local_id); + OS_ConsoleWakeup_Impl(OS_ObjectIndexFromToken(&token)); - OS_Unlock_Global(OS_OBJECT_TYPE_OS_CONSOLE); + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-queue.c b/src/os/shared/src/osapi-queue.c index 51833c843..0105db711 100644 --- a/src/os/shared/src/osapi-queue.c +++ b/src/os/shared/src/osapi-queue.c @@ -90,9 +90,9 @@ int32 OS_QueueAPI_Init(void) int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, uint32 flags) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_queue_internal_record_t *queue; if (queue_name == NULL || queue_id == NULL) { @@ -110,20 +110,22 @@ int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcoun } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, queue_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, queue_name, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal queue table */ - strcpy(OS_queue_table[local_id].queue_name, queue_name); - record->name_entry = OS_queue_table[local_id].queue_name; - OS_queue_table[local_id].max_depth = queue_depth; - OS_queue_table[local_id].max_size = data_size; + queue = OS_OBJECT_TABLE_GET(OS_queue_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, queue, queue_name, queue_name); + + queue->max_depth = queue_depth; + queue->max_size = data_size; /* Now call the OS-specific implementation. This reads info from the queue table. */ - return_code = OS_QueueCreate_Impl(local_id, flags); + return_code = OS_QueueCreate_Impl(OS_ObjectIndexFromToken(&token), flags); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, queue_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, queue_id); } return return_code; @@ -140,17 +142,16 @@ int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcoun *-----------------------------------------------------------------*/ int32 OS_QueueDelete(osal_id_t queue_id) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, queue_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, queue_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_QueueDelete_Impl(local_id); + return_code = OS_QueueDelete_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -167,9 +168,9 @@ int32 OS_QueueDelete(osal_id_t queue_id) *-----------------------------------------------------------------*/ int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; + OS_queue_internal_record_t *queue; /* Check Parameters */ if (data == NULL || size_copied == NULL) @@ -178,10 +179,12 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copi } else { - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &token); if (return_code == OS_SUCCESS) { - if (size < OS_queue_table[local_id].max_size) + queue = OS_OBJECT_TABLE_GET(OS_queue_table, token); + + if (size < queue->max_size) { /* ** The buffer that the user is passing in is potentially too small @@ -191,7 +194,7 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copi } else { - return_code = OS_QueueGet_Impl(local_id, data, size, size_copied, timeout); + return_code = OS_QueueGet_Impl(OS_ObjectIndexFromToken(&token), data, size, size_copied, timeout); } } } @@ -209,9 +212,9 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copi *-----------------------------------------------------------------*/ int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flags) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; + OS_queue_internal_record_t *queue; /* Check Parameters */ if (data == NULL) @@ -220,10 +223,22 @@ int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flag } else { - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_QueuePut_Impl(local_id, data, size, flags); + queue = OS_OBJECT_TABLE_GET(OS_queue_table, token); + + if (size > queue->max_size) + { + /* + ** The buffer that the user is passing in is too large + */ + return_code = OS_QUEUE_INVALID_SIZE; + } + else + { + return_code = OS_QueuePut_Impl(OS_ObjectIndexFromToken(&token), data, size, flags); + } } } @@ -265,7 +280,7 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) { OS_common_record_t *record; int32 return_code; - osal_index_t local_id; + OS_object_token_t token; /* Check parameters */ if (queue_prop == NULL) @@ -275,9 +290,11 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) memset(queue_prop, 0, sizeof(OS_queue_prop_t)); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, queue_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, queue_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_queue_table, token); + strncpy(queue_prop->name, record->name_entry, OS_MAX_API_NAME - 1); queue_prop->creator = record->creator; @@ -286,7 +303,7 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) * But this could be added in the future (i.e. current/max depth, msg size, etc) */ - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-select.c b/src/os/shared/src/osapi-select.c index f48c27a34..cb759afb5 100644 --- a/src/os/shared/src/osapi-select.c +++ b/src/os/shared/src/osapi-select.c @@ -60,18 +60,18 @@ *-----------------------------------------------------------------*/ int32 OS_SelectSingle(osal_id_t objid, uint32 *StateFlags, int32 msecs) { - int32 return_code; - osal_index_t local_id; - OS_common_record_t *record; + int32 return_code; + OS_object_token_t token; if (StateFlags == NULL) return OS_INVALID_POINTER; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, objid, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, objid, &token); if (return_code == OS_SUCCESS) { - return_code = OS_SelectSingle_Impl(local_id, StateFlags, msecs); - OS_ObjectIdRefcountDecr(record); + return_code = OS_SelectSingle_Impl(OS_ObjectIndexFromToken(&token), StateFlags, msecs); + + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-shell.c b/src/os/shared/src/osapi-shell.c index 50e195068..e35e103f2 100644 --- a/src/os/shared/src/osapi-shell.c +++ b/src/os/shared/src/osapi-shell.c @@ -52,9 +52,8 @@ *-----------------------------------------------------------------*/ int32 OS_ShellOutputToFile(const char *Cmd, osal_id_t filedes) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ if (Cmd == NULL) @@ -62,11 +61,11 @@ int32 OS_ShellOutputToFile(const char *Cmd, osal_id_t filedes) return OS_INVALID_POINTER; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, filedes, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_ShellOutputToFile_Impl(local_id, Cmd); - OS_ObjectIdRefcountDecr(record); + return_code = OS_ShellOutputToFile_Impl(OS_ObjectIndexFromToken(&token), Cmd); + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index cca5aee01..de9e9022b 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -120,9 +120,9 @@ void OS_CreateSocketName(osal_index_t local_id, const OS_SockAddr_t *Addr, const *-----------------------------------------------------------------*/ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_t Type) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + OS_object_token_t token; + OS_stream_internal_record_t *stream; + int32 return_code; /* Check for NULL pointers */ if (sock_id == NULL) @@ -131,19 +131,21 @@ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_ } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &token); if (return_code == OS_SUCCESS) { + stream = OS_OBJECT_TABLE_GET(OS_stream_table, token); + /* Save all the data to our own internal table */ - memset(&OS_stream_table[local_id], 0, sizeof(OS_stream_internal_record_t)); - OS_stream_table[local_id].socket_domain = Domain; - OS_stream_table[local_id].socket_type = Type; + memset(stream, 0, sizeof(OS_stream_internal_record_t)); + stream->socket_domain = Domain; + stream->socket_type = Type; /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_SocketOpen_Impl(local_id); + return_code = OS_SocketOpen_Impl(OS_ObjectIndexFromToken(&token)); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, sock_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, sock_id); } return return_code; @@ -159,9 +161,10 @@ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_ *-----------------------------------------------------------------*/ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_common_record_t * record; + OS_stream_internal_record_t *stream; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ if (Addr == NULL) @@ -169,33 +172,35 @@ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) return OS_INVALID_POINTER; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) { - if (OS_stream_table[local_id].socket_domain == OS_SocketDomain_INVALID) + record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); + stream = OS_OBJECT_TABLE_GET(OS_stream_table, token); + + if (stream->socket_domain == OS_SocketDomain_INVALID) { /* Not a socket */ return_code = OS_ERR_INCORRECT_OBJ_TYPE; } - else if (record->refcount != 0 || - (OS_stream_table[local_id].stream_state & (OS_STREAM_STATE_BOUND | OS_STREAM_STATE_CONNECTED)) != 0) + else if (record->refcount != 0 || (stream->stream_state & (OS_STREAM_STATE_BOUND | OS_STREAM_STATE_CONNECTED)) != 0) { /* Socket must be neither bound nor connected */ return_code = OS_ERR_INCORRECT_OBJ_STATE; } else { - return_code = OS_SocketBind_Impl(local_id, Addr); + return_code = OS_SocketBind_Impl(OS_ObjectIndexFromToken(&token), Addr); if (return_code == OS_SUCCESS) { - OS_CreateSocketName(local_id, Addr, NULL); - record->name_entry = OS_stream_table[local_id].stream_name; - OS_stream_table[local_id].stream_state |= OS_STREAM_STATE_BOUND; + OS_CreateSocketName(OS_ObjectIndexFromToken(&token), Addr, NULL); + record->name_entry = stream->stream_name; + stream->stream_state |= OS_STREAM_STATE_BOUND; } } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; @@ -212,11 +217,13 @@ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) *-----------------------------------------------------------------*/ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t *Addr, int32 timeout) { - OS_common_record_t *record; - OS_common_record_t *connrecord; - osal_index_t local_id; - osal_index_t conn_id; - int32 return_code; + OS_common_record_t * sock_record; + OS_common_record_t * conn_record; + OS_stream_internal_record_t *sock; + OS_stream_internal_record_t *conn; + OS_object_token_t sock_token; + OS_object_token_t conn_token; + int32 return_code; /* Check Parameters */ if (Addr == NULL || connsock_id == NULL) @@ -231,19 +238,25 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * * return_code is checked, and return_code is only * set to OS_SUCCESS when connrecord is also initialized) */ - connrecord = NULL; - conn_id = OSAL_INDEX_C(0); - - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &local_id, &record); + conn_record = NULL; + sock_record = NULL; + sock = NULL; + conn = NULL; + memset(&sock_token, 0, sizeof(sock_token)); + memset(&conn_token, 0, sizeof(conn_token)); + + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &sock_token); if (return_code == OS_SUCCESS) { - if (OS_stream_table[local_id].socket_type != OS_SocketType_STREAM) + sock_record = OS_OBJECT_TABLE_GET(OS_global_stream_table, sock_token); + sock = OS_OBJECT_TABLE_GET(OS_stream_table, sock_token); + + if (sock->socket_type != OS_SocketType_STREAM) { /* Socket must be of the STREAM variety */ return_code = OS_ERR_INCORRECT_OBJ_TYPE; } - else if ((OS_stream_table[local_id].stream_state & (OS_STREAM_STATE_BOUND | OS_STREAM_STATE_CONNECTED)) != - OS_STREAM_STATE_BOUND) + else if ((sock->stream_state & (OS_STREAM_STATE_BOUND | OS_STREAM_STATE_CONNECTED)) != OS_STREAM_STATE_BOUND) { /* Socket must be bound but not connected */ return_code = OS_ERR_INCORRECT_OBJ_STATE; @@ -251,52 +264,60 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * else { /* Now create a unique ID for the connection */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &conn_id, &connrecord); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &conn_token); if (return_code == OS_SUCCESS) { + conn_record = OS_OBJECT_TABLE_GET(OS_global_stream_table, conn_token); + conn = OS_OBJECT_TABLE_GET(OS_stream_table, sock_token); + /* Incr the refcount to record the fact that an operation is pending on this */ - memset(&OS_stream_table[conn_id], 0, sizeof(OS_stream_internal_record_t)); - OS_stream_table[conn_id].socket_domain = OS_stream_table[local_id].socket_domain; - OS_stream_table[conn_id].socket_type = OS_stream_table[local_id].socket_type; - ++connrecord->refcount; - return_code = OS_ObjectIdFinalizeNew(return_code, connrecord, connsock_id); - } - } + memset(conn, 0, sizeof(OS_stream_internal_record_t)); - /* If failure happened here, decrement the refcount of the listening socket now */ - if (return_code != OS_SUCCESS) - { - OS_ObjectIdRefcountDecr(record); + conn->socket_domain = sock->socket_domain; + conn->socket_type = sock->socket_type; + + /* bumps up the refcount by 1 before finalizing, + * to avoid having to re-acquire (should be cleaned up) */ + ++conn_record->refcount; + + return_code = OS_ObjectIdFinalizeNew(return_code, &conn_token, connsock_id); + } } } if (return_code == OS_SUCCESS) { - OS_SocketAddrInit_Impl(Addr, OS_stream_table[local_id].socket_domain); + OS_SocketAddrInit_Impl(Addr, sock->socket_domain); /* The actual accept impl is done without global table lock, only refcount lock */ - return_code = OS_SocketAccept_Impl(local_id, conn_id, Addr, timeout); + return_code = OS_SocketAccept_Impl(OS_ObjectIndexFromToken(&sock_token), OS_ObjectIndexFromToken(&conn_token), + Addr, timeout); + } + if (conn_record != NULL) + { OS_Lock_Global(LOCAL_OBJID_TYPE); + if (return_code == OS_SUCCESS) { /* Generate an entry name based on the remote address */ - OS_CreateSocketName(conn_id, Addr, record->name_entry); - connrecord->name_entry = OS_stream_table[conn_id].stream_name; - OS_stream_table[conn_id].stream_state |= OS_STREAM_STATE_CONNECTED; + OS_CreateSocketName(OS_ObjectIndexFromToken(&conn_token), Addr, sock_record->name_entry); + conn_record->name_entry = conn->stream_name; + conn->stream_state |= OS_STREAM_STATE_CONNECTED; } else { /* Clear the connrecord */ - connrecord->active_id = OS_OBJECT_ID_UNDEFINED; + conn_record->active_id = OS_OBJECT_ID_UNDEFINED; } /* Decrement both ref counters that were increased earlier */ - --record->refcount; - --connrecord->refcount; + --conn_record->refcount; OS_Unlock_Global(LOCAL_OBJID_TYPE); } + OS_ObjectIdRelease(&sock_token); + return return_code; } /* end OS_SocketAccept */ @@ -310,9 +331,10 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * *-----------------------------------------------------------------*/ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeout) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_stream_internal_record_t *stream; + OS_common_record_t * record; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ if (Addr == NULL) @@ -320,15 +342,17 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo return OS_INVALID_POINTER; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) { - if (OS_stream_table[local_id].socket_domain == OS_SocketDomain_INVALID) + record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); + stream = OS_OBJECT_TABLE_GET(OS_stream_table, token); + + if (stream->socket_domain == OS_SocketDomain_INVALID) { return_code = OS_ERR_INCORRECT_OBJ_TYPE; } - else if (OS_stream_table[local_id].socket_type == OS_SocketType_STREAM && - (OS_stream_table[local_id].stream_state & OS_STREAM_STATE_CONNECTED) != 0) + else if (stream->socket_type == OS_SocketType_STREAM && (stream->stream_state & OS_STREAM_STATE_CONNECTED) != 0) { /* Stream socket must not be connected */ return_code = OS_ERR_INCORRECT_OBJ_STATE; @@ -337,18 +361,18 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo { ++record->refcount; } - OS_Unlock_Global(LOCAL_OBJID_TYPE); + + OS_ObjectIdRelease(&token); } if (return_code == OS_SUCCESS) { - return_code = OS_SocketConnect_Impl(local_id, Addr, Timeout); + return_code = OS_SocketConnect_Impl(OS_ObjectIndexFromToken(&token), Addr, Timeout); OS_Lock_Global(LOCAL_OBJID_TYPE); if (return_code == OS_SUCCESS) { - OS_stream_table[local_id].stream_state |= - OS_STREAM_STATE_CONNECTED | OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; + stream->stream_state |= OS_STREAM_STATE_CONNECTED | OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; } --record->refcount; OS_Unlock_Global(LOCAL_OBJID_TYPE); @@ -367,9 +391,9 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo *-----------------------------------------------------------------*/ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_stream_internal_record_t *stream; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ if (buffer == NULL || buflen == 0) @@ -377,24 +401,26 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockA return OS_INVALID_POINTER; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) { - if (OS_stream_table[local_id].socket_type != OS_SocketType_DATAGRAM) + stream = OS_OBJECT_TABLE_GET(OS_stream_table, token); + + if (stream->socket_type != OS_SocketType_DATAGRAM) { return_code = OS_ERR_INCORRECT_OBJ_TYPE; } - else if ((OS_stream_table[local_id].stream_state & OS_STREAM_STATE_BOUND) == 0) + else if ((stream->stream_state & OS_STREAM_STATE_BOUND) == 0) { /* Socket needs to be bound first */ return_code = OS_ERR_INCORRECT_OBJ_STATE; } else { - return_code = OS_SocketRecvFrom_Impl(local_id, buffer, buflen, RemoteAddr, timeout); + return_code = OS_SocketRecvFrom_Impl(OS_ObjectIndexFromToken(&token), buffer, buflen, RemoteAddr, timeout); } - OS_ObjectIdRefcountDecr(record); + OS_ObjectIdRelease(&token); } return return_code; @@ -410,9 +436,9 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockA *-----------------------------------------------------------------*/ int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) { - OS_common_record_t *record; - osal_index_t local_id; - int32 return_code; + OS_stream_internal_record_t *stream; + OS_object_token_t token; + int32 return_code; /* Check Parameters */ if (buffer == NULL || buflen == 0) @@ -420,19 +446,21 @@ int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, cons return OS_INVALID_POINTER; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) { - if (OS_stream_table[local_id].socket_type != OS_SocketType_DATAGRAM) + stream = OS_OBJECT_TABLE_GET(OS_stream_table, token); + + if (stream->socket_type != OS_SocketType_DATAGRAM) { return_code = OS_ERR_INCORRECT_OBJ_TYPE; } else { - return_code = OS_SocketSendTo_Impl(local_id, buffer, buflen, RemoteAddr); + return_code = OS_SocketSendTo_Impl(OS_ObjectIndexFromToken(&token), buffer, buflen, RemoteAddr); } - OS_ObjectIdRefcountDecr(record); + OS_ObjectIdRelease(&token); } return return_code; @@ -471,7 +499,7 @@ int32 OS_SocketGetIdByName(osal_id_t *sock_id, const char *sock_name) int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) { OS_common_record_t *record; - osal_index_t local_id; + OS_object_token_t token; int32 return_code; /* Check parameters */ @@ -483,13 +511,16 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) memset(sock_prop, 0, sizeof(OS_socket_prop_t)); /* Check Parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); + strncpy(sock_prop->name, record->name_entry, OS_MAX_API_NAME - 1); sock_prop->creator = record->creator; - return_code = OS_SocketGetInfo_Impl(local_id, sock_prop); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + return_code = OS_SocketGetInfo_Impl(OS_ObjectIndexFromToken(&token), sock_prop); + + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index 0bb3b96d0..88777744b 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -81,34 +81,19 @@ OS_task_internal_record_t OS_task_table[LOCAL_NUM_OBJECTS]; *-----------------------------------------------------------------*/ static int32 OS_TaskPrepare(osal_id_t task_id, osal_task_entry *entrypt) { - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_task_internal_record_t *task; - return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TASK, task_id, &local_id); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TASK, task_id, &token); if (return_code == OS_SUCCESS) { - /* - * Take our own task table lock. - * - * This ensures that the parent thread's OS_TaskCreate() call is fully completed, - * and that nobody can call OS_TaskDelete() and possibly overwrite this data. - */ - OS_Lock_Global(OS_OBJECT_TYPE_OS_TASK); + task = OS_OBJECT_TABLE_GET(OS_task_table, token); - /* - * Verify that we still appear to own the table entry - */ - if (!OS_ObjectIdEqual(OS_global_task_table[local_id].active_id, task_id)) - { - return_code = OS_ERR_INVALID_ID; - } - else - { - return_code = OS_TaskMatch_Impl(local_id); - *entrypt = OS_task_table[local_id].entry_function_pointer; - } + return_code = OS_TaskMatch_Impl(OS_ObjectIndexFromToken(&token)); + *entrypt = task->entry_function_pointer; - OS_Unlock_Global(OS_OBJECT_TYPE_OS_TASK); + OS_ObjectIdRelease(&token); } if (return_code == OS_SUCCESS) @@ -189,9 +174,9 @@ int32 OS_TaskAPI_Init(void) int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, osal_stackptr_t stack_pointer, size_t stack_size, osal_priority_t priority, uint32 flags) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_task_internal_record_t *task; /* Check for NULL pointers */ if (task_name == NULL || task_id == NULL || function_pointer == NULL) @@ -214,24 +199,24 @@ int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry f } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, task_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, task_name, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal task table */ - memset(&OS_task_table[local_id], 0, sizeof(OS_task_internal_record_t)); + task = OS_OBJECT_TABLE_GET(OS_task_table, token); - strncpy(OS_task_table[local_id].task_name, task_name, OS_MAX_API_NAME); - record->name_entry = OS_task_table[local_id].task_name; - OS_task_table[local_id].stack_size = stack_size; - OS_task_table[local_id].priority = priority; - OS_task_table[local_id].entry_function_pointer = function_pointer; - OS_task_table[local_id].stack_pointer = stack_pointer; + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, task, task_name, task_name); + + task->stack_size = stack_size; + task->priority = priority; + task->entry_function_pointer = function_pointer; + task->stack_pointer = stack_pointer; /* Now call the OS-specific implementation. This reads info from the task table. */ - return_code = OS_TaskCreate_Impl(local_id, flags); + return_code = OS_TaskCreate_Impl(OS_ObjectIndexFromToken(&token), flags); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, task_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, task_id); } return return_code; @@ -247,22 +232,24 @@ int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry f *-----------------------------------------------------------------*/ int32 OS_TaskDelete(osal_id_t task_id) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; - osal_task_entry delete_hook; + int32 return_code; + OS_object_token_t token; + OS_task_internal_record_t *task; + osal_task_entry delete_hook; delete_hook = NULL; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, task_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, task_id, &token); if (return_code == OS_SUCCESS) { + task = OS_OBJECT_TABLE_GET(OS_task_table, token); + /* Save the delete hook, as we do not want to call it while locked */ - delete_hook = OS_task_table[local_id].delete_hook_pointer; + delete_hook = task->delete_hook_pointer; - return_code = OS_TaskDelete_Impl(local_id); + return_code = OS_TaskDelete_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } /* @@ -286,15 +273,14 @@ int32 OS_TaskDelete(osal_id_t task_id) *-----------------------------------------------------------------*/ void OS_TaskExit() { - OS_common_record_t *record; - osal_id_t task_id; - osal_index_t local_id; + osal_id_t task_id; + OS_object_token_t token; task_id = OS_TaskGetId_Impl(); - if (OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &local_id, &record) == OS_SUCCESS) + if (OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &token) == OS_SUCCESS) { /* Complete the operation via the common routine */ - OS_ObjectIdFinalizeDelete(OS_SUCCESS, record); + OS_ObjectIdFinalizeDelete(OS_SUCCESS, &token); } /* call the implementation */ @@ -327,24 +313,25 @@ int32 OS_TaskDelay(uint32 millisecond) *-----------------------------------------------------------------*/ int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_task_internal_record_t *task; - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_TaskSetPriority_Impl(local_id, new_priority); + task = OS_OBJECT_TABLE_GET(OS_task_table, token); + + return_code = OS_TaskSetPriority_Impl(OS_ObjectIndexFromToken(&token), new_priority); if (return_code == OS_SUCCESS) { /* Use the abstracted priority, not the OS one */ /* Change the priority in the table as well */ - OS_task_table[local_id].priority = new_priority; + task->priority = new_priority; } - /* Unlock the global from OS_ObjectIdGetAndLock() */ - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; @@ -360,14 +347,13 @@ int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority) *-----------------------------------------------------------------*/ int32 OS_TaskRegister(void) { - OS_common_record_t *record; - osal_index_t local_id; + OS_object_token_t token; /* * Just to retain compatibility (really, only the unit test cares) * this will return NON success when called from a non-task context */ - return OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, OS_TaskGetId_Impl(), &local_id, &record); + return OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, OS_TaskGetId_Impl(), &token); } /* end OS_TaskRegister */ /*---------------------------------------------------------------- @@ -380,15 +366,14 @@ int32 OS_TaskRegister(void) *-----------------------------------------------------------------*/ osal_id_t OS_TaskGetId(void) { - OS_common_record_t *record; - osal_index_t local_id; - osal_id_t task_id; + OS_object_token_t token; + osal_id_t task_id; task_id = OS_TaskGetId_Impl(); /* Confirm the task master table entry matches the expected. * If not it means we have some stale/leftover value */ - if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, task_id, &local_id, &record) != OS_SUCCESS) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, task_id, &token) != OS_SUCCESS) { task_id = OS_OBJECT_ID_UNDEFINED; } @@ -429,9 +414,10 @@ int32 OS_TaskGetIdByName(osal_id_t *task_id, const char *task_name) *-----------------------------------------------------------------*/ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + OS_common_record_t * record; + int32 return_code; + OS_object_token_t token; + OS_task_internal_record_t *task; /* Check parameters */ if (task_prop == NULL) @@ -441,21 +427,24 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) memset(task_prop, 0, sizeof(OS_task_prop_t)); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_task_table, token); + task = OS_OBJECT_TABLE_GET(OS_task_table, token); + if (record->name_entry != NULL) { strncpy(task_prop->name, record->name_entry, sizeof(task_prop->name) - 1); task_prop->name[sizeof(task_prop->name) - 1] = 0; } task_prop->creator = record->creator; - task_prop->stack_size = OS_task_table[local_id].stack_size; - task_prop->priority = OS_task_table[local_id].priority; + task_prop->stack_size = task->stack_size; + task_prop->priority = task->priority; - return_code = OS_TaskGetInfo_Impl(local_id, task_prop); + return_code = OS_TaskGetInfo_Impl(OS_ObjectIndexFromToken(&token), task_prop); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; @@ -472,21 +461,23 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) *-----------------------------------------------------------------*/ int32 OS_TaskInstallDeleteHandler(osal_task_entry function_pointer) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; - osal_id_t task_id; + int32 return_code; + OS_object_token_t token; + OS_task_internal_record_t *task; + osal_id_t task_id; task_id = OS_TaskGetId_Impl(); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &token); if (return_code == OS_SUCCESS) { + task = OS_OBJECT_TABLE_GET(OS_task_table, token); + /* ** Install the pointer */ - OS_task_table[local_id].delete_hook_pointer = function_pointer; + task->delete_hook_pointer = function_pointer; - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; @@ -502,8 +493,8 @@ int32 OS_TaskInstallDeleteHandler(osal_task_entry function_pointer) *-----------------------------------------------------------------*/ int32 OS_TaskFindIdBySystemData(osal_id_t *task_id, const void *sysdata, size_t sysdata_size) { - int32 return_code; - OS_common_record_t *record; + int32 return_code; + OS_object_token_t token; /* Check parameters */ if (task_id == NULL) @@ -519,11 +510,12 @@ int32 OS_TaskFindIdBySystemData(osal_id_t *task_id, const void *sysdata, size_t } return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_TaskIdMatchSystemData_Impl, - (void *)sysdata, &record); + (void *)sysdata, &token); if (return_code == OS_SUCCESS) { - *task_id = record->active_id; - OS_Unlock_Global(LOCAL_OBJID_TYPE); + *task_id = OS_ObjectIdFromToken(&token); + + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index b73f4b1cb..ea52e2490 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -90,15 +90,14 @@ int32 OS_TimerCbAPI_Init(void) static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_t timebase_ref_id, OS_ArgCallback_t callback_ptr, void *callback_arg, uint32 flags) { - OS_common_record_t * timebase; - OS_common_record_t * record; - OS_timecb_internal_record_t *local; - int32 return_code; - osal_objtype_t objtype; - osal_index_t local_id; - osal_index_t timebase_local_id; - osal_id_t cb_list; - osal_index_t attach_id; + int32 return_code; + osal_objtype_t objtype; + OS_object_token_t timebase_token; + OS_object_token_t timecb_token; + OS_timecb_internal_record_t * local; + OS_timebase_internal_record_t *timebase; + osal_id_t cb_list; + osal_index_t attach_id; /* ** Check Parameters @@ -141,56 +140,61 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ * if we leave this routine with an error. */ return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_ref_id, - &timebase_local_id, &timebase); + &timebase_token); if (return_code != OS_SUCCESS) { return return_code; } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TIMECB, timer_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TIMECB, timer_name, &timecb_token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal timer table */ - local = &OS_timecb_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_timecb_table, timecb_token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, timebase_token); - memset(local, 0, sizeof(OS_timecb_internal_record_t)); + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(timecb_token, local, timer_name, timer_name); + + /* + * transfer ownership so the refcount obtained earlier is now + * associated with the timecb object, and will be retained until + * the object is deleted. + */ + OS_ObjectIdTransferToken(&timebase_token, &local->timebase_token); - strncpy(local->timer_name, timer_name, OS_MAX_API_NAME - 1); - record->name_entry = local->timer_name; local->callback_ptr = callback_ptr; local->callback_arg = callback_arg; - local->timebase_ref = timebase_local_id; local->flags = flags; - local->prev_ref = local_id; - local->next_ref = local_id; + local->prev_ref = OS_ObjectIndexFromToken(&timecb_token); + local->next_ref = OS_ObjectIndexFromToken(&timecb_token); /* * Now we need to add it to the time base callback ring, so take the * timebase-specific lock to prevent a tick from being processed at this moment. */ - OS_TimeBaseLock_Impl(timebase_local_id); + OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&timebase_token)); - cb_list = OS_timebase_table[timebase_local_id].first_cb; - OS_timebase_table[timebase_local_id].first_cb = record->active_id; + cb_list = timebase->first_cb; + timebase->first_cb = OS_ObjectIdFromToken(&timecb_token); if (OS_ObjectIdDefined(cb_list)) { OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TIMECB, cb_list, &attach_id); local->next_ref = attach_id; local->prev_ref = OS_timecb_table[attach_id].prev_ref; - OS_timecb_table[local->prev_ref].next_ref = local_id; - OS_timecb_table[local->next_ref].prev_ref = local_id; + OS_timecb_table[local->prev_ref].next_ref = OS_ObjectIndexFromToken(&timecb_token); + OS_timecb_table[local->next_ref].prev_ref = OS_ObjectIndexFromToken(&timecb_token); } - OS_TimeBaseUnlock_Impl(timebase_local_id); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&timebase_token)); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, timer_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &timecb_token, timer_id); } else { - OS_ObjectIdRefcountDecr(timebase); + OS_ObjectIdRelease(&timebase_token); } return return_code; @@ -282,6 +286,7 @@ int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *accura */ Conv.opaque_arg = NULL; Conv.timer_callback_func = callback_ptr; + return_code = OS_DoTimerAdd(timer_id, timer_name, timebase_ref_id, OS_Timer_NoArgCallback, Conv.opaque_arg, TIMECB_FLAG_DEDICATED_TIMEBASE); @@ -311,12 +316,11 @@ int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *accura *-----------------------------------------------------------------*/ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) { - OS_common_record_t * record; OS_timecb_internal_record_t *local; int32 return_code; osal_objtype_t objtype; - osal_index_t local_id; osal_id_t dedicated_timebase_id; + OS_object_token_t token; dedicated_timebase_id = OS_OBJECT_ID_UNDEFINED; @@ -340,25 +344,24 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) return OS_ERR_INCORRECT_OBJ_STATE; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &token); if (return_code == OS_SUCCESS) { - local = &OS_timecb_table[local_id]; + local = OS_OBJECT_TABLE_GET(OS_timecb_table, token); - OS_TimeBaseLock_Impl(local->timebase_ref); + OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); if ((local->flags & TIMECB_FLAG_DEDICATED_TIMEBASE) != 0) { - dedicated_timebase_id = OS_global_timebase_table[local->timebase_ref].active_id; + dedicated_timebase_id = OS_ObjectIdFromToken(&local->timebase_token); } local->wait_time = (int32)start_time; local->interval_time = (int32)interval_time; - OS_TimeBaseUnlock_Impl(local->timebase_ref); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); - /* Unlock the global from OS_ObjectIdCheck() */ - OS_Unlock_Global(OS_OBJECT_TYPE_OS_TIMECB); + OS_ObjectIdRelease(&token); } /* @@ -391,15 +394,16 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) *-----------------------------------------------------------------*/ int32 OS_TimerDelete(osal_id_t timer_id) { - OS_timecb_internal_record_t *local; - OS_common_record_t * record; - OS_common_record_t * timebase = NULL; - int32 return_code; - osal_objtype_t objtype; - osal_index_t local_id; - osal_id_t dedicated_timebase_id; + OS_timecb_internal_record_t * local; + int32 return_code; + osal_objtype_t objtype; + osal_id_t dedicated_timebase_id; + OS_object_token_t token; + OS_timebase_internal_record_t *timebase_local; + OS_object_token_t timebase_token; dedicated_timebase_id = OS_OBJECT_ID_UNDEFINED; + memset(&timebase_token, 0, sizeof(timebase_token)); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -411,66 +415,64 @@ int32 OS_TimerDelete(osal_id_t timer_id) return OS_ERR_INCORRECT_OBJ_STATE; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &token); if (return_code == OS_SUCCESS) { - local = &OS_timecb_table[local_id]; - timebase = &OS_global_timebase_table[local->timebase_ref]; + local = OS_OBJECT_TABLE_GET(OS_timecb_table, token); + timebase_local = OS_OBJECT_TABLE_GET(OS_timebase_table, local->timebase_token); - OS_TimeBaseLock_Impl(local->timebase_ref); + OS_ObjectIdTransferToken(&local->timebase_token, &timebase_token); + + OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); /* * If the timer uses a dedicated time base, then also delete that. */ if ((local->flags & TIMECB_FLAG_DEDICATED_TIMEBASE) != 0) { - dedicated_timebase_id = timebase->active_id; + dedicated_timebase_id = OS_ObjectIdFromToken(&local->timebase_token); } /* * Now we need to remove it from the time base callback ring */ - if (OS_ObjectIdEqual(OS_timebase_table[local->timebase_ref].first_cb, timer_id)) + if (OS_ObjectIdEqual(timebase_local->first_cb, timer_id)) { - if (local->next_ref != local_id) + if (local->next_ref != OS_ObjectIndexFromToken(&token)) { - OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TIMEBASE, local->next_ref, - &OS_timebase_table[local->timebase_ref].first_cb); + OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TIMEBASE, local->next_ref, &timebase_local->first_cb); } else { /* * consider the list empty */ - OS_timebase_table[local->timebase_ref].first_cb = OS_OBJECT_ID_UNDEFINED; + timebase_local->first_cb = OS_OBJECT_ID_UNDEFINED; } } OS_timecb_table[local->prev_ref].next_ref = local->next_ref; OS_timecb_table[local->next_ref].prev_ref = local->prev_ref; - local->next_ref = local_id; - local->prev_ref = local_id; + local->next_ref = OS_ObjectIndexFromToken(&token); + local->prev_ref = OS_ObjectIndexFromToken(&token); - OS_TimeBaseUnlock_Impl(local->timebase_ref); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } /* * Remove the reference count against the timebase */ + OS_ObjectIdRelease(&timebase_token); /* * If the timer uses a dedicated time base, then also delete it. */ - if (return_code == OS_SUCCESS) + if (return_code == OS_SUCCESS && OS_ObjectIdDefined(dedicated_timebase_id)) { - OS_ObjectIdRefcountDecr(timebase); - if (OS_ObjectIdDefined(dedicated_timebase_id)) - { - OS_TimeBaseDelete(dedicated_timebase_id); - } + OS_TimeBaseDelete(dedicated_timebase_id); } return return_code; @@ -519,10 +521,12 @@ int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name) *-----------------------------------------------------------------*/ int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; - osal_objtype_t objtype; + OS_common_record_t * record; + int32 return_code; + osal_objtype_t objtype; + OS_object_token_t token; + OS_timecb_internal_record_t * timecb; + OS_timebase_internal_record_t *timebase; /* Check parameters */ if (timer_prop == NULL) @@ -542,15 +546,19 @@ int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop) memset(timer_prop, 0, sizeof(OS_timer_prop_t)); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_timecb_table, token); + timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, timecb->timebase_token); + strncpy(timer_prop->name, record->name_entry, OS_MAX_API_NAME - 1); timer_prop->creator = record->creator; - timer_prop->interval_time = (uint32)OS_timecb_table[local_id].interval_time; - timer_prop->accuracy = OS_timebase_table[OS_timecb_table[local_id].timebase_ref].accuracy_usec; + timer_prop->interval_time = (uint32)timecb->interval_time; + timer_prop->accuracy = timebase->accuracy_usec; - OS_Unlock_Global(OS_OBJECT_TYPE_OS_TIMECB); + OS_ObjectIdRelease(&token); } return return_code; diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index 17b2a67f1..491bf4d6f 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -98,10 +98,10 @@ int32 OS_TimeBaseAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_TimeBaseCreate(osal_id_t *timer_id, const char *timebase_name, OS_TimerSync_t external_sync) { - OS_common_record_t *record; - int32 return_code; - osal_objtype_t objtype; - osal_index_t local_id; + int32 return_code; + osal_objtype_t objtype; + OS_object_token_t token; + OS_timebase_internal_record_t *timebase; /* * Specifying a NULL sync function means the timebase is not externally synchronized. @@ -136,29 +136,29 @@ int32 OS_TimeBaseCreate(osal_id_t *timer_id, const char *timebase_name, OS_Timer } /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ - return_code = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TIMEBASE, timebase_name, &local_id, &record); + return_code = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TIMEBASE, timebase_name, &token); if (return_code == OS_SUCCESS) { - /* Save all the data to our own internal timer table */ - memset(&OS_timebase_table[local_id], 0, sizeof(OS_timebase_internal_record_t)); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, timebase, timebase_name, timebase_name); - strncpy(OS_timebase_table[local_id].timebase_name, timebase_name, OS_MAX_API_NAME - 1); - record->name_entry = OS_timebase_table[local_id].timebase_name; - OS_timebase_table[local_id].external_sync = external_sync; + timebase->external_sync = external_sync; if (external_sync == NULL) { - OS_timebase_table[local_id].accuracy_usec = OS_SharedGlobalVars.MicroSecPerTick; + timebase->accuracy_usec = OS_SharedGlobalVars.MicroSecPerTick; } else { - OS_timebase_table[local_id].accuracy_usec = 0; + timebase->accuracy_usec = 0; } /* Now call the OS-specific implementation. This reads info from the timer table. */ - return_code = OS_TimeBaseCreate_Impl(local_id); + return_code = OS_TimeBaseCreate_Impl(OS_ObjectIndexFromToken(&token)); /* Check result, finalize record, and unlock global table. */ - return_code = OS_ObjectIdFinalizeNew(return_code, record, timer_id); + return_code = OS_ObjectIdFinalizeNew(return_code, &token, timer_id); } return return_code; @@ -174,10 +174,10 @@ int32 OS_TimeBaseCreate(osal_id_t *timer_id, const char *timebase_name, OS_Timer *-----------------------------------------------------------------*/ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) { - OS_common_record_t *record; - int32 return_code; - osal_objtype_t objtype; - osal_index_t local_id; + int32 return_code; + osal_objtype_t objtype; + OS_object_token_t token; + OS_timebase_internal_record_t *timebase; /* * Internally the implementation represents the interval as a @@ -202,24 +202,26 @@ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time return OS_ERR_INCORRECT_OBJ_STATE; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMEBASE, timer_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMEBASE, timer_id, &token); if (return_code == OS_SUCCESS) { + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); + /* Need to take the time base lock to ensure that no ticks are currently being processed */ - OS_TimeBaseLock_Impl(local_id); + OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&token)); - return_code = OS_TimeBaseSet_Impl(local_id, start_time, interval_time); + return_code = OS_TimeBaseSet_Impl(OS_ObjectIndexFromToken(&token), start_time, interval_time); if (return_code == OS_SUCCESS) { /* Save the value since we were successful */ - OS_timebase_table[local_id].nominal_start_time = start_time; - OS_timebase_table[local_id].nominal_interval_time = interval_time; + timebase->nominal_start_time = start_time; + timebase->nominal_interval_time = interval_time; } - OS_TimeBaseUnlock_Impl(local_id); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&token)); - OS_Unlock_Global(OS_OBJECT_TYPE_OS_TIMEBASE); + OS_ObjectIdRelease(&token); } return return_code; @@ -235,10 +237,9 @@ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time *-----------------------------------------------------------------*/ int32 OS_TimeBaseDelete(osal_id_t timer_id) { - OS_common_record_t *record; - int32 return_code; - osal_objtype_t objtype; - osal_index_t local_id; + int32 return_code; + osal_objtype_t objtype; + OS_object_token_t token; /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -250,13 +251,13 @@ int32 OS_TimeBaseDelete(osal_id_t timer_id) return OS_ERR_INCORRECT_OBJ_STATE; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TIMEBASE, timer_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TIMEBASE, timer_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_TimeBaseDelete_Impl(local_id); + return_code = OS_TimeBaseDelete_Impl(OS_ObjectIndexFromToken(&token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, record); + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); } return return_code; @@ -305,10 +306,11 @@ int32 OS_TimeBaseGetIdByName(osal_id_t *timer_id, const char *timebase_name) *-----------------------------------------------------------------*/ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_prop) { - OS_common_record_t *record; - int32 return_code; - osal_objtype_t objtype; - osal_index_t local_id; + OS_common_record_t * record; + int32 return_code; + osal_objtype_t objtype; + OS_object_token_t token; + OS_timebase_internal_record_t *timebase; /* Check parameters */ if (timebase_prop == NULL) @@ -328,18 +330,21 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro memset(timebase_prop, 0, sizeof(OS_timebase_prop_t)); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, timebase_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, timebase_id, &token); if (return_code == OS_SUCCESS) { + record = OS_OBJECT_TABLE_GET(OS_global_timebase_table, token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); + strncpy(timebase_prop->name, record->name_entry, OS_MAX_API_NAME - 1); timebase_prop->creator = record->creator; - timebase_prop->nominal_interval_time = OS_timebase_table[local_id].nominal_interval_time; - timebase_prop->freerun_time = OS_timebase_table[local_id].freerun_time; - timebase_prop->accuracy = OS_timebase_table[local_id].accuracy_usec; + timebase_prop->nominal_interval_time = timebase->nominal_interval_time; + timebase_prop->freerun_time = timebase->freerun_time; + timebase_prop->accuracy = timebase->accuracy_usec; - return_code = OS_TimeBaseGetInfo_Impl(local_id, timebase_prop); + return_code = OS_TimeBaseGetInfo_Impl(OS_ObjectIndexFromToken(&token), timebase_prop); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdRelease(&token); } return return_code; @@ -355,15 +360,17 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro *-----------------------------------------------------------------*/ int32 OS_TimeBaseGetFreeRun(osal_id_t timebase_id, uint32 *freerun_val) { - OS_common_record_t *record; - int32 return_code; - osal_index_t local_id; + int32 return_code; + OS_object_token_t token; + OS_timebase_internal_record_t *timebase; /* Check parameters */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, timebase_id, &local_id, &record); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, timebase_id, &token); if (return_code == OS_SUCCESS) { - *freerun_val = OS_timebase_table[local_id].freerun_time; + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); + + *freerun_val = timebase->freerun_time; } return return_code; @@ -394,7 +401,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) OS_timebase_internal_record_t *timebase; OS_timecb_internal_record_t * timecb; OS_common_record_t * record; - osal_index_t local_id; + OS_object_token_t token; osal_index_t timer_id; osal_index_t curr_cb_local_id; osal_id_t curr_cb_public_id; @@ -411,17 +418,19 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) OS_TaskRegister_Impl(timebase_id); /* Grab the relevant info from the global structure */ - if (OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_id, &local_id, &record) != 0) + if (OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_id, &token) != 0) { /* Something went wrong - abort this thread */ return; } - timebase = &OS_timebase_table[local_id]; + record = OS_OBJECT_TABLE_GET(OS_global_timebase_table, token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); + syncfunc = timebase->external_sync; spin_cycles = 0; - OS_Unlock_Global(OS_OBJECT_TYPE_OS_TIMEBASE); + OS_ObjectIdRelease(&token); while (1) { @@ -429,7 +438,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) * Call the sync function - this will pend for some period of time * and return the amount of elapsed time in units of "timebase ticks" */ - tick_time = (*syncfunc)(local_id); + tick_time = (*syncfunc)(OS_ObjectIndexFromToken(&token)); /* * The returned tick_time should be nonzero. If the sync function @@ -471,7 +480,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) } } - OS_TimeBaseLock_Impl(local_id); + OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&token)); /* * After waiting, check that our ID still matches @@ -479,7 +488,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) */ if (!OS_ObjectIdEqual(timebase_id, record->active_id)) { - OS_TimeBaseUnlock_Impl(local_id); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&token)); break; } @@ -531,7 +540,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) } while (curr_cb_local_id != timer_id); } - OS_TimeBaseUnlock_Impl(local_id); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&token)); } } /* end OS_TimeBase_CallbackThread */ diff --git a/src/unit-test-coverage/shared/CMakeLists.txt b/src/unit-test-coverage/shared/CMakeLists.txt index 582ddcf2e..9f9211880 100644 --- a/src/unit-test-coverage/shared/CMakeLists.txt +++ b/src/unit-test-coverage/shared/CMakeLists.txt @@ -26,6 +26,7 @@ set(MODULE_LIST ) set(SHARED_COVERAGE_LINK_LIST + os-shared-coverage-support ut-adaptor-shared ut_osapi_impl_stubs ut_osapi_shared_stubs @@ -33,6 +34,10 @@ set(SHARED_COVERAGE_LINK_LIST ut_libc_stubs ) +add_library(os-shared-coverage-support STATIC + src/os-shared-coverage-support.c +) + add_subdirectory(adaptors) diff --git a/src/unit-test-coverage/shared/src/coveragetest-binsem.c b/src/unit-test-coverage/shared/src/coveragetest-binsem.c index 21bc69803..2b92b9626 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-binsem.c @@ -165,18 +165,12 @@ void Test_OS_BinSemGetInfo(void) * Test Case For: * int32 OS_BinSemGetInfo (uint32 sem_id, OS_bin_sem_prop_t *bin_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_bin_sem_prop_t prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_bin_sem_prop_t prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_BINSEM, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + actual = OS_BinSemGetInfo(UT_OBJID_1, &prop); UtAssert_True(actual == expected, "OS_BinSemGetInfo() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-countsem.c b/src/unit-test-coverage/shared/src/coveragetest-countsem.c index f5e539f1f..6c947a12e 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-countsem.c @@ -59,9 +59,7 @@ void Test_OS_CountSemCreate(void) int32 actual = OS_CountSemCreate(&objid, "UT", 0, 0); UtAssert_True(actual == expected, "OS_CountSemCreate() (%ld) == OS_SUCCESS", (long)actual); -#ifdef jphfix OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); -#endif OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate(NULL, NULL, 0, 0), OS_INVALID_POINTER); UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); @@ -156,21 +154,13 @@ void Test_OS_CountSemGetInfo(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; OS_count_sem_prop_t prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_COUNTSEM, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + actual = OS_CountSemGetInfo(UT_OBJID_1, &prop); UtAssert_True(actual == expected, "OS_CountSemGetInfo() (%ld) == OS_SUCCESS", (long)actual); -#ifdef jphfix - UtAssert_True(prop.creator == 111, "prop.creator (%lu) == 111", (unsigned long)prop.creator); -#endif + OSAPI_TEST_OBJID(prop.creator, ==, UT_OBJID_OTHER); UtAssert_True(strcmp(prop.name, "ABC") == 0, "prop.name (%s) == ABC", prop.name); OSAPI_TEST_FUNCTION_RC(OS_CountSemGetInfo(UT_OBJID_1, NULL), OS_INVALID_POINTER); diff --git a/src/unit-test-coverage/shared/src/coveragetest-file.c b/src/unit-test-coverage/shared/src/coveragetest-file.c index 3cfc7ee23..4292c5497 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-file.c +++ b/src/unit-test-coverage/shared/src/coveragetest-file.c @@ -237,7 +237,7 @@ void Test_OS_rename(void) int32 expected = OS_SUCCESS; int32 actual = ~OS_SUCCESS; - OS_global_stream_table[1].active_id = UT_OBJID_1; + OS_UT_SetupIterator(OS_OBJECT_TYPE_OS_STREAM, UT_INDEX_1, 1); strncpy(OS_stream_table[1].stream_name, "/cf/file1", sizeof(OS_stream_table[1].stream_name)); actual = OS_rename("/cf/file1", "/cf/file2"); @@ -310,18 +310,12 @@ void Test_OS_FDGetInfo(void) * Test Case For: * int32 OS_FDGetInfo (uint32 filedes, OS_file_prop_t *fd_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_file_prop_t file_prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_file_prop_t file_prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_STREAM, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + actual = OS_FDGetInfo(UT_OBJID_1, &file_prop); UtAssert_True(actual == expected, "OS_FDGetInfo() (%ld) == OS_SUCCESS", (long)actual); @@ -343,7 +337,7 @@ void Test_OS_FileOpenCheck(void) UtAssert_True(actual == expected, "OS_FileOpenCheck() (%ld) == OS_ERROR", (long)actual); - OS_global_stream_table[0].active_id = UT_OBJID_1; + OS_UT_SetupIterator(OS_OBJECT_TYPE_OS_STREAM, UT_INDEX_1, 1); UT_SetDefaultReturnValue(UT_KEY(OCS_strcmp), 0); expected = OS_SUCCESS; actual = OS_FileOpenCheck("/cf/file"); @@ -367,8 +361,8 @@ void Test_OS_CloseFileByName(void) UtAssert_True(actual == expected, "OS_CloseFileByName() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); /* setup for success */ - expected = OS_SUCCESS; - OS_global_stream_table[0].active_id = UT_OBJID_1; + OS_UT_SetupIterator(OS_OBJECT_TYPE_OS_STREAM, UT_INDEX_1, 1); + expected = OS_SUCCESS; UT_SetDefaultReturnValue(UT_KEY(OCS_strcmp), 0); actual = OS_CloseFileByName("/cf/file"); UtAssert_True(actual == expected, "OS_CloseFileByName() (%ld) == OS_SUCCESS", (long)actual); @@ -387,9 +381,8 @@ void Test_OS_CloseAllFiles(void) int32 expected = -222; int32 actual; - OS_global_stream_table[0].active_id = UT_OBJID_1; - OS_global_stream_table[1].active_id = UT_OBJID_2; - UT_SetDeferredRetcode(UT_KEY(OS_GenericClose_Impl), 1, expected); + OS_UT_SetupIterator(OS_OBJECT_TYPE_OS_STREAM, UT_INDEX_1, 2); + UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdIteratorProcessEntry), 1, expected); actual = OS_CloseAllFiles(); UtAssert_True(actual == expected, "OS_CloseAllFiles() (%ld) == -222", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 00b537c3d..5ac362b92 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -27,6 +27,7 @@ #include "os-shared-coveragetest.h" #include "os-shared-idmap.h" #include "os-shared-common.h" +#include "os-shared-task.h" #include @@ -101,35 +102,37 @@ void Test_OS_LockUnlockGlobal(void) OS_Unlock_Global(OS_OBJECT_TYPE_OS_BINSEM); } -void Test_OS_ObjectIdConvertLock(void) +void Test_OS_ObjectIdConvertToken(void) { /* * Test Case For: - * static int32 OS_ObjectIdConvertLock(OS_lock_mode_t lock_mode, - * uint32 idtype, uint32 reference_id, OS_common_record_t *obj) + * int32 OS_ObjectIdConvertToken(OS_object_token_t *token) * * NOTE: These test cases just focus on code paths that are not exercised * by the other test cases in this file. */ int32 expected; int32 actual; - osal_index_t array_index; + OS_object_token_t token; OS_common_record_t *record; osal_id_t objid; - UT_idbuf_t corrupt_objid; /* get a valid (fake) OSAL ID to start with */ - OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "ut", &array_index, &record); - objid = record->active_id; + OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "ut", &token); + objid = token.obj_id; + + record = OS_OBJECT_TABLE_GET(OS_global_task_table, token); + record->refcount = 5; + record->active_id = objid; /* * Attempt to obtain a lock for the same record with a non-matching ID * This should return an error. */ - corrupt_objid.id = objid; - corrupt_objid.val ^= 0x10; /* flip a bit */ - actual = OS_ObjectIdConvertLock(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TASK, corrupt_objid.id, record); - expected = OS_ERR_INVALID_ID; + token.lock_mode = OS_LOCK_MODE_NONE; + token.obj_id = OS_ObjectIdFromInteger(OS_ObjectIdToInteger(token.obj_id) ^ 0x10); /* flip a bit */ + actual = OS_ObjectIdConvertToken(&token); + expected = OS_ERR_INVALID_ID; UtAssert_True(actual == expected, "OS_ObjectIdConvertLock() (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, (long)expected); @@ -138,22 +141,62 @@ void Test_OS_ObjectIdConvertLock(void) * Use mode OS_LOCK_MODE_NONE with matching ID * This should return success. */ - actual = OS_ObjectIdConvertLock(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TASK, objid, record); - expected = OS_SUCCESS; + token.lock_mode = OS_LOCK_MODE_NONE; + token.obj_id = objid; + actual = OS_ObjectIdConvertToken(&token); + expected = OS_SUCCESS; - UtAssert_True(actual == expected, "OS_ObjectIdConvertLock() (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(NONE) (%ld) == OS_SUCCESS (%ld)", (long)actual, + (long)expected); + + /* + * Use mode OS_LOCK_MODE_GLOBAL with matching ID + * This should return success, not change refcount + */ + token.lock_mode = OS_LOCK_MODE_GLOBAL; + token.obj_id = objid; + actual = OS_ObjectIdConvertToken(&token); + expected = OS_SUCCESS; + + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(GLOBAL) (%ld) == OS_SUCCESS (%ld)", (long)actual, + (long)expected); + UtAssert_UINT32_EQ(record->refcount, 5); + + /* + * Use mode OS_LOCK_MODE_REFCOUNT with matching ID + * This should return success, increment refcount + */ + token.lock_mode = OS_LOCK_MODE_REFCOUNT; + token.obj_id = objid; + actual = OS_ObjectIdConvertToken(&token); + expected = OS_SUCCESS; + + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(REFCOUNT) (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + UtAssert_UINT32_EQ(record->refcount, 6); + + /* + * Use mode OS_LOCK_MODE_EXCLUSIVE with matching ID and other refs. + * This should return OS_ERR_OBJECT_IN_USE. + */ + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + token.obj_id = objid; + actual = OS_ObjectIdConvertToken(&token); + expected = OS_ERR_OBJECT_IN_USE; + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(EXCLUSIVE) (%ld) == OS_ERR_OBJECT_IN_USE (%ld)", + (long)actual, (long)expected); + + /* should have delayed 4 times, on the 5th try it returns error */ + UtAssert_STUB_COUNT(OS_TaskDelay_Impl, 4); /* * Use mode OS_LOCK_MODE_EXCLUSIVE with matching ID and no other refs. * This should return success. */ - record->flags = 0; record->refcount = 0; - actual = OS_ObjectIdConvertLock(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TASK, objid, record); + actual = OS_ObjectIdConvertToken(&token); expected = OS_SUCCESS; - - UtAssert_True(actual == expected, "OS_ObjectIdConvertLock() (%ld) == OS_SUCCESS (%ld)", (long)actual, + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(EXCLUSIVE) (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); } @@ -167,17 +210,21 @@ void Test_OS_ObjectIdGetBySearch(void) * NOTE: These test cases just focus on code paths that are not exercised * by the other test cases in this file. */ - int32 expected; - int32 actual; - OS_common_record_t *record; + int32 expected; + int32 actual; + OS_object_token_t token; OS_global_task_table[0].active_id = UT_OBJID_OTHER; - actual = OS_ObjectIdGetBySearch(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TASK, TestAlwaysMatch, NULL, &record); + actual = OS_ObjectIdGetBySearch(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TASK, TestAlwaysMatch, NULL, &token); expected = OS_SUCCESS; - OS_global_task_table[0].active_id = OS_OBJECT_ID_UNDEFINED; UtAssert_True(actual == expected, "OS_ObjectIdGetBySearch() (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + + UtAssert_Bool(OS_ObjectIdEqual(token.obj_id, UT_OBJID_OTHER), "Token Object ID"); + UtAssert_UINT32_EQ(token.obj_idx, 0); + + OS_global_task_table[0].active_id = OS_OBJECT_ID_UNDEFINED; } void Test_OS_GetMaxForObjectType(void) @@ -328,8 +375,8 @@ void Test_OS_ObjectIdGetById(void) { /* * Test Case For: - * int32 OS_ObjectIdGetById(OS_lock_mode_t check_mode, uint32 idtype, uint32 id, uint32 *array_index, - * OS_common_record_t **record); + * int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, OS_object_token_t + * *token); * */ int32 actual = ~OS_SUCCESS; @@ -337,70 +384,66 @@ void Test_OS_ObjectIdGetById(void) osal_id_t refobjid; osal_index_t local_idx; OS_common_record_t *rptr = NULL; + OS_object_token_t token1; + OS_object_token_t token2; /* verify that the call returns ERROR when not initialized */ OS_SharedGlobalVars.Initialized = false; - actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, 0, OS_OBJECT_ID_UNDEFINED, &local_idx, &rptr); - expected = OS_ERROR; + actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, 0, OS_OBJECT_ID_UNDEFINED, &token1); + expected = OS_ERROR; UtAssert_True(actual == expected, "OS_ObjectIdGetById(uninitialized) (%ld) == OS_ERROR", (long)actual); /* set "true" for the remainder of tests */ OS_SharedGlobalVars.Initialized = true; - OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TASK, 1, &refobjid); + OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TASK, 1000, &refobjid); OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TASK, refobjid, &local_idx); - OS_global_task_table[local_idx].active_id = refobjid; - expected = OS_SUCCESS; - actual = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_TASK, refobjid, &local_idx, &rptr); + rptr = &OS_global_task_table[local_idx]; + rptr->active_id = refobjid; + expected = OS_SUCCESS; + actual = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_TASK, refobjid, &token1); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_ObjectIdGetById() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(local_idx == 1, "local_idx (%lu) == 1", (unsigned long)local_idx); - UtAssert_True(rptr != NULL, "rptr (%p) != NULL", (void *)rptr); + UtAssert_UINT32_EQ(token1.obj_idx, local_idx); UtAssert_True(rptr->refcount == 1, "refcount (%u) == 1", (unsigned int)rptr->refcount); /* attempting to get an exclusive lock should return IN_USE error */ expected = OS_ERR_OBJECT_IN_USE; - actual = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TASK, refobjid, &local_idx, &rptr); + actual = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TASK, refobjid, &token2); UtAssert_True(actual == expected, "OS_ObjectIdGetById() (%ld) == OS_ERR_OBJECT_IN_USE", (long)actual); + /* refcount decrement should work */ + OS_ObjectIdRelease(&token1); + UtAssert_True(rptr->refcount == 0, "refcount (%u) == 0", (unsigned int)rptr->refcount); + + /* noop if done a second time */ + OS_ObjectIdRelease(&token1); + UtAssert_True(rptr->refcount == 0, "refcount (%u) == 0", (unsigned int)rptr->refcount); + /* attempt to get non-exclusive lock during shutdown should fail */ OS_SharedGlobalVars.ShutdownFlag = OS_SHUTDOWN_MAGIC_NUMBER; expected = OS_ERR_INCORRECT_OBJ_STATE; - actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TASK, refobjid, &local_idx, &rptr); + actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TASK, refobjid, &token1); UtAssert_True(actual == expected, "OS_ObjectIdGetById() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); OS_SharedGlobalVars.ShutdownFlag = 0; /* attempt to get lock for invalid type object should fail */ - expected = OS_ERR_INVALID_ID; - actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, 0xFFFF, refobjid, &local_idx, &rptr); - UtAssert_True(actual == expected, "OS_ObjectIdGetById() (%ld) == OS_ERR_INVALID_ID", (long)actual); + expected = OS_ERR_INCORRECT_OBJ_TYPE; + actual = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, 0xFFFF, refobjid, &token1); + UtAssert_True(actual == expected, "OS_ObjectIdGetById() (%ld) == OS_ERR_INCORRECT_OBJ_TYPE", (long)actual); OS_SharedGlobalVars.ShutdownFlag = 0; - /* refcount decrement should work */ - expected = OS_SUCCESS; - actual = OS_ObjectIdRefcountDecr(rptr); - UtAssert_True(actual == expected, "OS_ObjectIdRefcountDecr() (%ld) == OS_SUCCESS", (long)actual); - - /* decrement should fail if done a second time */ - expected = OS_ERR_INCORRECT_OBJ_STATE; - actual = OS_ObjectIdRefcountDecr(rptr); - UtAssert_True(actual == expected, "OS_ObjectIdRefcountDecr() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); - /* clear out state entry */ memset(&OS_global_task_table[local_idx], 0, sizeof(OS_global_task_table[local_idx])); - - expected = OS_ERR_INVALID_ID; - actual = OS_ObjectIdRefcountDecr(rptr); - UtAssert_True(actual == expected, "OS_ObjectIdRefcountDecr() (%ld) == OS_ERR_INVALID_ID", (long)actual); } -void Test_OS_ObjectIdFindNext(void) +void Test_OS_ObjectIdFindNextFree(void) { /* * Test Case For: - * int32 OS_ObjectIdFindNext(uint32 idtype, uint32 *array_index, OS_common_record_t **record); - * int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, uint32 *outid); + * int32 OS_ObjectIdFindNextFree(OS_object_token_t *token); + * int32 OS_ObjectIdFinalizeNew(int32 operation_status, &token, uint32 *outid); * * Note This test case covers both functions because they are somewhat interlinked and * they share state between them - The output of FindNext() should be passed to Finalize() @@ -409,75 +452,81 @@ void Test_OS_ObjectIdFindNext(void) int32 expected; int32 actual; + OS_object_token_t token1; + OS_object_token_t token2; OS_common_record_t *rec1; OS_common_record_t *rec2; osal_id_t id1; osal_id_t id2; - UT_idbuf_t check_id; - UT_idbuf_t saved_id; + osal_id_t saved_id; uint32 i; + memset(&token1, 0, sizeof(token1)); + token1.lock_mode = OS_LOCK_MODE_GLOBAL; + token1.obj_type = OS_OBJECT_TYPE_OS_TASK; + /* Need to first obtain a valid ID to finalize */ expected = OS_SUCCESS; - actual = OS_ObjectIdFindNext(OS_OBJECT_TYPE_OS_TASK, NULL, &rec1); - UtAssert_True(actual == expected, "OS_ObjectIdFindNext() (%ld) == OS_SUCCESS", (long)actual); + actual = OS_ObjectIdFindNextFree(&token1); + UtAssert_True(actual == expected, "OS_ObjectIdFindNextFree() (%ld) == OS_SUCCESS", (long)actual); /* nominal case (success) */ id1 = OS_OBJECT_ID_UNDEFINED; - actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, rec1, &id1); + actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token1, &id1); + OSAPI_TEST_OBJID(id1, ==, token1.obj_id); /* Verify Outputs */ + rec1 = OS_OBJECT_TABLE_GET(OS_global_task_table, token1); UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() (%ld) == OS_SUCCESS", (long)actual); - OSAPI_TEST_OBJID(id1, ==, rec1->active_id); + OSAPI_TEST_OBJID(token1.obj_id, ==, rec1->active_id); /* Allocate another ID (should be different!) */ - actual = OS_ObjectIdFindNext(OS_OBJECT_TYPE_OS_TASK, NULL, &rec2); - UtAssert_True(actual == expected, "OS_ObjectIdFindNext() (%ld) == OS_SUCCESS", (long)actual); - OSAPI_TEST_OBJID(rec2->active_id, !=, rec1->active_id); + memset(&token2, 0, sizeof(token2)); + token2.lock_mode = OS_LOCK_MODE_GLOBAL; + token2.obj_type = OS_OBJECT_TYPE_OS_TASK; + actual = OS_ObjectIdFindNextFree(&token2); + UtAssert_True(actual == expected, "OS_ObjectIdFindNextFree() (%ld) == OS_SUCCESS", (long)actual); + rec2 = OS_OBJECT_TABLE_GET(OS_global_task_table, token2); + OSAPI_TEST_OBJID(token2.obj_id, !=, token1.obj_id); /* Failure to initialize the second one. * Verify the error code passes thru */ - expected = -1234; - saved_id.id = rec2->active_id; - id2 = OS_OBJECT_ID_UNDEFINED; - actual = OS_ObjectIdFinalizeNew(expected, rec2, &id2); + expected = -1234; + saved_id = token2.obj_id; + id2 = OS_OBJECT_ID_UNDEFINED; + actual = OS_ObjectIdFinalizeNew(expected, &token2, &id2); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() (%ld) == %ld", (long)actual, (long)expected); OSAPI_TEST_OBJID(id2, ==, OS_OBJECT_ID_UNDEFINED); OSAPI_TEST_OBJID(rec2->active_id, ==, OS_OBJECT_ID_UNDEFINED); + OSAPI_TEST_OBJID(token2.obj_id, ==, saved_id); - /* next call should re-issue the same id because init failed */ - expected = OS_SUCCESS; - actual = OS_ObjectIdFindNext(OS_OBJECT_TYPE_OS_TASK, NULL, &rec2); - UtAssert_True(actual == expected, "OS_ObjectIdFindNext() (%ld) == OS_SUCCESS", (long)actual); - OSAPI_TEST_OBJID(rec2->active_id, ==, saved_id.id); - - /* test invalid case*/ - rec2->active_id = OS_OBJECT_ID_UNDEFINED; - expected = OS_ERR_INVALID_ID; - actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, rec2, &id2); - UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() (%ld) == %ld", (long)actual, (long)expected); - OSAPI_TEST_OBJID(id2, ==, OS_OBJECT_ID_UNDEFINED); - OSAPI_TEST_OBJID(rec2->active_id, ==, OS_OBJECT_ID_UNDEFINED); + /* next call should not re-issue the same id */ + memset(&token2, 0, sizeof(token2)); + token2.obj_type = OS_OBJECT_TYPE_OS_TASK; + expected = OS_SUCCESS; + actual = OS_ObjectIdFindNextFree(&token2); + UtAssert_True(actual == expected, "OS_ObjectIdFindNextFree() (%ld) == OS_SUCCESS", (long)actual); + OSAPI_TEST_OBJID(token2.obj_id, !=, saved_id); /* * Finally - test the wrap-around function to verify that object IDs * will continue to allocate correctly after OS_OBJECT_INDEX_MASK */ - expected = OS_SUCCESS; - saved_id.id = OS_OBJECT_ID_UNDEFINED; + expected = OS_SUCCESS; + saved_id = OS_OBJECT_ID_UNDEFINED; for (i = 0; i < (OS_OBJECT_INDEX_MASK + 2); ++i) { - actual = OS_ObjectIdFindNext(OS_OBJECT_TYPE_OS_TASK, NULL, &rec2); - /* not usuing UtAssert_True here as it will create thousands of duplicates. */ + actual = OS_ObjectIdFindNextFree(&token2); + /* not using UtAssert_True here as it will create thousands of duplicates. */ if (expected != actual) { - UtAssert_Failed("OS_ObjectIdFindNext() failure (%ld)", (long)actual); + UtAssert_Failed("OS_ObjectIdFindNextFree() failure (%ld)", (long)actual); break; } - actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, rec2, NULL); + actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token2, NULL); if (expected != actual) { UtAssert_Failed("OS_ObjectIdFinalizeNew() failure (%ld)", (long)actual); @@ -485,79 +534,79 @@ void Test_OS_ObjectIdFindNext(void) } /* should always be different than the previous ID */ - if (OS_ObjectIdEqual(saved_id.id, rec2->active_id)) + if (OS_ObjectIdEqual(saved_id, token2.obj_id)) { - UtAssert_Failed("OS_ObjectIdFindNext() re-issued ID (%lx)", (unsigned long)saved_id.val); + UtAssert_Failed("OS_ObjectIdFindNextFree() re-issued ID (%lx)", OS_ObjectIdToInteger(token2.obj_id)); break; } /* it also should never be id1, which was previously allocated */ - check_id.id = id1; - if (OS_ObjectIdEqual(check_id.id, rec2->active_id)) + if (OS_ObjectIdEqual(token1.obj_id, token2.obj_id)) { - UtAssert_Failed("OS_ObjectIdFindNext() duplicate ID (%lx)", (unsigned long)check_id.val); + UtAssert_Failed("OS_ObjectIdFindNextFree() duplicate ID (%lx)", OS_ObjectIdToInteger(token1.obj_id)); break; } if (rec1 == rec2) { - UtAssert_Failed("OS_ObjectIdFindNext() duplicate slot (%p)", (void *)rec1); + UtAssert_Failed("OS_ObjectIdFindNextFree() duplicate slot (%p)", (void *)rec1); break; } /* Find the wrap. Once this occurs the test is successful. */ - check_id.id = rec2->active_id; - if (saved_id.val > check_id.val) + if (OS_ObjectIdToInteger(saved_id) > OS_ObjectIdToInteger(token2.obj_id)) { /* Success */ break; } /* clear the entry for re-use */ - saved_id.id = rec2->active_id; - rec2->active_id = OS_OBJECT_ID_UNDEFINED; + saved_id = token2.obj_id; + rec2 = OS_OBJECT_TABLE_GET(OS_global_task_table, token2); + memset(rec2, 0, sizeof(*rec2)); } /* verify that the wrap occurred */ - UtAssert_True(i < (OS_OBJECT_INDEX_MASK + 2), "OS_ObjectIdFindNext() wrap around occurred"); + UtAssert_True(i < (OS_OBJECT_INDEX_MASK + 2), "OS_ObjectIdFindNextFree() wrap around occurred"); } void Test_OS_ObjectIdAllocateNew(void) { /* * Test Case For: - * int32 OS_ObjectIdAllocateNew(uint32 idtype, const char *name, uint32 *array_index, OS_common_record_t **record); + * int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, OS_object_token_t *token) * - * Most of the business logic is done by OS_ObjectIdFindNext() which is tested separately + * Most of the business logic is done by OS_ObjectIdFindNextFree() which is tested separately * This test case mainly focuses on additional error checking */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - osal_index_t idx; - OS_common_record_t *rptr = NULL; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_object_token_t token; - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &idx, &rptr); + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &token); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(rptr != NULL, "rptr (%p) != NULL", (void *)rptr); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_EXCLUSIVE); + UtAssert_UINT32_EQ(token.obj_type, OS_OBJECT_TYPE_OS_TASK); + UtAssert_Bool(OS_ObjectIdDefined(token.obj_id), "ObjectIdDefined(token.obj_id)"); /* Passing a NULL name also should work here (used for internal objects) */ - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, NULL, &idx, &rptr); + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, NULL, &token); UtAssert_True(actual == expected, "OS_ObjectIdAllocate(NULL) (%ld) == OS_SUCCESS", (long)actual); - rptr->name_entry = "UT_alloc"; - expected = OS_ERR_NAME_TAKEN; - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &idx, &rptr); + OS_global_task_table[0].name_entry = "UT_alloc"; + expected = OS_ERR_NAME_TAKEN; + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &token); UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_NAME_TAKEN", (long)actual); OS_SharedGlobalVars.ShutdownFlag = OS_SHUTDOWN_MAGIC_NUMBER; - expected = OS_ERROR; - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &idx, &rptr); + expected = OS_ERR_INCORRECT_OBJ_STATE; + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &token); OS_SharedGlobalVars.ShutdownFlag = 0; - UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_NAME_TAKEN", (long)actual); + UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); expected = OS_ERR_INCORRECT_OBJ_TYPE; - actual = OS_ObjectIdAllocateNew(0xFFFF, "UT_alloc", &idx, &rptr); + actual = OS_ObjectIdAllocateNew(0xFFFF, "UT_alloc", &token); UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_INCORRECT_OBJ_TYPE", (long)actual); } @@ -569,21 +618,20 @@ void Test_OS_ConvertToArrayIndex(void) * * */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; // OS_ConvertToArrayIndex(); - osal_index_t local_idx1; - osal_index_t local_idx2; - OS_common_record_t *rptr = NULL; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; // OS_ConvertToArrayIndex(); + osal_id_t refobjid; + osal_index_t local_idx; /* Need a valid ID to work with */ - OS_ObjectIdFindNext(OS_OBJECT_TYPE_OS_TASK, &local_idx1, &rptr); - actual = OS_ConvertToArrayIndex(rptr->active_id, &local_idx2); + OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TASK, 1234, &refobjid); + actual = OS_ConvertToArrayIndex(refobjid, &local_idx); UtAssert_True(actual == expected, "OS_ConvertToArrayIndex() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(local_idx1 == local_idx2, "local_idx1 (%lu) == local_idx2 (%lu)", (unsigned long)local_idx1, - (unsigned long)local_idx2); + UtAssert_True(local_idx < OS_MAX_TASKS, "local_idx (%lu) < OS_MAX_TASKS (%lu)", (unsigned long)local_idx, + (unsigned long)OS_MAX_TASKS); expected = OS_ERR_INVALID_ID; - actual = OS_ConvertToArrayIndex(OS_OBJECT_ID_UNDEFINED, &local_idx2); + actual = OS_ConvertToArrayIndex(OS_OBJECT_ID_UNDEFINED, &local_idx); UtAssert_True(actual == expected, "OS_ConvertToArrayIndex() (%ld) == OS_ERR_INVALID_ID", (long)actual); } @@ -593,21 +641,22 @@ void Test_OS_ForEachObject(void) * Test Case For: * void OS_ForEachObject (uint32 creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg); */ - osal_objtype_t objtype; - OS_common_record_t * rptr = NULL; - osal_index_t local_idx; + OS_object_token_t token; UT_idbuf_t self_id; Test_OS_ObjTypeCount_t Count; self_id.id = OS_TaskGetId(); memset(&Count, 0, sizeof(Count)); + memset(&token, 0, sizeof(token)); - objtype = OS_OBJECT_TYPE_UNDEFINED; - while (objtype < OS_OBJECT_TYPE_USER) + while (token.obj_type < OS_OBJECT_TYPE_USER) { - OS_ObjectIdFindNext(objtype, &local_idx, &rptr); - ++objtype; + if (OS_ObjectIdFindNextFree(&token) == OS_SUCCESS) + { + OS_ObjectIdGlobalFromToken(&token)->active_id = token.obj_id; + } + ++token.obj_type; } OS_ForEachObject(OS_OBJECT_ID_UNDEFINED, &ObjTypeCounter, &Count); @@ -642,8 +691,8 @@ void Test_OS_GetResourceName(void) * Test Case For: * int32 OS_GetResourceName(uint32 id, char *buffer, uint32 buffer_size) */ - osal_index_t local_idx; - OS_common_record_t *rptr = NULL; + OS_object_token_t token; + OS_common_record_t *rptr; char NameBuffer[OS_MAX_API_NAME]; int32 expected; int32 actual; @@ -652,19 +701,24 @@ void Test_OS_GetResourceName(void) * Set up for the OS_GetResourceName function to return success */ /* Need a valid ID to work with */ - OS_ObjectIdFindNext(OS_OBJECT_TYPE_OS_TASK, &local_idx, &rptr); + memset(&token, 0, sizeof(token)); + token.obj_type = OS_OBJECT_TYPE_OS_TASK; + OS_ObjectIdFindNextFree(&token); + rptr = OS_OBJECT_TABLE_GET(OS_global_task_table, token); rptr->name_entry = "UTTask"; - expected = OS_SUCCESS; - actual = OS_GetResourceName(rptr->active_id, NameBuffer, sizeof(NameBuffer)); + rptr->active_id = token.obj_id; + + expected = OS_SUCCESS; + actual = OS_GetResourceName(token.obj_id, NameBuffer, sizeof(NameBuffer)); UtAssert_True(actual == expected, "OS_GetResourceName() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(strcmp(NameBuffer, "UTTask") == 0, "NameBuffer (%s) == UTTask", NameBuffer); expected = OS_ERR_NAME_TOO_LONG; - actual = OS_GetResourceName(rptr->active_id, NameBuffer, OSAL_SIZE_C(2)); + actual = OS_GetResourceName(token.obj_id, NameBuffer, OSAL_SIZE_C(2)); UtAssert_True(actual == expected, "OS_GetResourceName() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_GetResourceName(rptr->active_id, NULL, OSAL_SIZE_C(0)); + actual = OS_GetResourceName(token.obj_id, NULL, OSAL_SIZE_C(0)); UtAssert_True(actual == expected, "OS_GetResourceName() (%ld) == OS_INVALID_POINTER", (long)actual); } @@ -703,12 +757,12 @@ void UtTest_Setup(void) { ADD_TEST(OS_ObjectIdInit); ADD_TEST(OS_LockUnlockGlobal); - ADD_TEST(OS_ObjectIdFindNext); + ADD_TEST(OS_ObjectIdFindNextFree); ADD_TEST(OS_ObjectIdToArrayIndex); ADD_TEST(OS_ObjectIdFindByName); ADD_TEST(OS_ObjectIdGetById); ADD_TEST(OS_ObjectIdAllocateNew); - ADD_TEST(OS_ObjectIdConvertLock); + ADD_TEST(OS_ObjectIdConvertToken); ADD_TEST(OS_ObjectIdGetBySearch); ADD_TEST(OS_ConvertToArrayIndex); ADD_TEST(OS_ForEachObject); diff --git a/src/unit-test-coverage/shared/src/coveragetest-module.c b/src/unit-test-coverage/shared/src/coveragetest-module.c index 1b69365af..1a13d9389 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-module.c +++ b/src/unit-test-coverage/shared/src/coveragetest-module.c @@ -229,20 +229,13 @@ void Test_OS_ModuleGetInfo(void) * Test Case For: * int32 OS_ModuleInfo ( uint32 module_id, OS_module_prop_t *module_prop ) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_module_prop_t module_prop; - osal_index_t local_index; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - local_index = UT_INDEX_1; - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_module_prop_t module_prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_MODULE, UT_INDEX_1, "ABC", UT_OBJID_OTHER); strncpy(OS_module_table[1].file_name, "DEF", sizeof(OS_module_table[1].file_name)); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + actual = OS_ModuleInfo(UT_OBJID_1, &module_prop); UtAssert_True(actual == expected, "OS_ModuleGetInfo() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-mutex.c b/src/unit-test-coverage/shared/src/coveragetest-mutex.c index 8fa79469c..b14655ecd 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/shared/src/coveragetest-mutex.c @@ -136,18 +136,12 @@ void Test_OS_MutSemGetInfo(void) * Test Case For: * int32 OS_MutSemGetInfo (uint32 sem_id, OS_mut_sem_prop_t *mut_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_mut_sem_prop_t prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_mut_sem_prop_t prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_MUTEX, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + actual = OS_MutSemGetInfo(UT_OBJID_1, &prop); UtAssert_True(actual == expected, "OS_MutSemGetInfo() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-printf.c b/src/unit-test-coverage/shared/src/coveragetest-printf.c index c7f0fb9ac..44f7f7586 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-printf.c +++ b/src/unit-test-coverage/shared/src/coveragetest-printf.c @@ -38,10 +38,16 @@ void Test_OS_ConsoleAPI_Init(void) * Test Case For: * int32 OS_ConsoleAPI_Init(void) */ - uint32 CallCount = 0; - uint32 local_id = 0; + uint32 CallCount = 0; + OS_object_token_t token; + + /* make a custom token to force use of array index 0 */ + token.lock_mode = OS_LOCK_MODE_NONE; + token.obj_type = OS_OBJECT_TYPE_OS_CONSOLE; + token.obj_idx = UT_INDEX_0; + token.obj_id = UT_OBJID_1; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdAllocateNew), &local_id, sizeof(local_id), false); + UT_SetDataBuffer(UT_KEY(OS_ObjectIdAllocateNew), &token, sizeof(token), false); /* call for coverage */ OS_ConsoleAPI_Init(); diff --git a/src/unit-test-coverage/shared/src/coveragetest-queue.c b/src/unit-test-coverage/shared/src/coveragetest-queue.c index dc6ccb64d..d5efa54ac 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-queue.c +++ b/src/unit-test-coverage/shared/src/coveragetest-queue.c @@ -166,20 +166,15 @@ void Test_OS_QueueGetInfo(void) * Test Case For: * int32 OS_QueueGetInfo (uint32 queue_id, OS_queue_prop_t *queue_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_queue_prop_t queue_prop; - osal_id_t id; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - id = UT_OBJID_OTHER; - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_queue_prop_t queue_prop; + osal_id_t id; + + id = UT_OBJID_OTHER; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_QUEUE, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + actual = OS_QueueGetInfo(UT_OBJID_1, &queue_prop); UtAssert_True(actual == expected, "OS_QueueGetInfo() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-sockets.c b/src/unit-test-coverage/shared/src/coveragetest-sockets.c index 5c9156edd..d3a7feb63 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-sockets.c +++ b/src/unit-test-coverage/shared/src/coveragetest-sockets.c @@ -159,7 +159,7 @@ void Test_OS_SocketAccept(void) OS_stream_table[local_id].socket_type = OS_SocketType_STREAM; OS_stream_table[local_id].stream_state = OS_STREAM_STATE_BOUND; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_id, sizeof(local_id), false); + OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_STREAM, local_id); memset(&Addr, 0, sizeof(Addr)); actual = OS_SocketAccept(UT_OBJID_1, &connsock_id, &Addr, 0); @@ -215,7 +215,7 @@ void Test_OS_SocketConnect(void) memset(&Addr, 0, sizeof(Addr)); idbuf = UT_INDEX_1; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); + OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_STREAM, idbuf); OS_stream_table[idbuf].socket_domain = OS_SocketDomain_INET; OS_stream_table[idbuf].socket_type = OS_SocketType_STREAM; OS_stream_table[idbuf].stream_state = 0; @@ -268,7 +268,7 @@ void Test_OS_SocketRecvFrom(void) memset(&Addr, 0, sizeof(Addr)); idbuf = UT_INDEX_1; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); + OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_STREAM, idbuf); OS_stream_table[idbuf].socket_type = OS_SocketType_DATAGRAM; OS_stream_table[idbuf].stream_state = OS_STREAM_STATE_BOUND; actual = OS_SocketRecvFrom(UT_OBJID_1, &Buf, 1, &Addr, 0); @@ -319,7 +319,7 @@ void Test_OS_SocketSendTo(void) memset(&Addr, 0, sizeof(Addr)); idbuf = UT_INDEX_1; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &idbuf, sizeof(idbuf), false); + OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_STREAM, idbuf); OS_stream_table[idbuf].socket_type = OS_SocketType_DATAGRAM; OS_stream_table[idbuf].stream_state = OS_STREAM_STATE_BOUND; actual = OS_SocketSendTo(UT_OBJID_1, &Buf, sizeof(Buf), &Addr); @@ -381,18 +381,11 @@ void Test_OS_SocketGetInfo(void) * Test Case For: * int32 OS_SocketGetInfo (uint32 sock_id, OS_socket_prop_t *sock_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_socket_prop_t prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_socket_prop_t prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_STREAM, UT_INDEX_1, "ABC", UT_OBJID_OTHER); actual = OS_SocketGetInfo(UT_OBJID_1, &prop); UtAssert_True(actual == expected, "OS_SocketGetInfo() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-task.c b/src/unit-test-coverage/shared/src/coveragetest-task.c index 9fa88677d..1d9d20d8c 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-task.c +++ b/src/unit-test-coverage/shared/src/coveragetest-task.c @@ -56,6 +56,7 @@ void Test_OS_TaskEntryPoint(void) uint32 CallCount = 0; UT_TestHook_Count = 0; + UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdGetById), 1, OS_ERROR); OS_TaskEntryPoint(UT_OBJID_1); UtAssert_True(UT_TestHook_Count == 0, "UT_TestHook_Count (%lu) == 0", (unsigned long)UT_TestHook_Count); CallCount = UT_GetStubCount(UT_KEY(OS_TaskMatch_Impl)); @@ -154,14 +155,6 @@ void Test_OS_TaskExit(void) * Test Case For: * void OS_TaskExit() */ - osal_index_t local_index = UT_INDEX_0; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.active_id = UT_OBJID_1; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); OS_TaskExit(); @@ -249,27 +242,20 @@ void Test_OS_TaskGetInfo(void) * Test Case For: * int32 OS_TaskGetInfo (uint32 task_id, OS_task_prop_t *task_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_task_prop_t task_prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_task_prop_t task_prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_TASK, UT_INDEX_1, "ABC", UT_OBJID_OTHER); OS_task_table[1].stack_size = OSAL_SIZE_C(222); OS_task_table[1].priority = OSAL_PRIORITY_C(133); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + actual = OS_TaskGetInfo(UT_OBJID_1, &task_prop); UtAssert_True(actual == expected, "OS_TaskGetInfo() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(task_prop.creator, ==, UT_OBJID_OTHER); UtAssert_True(strcmp(task_prop.name, "ABC") == 0, "task_prop.name (%s) == ABC", task_prop.name); - UtAssert_True(task_prop.stack_size == 222, "task_prop.stack_size (%lu) == 222", - (unsigned long)task_prop.stack_size); + UtAssert_True(task_prop.stack_size == 222, "task_prop.stack_size (%lu) == 222", (unsigned long)task_prop.stack_size); UtAssert_True(task_prop.priority == 133, "task_prop.priority (%lu) == 133", (unsigned long)task_prop.priority); OS_task_table[1].stack_size = OSAL_SIZE_C(0); diff --git a/src/unit-test-coverage/shared/src/coveragetest-time.c b/src/unit-test-coverage/shared/src/coveragetest-time.c index fc9fd125d..9ab947db0 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-time.c +++ b/src/unit-test-coverage/shared/src/coveragetest-time.c @@ -170,10 +170,11 @@ void Test_OS_TimerSet(void) actual = OS_TimerSet(UT_OBJID_1, 0, 1); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_SUCCESS", (long)actual); - OS_timecb_table[2].timebase_ref = UT_INDEX_0; - OS_timecb_table[2].flags = TIMECB_FLAG_DEDICATED_TIMEBASE; - OS_global_timebase_table[0].active_id = UT_OBJID_2; - actual = OS_TimerSet(UT_OBJID_2, 0, 1); + OS_timecb_table[2].timebase_token.obj_type = OS_OBJECT_TYPE_OS_TIMEBASE; + OS_timecb_table[2].timebase_token.obj_id = UT_OBJID_2; + OS_timecb_table[2].timebase_token.obj_idx = UT_INDEX_0; + OS_timecb_table[2].flags = TIMECB_FLAG_DEDICATED_TIMEBASE; + actual = OS_TimerSet(UT_OBJID_2, 0, 1); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_SUCCESS", (long)actual); memset(OS_timecb_table, 0, sizeof(OS_timecb_table)); @@ -194,17 +195,20 @@ void Test_OS_TimerDelete(void) * Test Case For: * int32 OS_TimerDelete(uint32 timer_id) */ - int32 expected = OS_SUCCESS; - int32 actual = OS_TimerDelete(UT_OBJID_1); + int32 expected = OS_SUCCESS; + int32 actual = OS_TimerDelete(UT_OBJID_1); + osal_id_t timebase_id; UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); - OS_timecb_table[1].timebase_ref = UT_INDEX_0; - OS_timecb_table[2].timebase_ref = UT_INDEX_0; - OS_timecb_table[2].next_ref = UT_INDEX_1; - OS_timecb_table[1].next_ref = UT_INDEX_1; - OS_timebase_table[0].first_cb = UT_OBJID_2; - actual = OS_TimerDelete(UT_OBJID_2); + OS_timecb_table[1].timebase_token.obj_type = OS_OBJECT_TYPE_OS_TIMEBASE; + OS_timecb_table[1].timebase_token.obj_id = UT_OBJID_1; + OS_timecb_table[1].timebase_token.obj_idx = UT_INDEX_0; + OS_timecb_table[2].timebase_token = OS_timecb_table[1].timebase_token; + OS_timecb_table[2].next_ref = UT_INDEX_1; + OS_timecb_table[1].next_ref = UT_INDEX_1; + OS_timebase_table[0].first_cb = UT_OBJID_2; + actual = OS_TimerDelete(UT_OBJID_2); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); OS_timebase_table[0].first_cb = UT_OBJID_1; @@ -213,10 +217,13 @@ void Test_OS_TimerDelete(void) /* verify deletion of the dedicated timebase objects * these are implicitly created as part of timer creation for API compatibility */ - OS_TimeBaseCreate(&OS_global_timebase_table[0].active_id, "ut", NULL); - OS_timecb_table[1].flags = TIMECB_FLAG_DEDICATED_TIMEBASE; - OS_timecb_table[1].timebase_ref = UT_INDEX_0; - actual = OS_TimerDelete(UT_OBJID_1); + OS_TimeBaseCreate(&timebase_id, "ut", NULL); + OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_TIMECB, UT_INDEX_1); + OS_timecb_table[1].flags = TIMECB_FLAG_DEDICATED_TIMEBASE; + OS_timecb_table[1].timebase_token.obj_type = OS_OBJECT_TYPE_OS_TIMEBASE; + OS_timecb_table[1].timebase_token.obj_id = timebase_id; + OS_timecb_table[1].timebase_token.obj_idx = OS_ObjectIdToInteger(timebase_id) & OS_OBJECT_INDEX_MASK; + actual = OS_TimerDelete(UT_OBJID_1); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(UT_GetStubCount(UT_KEY(OS_TimeBaseDelete)) == 1, "OS_TimerDelete() invoked OS_TimeBaseDelete()"); @@ -266,21 +273,18 @@ void Test_OS_TimerGetInfo(void) * Test Case For: * int32 OS_TimerGetInfo (uint32 timer_id, OS_timer_prop_t *timer_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_timer_prop_t timer_prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; - OS_timecb_table[1].interval_time = 2222; - OS_timecb_table[1].timebase_ref = UT_INDEX_0; - OS_timebase_table[0].accuracy_usec = 3333; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_timer_prop_t timer_prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_TIMECB, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + + OS_timecb_table[1].interval_time = 2222; + OS_timecb_table[1].timebase_token.obj_type = OS_OBJECT_TYPE_OS_TIMEBASE; + OS_timecb_table[1].timebase_token.obj_id = UT_OBJID_1; + OS_timecb_table[1].timebase_token.obj_idx = UT_INDEX_0; + OS_timebase_table[0].accuracy_usec = 3333; + actual = OS_TimerGetInfo(UT_OBJID_1, &timer_prop); UtAssert_True(actual == expected, "OS_TimerGetInfo() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index bfde8cb2e..6239ffd71 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -189,21 +189,16 @@ void Test_OS_TimeBaseGetInfo(void) * Test Case For: * int32 OS_TimeBaseGetInfo (uint32 timebase_id, OS_timebase_prop_t *timebase_prop) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_timebase_prop_t timebase_prop; - osal_index_t local_index = UT_INDEX_1; - OS_common_record_t utrec; - OS_common_record_t *rptr = &utrec; - - memset(&utrec, 0, sizeof(utrec)); - utrec.creator = UT_OBJID_OTHER; - utrec.name_entry = "ABC"; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + OS_timebase_prop_t timebase_prop; + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_TIMEBASE, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + OS_timebase_table[1].nominal_interval_time = 2222; OS_timebase_table[1].freerun_time = 3333; OS_timebase_table[1].accuracy_usec = 4444; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &rptr, sizeof(rptr), false); + actual = OS_TimeBaseGetInfo(UT_OBJID_1, &timebase_prop); UtAssert_True(actual == expected, "OS_TimeBaseGetInfo() (%ld) == OS_SUCCESS", (long)actual); @@ -247,13 +242,11 @@ void Test_OS_TimeBase_CallbackThread(void) * Test Case For: * void OS_TimeBase_CallbackThread(uint32 timebase_id) */ - OS_common_record_t fake_record; - OS_common_record_t *recptr = &fake_record; - osal_index_t local_index; + OS_common_record_t *recptr; - local_index = UT_INDEX_2; - memset(&fake_record, 0, sizeof(fake_record)); - fake_record.active_id = UT_OBJID_2; + recptr = &OS_global_timebase_table[2]; + memset(recptr, 0, sizeof(*recptr)); + recptr->active_id = UT_OBJID_2; OS_timebase_table[2].external_sync = UT_TimerSync; OS_timecb_table[0].wait_time = 2000; @@ -261,19 +254,17 @@ void Test_OS_TimeBase_CallbackThread(void) TimerSyncCount = 0; TimerSyncRetVal = 0; TimeCB = 0; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &recptr, sizeof(recptr), false); + OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_TIMEBASE, UT_INDEX_2); UT_SetHookFunction(UT_KEY(OS_TimeBaseLock_Impl), ClearObjectsHook, recptr); OS_TimeBase_CallbackThread(UT_OBJID_2); UtAssert_True(TimerSyncCount == 11, "TimerSyncCount (%lu) == 11", (unsigned long)TimerSyncCount); UT_ResetState(UT_KEY(OS_TimeBaseLock_Impl)); - TimerSyncCount = 0; - TimerSyncRetVal = 1000; - fake_record.active_id = UT_OBJID_2; - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &local_index, sizeof(local_index), false); - UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &recptr, sizeof(recptr), false); + TimerSyncCount = 0; + TimerSyncRetVal = 1000; + recptr->active_id = UT_OBJID_2; + OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_TIMEBASE, UT_INDEX_2); UT_SetHookFunction(UT_KEY(OS_TimeBaseLock_Impl), ClearObjectsHook, recptr); OS_TimeBase_CallbackThread(UT_OBJID_2); diff --git a/src/unit-test-coverage/shared/src/os-shared-coverage-support.c b/src/unit-test-coverage/shared/src/os-shared-coverage-support.c new file mode 100644 index 000000000..4d105dc82 --- /dev/null +++ b/src/unit-test-coverage/shared/src/os-shared-coverage-support.c @@ -0,0 +1,113 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 os-shared-coverage-support.c + * \ingroup adaptors + * \author joseph.p.hickey@nasa.gov + * + */ +#include "os-shared-coveragetest.h" +#include "os-shared-idmap.h" +#include "os-shared-common.h" + +void OS_UT_SetupIterator(osal_objtype_t obj_type, osal_index_t first_idx, osal_index_t num_entries) +{ + OS_object_token_t tokenlist[num_entries]; + osal_index_t idx = OSAL_INDEX_C(0); + + while (idx < num_entries) + { + tokenlist[idx].lock_mode = OS_LOCK_MODE_NONE; + tokenlist[idx].obj_type = obj_type; + tokenlist[idx].obj_idx = first_idx + idx; + tokenlist[idx].obj_id = OS_ObjectIdFromInteger((obj_type << OS_OBJECT_TYPE_SHIFT) | tokenlist[idx].obj_idx); + ++idx; + } + + UT_SetDataBuffer(UT_KEY(OS_ObjectIdIteratorGetNext), tokenlist, sizeof(OS_object_token_t) * num_entries, true); +} + +void OS_UT_SetupTestTargetIndex(osal_objtype_t obj_type, osal_index_t test_idx) +{ + OS_object_token_t token; + + token.lock_mode = OS_LOCK_MODE_NONE; + token.obj_type = obj_type; + token.obj_idx = test_idx; + token.obj_id = OS_ObjectIdFromInteger((obj_type << OS_OBJECT_TYPE_SHIFT) | test_idx); + + UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &token, sizeof(OS_object_token_t), true); +} + +void OS_UT_SetupBasicInfoTest(osal_objtype_t obj_type, osal_index_t test_idx, const char *name, osal_id_t creator) +{ + OS_common_record_t *rptr; + + switch (obj_type) + { + case OS_OBJECT_TYPE_OS_TASK: + rptr = OS_global_task_table; + break; + case OS_OBJECT_TYPE_OS_QUEUE: + rptr = OS_global_queue_table; + break; + case OS_OBJECT_TYPE_OS_BINSEM: + rptr = OS_global_bin_sem_table; + break; + case OS_OBJECT_TYPE_OS_COUNTSEM: + rptr = OS_global_count_sem_table; + break; + case OS_OBJECT_TYPE_OS_MUTEX: + rptr = OS_global_mutex_table; + break; + case OS_OBJECT_TYPE_OS_CONSOLE: + rptr = OS_global_console_table; + break; + case OS_OBJECT_TYPE_OS_MODULE: + rptr = OS_global_module_table; + break; + case OS_OBJECT_TYPE_OS_FILESYS: + rptr = OS_global_filesys_table; + break; + case OS_OBJECT_TYPE_OS_TIMEBASE: + rptr = OS_global_timebase_table; + break; + case OS_OBJECT_TYPE_OS_TIMECB: + rptr = OS_global_timecb_table; + break; + case OS_OBJECT_TYPE_OS_STREAM: + rptr = OS_global_stream_table; + break; + case OS_OBJECT_TYPE_OS_DIR: + rptr = OS_global_dir_table; + break; + default: + rptr = NULL; + break; + } + + rptr += test_idx; + memset(rptr, 0, sizeof(*rptr)); + rptr->creator = UT_OBJID_OTHER; + rptr->name_entry = "ABC"; + + OS_UT_SetupTestTargetIndex(obj_type, test_idx); +} diff --git a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h index 55397f6fb..59144c01f 100644 --- a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h +++ b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h @@ -78,6 +78,31 @@ typedef union #define UT_INDEX_1 OSAL_INDEX_C(1) #define UT_INDEX_2 OSAL_INDEX_C(2) +/* + * Set up an coverage test iterator of the given type. + * + * The OS_ObjectIdIteratorGetNext() stub routine will be configured + * to return the given range of IDs. + */ +void OS_UT_SetupIterator(osal_objtype_t obj_type, osal_index_t first_idx, osal_index_t num_entries); + +/* + * Set up the UT stubs for the target entry of the next test case. + * + * This configures the OS_ObjectIdGetById() stub to return a token + * that refers to the given entry index. + */ +void OS_UT_SetupTestTargetIndex(osal_objtype_t obj_type, osal_index_t test_idx); + +/* + * Set up the UT stubs for a "get info" test. + * + * This sets up a single entry in the global table with the given name and + * ID value. It also configures the OS_ObjectIdGetById() stub to return a + * token that refers to the same table entry. + */ +void OS_UT_SetupBasicInfoTest(osal_objtype_t obj_type, osal_index_t test_idx, const char *name, osal_id_t creator); + /* * Setup function prior to every test */ diff --git a/src/ut-stubs/osapi-utstub-idmap.c b/src/ut-stubs/osapi-utstub-idmap.c index 594c4812f..3526f98e5 100644 --- a/src/ut-stubs/osapi-utstub-idmap.c +++ b/src/ut-stubs/osapi-utstub-idmap.c @@ -39,6 +39,17 @@ #include "utstub-helpers.h" #include "os-shared-idmap.h" +/* + * UT Helper function to create a fake object lock token + */ +static void UT_TokenCompose(uint32 lock_mode, uint32 indx, UT_ObjType_t objtype, OS_object_token_t *token) +{ + token->lock_mode = lock_mode; + token->obj_type = objtype; + token->obj_idx = indx; + UT_ObjIdCompose(indx, objtype, &token->obj_id); +} + UT_DEFAULT_STUB(OS_ObjectIdInit, (void)) /* Lock/Unlock for global tables */ @@ -117,22 +128,44 @@ int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t id, osal_index_t return Status; } +/***************************************************************************** + * + * Stub function for OS_ObjectIdGlobalFromToken() + * + *****************************************************************************/ +OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) +{ + static OS_common_record_t fake_record; + int32 status; + OS_common_record_t * recptr; + + status = UT_DEFAULT_IMPL(OS_ObjectIdGlobalFromToken); + if (status == 0 && + UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGlobalFromToken), &recptr, sizeof(recptr)) < sizeof(recptr)) + { + /* This function should never return null */ + recptr = &fake_record; + } + + return recptr; +} + /***************************************************************************** * * Stub function for OS_ObjectIdFinalize() * *****************************************************************************/ -int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, osal_id_t *outid) +int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, osal_id_t *outid) { int32 Status; Status = UT_DEFAULT_IMPL_RC(OS_ObjectIdFinalizeNew, operation_status); /* need to actually write something to the output buffer */ - if (Status == OS_SUCCESS && record != NULL && outid != NULL && + if (Status == OS_SUCCESS && token != NULL && outid != NULL && UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdFinalizeNew), outid, sizeof(*outid)) < sizeof(*outid)) { - *outid = record->active_id; + *outid = token->obj_id; } return Status; @@ -143,7 +176,7 @@ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_common_record_t *record, * Stub function for OS_ObjectIdFinalizeDelete() * *****************************************************************************/ -int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *record) +int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_object_token_t *token) { int32 Status; @@ -158,10 +191,9 @@ int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_common_record_t *reco * *****************************************************************************/ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_ObjectMatchFunc_t MatchFunc, void *arg, - OS_common_record_t **record) + OS_object_token_t *token) { - int32 Status; - static OS_common_record_t fake_record; + int32 Status; /* by default this stub should return NAME_NOT_FOUND * unless the test case has set up otherwise. To set @@ -170,12 +202,10 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS */ Status = UT_DEFAULT_IMPL(OS_ObjectIdGetBySearch); - if (Status == OS_SUCCESS && record != NULL && - UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetBySearch), record, sizeof(*record)) < sizeof(*record)) + if (Status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetBySearch), token, sizeof(*token)) < sizeof(*token)) { - memset(&fake_record, 0, sizeof(fake_record)); - UT_ObjIdCompose(1, idtype, &fake_record.active_id); - *record = &fake_record; + UT_TokenCompose(lock_mode, 1, idtype, token); } return Status; @@ -183,7 +213,7 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS /***************************************************************************** * - * Stub function for OS_ObjectIdFindByName(, &fake_record.active_id) + * Stub function for OS_ObjectIdFindByName() * *****************************************************************************/ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t *object_id) @@ -208,33 +238,19 @@ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t * /***************************************************************************** * - * Stub function for OS_ObjectIdGetByName(,object_id) + * Stub function for OS_ObjectIdGetByName() * *****************************************************************************/ -int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, - OS_common_record_t **record) +int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, const char *name, OS_object_token_t *token) { - int32 Status; - OS_common_record_t * local_record; - static OS_common_record_t fake_record; + int32 Status; Status = UT_DEFAULT_IMPL(OS_ObjectIdGetByName); - if (Status == 0) + if (Status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetByName), token, sizeof(*token)) < sizeof(*token)) { - if (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetByName), &local_record, sizeof(local_record)) < - sizeof(local_record)) - { - memset(&fake_record, 0, sizeof(fake_record)); - local_record = &fake_record; - UT_ObjIdCompose(1, idtype, &fake_record.active_id); - } - - /* this needs to output something valid or code will break */ - if (record != NULL) - { - *record = local_record; - } + UT_TokenCompose(lock_mode, 1, idtype, token); } return Status; @@ -242,45 +258,18 @@ int32 OS_ObjectIdGetByName(OS_lock_mode_t lock_mode, osal_objtype_t idtype, cons /***************************************************************************** * - * Stub function for OS_ObjectIdGetById(, &fake_record.active_id) + * Stub function for OS_ObjectIdGetById() * *****************************************************************************/ -int32 OS_ObjectIdGetById(OS_lock_mode_t check_mode, osal_objtype_t idtype, osal_id_t id, osal_index_t *array_index, - OS_common_record_t **record) +int32 OS_ObjectIdGetById(OS_lock_mode_t lock_mode, osal_objtype_t idtype, osal_id_t id, OS_object_token_t *token) { - int32 Status; - uint32 tempserial; - osal_index_t local_id; - UT_ObjType_t checktype; - OS_common_record_t * local_record; - static OS_common_record_t fake_record; + int32 Status; Status = UT_DEFAULT_IMPL(OS_ObjectIdGetById); - if (Status == 0) + if (Status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetById), token, sizeof(*token)) < sizeof(*token)) { - if (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetById), &local_id, sizeof(local_id)) < sizeof(local_id)) - { - UT_ObjIdDecompose(id, &tempserial, &checktype); - local_id = OSAL_INDEX_C(tempserial); - } - - if (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdGetById), &local_record, sizeof(local_record)) < sizeof(local_record)) - { - memset(&fake_record, 0, sizeof(fake_record)); - fake_record.active_id = id; - local_record = &fake_record; - } - - /* this needs to output something valid or code will break */ - if (array_index != NULL) - { - *array_index = local_id; - } - if (record != NULL) - { - *record = local_record; - } + UT_TokenCompose(lock_mode, OS_ObjectIdToInteger(id) & 0xFFFF, idtype, token); } return Status; @@ -288,16 +277,31 @@ int32 OS_ObjectIdGetById(OS_lock_mode_t check_mode, osal_objtype_t idtype, osal_ /***************************************************************************** * - * Stub function for OS_ObjectIdRefcountDecr() + * Stub function for OS_ObjectIdRelease() + * + *****************************************************************************/ +void OS_ObjectIdRelease(OS_object_token_t *token) +{ + UT_DEFAULT_IMPL(OS_ObjectIdRelease); +} + +/***************************************************************************** + * + * Stub function for OS_ObjectIdTransferToken() * *****************************************************************************/ -int32 OS_ObjectIdRefcountDecr(OS_common_record_t *record) +void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t *token_to) { int32 Status; - Status = UT_DEFAULT_IMPL(OS_ObjectIdRefcountDecr); + Status = UT_DEFAULT_IMPL(OS_ObjectIdTransferToken); - return Status; + if (Status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdTransferToken), token_to, sizeof(*token_to)) < sizeof(*token_to)) + { + /* just copy it if nothing specified */ + *token_to = *token_from; + } } /***************************************************************************** @@ -352,36 +356,19 @@ int32 OS_ObjectIdGetNext(osal_objtype_t idtype, uint32 *curr_index, OS_common_re /***************************************************************************** * - * Stub function for OS_ObjectIdAllocateNew(, &fake_record.active_id) + * Stub function for OS_ObjectIdAllocateNew() * *****************************************************************************/ -int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, osal_index_t *array_index, - OS_common_record_t **record) +int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, OS_object_token_t *token) { - int32 Status; - osal_index_t local_id; - OS_common_record_t * local_record; - static OS_common_record_t fake_record; + int32 Status; Status = UT_DEFAULT_IMPL(OS_ObjectIdAllocateNew); - if (Status == 0) + if (Status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdAllocateNew), token, sizeof(*token)) < sizeof(*token)) { - if (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdAllocateNew), &local_id, sizeof(local_id)) < sizeof(local_id)) - { - local_id = UT_GetStubCount(UT_KEY(OS_ObjectIdAllocateNew)) & 0xFFFF; - } - - if (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdAllocateNew), &local_record, sizeof(local_record)) < - sizeof(local_record)) - { - memset(&fake_record, 0, sizeof(fake_record)); - UT_ObjIdCompose(local_id, idtype, &fake_record.active_id); - local_record = &fake_record; - } - - *record = local_record; - *array_index = local_id; + UT_TokenCompose(OS_LOCK_MODE_GLOBAL, UT_GetStubCount(UT_KEY(OS_ObjectIdAllocateNew)), idtype, token); } return Status; @@ -523,6 +510,77 @@ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void } } +int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, osal_objtype_t objtype, + OS_object_iter_t *iter) +{ + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ObjectIdIteratorInit), matchfunc); + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ObjectIdIteratorInit), matcharg); + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ObjectIdIteratorInit), objtype); + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ObjectIdIteratorInit), iter); + + int32 Status; + + Status = UT_DEFAULT_IMPL_RC(OS_ObjectIdIteratorInit, 1); + + if (Status == 1 && UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdIteratorGetNext), iter, sizeof(*iter)) < sizeof(*iter)) + { + memset(iter, 0, sizeof(*iter)); + Status = OS_SUCCESS; + } + + return Status; +} + +int32 OS_ObjectIdIterateActive(osal_objtype_t objtype, OS_object_iter_t *iter) +{ + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ObjectIdIterateActive), objtype); + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ObjectIdIterateActive), iter); + + int32 Status; + + Status = UT_DEFAULT_IMPL_RC(OS_ObjectIdIterateActive, 1); + + if (Status == 1 && UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdIterateActive), iter, sizeof(*iter)) < sizeof(*iter)) + { + memset(iter, 0, sizeof(*iter)); + Status = OS_SUCCESS; + } + + return Status; +} + +bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter) +{ + UT_Stub_RegisterContextGenericArg(UT_KEY(OS_ObjectIdIteratorGetNext), iter); + + int32 Status; + + Status = UT_DEFAULT_IMPL_RC(OS_ObjectIdIteratorGetNext, -1); + + if (Status == -1) + { + /* if test case has registered something, return true, otherwise return false */ + Status = (UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdIteratorGetNext), &iter->token, sizeof(iter->token)) == + sizeof(iter->token)); + } + + return (bool)Status; +} + +void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter) +{ + UT_DEFAULT_IMPL(OS_ObjectIdIteratorDestroy); +} + +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t)) +{ + int32 Status; + + Status = UT_DEFAULT_IMPL(OS_ObjectIdIteratorProcessEntry); + + return Status; +} + /*--------------------------------------------------------------------------------------- Name: OS_IdentifyObject From f9d508d82f7c2fd12d5f69d8a00adb181e4a1a51 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 1 Dec 2020 09:09:19 -0500 Subject: [PATCH 020/111] Fix #648, rename internal fields for consistency Use a variable name that matches the type of resource being accessed, rather than just "local". In particular this is important for readability of timecb and timebase code where functions need often need to access both types of objects at the same time. This also updates filesys code to match. --- src/os/shared/src/osapi-filesys.c | 100 +++++++++++++++--------------- src/os/shared/src/osapi-time.c | 82 ++++++++++++------------ 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index 711ef7fb5..d791c7d05 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -76,17 +76,17 @@ const char OS_FILESYS_RAMDISK_VOLNAME_PREFIX[] = "RAM"; *-----------------------------------------------------------------*/ bool OS_FileSys_FindVirtMountPoint(void *ref, osal_index_t local_id, const OS_common_record_t *obj) { - OS_filesys_internal_record_t *rec = &OS_filesys_table[local_id]; - const char * target = (const char *)ref; + OS_filesys_internal_record_t *filesys = &OS_filesys_table[local_id]; + const char * target = (const char *)ref; size_t mplen; - if ((rec->flags & OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL) == 0) + if ((filesys->flags & OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL) == 0) { return false; } - mplen = strlen(rec->virtual_mountpt); - return (mplen > 0 && strncmp(target, rec->virtual_mountpt, mplen) == 0 && + mplen = strlen(filesys->virtual_mountpt); + return (mplen > 0 && strncmp(target, filesys->virtual_mountpt, mplen) == 0 && (target[mplen] == '/' || target[mplen] == 0)); } /* end OS_FileSys_FindVirtMountPoint */ @@ -104,7 +104,7 @@ bool OS_FileSys_FindVirtMountPoint(void *ref, osal_index_t local_id, const OS_co int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, size_t blocksize, osal_blockcount_t numblocks, bool should_format) { - OS_filesys_internal_record_t *local; + OS_filesys_internal_record_t *filesys; int32 return_code; OS_object_token_t token; @@ -123,7 +123,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs } /* check names are not excessively long strings */ - if (strlen(fsdevname) >= sizeof(local->device_name) || strlen(fsvolname) >= sizeof(local->volume_name)) + if (strlen(fsdevname) >= sizeof(filesys->device_name) || strlen(fsvolname) >= sizeof(filesys->volume_name)) { return OS_FS_ERR_PATH_TOO_LONG; } @@ -131,17 +131,17 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, fsdevname, &token); if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); + filesys = OS_OBJECT_TABLE_GET(OS_filesys_table, token); /* Reset the table entry and save the name */ - OS_OBJECT_INIT(token, local, device_name, fsdevname); + OS_OBJECT_INIT(token, filesys, device_name, fsdevname); /* populate the VolumeName and BlockSize ahead of the Impl call, * so the implementation can reference this info if necessary */ - local->blocksize = blocksize; - local->numblocks = numblocks; - local->address = address; - strcpy(local->volume_name, fsvolname); + filesys->blocksize = blocksize; + filesys->numblocks = numblocks; + filesys->address = address; + strcpy(filesys->volume_name, fsvolname); /* * Determine basic type of filesystem, if not already known @@ -150,11 +150,11 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs * contains the string "RAM" then it is a RAM disk. Otherwise * leave the type as UNKNOWN and let the implementation decide. */ - if (local->fstype == OS_FILESYS_TYPE_UNKNOWN && - (local->address != NULL || strncmp(local->volume_name, OS_FILESYS_RAMDISK_VOLNAME_PREFIX, - sizeof(OS_FILESYS_RAMDISK_VOLNAME_PREFIX) - 1) == 0)) + if (filesys->fstype == OS_FILESYS_TYPE_UNKNOWN && + (filesys->address != NULL || strncmp(filesys->volume_name, OS_FILESYS_RAMDISK_VOLNAME_PREFIX, + sizeof(OS_FILESYS_RAMDISK_VOLNAME_PREFIX) - 1) == 0)) { - local->fstype = OS_FILESYS_TYPE_VOLATILE_DISK; + filesys->fstype = OS_FILESYS_TYPE_VOLATILE_DISK; } return_code = OS_FileSysStartVolume_Impl(OS_ObjectIndexFromToken(&token)); @@ -172,7 +172,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs if (return_code == OS_SUCCESS) { - local->flags |= OS_FILESYS_FLAG_IS_READY; + filesys->flags |= OS_FILESYS_FLAG_IS_READY; } else { @@ -224,7 +224,7 @@ int32 OS_FileSysAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const char *virt_path) { - OS_filesys_internal_record_t *local; + OS_filesys_internal_record_t *filesys; int32 return_code; OS_object_token_t token; const char * dev_name; @@ -263,20 +263,20 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, dev_name, &token); if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); + filesys = OS_OBJECT_TABLE_GET(OS_filesys_table, token); /* Reset the table entry and save the name */ - OS_OBJECT_INIT(token, local, device_name, dev_name); + OS_OBJECT_INIT(token, filesys, device_name, dev_name); - strncpy(local->volume_name, dev_name, sizeof(local->volume_name) - 1); - strncpy(local->system_mountpt, phys_path, sizeof(local->system_mountpt) - 1); - strncpy(local->virtual_mountpt, virt_path, sizeof(local->virtual_mountpt) - 1); + strncpy(filesys->volume_name, dev_name, sizeof(filesys->volume_name) - 1); + strncpy(filesys->system_mountpt, phys_path, sizeof(filesys->system_mountpt) - 1); + strncpy(filesys->virtual_mountpt, virt_path, sizeof(filesys->virtual_mountpt) - 1); /* * mark the entry that it is a fixed disk */ - local->fstype = OS_FILESYS_TYPE_FS_BASED; - local->flags = OS_FILESYS_FLAG_IS_FIXED; + filesys->fstype = OS_FILESYS_TYPE_FS_BASED; + filesys->flags = OS_FILESYS_FLAG_IS_FIXED; /* * The "mount" implementation is required as it will @@ -286,7 +286,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const if (return_code == OS_SUCCESS) { - local->flags |= OS_FILESYS_FLAG_IS_READY; + filesys->flags |= OS_FILESYS_FLAG_IS_READY; return_code = OS_FileSysMountVolume_Impl(OS_ObjectIndexFromToken(&token)); } @@ -295,7 +295,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const /* * mark the entry that it is a fixed disk */ - local->flags |= OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + filesys->flags |= OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; } /* Check result, finalize record, and unlock global table. */ @@ -424,7 +424,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) { int32 return_code; OS_object_token_t token; - OS_filesys_internal_record_t *local; + OS_filesys_internal_record_t *filesys; /* Check parameters */ if (devname == NULL || mountpoint == NULL) @@ -432,7 +432,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) return OS_INVALID_POINTER; } - if (strlen(devname) >= sizeof(local->device_name) || strlen(mountpoint) >= sizeof(local->virtual_mountpt)) + if (strlen(devname) >= sizeof(filesys->device_name) || strlen(mountpoint) >= sizeof(filesys->virtual_mountpt)) { return OS_FS_ERR_PATH_TOO_LONG; } @@ -440,7 +440,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, devname, &token); if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); + filesys = OS_OBJECT_TABLE_GET(OS_filesys_table, token); /* * READY flag should be set (mkfs/initfs must have been called on this FS) @@ -449,12 +449,12 @@ int32 OS_mount(const char *devname, const char *mountpoint) * FIXED flag _should_ always be unset (these don't support mount/unmount) * but to support abstraction this is not enforced. */ - if ((local->flags & ~OS_FILESYS_FLAG_IS_FIXED) != OS_FILESYS_FLAG_IS_READY) + if ((filesys->flags & ~OS_FILESYS_FLAG_IS_FIXED) != OS_FILESYS_FLAG_IS_READY) { /* mount() cannot be used on this file system at this time */ return_code = OS_ERR_INCORRECT_OBJ_STATE; } - else if (local->system_mountpt[0] == 0) + else if (filesys->system_mountpt[0] == 0) { /* * The system mount point should be a non-empty string. @@ -470,8 +470,8 @@ int32 OS_mount(const char *devname, const char *mountpoint) { /* mark as mounted in the local table. * For now this does both sides (system and virtual) */ - local->flags |= OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; - strcpy(local->virtual_mountpt, mountpoint); + filesys->flags |= OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + strcpy(filesys->virtual_mountpt, mountpoint); } OS_ObjectIdRelease(&token); @@ -498,7 +498,7 @@ int32 OS_unmount(const char *mountpoint) { int32 return_code; OS_object_token_t token; - OS_filesys_internal_record_t *local; + OS_filesys_internal_record_t *filesys; /* Check parameters */ if (mountpoint == NULL) @@ -506,7 +506,7 @@ int32 OS_unmount(const char *mountpoint) return OS_INVALID_POINTER; } - if (strlen(mountpoint) >= sizeof(local->virtual_mountpt)) + if (strlen(mountpoint) >= sizeof(filesys->virtual_mountpt)) { return OS_FS_ERR_PATH_TOO_LONG; } @@ -516,7 +516,7 @@ int32 OS_unmount(const char *mountpoint) if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); + filesys = OS_OBJECT_TABLE_GET(OS_filesys_table, token); /* * FIXED flag should always be unset (these don't support mount/unmount at all) @@ -525,7 +525,7 @@ int32 OS_unmount(const char *mountpoint) * * The FIXED flag is not enforced to support abstraction. */ - if ((local->flags & ~OS_FILESYS_FLAG_IS_FIXED) != + if ((filesys->flags & ~OS_FILESYS_FLAG_IS_FIXED) != (OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL)) { /* unmount() cannot be used on this file system at this time */ @@ -540,7 +540,7 @@ int32 OS_unmount(const char *mountpoint) { /* mark as mounted in the local table. * For now this does both sides (system and virtual) */ - local->flags &= ~(OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL); + filesys->flags &= ~(OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL); } OS_ObjectIdRelease(&token); @@ -706,7 +706,7 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) { OS_object_token_t token; int32 return_code; - OS_filesys_internal_record_t *local; + OS_filesys_internal_record_t *filesys; if (MountPoint == NULL || PhysDriveName == NULL) { @@ -724,11 +724,11 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); + filesys = OS_OBJECT_TABLE_GET(OS_filesys_table, token); - if ((local->flags & OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM) != 0) + if ((filesys->flags & OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM) != 0) { - strncpy(PhysDriveName, local->system_mountpt, OS_FS_PHYS_NAME_LEN - 1); + strncpy(PhysDriveName, filesys->system_mountpt, OS_FS_PHYS_NAME_LEN - 1); PhysDriveName[OS_FS_PHYS_NAME_LEN - 1] = 0; } else @@ -811,7 +811,7 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) OS_object_token_t token; int32 return_code; const char * name_ptr; - OS_filesys_internal_record_t *local; + OS_filesys_internal_record_t *filesys; size_t SysMountPointLen; size_t VirtPathLen; size_t VirtPathBegin; @@ -868,15 +868,15 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) } else { - local = OS_OBJECT_TABLE_GET(OS_filesys_table, token); + filesys = OS_OBJECT_TABLE_GET(OS_filesys_table, token); - if ((local->flags & OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM) != 0) + if ((filesys->flags & OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM) != 0) { - SysMountPointLen = strlen(local->system_mountpt); - VirtPathBegin = strlen(local->virtual_mountpt); + SysMountPointLen = strlen(filesys->system_mountpt); + VirtPathBegin = strlen(filesys->virtual_mountpt); if (SysMountPointLen < OS_MAX_LOCAL_PATH_LEN) { - memcpy(LocalPath, local->system_mountpt, SysMountPointLen); + memcpy(LocalPath, filesys->system_mountpt, SysMountPointLen); } } else diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index ea52e2490..ed79e9bca 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -94,7 +94,7 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ osal_objtype_t objtype; OS_object_token_t timebase_token; OS_object_token_t timecb_token; - OS_timecb_internal_record_t * local; + OS_timecb_internal_record_t * timecb; OS_timebase_internal_record_t *timebase; osal_id_t cb_list; osal_index_t attach_id; @@ -150,24 +150,24 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ return_code = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TIMECB, timer_name, &timecb_token); if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_timecb_table, timecb_token); + timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, timecb_token); timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, timebase_token); /* Reset the table entry and save the name */ - OS_OBJECT_INIT(timecb_token, local, timer_name, timer_name); + OS_OBJECT_INIT(timecb_token, timecb, timer_name, timer_name); /* * transfer ownership so the refcount obtained earlier is now * associated with the timecb object, and will be retained until * the object is deleted. */ - OS_ObjectIdTransferToken(&timebase_token, &local->timebase_token); + OS_ObjectIdTransferToken(&timebase_token, &timecb->timebase_token); - local->callback_ptr = callback_ptr; - local->callback_arg = callback_arg; - local->flags = flags; - local->prev_ref = OS_ObjectIndexFromToken(&timecb_token); - local->next_ref = OS_ObjectIndexFromToken(&timecb_token); + timecb->callback_ptr = callback_ptr; + timecb->callback_arg = callback_arg; + timecb->flags = flags; + timecb->prev_ref = OS_ObjectIndexFromToken(&timecb_token); + timecb->next_ref = OS_ObjectIndexFromToken(&timecb_token); /* * Now we need to add it to the time base callback ring, so take the @@ -181,10 +181,10 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ if (OS_ObjectIdDefined(cb_list)) { OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TIMECB, cb_list, &attach_id); - local->next_ref = attach_id; - local->prev_ref = OS_timecb_table[attach_id].prev_ref; - OS_timecb_table[local->prev_ref].next_ref = OS_ObjectIndexFromToken(&timecb_token); - OS_timecb_table[local->next_ref].prev_ref = OS_ObjectIndexFromToken(&timecb_token); + timecb->next_ref = attach_id; + timecb->prev_ref = OS_timecb_table[attach_id].prev_ref; + OS_timecb_table[timecb->prev_ref].next_ref = OS_ObjectIndexFromToken(&timecb_token); + OS_timecb_table[timecb->next_ref].prev_ref = OS_ObjectIndexFromToken(&timecb_token); } OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&timebase_token)); @@ -316,7 +316,7 @@ int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *accura *-----------------------------------------------------------------*/ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) { - OS_timecb_internal_record_t *local; + OS_timecb_internal_record_t *timecb; int32 return_code; osal_objtype_t objtype; osal_id_t dedicated_timebase_id; @@ -347,19 +347,19 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &token); if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_timecb_table, token); + timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, token); - OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); + OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); - if ((local->flags & TIMECB_FLAG_DEDICATED_TIMEBASE) != 0) + if ((timecb->flags & TIMECB_FLAG_DEDICATED_TIMEBASE) != 0) { - dedicated_timebase_id = OS_ObjectIdFromToken(&local->timebase_token); + dedicated_timebase_id = OS_ObjectIdFromToken(&timecb->timebase_token); } - local->wait_time = (int32)start_time; - local->interval_time = (int32)interval_time; + timecb->wait_time = (int32)start_time; + timecb->interval_time = (int32)interval_time; - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); OS_ObjectIdRelease(&token); } @@ -394,13 +394,13 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) *-----------------------------------------------------------------*/ int32 OS_TimerDelete(osal_id_t timer_id) { - OS_timecb_internal_record_t * local; int32 return_code; osal_objtype_t objtype; osal_id_t dedicated_timebase_id; - OS_object_token_t token; - OS_timebase_internal_record_t *timebase_local; + OS_object_token_t timecb_token; OS_object_token_t timebase_token; + OS_timebase_internal_record_t *timebase; + OS_timecb_internal_record_t * timecb; dedicated_timebase_id = OS_OBJECT_ID_UNDEFINED; memset(&timebase_token, 0, sizeof(timebase_token)); @@ -415,51 +415,51 @@ int32 OS_TimerDelete(osal_id_t timer_id) return OS_ERR_INCORRECT_OBJ_STATE; } - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &token); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TIMECB, timer_id, &timecb_token); if (return_code == OS_SUCCESS) { - local = OS_OBJECT_TABLE_GET(OS_timecb_table, token); - timebase_local = OS_OBJECT_TABLE_GET(OS_timebase_table, local->timebase_token); + timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, timecb_token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, timecb->timebase_token); - OS_ObjectIdTransferToken(&local->timebase_token, &timebase_token); + OS_ObjectIdTransferToken(&timecb->timebase_token, &timebase_token); - OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); + OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); /* * If the timer uses a dedicated time base, then also delete that. */ - if ((local->flags & TIMECB_FLAG_DEDICATED_TIMEBASE) != 0) + if ((timecb->flags & TIMECB_FLAG_DEDICATED_TIMEBASE) != 0) { - dedicated_timebase_id = OS_ObjectIdFromToken(&local->timebase_token); + dedicated_timebase_id = OS_ObjectIdFromToken(&timecb->timebase_token); } /* * Now we need to remove it from the time base callback ring */ - if (OS_ObjectIdEqual(timebase_local->first_cb, timer_id)) + if (OS_ObjectIdEqual(timebase->first_cb, timer_id)) { - if (local->next_ref != OS_ObjectIndexFromToken(&token)) + if (timecb->next_ref != OS_ObjectIndexFromToken(&timecb_token)) { - OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TIMEBASE, local->next_ref, &timebase_local->first_cb); + OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TIMEBASE, timecb->next_ref, &timebase->first_cb); } else { /* * consider the list empty */ - timebase_local->first_cb = OS_OBJECT_ID_UNDEFINED; + timebase->first_cb = OS_OBJECT_ID_UNDEFINED; } } - OS_timecb_table[local->prev_ref].next_ref = local->next_ref; - OS_timecb_table[local->next_ref].prev_ref = local->prev_ref; - local->next_ref = OS_ObjectIndexFromToken(&token); - local->prev_ref = OS_ObjectIndexFromToken(&token); + OS_timecb_table[timecb->prev_ref].next_ref = timecb->next_ref; + OS_timecb_table[timecb->next_ref].prev_ref = timecb->prev_ref; + timecb->next_ref = OS_ObjectIndexFromToken(&timecb_token); + timecb->prev_ref = OS_ObjectIndexFromToken(&timecb_token); - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&local->timebase_token)); + OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); /* Complete the operation via the common routine */ - return_code = OS_ObjectIdFinalizeDelete(return_code, &token); + return_code = OS_ObjectIdFinalizeDelete(return_code, &timecb_token); } /* From ffb098de6917ecc302b64dbff53d791ea498b58f Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 1 Dec 2020 21:28:58 -0500 Subject: [PATCH 021/111] Fix #648, sanitize array refs on impl layer Pass token objects to impl layers to identify the object to operate on, rather than the index. The token has extra information including the original/actual object ID - which matters if the ID might change as part of the operation (e.g. new/delete). --- src/os/portable/os-impl-bsd-select.c | 24 +-- src/os/portable/os-impl-bsd-sockets.c | 157 ++++++++++-------- src/os/portable/os-impl-console-bsp.c | 5 +- src/os/portable/os-impl-no-loader.c | 6 +- src/os/portable/os-impl-no-shell.c | 2 +- src/os/portable/os-impl-posix-dirs.c | 37 +++-- src/os/portable/os-impl-posix-dl-loader.c | 33 ++-- src/os/portable/os-impl-posix-dl-symtab.c | 10 +- src/os/portable/os-impl-posix-files.c | 16 +- src/os/portable/os-impl-posix-io.c | 59 ++++--- src/os/posix/src/os-impl-binsem.c | 42 +++-- src/os/posix/src/os-impl-console.c | 38 +++-- src/os/posix/src/os-impl-countsem.c | 53 ++++-- src/os/posix/src/os-impl-filesys.c | 27 +-- src/os/posix/src/os-impl-mutex.c | 56 ++++--- src/os/posix/src/os-impl-queues.c | 62 ++++--- src/os/posix/src/os-impl-shell.c | 17 +- src/os/posix/src/os-impl-tasks.c | 57 ++++--- src/os/posix/src/os-impl-timebase.c | 56 ++++--- src/os/rtems/inc/os-impl-io.h | 4 +- src/os/rtems/src/os-impl-binsem.c | 63 ++++--- src/os/rtems/src/os-impl-console.c | 39 +++-- src/os/rtems/src/os-impl-countsem.c | 54 +++--- src/os/rtems/src/os-impl-files.c | 2 +- src/os/rtems/src/os-impl-filesys.c | 49 ++++-- src/os/rtems/src/os-impl-loader.c | 29 ++-- src/os/rtems/src/os-impl-mutex.c | 42 +++-- src/os/rtems/src/os-impl-queues.c | 67 +++++--- src/os/rtems/src/os-impl-tasks.c | 67 +++++--- src/os/rtems/src/os-impl-timebase.c | 75 +++++---- src/os/shared/inc/os-shared-binsem.h | 14 +- src/os/shared/inc/os-shared-countsem.h | 12 +- src/os/shared/inc/os-shared-dir.h | 8 +- src/os/shared/inc/os-shared-file.h | 12 +- src/os/shared/inc/os-shared-filesys.h | 16 +- src/os/shared/inc/os-shared-idmap.h | 4 +- src/os/shared/inc/os-shared-module.h | 8 +- src/os/shared/inc/os-shared-mutex.h | 10 +- src/os/shared/inc/os-shared-printf.h | 6 +- src/os/shared/inc/os-shared-queue.h | 10 +- src/os/shared/inc/os-shared-select.h | 2 +- src/os/shared/inc/os-shared-shell.h | 2 +- src/os/shared/inc/os-shared-sockets.h | 18 +- src/os/shared/inc/os-shared-task.h | 12 +- src/os/shared/inc/os-shared-timebase.h | 12 +- src/os/shared/src/osapi-binsem.c | 14 +- src/os/shared/src/osapi-countsem.c | 12 +- src/os/shared/src/osapi-dir.c | 8 +- src/os/shared/src/osapi-file.c | 11 +- src/os/shared/src/osapi-filesys.c | 30 ++-- src/os/shared/src/osapi-idmap.c | 8 +- src/os/shared/src/osapi-module.c | 8 +- src/os/shared/src/osapi-mutex.c | 10 +- src/os/shared/src/osapi-printf.c | 4 +- src/os/shared/src/osapi-queue.c | 8 +- src/os/shared/src/osapi-select.c | 2 +- src/os/shared/src/osapi-shell.c | 2 +- src/os/shared/src/osapi-sockets.c | 25 +-- src/os/shared/src/osapi-task.c | 10 +- src/os/shared/src/osapi-time.c | 12 +- src/os/shared/src/osapi-timebase.c | 20 +-- src/os/vxworks/inc/os-vxworks.h | 2 +- src/os/vxworks/src/os-impl-binsem.c | 57 +++++-- src/os/vxworks/src/os-impl-console.c | 44 +++-- src/os/vxworks/src/os-impl-countsem.c | 49 ++++-- src/os/vxworks/src/os-impl-dirs.c | 38 +++-- src/os/vxworks/src/os-impl-filesys.c | 48 ++++-- src/os/vxworks/src/os-impl-loader.c | 38 +++-- src/os/vxworks/src/os-impl-mutex.c | 38 +++-- src/os/vxworks/src/os-impl-queues.c | 53 ++++-- src/os/vxworks/src/os-impl-shell.c | 25 +-- src/os/vxworks/src/os-impl-symtab.c | 5 +- src/os/vxworks/src/os-impl-tasks.c | 71 ++++---- src/os/vxworks/src/os-impl-timebase.c | 115 +++++++------ .../portable/src/coveragetest-bsd-select.c | 18 +- .../portable/src/coveragetest-console-bsp.c | 12 +- .../portable/src/coveragetest-posix-files.c | 15 +- .../portable/src/coveragetest-posix-io.c | 49 ++++-- .../shared/src/coveragetest-filesys.c | 33 ++-- .../shared/src/coveragetest-idmap.c | 2 +- .../shared/src/coveragetest-sockets.c | 12 +- .../shared/src/os-shared-coverage-support.c | 1 + .../ut-stubs/src/osapi-binsem-impl-stubs.c | 14 +- .../ut-stubs/src/osapi-console-impl-stubs.c | 4 +- .../ut-stubs/src/osapi-countsem-impl-stubs.c | 12 +- .../ut-stubs/src/osapi-file-impl-stubs.c | 20 +-- .../ut-stubs/src/osapi-filesys-impl-stubs.c | 14 +- .../ut-stubs/src/osapi-loader-impl-stubs.c | 8 +- .../ut-stubs/src/osapi-mutex-impl-stubs.c | 10 +- .../ut-stubs/src/osapi-network-impl-stubs.c | 18 +- .../ut-stubs/src/osapi-queue-impl-stubs.c | 10 +- .../ut-stubs/src/osapi-select-impl-stubs.c | 2 +- .../ut-stubs/src/osapi-task-impl-stubs.c | 14 +- .../ut-stubs/src/osapi-timer-impl-stubs.c | 13 +- .../src/portable-console-bsp-impl-stubs.c | 2 +- .../vxworks/adaptors/inc/ut-adaptor-tasks.h | 2 +- .../adaptors/inc/ut-adaptor-timebase.h | 2 +- .../vxworks/adaptors/src/ut-adaptor-tasks.c | 4 +- .../adaptors/src/ut-adaptor-timebase.c | 4 +- .../vxworks/src/coveragetest-binsem.c | 38 +++-- .../vxworks/src/coveragetest-console.c | 20 ++- .../vxworks/src/coveragetest-countsem.c | 28 +++- .../vxworks/src/coveragetest-dirs.c | 21 ++- .../vxworks/src/coveragetest-filesys.c | 64 ++++--- .../vxworks/src/coveragetest-loader.c | 21 ++- .../vxworks/src/coveragetest-mutex.c | 22 ++- .../vxworks/src/coveragetest-queues.c | 47 +++--- .../vxworks/src/coveragetest-shell.c | 9 +- .../vxworks/src/coveragetest-symtab.c | 11 +- .../vxworks/src/coveragetest-tasks.c | 45 +++-- .../vxworks/src/coveragetest-timebase.c | 46 +++-- .../vxworks/src/os-vxworks-coveragetest.h | 16 ++ 112 files changed, 1727 insertions(+), 1117 deletions(-) diff --git a/src/os/portable/os-impl-bsd-select.c b/src/os/portable/os-impl-bsd-select.c index 29c677f36..afe500527 100644 --- a/src/os/portable/os-impl-bsd-select.c +++ b/src/os/portable/os-impl-bsd-select.c @@ -45,6 +45,7 @@ #include #include "os-impl-select.h" #include "os-shared-select.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -249,17 +250,20 @@ static int32 OS_DoSelect(int maxfd, fd_set *rd_set, fd_set *wr_set, int32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SelectSingle_Impl(osal_index_t stream_id, uint32 *SelectFlags, int32 msecs) +int32 OS_SelectSingle_Impl(const OS_object_token_t *token, uint32 *SelectFlags, int32 msecs) { - int32 return_code; - fd_set wr_set; - fd_set rd_set; + int32 return_code; + fd_set wr_set; + fd_set rd_set; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); /* * If called on a stream_id which does not support this * operation, return immediately and do not invoke the system call */ - if (!OS_impl_filehandle_table[stream_id].selectable) + if (!impl->selectable) { return OS_ERR_OPERATION_NOT_SUPPORTED; } @@ -270,22 +274,22 @@ int32 OS_SelectSingle_Impl(osal_index_t stream_id, uint32 *SelectFlags, int32 ms FD_ZERO(&rd_set); if (*SelectFlags & OS_STREAM_STATE_READABLE) { - FD_SET(OS_impl_filehandle_table[stream_id].fd, &rd_set); + FD_SET(impl->fd, &rd_set); } if (*SelectFlags & OS_STREAM_STATE_WRITABLE) { - FD_SET(OS_impl_filehandle_table[stream_id].fd, &wr_set); + FD_SET(impl->fd, &wr_set); } - return_code = OS_DoSelect(OS_impl_filehandle_table[stream_id].fd, &rd_set, &wr_set, msecs); + return_code = OS_DoSelect(impl->fd, &rd_set, &wr_set, msecs); if (return_code == OS_SUCCESS) { - if (!FD_ISSET(OS_impl_filehandle_table[stream_id].fd, &rd_set)) + if (!FD_ISSET(impl->fd, &rd_set)) { *SelectFlags &= ~OS_STREAM_STATE_READABLE; } - if (!FD_ISSET(OS_impl_filehandle_table[stream_id].fd, &wr_set)) + if (!FD_ISSET(impl->fd, &wr_set)) { *SelectFlags &= ~OS_STREAM_STATE_WRITABLE; } diff --git a/src/os/portable/os-impl-bsd-sockets.c b/src/os/portable/os-impl-bsd-sockets.c index 655dc0287..31ca3e911 100644 --- a/src/os/portable/os-impl-bsd-sockets.c +++ b/src/os/portable/os-impl-bsd-sockets.c @@ -57,6 +57,7 @@ #include "os-shared-file.h" #include "os-shared-select.h" #include "os-shared-sockets.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -84,16 +85,21 @@ typedef union * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketOpen_Impl(osal_index_t sock_id) +int32 OS_SocketOpen_Impl(const OS_object_token_t *token) { - int os_domain; - int os_type; - int os_proto; - int os_flags; + int os_domain; + int os_type; + int os_proto; + int os_flags; + OS_impl_file_internal_record_t *impl; + OS_stream_internal_record_t * stream; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + stream = OS_OBJECT_TABLE_GET(OS_stream_table, *token); os_proto = 0; - switch (OS_stream_table[sock_id].socket_type) + switch (stream->socket_type) { case OS_SocketType_DATAGRAM: os_type = SOCK_DGRAM; @@ -106,7 +112,7 @@ int32 OS_SocketOpen_Impl(osal_index_t sock_id) return OS_ERR_NOT_IMPLEMENTED; } - switch (OS_stream_table[sock_id].socket_domain) + switch (stream->socket_domain) { case OS_SocketDomain_INET: os_domain = AF_INET; @@ -120,11 +126,11 @@ int32 OS_SocketOpen_Impl(osal_index_t sock_id) return OS_ERR_NOT_IMPLEMENTED; } - switch (OS_stream_table[sock_id].socket_domain) + switch (stream->socket_domain) { case OS_SocketDomain_INET: case OS_SocketDomain_INET6: - switch (OS_stream_table[sock_id].socket_type) + switch (stream->socket_type) { case OS_SocketType_DATAGRAM: os_proto = IPPROTO_UDP; @@ -140,8 +146,8 @@ int32 OS_SocketOpen_Impl(osal_index_t sock_id) break; } - OS_impl_filehandle_table[sock_id].fd = socket(os_domain, os_type, os_proto); - if (OS_impl_filehandle_table[sock_id].fd < 0) + impl->fd = socket(os_domain, os_type, os_proto); + if (impl->fd < 0) { return OS_ERROR; } @@ -151,18 +157,18 @@ int32 OS_SocketOpen_Impl(osal_index_t sock_id) * code restarts. However if setting the option fails then it is not worth bailing out over. */ os_flags = 1; - setsockopt(OS_impl_filehandle_table[sock_id].fd, SOL_SOCKET, SO_REUSEADDR, &os_flags, sizeof(os_flags)); + setsockopt(impl->fd, SOL_SOCKET, SO_REUSEADDR, &os_flags, sizeof(os_flags)); /* * Set the standard options on the filehandle by default -- * this may set it to non-blocking mode if the implementation supports it. * any blocking would be done explicitly via the select() wrappers */ - os_flags = fcntl(OS_impl_filehandle_table[sock_id].fd, F_GETFL); + os_flags = fcntl(impl->fd, F_GETFL); os_flags |= OS_IMPL_SOCKET_FLAGS; - fcntl(OS_impl_filehandle_table[sock_id].fd, F_SETFL, os_flags); + fcntl(impl->fd, F_SETFL, os_flags); - OS_impl_filehandle_table[sock_id].selectable = ((os_flags & O_NONBLOCK) != 0); + impl->selectable = ((os_flags & O_NONBLOCK) != 0); return OS_SUCCESS; } /* end OS_SocketOpen_Impl */ @@ -175,11 +181,16 @@ int32 OS_SocketOpen_Impl(osal_index_t sock_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr) +int32 OS_SocketBind_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr) { - int os_result; - socklen_t addrlen; - const struct sockaddr *sa; + int os_result; + socklen_t addrlen; + const struct sockaddr * sa; + OS_impl_file_internal_record_t *impl; + OS_stream_internal_record_t * stream; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + stream = OS_OBJECT_TABLE_GET(OS_stream_table, *token); sa = (const struct sockaddr *)&Addr->AddrData; @@ -203,7 +214,7 @@ int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr) return OS_ERR_BAD_ADDRESS; } - os_result = bind(OS_impl_filehandle_table[sock_id].fd, sa, addrlen); + os_result = bind(impl->fd, sa, addrlen); if (os_result < 0) { OS_DEBUG("bind: %s\n", strerror(errno)); @@ -211,9 +222,9 @@ int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr) } /* Start listening on the socket (implied for stream sockets) */ - if (OS_stream_table[sock_id].socket_type == OS_SocketType_STREAM) + if (stream->socket_type == OS_SocketType_STREAM) { - os_result = listen(OS_impl_filehandle_table[sock_id].fd, 10); + os_result = listen(impl->fd, 10); if (os_result < 0) { OS_DEBUG("listen: %s\n", strerror(errno)); @@ -231,14 +242,17 @@ int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketConnect_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr, int32 timeout) { - int32 return_code; - int os_status; - int sockopt; - socklen_t slen; - uint32 operation; - const struct sockaddr *sa; + int32 return_code; + int os_status; + int sockopt; + socklen_t slen; + uint32 operation; + const struct sockaddr * sa; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); sa = (const struct sockaddr *)&Addr->AddrData; switch (sa->sa_family) @@ -263,7 +277,7 @@ int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int else { return_code = OS_SUCCESS; - os_status = connect(OS_impl_filehandle_table[sock_id].fd, sa, slen); + os_status = connect(impl->fd, sa, slen); if (os_status < 0) { if (errno != EINPROGRESS) @@ -273,9 +287,9 @@ int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int else { operation = OS_STREAM_STATE_WRITABLE; - if (OS_impl_filehandle_table[sock_id].selectable) + if (impl->selectable) { - return_code = OS_SelectSingle_Impl(sock_id, &operation, timeout); + return_code = OS_SelectSingle_Impl(token, &operation, timeout); } if (return_code == OS_SUCCESS) { @@ -285,10 +299,9 @@ int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int } else { - sockopt = 0; - slen = sizeof(sockopt); - os_status = - getsockopt(OS_impl_filehandle_table[sock_id].fd, SOL_SOCKET, SO_ERROR, &sockopt, &slen); + sockopt = 0; + slen = sizeof(sockopt); + os_status = getsockopt(impl->fd, SOL_SOCKET, SO_ERROR, &sockopt, &slen); if (os_status < 0 || sockopt != 0) { return_code = OS_ERROR; @@ -309,17 +322,23 @@ int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketAccept_Impl(const OS_object_token_t *sock_token, const OS_object_token_t *conn_token, + OS_SockAddr_t *Addr, int32 timeout) { - int32 return_code; - uint32 operation; - socklen_t addrlen; - int os_flags; + int32 return_code; + uint32 operation; + socklen_t addrlen; + int os_flags; + OS_impl_file_internal_record_t *sock_impl; + OS_impl_file_internal_record_t *conn_impl; + + sock_impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *sock_token); + conn_impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *conn_token); operation = OS_STREAM_STATE_READABLE; - if (OS_impl_filehandle_table[sock_id].selectable) + if (sock_impl->selectable) { - return_code = OS_SelectSingle_Impl(sock_id, &operation, timeout); + return_code = OS_SelectSingle_Impl(sock_token, &operation, timeout); } else { @@ -334,10 +353,9 @@ int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_So } else { - addrlen = Addr->ActualLength; - OS_impl_filehandle_table[connsock_id].fd = - accept(OS_impl_filehandle_table[sock_id].fd, (struct sockaddr *)&Addr->AddrData, &addrlen); - if (OS_impl_filehandle_table[connsock_id].fd < 0) + addrlen = Addr->ActualLength; + conn_impl->fd = accept(sock_impl->fd, (struct sockaddr *)&Addr->AddrData, &addrlen); + if (conn_impl->fd < 0) { return_code = OS_ERROR; } @@ -350,11 +368,11 @@ int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_So * this may set it to non-blocking mode if the implementation supports it. * any blocking would be done explicitly via the select() wrappers */ - os_flags = fcntl(OS_impl_filehandle_table[connsock_id].fd, F_GETFL); + os_flags = fcntl(conn_impl->fd, F_GETFL); os_flags |= OS_IMPL_SOCKET_FLAGS; - fcntl(OS_impl_filehandle_table[connsock_id].fd, F_SETFL, os_flags); + fcntl(conn_impl->fd, F_SETFL, os_flags); - OS_impl_filehandle_table[connsock_id].selectable = ((os_flags & O_NONBLOCK) != 0); + conn_impl->selectable = ((os_flags & O_NONBLOCK) != 0); } } } @@ -370,15 +388,18 @@ int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_So * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, +int32 OS_SocketRecvFrom_Impl(const OS_object_token_t *token, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) { - int32 return_code; - int os_result; - int waitflags; - uint32 operation; - struct sockaddr *sa; - socklen_t addrlen; + int32 return_code; + int os_result; + int waitflags; + uint32 operation; + struct sockaddr * sa; + socklen_t addrlen; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); if (RemoteAddr == NULL) { @@ -396,10 +417,10 @@ int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, * If "O_NONBLOCK" flag is set then use select() * Note this is the only way to get a correct timeout */ - if (OS_impl_filehandle_table[sock_id].selectable) + if (impl->selectable) { waitflags = MSG_DONTWAIT; - return_code = OS_SelectSingle_Impl(sock_id, &operation, timeout); + return_code = OS_SelectSingle_Impl(token, &operation, timeout); } else { @@ -423,7 +444,7 @@ int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, } else { - os_result = recvfrom(OS_impl_filehandle_table[sock_id].fd, buffer, buflen, waitflags, sa, &addrlen); + os_result = recvfrom(impl->fd, buffer, buflen, waitflags, sa, &addrlen); if (os_result < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) @@ -459,11 +480,15 @@ int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketSendTo_Impl(osal_index_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) +int32 OS_SocketSendTo_Impl(const OS_object_token_t *token, const void *buffer, size_t buflen, + const OS_SockAddr_t *RemoteAddr) { - int os_result; - socklen_t addrlen; - const struct sockaddr *sa; + int os_result; + socklen_t addrlen; + const struct sockaddr * sa; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); sa = (const struct sockaddr *)&RemoteAddr->AddrData; switch (sa->sa_family) @@ -486,7 +511,7 @@ int32 OS_SocketSendTo_Impl(osal_index_t sock_id, const void *buffer, size_t bufl return OS_ERR_BAD_ADDRESS; } - os_result = sendto(OS_impl_filehandle_table[sock_id].fd, buffer, buflen, MSG_DONTWAIT, sa, addrlen); + os_result = sendto(impl->fd, buffer, buflen, MSG_DONTWAIT, sa, addrlen); if (os_result < 0) { OS_DEBUG("sendto: %s\n", strerror(errno)); @@ -504,7 +529,7 @@ int32 OS_SocketSendTo_Impl(osal_index_t sock_id, const void *buffer, size_t bufl * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketGetInfo_Impl(osal_index_t sock_id, OS_socket_prop_t *sock_prop) +int32 OS_SocketGetInfo_Impl(const OS_object_token_t *token, OS_socket_prop_t *sock_prop) { return OS_SUCCESS; } /* end OS_SocketGetInfo_Impl */ diff --git a/src/os/portable/os-impl-console-bsp.c b/src/os/portable/os-impl-console-bsp.c index 815c423d5..fc3d8290b 100644 --- a/src/os/portable/os-impl-console-bsp.c +++ b/src/os/portable/os-impl-console-bsp.c @@ -39,6 +39,7 @@ #include "os-impl-console.h" #include "os-shared-printf.h" +#include "os-shared-idmap.h" /**************************************************************************************** CONSOLE OUTPUT @@ -52,14 +53,14 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleOutput_Impl(osal_index_t local_id) +void OS_ConsoleOutput_Impl(const OS_object_token_t *token) { size_t StartPos; size_t EndPos; size_t WriteSize; OS_console_internal_record_t *console; - console = &OS_console_table[local_id]; + console = OS_OBJECT_TABLE_GET(OS_console_table, *token); StartPos = console->ReadPos; EndPos = console->WritePos; while (StartPos != EndPos) diff --git a/src/os/portable/os-impl-no-loader.c b/src/os/portable/os-impl-no-loader.c index 046fe3419..dbed7b8e8 100644 --- a/src/os/portable/os-impl-no-loader.c +++ b/src/os/portable/os-impl-no-loader.c @@ -38,7 +38,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(const OS_object_token_t *token, const char *translated_path) { return OS_ERR_NOT_IMPLEMENTED; @@ -52,7 +52,7 @@ int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(osal_index_t module_id) +int32 OS_ModuleUnload_Impl(const OS_object_token_t *token) { return OS_ERR_NOT_IMPLEMENTED; @@ -66,7 +66,7 @@ int32 OS_ModuleUnload_Impl(osal_index_t module_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(const OS_object_token_t *token, OS_module_prop_t *module_prop) { return OS_ERR_NOT_IMPLEMENTED; diff --git a/src/os/portable/os-impl-no-shell.c b/src/os/portable/os-impl-no-shell.c index 5f86dc1af..77ca23208 100644 --- a/src/os/portable/os-impl-no-shell.c +++ b/src/os/portable/os-impl-no-shell.c @@ -34,7 +34,7 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) +int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd) { return OS_ERR_NOT_IMPLEMENTED; } diff --git a/src/os/portable/os-impl-posix-dirs.c b/src/os/portable/os-impl-posix-dirs.c index e840ed089..05b246f6d 100644 --- a/src/os/portable/os-impl-posix-dirs.c +++ b/src/os/portable/os-impl-posix-dirs.c @@ -49,6 +49,7 @@ #include "os-impl-dirs.h" #include "os-shared-dir.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -104,14 +105,19 @@ int32 OS_DirCreate_Impl(const char *local_path, uint32 access) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path) +int32 OS_DirOpen_Impl(const OS_object_token_t *token, const char *local_path) { - DIR *dp = opendir(local_path); + DIR * dp = opendir(local_path); + OS_impl_dir_internal_record_t *impl; + if (dp == NULL) { return OS_ERROR; } - OS_impl_dir_table[local_id].dp = dp; + + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); + impl->dp = dp; + return OS_SUCCESS; } /* end OS_DirOpen_Impl */ @@ -123,10 +129,15 @@ int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirClose_Impl(osal_index_t local_id) +int32 OS_DirClose_Impl(const OS_object_token_t *token) { - closedir(OS_impl_dir_table[local_id].dp); - OS_impl_dir_table[local_id].dp = NULL; + OS_impl_dir_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); + + closedir(impl->dp); + impl->dp = NULL; + return OS_SUCCESS; } /* end OS_DirClose_Impl */ @@ -138,9 +149,11 @@ int32 OS_DirClose_Impl(osal_index_t local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) +int32 OS_DirRead_Impl(const OS_object_token_t *token, os_dirent_t *dirent) { - struct dirent *de; + struct dirent * de; + OS_impl_dir_internal_record_t *impl; + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); /* NOTE - the readdir() call is non-reentrant .... * However, this is performed while the global dir table lock is taken. @@ -151,7 +164,7 @@ int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) */ /* cppcheck-suppress readdirCalled */ /* cppcheck-suppress nonreentrantFunctionsreaddir */ - de = readdir(OS_impl_dir_table[local_id].dp); + de = readdir(impl->dp); if (de == NULL) { return OS_ERROR; @@ -171,9 +184,11 @@ int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRewind_Impl(osal_index_t local_id) +int32 OS_DirRewind_Impl(const OS_object_token_t *token) { - rewinddir(OS_impl_dir_table[local_id].dp); + OS_impl_dir_internal_record_t *impl; + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); + rewinddir(impl->dp); return OS_SUCCESS; } /* end OS_DirRewind_Impl */ diff --git a/src/os/portable/os-impl-posix-dl-loader.c b/src/os/portable/os-impl-posix-dl-loader.c index 2a8036dcc..3843d5050 100644 --- a/src/os/portable/os-impl-posix-dl-loader.c +++ b/src/os/portable/os-impl-posix-dl-loader.c @@ -48,6 +48,7 @@ #include "os-impl-loader.h" #include "os-shared-module.h" +#include "os-shared-idmap.h" /**************************************************************************************** Module Loader API @@ -61,10 +62,15 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(const OS_object_token_t *token, const char *translated_path) { - int32 status = OS_ERROR; - int dl_mode; + int32 status = OS_ERROR; + int dl_mode; + OS_impl_module_internal_record_t *impl; + OS_module_internal_record_t * module; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); + module = OS_OBJECT_TABLE_GET(OS_module_table, *token); /* * RTLD_NOW should instruct dlopen() to resolve all the symbols in the @@ -74,7 +80,7 @@ int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) */ dl_mode = RTLD_NOW; - if ((OS_module_table[module_id].flags & OS_MODULE_FLAG_LOCAL_SYMBOLS) != 0) + if ((module->flags & OS_MODULE_FLAG_LOCAL_SYMBOLS) != 0) { /* * Do not add the symbols in this module to the global symbol table. @@ -95,8 +101,8 @@ int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) } dlerror(); - OS_impl_module_table[module_id].dl_handle = dlopen(translated_path, dl_mode); - if (OS_impl_module_table[module_id].dl_handle != NULL) + impl->dl_handle = dlopen(translated_path, dl_mode); + if (impl->dl_handle != NULL) { status = OS_SUCCESS; } @@ -117,18 +123,21 @@ int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(osal_index_t module_id) +int32 OS_ModuleUnload_Impl(const OS_object_token_t *token) { - int32 status = OS_ERROR; + int32 status = OS_ERROR; + OS_impl_module_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); /* ** Attempt to close/unload the module */ dlerror(); - if (dlclose(OS_impl_module_table[module_id].dl_handle) == 0) + if (dlclose(impl->dl_handle) == 0) { - OS_impl_module_table[module_id].dl_handle = NULL; - status = OS_SUCCESS; + impl->dl_handle = NULL; + status = OS_SUCCESS; } else { @@ -147,7 +156,7 @@ int32 OS_ModuleUnload_Impl(osal_index_t module_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(const OS_object_token_t *token, OS_module_prop_t *module_prop) { /* * Limiting strictly to POSIX-defined API means there is no defined diff --git a/src/os/portable/os-impl-posix-dl-symtab.c b/src/os/portable/os-impl-posix-dl-symtab.c index ff78c19d5..629ba8d8e 100644 --- a/src/os/portable/os-impl-posix-dl-symtab.c +++ b/src/os/portable/os-impl-posix-dl-symtab.c @@ -47,6 +47,7 @@ #include "os-impl-loader.h" #include "os-shared-module.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -157,11 +158,14 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup_Impl(osal_index_t local_id, cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_ModuleSymbolLookup_Impl(const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName) { - int32 status; + int32 status; + OS_impl_module_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); - status = OS_GenericSymbolLookup_Impl(OS_impl_module_table[local_id].dl_handle, SymbolAddress, SymbolName); + status = OS_GenericSymbolLookup_Impl(impl->dl_handle, SymbolAddress, SymbolName); return status; diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index ba59fcba0..d46aa2142 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -46,6 +46,7 @@ #include "os-impl-files.h" #include "os-shared-file.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -63,10 +64,13 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileOpen_Impl(osal_index_t local_id, const char *local_path, int32 flags, int32 access) +int32 OS_FileOpen_Impl(const OS_object_token_t *token, const char *local_path, int32 flags, int32 access) { - int os_perm; - int os_mode; + int os_perm; + int os_mode; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); /* ** Check for a valid access mode @@ -100,9 +104,9 @@ int32 OS_FileOpen_Impl(osal_index_t local_id, const char *local_path, int32 flag os_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; - OS_impl_filehandle_table[local_id].fd = open(local_path, os_perm, os_mode); + impl->fd = open(local_path, os_perm, os_mode); - if (OS_impl_filehandle_table[local_id].fd < 0) + if (impl->fd < 0) { OS_DEBUG("open(%s): %s\n", local_path, strerror(errno)); return OS_ERROR; @@ -112,7 +116,7 @@ int32 OS_FileOpen_Impl(osal_index_t local_id, const char *local_path, int32 flag * If the flags included O_NONBLOCK, then * enable the "select" call on this handle. */ - OS_impl_filehandle_table[local_id].selectable = ((os_perm & O_NONBLOCK) != 0); + impl->selectable = ((os_perm & O_NONBLOCK) != 0); return OS_SUCCESS; } /* end OS_FileOpen_Impl */ diff --git a/src/os/portable/os-impl-posix-io.c b/src/os/portable/os-impl-posix-io.c index 429e931b0..cabe43541 100644 --- a/src/os/portable/os-impl-posix-io.c +++ b/src/os/portable/os-impl-posix-io.c @@ -48,6 +48,7 @@ #include "os-impl-io.h" #include "os-shared-file.h" #include "os-shared-select.h" +#include "os-shared-idmap.h" /* some OS libraries (e.g. VxWorks) do not declare the API to be const-correct * It can still use this generic implementation but the call to write() must be @@ -66,11 +67,14 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericClose_Impl(osal_index_t local_id) +int32 OS_GenericClose_Impl(const OS_object_token_t *token) { - int result; + int result; + OS_impl_file_internal_record_t *impl; - result = close(OS_impl_filehandle_table[local_id].fd); + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + + result = close(impl->fd); if (result < 0) { /* @@ -86,7 +90,7 @@ int32 OS_GenericClose_Impl(osal_index_t local_id) */ OS_DEBUG("close: %s\n", strerror(errno)); } - OS_impl_filehandle_table[local_id].fd = -1; + impl->fd = -1; return OS_SUCCESS; } /* end OS_GenericClose_Impl */ @@ -98,11 +102,14 @@ int32 OS_GenericClose_Impl(osal_index_t local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) +int32 OS_GenericSeek_Impl(const OS_object_token_t *token, int32 offset, uint32 whence) { - int where; - off_t os_result; - int32 retval; + int where; + off_t os_result; + int32 retval; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); switch (whence) { @@ -119,7 +126,7 @@ int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) return OS_ERROR; } - os_result = lseek(OS_impl_filehandle_table[local_id].fd, (off_t)offset, where); + os_result = lseek(impl->fd, (off_t)offset, where); if (os_result == (off_t)-1) { if (errno == ESPIPE) @@ -163,11 +170,14 @@ int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, int32 timeout) +int32 OS_GenericRead_Impl(const OS_object_token_t *token, void *buffer, size_t nbytes, int32 timeout) { - int32 return_code; - ssize_t os_result; - uint32 operation; + int32 return_code; + ssize_t os_result; + uint32 operation; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); return_code = OS_SUCCESS; @@ -183,14 +193,14 @@ int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, in * * Note that a timeout will not work unless selectable is true. */ - if (OS_impl_filehandle_table[local_id].selectable) + if (impl->selectable) { - return_code = OS_SelectSingle_Impl(local_id, &operation, timeout); + return_code = OS_SelectSingle_Impl(token, &operation, timeout); } if (return_code == OS_SUCCESS && (operation & OS_STREAM_STATE_READABLE) != 0) { - os_result = read(OS_impl_filehandle_table[local_id].fd, buffer, nbytes); + os_result = read(impl->fd, buffer, nbytes); if (os_result < 0) { OS_DEBUG("read: %s\n", strerror(errno)); @@ -215,11 +225,14 @@ int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, in * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nbytes, int32 timeout) +int32 OS_GenericWrite_Impl(const OS_object_token_t *token, const void *buffer, size_t nbytes, int32 timeout) { - int32 return_code; - ssize_t os_result; - uint32 operation; + int32 return_code; + ssize_t os_result; + uint32 operation; + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); return_code = OS_SUCCESS; @@ -235,16 +248,16 @@ int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nby * * Note that a timeout will not work unless selectable is true. */ - if (OS_impl_filehandle_table[local_id].selectable) + if (impl->selectable) { - return_code = OS_SelectSingle_Impl(local_id, &operation, timeout); + return_code = OS_SelectSingle_Impl(token, &operation, timeout); } if (return_code == OS_SUCCESS && (operation & OS_STREAM_STATE_WRITABLE) != 0) { /* on some system libraries for which the write() argument is not * qualified correctly, it needs to be case to a void* here */ - os_result = write(OS_impl_filehandle_table[local_id].fd, GENERIC_IO_CONST_DATA_CAST buffer, nbytes); + os_result = write(impl->fd, GENERIC_IO_CONST_DATA_CAST buffer, nbytes); if (os_result < 0) { OS_DEBUG("write: %s\n", strerror(errno)); diff --git a/src/os/posix/src/os-impl-binsem.c b/src/os/posix/src/os-impl-binsem.c index 89227a2f4..fe86c4b8a 100644 --- a/src/os/posix/src/os-impl-binsem.c +++ b/src/os/posix/src/os-impl-binsem.c @@ -32,6 +32,7 @@ ***************************************************************************************/ #include "os-posix.h" +#include "os-shared-idmap.h" #include "os-shared-binsem.h" #include "os-impl-binsem.h" @@ -118,7 +119,7 @@ int32 OS_Posix_BinSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 initial_value, uint32 options) +int32 OS_BinSemCreate_Impl(const OS_object_token_t *token, uint32 initial_value, uint32 options) { int ret; int attr_created; @@ -141,7 +142,7 @@ int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 initial_value, uint32 opt attr_created = 0; mutex_created = 0; cond_created = 0; - sem = &OS_impl_bin_sem_table[sem_id]; + sem = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); memset(sem, 0, sizeof(*sem)); do @@ -240,12 +241,12 @@ int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 initial_value, uint32 opt * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(osal_index_t sem_id) +int32 OS_BinSemDelete_Impl(const OS_object_token_t *token) { OS_impl_binsem_internal_record_t *sem; int32 return_code; - sem = &OS_impl_bin_sem_table[sem_id]; + sem = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); if (pthread_cond_destroy(&(sem->cv)) != 0) { @@ -279,11 +280,11 @@ int32 OS_BinSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(osal_index_t sem_id) +int32 OS_BinSemGive_Impl(const OS_object_token_t *token) { OS_impl_binsem_internal_record_t *sem; - sem = &OS_impl_bin_sem_table[sem_id]; + sem = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); /* * Note there is a possibility that another thread is concurrently taking this sem, @@ -324,11 +325,11 @@ int32 OS_BinSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(osal_index_t sem_id) +int32 OS_BinSemFlush_Impl(const OS_object_token_t *token) { OS_impl_binsem_internal_record_t *sem; - sem = &OS_impl_bin_sem_table[sem_id]; + sem = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); /* Lock the mutex ( not the table! ) */ if (OS_Posix_BinSemAcquireMutex(&sem->id) != OS_SUCCESS) @@ -358,10 +359,13 @@ int32 OS_BinSemFlush_Impl(osal_index_t sem_id) becomes nonzero (via SemGive) or the semaphore gets flushed. ---------------------------------------------------------------------------------------*/ -static int32 OS_GenericBinSemTake_Impl(OS_impl_binsem_internal_record_t *sem, const struct timespec *timeout) +static int32 OS_GenericBinSemTake_Impl(const OS_object_token_t *token, const struct timespec *timeout) { - sig_atomic_t flush_count; - int32 return_code; + sig_atomic_t flush_count; + int32 return_code; + OS_impl_binsem_internal_record_t *sem; + + sem = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); /* * Note - this lock should be quickly available - should not delay here. @@ -441,9 +445,9 @@ static int32 OS_GenericBinSemTake_Impl(OS_impl_binsem_internal_record_t *sem, co * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(osal_index_t sem_id) +int32 OS_BinSemTake_Impl(const OS_object_token_t *token) { - return (OS_GenericBinSemTake_Impl(&OS_impl_bin_sem_table[sem_id], NULL)); + return (OS_GenericBinSemTake_Impl(token, NULL)); } /* end OS_BinSemTake_Impl */ /*---------------------------------------------------------------- @@ -454,7 +458,7 @@ int32 OS_BinSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) +int32 OS_BinSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs) { struct timespec ts; @@ -463,7 +467,7 @@ int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) */ OS_Posix_CompAbsDelayTime(msecs, &ts); - return (OS_GenericBinSemTake_Impl(&OS_impl_bin_sem_table[sem_id], &ts)); + return (OS_GenericBinSemTake_Impl(token, &ts)); } /* end OS_BinSemTimedWait_Impl */ /*---------------------------------------------------------------- @@ -474,9 +478,13 @@ int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *sem_prop) +int32 OS_BinSemGetInfo_Impl(const OS_object_token_t *token, OS_bin_sem_prop_t *sem_prop) { + OS_impl_binsem_internal_record_t *sem; + + sem = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); + /* put the info into the stucture */ - sem_prop->value = OS_impl_bin_sem_table[sem_id].current_value; + sem_prop->value = sem->current_value; return OS_SUCCESS; } /* end OS_BinSemGetInfo_Impl */ diff --git a/src/os/posix/src/os-impl-console.c b/src/os/posix/src/os-impl-console.c index be6197a6f..7ba6baa63 100644 --- a/src/os/posix/src/os-impl-console.c +++ b/src/os/posix/src/os-impl-console.c @@ -32,6 +32,7 @@ #include "os-posix.h" #include "os-impl-console.h" +#include "os-shared-idmap.h" #include "os-shared-printf.h" /* @@ -59,9 +60,11 @@ OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(osal_index_t local_id) +void OS_ConsoleWakeup_Impl(const OS_object_token_t *token) { - OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; + OS_impl_console_internal_record_t *local; + + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, *token); if (local->is_async) { @@ -71,7 +74,7 @@ void OS_ConsoleWakeup_Impl(osal_index_t local_id) else { /* output directly */ - OS_ConsoleOutput_Impl(local_id); + OS_ConsoleOutput_Impl(token); } } /* end OS_ConsoleWakeup_Impl */ @@ -87,13 +90,18 @@ static void *OS_ConsoleTask_Entry(void *arg) { OS_U32ValueWrapper_t local_arg; OS_impl_console_internal_record_t *local; + OS_object_token_t token; local_arg.opaque_arg = arg; - local = &OS_impl_console_table[local_arg.idx]; - while (true) + if (OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_CONSOLE, local_arg.id, &token) == OS_SUCCESS) { - OS_ConsoleOutput_Impl(local_arg.idx); - sem_wait(&local->data_sem); + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, token); + while (true) + { + OS_ConsoleOutput_Impl(&token); + sem_wait(&local->data_sem); + } + OS_ObjectIdRelease(&token); } return NULL; } /* end OS_ConsoleTask_Entry */ @@ -106,33 +114,35 @@ static void *OS_ConsoleTask_Entry(void *arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(osal_index_t local_id) +int32 OS_ConsoleCreate_Impl(const OS_object_token_t *token) { - OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; + OS_impl_console_internal_record_t *local; pthread_t consoletask; int32 return_code; OS_U32ValueWrapper_t local_arg = {0}; - if (local_id == 0) + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, *token); + + if (token->obj_idx == 0) { return_code = OS_SUCCESS; local->is_async = OS_CONSOLE_ASYNC; if (local->is_async) { - if (sem_init(&OS_impl_console_table[local_id].data_sem, 0, 0) < 0) + if (sem_init(&local->data_sem, 0, 0) < 0) { return_code = OS_SEM_FAILURE; } else { - local_arg.idx = local_id; - return_code = OS_Posix_InternalTaskCreate_Impl(&consoletask, OS_CONSOLE_TASK_PRIORITY, 0, + local_arg.id = OS_ObjectIdFromToken(token); + return_code = OS_Posix_InternalTaskCreate_Impl(&consoletask, OS_CONSOLE_TASK_PRIORITY, 0, OS_ConsoleTask_Entry, local_arg.opaque_arg); if (return_code != OS_SUCCESS) { - sem_destroy(&OS_impl_console_table[local_id].data_sem); + sem_destroy(&local->data_sem); } } } diff --git a/src/os/posix/src/os-impl-countsem.c b/src/os/posix/src/os-impl-countsem.c index d399e0857..dac78b6ab 100644 --- a/src/os/posix/src/os-impl-countsem.c +++ b/src/os/posix/src/os-impl-countsem.c @@ -32,6 +32,7 @@ #include "os-posix.h" #include "os-impl-countsem.h" #include "os-shared-countsem.h" +#include "os-shared-idmap.h" /* * Added SEM_VALUE_MAX Define @@ -74,14 +75,18 @@ int32 OS_Posix_CountSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_CountSemCreate_Impl(const OS_object_token_t *token, uint32 sem_initial_value, uint32 options) { + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + if (sem_initial_value > SEM_VALUE_MAX) { return OS_INVALID_SEM_VALUE; } - if (sem_init(&OS_impl_count_sem_table[sem_id].id, 0, sem_initial_value) < 0) + if (sem_init(&impl->id, 0, sem_initial_value) < 0) { return OS_SEM_FAILURE; } @@ -98,9 +103,13 @@ int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(osal_index_t sem_id) +int32 OS_CountSemDelete_Impl(const OS_object_token_t *token) { - if (sem_destroy(&OS_impl_count_sem_table[sem_id].id) < 0) + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + + if (sem_destroy(&impl->id) < 0) { return OS_SEM_FAILURE; } @@ -117,9 +126,13 @@ int32 OS_CountSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(osal_index_t sem_id) +int32 OS_CountSemGive_Impl(const OS_object_token_t *token) { - if (sem_post(&OS_impl_count_sem_table[sem_id].id) < 0) + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + + if (sem_post(&impl->id) < 0) { return OS_SEM_FAILURE; } @@ -136,9 +149,13 @@ int32 OS_CountSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(osal_index_t sem_id) +int32 OS_CountSemTake_Impl(const OS_object_token_t *token) { - if (sem_wait(&OS_impl_count_sem_table[sem_id].id) < 0) + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + + if (sem_wait(&impl->id) < 0) { return OS_SEM_FAILURE; } @@ -154,17 +171,20 @@ int32 OS_CountSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) +int32 OS_CountSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs) { - struct timespec ts; - int result; + struct timespec ts; + int result; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); /* ** Compute an absolute time for the delay */ OS_Posix_CompAbsDelayTime(msecs, &ts); - if (sem_timedwait(&OS_impl_count_sem_table[sem_id].id, &ts) == 0) + if (sem_timedwait(&impl->id, &ts) == 0) { result = OS_SUCCESS; } @@ -189,11 +209,14 @@ int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop) +int32 OS_CountSemGetInfo_Impl(const OS_object_token_t *token, OS_count_sem_prop_t *count_prop) { - int sval; + int sval; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); - if (sem_getvalue(&OS_impl_count_sem_table[sem_id].id, &sval) < 0) + if (sem_getvalue(&impl->id, &sval) < 0) { return OS_SEM_FAILURE; } diff --git a/src/os/posix/src/os-impl-filesys.c b/src/os/posix/src/os-impl-filesys.c index 6e71e3321..4213b39ad 100644 --- a/src/os/posix/src/os-impl-filesys.c +++ b/src/os/posix/src/os-impl-filesys.c @@ -44,6 +44,7 @@ #include "os-posix.h" #include "os-shared-filesys.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -82,9 +83,9 @@ int32 OS_Posix_FileSysAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysStartVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; struct stat stat_buf; const char * tmpdir; uint32 i; @@ -97,6 +98,8 @@ int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) VOLATILE_DISK_LOC_MAX }; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + /* * Determine basic type of filesystem, if not already known */ @@ -184,7 +187,7 @@ int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysStopVolume_Impl(const OS_object_token_t *token) { /* * This is a no-op. @@ -207,7 +210,7 @@ int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysFormatVolume_Impl(const OS_object_token_t *token) { /* * In theory, this should wipe any existing files in the ramdisk, @@ -230,11 +233,13 @@ int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysMountVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; struct stat stat_buf; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + /* * This will do a mkdir() for the mount point if it does * not already exist. @@ -282,7 +287,7 @@ int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token) { /* * NOTE: Mounting/Unmounting on POSIX is not implemented. @@ -303,11 +308,13 @@ int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(const OS_object_token_t *token, OS_statvfs_t *result) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; struct statvfs stat_buf; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + if (statvfs(local->system_mountpt, &stat_buf) != 0) { return OS_ERROR; @@ -328,7 +335,7 @@ int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair) +int32 OS_FileSysCheckVolume_Impl(const OS_object_token_t *token, bool repair) { return OS_ERR_NOT_IMPLEMENTED; } /* end OS_FileSysCheckVolume_Impl */ diff --git a/src/os/posix/src/os-impl-mutex.c b/src/os/posix/src/os-impl-mutex.c index 8d6de200a..5a0e43593 100644 --- a/src/os/posix/src/os-impl-mutex.c +++ b/src/os/posix/src/os-impl-mutex.c @@ -31,6 +31,7 @@ #include "os-posix.h" #include "os-shared-mutex.h" +#include "os-shared-idmap.h" #include "os-impl-mutex.h" /* Tables where the OS object information is stored */ @@ -61,10 +62,13 @@ int32 OS_Posix_MutexAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) +int32 OS_MutSemCreate_Impl(const OS_object_token_t *token, uint32 options) { - int return_code; - pthread_mutexattr_t mutex_attr; + int return_code; + pthread_mutexattr_t mutex_attr; + OS_impl_mutex_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); /* ** initialize the attribute with default values @@ -72,8 +76,8 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) return_code = pthread_mutexattr_init(&mutex_attr); if (return_code != 0) { - OS_DEBUG("Error: Mutex could not be created. pthread_mutexattr_init failed ID = %u: %s\n", (unsigned int)sem_id, - strerror(return_code)); + OS_DEBUG("Error: Mutex could not be created. pthread_mutexattr_init failed ID = %lu: %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(return_code)); return OS_SEM_FAILURE; } @@ -83,8 +87,8 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) return_code = pthread_mutexattr_setprotocol(&mutex_attr, PTHREAD_PRIO_INHERIT); if (return_code != 0) { - OS_DEBUG("Error: Mutex could not be created. pthread_mutexattr_setprotocol failed ID = %u: %s\n", - (unsigned int)sem_id, strerror(return_code)); + OS_DEBUG("Error: Mutex could not be created. pthread_mutexattr_setprotocol failed ID = %lu: %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(return_code)); return OS_SEM_FAILURE; } @@ -94,8 +98,8 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) return_code = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); if (return_code != 0) { - OS_DEBUG("Error: Mutex could not be created. pthread_mutexattr_settype failed ID = %u: %s\n", - (unsigned int)sem_id, strerror(return_code)); + OS_DEBUG("Error: Mutex could not be created. pthread_mutexattr_settype failed ID = %lu: %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(return_code)); return OS_SEM_FAILURE; } @@ -103,10 +107,11 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) ** create the mutex ** upon successful initialization, the state of the mutex becomes initialized and unlocked */ - return_code = pthread_mutex_init(&OS_impl_mutex_table[sem_id].id, &mutex_attr); + return_code = pthread_mutex_init(&impl->id, &mutex_attr); if (return_code != 0) { - OS_DEBUG("Error: Mutex could not be created. ID = %u: %s\n", (unsigned int)sem_id, strerror(return_code)); + OS_DEBUG("Error: Mutex could not be created. ID = %lu: %s\n", OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), + strerror(return_code)); return OS_SEM_FAILURE; } @@ -121,11 +126,14 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(osal_index_t sem_id) +int32 OS_MutSemDelete_Impl(const OS_object_token_t *token) { - int status; + int status; + OS_impl_mutex_internal_record_t *impl; - status = pthread_mutex_destroy(&(OS_impl_mutex_table[sem_id].id)); /* 0 = success */ + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); + + status = pthread_mutex_destroy(&(impl->id)); /* 0 = success */ if (status != 0) { @@ -144,14 +152,17 @@ int32 OS_MutSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(osal_index_t sem_id) +int32 OS_MutSemGive_Impl(const OS_object_token_t *token) { - int status; + int status; + OS_impl_mutex_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); /* ** Unlock the mutex */ - status = pthread_mutex_unlock(&(OS_impl_mutex_table[sem_id].id)); + status = pthread_mutex_unlock(&(impl->id)); if (status != 0) { return OS_SEM_FAILURE; @@ -168,14 +179,17 @@ int32 OS_MutSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(osal_index_t sem_id) +int32 OS_MutSemTake_Impl(const OS_object_token_t *token) { - int status; + int status; + OS_impl_mutex_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); /* ** Lock the mutex */ - status = pthread_mutex_lock(&(OS_impl_mutex_table[sem_id].id)); + status = pthread_mutex_lock(&(impl->id)); if (status != 0) { return OS_SEM_FAILURE; @@ -192,7 +206,7 @@ int32 OS_MutSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop) +int32 OS_MutSemGetInfo_Impl(const OS_object_token_t *token, OS_mut_sem_prop_t *mut_prop) { return OS_SUCCESS; diff --git a/src/os/posix/src/os-impl-queues.c b/src/os/posix/src/os-impl-queues.c index 913d0773b..87ce7e935 100644 --- a/src/os/posix/src/os-impl-queues.c +++ b/src/os/posix/src/os-impl-queues.c @@ -81,17 +81,22 @@ int32 OS_Posix_QueueAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) +int32 OS_QueueCreate_Impl(const OS_object_token_t *token, uint32 flags) { - int return_code; - mqd_t queueDesc; - struct mq_attr queueAttr; - char name[OS_MAX_API_NAME * 2]; + int return_code; + mqd_t queueDesc; + struct mq_attr queueAttr; + char name[OS_MAX_API_NAME * 2]; + OS_impl_queue_internal_record_t *impl; + OS_queue_internal_record_t * queue; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); + queue = OS_OBJECT_TABLE_GET(OS_queue_table, *token); /* set queue attributes */ memset(&queueAttr, 0, sizeof(queueAttr)); - queueAttr.mq_maxmsg = OS_queue_table[queue_id].max_depth; - queueAttr.mq_msgsize = OS_queue_table[queue_id].max_size; + queueAttr.mq_maxmsg = queue->max_depth; + queueAttr.mq_msgsize = queue->max_size; /* * The "TruncateQueueDepth" indicates a soft limit to the size of a queue. @@ -107,7 +112,7 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) ** Construct the queue name: ** The name will consist of "/.queue_name" */ - snprintf(name, sizeof(name), "/%d.%s", (int)getpid(), OS_global_queue_table[queue_id].name_entry); + snprintf(name, sizeof(name), "/%d.%s", (int)getpid(), queue->queue_name); /* ** create message queue @@ -128,8 +133,8 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) } else { - OS_impl_queue_table[queue_id].id = queueDesc; - return_code = OS_SUCCESS; + impl->id = queueDesc; + return_code = OS_SUCCESS; /* * Unlink the queue right now -- @@ -159,12 +164,15 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(osal_index_t queue_id) +int32 OS_QueueDelete_Impl(const OS_object_token_t *token) { - int32 return_code; + int32 return_code; + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); /* Try to delete and unlink the queue */ - if (mq_close(OS_impl_queue_table[queue_id].id) != 0) + if (mq_close(impl->id) != 0) { OS_DEBUG("OS_QueueDelete Error during mq_close(). errno = %d (%s)\n", errno, strerror(errno)); return_code = OS_ERROR; @@ -185,11 +193,14 @@ int32 OS_QueueDelete_Impl(osal_index_t queue_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout) +int32 OS_QueueGet_Impl(const OS_object_token_t *token, void *data, size_t size, size_t *size_copied, int32 timeout) { - int32 return_code; - ssize_t sizeCopied; - struct timespec ts; + int32 return_code; + ssize_t sizeCopied; + struct timespec ts; + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); /* ** Read the message queue for data @@ -203,7 +214,7 @@ int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *s */ do { - sizeCopied = mq_receive(OS_impl_queue_table[queue_id].id, data, size, NULL); + sizeCopied = mq_receive(impl->id, data, size, NULL); } while (sizeCopied < 0 && errno == EINTR); } else @@ -232,7 +243,7 @@ int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *s */ do { - sizeCopied = mq_timedreceive(OS_impl_queue_table[queue_id].id, data, size, NULL, &ts); + sizeCopied = mq_timedreceive(impl->id, data, size, NULL, &ts); } while (timeout != OS_CHECK && sizeCopied < 0 && errno == EINTR); } /* END timeout */ @@ -281,11 +292,14 @@ int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *s * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uint32 flags) +int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, size_t size, uint32 flags) { - int32 return_code; - int result; - struct timespec ts; + int32 return_code; + int result; + struct timespec ts; + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); /* * NOTE - using a zero timeout here for the same reason that QueueGet does --- @@ -298,7 +312,7 @@ int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uin /* send message */ do { - result = mq_timedsend(OS_impl_queue_table[queue_id].id, data, size, 1, &ts); + result = mq_timedsend(impl->id, data, size, 1, &ts); } while (result == -1 && errno == EINTR); if (result == 0) diff --git a/src/os/posix/src/os-impl-shell.c b/src/os/posix/src/os-impl-shell.c index e85654380..445ae4d38 100644 --- a/src/os/posix/src/os-impl-shell.c +++ b/src/os/posix/src/os-impl-shell.c @@ -57,12 +57,15 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) +int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd) { - pid_t cpid; - uint32 local_id; - int wstat; - const char *shell = getenv("SHELL"); + pid_t cpid; + uint32 local_id; + int wstat; + const char * shell = getenv("SHELL"); + OS_impl_file_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); if (shell == NULL) { @@ -79,8 +82,8 @@ int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) if (cpid == 0) { /* child process */ - dup2(OS_impl_filehandle_table[file_id].fd, STDOUT_FILENO); - dup2(OS_impl_filehandle_table[file_id].fd, STDERR_FILENO); + dup2(impl->fd, STDOUT_FILENO); + dup2(impl->fd, STDERR_FILENO); /* close all _other_ filehandles */ for (local_id = 0; local_id < OS_MAX_NUM_OPEN_FILES; ++local_id) diff --git a/src/os/posix/src/os-impl-tasks.c b/src/os/posix/src/os-impl-tasks.c index a529264ee..cb94efcc5 100644 --- a/src/os/posix/src/os-impl-tasks.c +++ b/src/os/posix/src/os-impl-tasks.c @@ -564,17 +564,21 @@ int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) +int32 OS_TaskCreate_Impl(const OS_object_token_t *token, uint32 flags) { - OS_U32ValueWrapper_t arg; - int32 return_code; + OS_U32ValueWrapper_t arg; + int32 return_code; + OS_impl_task_internal_record_t *impl; + OS_task_internal_record_t * task; arg.opaque_arg = NULL; - arg.id = OS_global_task_table[task_id].active_id; + arg.id = OS_ObjectIdFromToken(token); + + task = OS_OBJECT_TABLE_GET(OS_task_table, *token); + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); - return_code = - OS_Posix_InternalTaskCreate_Impl(&OS_impl_task_table[task_id].id, OS_task_table[task_id].priority, - OS_task_table[task_id].stack_size, OS_PthreadTaskEntry, arg.opaque_arg); + return_code = OS_Posix_InternalTaskCreate_Impl(&impl->id, task->priority, task->stack_size, OS_PthreadTaskEntry, + arg.opaque_arg); return return_code; } /* end OS_TaskCreate_Impl */ @@ -587,9 +591,13 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(osal_index_t task_id) +int32 OS_TaskMatch_Impl(const OS_object_token_t *token) { - if (pthread_equal(pthread_self(), OS_impl_task_table[task_id].id) == 0) + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + + if (pthread_equal(pthread_self(), impl->id) == 0) { return OS_ERROR; } @@ -605,15 +613,19 @@ int32 OS_TaskMatch_Impl(osal_index_t task_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(osal_index_t task_id) +int32 OS_TaskDelete_Impl(const OS_object_token_t *token) { + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + /* ** Try to delete the task ** If this fails, not much recourse - the only potential cause of failure ** to cancel here is that the thread ID is invalid because it already exited itself, ** and if that is true there is nothing wrong - everything is OK to continue normally. */ - pthread_cancel(OS_impl_task_table[task_id].id); + pthread_cancel(impl->id); return OS_SUCCESS; } /* end OS_TaskDelete_Impl */ @@ -678,11 +690,15 @@ int32 OS_TaskDelay_Impl(uint32 millisecond) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority) +int32 OS_TaskSetPriority_Impl(const OS_object_token_t *token, osal_priority_t new_priority) { int os_priority; int ret; + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + if (POSIX_GlobalVars.EnableTaskPriorities) { /* Change OSAL priority into a priority that will work for this OS */ @@ -691,11 +707,11 @@ int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority /* ** Set priority */ - ret = pthread_setschedprio(OS_impl_task_table[task_id].id, os_priority); + ret = pthread_setschedprio(impl->id, os_priority); if (ret != 0) { - OS_DEBUG("pthread_setschedprio: Task ID = %u, prio = %d, err = %s\n", (unsigned int)task_id, os_priority, - strerror(ret)); + OS_DEBUG("pthread_setschedprio: Task ID = %lu, prio = %d, err = %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), os_priority, strerror(ret)); return (OS_ERROR); } } @@ -758,7 +774,7 @@ osal_id_t OS_TaskGetId_Impl(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop) +int32 OS_TaskGetInfo_Impl(const OS_object_token_t *token, OS_task_prop_t *task_prop) { return OS_SUCCESS; } /* end OS_TaskGetInfo_Impl */ @@ -771,11 +787,14 @@ int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - const pthread_t *target = (const pthread_t *)ref; + const pthread_t * target = (const pthread_t *)ref; + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); - return (pthread_equal(*target, OS_impl_task_table[local_id].id) != 0); + return (pthread_equal(*target, impl->id) != 0); } /*---------------------------------------------------------------- diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index a618435ac..bbd177bc4 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -108,9 +108,13 @@ static void OS_UsecToTimespec(uint32 usecs, struct timespec *time_spec) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(osal_index_t local_id) +void OS_TimeBaseLock_Impl(const OS_object_token_t *token) { - pthread_mutex_lock(&OS_impl_timebase_table[local_id].handler_mutex); + OS_impl_timebase_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + + pthread_mutex_lock(&impl->handler_mutex); } /* end OS_TimeBaseLock_Impl */ /*---------------------------------------------------------------- @@ -121,9 +125,13 @@ void OS_TimeBaseLock_Impl(osal_index_t local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(osal_index_t local_id) +void OS_TimeBaseUnlock_Impl(const OS_object_token_t *token) { - pthread_mutex_unlock(&OS_impl_timebase_table[local_id].handler_mutex); + OS_impl_timebase_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + + pthread_mutex_unlock(&impl->handler_mutex); } /* end OS_TimeBaseUnlock_Impl */ /*---------------------------------------------------------------- @@ -286,8 +294,8 @@ int32 OS_Posix_TimeBaseAPI_Impl_Init(void) * - This is used internally for reporting accuracy, * - TicksPerSecond values over 2M will return zero */ - OS_SharedGlobalVars.MicroSecPerTick = - (1000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / OS_SharedGlobalVars.TicksPerSecond; + OS_SharedGlobalVars.MicroSecPerTick = (1000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / + OS_SharedGlobalVars.TicksPerSecond; } while (0); return (return_code); @@ -314,7 +322,7 @@ static void *OS_TimeBasePthreadEntry(void *arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) +int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) { int32 return_code; int status; @@ -323,11 +331,11 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) struct sigevent evp; struct timespec ts; OS_impl_timebase_internal_record_t *local; - OS_common_record_t * global; + OS_timebase_internal_record_t * timebase; OS_U32ValueWrapper_t arg; - local = &OS_impl_timebase_table[timer_id]; - global = &OS_global_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, *token); /* * Spawn a dedicated time base handler thread @@ -340,7 +348,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * the global table lock. */ arg.opaque_arg = NULL; - arg.id = global->active_id; + arg.id = OS_ObjectIdFromToken(token); return_code = OS_Posix_InternalTaskCreate_Impl(&local->handler_thread, OSAL_PRIORITY_C(0), 0, OS_TimeBasePthreadEntry, arg.opaque_arg); if (return_code != OS_SUCCESS) @@ -360,7 +368,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * If no external sync function is provided then this will set up a POSIX * timer to locally simulate the timer tick using the CPU clock. */ - if (OS_timebase_table[timer_id].external_sync == NULL) + if (timebase->external_sync == NULL) { sigemptyset(&local->sigset); @@ -371,7 +379,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) */ for (idx = 0; idx < OS_MAX_TIMEBASES; ++idx) { - if (idx != timer_id && OS_ObjectIdDefined(OS_global_timebase_table[idx].active_id) && + if (OS_ObjectIdDefined(OS_global_timebase_table[idx].active_id) && OS_impl_timebase_table[idx].assigned_signal != 0) { sigaddset(&local->sigset, OS_impl_timebase_table[idx].assigned_signal); @@ -439,7 +447,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * and doing it this way should still work on a system where sizeof(sival_int) < sizeof(uint32) * (as long as sizeof(sival_int) >= number of bits in OS_OBJECT_INDEX_MASK) */ - evp.sigev_value.sival_int = (int)OS_ObjectIdToSerialNumber_Impl(global->active_id); + evp.sigev_value.sival_int = (int)OS_ObjectIdToSerialNumber_Impl(OS_ObjectIdFromToken(token)); /* ** Create the timer @@ -453,7 +461,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) break; } - OS_timebase_table[timer_id].external_sync = OS_TimeBase_SigWaitImpl; + timebase->external_sync = OS_TimeBase_SigWaitImpl; } while (0); } @@ -480,14 +488,16 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 interval_time) +int32 OS_TimeBaseSet_Impl(const OS_object_token_t *token, uint32 start_time, uint32 interval_time) { OS_impl_timebase_internal_record_t *local; struct itimerspec timeout; int32 return_code; int status; + OS_timebase_internal_record_t * timebase; - local = &OS_impl_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, *token); return_code = OS_SUCCESS; /* There is only something to do here if we are generating a simulated tick */ @@ -514,11 +524,11 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 inter } else if (interval_time > 0) { - OS_timebase_table[timer_id].accuracy_usec = (uint32)((timeout.it_interval.tv_nsec + 999) / 1000); + timebase->accuracy_usec = (uint32)((timeout.it_interval.tv_nsec + 999) / 1000); } else { - OS_timebase_table[timer_id].accuracy_usec = (uint32)((timeout.it_value.tv_nsec + 999) / 1000); + timebase->accuracy_usec = (uint32)((timeout.it_value.tv_nsec + 999) / 1000); } } @@ -534,12 +544,12 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 inter * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) +int32 OS_TimeBaseDelete_Impl(const OS_object_token_t *token) { OS_impl_timebase_internal_record_t *local; int status; - local = &OS_impl_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); pthread_cancel(local->handler_thread); @@ -548,7 +558,7 @@ int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) */ if (local->assigned_signal != 0) { - status = timer_delete(OS_impl_timebase_table[timer_id].host_timerid); + status = timer_delete(local->host_timerid); if (status < 0) { OS_DEBUG("Error deleting timer: %s\n", strerror(errno)); @@ -569,7 +579,7 @@ int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop) +int32 OS_TimeBaseGetInfo_Impl(const OS_object_token_t *token, OS_timebase_prop_t *timer_prop) { return OS_SUCCESS; diff --git a/src/os/rtems/inc/os-impl-io.h b/src/os/rtems/inc/os-impl-io.h index 9fc1893c1..78a9e3ca5 100644 --- a/src/os/rtems/inc/os-impl-io.h +++ b/src/os/rtems/inc/os-impl-io.h @@ -36,7 +36,7 @@ typedef struct { int fd; bool selectable; -} OS_Rtems_filehandle_entry_t; +} OS_impl_file_internal_record_t; /* * The global file handle table. @@ -44,6 +44,6 @@ typedef struct * This table is shared across multiple units (files, sockets, etc) and they will share * the same file handle table from the basic file I/O. */ -extern OS_Rtems_filehandle_entry_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; +extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; #endif /* INCLUDE_OS_IMPL_IO_H_ */ diff --git a/src/os/rtems/src/os-impl-binsem.c b/src/os/rtems/src/os-impl-binsem.c index d3a8933bf..8d15204fa 100644 --- a/src/os/rtems/src/os-impl-binsem.c +++ b/src/os/rtems/src/os-impl-binsem.c @@ -87,17 +87,20 @@ int32 OS_Rtems_BinSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_BinSemCreate_Impl(const OS_object_token_t *token, uint32 sem_initial_value, uint32 options) { - rtems_status_code status; - rtems_name r_name; + rtems_status_code status; + rtems_name r_name; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); /* ** RTEMS task names are 4 byte integers. ** It is convenient to use the OSAL ID in here, as we know it is already unique ** and trying to use the real name would be less than useful (only 4 chars) */ - r_name = OS_ObjectIdToInteger(OS_global_bin_sem_table[sem_id].active_id); + r_name = OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)); /* Check to make sure the sem value is going to be either 0 or 1 */ if (sem_initial_value > 1) @@ -106,8 +109,7 @@ int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 } /* Create RTEMS Semaphore */ - status = rtems_semaphore_create(r_name, sem_initial_value, OSAL_BINARY_SEM_ATTRIBS, 0, - &(OS_impl_bin_sem_table[sem_id].id)); + status = rtems_semaphore_create(r_name, sem_initial_value, OSAL_BINARY_SEM_ATTRIBS, 0, &(impl->id)); /* check if Create failed */ if (status != RTEMS_SUCCESSFUL) @@ -128,11 +130,14 @@ int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(osal_index_t sem_id) +int32 OS_BinSemDelete_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); - status = rtems_semaphore_delete(OS_impl_bin_sem_table[sem_id].id); + status = rtems_semaphore_delete(impl->id); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled semaphore_delete error: %s\n", rtems_status_text(status)); @@ -151,11 +156,14 @@ int32 OS_BinSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(osal_index_t sem_id) +int32 OS_BinSemGive_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); - status = rtems_semaphore_release(OS_impl_bin_sem_table[sem_id].id); + status = rtems_semaphore_release(impl->id); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled semaphore_release error: %s\n", rtems_status_text(status)); @@ -173,12 +181,15 @@ int32 OS_BinSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(osal_index_t sem_id) +int32 OS_BinSemFlush_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); /* Give Semaphore */ - status = rtems_semaphore_flush(OS_impl_bin_sem_table[sem_id].id); + status = rtems_semaphore_flush(impl->id); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled semaphore_flush error: %s\n", rtems_status_text(status)); @@ -197,11 +208,14 @@ int32 OS_BinSemFlush_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(osal_index_t sem_id) +int32 OS_BinSemTake_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); - status = rtems_semaphore_obtain(OS_impl_bin_sem_table[sem_id].id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + status = rtems_semaphore_obtain(impl->id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); /* ** If the semaphore is flushed, this function will return ** RTEMS_UNSATISFIED. If this happens, the OSAL does not want to return @@ -228,17 +242,20 @@ int32 OS_BinSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) +int32 OS_BinSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs) { - rtems_status_code status; - int TimeInTicks; + rtems_status_code status; + int TimeInTicks; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); if (OS_Milli2Ticks(msecs, &TimeInTicks) != OS_SUCCESS) { return OS_ERROR; } - status = rtems_semaphore_obtain(OS_impl_bin_sem_table[sem_id].id, RTEMS_WAIT, TimeInTicks); + status = rtems_semaphore_obtain(impl->id, RTEMS_WAIT, TimeInTicks); if (status == RTEMS_TIMEOUT) { @@ -264,7 +281,7 @@ int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop) +int32 OS_BinSemGetInfo_Impl(const OS_object_token_t *token, OS_bin_sem_prop_t *bin_prop) { /* RTEMS has no API for obtaining the current value of a semaphore */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-console.c b/src/os/rtems/src/os-impl-console.c index 7bad84748..ba0f2534a 100644 --- a/src/os/rtems/src/os-impl-console.c +++ b/src/os/rtems/src/os-impl-console.c @@ -86,9 +86,11 @@ OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(osal_index_t local_id) +void OS_ConsoleWakeup_Impl(const OS_object_token_t *token) { - OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; + OS_impl_console_internal_record_t *local; + + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, *token); if (local->is_async) { @@ -98,7 +100,7 @@ void OS_ConsoleWakeup_Impl(osal_index_t local_id) else { /* output directly */ - OS_ConsoleOutput_Impl(local_id); + OS_ConsoleOutput_Impl(token); } } /* end OS_ConsoleWakeup_Impl */ @@ -111,14 +113,19 @@ void OS_ConsoleWakeup_Impl(osal_index_t local_id) *-----------------------------------------------------------------*/ static void OS_ConsoleTask_Entry(rtems_task_argument arg) { - uint32 local_id = arg; + OS_object_token_t token; OS_impl_console_internal_record_t *local; - local = &OS_impl_console_table[local_id]; - while (true) + if (OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_CONSOLE, OS_ObjectIdFromInteger(arg), &token) == + OS_SUCCESS) { - OS_ConsoleOutput_Impl(local_id); - rtems_semaphore_obtain(local->data_sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, token); + while (true) + { + OS_ConsoleOutput_Impl(&token); + rtems_semaphore_obtain(local->data_sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + } + OS_ObjectIdRelease(&token); } } /* end OS_ConsoleTask_Entry */ @@ -130,15 +137,17 @@ static void OS_ConsoleTask_Entry(rtems_task_argument arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(osal_index_t local_id) +int32 OS_ConsoleCreate_Impl(const OS_object_token_t *token) { - OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; + OS_impl_console_internal_record_t *local; int32 return_code; rtems_name r_name; rtems_id r_task_id; rtems_status_code status; - if (local_id == 0) + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, *token); + + if (OS_ObjectIndexFromToken(token) == 0) { return_code = OS_SUCCESS; local->is_async = OS_CONSOLE_ASYNC; @@ -152,7 +161,7 @@ int32 OS_ConsoleCreate_Impl(osal_index_t local_id) ** It is convenient to use the OSAL ID in here, as we know it is already unique ** and trying to use the real name would be less than useful (only 4 chars) */ - r_name = OS_ObjectIdToInteger(OS_global_console_table[local_id].active_id); + r_name = OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)); status = rtems_semaphore_create(r_name, 0, RTEMS_PRIORITY, 0, &local->data_sem); if (status != RTEMS_SUCCESSFUL) { @@ -175,9 +184,9 @@ int32 OS_ConsoleCreate_Impl(osal_index_t local_id) else { /* will place the task in 'ready for scheduling' state */ - status = rtems_task_start(r_task_id, /*rtems task id*/ - OS_ConsoleTask_Entry, /* task entry point */ - (rtems_task_argument)local_id); /* passed argument */ + status = rtems_task_start(r_task_id, /*rtems task id*/ + OS_ConsoleTask_Entry, /* task entry point */ + (rtems_task_argument)r_name); /* passed argument */ if (status != RTEMS_SUCCESSFUL) { diff --git a/src/os/rtems/src/os-impl-countsem.c b/src/os/rtems/src/os-impl-countsem.c index 11c294918..33b1719b6 100644 --- a/src/os/rtems/src/os-impl-countsem.c +++ b/src/os/rtems/src/os-impl-countsem.c @@ -84,10 +84,13 @@ int32 OS_Rtems_CountSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_CountSemCreate_Impl(const OS_object_token_t *token, uint32 sem_initial_value, uint32 options) { - rtems_status_code status; - rtems_name r_name; + rtems_status_code status; + rtems_name r_name; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); /* ** Verify that the semaphore maximum value is not too high @@ -102,9 +105,8 @@ int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint ** It is convenient to use the OSAL ID in here, as we know it is already unique ** and trying to use the real name would be less than useful (only 4 chars) */ - r_name = OS_ObjectIdToInteger(OS_global_count_sem_table[sem_id].active_id); - status = rtems_semaphore_create(r_name, sem_initial_value, OSAL_COUNT_SEM_ATTRIBS, 0, - &(OS_impl_count_sem_table[sem_id].id)); + r_name = OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)); + status = rtems_semaphore_create(r_name, sem_initial_value, OSAL_COUNT_SEM_ATTRIBS, 0, &(impl->id)); /* check if Create failed */ if (status != RTEMS_SUCCESSFUL) @@ -125,11 +127,14 @@ int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(osal_index_t sem_id) +int32 OS_CountSemDelete_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); - status = rtems_semaphore_delete(OS_impl_count_sem_table[sem_id].id); + status = rtems_semaphore_delete(impl->id); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled semaphore_delete error: %s\n", rtems_status_text(status)); @@ -148,11 +153,14 @@ int32 OS_CountSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(osal_index_t sem_id) +int32 OS_CountSemGive_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); - status = rtems_semaphore_release(OS_impl_count_sem_table[sem_id].id); + status = rtems_semaphore_release(impl->id); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled semaphore_release error: %s\n", rtems_status_text(status)); @@ -171,11 +179,14 @@ int32 OS_CountSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(osal_index_t sem_id) +int32 OS_CountSemTake_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_countsem_internal_record_t *impl; - status = rtems_semaphore_obtain(OS_impl_count_sem_table[sem_id].id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + + status = rtems_semaphore_obtain(impl->id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled semaphore_obtain error: %s\n", rtems_status_text(status)); @@ -194,17 +205,20 @@ int32 OS_CountSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) +int32 OS_CountSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs) { - rtems_status_code status; - int TimeInTicks; + rtems_status_code status; + int TimeInTicks; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); if (OS_Milli2Ticks(msecs, &TimeInTicks) != OS_SUCCESS) { return OS_ERROR; } - status = rtems_semaphore_obtain(OS_impl_count_sem_table[sem_id].id, RTEMS_WAIT, TimeInTicks); + status = rtems_semaphore_obtain(impl->id, RTEMS_WAIT, TimeInTicks); if (status == RTEMS_TIMEOUT) { return OS_SEM_TIMEOUT; @@ -228,7 +242,7 @@ int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop) +int32 OS_CountSemGetInfo_Impl(const OS_object_token_t *token, OS_count_sem_prop_t *count_prop) { /* RTEMS does not provide an API to get the value */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-files.c b/src/os/rtems/src/os-impl-files.c index d82de88fe..48e76807d 100644 --- a/src/os/rtems/src/os-impl-files.c +++ b/src/os/rtems/src/os-impl-files.c @@ -47,7 +47,7 @@ * This is shared by all OSAL entities that perform low-level I/O. */ /* The file/stream table is referenced by multiple entities, i.e. sockets, select, etc */ -OS_Rtems_filehandle_entry_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; +OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; /**************************************************************************************** IMPLEMENTATION-SPECIFIC ROUTINES diff --git a/src/os/rtems/src/os-impl-filesys.c b/src/os/rtems/src/os-impl-filesys.c index 3583303c7..4bdea8453 100644 --- a/src/os/rtems/src/os-impl-filesys.c +++ b/src/os/rtems/src/os-impl-filesys.c @@ -104,13 +104,16 @@ int32 OS_Rtems_FileSysAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysStartVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; - OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; + OS_filesys_internal_record_t * local; + OS_impl_filesys_internal_record_t *impl; rtems_status_code sc; int32 return_code; + impl = OS_OBJECT_TABLE_GET(OS_impl_filesys_table, *token); + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + return_code = OS_ERR_NOT_IMPLEMENTED; memset(impl, 0, sizeof(*impl)); @@ -161,7 +164,7 @@ int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) impl->mount_fstype = RTEMS_FILESYSTEM_TYPE_RFS; impl->mount_options = RTEMS_FILESYSTEM_READ_WRITE; snprintf(impl->blockdev_name, sizeof(impl->blockdev_name), "%s%c", RAMDISK_DEVICE_BASE_NAME, - (int)filesys_id + 'a'); + (int)OS_ObjectIndexFromToken(token) + 'a'); sc = rtems_blkdev_create(impl->blockdev_name, local->blocksize, local->numblocks, ramdisk_ioctl, impl->allocated_disk); @@ -205,9 +208,11 @@ int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysStopVolume_Impl(const OS_object_token_t *token) { - OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; + OS_impl_filesys_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filesys_table, *token); /* * If this was a dynamically allocated disk, then unlink it. @@ -229,14 +234,17 @@ int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysFormatVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; - OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; + OS_filesys_internal_record_t * local; + OS_impl_filesys_internal_record_t *impl; rtems_rfs_format_config config; int32 return_code; int sc; + impl = OS_OBJECT_TABLE_GET(OS_impl_filesys_table, *token); + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + return_code = OS_ERR_NOT_IMPLEMENTED; switch (local->fstype) @@ -291,12 +299,15 @@ int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysMountVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; - OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; + OS_filesys_internal_record_t * local; + OS_impl_filesys_internal_record_t *impl; struct stat stat_buf; + impl = OS_OBJECT_TABLE_GET(OS_impl_filesys_table, *token); + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + /* * This will do a mkdir() for the mount point if it does * not already exist. @@ -345,9 +356,11 @@ int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; + + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); if (local->fstype == OS_FILESYS_TYPE_VOLATILE_DISK || local->fstype == OS_FILESYS_TYPE_NORMAL_DISK) { @@ -373,12 +386,14 @@ int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(const OS_object_token_t *token, OS_statvfs_t *result) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; struct statvfs stat_buf; int32 return_code; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + if (statvfs(local->system_mountpt, &stat_buf) != 0) { /* @@ -415,7 +430,7 @@ int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair) +int32 OS_FileSysCheckVolume_Impl(const OS_object_token_t *token, bool repair) { return OS_ERR_NOT_IMPLEMENTED; } /* end OS_FileSysCheckVolume_Impl */ diff --git a/src/os/rtems/src/os-impl-loader.c b/src/os/rtems/src/os-impl-loader.c index f3f1fb1d8..40278f27e 100644 --- a/src/os/rtems/src/os-impl-loader.c +++ b/src/os/rtems/src/os-impl-loader.c @@ -34,6 +34,7 @@ #include "os-rtems.h" #include "os-impl-loader.h" #include "os-shared-module.h" +#include "os-shared-idmap.h" /**************************************************************************************** GLOBAL DATA @@ -104,11 +105,14 @@ static bool OS_rtems_rtl_check_unresolved(rtems_rtl_unresolv_rec_t *rec, void *d * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(const OS_object_token_t *token, const char *translated_path) { - int32 status = OS_ERROR; - int unresolved; - void *dl_handle; + int32 status = OS_ERROR; + int unresolved; + void * dl_handle; + OS_impl_module_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); dlerror(); dl_handle = dlopen(translated_path, RTLD_NOW | RTLD_GLOBAL); @@ -152,7 +156,7 @@ int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) if (status == OS_SUCCESS) { /* success: save for future use */ - OS_impl_module_table[module_id].dl_handle = dl_handle; + impl->dl_handle = dl_handle; } else if (dl_handle != NULL) { @@ -177,18 +181,21 @@ int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(osal_index_t module_id) +int32 OS_ModuleUnload_Impl(const OS_object_token_t *token) { - int32 status = OS_ERROR; + int32 status = OS_ERROR; + OS_impl_module_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); /* ** Attempt to close/unload the module */ dlerror(); - if (dlclose(OS_impl_module_table[module_id].dl_handle) == 0) + if (dlclose(impl->dl_handle) == 0) { - OS_impl_module_table[module_id].dl_handle = NULL; - status = OS_SUCCESS; + impl->dl_handle = NULL; + status = OS_SUCCESS; } else { @@ -207,7 +214,7 @@ int32 OS_ModuleUnload_Impl(osal_index_t module_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(const OS_object_token_t *token, OS_module_prop_t *module_prop) { /* ** RTEMS does not specify a way to get these values diff --git a/src/os/rtems/src/os-impl-mutex.c b/src/os/rtems/src/os-impl-mutex.c index c02b95665..48874bdcc 100644 --- a/src/os/rtems/src/os-impl-mutex.c +++ b/src/os/rtems/src/os-impl-mutex.c @@ -85,16 +85,19 @@ int32 OS_Rtems_MutexAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) +int32 OS_MutSemCreate_Impl(const OS_object_token_t *token, uint32 options) { - rtems_status_code status; - rtems_name r_name; + rtems_status_code status; + rtems_name r_name; + OS_impl_mutex_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); /* ** Try to create the mutex */ - r_name = OS_ObjectIdToInteger(OS_global_mutex_table[sem_id].active_id); - status = rtems_semaphore_create(r_name, 1, OSAL_MUTEX_ATTRIBS, 0, &OS_impl_mutex_table[sem_id].id); + r_name = OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)); + status = rtems_semaphore_create(r_name, 1, OSAL_MUTEX_ATTRIBS, 0, &impl->id); if (status != RTEMS_SUCCESSFUL) { @@ -114,11 +117,14 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(osal_index_t sem_id) +int32 OS_MutSemDelete_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_mutex_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); - status = rtems_semaphore_delete(OS_impl_mutex_table[sem_id].id); + status = rtems_semaphore_delete(impl->id); if (status != RTEMS_SUCCESSFUL) { /* clean up? */ @@ -138,12 +144,15 @@ int32 OS_MutSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(osal_index_t sem_id) +int32 OS_MutSemGive_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_mutex_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); /* Give the mutex */ - status = rtems_semaphore_release(OS_impl_mutex_table[sem_id].id); + status = rtems_semaphore_release(impl->id); if (status != RTEMS_SUCCESSFUL) { @@ -163,11 +172,14 @@ int32 OS_MutSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(osal_index_t sem_id) +int32 OS_MutSemTake_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_mutex_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); - status = rtems_semaphore_obtain(OS_impl_mutex_table[sem_id].id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + status = rtems_semaphore_obtain(impl->id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (status != RTEMS_SUCCESSFUL) { @@ -187,7 +199,7 @@ int32 OS_MutSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop) +int32 OS_MutSemGetInfo_Impl(const OS_object_token_t *token, OS_mut_sem_prop_t *mut_prop) { /* RTEMS provides no additional info */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-queues.c b/src/os/rtems/src/os-impl-queues.c index f94385f5c..58e978ceb 100644 --- a/src/os/rtems/src/os-impl-queues.c +++ b/src/os/rtems/src/os-impl-queues.c @@ -78,17 +78,22 @@ int32 OS_Rtems_QueueAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) +int32 OS_QueueCreate_Impl(const OS_object_token_t *token, uint32 flags) { - rtems_status_code status; - rtems_name r_name; + rtems_status_code status; + rtems_name r_name; + OS_impl_queue_internal_record_t *impl; + OS_queue_internal_record_t * queue; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); + queue = OS_OBJECT_TABLE_GET(OS_queue_table, *token); /* ** RTEMS task names are 4 byte integers. ** It is convenient to use the OSAL queue ID in here, as we know it is already unique ** and trying to use the real queue name would be less than useful (only 4 chars) */ - r_name = OS_ObjectIdToInteger(OS_global_queue_table[queue_id].active_id); + r_name = OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)); /* ** Create the message queue. @@ -96,12 +101,11 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) ** (RTEMS_FIFO or RTEMS_PRIORITY) is irrelevant since only one task waits ** on each queue. */ - status = rtems_message_queue_create( - r_name, /* 32-bit RTEMS object name; not used */ - OS_queue_table[queue_id].max_depth, /* maximum number of messages in queue (queue depth) */ - OS_queue_table[queue_id].max_size, /* maximum size in bytes of a message */ - RTEMS_FIFO | RTEMS_LOCAL, /* attributes (default) */ - &(OS_impl_queue_table[queue_id].id) /* object ID returned for queue */ + status = rtems_message_queue_create(r_name, /* 32-bit RTEMS object name; not used */ + queue->max_depth, /* maximum number of messages in queue (queue depth) */ + queue->max_size, /* maximum size in bytes of a message */ + RTEMS_FIFO | RTEMS_LOCAL, /* attributes (default) */ + &(impl->id) /* object ID returned for queue */ ); /* @@ -125,12 +129,15 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(osal_index_t queue_id) +int32 OS_QueueDelete_Impl(const OS_object_token_t *token) { - rtems_status_code status; + rtems_status_code status; + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); /* Try to delete the queue */ - status = rtems_message_queue_delete(OS_impl_queue_table[queue_id].id); + status = rtems_message_queue_delete(impl->id); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled queue_delete error: %s\n", rtems_status_text(status)); @@ -149,17 +156,20 @@ int32 OS_QueueDelete_Impl(osal_index_t queue_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) +int32 OS_QueueGet_Impl(const OS_object_token_t *token, void *data, uint32 size, uint32 *size_copied, int32 timeout) { - int32 return_code; - rtems_status_code status; - rtems_interval ticks; - int tick_count; - rtems_option option_set; - size_t rtems_size; - rtems_id rtems_queue_id; + int32 return_code; + rtems_status_code status; + rtems_interval ticks; + int tick_count; + rtems_option option_set; + size_t rtems_size; + rtems_id rtems_queue_id; + OS_impl_queue_internal_record_t *impl; - rtems_queue_id = OS_impl_queue_table[queue_id].id; + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); + + rtems_queue_id = impl->id; /* Get Message From Message Queue */ if (timeout == OS_PEND) @@ -243,12 +253,15 @@ int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, uint32 size, uint32 *s * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, uint32 size, uint32 flags) +int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, uint32 size, uint32 flags) { - rtems_status_code status; - rtems_id rtems_queue_id; + rtems_status_code status; + rtems_id rtems_queue_id; + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); - rtems_queue_id = OS_impl_queue_table[queue_id].id; + rtems_queue_id = impl->id; /* Write the buffer pointer to the queue. If an error occurred, report it ** with the corresponding SB status code. @@ -287,7 +300,7 @@ int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, uint32 size, uin * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGetInfo_Impl(osal_index_t queue_id, OS_queue_prop_t *queue_prop) +int32 OS_QueueGetInfo_Impl(const OS_object_token_t *token, OS_queue_prop_t *queue_prop) { /* No extra info for queues in the OS implementation */ return OS_SUCCESS; diff --git a/src/os/rtems/src/os-impl-tasks.c b/src/os/rtems/src/os-impl-tasks.c index cc278e422..a9db8a73b 100644 --- a/src/os/rtems/src/os-impl-tasks.c +++ b/src/os/rtems/src/os-impl-tasks.c @@ -90,19 +90,24 @@ int32 OS_Rtems_TaskAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) +int32 OS_TaskCreate_Impl(const OS_object_token_t *token, uint32 flags) { - rtems_status_code status; - rtems_name r_name; - rtems_mode r_mode; - rtems_attribute r_attributes; + rtems_status_code status; + rtems_name r_name; + rtems_mode r_mode; + rtems_attribute r_attributes; + OS_impl_task_internal_record_t *impl; + OS_task_internal_record_t * task; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + task = OS_OBJECT_TABLE_GET(OS_task_table, *token); /* ** RTEMS task names are 4 byte integers. ** It is convenient to use the OSAL task ID in here, as we know it is already unique ** and trying to use the real task name would be less than useful (only 4 chars) */ - r_name = OS_ObjectIdToInteger(OS_global_task_table[task_id].active_id); + r_name = OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)); r_mode = RTEMS_PREEMPT | RTEMS_NO_ASR | RTEMS_NO_TIMESLICE | RTEMS_INTERRUPT_LEVEL(0); /* @@ -115,8 +120,7 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) r_attributes |= RTEMS_FLOATING_POINT; } - status = rtems_task_create(r_name, OS_task_table[task_id].priority, OS_task_table[task_id].stack_size, r_mode, - r_attributes, &OS_impl_task_table[task_id].id); + status = rtems_task_create(r_name, task->priority, task->stack_size, r_mode, r_attributes, &impl->id); /* check if task_create failed */ if (status != RTEMS_SUCCESSFUL) @@ -127,15 +131,14 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) } /* will place the task in 'ready for scheduling' state */ - status = rtems_task_start( - OS_impl_task_table[task_id].id, /*rtems task id*/ - (rtems_task_entry)OS_RtemsEntry, /* task entry point */ - (rtems_task_argument)OS_ObjectIdToInteger(OS_global_task_table[task_id].active_id)); /* passed argument */ + status = rtems_task_start(impl->id, /*rtems task id*/ + (rtems_task_entry)OS_RtemsEntry, /* task entry point */ + (rtems_task_argument)r_name); /* passed argument */ if (status != RTEMS_SUCCESSFUL) { OS_printf("rtems_task_start failed: %s\n", rtems_status_text(status)); - rtems_task_delete(OS_impl_task_table[task_id].id); + rtems_task_delete(impl->id); return OS_ERROR; } @@ -151,8 +154,12 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(osal_index_t task_id) +int32 OS_TaskDelete_Impl(const OS_object_token_t *token) { + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + /* ** Try to delete the task ** If this fails, not much recourse - the only potential cause of failure @@ -160,7 +167,7 @@ int32 OS_TaskDelete_Impl(osal_index_t task_id) ** and if that is true there is nothing wrong - everything is OK to continue normally. */ - rtems_task_delete(OS_impl_task_table[task_id].id); + rtems_task_delete(impl->id); return OS_SUCCESS; } /* end OS_TaskDelete_Impl */ @@ -221,13 +228,16 @@ int32 OS_TaskDelay_Impl(uint32 milli_second) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority) +int32 OS_TaskSetPriority_Impl(const OS_object_token_t *token, osal_priority_t new_priority) { - rtems_task_priority old_pri; - rtems_status_code status; + rtems_task_priority old_pri; + rtems_status_code status; + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); /* Set RTEMS Task Priority */ - status = rtems_task_set_priority(OS_impl_task_table[task_id].id, new_priority, &old_pri); + status = rtems_task_set_priority(impl->id, new_priority, &old_pri); if (status != RTEMS_SUCCESSFUL) { OS_DEBUG("Unhandled task_set_priority error: %s\n", rtems_status_text(status)); @@ -246,12 +256,16 @@ int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(osal_index_t task_id) +int32 OS_TaskMatch_Impl(const OS_object_token_t *token) { + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + /* ** Get RTEMS Task Id */ - if (rtems_task_self() != OS_impl_task_table[task_id].id) + if (rtems_task_self() != impl->id) { return (OS_ERROR); } @@ -329,7 +343,7 @@ osal_id_t OS_TaskGetId_Impl(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop) +int32 OS_TaskGetInfo_Impl(const OS_object_token_t *token, OS_task_prop_t *task_prop) { return OS_SUCCESS; @@ -360,9 +374,12 @@ int32 OS_TaskValidateSystemData_Impl(const void *sysdata, uint32 sysdata_size) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - const rtems_id *target = (const rtems_id *)ref; + const rtems_id * target = (const rtems_id *)ref; + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); - return (*target == OS_impl_task_table[local_id].id); + return (*target == impl->id); } diff --git a/src/os/rtems/src/os-impl-timebase.c b/src/os/rtems/src/os-impl-timebase.c index c5c74370c..c4c72a349 100644 --- a/src/os/rtems/src/os-impl-timebase.c +++ b/src/os/rtems/src/os-impl-timebase.c @@ -89,9 +89,13 @@ OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(osal_index_t local_id) +void OS_TimeBaseLock_Impl(const OS_object_token_t *token) { - rtems_semaphore_obtain(OS_impl_timebase_table[local_id].handler_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + OS_impl_timebase_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + + rtems_semaphore_obtain(impl->handler_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); } /* end OS_TimeBaseLock_Impl */ /*---------------------------------------------------------------- @@ -102,9 +106,13 @@ void OS_TimeBaseLock_Impl(osal_index_t local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(osal_index_t local_id) +void OS_TimeBaseUnlock_Impl(const OS_object_token_t *token) { - rtems_semaphore_release(OS_impl_timebase_table[local_id].handler_mutex); + OS_impl_timebase_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + + rtems_semaphore_release(impl->handler_mutex); } /* end OS_TimeBaseUnlock_Impl */ /*---------------------------------------------------------------- @@ -119,14 +127,14 @@ void OS_TimeBaseUnlock_Impl(osal_index_t local_id) static rtems_timer_service_routine OS_TimeBase_ISR(rtems_id rtems_timer_id, void *arg) { OS_U32ValueWrapper_t user_data; - osal_index_t local_id; + OS_object_token_t token; OS_impl_timebase_internal_record_t *local; user_data.opaque_arg = arg; - OS_ConvertToArrayIndex(user_data.id, &local_id); - local = &OS_impl_timebase_table[local_id]; - if (OS_ObjectIdEqual(OS_global_timebase_table[local_id].active_id, user_data.id)) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMEBASE, user_data.id, &token) == OS_SUCCESS) { + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, token); + /* * Reset the timer, but only if an interval was selected */ @@ -219,8 +227,8 @@ int32 OS_Rtems_TimeBaseAPI_Impl_Init(void) * This really should be an exact/whole number result; otherwise this * will round to the nearest nanosecond. */ - RTEMS_GlobalVars.ClockAccuracyNsec = - (1000000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / OS_SharedGlobalVars.TicksPerSecond; + RTEMS_GlobalVars.ClockAccuracyNsec = (1000000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / + OS_SharedGlobalVars.TicksPerSecond; /* * Finally compute the Microseconds per tick @@ -280,22 +288,22 @@ void OS_UsecsToTicks(uint32 usecs, rtems_interval *ticks) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) +int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) { int32 return_code; rtems_status_code rtems_sc; OS_impl_timebase_internal_record_t *local; - OS_common_record_t * global; rtems_name r_name; + OS_timebase_internal_record_t * timebase; return_code = OS_SUCCESS; - local = &OS_impl_timebase_table[timer_id]; - global = &OS_global_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, *token); /* * The RTEMS classic name for dependent resources */ - r_name = OS_ObjectIdToInteger(global->active_id); + r_name = OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)); /* * Set up the necessary OS constructs @@ -306,17 +314,17 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * If no external sync function is provided then this will set up an RTEMS * timer to locally simulate the timer tick using the CPU clock. */ - local->simulate_flag = (OS_timebase_table[timer_id].external_sync == NULL); + local->simulate_flag = (timebase->external_sync == NULL); if (local->simulate_flag) { - OS_timebase_table[timer_id].external_sync = OS_TimeBase_WaitImpl; + timebase->external_sync = OS_TimeBase_WaitImpl; /* * The tick_sem is a simple semaphore posted by the ISR and taken by the * timebase helper task (created later). */ - rtems_sc = - rtems_semaphore_create(r_name, 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, 0, &local->tick_sem); + rtems_sc = rtems_semaphore_create(r_name, 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, 0, + &local->tick_sem); if (rtems_sc != RTEMS_SUCCESSFUL) { OS_DEBUG("Error: Tick Sem could not be created: %d\n", (int)rtems_sc); @@ -376,10 +384,9 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) else { /* will place the task in 'ready for scheduling' state */ - rtems_sc = - rtems_task_start(local->handler_task, /*rtems task id*/ - (rtems_task_entry)OS_TimeBase_CallbackThread, /* task entry point */ - (rtems_task_argument)OS_ObjectIdToInteger(global->active_id)); /* passed argument */ + rtems_sc = rtems_task_start(local->handler_task, /*rtems task id*/ + (rtems_task_entry)OS_TimeBase_CallbackThread, /* task entry point */ + (rtems_task_argument)r_name); /* passed argument */ if (rtems_sc != RTEMS_SUCCESSFUL) { @@ -410,15 +417,17 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 interval_time) +int32 OS_TimeBaseSet_Impl(const OS_object_token_t *token, uint32 start_time, uint32 interval_time) { OS_U32ValueWrapper_t user_data; OS_impl_timebase_internal_record_t *local; int32 return_code; int status; rtems_interval start_ticks; + OS_timebase_internal_record_t * timebase; - local = &OS_impl_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, *token); return_code = OS_SUCCESS; /* There is only something to do here if we are generating a simulated tick */ @@ -458,7 +467,7 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 inter OS_UsecsToTicks(start_time, &start_ticks); user_data.opaque_arg = NULL; - user_data.id = OS_global_timebase_table[timer_id].active_id; + user_data.id = OS_ObjectIdFromToken(token); status = rtems_timer_fire_after(local->rtems_timer_id, start_ticks, OS_TimeBase_ISR, user_data.opaque_arg); if (status != RTEMS_SUCCESSFUL) @@ -475,23 +484,23 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 inter if (local->configured_start_time != start_time) { OS_DEBUG("WARNING: timer %lu start_time requested=%luus, configured=%luus\n", - (unsigned long)timer_id, (unsigned long)start_time, + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), (unsigned long)start_time, (unsigned long)local->configured_start_time); } if (local->configured_interval_time != interval_time) { OS_DEBUG("WARNING: timer %lu interval_time requested=%luus, configured=%luus\n", - (unsigned long)timer_id, (unsigned long)interval_time, + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), (unsigned long)interval_time, (unsigned long)local->configured_interval_time); } if (local->interval_ticks > 0) { - OS_timebase_table[timer_id].accuracy_usec = local->configured_interval_time; + timebase->accuracy_usec = local->configured_interval_time; } else { - OS_timebase_table[timer_id].accuracy_usec = local->configured_start_time; + timebase->accuracy_usec = local->configured_start_time; } } } @@ -512,13 +521,13 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 inter * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) +int32 OS_TimeBaseDelete_Impl(const OS_object_token_t *token) { rtems_status_code rtems_sc; OS_impl_timebase_internal_record_t *local; int32 return_code; - local = &OS_impl_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); return_code = OS_SUCCESS; /* @@ -576,7 +585,7 @@ int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop) +int32 OS_TimeBaseGetInfo_Impl(const OS_object_token_t *token, OS_timebase_prop_t *timer_prop) { return OS_SUCCESS; diff --git a/src/os/shared/inc/os-shared-binsem.h b/src/os/shared/inc/os-shared-binsem.h index f9b743f62..13070731f 100644 --- a/src/os/shared/inc/os-shared-binsem.h +++ b/src/os/shared/inc/os-shared-binsem.h @@ -62,7 +62,7 @@ int32 OS_BinSemAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options); +int32 OS_BinSemCreate_Impl(const OS_object_token_t *token, uint32 sem_initial_value, uint32 options); /*---------------------------------------------------------------- Function: OS_BinSemFlush_Impl @@ -72,7 +72,7 @@ int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(osal_index_t sem_id); +int32 OS_BinSemFlush_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_BinSemGive_Impl @@ -81,7 +81,7 @@ int32 OS_BinSemFlush_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(osal_index_t sem_id); +int32 OS_BinSemGive_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_BinSemTake_Impl @@ -91,7 +91,7 @@ int32 OS_BinSemGive_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(osal_index_t sem_id); +int32 OS_BinSemTake_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_BinSemTimedWait_Impl @@ -101,7 +101,7 @@ int32 OS_BinSemTake_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code OS_SEM_TIMEOUT must be returned if the time limit was reached ------------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs); +int32 OS_BinSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs); /*---------------------------------------------------------------- Function: OS_BinSemDelete_Impl @@ -110,7 +110,7 @@ int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(osal_index_t sem_id); +int32 OS_BinSemDelete_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_BinSemGetInfo_Impl @@ -119,6 +119,6 @@ int32 OS_BinSemDelete_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop); +int32 OS_BinSemGetInfo_Impl(const OS_object_token_t *token, OS_bin_sem_prop_t *bin_prop); #endif /* INCLUDE_OS_SHARED_BINSEM_H_ */ diff --git a/src/os/shared/inc/os-shared-countsem.h b/src/os/shared/inc/os-shared-countsem.h index fc4715d62..08966db51 100644 --- a/src/os/shared/inc/os-shared-countsem.h +++ b/src/os/shared/inc/os-shared-countsem.h @@ -62,7 +62,7 @@ int32 OS_CountSemAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options); +int32 OS_CountSemCreate_Impl(const OS_object_token_t *token, uint32 sem_initial_value, uint32 options); /*---------------------------------------------------------------- Function: OS_CountSemGive_Impl @@ -71,7 +71,7 @@ int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(osal_index_t sem_id); +int32 OS_CountSemGive_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_CountSemTake_Impl @@ -81,7 +81,7 @@ int32 OS_CountSemGive_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(osal_index_t sem_id); +int32 OS_CountSemTake_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_CountSemTimedWait_Impl @@ -91,7 +91,7 @@ int32 OS_CountSemTake_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code OS_SEM_TIMEOUT must be returned if the time limit was reached ------------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs); +int32 OS_CountSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs); /*---------------------------------------------------------------- Function: OS_CountSemDelete_Impl @@ -100,7 +100,7 @@ int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(osal_index_t sem_id); +int32 OS_CountSemDelete_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_CountSemGetInfo_Impl @@ -109,6 +109,6 @@ int32 OS_CountSemDelete_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop); +int32 OS_CountSemGetInfo_Impl(const OS_object_token_t *token, OS_count_sem_prop_t *count_prop); #endif /* INCLUDE_OS_SHARED_COUNTSEM_H_ */ diff --git a/src/os/shared/inc/os-shared-dir.h b/src/os/shared/inc/os-shared-dir.h index e52d682ad..638fac1ad 100644 --- a/src/os/shared/inc/os-shared-dir.h +++ b/src/os/shared/inc/os-shared-dir.h @@ -72,7 +72,7 @@ int32 OS_DirCreate_Impl(const char *local_path, uint32 access); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path); +int32 OS_DirOpen_Impl(const OS_object_token_t *token, const char *local_path); /*---------------------------------------------------------------- Function: OS_DirClose_Impl @@ -81,7 +81,7 @@ int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirClose_Impl(osal_index_t local_id); +int32 OS_DirClose_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_DirRead_Impl @@ -90,7 +90,7 @@ int32 OS_DirClose_Impl(osal_index_t local_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent); +int32 OS_DirRead_Impl(const OS_object_token_t *token, os_dirent_t *dirent); /*---------------------------------------------------------------- Function: OS_DirRewind_Impl @@ -99,7 +99,7 @@ int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_DirRewind_Impl(osal_index_t local_id); +int32 OS_DirRewind_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_DirRemove_Impl diff --git a/src/os/shared/inc/os-shared-file.h b/src/os/shared/inc/os-shared-file.h index 547bde042..32058fa1a 100644 --- a/src/os/shared/inc/os-shared-file.h +++ b/src/os/shared/inc/os-shared-file.h @@ -78,7 +78,7 @@ int32 OS_FileAPI_Init(void); Returns: File position (non-negative) on success, or relevant error code (negative) ------------------------------------------------------------------*/ -int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence); +int32 OS_GenericSeek_Impl(const OS_object_token_t *token, int32 offset, uint32 whence); /*---------------------------------------------------------------- Function: OS_GenericRead_Impl @@ -88,7 +88,7 @@ int32 OS_GenericSeek_Impl(osal_index_t local_id, int32 offset, uint32 whence); Returns: Number of bytes read (non-negative) on success, or relevant error code (negative) ------------------------------------------------------------------*/ -int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, int32 timeout); +int32 OS_GenericRead_Impl(const OS_object_token_t *token, void *buffer, size_t nbytes, int32 timeout); /*---------------------------------------------------------------- Function: OS_GenericWrite_Impl @@ -98,7 +98,7 @@ int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, in Returns: Number of bytes written (non-negative) on success, or relevant error code (negative) ------------------------------------------------------------------*/ -int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nbytes, int32 timeout); +int32 OS_GenericWrite_Impl(const OS_object_token_t *token, const void *buffer, size_t nbytes, int32 timeout); /*---------------------------------------------------------------- Function: OS_GenericClose_Impl @@ -108,7 +108,7 @@ int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nby Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_GenericClose_Impl(osal_index_t local_id); +int32 OS_GenericClose_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_FileOpen_Impl @@ -118,7 +118,7 @@ int32 OS_GenericClose_Impl(osal_index_t local_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileOpen_Impl(osal_index_t local_id, const char *local_path, int32 flags, int32 access); +int32 OS_FileOpen_Impl(const OS_object_token_t *token, const char *local_path, int32 flags, int32 access); /*---------------------------------------------------------------- Function: OS_ShellOutputToFile_Impl @@ -127,7 +127,7 @@ int32 OS_FileOpen_Impl(osal_index_t local_id, const char *local_path, int32 flag Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(osal_index_t stream_id, const char *Cmd); +int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd); /**************************************************************************************** Filename-based Operations diff --git a/src/os/shared/inc/os-shared-filesys.h b/src/os/shared/inc/os-shared-filesys.h index 110a23697..bba3ec767 100644 --- a/src/os/shared/inc/os-shared-filesys.h +++ b/src/os/shared/inc/os-shared-filesys.h @@ -140,7 +140,7 @@ int32 OS_FileSysAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id); +int32 OS_FileSysStartVolume_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_FileSysStopVolume_Impl @@ -149,7 +149,7 @@ int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id); +int32 OS_FileSysStopVolume_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_FileSysFormatVolume_Impl @@ -158,7 +158,7 @@ int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id); +int32 OS_FileSysFormatVolume_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_FileSysCheckVolume_Impl @@ -167,7 +167,7 @@ int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair); +int32 OS_FileSysCheckVolume_Impl(const OS_object_token_t *token, bool repair); /*---------------------------------------------------------------- Function: OS_FileSysStatVolume_Impl @@ -176,7 +176,7 @@ int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result); +int32 OS_FileSysStatVolume_Impl(const OS_object_token_t *token, OS_statvfs_t *result); /*---------------------------------------------------------------- Function: OS_FileSysMountVolume_Impl @@ -185,7 +185,7 @@ int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id); +int32 OS_FileSysMountVolume_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_FileSysUnmountVolume_Impl @@ -194,7 +194,7 @@ int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id); +int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token); /* * Internal helper functions @@ -202,7 +202,7 @@ int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id); * Not normally invoked outside this unit, except for unit testing */ -bool OS_FileSys_FindVirtMountPoint(void *ref, osal_index_t local_id, const OS_common_record_t *obj); +bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, size_t blocksize, osal_blockcount_t numblocks, bool should_format); diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index 1413c30a7..a63d2eea6 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -91,7 +91,7 @@ struct OS_object_token * * Returns true if the id/obj matches the reference, false otherwise. */ -typedef bool (*OS_ObjectMatchFunc_t)(void *ref, osal_index_t local_id, const OS_common_record_t *obj); +typedef bool (*OS_ObjectMatchFunc_t)(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); /* * State object associated with an object iterator @@ -481,7 +481,7 @@ int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal * These are not normally called outside this unit, but need * to be exposed for unit testing. */ -bool OS_ObjectNameMatch(void *ref, osal_index_t local_id, const OS_common_record_t *obj); +bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_object_token_t *token); int32 OS_ObjectIdFindNextFree(OS_object_token_t *token); diff --git a/src/os/shared/inc/os-shared-module.h b/src/os/shared/inc/os-shared-module.h index 4f9284264..6f651b648 100644 --- a/src/os/shared/inc/os-shared-module.h +++ b/src/os/shared/inc/os-shared-module.h @@ -72,7 +72,7 @@ int32 OS_ModuleAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path); +int32 OS_ModuleLoad_Impl(const OS_object_token_t *token, const char *translated_path); /*---------------------------------------------------------------- @@ -82,7 +82,7 @@ int32 OS_ModuleLoad_Impl(osal_index_t module_id, const char *translated_path); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(osal_index_t module_id); +int32 OS_ModuleUnload_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_ModuleGetInfo_Impl @@ -91,7 +91,7 @@ int32 OS_ModuleUnload_Impl(osal_index_t module_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(osal_index_t module_id, OS_module_prop_t *module_prop); +int32 OS_ModuleGetInfo_Impl(const OS_object_token_t *token, OS_module_prop_t *module_prop); /*---------------------------------------------------------------- Function: OS_GlobalSymbolLookup_Impl @@ -111,7 +111,7 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup_Impl(osal_index_t local_id, cpuaddr *SymbolAddress, const char *SymbolName); +int32 OS_ModuleSymbolLookup_Impl(const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName); /*---------------------------------------------------------------- Function: OS_SymbolTableDump_Impl diff --git a/src/os/shared/inc/os-shared-mutex.h b/src/os/shared/inc/os-shared-mutex.h index 576540228..b7703aa66 100644 --- a/src/os/shared/inc/os-shared-mutex.h +++ b/src/os/shared/inc/os-shared-mutex.h @@ -58,7 +58,7 @@ int32 OS_MutexAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options); +int32 OS_MutSemCreate_Impl(const OS_object_token_t *token, uint32 options); /*---------------------------------------------------------------- Function: OS_MutSemGive_Impl @@ -67,7 +67,7 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(osal_index_t sem_id); +int32 OS_MutSemGive_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_MutSemTake_Impl @@ -76,7 +76,7 @@ int32 OS_MutSemGive_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(osal_index_t sem_id); +int32 OS_MutSemTake_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_MutSemDelete_Impl @@ -85,7 +85,7 @@ int32 OS_MutSemTake_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(osal_index_t sem_id); +int32 OS_MutSemDelete_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_MutSemGetInfo_Impl @@ -94,6 +94,6 @@ int32 OS_MutSemDelete_Impl(osal_index_t sem_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop); +int32 OS_MutSemGetInfo_Impl(const OS_object_token_t *token, OS_mut_sem_prop_t *mut_prop); #endif /* INCLUDE_OS_SHARED_MUTEX_H_ */ diff --git a/src/os/shared/inc/os-shared-printf.h b/src/os/shared/inc/os-shared-printf.h index 165dd3dec..6bc2b6b48 100644 --- a/src/os/shared/inc/os-shared-printf.h +++ b/src/os/shared/inc/os-shared-printf.h @@ -73,7 +73,7 @@ int32 OS_ConsoleAPI_Init(void); Purpose: Prepare a console device for use For Async devices, this sets up the background writer task ------------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(osal_index_t local_id); +int32 OS_ConsoleCreate_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_ConsoleOutput_Impl @@ -85,7 +85,7 @@ int32 OS_ConsoleCreate_Impl(osal_index_t local_id); The data is already formatted, this just writes the characters. ------------------------------------------------------------------*/ -void OS_ConsoleOutput_Impl(osal_index_t local_id); +void OS_ConsoleOutput_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_ConsoleOutput_Impl @@ -100,6 +100,6 @@ void OS_ConsoleOutput_Impl(osal_index_t local_id); service, this should wakeup the actual console servicing thread. ------------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(osal_index_t local_id); +void OS_ConsoleWakeup_Impl(const OS_object_token_t *token); #endif /* INCLUDE_OS_SHARED_PRINTF_H_ */ diff --git a/src/os/shared/inc/os-shared-queue.h b/src/os/shared/inc/os-shared-queue.h index 752c61f89..03b5c309d 100644 --- a/src/os/shared/inc/os-shared-queue.h +++ b/src/os/shared/inc/os-shared-queue.h @@ -63,7 +63,7 @@ int32 OS_QueueAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags); +int32 OS_QueueCreate_Impl(const OS_object_token_t *token, uint32 flags); /*---------------------------------------------------------------- Function: OS_QueueDelete_Impl @@ -72,7 +72,7 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(osal_index_t queue_id); +int32 OS_QueueDelete_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_QueueGet_Impl @@ -85,7 +85,7 @@ int32 OS_QueueDelete_Impl(osal_index_t queue_id); OS_QUEUE_EMPTY must be returned if the queue is empty when polled (OS_CHECK) OS_QUEUE_INVALID_SIZE must be returned if the supplied buffer is too small ------------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout); +int32 OS_QueueGet_Impl(const OS_object_token_t *token, void *data, size_t size, size_t *size_copied, int32 timeout); /*---------------------------------------------------------------- Function: OS_QueuePut_Impl @@ -95,7 +95,7 @@ int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *s Returns: OS_SUCCESS on success, or relevant error code OS_QUEUE_FULL must be returned if the queue is full. ------------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uint32 flags); +int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, size_t size, uint32 flags); /*---------------------------------------------------------------- Function: OS_QueueGetInfo_Impl @@ -104,6 +104,6 @@ int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uin Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_QueueGetInfo_Impl(osal_index_t queue_id, OS_queue_prop_t *queue_prop); +int32 OS_QueueGetInfo_Impl(const OS_object_token_t *token, OS_queue_prop_t *queue_prop); #endif /* INCLUDE_OS_SHARED_QUEUE_H_ */ diff --git a/src/os/shared/inc/os-shared-select.h b/src/os/shared/inc/os-shared-select.h index a1d7e9c85..66cf33f3c 100644 --- a/src/os/shared/inc/os-shared-select.h +++ b/src/os/shared/inc/os-shared-select.h @@ -50,7 +50,7 @@ Returns: OS_SUCCESS on success, or relevant error code OS_ERR_OPERATION_NOT_SUPPORTED if the specified file handle does not support select ------------------------------------------------------------------*/ -int32 OS_SelectSingle_Impl(osal_index_t stream_id, uint32 *SelectFlags, int32 msecs); +int32 OS_SelectSingle_Impl(const OS_object_token_t *token, uint32 *SelectFlags, int32 msecs); /*---------------------------------------------------------------- diff --git a/src/os/shared/inc/os-shared-shell.h b/src/os/shared/inc/os-shared-shell.h index a26044648..1b896ee8f 100644 --- a/src/os/shared/inc/os-shared-shell.h +++ b/src/os/shared/inc/os-shared-shell.h @@ -41,6 +41,6 @@ Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(osal_index_t stream_id, const char *Cmd); +int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd); #endif /* INCLUDE_OS_SHARED_SHELL_H_ */ diff --git a/src/os/shared/inc/os-shared-sockets.h b/src/os/shared/inc/os-shared-sockets.h index 8bd9fcfb6..12a9cc7b9 100644 --- a/src/os/shared/inc/os-shared-sockets.h +++ b/src/os/shared/inc/os-shared-sockets.h @@ -50,7 +50,7 @@ int32 OS_SocketAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketOpen_Impl(osal_index_t sock_id); +int32 OS_SocketOpen_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_SocketBind_Impl @@ -59,7 +59,7 @@ int32 OS_SocketOpen_Impl(osal_index_t sock_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr); +int32 OS_SocketBind_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr); /*---------------------------------------------------------------- Function: OS_SocketAccept_Impl @@ -70,7 +70,8 @@ int32 OS_SocketBind_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_SockAddr_t *Addr, int32 timeout); +int32 OS_SocketAccept_Impl(const OS_object_token_t *sock_token, const OS_object_token_t *conn_token, + OS_SockAddr_t *Addr, int32 timeout); /*---------------------------------------------------------------- Function: OS_SocketConnect_Impl @@ -80,7 +81,7 @@ int32 OS_SocketAccept_Impl(osal_index_t sock_id, osal_index_t connsock_id, OS_So Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int32 timeout); +int32 OS_SocketConnect_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr, int32 timeout); /*---------------------------------------------------------------- Function: OS_SocketRecvFrom_Impl @@ -93,7 +94,7 @@ int32 OS_SocketConnect_Impl(osal_index_t sock_id, const OS_SockAddr_t *Addr, int Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, +int32 OS_SocketRecvFrom_Impl(const OS_object_token_t *token, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout); /*---------------------------------------------------------------- @@ -105,7 +106,8 @@ int32 OS_SocketRecvFrom_Impl(osal_index_t sock_id, void *buffer, size_t buflen, Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketSendTo_Impl(osal_index_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr); +int32 OS_SocketSendTo_Impl(const OS_object_token_t *token, const void *buffer, size_t buflen, + const OS_SockAddr_t *RemoteAddr); /*---------------------------------------------------------------- @@ -115,7 +117,7 @@ int32 OS_SocketSendTo_Impl(osal_index_t sock_id, const void *buffer, size_t bufl Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_SocketGetInfo_Impl(osal_index_t sock_id, OS_socket_prop_t *sock_prop); +int32 OS_SocketGetInfo_Impl(const OS_object_token_t *token, OS_socket_prop_t *sock_prop); /*---------------------------------------------------------------- @@ -175,6 +177,6 @@ int32 OS_SocketAddrSetPort_Impl(OS_SockAddr_t *Addr, uint16 PortNum); * Internal helper functions * Not normally called outside the local unit, except during unit test */ -void OS_CreateSocketName(osal_index_t local_id, const OS_SockAddr_t *Addr, const char *parent_name); +void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Addr, const char *parent_name); #endif /* INCLUDE_OS_SHARED_SOCKETS_H_ */ diff --git a/src/os/shared/inc/os-shared-task.h b/src/os/shared/inc/os-shared-task.h index 74ba5386a..03fc11fe7 100644 --- a/src/os/shared/inc/os-shared-task.h +++ b/src/os/shared/inc/os-shared-task.h @@ -81,7 +81,7 @@ void OS_TaskEntryPoint(osal_id_t global_task_id); Returns: OS_SUCCESS on match, any other code on non-match ------------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(osal_index_t task_id); +int32 OS_TaskMatch_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- @@ -92,7 +92,7 @@ int32 OS_TaskMatch_Impl(osal_index_t task_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags); +int32 OS_TaskCreate_Impl(const OS_object_token_t *token, uint32 flags); /*---------------------------------------------------------------- Function: OS_TaskDelete_Impl @@ -101,7 +101,7 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(osal_index_t task_id); +int32 OS_TaskDelete_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_TaskExit_Impl @@ -128,7 +128,7 @@ int32 OS_TaskDelay_Impl(uint32 millisecond); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority); +int32 OS_TaskSetPriority_Impl(const OS_object_token_t *token, osal_priority_t new_priority); /*---------------------------------------------------------------- Function: OS_TaskGetId_Impl @@ -146,7 +146,7 @@ osal_id_t OS_TaskGetId_Impl(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop); +int32 OS_TaskGetInfo_Impl(const OS_object_token_t *token, OS_task_prop_t *task_prop); /*---------------------------------------------------------------- @@ -169,7 +169,7 @@ int32 OS_TaskRegister_Impl(osal_id_t global_task_id); Compatible with the "OS_ObjectIdFindBySearch" routine ------------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj); +bool OS_TaskIdMatchSystemData_Impl(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); /*---------------------------------------------------------------- diff --git a/src/os/shared/inc/os-shared-timebase.h b/src/os/shared/inc/os-shared-timebase.h index 9b8c9fe57..3e06d4f18 100644 --- a/src/os/shared/inc/os-shared-timebase.h +++ b/src/os/shared/inc/os-shared-timebase.h @@ -73,7 +73,7 @@ int32 OS_TimeBaseAPI_Init(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(osal_index_t timebase_id); +int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_TimeBaseSet_Impl @@ -82,7 +82,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timebase_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timebase_id, uint32 start_time, uint32 interval_time); +int32 OS_TimeBaseSet_Impl(const OS_object_token_t *token, uint32 start_time, uint32 interval_time); /*---------------------------------------------------------------- Function: OS_TimeBaseDelete_Impl @@ -91,7 +91,7 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timebase_id, uint32 start_time, uint32 in Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(osal_index_t timebase_id); +int32 OS_TimeBaseDelete_Impl(const OS_object_token_t *token); /**************************************************************************************** INTERNAL FUNCTIONS @@ -103,7 +103,7 @@ int32 OS_TimeBaseDelete_Impl(osal_index_t timebase_id); Purpose: Get exclusive access to the given timebase Add/remove of application callbacks is prevented ------------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(osal_index_t timebase_id); +void OS_TimeBaseLock_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_TimeBaseLock_Impl @@ -111,7 +111,7 @@ void OS_TimeBaseLock_Impl(osal_index_t timebase_id); Purpose: Release exclusive access to the given timebase Add/remove of application callbacks is allowed ------------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(osal_index_t timebase_id); +void OS_TimeBaseUnlock_Impl(const OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_TimeBaseGetInfo_Impl @@ -120,7 +120,7 @@ void OS_TimeBaseUnlock_Impl(osal_index_t timebase_id); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop); +int32 OS_TimeBaseGetInfo_Impl(const OS_object_token_t *token, OS_timebase_prop_t *timer_prop); /*---------------------------------------------------------------- Function: OS_TimeBase_CallbackThread diff --git a/src/os/shared/src/osapi-binsem.c b/src/os/shared/src/osapi-binsem.c index d46bfee21..8fbe7ec20 100644 --- a/src/os/shared/src/osapi-binsem.c +++ b/src/os/shared/src/osapi-binsem.c @@ -121,7 +121,7 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia OS_OBJECT_INIT(token, binsem, obj_name, sem_name); /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_BinSemCreate_Impl(OS_ObjectIndexFromToken(&token), sem_initial_value, options); + return_code = OS_BinSemCreate_Impl(&token, sem_initial_value, options); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, sem_id); @@ -147,7 +147,7 @@ int32 OS_BinSemDelete(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemDelete_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_BinSemDelete_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -174,7 +174,7 @@ int32 OS_BinSemGive(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemGive_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_BinSemGive_Impl(&token); } return return_code; @@ -198,7 +198,7 @@ int32 OS_BinSemFlush(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemFlush_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_BinSemFlush_Impl(&token); } return return_code; @@ -221,7 +221,7 @@ int32 OS_BinSemTake(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemTake_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_BinSemTake_Impl(&token); } return return_code; @@ -244,7 +244,7 @@ int32 OS_BinSemTimedWait(osal_id_t sem_id, uint32 msecs) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_BinSemTimedWait_Impl(OS_ObjectIndexFromToken(&token), msecs); + return_code = OS_BinSemTimedWait_Impl(&token, msecs); } return return_code; @@ -302,7 +302,7 @@ int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) strncpy(bin_prop->name, record->name_entry, OS_MAX_API_NAME - 1); bin_prop->creator = record->creator; - return_code = OS_BinSemGetInfo_Impl(OS_ObjectIndexFromToken(&token), bin_prop); + return_code = OS_BinSemGetInfo_Impl(&token, bin_prop); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-countsem.c b/src/os/shared/src/osapi-countsem.c index a47988841..a73f55843 100644 --- a/src/os/shared/src/osapi-countsem.c +++ b/src/os/shared/src/osapi-countsem.c @@ -113,7 +113,7 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init OS_OBJECT_INIT(token, countsem, obj_name, sem_name); /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_CountSemCreate_Impl(OS_ObjectIndexFromToken(&token), sem_initial_value, options); + return_code = OS_CountSemCreate_Impl(&token, sem_initial_value, options); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, sem_id); @@ -139,7 +139,7 @@ int32 OS_CountSemDelete(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemDelete_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_CountSemDelete_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -166,7 +166,7 @@ int32 OS_CountSemGive(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemGive_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_CountSemGive_Impl(&token); } return return_code; @@ -190,7 +190,7 @@ int32 OS_CountSemTake(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemTake_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_CountSemTake_Impl(&token); } return return_code; @@ -213,7 +213,7 @@ int32 OS_CountSemTimedWait(osal_id_t sem_id, uint32 msecs) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_CountSemTimedWait_Impl(OS_ObjectIndexFromToken(&token), msecs); + return_code = OS_CountSemTimedWait_Impl(&token, msecs); } return return_code; @@ -272,7 +272,7 @@ int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) strncpy(count_prop->name, record->name_entry, OS_MAX_API_NAME - 1); count_prop->creator = record->creator; - return_code = OS_CountSemGetInfo_Impl(OS_ObjectIndexFromToken(&token), count_prop); + return_code = OS_CountSemGetInfo_Impl(&token, count_prop); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-dir.c b/src/os/shared/src/osapi-dir.c index 7f9ac053b..0c82b98a6 100644 --- a/src/os/shared/src/osapi-dir.c +++ b/src/os/shared/src/osapi-dir.c @@ -134,7 +134,7 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) OS_OBJECT_INIT(token, dir, dir_name, path); /* Now call the OS-specific implementation. */ - return_code = OS_DirOpen_Impl(OS_ObjectIndexFromToken(&token), local_path); + return_code = OS_DirOpen_Impl(&token, local_path); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, dir_id); @@ -161,7 +161,7 @@ int32 OS_DirectoryClose(osal_id_t dir_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, dir_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_DirClose_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_DirClose_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -202,7 +202,7 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) * reads the "/" directory, the application will see the * real name (eeprom) and not the virtualized name (cf). */ - return_code = OS_DirRead_Impl(OS_ObjectIndexFromToken(&token), dirent); + return_code = OS_DirRead_Impl(&token, dirent); OS_ObjectIdRelease(&token); } @@ -228,7 +228,7 @@ int32 OS_DirectoryRewind(osal_id_t dir_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, dir_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_DirRewind_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_DirRewind_Impl(&token); } return return_code; diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 1dc99247a..2b045375b 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -124,7 +124,7 @@ int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 acc OS_OBJECT_INIT(token, stream, stream_name, path); /* Now call the OS-specific implementation. */ - return_code = OS_FileOpen_Impl(OS_ObjectIndexFromToken(&token), local_path, flags, access); + return_code = OS_FileOpen_Impl(&token, local_path, flags, access); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, filedes); @@ -234,7 +234,7 @@ int32 OS_close(osal_id_t filedes) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericClose_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_GenericClose_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -266,7 +266,8 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericRead_Impl(OS_ObjectIndexFromToken(&token), buffer, nbytes, timeout); + return_code = OS_GenericRead_Impl(&token, buffer, nbytes, timeout); + OS_ObjectIdRelease(&token); } @@ -295,7 +296,7 @@ int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericWrite_Impl(OS_ObjectIndexFromToken(&token), buffer, nbytes, timeout); + return_code = OS_GenericWrite_Impl(&token, buffer, nbytes, timeout); OS_ObjectIdRelease(&token); } @@ -397,7 +398,7 @@ int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_GenericSeek_Impl(OS_ObjectIndexFromToken(&token), offset, whence); + return_code = OS_GenericSeek_Impl(&token, offset, whence); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index d791c7d05..3c51d646e 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -74,12 +74,14 @@ const char OS_FILESYS_RAMDISK_VOLNAME_PREFIX[] = "RAM"; * Returns: true if the entry matches, false if it does not match * *-----------------------------------------------------------------*/ -bool OS_FileSys_FindVirtMountPoint(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - OS_filesys_internal_record_t *filesys = &OS_filesys_table[local_id]; - const char * target = (const char *)ref; + OS_filesys_internal_record_t *filesys; + const char * target = (const char *)ref; size_t mplen; + filesys = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + if ((filesys->flags & OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL) == 0) { return false; @@ -157,7 +159,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs filesys->fstype = OS_FILESYS_TYPE_VOLATILE_DISK; } - return_code = OS_FileSysStartVolume_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_FileSysStartVolume_Impl(&token); if (return_code == OS_SUCCESS) { @@ -167,7 +169,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs */ if (should_format) { - return_code = OS_FileSysFormatVolume_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_FileSysFormatVolume_Impl(&token); } if (return_code == OS_SUCCESS) @@ -182,7 +184,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs * Cast to void to repress analysis warnings for * ignored return value. */ - (void)OS_FileSysStopVolume_Impl(OS_ObjectIndexFromToken(&token)); + (void)OS_FileSysStopVolume_Impl(&token); } } @@ -282,12 +284,12 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const * The "mount" implementation is required as it will * create the mountpoint if it does not already exist */ - return_code = OS_FileSysStartVolume_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_FileSysStartVolume_Impl(&token); if (return_code == OS_SUCCESS) { filesys->flags |= OS_FILESYS_FLAG_IS_READY; - return_code = OS_FileSysMountVolume_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_FileSysMountVolume_Impl(&token); } if (return_code == OS_SUCCESS) @@ -369,7 +371,7 @@ int32 OS_rmfs(const char *devname) * the filesystem is unmounted first, but this would break * compatibility with the existing unit tests. */ - return_code = OS_FileSysStopVolume_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_FileSysStopVolume_Impl(&token); /* Free the entry in the master table */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -463,7 +465,7 @@ int32 OS_mount(const char *devname, const char *mountpoint) } else { - return_code = OS_FileSysMountVolume_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_FileSysMountVolume_Impl(&token); } if (return_code == OS_SUCCESS) @@ -533,7 +535,7 @@ int32 OS_unmount(const char *mountpoint) } else { - return_code = OS_FileSysUnmountVolume_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_FileSysUnmountVolume_Impl(&token); } if (return_code == OS_SUCCESS) @@ -583,7 +585,7 @@ int32 OS_fsBlocksFree(const char *name) if (return_code == OS_SUCCESS) { - return_code = OS_FileSysStatVolume_Impl(OS_ObjectIndexFromToken(&token), &statfs); + return_code = OS_FileSysStatVolume_Impl(&token, &statfs); OS_ObjectIdRelease(&token); @@ -631,7 +633,7 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) if (return_code == OS_SUCCESS) { - return_code = OS_FileSysStatVolume_Impl(OS_ObjectIndexFromToken(&token), &statfs); + return_code = OS_FileSysStatVolume_Impl(&token, &statfs); OS_ObjectIdRelease(&token); @@ -685,7 +687,7 @@ int32 OS_chkfs(const char *name, bool repair) if (return_code == OS_SUCCESS) { - return_code = OS_FileSysCheckVolume_Impl(OS_ObjectIndexFromToken(&token), repair); + return_code = OS_FileSysCheckVolume_Impl(&token, repair); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 44fee7580..0ccaf16f0 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -240,7 +240,7 @@ OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) * returns: true if match, false otherwise * *-----------------------------------------------------------------*/ -bool OS_ObjectNameMatch(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { return (obj->name_entry != NULL && strcmp((const char *)ref, obj->name_entry) == 0); } /* end OS_ObjectNameMatch */ @@ -504,7 +504,7 @@ int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_obj record = OS_OBJECT_TABLE_GET(base, *token); - if (OS_ObjectIdDefined(record->active_id) && MatchFunc(arg, token->obj_idx, record)) + if (OS_ObjectIdDefined(record->active_id) && MatchFunc(arg, token, record)) { return_code = OS_SUCCESS; token->obj_id = record->active_id; @@ -1172,7 +1172,7 @@ int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, os Purpose: Match function to iterate only active objects ------------------------------------------------------------------*/ -bool OS_ObjectFilterActive(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +bool OS_ObjectFilterActive(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { return OS_ObjectIdDefined(obj->active_id); } @@ -1209,7 +1209,7 @@ bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter) } record = OS_OBJECT_TABLE_GET(iter->base, iter->token); - if (iter->match == NULL || iter->match(iter->arg, iter->token.obj_idx, record)) + if (iter->match == NULL || iter->match(iter->arg, &iter->token, record)) { iter->token.obj_id = record->active_id; got_next = true; diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 6510bf44c..ad42b5fd0 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -260,7 +260,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f module->module_type = OS_MODULE_TYPE_DYNAMIC; /* Now call the OS-specific implementation. This reads info from the module table. */ - return_code = OS_ModuleLoad_Impl(OS_ObjectIndexFromToken(&token), translated_path); + return_code = OS_ModuleLoad_Impl(&token, translated_path); } } @@ -298,7 +298,7 @@ int32 OS_ModuleUnload(osal_id_t module_id) */ if (module->module_type == OS_MODULE_TYPE_DYNAMIC) { - return_code = OS_ModuleUnload_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_ModuleUnload_Impl(&token); } /* Complete the operation via the common routine */ @@ -340,7 +340,7 @@ int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_prop) strncpy(module_prop->name, record->name_entry, OS_MAX_API_NAME - 1); strncpy(module_prop->filename, module->file_name, OS_MAX_API_NAME - 1); - return_code = OS_ModuleGetInfo_Impl(OS_ObjectIndexFromToken(&token), module_prop); + return_code = OS_ModuleGetInfo_Impl(&token, module_prop); OS_ObjectIdRelease(&token); } @@ -425,7 +425,7 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const { record = OS_OBJECT_TABLE_GET(OS_global_module_table, token); - return_code = OS_ModuleSymbolLookup_Impl(OS_ObjectIndexFromToken(&token), symbol_address, symbol_name); + return_code = OS_ModuleSymbolLookup_Impl(&token, symbol_address, symbol_name); if (return_code != OS_SUCCESS) { /* look for a static symbol that also matches this module name */ diff --git a/src/os/shared/src/osapi-mutex.c b/src/os/shared/src/osapi-mutex.c index 73c9adab1..e861ff667 100644 --- a/src/os/shared/src/osapi-mutex.c +++ b/src/os/shared/src/osapi-mutex.c @@ -113,7 +113,7 @@ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) OS_OBJECT_INIT(token, mutex, obj_name, sem_name); /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_MutSemCreate_Impl(OS_ObjectIndexFromToken(&token), options); + return_code = OS_MutSemCreate_Impl(&token, options); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, sem_id); @@ -139,7 +139,7 @@ int32 OS_MutSemDelete(osal_id_t sem_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sem_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_MutSemDelete_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_MutSemDelete_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -180,7 +180,7 @@ int32 OS_MutSemGive(osal_id_t sem_id) mutex->last_owner = OS_OBJECT_ID_UNDEFINED; - return_code = OS_MutSemGive_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_MutSemGive_Impl(&token); } return return_code; @@ -208,7 +208,7 @@ int32 OS_MutSemTake(osal_id_t sem_id) { mutex = OS_OBJECT_TABLE_GET(OS_mutex_table, token); - return_code = OS_MutSemTake_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_MutSemTake_Impl(&token); if (return_code == OS_SUCCESS) { self_task = OS_TaskGetId(); @@ -281,7 +281,7 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) strncpy(mut_prop->name, record->name_entry, OS_MAX_API_NAME - 1); mut_prop->creator = record->creator; - return_code = OS_MutSemGetInfo_Impl(OS_ObjectIndexFromToken(&token), mut_prop); + return_code = OS_MutSemGetInfo_Impl(&token, mut_prop); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index edcc033b5..780476a72 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -99,7 +99,7 @@ int32 OS_ConsoleAPI_Init(void) console->BufBase = OS_printf_buffer_mem; console->BufSize = sizeof(OS_printf_buffer_mem); - return_code = OS_ConsoleCreate_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_ConsoleCreate_Impl(&token); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, &OS_SharedGlobalVars.PrintfConsoleId); @@ -233,7 +233,7 @@ int32 OS_ConsoleWrite(osal_id_t console_id, const char *Str) * This is done while still locked, so it can support * either a synchronous or asynchronous implementation. */ - OS_ConsoleWakeup_Impl(OS_ObjectIndexFromToken(&token)); + OS_ConsoleWakeup_Impl(&token); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-queue.c b/src/os/shared/src/osapi-queue.c index 0105db711..509680df7 100644 --- a/src/os/shared/src/osapi-queue.c +++ b/src/os/shared/src/osapi-queue.c @@ -122,7 +122,7 @@ int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcoun queue->max_size = data_size; /* Now call the OS-specific implementation. This reads info from the queue table. */ - return_code = OS_QueueCreate_Impl(OS_ObjectIndexFromToken(&token), flags); + return_code = OS_QueueCreate_Impl(&token, flags); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, queue_id); @@ -148,7 +148,7 @@ int32 OS_QueueDelete(osal_id_t queue_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, queue_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_QueueDelete_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_QueueDelete_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -194,7 +194,7 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copi } else { - return_code = OS_QueueGet_Impl(OS_ObjectIndexFromToken(&token), data, size, size_copied, timeout); + return_code = OS_QueueGet_Impl(&token, data, size, size_copied, timeout); } } } @@ -237,7 +237,7 @@ int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flag } else { - return_code = OS_QueuePut_Impl(OS_ObjectIndexFromToken(&token), data, size, flags); + return_code = OS_QueuePut_Impl(&token, data, size, flags); } } } diff --git a/src/os/shared/src/osapi-select.c b/src/os/shared/src/osapi-select.c index cb759afb5..cecad98c0 100644 --- a/src/os/shared/src/osapi-select.c +++ b/src/os/shared/src/osapi-select.c @@ -69,7 +69,7 @@ int32 OS_SelectSingle(osal_id_t objid, uint32 *StateFlags, int32 msecs) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, objid, &token); if (return_code == OS_SUCCESS) { - return_code = OS_SelectSingle_Impl(OS_ObjectIndexFromToken(&token), StateFlags, msecs); + return_code = OS_SelectSingle_Impl(&token, StateFlags, msecs); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-shell.c b/src/os/shared/src/osapi-shell.c index e35e103f2..62e182fcc 100644 --- a/src/os/shared/src/osapi-shell.c +++ b/src/os/shared/src/osapi-shell.c @@ -64,7 +64,7 @@ int32 OS_ShellOutputToFile(const char *Cmd, osal_id_t filedes) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, filedes, &token); if (return_code == OS_SUCCESS) { - return_code = OS_ShellOutputToFile_Impl(OS_ObjectIndexFromToken(&token), Cmd); + return_code = OS_ShellOutputToFile_Impl(&token, Cmd); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index de9e9022b..99c2968ee 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -84,11 +84,13 @@ int32 OS_SocketAPI_Init(void) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -void OS_CreateSocketName(osal_index_t local_id, const OS_SockAddr_t *Addr, const char *parent_name) +void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Addr, const char *parent_name) { size_t len; uint16 port; - OS_stream_internal_record_t *sock = &OS_stream_table[local_id]; + OS_stream_internal_record_t *sock; + + sock = OS_OBJECT_TABLE_GET(OS_stream_table, *token); if (OS_SocketAddrToString_Impl(sock->stream_name, OS_MAX_API_NAME, Addr) != OS_SUCCESS) { @@ -142,7 +144,7 @@ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_ stream->socket_type = Type; /* Now call the OS-specific implementation. This reads info from the table. */ - return_code = OS_SocketOpen_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_SocketOpen_Impl(&token); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, sock_id); @@ -190,11 +192,11 @@ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) } else { - return_code = OS_SocketBind_Impl(OS_ObjectIndexFromToken(&token), Addr); + return_code = OS_SocketBind_Impl(&token, Addr); if (return_code == OS_SUCCESS) { - OS_CreateSocketName(OS_ObjectIndexFromToken(&token), Addr, NULL); + OS_CreateSocketName(&token, Addr, NULL); record->name_entry = stream->stream_name; stream->stream_state |= OS_STREAM_STATE_BOUND; } @@ -290,8 +292,7 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * OS_SocketAddrInit_Impl(Addr, sock->socket_domain); /* The actual accept impl is done without global table lock, only refcount lock */ - return_code = OS_SocketAccept_Impl(OS_ObjectIndexFromToken(&sock_token), OS_ObjectIndexFromToken(&conn_token), - Addr, timeout); + return_code = OS_SocketAccept_Impl(&sock_token, &conn_token, Addr, timeout); } if (conn_record != NULL) @@ -301,7 +302,7 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * if (return_code == OS_SUCCESS) { /* Generate an entry name based on the remote address */ - OS_CreateSocketName(OS_ObjectIndexFromToken(&conn_token), Addr, sock_record->name_entry); + OS_CreateSocketName(&conn_token, Addr, sock_record->name_entry); conn_record->name_entry = conn->stream_name; conn->stream_state |= OS_STREAM_STATE_CONNECTED; } @@ -367,7 +368,7 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo if (return_code == OS_SUCCESS) { - return_code = OS_SocketConnect_Impl(OS_ObjectIndexFromToken(&token), Addr, Timeout); + return_code = OS_SocketConnect_Impl(&token, Addr, Timeout); OS_Lock_Global(LOCAL_OBJID_TYPE); if (return_code == OS_SUCCESS) @@ -417,7 +418,7 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockA } else { - return_code = OS_SocketRecvFrom_Impl(OS_ObjectIndexFromToken(&token), buffer, buflen, RemoteAddr, timeout); + return_code = OS_SocketRecvFrom_Impl(&token, buffer, buflen, RemoteAddr, timeout); } OS_ObjectIdRelease(&token); @@ -457,7 +458,7 @@ int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, cons } else { - return_code = OS_SocketSendTo_Impl(OS_ObjectIndexFromToken(&token), buffer, buflen, RemoteAddr); + return_code = OS_SocketSendTo_Impl(&token, buffer, buflen, RemoteAddr); } OS_ObjectIdRelease(&token); @@ -518,7 +519,7 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) strncpy(sock_prop->name, record->name_entry, OS_MAX_API_NAME - 1); sock_prop->creator = record->creator; - return_code = OS_SocketGetInfo_Impl(OS_ObjectIndexFromToken(&token), sock_prop); + return_code = OS_SocketGetInfo_Impl(&token, sock_prop); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index 88777744b..54738a855 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -90,7 +90,7 @@ static int32 OS_TaskPrepare(osal_id_t task_id, osal_task_entry *entrypt) { task = OS_OBJECT_TABLE_GET(OS_task_table, token); - return_code = OS_TaskMatch_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_TaskMatch_Impl(&token); *entrypt = task->entry_function_pointer; OS_ObjectIdRelease(&token); @@ -213,7 +213,7 @@ int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry f task->stack_pointer = stack_pointer; /* Now call the OS-specific implementation. This reads info from the task table. */ - return_code = OS_TaskCreate_Impl(OS_ObjectIndexFromToken(&token), flags); + return_code = OS_TaskCreate_Impl(&token, flags); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, task_id); @@ -246,7 +246,7 @@ int32 OS_TaskDelete(osal_id_t task_id) /* Save the delete hook, as we do not want to call it while locked */ delete_hook = task->delete_hook_pointer; - return_code = OS_TaskDelete_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_TaskDelete_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -322,7 +322,7 @@ int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority) { task = OS_OBJECT_TABLE_GET(OS_task_table, token); - return_code = OS_TaskSetPriority_Impl(OS_ObjectIndexFromToken(&token), new_priority); + return_code = OS_TaskSetPriority_Impl(&token, new_priority); if (return_code == OS_SUCCESS) { @@ -442,7 +442,7 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) task_prop->stack_size = task->stack_size; task_prop->priority = task->priority; - return_code = OS_TaskGetInfo_Impl(OS_ObjectIndexFromToken(&token), task_prop); + return_code = OS_TaskGetInfo_Impl(&token, task_prop); OS_ObjectIdRelease(&token); } diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index ed79e9bca..6c78ea160 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -173,7 +173,7 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ * Now we need to add it to the time base callback ring, so take the * timebase-specific lock to prevent a tick from being processed at this moment. */ - OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&timebase_token)); + OS_TimeBaseLock_Impl(&timebase_token); cb_list = timebase->first_cb; timebase->first_cb = OS_ObjectIdFromToken(&timecb_token); @@ -187,7 +187,7 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ OS_timecb_table[timecb->next_ref].prev_ref = OS_ObjectIndexFromToken(&timecb_token); } - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&timebase_token)); + OS_TimeBaseUnlock_Impl(&timebase_token); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &timecb_token, timer_id); @@ -349,7 +349,7 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) { timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, token); - OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); + OS_TimeBaseLock_Impl(&timecb->timebase_token); if ((timecb->flags & TIMECB_FLAG_DEDICATED_TIMEBASE) != 0) { @@ -359,7 +359,7 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) timecb->wait_time = (int32)start_time; timecb->interval_time = (int32)interval_time; - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); + OS_TimeBaseUnlock_Impl(&timecb->timebase_token); OS_ObjectIdRelease(&token); } @@ -423,7 +423,7 @@ int32 OS_TimerDelete(osal_id_t timer_id) OS_ObjectIdTransferToken(&timecb->timebase_token, &timebase_token); - OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); + OS_TimeBaseLock_Impl(&timecb->timebase_token); /* * If the timer uses a dedicated time base, then also delete that. @@ -456,7 +456,7 @@ int32 OS_TimerDelete(osal_id_t timer_id) timecb->next_ref = OS_ObjectIndexFromToken(&timecb_token); timecb->prev_ref = OS_ObjectIndexFromToken(&timecb_token); - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&timecb->timebase_token)); + OS_TimeBaseUnlock_Impl(&timecb->timebase_token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &timecb_token); diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index 491bf4d6f..62e935a95 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -155,7 +155,7 @@ int32 OS_TimeBaseCreate(osal_id_t *timer_id, const char *timebase_name, OS_Timer } /* Now call the OS-specific implementation. This reads info from the timer table. */ - return_code = OS_TimeBaseCreate_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_TimeBaseCreate_Impl(&token); /* Check result, finalize record, and unlock global table. */ return_code = OS_ObjectIdFinalizeNew(return_code, &token, timer_id); @@ -208,9 +208,9 @@ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); /* Need to take the time base lock to ensure that no ticks are currently being processed */ - OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&token)); + OS_TimeBaseLock_Impl(&token); - return_code = OS_TimeBaseSet_Impl(OS_ObjectIndexFromToken(&token), start_time, interval_time); + return_code = OS_TimeBaseSet_Impl(&token, start_time, interval_time); if (return_code == OS_SUCCESS) { @@ -219,7 +219,7 @@ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time timebase->nominal_interval_time = interval_time; } - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&token)); + OS_TimeBaseUnlock_Impl(&token); OS_ObjectIdRelease(&token); } @@ -254,7 +254,7 @@ int32 OS_TimeBaseDelete(osal_id_t timer_id) return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_TIMEBASE, timer_id, &token); if (return_code == OS_SUCCESS) { - return_code = OS_TimeBaseDelete_Impl(OS_ObjectIndexFromToken(&token)); + return_code = OS_TimeBaseDelete_Impl(&token); /* Complete the operation via the common routine */ return_code = OS_ObjectIdFinalizeDelete(return_code, &token); @@ -342,7 +342,7 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro timebase_prop->freerun_time = timebase->freerun_time; timebase_prop->accuracy = timebase->accuracy_usec; - return_code = OS_TimeBaseGetInfo_Impl(OS_ObjectIndexFromToken(&token), timebase_prop); + return_code = OS_TimeBaseGetInfo_Impl(&token, timebase_prop); OS_ObjectIdRelease(&token); } @@ -438,7 +438,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) * Call the sync function - this will pend for some period of time * and return the amount of elapsed time in units of "timebase ticks" */ - tick_time = (*syncfunc)(OS_ObjectIndexFromToken(&token)); + tick_time = (*syncfunc)(timebase_id); /* * The returned tick_time should be nonzero. If the sync function @@ -480,7 +480,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) } } - OS_TimeBaseLock_Impl(OS_ObjectIndexFromToken(&token)); + OS_TimeBaseLock_Impl(&token); /* * After waiting, check that our ID still matches @@ -488,7 +488,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) */ if (!OS_ObjectIdEqual(timebase_id, record->active_id)) { - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&token)); + OS_TimeBaseUnlock_Impl(&token); break; } @@ -540,7 +540,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) } while (curr_cb_local_id != timer_id); } - OS_TimeBaseUnlock_Impl(OS_ObjectIndexFromToken(&token)); + OS_TimeBaseUnlock_Impl(&token); } } /* end OS_TimeBase_CallbackThread */ diff --git a/src/os/vxworks/inc/os-vxworks.h b/src/os/vxworks/inc/os-vxworks.h index 997a12aaa..88bbe1826 100644 --- a/src/os/vxworks/inc/os-vxworks.h +++ b/src/os/vxworks/inc/os-vxworks.h @@ -94,7 +94,7 @@ int OS_VxWorks_ConsoleTask_Entry(int arg); uint32 OS_VxWorks_SigWait(osal_index_t local_id); int OS_VxWorks_TimeBaseTask(int arg); -void OS_VxWorks_RegisterTimer(osal_index_t local_id); +void OS_VxWorks_RegisterTimer(osal_id_t obj_id); void OS_VxWorks_UsecToTimespec(uint32 usecs, struct timespec *time_spec); int32 OS_VxWorks_GenericSemTake(SEM_ID vxid, int sys_ticks); diff --git a/src/os/vxworks/src/os-impl-binsem.c b/src/os/vxworks/src/os-impl-binsem.c index 0f90efd2b..4c9a1acd4 100644 --- a/src/os/vxworks/src/os-impl-binsem.c +++ b/src/os/vxworks/src/os-impl-binsem.c @@ -33,6 +33,7 @@ #include "os-impl-binsem.h" #include "os-shared-binsem.h" #include "os-shared-timebase.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -70,13 +71,16 @@ int32 OS_VxWorks_BinSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_BinSemCreate_Impl(const OS_object_token_t *token, uint32 sem_initial_value, uint32 options) { - SEM_ID tmp_sem_id; + SEM_ID tmp_sem_id; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); /* Initialize VxWorks Semaphore. * The memory for this sem is statically allocated. */ - tmp_sem_id = semBInitialize(OS_impl_bin_sem_table[sem_id].bmem, SEM_Q_PRIORITY, sem_initial_value); + tmp_sem_id = semBInitialize(impl->bmem, SEM_Q_PRIORITY, sem_initial_value); /* check if semBInitialize failed */ if (tmp_sem_id == (SEM_ID)0) @@ -85,7 +89,7 @@ int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 return OS_SEM_FAILURE; } - OS_impl_bin_sem_table[sem_id].vxid = tmp_sem_id; + impl->vxid = tmp_sem_id; return OS_SUCCESS; } /* end OS_BinSemCreate_Impl */ @@ -98,12 +102,16 @@ int32 OS_BinSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemDelete_Impl(osal_index_t sem_id) +int32 OS_BinSemDelete_Impl(const OS_object_token_t *token) { + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); + /* * As the memory for the sem is statically allocated, delete is a no-op. */ - OS_impl_bin_sem_table[sem_id].vxid = 0; + impl->vxid = 0; return OS_SUCCESS; } /* end OS_BinSemDelete_Impl */ @@ -116,10 +124,14 @@ int32 OS_BinSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGive_Impl(osal_index_t sem_id) +int32 OS_BinSemGive_Impl(const OS_object_token_t *token) { + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); + /* Use common routine */ - return OS_VxWorks_GenericSemGive(OS_impl_bin_sem_table[sem_id].vxid); + return OS_VxWorks_GenericSemGive(impl->vxid); } /* end OS_BinSemGive_Impl */ /*---------------------------------------------------------------- @@ -130,10 +142,14 @@ int32 OS_BinSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemFlush_Impl(osal_index_t sem_id) +int32 OS_BinSemFlush_Impl(const OS_object_token_t *token) { + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); + /* Flush VxWorks Semaphore */ - if (semFlush(OS_impl_bin_sem_table[sem_id].vxid) != OK) + if (semFlush(impl->vxid) != OK) { OS_DEBUG("semFlush() - vxWorks errno %d\n", errno); return OS_SEM_FAILURE; @@ -150,10 +166,14 @@ int32 OS_BinSemFlush_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTake_Impl(osal_index_t sem_id) +int32 OS_BinSemTake_Impl(const OS_object_token_t *token) { + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); + /* Use common routine */ - return OS_VxWorks_GenericSemTake(OS_impl_bin_sem_table[sem_id].vxid, WAIT_FOREVER); + return OS_VxWorks_GenericSemTake(impl->vxid, WAIT_FOREVER); } /* end OS_BinSemTake_Impl */ @@ -165,16 +185,19 @@ int32 OS_BinSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) +int32 OS_BinSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs) { - int ticks; - int32 status; + int ticks; + int32 status; + OS_impl_binsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_bin_sem_table, *token); status = OS_Milli2Ticks(msecs, &ticks); if (status == OS_SUCCESS) { - status = OS_VxWorks_GenericSemTake(OS_impl_bin_sem_table[sem_id].vxid, ticks); + status = OS_VxWorks_GenericSemTake(impl->vxid, ticks); } return status; @@ -188,7 +211,7 @@ int32 OS_BinSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_BinSemGetInfo_Impl(osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop) +int32 OS_BinSemGetInfo_Impl(const OS_object_token_t *token, OS_bin_sem_prop_t *bin_prop) { /* VxWorks has no API for obtaining the current value of a semaphore */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-console.c b/src/os/vxworks/src/os-impl-console.c index 7accef4bb..0a8bbe886 100644 --- a/src/os/vxworks/src/os-impl-console.c +++ b/src/os/vxworks/src/os-impl-console.c @@ -32,6 +32,7 @@ #include "os-impl-console.h" #include "os-shared-printf.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -66,9 +67,11 @@ OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ConsoleWakeup_Impl(osal_index_t local_id) +void OS_ConsoleWakeup_Impl(const OS_object_token_t *token) { - OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; + OS_impl_console_internal_record_t *local; + + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, *token); if (local->is_async) { @@ -81,7 +84,7 @@ void OS_ConsoleWakeup_Impl(osal_index_t local_id) else { /* output directly */ - OS_ConsoleOutput_Impl(local_id); + OS_ConsoleOutput_Impl(token); } } /* end OS_ConsoleWakeup_Impl */ @@ -94,18 +97,23 @@ void OS_ConsoleWakeup_Impl(osal_index_t local_id) *-----------------------------------------------------------------*/ int OS_VxWorks_ConsoleTask_Entry(int arg) { - osal_index_t local_id = OSAL_INDEX_C(arg); OS_impl_console_internal_record_t *local; + OS_object_token_t token; - local = &OS_impl_console_table[local_id]; - while (true) + if (OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_CONSOLE, OS_ObjectIdFromInteger(arg), &token) == + OS_SUCCESS) { - OS_ConsoleOutput_Impl(local_id); - if (semTake(local->datasem, WAIT_FOREVER) == ERROR) + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, token); + while (true) { - OS_DEBUG("semTake() - vxWorks errno %d\n", errno); - break; + OS_ConsoleOutput_Impl(&token); + if (semTake(local->datasem, WAIT_FOREVER) == ERROR) + { + OS_DEBUG("semTake() - vxWorks errno %d\n", errno); + break; + } } + OS_ObjectIdRelease(&token); } return OK; @@ -119,12 +127,16 @@ int OS_VxWorks_ConsoleTask_Entry(int arg) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ConsoleCreate_Impl(osal_index_t local_id) +int32 OS_ConsoleCreate_Impl(const OS_object_token_t *token) { - OS_impl_console_internal_record_t *local = &OS_impl_console_table[local_id]; + OS_impl_console_internal_record_t *local; int32 return_code; + OS_console_internal_record_t * console; + + local = OS_OBJECT_TABLE_GET(OS_impl_console_table, *token); + console = OS_OBJECT_TABLE_GET(OS_console_table, *token); - if (local_id == 0) + if (OS_ObjectIndexFromToken(token) == 0) { return_code = OS_SUCCESS; local->is_async = OS_CONSOLE_ASYNC; @@ -145,9 +157,9 @@ int32 OS_ConsoleCreate_Impl(osal_index_t local_id) } /* spawn the async output helper task */ - local->taskid = taskSpawn(OS_console_table[local_id].device_name, OS_CONSOLE_TASK_PRIORITY, 0, - OS_CONSOLE_TASK_STACKSIZE, (FUNCPTR)OS_VxWorks_ConsoleTask_Entry, local_id, 0, 0, - 0, 0, 0, 0, 0, 0, 0); + local->taskid = taskSpawn(console->device_name, OS_CONSOLE_TASK_PRIORITY, 0, OS_CONSOLE_TASK_STACKSIZE, + (FUNCPTR)OS_VxWorks_ConsoleTask_Entry, + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), 0, 0, 0, 0, 0, 0, 0, 0, 0); if (local->taskid == (TASK_ID)ERROR) { diff --git a/src/os/vxworks/src/os-impl-countsem.c b/src/os/vxworks/src/os-impl-countsem.c index 41cff591d..3f4ef65e7 100644 --- a/src/os/vxworks/src/os-impl-countsem.c +++ b/src/os/vxworks/src/os-impl-countsem.c @@ -32,6 +32,7 @@ #include "os-impl-countsem.h" #include "os-shared-countsem.h" #include "os-shared-timebase.h" +#include "os-shared-idmap.h" /**************************************************************************************** DEFINES @@ -69,13 +70,16 @@ int32 OS_VxWorks_CountSemAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint32 options) +int32 OS_CountSemCreate_Impl(const OS_object_token_t *token, uint32 sem_initial_value, uint32 options) { - SEM_ID tmp_sem_id; + SEM_ID tmp_sem_id; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); /* Initialize VxWorks Semaphore. * The memory for this sem is statically allocated. */ - tmp_sem_id = semCInitialize(OS_impl_count_sem_table[sem_id].cmem, SEM_Q_PRIORITY, sem_initial_value); + tmp_sem_id = semCInitialize(impl->cmem, SEM_Q_PRIORITY, sem_initial_value); /* check if semCInitialize failed */ if (tmp_sem_id == (SEM_ID)0) @@ -84,7 +88,7 @@ int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint return OS_SEM_FAILURE; } - OS_impl_count_sem_table[sem_id].vxid = tmp_sem_id; + impl->vxid = tmp_sem_id; return OS_SUCCESS; } /* end OS_CountSemCreate_Impl */ @@ -97,12 +101,16 @@ int32 OS_CountSemCreate_Impl(osal_index_t sem_id, uint32 sem_initial_value, uint * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemDelete_Impl(osal_index_t sem_id) +int32 OS_CountSemDelete_Impl(const OS_object_token_t *token) { + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + /* * As the memory for the sem is statically allocated, delete is a no-op. */ - OS_impl_count_sem_table[sem_id].vxid = 0; + impl->vxid = 0; return OS_SUCCESS; } /* end OS_CountSemDelete_Impl */ @@ -115,10 +123,14 @@ int32 OS_CountSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGive_Impl(osal_index_t sem_id) +int32 OS_CountSemGive_Impl(const OS_object_token_t *token) { + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + /* Give VxWorks Semaphore */ - return OS_VxWorks_GenericSemGive(OS_impl_count_sem_table[sem_id].vxid); + return OS_VxWorks_GenericSemGive(impl->vxid); } /* end OS_CountSemGive_Impl */ /*---------------------------------------------------------------- @@ -129,9 +141,13 @@ int32 OS_CountSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTake_Impl(osal_index_t sem_id) +int32 OS_CountSemTake_Impl(const OS_object_token_t *token) { - return OS_VxWorks_GenericSemTake(OS_impl_count_sem_table[sem_id].vxid, WAIT_FOREVER); + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); + + return OS_VxWorks_GenericSemTake(impl->vxid, WAIT_FOREVER); } /* end OS_CountSemTake_Impl */ /*---------------------------------------------------------------- @@ -142,16 +158,19 @@ int32 OS_CountSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) +int32 OS_CountSemTimedWait_Impl(const OS_object_token_t *token, uint32 msecs) { - int ticks; - int32 status; + int ticks; + int32 status; + OS_impl_countsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_count_sem_table, *token); status = OS_Milli2Ticks(msecs, &ticks); if (status == OS_SUCCESS) { - status = OS_VxWorks_GenericSemTake(OS_impl_count_sem_table[sem_id].vxid, ticks); + status = OS_VxWorks_GenericSemTake(impl->vxid, ticks); } return status; @@ -165,7 +184,7 @@ int32 OS_CountSemTimedWait_Impl(osal_index_t sem_id, uint32 msecs) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_CountSemGetInfo_Impl(osal_index_t sem_id, OS_count_sem_prop_t *count_prop) +int32 OS_CountSemGetInfo_Impl(const OS_object_token_t *token, OS_count_sem_prop_t *count_prop) { /* VxWorks does not provide an API to get the value */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-dirs.c b/src/os/vxworks/src/os-impl-dirs.c index 513b8b878..e20da3b87 100644 --- a/src/os/vxworks/src/os-impl-dirs.c +++ b/src/os/vxworks/src/os-impl-dirs.c @@ -32,6 +32,7 @@ #include "os-vxworks.h" #include "os-impl-dirs.h" #include "os-shared-dir.h" +#include "os-shared-idmap.h" /* * The directory handle table. @@ -83,10 +84,14 @@ int32 OS_DirCreate_Impl(const char *local_path, uint32 access) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path) +int32 OS_DirOpen_Impl(const OS_object_token_t *token, const char *local_path) { - OS_impl_dir_table[local_id].dp = opendir(local_path); - if (OS_impl_dir_table[local_id].dp == NULL) + OS_impl_dir_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); + + impl->dp = opendir(local_path); + if (impl->dp == NULL) { return OS_ERROR; } @@ -101,10 +106,14 @@ int32 OS_DirOpen_Impl(osal_index_t local_id, const char *local_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirClose_Impl(osal_index_t local_id) +int32 OS_DirClose_Impl(const OS_object_token_t *token) { - closedir(OS_impl_dir_table[local_id].dp); - OS_impl_dir_table[local_id].dp = NULL; + OS_impl_dir_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); + + closedir(impl->dp); + impl->dp = NULL; return OS_SUCCESS; } /* end OS_DirClose_Impl */ @@ -116,9 +125,12 @@ int32 OS_DirClose_Impl(osal_index_t local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) +int32 OS_DirRead_Impl(const OS_object_token_t *token, os_dirent_t *dirent) { - struct dirent *de; + struct dirent * de; + OS_impl_dir_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); /* NOTE - the readdir() call is non-reentrant .... * However, this is performed while the global dir table lock is taken. @@ -129,7 +141,7 @@ int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) */ /* cppcheck-suppress readdirCalled */ /* cppcheck-suppress nonreentrantFunctionsreaddir */ - de = readdir(OS_impl_dir_table[local_id].dp); + de = readdir(impl->dp); if (de == NULL) { return OS_ERROR; @@ -149,9 +161,13 @@ int32 OS_DirRead_Impl(osal_index_t local_id, os_dirent_t *dirent) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_DirRewind_Impl(osal_index_t local_id) +int32 OS_DirRewind_Impl(const OS_object_token_t *token) { - rewinddir(OS_impl_dir_table[local_id].dp); + OS_impl_dir_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); + + rewinddir(impl->dp); return OS_SUCCESS; } /* end OS_DirRewind_Impl */ diff --git a/src/os/vxworks/src/os-impl-filesys.c b/src/os/vxworks/src/os-impl-filesys.c index 2876348e4..5a7080c6e 100644 --- a/src/os/vxworks/src/os-impl-filesys.c +++ b/src/os/vxworks/src/os-impl-filesys.c @@ -76,12 +76,15 @@ OS_impl_filesys_internal_record_t OS_impl_filesys_table[OS_MAX_FILE_SYSTEMS]; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysStartVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; - OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; + OS_filesys_internal_record_t * local; + OS_impl_filesys_internal_record_t *impl; int32 return_code; + impl = OS_OBJECT_TABLE_GET(OS_impl_filesys_table, *token); + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + memset(impl, 0, sizeof(*impl)); return_code = OS_ERR_NOT_IMPLEMENTED; switch (local->fstype) @@ -192,10 +195,13 @@ int32 OS_FileSysStartVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysStopVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t * local = &OS_filesys_table[filesys_id]; - OS_impl_filesys_internal_record_t *impl = &OS_impl_filesys_table[filesys_id]; + OS_filesys_internal_record_t * local; + OS_impl_filesys_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filesys_table, *token); + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); switch (local->fstype) { @@ -231,12 +237,14 @@ int32 OS_FileSysStopVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysFormatVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; int32 return_code = OS_ERR_NOT_IMPLEMENTED; int status; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + switch (local->fstype) { case OS_FILESYS_TYPE_FS_BASED: @@ -282,12 +290,14 @@ int32 OS_FileSysFormatVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysMountVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; int32 status; int fd; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + /* * Calling open() on the physical device path * mounts the device. @@ -315,12 +325,14 @@ int32 OS_FileSysMountVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) +int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; int32 status; int fd; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + /* ** vxWorks uses an ioctl to unmount */ @@ -355,12 +367,14 @@ int32 OS_FileSysUnmountVolume_Impl(osal_index_t filesys_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(const OS_object_token_t *token, OS_statvfs_t *result) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; struct statfs stat_buf; int return_code; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + if (statfs(local->system_mountpt, &stat_buf) != 0) { return_code = OS_ERROR; @@ -386,13 +400,15 @@ int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_FileSysCheckVolume_Impl(osal_index_t filesys_id, bool repair) +int32 OS_FileSysCheckVolume_Impl(const OS_object_token_t *token, bool repair) { - OS_filesys_internal_record_t *local = &OS_filesys_table[filesys_id]; + OS_filesys_internal_record_t *local; STATUS chk_status; int flags; int fd; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + fd = open(local->system_mountpt, O_RDONLY, 0); if (fd < 0) { diff --git a/src/os/vxworks/src/os-impl-loader.c b/src/os/vxworks/src/os-impl-loader.c index ba9a607c2..49e693be4 100644 --- a/src/os/vxworks/src/os-impl-loader.c +++ b/src/os/vxworks/src/os-impl-loader.c @@ -32,6 +32,7 @@ #include "os-vxworks.h" #include "os-impl-loader.h" #include "os-shared-module.h" +#include "os-shared-idmap.h" #include #include @@ -71,11 +72,14 @@ int32 OS_VxWorks_ModuleAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleLoad_Impl(osal_index_t local_id, const char *translated_path) +int32 OS_ModuleLoad_Impl(const OS_object_token_t *token, const char *translated_path) { - int32 return_code; - int fd; - MODULE_ID vxModuleId; + int32 return_code; + int fd; + MODULE_ID vxModuleId; + OS_impl_module_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); /* ** File is ready to load @@ -104,8 +108,8 @@ int32 OS_ModuleLoad_Impl(osal_index_t local_id, const char *translated_path) } else { - OS_impl_module_table[local_id].moduleID = vxModuleId; - return_code = OS_SUCCESS; + impl->moduleID = vxModuleId; + return_code = OS_SUCCESS; } /* @@ -126,14 +130,17 @@ int32 OS_ModuleLoad_Impl(osal_index_t local_id, const char *translated_path) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleUnload_Impl(osal_index_t local_id) +int32 OS_ModuleUnload_Impl(const OS_object_token_t *token) { - STATUS vxStatus; + STATUS vxStatus; + OS_impl_module_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); /* ** Attempt to close/unload the module */ - vxStatus = unldByModuleId(OS_impl_module_table[local_id].moduleID, 0); + vxStatus = unldByModuleId(impl->moduleID, 0); if (vxStatus == ERROR) { OS_DEBUG("OSAL: Error, Cannot Close/Unload application file: %d\n", vxStatus); @@ -152,17 +159,20 @@ int32 OS_ModuleUnload_Impl(osal_index_t local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleGetInfo_Impl(osal_index_t local_id, OS_module_prop_t *module_prop) +int32 OS_ModuleGetInfo_Impl(const OS_object_token_t *token, OS_module_prop_t *module_prop) { - MODULE_INFO vxModuleInfo; - STATUS vxStatus; + MODULE_INFO vxModuleInfo; + STATUS vxStatus; + OS_impl_module_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); - module_prop->host_module_id = (cpuaddr)OS_impl_module_table[local_id].moduleID; + module_prop->host_module_id = (cpuaddr)impl->moduleID; /* ** Get the module info from vxWorks */ - vxStatus = moduleInfoGet(OS_impl_module_table[local_id].moduleID, &vxModuleInfo); + vxStatus = moduleInfoGet(impl->moduleID, &vxModuleInfo); if (vxStatus == ERROR) { OS_DEBUG("OSAL: OS_ModuleInfoGet Error from vxWorks: %d\n", vxStatus); diff --git a/src/os/vxworks/src/os-impl-mutex.c b/src/os/vxworks/src/os-impl-mutex.c index 72e09afe5..d044e5bed 100644 --- a/src/os/vxworks/src/os-impl-mutex.c +++ b/src/os/vxworks/src/os-impl-mutex.c @@ -32,6 +32,7 @@ #include "os-impl-mutex.h" #include "os-shared-mutex.h" +#include "os-shared-idmap.h" #include @@ -67,13 +68,16 @@ int32 OS_VxWorks_MutexAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) +int32 OS_MutSemCreate_Impl(const OS_object_token_t *token, uint32 options) { - SEM_ID tmp_sem_id; + SEM_ID tmp_sem_id; + OS_impl_mutsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); /* Initialize VxWorks Semaphore. * The memory for this sem is statically allocated. */ - tmp_sem_id = semMInitialize(OS_impl_mutex_table[sem_id].mmem, SEM_Q_PRIORITY | SEM_INVERSION_SAFE); + tmp_sem_id = semMInitialize(impl->mmem, SEM_Q_PRIORITY | SEM_INVERSION_SAFE); if (tmp_sem_id == (SEM_ID)0) { @@ -81,7 +85,7 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) return OS_SEM_FAILURE; } - OS_impl_mutex_table[sem_id].vxid = tmp_sem_id; + impl->vxid = tmp_sem_id; return OS_SUCCESS; } /* end OS_MutSemCreate_Impl */ @@ -93,12 +97,16 @@ int32 OS_MutSemCreate_Impl(osal_index_t sem_id, uint32 options) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemDelete_Impl(osal_index_t sem_id) +int32 OS_MutSemDelete_Impl(const OS_object_token_t *token) { + OS_impl_mutsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); + /* * As the memory for the sem is statically allocated, delete is a no-op. */ - OS_impl_mutex_table[sem_id].vxid = 0; + impl->vxid = 0; return OS_SUCCESS; } /* end OS_MutSemDelete_Impl */ @@ -111,10 +119,14 @@ int32 OS_MutSemDelete_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGive_Impl(osal_index_t sem_id) +int32 OS_MutSemGive_Impl(const OS_object_token_t *token) { + OS_impl_mutsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); + /* Give VxWorks Semaphore */ - return OS_VxWorks_GenericSemGive(OS_impl_mutex_table[sem_id].vxid); + return OS_VxWorks_GenericSemGive(impl->vxid); } /* end OS_MutSemGive_Impl */ /*---------------------------------------------------------------- @@ -125,10 +137,14 @@ int32 OS_MutSemGive_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemTake_Impl(osal_index_t sem_id) +int32 OS_MutSemTake_Impl(const OS_object_token_t *token) { + OS_impl_mutsem_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_mutex_table, *token); + /* Take VxWorks Semaphore */ - return OS_VxWorks_GenericSemTake(OS_impl_mutex_table[sem_id].vxid, WAIT_FOREVER); + return OS_VxWorks_GenericSemTake(impl->vxid, WAIT_FOREVER); } /* end OS_MutSemTake_Impl */ /*---------------------------------------------------------------- @@ -139,7 +155,7 @@ int32 OS_MutSemTake_Impl(osal_index_t sem_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_MutSemGetInfo_Impl(osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop) +int32 OS_MutSemGetInfo_Impl(const OS_object_token_t *token, OS_mut_sem_prop_t *mut_prop) { /* VxWorks provides no additional info */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-queues.c b/src/os/vxworks/src/os-impl-queues.c index bbc95b175..99e8a3002 100644 --- a/src/os/vxworks/src/os-impl-queues.c +++ b/src/os/vxworks/src/os-impl-queues.c @@ -32,6 +32,7 @@ #include "os-impl-queues.h" #include "os-shared-queue.h" #include "os-shared-timebase.h" +#include "os-shared-idmap.h" /**************************************************************************************** GLOBAL DATA @@ -63,11 +64,19 @@ int32 OS_VxWorks_QueueAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) +int32 OS_QueueCreate_Impl(const OS_object_token_t *token, uint32 flags) { - MSG_Q_ID tmp_msgq_id; - int queue_depth = OS_queue_table[queue_id].max_depth; /* maximum number of messages in queue (queue depth) */ - int data_size = OS_queue_table[queue_id].max_size; /* maximum size in bytes of a message */ + MSG_Q_ID tmp_msgq_id; + int queue_depth; + int data_size; + OS_impl_queue_internal_record_t *impl; + OS_queue_internal_record_t * queue; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); + queue = OS_OBJECT_TABLE_GET(OS_queue_table, *token); + + queue_depth = queue->max_depth; /* maximum number of messages in queue (queue depth) */ + data_size = queue->max_size; /* maximum size in bytes of a message */ /* Create VxWorks Message Queue */ tmp_msgq_id = msgQCreate(queue_depth, data_size, MSG_Q_FIFO); @@ -79,7 +88,7 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) return OS_ERROR; } - OS_impl_queue_table[queue_id].vxid = tmp_msgq_id; + impl->vxid = tmp_msgq_id; return OS_SUCCESS; } /* end OS_QueueCreate_Impl */ @@ -92,16 +101,20 @@ int32 OS_QueueCreate_Impl(osal_index_t queue_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueDelete_Impl(osal_index_t queue_id) +int32 OS_QueueDelete_Impl(const OS_object_token_t *token) { + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); + /* Try to delete the queue */ - if (msgQDelete(OS_impl_queue_table[queue_id].vxid) != OK) + if (msgQDelete(impl->vxid) != OK) { OS_DEBUG("msgQDelete() - vxWorks errno %d\n", errno); return OS_ERROR; } - OS_impl_queue_table[queue_id].vxid = 0; + impl->vxid = 0; return OS_SUCCESS; } /* end OS_QueueDelete_Impl */ @@ -114,11 +127,14 @@ int32 OS_QueueDelete_Impl(osal_index_t queue_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout) +int32 OS_QueueGet_Impl(const OS_object_token_t *token, void *data, size_t size, size_t *size_copied, int32 timeout) { - int32 return_code; - STATUS status; - int ticks; + int32 return_code; + STATUS status; + int ticks; + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); /* Get Message From Message Queue */ if (timeout == OS_PEND) @@ -138,7 +154,7 @@ int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *s } } - status = msgQReceive(OS_impl_queue_table[queue_id].vxid, data, size, ticks); + status = msgQReceive(impl->vxid, data, size, ticks); if (status == ERROR) { @@ -174,11 +190,14 @@ int32 OS_QueueGet_Impl(osal_index_t queue_id, void *data, size_t size, size_t *s * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uint32 flags) +int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, size_t size, uint32 flags) { - int32 return_code; + int32 return_code; + OS_impl_queue_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_queue_table, *token); - if (msgQSend(OS_impl_queue_table[queue_id].vxid, (void *)data, size, NO_WAIT, MSG_PRI_NORMAL) == OK) + if (msgQSend(impl->vxid, (void *)data, size, NO_WAIT, MSG_PRI_NORMAL) == OK) { return_code = OS_SUCCESS; } @@ -204,7 +223,7 @@ int32 OS_QueuePut_Impl(osal_index_t queue_id, const void *data, size_t size, uin * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGetInfo_Impl(osal_index_t queue_id, OS_queue_prop_t *queue_prop) +int32 OS_QueueGetInfo_Impl(const OS_object_token_t *token, OS_queue_prop_t *queue_prop) { /* No extra info for queues in the OS implementation */ return OS_SUCCESS; diff --git a/src/os/vxworks/src/os-impl-shell.c b/src/os/vxworks/src/os-impl-shell.c index 2b942a41d..7fc9f3342 100644 --- a/src/os/vxworks/src/os-impl-shell.c +++ b/src/os/vxworks/src/os-impl-shell.c @@ -33,6 +33,7 @@ #include "os-impl-io.h" #include "os-shared-shell.h" #include "os-shared-file.h" +#include "os-shared-idmap.h" #include #include @@ -52,13 +53,15 @@ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) +int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd) { - int32 ReturnCode = OS_ERROR; - int32 Result; - osal_id_t fdCmd; - osal_index_t cmdidx; - char * shellName; + int32 ReturnCode = OS_ERROR; + int32 Result; + osal_id_t fdCmd; + char * shellName; + OS_impl_file_internal_record_t *out_impl; + OS_impl_file_internal_record_t *cmd_impl; + OS_object_token_t cmd_token; /* Create a file to write the command to (or write over the old one) */ Result = @@ -69,16 +72,18 @@ int32 OS_ShellOutputToFile_Impl(osal_index_t file_id, const char *Cmd) return Result; } - if (OS_ConvertToArrayIndex(fdCmd, &cmdidx) == OS_SUCCESS) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_STREAM, fdCmd, &cmd_token) == OS_SUCCESS) { + out_impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + cmd_impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, cmd_token); + /* copy the command to the file, and then seek back to the beginning of the file */ OS_write(fdCmd, Cmd, strlen(Cmd)); OS_lseek(fdCmd, 0, OS_SEEK_SET); /* Create a shell task the will run the command in the file, push output to OS_fd */ - Result = - shellGenericInit("INTERPRETER=Cmd", 0, NULL, &shellName, false, false, OS_impl_filehandle_table[cmdidx].fd, - OS_impl_filehandle_table[file_id].fd, OS_impl_filehandle_table[file_id].fd); + Result = shellGenericInit("INTERPRETER=Cmd", 0, NULL, &shellName, false, false, + cmd_impl->fd, out_impl->fd, out_impl->fd); } if (Result == OK) diff --git a/src/os/vxworks/src/os-impl-symtab.c b/src/os/vxworks/src/os-impl-symtab.c index be689df95..5dc9f94ee 100644 --- a/src/os/vxworks/src/os-impl-symtab.c +++ b/src/os/vxworks/src/os-impl-symtab.c @@ -119,7 +119,6 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) return OS_GenericSymbolLookup_Impl(sysSymTbl, SymbolAddress, SymbolName); } /* end OS_GlobalSymbolLookup_Impl */ - /*---------------------------------------------------------------- * * Function: OS_ModuleSymbolLookup_Impl @@ -128,7 +127,7 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup_Impl(osal_index_t local_id, cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_ModuleSymbolLookup_Impl(const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName) { /* * NOTE: this is currently exactly the same as OS_GlobalSymbolLookup_Impl(). @@ -140,8 +139,6 @@ int32 OS_ModuleSymbolLookup_Impl(osal_index_t local_id, cpuaddr *SymbolAddress, return OS_GenericSymbolLookup_Impl(sysSymTbl, SymbolAddress, SymbolName); } /* end OS_ModuleSymbolLookup_Impl */ - - /*---------------------------------------------------------------- * * Function: OS_SymTableIterator_Impl diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index 83afb2922..ccb0e5a76 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -83,11 +83,7 @@ OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; ---------------------------------------------------------------------------------------*/ int OS_VxWorks_TaskEntry(int arg) { - VxWorks_ID_Buffer_t id; - - id.arg = arg; - - OS_TaskEntryPoint(id.id); + OS_TaskEntryPoint(OS_ObjectIdFromInteger(arg)); return 0; } /* end OS_VxWorksEntry */ @@ -117,7 +113,7 @@ int32 OS_VxWorks_TaskAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) +int32 OS_TaskCreate_Impl(const OS_object_token_t *token, uint32 flags) { STATUS status; int vxflags; @@ -126,9 +122,10 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) unsigned long userstackbase; unsigned long actualstackbase; OS_impl_task_internal_record_t *lrec; - VxWorks_ID_Buffer_t id; + OS_task_internal_record_t * task; - lrec = &OS_impl_task_table[task_id]; + lrec = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + task = OS_OBJECT_TABLE_GET(OS_task_table, *token); /* Create VxWorks Task */ @@ -145,9 +142,9 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) * Get priority/stack specs from main struct * priority should be a direct passthru */ - vxpri = OS_task_table[task_id].priority; - actualsz = OS_task_table[task_id].stack_size; - userstackbase = (unsigned long)OS_task_table[task_id].stack_pointer; + vxpri = task->priority; + actualsz = task->stack_size; + userstackbase = (unsigned long)task->stack_pointer; /* * NOTE: Using taskInit() here rather than taskSpawn() allows us @@ -237,14 +234,13 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) actualstackbase += actualsz; /* move to last byte of stack block */ #endif - id.id = OS_global_task_table[task_id].active_id; - status = taskInit(&lrec->tcb, /* address of new task's TCB */ - (char *)OS_global_task_table[task_id].name_entry, vxpri, /* priority of new task */ - vxflags, /* task option word */ - (char *)actualstackbase, /* base of new task's stack */ - actualsz, /* size (bytes) of stack needed */ - (FUNCPTR)OS_VxWorks_TaskEntry, /* entry point of new task */ - id.arg, /* 1st arg is ID */ + status = taskInit(&lrec->tcb, /* address of new task's TCB */ + (char *)task->task_name, vxpri, /* priority of new task */ + vxflags, /* task option word */ + (char *)actualstackbase, /* base of new task's stack */ + actualsz, /* size (bytes) of stack needed */ + (FUNCPTR)OS_VxWorks_TaskEntry, /* entry point of new task */ + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), /* 1st arg is ID */ 0, 0, 0, 0, 0, 0, 0, 0, 0); if (status != OK) @@ -268,21 +264,25 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskDelete_Impl(osal_index_t task_id) +int32 OS_TaskDelete_Impl(const OS_object_token_t *token) { + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + /* ** Try to delete the task ** If this fails, not much recourse - the only potential cause of failure ** to cancel here is that the thread ID is invalid because it already exited itself, ** and if that is true there is nothing wrong - everything is OK to continue normally. */ - if (taskDelete(OS_impl_task_table[task_id].vxid) != OK) + if (taskDelete(impl->vxid) != OK) { OS_DEBUG("taskDelete() - vxWorks errno %d\n", errno); return OS_ERROR; } - OS_impl_task_table[task_id].vxid = 0; + impl->vxid = 0; return OS_SUCCESS; } /* end OS_TaskDelete_Impl */ @@ -336,10 +336,14 @@ int32 OS_TaskDelay_Impl(uint32 milli_second) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority) +int32 OS_TaskSetPriority_Impl(const OS_object_token_t *token, osal_priority_t new_priority) { + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + /* Set VxWorks Task Priority */ - if (taskPrioritySet(OS_impl_task_table[task_id].vxid, new_priority) != OK) + if (taskPrioritySet(impl->vxid, new_priority) != OK) { return OS_ERROR; } @@ -356,12 +360,16 @@ int32 OS_TaskSetPriority_Impl(osal_index_t task_id, osal_priority_t new_priority * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskMatch_Impl(osal_index_t task_id) +int32 OS_TaskMatch_Impl(const OS_object_token_t *token) { + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + /* ** Get VxWorks Task Id */ - if (taskIdSelf() != OS_impl_task_table[task_id].vxid) + if (taskIdSelf() != impl->vxid) { return (OS_ERROR); } @@ -420,7 +428,7 @@ osal_id_t OS_TaskGetId_Impl(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskGetInfo_Impl(osal_index_t task_id, OS_task_prop_t *task_prop) +int32 OS_TaskGetInfo_Impl(const OS_object_token_t *token, OS_task_prop_t *task_prop) { return OS_SUCCESS; @@ -451,9 +459,12 @@ int32 OS_TaskValidateSystemData_Impl(const void *sysdata, size_t sysdata_size) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - const TASK_ID *target = (const TASK_ID *)ref; + const TASK_ID * target = (const TASK_ID *)ref; + OS_impl_task_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); - return (*target == OS_impl_task_table[local_id].vxid); + return (*target == impl->vxid); } diff --git a/src/os/vxworks/src/os-impl-timebase.c b/src/os/vxworks/src/os-impl-timebase.c index 8b75c100d..04b90513e 100644 --- a/src/os/vxworks/src/os-impl-timebase.c +++ b/src/os/vxworks/src/os-impl-timebase.c @@ -93,9 +93,13 @@ static uint32 OS_ClockAccuracyNsec; * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseLock_Impl(osal_index_t local_id) +void OS_TimeBaseLock_Impl(const OS_object_token_t *token) { - semTake(OS_impl_timebase_table[local_id].handler_mutex, WAIT_FOREVER); + OS_impl_timebase_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + + semTake(impl->handler_mutex, WAIT_FOREVER); } /* end OS_TimeBaseLock_Impl */ /*---------------------------------------------------------------- @@ -106,9 +110,13 @@ void OS_TimeBaseLock_Impl(osal_index_t local_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TimeBaseUnlock_Impl(osal_index_t local_id) +void OS_TimeBaseUnlock_Impl(const OS_object_token_t *token) { - semGive(OS_impl_timebase_table[local_id].handler_mutex); + OS_impl_timebase_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + + semGive(impl->handler_mutex); } /* end OS_TimeBaseUnlock_Impl */ /*---------------------------------------------------------------- @@ -204,38 +212,42 @@ uint32 OS_VxWorks_SigWait(osal_index_t local_id) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -void OS_VxWorks_RegisterTimer(osal_index_t local_id) +void OS_VxWorks_RegisterTimer(osal_id_t obj_id) { OS_impl_timebase_internal_record_t *local; + OS_object_token_t token; struct sigevent evp; int status; - local = &OS_impl_timebase_table[local_id]; + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMEBASE, obj_id, &token) == OS_SUCCESS) + { + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, token); - memset(&evp, 0, sizeof(evp)); - evp.sigev_notify = SIGEV_SIGNAL; - evp.sigev_signo = local->assigned_signal; + memset(&evp, 0, sizeof(evp)); + evp.sigev_notify = SIGEV_SIGNAL; + evp.sigev_signo = local->assigned_signal; - /* - ** Create the timer - ** - ** The result is not returned from this function, because - ** this is a different task context from the original creator. - ** - ** The registration status is returned through the OS_impl_timebase_table entry, - ** which is checked by the creator before returning. - ** - ** If set to ERROR, then this task will be subsequently deleted. - */ - status = timer_create(OS_PREFERRED_CLOCK, &evp, &local->host_timerid); - if (status < 0) - { - OS_DEBUG("timer_create() failed: errno=%d\n", errno); - local->timer_state = OS_TimerRegState_ERROR; - } - else - { - local->timer_state = OS_TimerRegState_SUCCESS; + /* + ** Create the timer + ** + ** The result is not returned from this function, because + ** this is a different task context from the original creator. + ** + ** The registration status is returned through the OS_impl_timebase_table entry, + ** which is checked by the creator before returning. + ** + ** If set to ERROR, then this task will be subsequently deleted. + */ + status = timer_create(OS_PREFERRED_CLOCK, &evp, &local->host_timerid); + if (status < 0) + { + OS_DEBUG("timer_create() failed: errno=%d\n", errno); + local->timer_state = OS_TimerRegState_ERROR; + } + else + { + local->timer_state = OS_TimerRegState_SUCCESS; + } } } /* end OS_VxWorks_RegisterTimer */ @@ -253,14 +265,10 @@ void OS_VxWorks_RegisterTimer(osal_index_t local_id) int OS_VxWorks_TimeBaseTask(int arg) { VxWorks_ID_Buffer_t id; - osal_index_t local_id; id.arg = arg; - if (OS_ConvertToArrayIndex(id.id, &local_id) == OS_SUCCESS) - { - OS_VxWorks_RegisterTimer(local_id); - OS_TimeBase_CallbackThread(id.id); - } + OS_VxWorks_RegisterTimer(id.id); + OS_TimeBase_CallbackThread(id.id); return 0; } /* end OS_VxWorks_TimeBaseTask */ @@ -323,7 +331,7 @@ int32 OS_VxWorks_TimeBaseAPI_Impl_Init(void) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) +int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) { /* * The tick_sem is a simple semaphore posted by the ISR and taken by the @@ -331,7 +339,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) */ int32 return_code; OS_impl_timebase_internal_record_t *local; - OS_common_record_t * global; + OS_timebase_internal_record_t * timebase; int signo; sigset_t inuse; osal_index_t idx; @@ -339,8 +347,9 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) VxWorks_ID_Buffer_t idbuf; return_code = OS_SUCCESS; - local = &OS_impl_timebase_table[timer_id]; - global = &OS_global_timebase_table[timer_id]; + + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, *token); sigemptyset(&local->timer_sigset); local->assigned_signal = 0; @@ -359,7 +368,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * If no external sync function is provided then this will set up a VxWorks * timer to locally simulate the timer tick using the CPU clock. */ - if (OS_timebase_table[timer_id].external_sync == NULL) + if (timebase->external_sync == NULL) { /* * find an RT signal that is not used by another time base object. @@ -411,7 +420,7 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) /* * Use local sigwait() wrapper as a sync function for the local task. */ - OS_timebase_table[timer_id].external_sync = OS_VxWorks_SigWait; + timebase->external_sync = OS_VxWorks_SigWait; } } @@ -444,9 +453,9 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) */ if (return_code == OS_SUCCESS) { - idbuf.id = global->active_id; - local->handler_task = taskSpawn((char *)global->name_entry, OSAL_TIMEBASE_TASK_PRIORITY, /* priority */ - OSAL_TIMEBASE_TASK_OPTION_WORD, /* task option word */ + idbuf.id = OS_ObjectIdFromToken(token); + local->handler_task = taskSpawn(timebase->timebase_name, OSAL_TIMEBASE_TASK_PRIORITY, /* priority */ + OSAL_TIMEBASE_TASK_OPTION_WORD, /* task option word */ OSAL_TIMEBASE_TASK_STACK_SIZE, /* size (bytes) of stack needed */ (FUNCPTR)OS_VxWorks_TimeBaseTask, idbuf.arg, /* 1st arg is ID */ 0, 0, 0, 0, 0, 0, 0, 0, 0); @@ -501,14 +510,14 @@ int32 OS_TimeBaseCreate_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 interval_time) +int32 OS_TimeBaseSet_Impl(const OS_object_token_t *token, uint32 start_time, uint32 interval_time) { OS_impl_timebase_internal_record_t *local; struct itimerspec timeout; int32 return_code; int status; - local = &OS_impl_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); /* There is only something to do here if we are generating a simulated tick */ if (local->assigned_signal <= 0) @@ -550,19 +559,19 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 inter if (status == OK) { local->configured_start_time = (timeout.it_value.tv_sec * 1000000) + (timeout.it_value.tv_nsec / 1000); - local->configured_interval_time = - (timeout.it_interval.tv_sec * 1000000) + (timeout.it_interval.tv_nsec / 1000); + local->configured_interval_time = (timeout.it_interval.tv_sec * 1000000) + + (timeout.it_interval.tv_nsec / 1000); if (local->configured_start_time != start_time) { OS_DEBUG("WARNING: timer %lu start_time requested=%luus, configured=%luus\n", - (unsigned long)timer_id, (unsigned long)start_time, + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), (unsigned long)start_time, (unsigned long)local->configured_start_time); } if (local->configured_interval_time != interval_time) { OS_DEBUG("WARNING: timer %lu interval_time requested=%luus, configured=%luus\n", - (unsigned long)timer_id, (unsigned long)interval_time, + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), (unsigned long)interval_time, (unsigned long)local->configured_interval_time); } } @@ -589,12 +598,12 @@ int32 OS_TimeBaseSet_Impl(osal_index_t timer_id, uint32 start_time, uint32 inter * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) +int32 OS_TimeBaseDelete_Impl(const OS_object_token_t *token) { OS_impl_timebase_internal_record_t *local; int32 return_code; - local = &OS_impl_timebase_table[timer_id]; + local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, *token); return_code = OS_SUCCESS; /* An assigned_signal value indicates the OS timer needs deletion too */ @@ -623,7 +632,7 @@ int32 OS_TimeBaseDelete_Impl(osal_index_t timer_id) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TimeBaseGetInfo_Impl(osal_index_t timer_id, OS_timebase_prop_t *timer_prop) +int32 OS_TimeBaseGetInfo_Impl(const OS_object_token_t *token, OS_timebase_prop_t *timer_prop) { return OS_SUCCESS; diff --git a/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c b/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c index b86fe134a..fd2f7951c 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c +++ b/src/unit-test-coverage/portable/src/coveragetest-bsd-select.c @@ -26,6 +26,7 @@ #include "os-portable-coveragetest.h" #include "ut-adaptor-portable-posix-io.h" #include "os-shared-select.h" +#include "os-shared-idmap.h" #include @@ -35,20 +36,21 @@ void Test_OS_SelectSingle_Impl(void) * int32 OS_SelectSingle_Impl(uint32 stream_id, uint32 *SelectFlags, int32 msecs) */ uint32 SelectFlags; - osal_index_t StreamID; + OS_object_token_t token; struct OCS_timespec nowtime; struct OCS_timespec latertime; - StreamID = UT_INDEX_0; + memset(&token, 0, sizeof(token)); + UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, false); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; - OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 0), OS_ERR_OPERATION_NOT_SUPPORTED); + OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (&token, &SelectFlags, 0), OS_ERR_OPERATION_NOT_SUPPORTED); UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, true); - OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (&token, &SelectFlags, 0), OS_SUCCESS); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; - OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, -1), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (&token, &SelectFlags, -1), OS_SUCCESS); SelectFlags = 0; - OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (&token, &SelectFlags, 0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_select), 0); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; @@ -58,7 +60,7 @@ void Test_OS_SelectSingle_Impl(void) latertime.tv_nsec = 0; UT_SetDataBuffer(UT_KEY(OCS_clock_gettime), &nowtime, sizeof(nowtime), false); UT_SetDataBuffer(UT_KEY(OCS_clock_gettime), &latertime, sizeof(latertime), false); - OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 999), OS_ERROR_TIMEOUT); + OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (&token, &SelectFlags, 999), OS_ERROR_TIMEOUT); UT_SetDefaultReturnValue(UT_KEY(OCS_select), -1); SelectFlags = OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; @@ -68,7 +70,7 @@ void Test_OS_SelectSingle_Impl(void) latertime.tv_nsec = 600000000; UT_SetDataBuffer(UT_KEY(OCS_clock_gettime), &nowtime, sizeof(nowtime), false); UT_SetDataBuffer(UT_KEY(OCS_clock_gettime), &latertime, sizeof(latertime), false); - OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (StreamID, &SelectFlags, 2100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_SelectSingle_Impl, (&token, &SelectFlags, 2100), OS_ERROR); } /* end OS_SelectSingle_Impl */ void Test_OS_SelectMultiple_Impl(void) diff --git a/src/unit-test-coverage/portable/src/coveragetest-console-bsp.c b/src/unit-test-coverage/portable/src/coveragetest-console-bsp.c index fc38f97a0..51727f590 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-console-bsp.c +++ b/src/unit-test-coverage/portable/src/coveragetest-console-bsp.c @@ -27,6 +27,7 @@ #include "os-portable-coveragetest.h" #include "os-shared-printf.h" +#include "os-shared-idmap.h" #include #include @@ -37,8 +38,11 @@ const char TEST_BUF_INITIALIZER[1 + TEST_BUFFER_LEN] = "abcdefghijklmnop"; void Test_OS_ConsoleOutput_Impl(void) { - char TestConsoleBspBuffer[TEST_BUFFER_LEN]; - char TestOutputBuffer[32]; + char TestConsoleBspBuffer[TEST_BUFFER_LEN]; + char TestOutputBuffer[32]; + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); memcpy(TestConsoleBspBuffer, TEST_BUF_INITIALIZER, sizeof(TestConsoleBspBuffer)); memset(TestOutputBuffer, 0, sizeof(TestOutputBuffer)); @@ -49,11 +53,11 @@ void Test_OS_ConsoleOutput_Impl(void) UT_SetDataBuffer(UT_KEY(OCS_OS_BSP_ConsoleOutput_Impl), TestOutputBuffer, sizeof(TestOutputBuffer), false); OS_console_table[0].WritePos = 4; - OS_ConsoleOutput_Impl(0); + OS_ConsoleOutput_Impl(&token); UtAssert_True(strcmp(TestOutputBuffer, "abcd") == 0, "TestOutputBuffer (%s) == abcd", TestOutputBuffer); OS_console_table[0].WritePos = 2; - OS_ConsoleOutput_Impl(0); + OS_ConsoleOutput_Impl(&token); UtAssert_True(strcmp(TestOutputBuffer, "abcdefghijklmnopab") == 0, "TestOutputBuffer (%s) == abcdefghijklmnopab", TestOutputBuffer); } diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index 372914b28..f6bb0788e 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -28,6 +28,7 @@ #include "ut-adaptor-portable-posix-files.h" #include "os-shared-file.h" +#include "os-shared-idmap.h" #include #include @@ -41,14 +42,18 @@ void Test_OS_FileOpen_Impl(void) * Test Case For: * int32 OS_FileOpen_Impl(uint32 local_id, const char *local_path, int32 flags, int32 access) */ - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", OS_FILE_FLAG_TRUNCATE, OS_WRITE_ONLY), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, OS_READ_ONLY), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", OS_FILE_FLAG_CREATE, OS_READ_WRITE), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, -1234), OS_ERROR); + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); + + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (&token, "local", OS_FILE_FLAG_TRUNCATE, OS_WRITE_ONLY), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (&token, "local", 0, OS_READ_ONLY), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (&token, "local", OS_FILE_FLAG_CREATE, OS_READ_WRITE), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (&token, "local", 0, -1234), OS_ERROR); /* failure mode */ UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (UT_INDEX_0, "local", 0, OS_READ_ONLY), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileOpen_Impl, (&token, "local", 0, OS_READ_ONLY), OS_ERROR); } void Test_OS_FileStat_Impl(void) diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c index b272d9792..f3c7ea87b 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-io.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-io.c @@ -43,14 +43,18 @@ void Test_OS_GenericClose_Impl(void) * Test Case For: * int32 OS_GenericClose_Impl(uint32 local_id) */ - OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); + + OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (&token), OS_SUCCESS); /* * Test path where underlying close() fails. * Should still return success. */ UT_SetDefaultReturnValue(UT_KEY(OCS_close), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (UT_INDEX_0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl, (&token), OS_SUCCESS); } void Test_OS_GenericSeek_Impl(void) @@ -59,25 +63,28 @@ void Test_OS_GenericSeek_Impl(void) * Test Case For: * int32 OS_GenericSeek_Impl (uint32 local_id, int32 offset, uint32 whence) */ + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); /* note on success this wrapper returns the result of lseek(), not OS_SUCCESS */ UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 111); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_CUR), 111); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (&token, 0, OS_SEEK_CUR), 111); UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 222); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_SET), 222); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (&token, 0, OS_SEEK_SET), 222); UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), 333); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), 333); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (&token, 0, OS_SEEK_END), 333); /* bad whence */ - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, 1234), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (&token, 0, 1234), OS_ERROR); /* generic failure of lseek() */ UT_SetDefaultReturnValue(UT_KEY(OCS_lseek), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (&token, 0, OS_SEEK_END), OS_ERROR); /* The seek implementation also checks for this specific pipe errno */ OCS_errno = OCS_ESPIPE; - OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (UT_INDEX_0, 0, OS_SEEK_END), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_GenericSeek_Impl, (&token, 0, OS_SEEK_END), OS_ERR_NOT_IMPLEMENTED); } void Test_OS_GenericRead_Impl(void) @@ -86,24 +93,27 @@ void Test_OS_GenericRead_Impl(void) * Test Case For: * int32 OS_GenericRead_Impl (uint32 local_id, void *buffer, uint32 nbytes, int32 timeout) */ - char SrcData[] = "ABCDEFGHIJK"; - char DestData[sizeof(SrcData)] = {0}; + char SrcData[] = "ABCDEFGHIJK"; + char DestData[sizeof(SrcData)] = {0}; + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); UT_SetDataBuffer(UT_KEY(OCS_read), SrcData, sizeof(SrcData), false); UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, false); - OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), sizeof(DestData)); + OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (&token, DestData, sizeof(DestData), 0), sizeof(DestData)); UtAssert_MemCmp(SrcData, DestData, sizeof(SrcData), "read() data Valid"); /* test invocation of select() in nonblocking mode */ UT_ResetState(UT_KEY(OCS_read)); UT_SetDataBuffer(UT_KEY(OCS_read), SrcData, sizeof(SrcData), false); UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, true); - OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), sizeof(DestData)); + OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (&token, DestData, sizeof(DestData), 0), sizeof(DestData)); UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* read() failure */ UT_SetDefaultReturnValue(UT_KEY(OCS_read), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericRead_Impl, (&token, DestData, sizeof(DestData), 0), OS_ERROR); } void Test_OS_GenericWrite_Impl(void) @@ -112,24 +122,27 @@ void Test_OS_GenericWrite_Impl(void) * Test Case For: * int32 OS_GenericWrite_Impl(uint32 local_id, const void *buffer, uint32 nbytes, int32 timeout) */ - char SrcData[] = "ABCDEFGHIJKL"; - char DestData[sizeof(SrcData)] = {0}; + char SrcData[] = "ABCDEFGHIJKL"; + char DestData[sizeof(SrcData)] = {0}; + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); UT_SetDataBuffer(UT_KEY(OCS_write), DestData, sizeof(DestData), false); UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, false); - OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (UT_INDEX_0, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); + OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (&token, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); UtAssert_MemCmp(SrcData, DestData, sizeof(SrcData), "write() data valid"); /* test invocation of select() in nonblocking mode */ UT_ResetState(UT_KEY(OCS_write)); UT_SetDataBuffer(UT_KEY(OCS_write), DestData, sizeof(DestData), false); UT_PortablePosixIOTest_Set_Selectable(UT_INDEX_0, true); - OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (UT_INDEX_0, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); + OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (&token, SrcData, sizeof(SrcData), 0), sizeof(SrcData)); UtAssert_True(UT_GetStubCount(UT_KEY(OS_SelectSingle_Impl)) == 1, "OS_SelectSingle() called"); /* write() failure */ UT_SetDefaultReturnValue(UT_KEY(OCS_write), -1); - OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (UT_INDEX_0, DestData, sizeof(DestData), 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_GenericWrite_Impl, (&token, DestData, sizeof(DestData), 0), OS_ERROR); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 8fd9dc218..6aaceacff 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -237,8 +237,8 @@ void Test_OS_unmount(void) UtAssert_True(actual == expected, "OS_mount() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); /* set up so record is in the right state for mounting */ - OS_filesys_table[1].flags = - OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | + OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; expected = OS_SUCCESS; actual = OS_unmount("/ram0"); UtAssert_True(actual == expected, "OS_unmount(nominal) (%ld) == OS_SUCCESS", (long)actual); @@ -267,8 +267,8 @@ void Test_OS_fsBlocksFree(void) statval.blocks_free = OSAL_BLOCKCOUNT_C(1111); statval.total_blocks = OSAL_BLOCKCOUNT_C(2222); UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statval, sizeof(statval), false); - OS_filesys_table[1].flags = - OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | + OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; actual = OS_fsBlocksFree("/cf"); UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == 1111", (long)actual); @@ -304,8 +304,8 @@ void Test_OS_fsBytesFree(void) statval.blocks_free = OSAL_BLOCKCOUNT_C(1111); statval.total_blocks = OSAL_BLOCKCOUNT_C(2222); UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statval, sizeof(statval), false); - OS_filesys_table[1].flags = - OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | + OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; actual = OS_fsBytesFree("/cf", &bytes_free); @@ -381,8 +381,8 @@ void Test_OS_FS_GetPhysDriveName(void) actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); - OS_filesys_table[1].flags = - OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | + OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; expected = OS_SUCCESS; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_SUCCESS", (long)actual); @@ -436,8 +436,8 @@ void Test_OS_TranslatePath(void) int32 actual = ~OS_SUCCESS; /* Set up the local record for success */ - OS_filesys_table[1].flags = - OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | + OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; strcpy(OS_filesys_table[1].virtual_mountpt, "/cf"); strcpy(OS_filesys_table[1].system_mountpt, "/mnt/cf"); @@ -507,12 +507,17 @@ void Test_OS_FileSys_FindVirtMountPoint(void) bool result; OS_common_record_t refobj; const char refstr[] = "/ut"; + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); + token.obj_idx = UT_INDEX_1; + token.obj_type = OS_OBJECT_TYPE_OS_FILESYS; memset(&refobj, 0, sizeof(refobj)); OS_filesys_table[1].flags = 0; OS_filesys_table[1].virtual_mountpt[0] = 0; - result = OS_FileSys_FindVirtMountPoint((void *)refstr, 1, &refobj); + result = OS_FileSys_FindVirtMountPoint((void *)refstr, &token, &refobj); UtAssert_True(!result, "OS_FileSys_FindVirtMountPoint(%s) (unmounted) == false", refstr); OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; @@ -520,17 +525,17 @@ void Test_OS_FileSys_FindVirtMountPoint(void) /* Verify cases where one is a substring of the other - * these should also return false */ strncpy(OS_filesys_table[1].virtual_mountpt, "/ut11", sizeof(OS_filesys_table[1].virtual_mountpt)); - result = OS_FileSys_FindVirtMountPoint((void *)refstr, 1, &refobj); + result = OS_FileSys_FindVirtMountPoint((void *)refstr, &token, &refobj); UtAssert_True(!result, "OS_FileSys_FindVirtMountPoint(%s) (mountpt=%s) == false", refstr, OS_filesys_table[1].virtual_mountpt); strncpy(OS_filesys_table[1].virtual_mountpt, "/u", sizeof(OS_filesys_table[1].virtual_mountpt)); - result = OS_FileSys_FindVirtMountPoint((void *)refstr, 1, &refobj); + result = OS_FileSys_FindVirtMountPoint((void *)refstr, &token, &refobj); UtAssert_True(!result, "OS_FileSys_FindVirtMountPoint(%s) (mountpt=%s) == false", refstr, OS_filesys_table[1].virtual_mountpt); strncpy(OS_filesys_table[1].virtual_mountpt, "/ut", sizeof(OS_filesys_table[1].virtual_mountpt)); - result = OS_FileSys_FindVirtMountPoint((void *)refstr, 1, &refobj); + result = OS_FileSys_FindVirtMountPoint((void *)refstr, &token, &refobj); UtAssert_True(result, "OS_FileSys_FindVirtMountPoint(%s) (nominal) == true", refstr); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 5ac362b92..b5bd75288 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -40,7 +40,7 @@ typedef struct } Test_OS_ObjTypeCount_t; /* a match function that always matches */ -static bool TestAlwaysMatch(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +static bool TestAlwaysMatch(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { return true; } diff --git a/src/unit-test-coverage/shared/src/coveragetest-sockets.c b/src/unit-test-coverage/shared/src/coveragetest-sockets.c index d3a7feb63..938032578 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-sockets.c +++ b/src/unit-test-coverage/shared/src/coveragetest-sockets.c @@ -58,10 +58,18 @@ void Test_OS_CreateSocketName(void) * * This focuses on coverage paths, as this function does not return a value */ - OS_SockAddr_t testaddr; + OS_SockAddr_t testaddr; + OS_object_token_t token; + + OS_stream_table[0].stream_name[0] = 'x'; + + token.lock_mode = OS_LOCK_MODE_NONE; + token.obj_idx = UT_INDEX_0; + token.obj_id = UT_OBJID_1; + token.obj_type = OS_OBJECT_TYPE_OS_STREAM; UT_SetDefaultReturnValue(UT_KEY(OS_SocketAddrToString_Impl), OS_ERROR); - OS_CreateSocketName(0, &testaddr, "ut"); + OS_CreateSocketName(&token, &testaddr, "ut"); /* * The function should have called snprintf() to create the name diff --git a/src/unit-test-coverage/shared/src/os-shared-coverage-support.c b/src/unit-test-coverage/shared/src/os-shared-coverage-support.c index 4d105dc82..a857abb8a 100644 --- a/src/unit-test-coverage/shared/src/os-shared-coverage-support.c +++ b/src/unit-test-coverage/shared/src/os-shared-coverage-support.c @@ -55,6 +55,7 @@ void OS_UT_SetupTestTargetIndex(osal_objtype_t obj_type, osal_index_t test_idx) token.obj_id = OS_ObjectIdFromInteger((obj_type << OS_OBJECT_TYPE_SHIFT) | test_idx); UT_SetDataBuffer(UT_KEY(OS_ObjectIdGetById), &token, sizeof(OS_object_token_t), true); + UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdGetById), 1, OS_SUCCESS); } void OS_UT_SetupBasicInfoTest(osal_objtype_t obj_type, osal_index_t test_idx, const char *name, osal_id_t creator) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c index d1b8bfede..cee315962 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-binsem-impl-stubs.c @@ -38,10 +38,10 @@ ** Semaphore API */ -UT_DEFAULT_STUB(OS_BinSemCreate_Impl, (osal_index_t sem_id, uint32 sem_initial_value, uint32 options)) -UT_DEFAULT_STUB(OS_BinSemFlush_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_BinSemGive_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_BinSemTake_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_BinSemTimedWait_Impl, (osal_index_t sem_id, uint32 msecs)) -UT_DEFAULT_STUB(OS_BinSemDelete_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_BinSemGetInfo_Impl, (osal_index_t sem_id, OS_bin_sem_prop_t *bin_prop)) +UT_DEFAULT_STUB(OS_BinSemCreate_Impl, (const OS_object_token_t *token, uint32 sem_initial_value, uint32 options)) +UT_DEFAULT_STUB(OS_BinSemFlush_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_BinSemGive_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_BinSemTake_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_BinSemTimedWait_Impl, (const OS_object_token_t *token, uint32 msecs)) +UT_DEFAULT_STUB(OS_BinSemDelete_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_BinSemGetInfo_Impl, (const OS_object_token_t *token, OS_bin_sem_prop_t *bin_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c index ec77389bb..99dc96511 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-console-impl-stubs.c @@ -37,11 +37,11 @@ /* ** Console output API (printf) */ -void OS_ConsoleWakeup_Impl(osal_index_t local_id) +void OS_ConsoleWakeup_Impl(const OS_object_token_t *token) { UT_DEFAULT_IMPL(OS_ConsoleWakeup_Impl); } -int32 OS_ConsoleCreate_Impl(osal_index_t local_id) +int32 OS_ConsoleCreate_Impl(const OS_object_token_t *token) { return UT_DEFAULT_IMPL(OS_ConsoleCreate_Impl); } diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c index c48a8168b..d6dcf2a54 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-countsem-impl-stubs.c @@ -38,9 +38,9 @@ ** Semaphore API */ -UT_DEFAULT_STUB(OS_CountSemCreate_Impl, (osal_index_t sem_id, uint32 sem_initial_value, uint32 options)) -UT_DEFAULT_STUB(OS_CountSemGive_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_CountSemTake_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_CountSemTimedWait_Impl, (osal_index_t sem_id, uint32 msecs)) -UT_DEFAULT_STUB(OS_CountSemDelete_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_CountSemGetInfo_Impl, (osal_index_t sem_id, OS_count_sem_prop_t *count_prop)) +UT_DEFAULT_STUB(OS_CountSemCreate_Impl, (const OS_object_token_t *token, uint32 sem_initial_value, uint32 options)) +UT_DEFAULT_STUB(OS_CountSemGive_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_CountSemTake_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_CountSemTimedWait_Impl, (const OS_object_token_t *token, uint32 msecs)) +UT_DEFAULT_STUB(OS_CountSemDelete_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_CountSemGetInfo_Impl, (const OS_object_token_t *token, OS_count_sem_prop_t *count_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c index ae3b5ac87..e5f0d52f5 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-file-impl-stubs.c @@ -39,27 +39,27 @@ * File API abstraction layer */ -UT_DEFAULT_STUB(OS_FileOpen_Impl, (osal_index_t file_id, const char *local_path, int32 flags, int32 access)) +UT_DEFAULT_STUB(OS_FileOpen_Impl, (const OS_object_token_t *token, const char *local_path, int32 flags, int32 access)) UT_DEFAULT_STUB(OS_FileStat_Impl, (const char *local_path, os_fstat_t *filestat)) UT_DEFAULT_STUB(OS_FileRemove_Impl, (const char *local_path)) UT_DEFAULT_STUB(OS_FileRename_Impl, (const char *old_path, const char *new_path)) UT_DEFAULT_STUB(OS_FileChmod_Impl, (const char *local_path, uint32 access)) -UT_DEFAULT_STUB(OS_ShellOutputToFile_Impl, (osal_index_t file_id, const char *Cmd)) +UT_DEFAULT_STUB(OS_ShellOutputToFile_Impl, (const OS_object_token_t *token, const char *Cmd)) /* * Directory API abstraction layer */ UT_DEFAULT_STUB(OS_DirCreate_Impl, (const char *local_path, uint32 access)) -UT_DEFAULT_STUB(OS_DirOpen_Impl, (osal_index_t dir_id, const char *local_path)) -UT_DEFAULT_STUB(OS_DirClose_Impl, (osal_index_t dir_id)) -UT_DEFAULT_STUB(OS_DirRead_Impl, (osal_index_t dir_id, os_dirent_t *dirent)) -UT_DEFAULT_STUB(OS_DirRewind_Impl, (osal_index_t dir_id)) +UT_DEFAULT_STUB(OS_DirOpen_Impl, (const OS_object_token_t *token, const char *local_path)) +UT_DEFAULT_STUB(OS_DirClose_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_DirRead_Impl, (const OS_object_token_t *token, os_dirent_t *dirent)) +UT_DEFAULT_STUB(OS_DirRewind_Impl, (const OS_object_token_t *token)) UT_DEFAULT_STUB(OS_DirRemove_Impl, (const char *local_path)) /* * Stream abstraction layer (applies to sockets and files) */ -int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, int32 timeout) +int32 OS_GenericRead_Impl(const OS_object_token_t *token, void *buffer, size_t nbytes, int32 timeout) { int32 Status = UT_DEFAULT_IMPL(OS_GenericRead_Impl); @@ -71,7 +71,7 @@ int32 OS_GenericRead_Impl(osal_index_t local_id, void *buffer, size_t nbytes, in return Status; } -int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nbytes, int32 timeout) +int32 OS_GenericWrite_Impl(const OS_object_token_t *token, const void *buffer, size_t nbytes, int32 timeout) { int32 Status = UT_DEFAULT_IMPL(OS_GenericWrite_Impl); @@ -83,5 +83,5 @@ int32 OS_GenericWrite_Impl(osal_index_t local_id, const void *buffer, size_t nby return Status; } -UT_DEFAULT_STUB(OS_GenericSeek_Impl, (osal_index_t file_id, int32 offset, uint32 whence)) -UT_DEFAULT_STUB(OS_GenericClose_Impl, (osal_index_t file_id)) +UT_DEFAULT_STUB(OS_GenericSeek_Impl, (const OS_object_token_t *token, int32 offset, uint32 whence)) +UT_DEFAULT_STUB(OS_GenericClose_Impl, (const OS_object_token_t *token)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c index e3f5d1037..0dd5577e0 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-filesys-impl-stubs.c @@ -36,14 +36,14 @@ /* * File system abstraction layer */ -UT_DEFAULT_STUB(OS_FileSysStartVolume_Impl, (osal_index_t filesys_id)) -UT_DEFAULT_STUB(OS_FileSysStopVolume_Impl, (osal_index_t filesys_id)) -UT_DEFAULT_STUB(OS_FileSysFormatVolume_Impl, (osal_index_t filesys_id)) -UT_DEFAULT_STUB(OS_FileSysCheckVolume_Impl, (osal_index_t filesys_id, bool repair)) -UT_DEFAULT_STUB(OS_FileSysMountVolume_Impl, (osal_index_t filesys_id)) -UT_DEFAULT_STUB(OS_FileSysUnmountVolume_Impl, (osal_index_t filesys_id)) +UT_DEFAULT_STUB(OS_FileSysStartVolume_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_FileSysStopVolume_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_FileSysFormatVolume_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_FileSysCheckVolume_Impl, (const OS_object_token_t *token, bool repair)) +UT_DEFAULT_STUB(OS_FileSysMountVolume_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_FileSysUnmountVolume_Impl, (const OS_object_token_t *token)) -int32 OS_FileSysStatVolume_Impl(osal_index_t filesys_id, OS_statvfs_t *result) +int32 OS_FileSysStatVolume_Impl(const OS_object_token_t *token, OS_statvfs_t *result) { int32 Status = UT_DEFAULT_IMPL(OS_FileSysStatVolume_Impl); diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c index c92e8ce31..7c2b2ccc5 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c @@ -36,9 +36,9 @@ /* * Module Loader API */ -UT_DEFAULT_STUB(OS_ModuleLoad_Impl, (osal_index_t module_id, const char *translated_path)) -UT_DEFAULT_STUB(OS_ModuleUnload_Impl, (osal_index_t module_id)) -UT_DEFAULT_STUB(OS_ModuleGetInfo_Impl, (osal_index_t module_id, OS_module_prop_t *module_prop)) +UT_DEFAULT_STUB(OS_ModuleLoad_Impl, (const OS_object_token_t *token, const char *translated_path)) +UT_DEFAULT_STUB(OS_ModuleUnload_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_ModuleGetInfo_Impl, (const OS_object_token_t *token, OS_module_prop_t *module_prop)) UT_DEFAULT_STUB(OS_GlobalSymbolLookup_Impl, (cpuaddr * SymbolAddress, const char *SymbolName)) -UT_DEFAULT_STUB(OS_ModuleSymbolLookup_Impl, (osal_index_t module_id, cpuaddr *SymbolAddress, const char *SymbolName)) +UT_DEFAULT_STUB(OS_ModuleSymbolLookup_Impl, (const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName)) UT_DEFAULT_STUB(OS_SymbolTableDump_Impl, (const char *filename, size_t size_limit)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c index 6bbe47829..f106785f4 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-mutex-impl-stubs.c @@ -38,8 +38,8 @@ ** Mutex API */ -UT_DEFAULT_STUB(OS_MutSemCreate_Impl, (osal_index_t sem_id, uint32 options)) -UT_DEFAULT_STUB(OS_MutSemGive_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_MutSemTake_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_MutSemDelete_Impl, (osal_index_t sem_id)) -UT_DEFAULT_STUB(OS_MutSemGetInfo_Impl, (osal_index_t sem_id, OS_mut_sem_prop_t *mut_prop)) +UT_DEFAULT_STUB(OS_MutSemCreate_Impl, (const OS_object_token_t *token, uint32 options)) +UT_DEFAULT_STUB(OS_MutSemGive_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_MutSemTake_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_MutSemDelete_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_MutSemGetInfo_Impl, (const OS_object_token_t *token, OS_mut_sem_prop_t *mut_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c index 32cb5e40c..f797457e7 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-network-impl-stubs.c @@ -37,17 +37,17 @@ /* * Sockets API abstraction layer */ -UT_DEFAULT_STUB(OS_SocketOpen_Impl, (osal_index_t sock_id)) -UT_DEFAULT_STUB(OS_SocketClose_Impl, (osal_index_t sock_id)) -UT_DEFAULT_STUB(OS_SocketBind_Impl, (osal_index_t sock_id, const OS_SockAddr_t *Addr)) -UT_DEFAULT_STUB(OS_SocketAccept_Impl, - (osal_index_t sock_id, osal_index_t connsock_id, OS_SockAddr_t *Addr, int32 timeout)) -UT_DEFAULT_STUB(OS_SocketConnect_Impl, (osal_index_t sock_id, const OS_SockAddr_t *Addr, int32 timeout)) +UT_DEFAULT_STUB(OS_SocketOpen_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_SocketClose_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_SocketBind_Impl, (const OS_object_token_t *token, const OS_SockAddr_t *Addr)) +UT_DEFAULT_STUB(OS_SocketAccept_Impl, (const OS_object_token_t *sock_token, const OS_object_token_t *conn_token, + OS_SockAddr_t *Addr, int32 timeout)) +UT_DEFAULT_STUB(OS_SocketConnect_Impl, (const OS_object_token_t *token, const OS_SockAddr_t *Addr, int32 timeout)) UT_DEFAULT_STUB(OS_SocketRecvFrom_Impl, - (osal_index_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout)) + (const OS_object_token_t *token, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout)) UT_DEFAULT_STUB(OS_SocketSendTo_Impl, - (osal_index_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr)) -UT_DEFAULT_STUB(OS_SocketGetInfo_Impl, (osal_index_t sock_id, OS_socket_prop_t *sock_prop)) + (const OS_object_token_t *token, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr)) +UT_DEFAULT_STUB(OS_SocketGetInfo_Impl, (const OS_object_token_t *token, OS_socket_prop_t *sock_prop)) UT_DEFAULT_STUB(OS_SocketAddrInit_Impl, (OS_SockAddr_t * Addr, OS_SocketDomain_t Domain)) UT_DEFAULT_STUB(OS_SocketAddrToString_Impl, (char *buffer, size_t buflen, const OS_SockAddr_t *Addr)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c index 222204017..d3eea368a 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c @@ -38,8 +38,8 @@ ** Message Queue API */ -UT_DEFAULT_STUB(OS_QueueCreate_Impl, (osal_index_t queue_id, uint32 flags)) -UT_DEFAULT_STUB(OS_QueueDelete_Impl, (osal_index_t queue_id)) -UT_DEFAULT_STUB(OS_QueueGet_Impl, (osal_index_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout)) -UT_DEFAULT_STUB(OS_QueuePut_Impl, (osal_index_t queue_id, const void *data, size_t size, uint32 flags)) -UT_DEFAULT_STUB(OS_QueueGetInfo_Impl, (osal_index_t queue_id, OS_queue_prop_t *queue_prop)) +UT_DEFAULT_STUB(OS_QueueCreate_Impl, (const OS_object_token_t *token, uint32 flags)) +UT_DEFAULT_STUB(OS_QueueDelete_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_QueueGet_Impl, (const OS_object_token_t *token, void *data, size_t size, size_t *size_copied, int32 timeout)) +UT_DEFAULT_STUB(OS_QueuePut_Impl, (const OS_object_token_t *token, const void *data, size_t size, uint32 flags)) +UT_DEFAULT_STUB(OS_QueueGetInfo_Impl, (const OS_object_token_t *token, OS_queue_prop_t *queue_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c index 1e3d84f25..4f4b720d6 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c @@ -33,5 +33,5 @@ #include "utstubs.h" #include "os-shared-select.h" -UT_DEFAULT_STUB(OS_SelectSingle_Impl, (osal_index_t stream_id, uint32 *SelectFlags, int32 msecs)) +UT_DEFAULT_STUB(OS_SelectSingle_Impl, (const OS_object_token_t *token, uint32 *SelectFlags, int32 msecs)) UT_DEFAULT_STUB(OS_SelectMultiple_Impl, (OS_FdSet * ReadSet, OS_FdSet *WriteSet, int32 msecs)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c index 56ad1c2ff..fdf9844c4 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c @@ -37,22 +37,22 @@ /* ** Task API */ -UT_DEFAULT_STUB(OS_TaskMatch_Impl, (osal_index_t task_id)) -UT_DEFAULT_STUB(OS_TaskCreate_Impl, (osal_index_t task_id, uint32 flags)) -UT_DEFAULT_STUB(OS_TaskDelete_Impl, (osal_index_t task_id)) +UT_DEFAULT_STUB(OS_TaskMatch_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_TaskCreate_Impl, (const OS_object_token_t *token, uint32 flags)) +UT_DEFAULT_STUB(OS_TaskDelete_Impl, (const OS_object_token_t *token)) void OS_TaskExit_Impl(void) { UT_DEFAULT_IMPL(OS_TaskExit_Impl); } UT_DEFAULT_STUB(OS_TaskDelay_Impl, (uint32 millisecond)) -UT_DEFAULT_STUB(OS_TaskSetPriority_Impl, (osal_index_t task_id, osal_priority_t new_priority)) +UT_DEFAULT_STUB(OS_TaskSetPriority_Impl, (const OS_object_token_t *token, osal_priority_t new_priority)) osal_id_t OS_TaskGetId_Impl(void) { int32 status; osal_id_t id; - status = UT_DEFAULT_IMPL(OS_TaskGetId_Impl); + status = UT_DEFAULT_IMPL_RC(OS_TaskGetId_Impl, 1); /* convert the int32 status value to an osal_id_t - * (this assumes the types are compatible) */ @@ -60,10 +60,10 @@ osal_id_t OS_TaskGetId_Impl(void) return id; } -UT_DEFAULT_STUB(OS_TaskGetInfo_Impl, (osal_index_t task_id, OS_task_prop_t *task_prop)) +UT_DEFAULT_STUB(OS_TaskGetInfo_Impl, (const OS_object_token_t *token, OS_task_prop_t *task_prop)) UT_DEFAULT_STUB(OS_TaskRegister_Impl, (osal_id_t global_task_id)) -bool OS_TaskIdMatchSystemData_Impl(void *ref, osal_index_t local_id, const OS_common_record_t *obj) +bool OS_TaskIdMatchSystemData_Impl(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { return UT_DEFAULT_IMPL(OS_TaskIdMatchSystemData_Impl); } diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c index 29bb94214..f04c150ca 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-timer-impl-stubs.c @@ -37,22 +37,21 @@ /* ** OS Time/Tick related API */ -UT_DEFAULT_STUB(OS_TimeBaseCreate_Impl, (osal_index_t timer_id)) -UT_DEFAULT_STUB(OS_TimeBaseSet_Impl, (osal_index_t timer_id, uint32 start_time, uint32 interval_time)) -UT_DEFAULT_STUB(OS_TimeBaseDelete_Impl, (osal_index_t timer_id)) -void OS_TimeBaseLock_Impl(osal_index_t timebase_id) +UT_DEFAULT_STUB(OS_TimeBaseCreate_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_TimeBaseSet_Impl, (const OS_object_token_t *token, uint32 start_time, uint32 interval_time)) +UT_DEFAULT_STUB(OS_TimeBaseDelete_Impl, (const OS_object_token_t *token)) +void OS_TimeBaseLock_Impl(const OS_object_token_t *token) { UT_DEFAULT_IMPL(OS_TimeBaseLock_Impl); } -void OS_TimeBaseUnlock_Impl(osal_index_t timebase_id) +void OS_TimeBaseUnlock_Impl(const OS_object_token_t *token) { UT_DEFAULT_IMPL(OS_TimeBaseUnlock_Impl); } -UT_DEFAULT_STUB(OS_TimeBaseGetInfo_Impl, (osal_index_t timer_id, OS_timebase_prop_t *timer_prop)) +UT_DEFAULT_STUB(OS_TimeBaseGetInfo_Impl, (const OS_object_token_t *token, OS_timebase_prop_t *timer_prop)) -UT_DEFAULT_STUB(OS_TimeBaseRegister_Impl, (osal_index_t timebase_id)) /* * Clock API low-level handlers */ diff --git a/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c index c4fdbee58..60fab614f 100644 --- a/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/portable-console-bsp-impl-stubs.c @@ -37,7 +37,7 @@ /* ** Console output API (printf) */ -void OS_ConsoleOutput_Impl(osal_index_t local_id) +void OS_ConsoleOutput_Impl(const OS_object_token_t *token) { UT_DEFAULT_IMPL(OS_ConsoleOutput_Impl); } diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h index e63fc68a6..b0a4bbb67 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h @@ -45,7 +45,7 @@ extern size_t const UT_Ref_OS_impl_task_table_SIZE; int32 UT_Call_OS_VxWorks_TaskAPI_Impl_Init(void); void UT_TaskTest_SetImplTaskId(osal_index_t local_id, OCS_TASK_ID TaskId); -int UT_TaskTest_CallEntryPoint(int arg); +int UT_TaskTest_CallEntryPoint(osal_id_t arg); OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(osal_index_t local_id); #endif /* INCLUDE_UT_ADAPTOR_TASKS_H_ */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h index 6bb020cfd..af148e2f1 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h @@ -49,7 +49,7 @@ int32 UT_TimeBaseTest_CallSigWaitFunc(osal_index_t local_id); int UT_TimeBaseTest_CallHelperTaskFunc(int arg); /* Invokes the static OS_VxWorks_RegisterTimer() function with given argument */ -void UT_TimeBaseTest_CallRegisterTimer(osal_index_t local_id); +void UT_TimeBaseTest_CallRegisterTimer(osal_id_t obj_id); /* Hook functions which set the timer registration state */ void UT_TimeBaseTest_SetTimeBaseRegState(osal_index_t local_id, bool is_success); diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c index 2b2d19edf..f256dbaa9 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c @@ -50,9 +50,9 @@ void UT_TaskTest_SetImplTaskId(osal_index_t local_id, OCS_TASK_ID TaskId) * in order for the UT to invoke it there must be a non-static * way to get access to it. */ -int UT_TaskTest_CallEntryPoint(int arg) +int UT_TaskTest_CallEntryPoint(osal_id_t arg) { - return OS_VxWorks_TaskEntry(arg); + return OS_VxWorks_TaskEntry(OS_ObjectIdToInteger(arg)); } OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(osal_index_t local_id) diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c index 0ec0b7a2b..f7814058a 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c @@ -50,9 +50,9 @@ int UT_TimeBaseTest_CallHelperTaskFunc(int arg) return OS_VxWorks_TimeBaseTask(arg); } -void UT_TimeBaseTest_CallRegisterTimer(osal_index_t local_id) +void UT_TimeBaseTest_CallRegisterTimer(osal_id_t obj_id) { - OS_VxWorks_RegisterTimer(local_id); + OS_VxWorks_RegisterTimer(obj_id); } bool UT_TimeBaseTest_CheckTimeBaseRegisteredState(osal_index_t local_id) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c b/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c index 906b4187b..41e19cf25 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-binsem.c @@ -50,10 +50,12 @@ void Test_OS_BinSemCreate_Impl(void) * Test Case For: * int32 OS_BinSemCreate_Impl (uint32 sem_id, uint32 initial_value, uint32 options) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(&token, 0, 0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_semBInitialize), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate_Impl(&token, 0, 0), OS_SEM_FAILURE); } void Test_OS_BinSemDelete_Impl(void) @@ -62,7 +64,9 @@ void Test_OS_BinSemDelete_Impl(void) * Test Case For: * int32 OS_BinSemDelete_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemDelete_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_BinSemDelete_Impl(&token), OS_SUCCESS); } void Test_OS_BinSemGive_Impl(void) @@ -71,10 +75,12 @@ void Test_OS_BinSemGive_Impl(void) * Test Case For: * int32 OS_BinSemGive_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_StubKey_GenericSemGive, OS_SEM_FAILURE); - OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(UT_INDEX_0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemGive_Impl(&token), OS_SEM_FAILURE); } void Test_OS_BinSemFlush_Impl(void) @@ -83,10 +89,12 @@ void Test_OS_BinSemFlush_Impl(void) * Test Case For: * int32 OS_BinSemFlush_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_semFlush), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(UT_INDEX_0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemFlush_Impl(&token), OS_SEM_FAILURE); } void Test_OS_BinSemTake_Impl(void) @@ -95,7 +103,9 @@ void Test_OS_BinSemTake_Impl(void) * Test Case For: * int32 OS_BinSemTake_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemTake_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_BinSemTake_Impl(&token), OS_SUCCESS); } void Test_OS_BinSemTimedWait_Impl(void) @@ -104,13 +114,15 @@ void Test_OS_BinSemTimedWait_Impl(void) * Test Case For: * int32 OS_BinSemTimedWait_Impl ( uint32 sem_id, uint32 msecs ) */ - OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(UT_INDEX_0, 100), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(&token, 100), OS_SUCCESS); UT_SetDefaultReturnValue(UT_StubKey_GenericSemTake, OS_SEM_FAILURE); - OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(UT_INDEX_0, 100), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(&token, 100), OS_SEM_FAILURE); UT_SetDefaultReturnValue(UT_KEY(OS_Milli2Ticks), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(UT_INDEX_0, 100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_BinSemTimedWait_Impl(&token, 100), OS_ERROR); } void Test_OS_BinSemGetInfo_Impl(void) @@ -120,8 +132,10 @@ void Test_OS_BinSemGetInfo_Impl(void) * int32 OS_BinSemGetInfo_Impl (uint32 sem_id, OS_bin_sem_prop_t *sem_prop) */ OS_bin_sem_prop_t sem_prop; + OS_object_token_t token = UT_TOKEN_0; + memset(&sem_prop, 0xEE, sizeof(sem_prop)); - OSAPI_TEST_FUNCTION_RC(OS_BinSemGetInfo_Impl(UT_INDEX_0, &sem_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_BinSemGetInfo_Impl(&token, &sem_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-console.c b/src/unit-test-coverage/vxworks/src/coveragetest-console.c index f3a358f32..0f0f437fa 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-console.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-console.c @@ -41,35 +41,41 @@ void Test_OS_ConsoleWakeup_Impl(void) * Test Case For: * void OS_ConsoleWakeup_Impl(const char *string) */ + OS_object_token_t token = UT_TOKEN_0; /* no return code - check for coverage */ UT_ConsoleTest_SetConsoleAsync(0, true); - OS_ConsoleWakeup_Impl(0); + OS_ConsoleWakeup_Impl(&token); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_semGive)) == 1, "semGive() called in async mode"); UT_SetDefaultReturnValue(UT_KEY(OCS_semGive), -1); - OS_ConsoleWakeup_Impl(0); + OS_ConsoleWakeup_Impl(&token); UT_ConsoleTest_SetConsoleAsync(0, false); OS_console_table[0].WritePos = 1; - OS_ConsoleWakeup_Impl(0); + OS_ConsoleWakeup_Impl(&token); UtAssert_True(UT_GetStubCount(UT_KEY(OS_ConsoleOutput_Impl)) == 1, "OS_ConsoleOutput_Impl() called in sync mode"); } void Test_OS_ConsoleCreate_Impl(void) { - OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(0), OS_SUCCESS); + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); + + OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(&token), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskSpawn)) == 1, "taskSpawn() called"); UT_SetDefaultReturnValue(UT_KEY(OCS_semCInitialize), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(&token), OS_SEM_FAILURE); UT_ClearForceFail(UT_KEY(OCS_semCInitialize)); UT_SetDefaultReturnValue(UT_KEY(OCS_taskSpawn), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(&token), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_taskSpawn)); - OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(OS_MAX_CONSOLES + 1), OS_ERR_NOT_IMPLEMENTED); + token.obj_idx = OS_MAX_CONSOLES + 1; + OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(&token), OS_ERR_NOT_IMPLEMENTED); /* Also call the actual console task, to get coverage on it. * This task has an infinite loop, which only exits if semTake fails */ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c b/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c index daa20093a..e09a9ee78 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-countsem.c @@ -46,10 +46,12 @@ void Test_OS_CountSemCreate_Impl(void) * Test Case For: * int32 OS_CountSemCreate_Impl (uint32 sem_id, uint32 sem_initial_value, uint32 options) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(&token, 0, 0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_semCInitialize), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(UT_INDEX_0, 0, 0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate_Impl(&token, 0, 0), OS_SEM_FAILURE); } void Test_OS_CountSemDelete_Impl(void) @@ -58,7 +60,9 @@ void Test_OS_CountSemDelete_Impl(void) * Test Case For: * int32 OS_CountSemDelete_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemDelete_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_CountSemDelete_Impl(&token), OS_SUCCESS); } void Test_OS_CountSemGive_Impl(void) @@ -67,7 +71,9 @@ void Test_OS_CountSemGive_Impl(void) * Test Case For: * int32 OS_CountSemGive_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemGive_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_CountSemGive_Impl(&token), OS_SUCCESS); } void Test_OS_CountSemTake_Impl(void) @@ -76,7 +82,9 @@ void Test_OS_CountSemTake_Impl(void) * Test Case For: * int32 OS_CountSemTake_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemTake_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_CountSemTake_Impl(&token), OS_SUCCESS); } void Test_OS_CountSemTimedWait_Impl(void) @@ -85,10 +93,12 @@ void Test_OS_CountSemTimedWait_Impl(void) * Test Case For: * int32 OS_CountSemTimedWait_Impl ( uint32 sem_id, uint32 msecs ) */ - OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(UT_INDEX_0, 100), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(&token, 100), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OS_Milli2Ticks), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(UT_INDEX_0, 100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_CountSemTimedWait_Impl(&token, 100), OS_ERROR); } void Test_OS_CountSemGetInfo_Impl(void) @@ -98,8 +108,10 @@ void Test_OS_CountSemGetInfo_Impl(void) * int32 OS_CountSemGetInfo_Impl (uint32 sem_id, OS_count_sem_prop_t *count_prop) */ OS_count_sem_prop_t count_prop; + OS_object_token_t token = UT_TOKEN_0; + memset(&count_prop, 0xEE, sizeof(count_prop)); - OSAPI_TEST_FUNCTION_RC(OS_CountSemGetInfo_Impl(UT_INDEX_0, &count_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_CountSemGetInfo_Impl(&token, &count_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c index f31a0bbe2..8818db37e 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c @@ -63,9 +63,11 @@ void Test_OS_DirOpen_Impl(void) * Test Case For: * int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) */ - OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(UT_INDEX_0, "dir"), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(&token, "dir"), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_opendir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(UT_INDEX_0, "dir"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(&token, "dir"), OS_ERROR); } void Test_OS_DirClose_Impl(void) @@ -74,7 +76,9 @@ void Test_OS_DirClose_Impl(void) * Test Case For: * int32 OS_DirClose_Impl(uint32 local_id) */ - OSAPI_TEST_FUNCTION_RC(OS_DirClose_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_DirClose_Impl(&token), OS_SUCCESS); } void Test_OS_DirRead_Impl(void) @@ -83,12 +87,13 @@ void Test_OS_DirRead_Impl(void) * Test Case For: * int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent) */ - os_dirent_t dirent_buff; + os_dirent_t dirent_buff; + OS_object_token_t token = UT_TOKEN_0; - OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(UT_INDEX_0, &dirent_buff), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(&token, &dirent_buff), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_readdir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(UT_INDEX_0, &dirent_buff), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(&token, &dirent_buff), OS_ERROR); } void Test_OS_DirRewind_Impl(void) @@ -97,7 +102,9 @@ void Test_OS_DirRewind_Impl(void) * Test Case For: * int32 OS_DirRewind_Impl(uint32 local_id) */ - OSAPI_TEST_FUNCTION_RC(OS_DirRewind_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_DirRewind_Impl(&token), OS_SUCCESS); } void Test_OS_DirRemove_Impl(void) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c index f10632e2b..52c2c69cf 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c @@ -45,19 +45,23 @@ void Test_OS_FileSysStartVolume_Impl(void) * Test Case For: * int32 OS_FileSysStartVolume_Impl (uint32 filesys_id) */ - int32 expected; + int32 expected; + OS_object_token_t token; + + token = UT_TOKEN_0; /* Emulate an UNKNOWN entry */ OS_filesys_table[0].fstype = OS_FILESYS_TYPE_UNKNOWN; - OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(0), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(&token), OS_ERR_NOT_IMPLEMENTED); /* Emulate an FS_BASED entry */ OS_filesys_table[0].fstype = OS_FILESYS_TYPE_FS_BASED; - OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(&token), OS_SUCCESS); /* Emulate a VOLATILE_DISK entry (ramdisk) */ OS_filesys_table[1].fstype = OS_FILESYS_TYPE_VOLATILE_DISK; - OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(1), OS_SUCCESS); + token.obj_idx = UT_INDEX_1; + OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(&token), OS_SUCCESS); /* Emulate a NORMAL_DISK entry (ATA) */ OS_filesys_table[2].fstype = OS_FILESYS_TYPE_NORMAL_DISK; @@ -67,15 +71,17 @@ void Test_OS_FileSysStartVolume_Impl(void) #else expected = OS_ERR_NOT_IMPLEMENTED; #endif - OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(2), expected); + token = UT_TOKEN_2; + OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(&token), expected); /* Failure to create XBD layer */ UT_SetDefaultReturnValue(UT_KEY(OCS_xbdBlkDevCreateSync), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(1), OS_FS_ERR_DRIVE_NOT_CREATED); + token = UT_TOKEN_1; + OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(&token), OS_FS_ERR_DRIVE_NOT_CREATED); /* Failure to create low level block dev */ UT_SetDefaultReturnValue(UT_KEY(OCS_ramDevCreate), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(1), OS_FS_ERR_DRIVE_NOT_CREATED); + OSAPI_TEST_FUNCTION_RC(OS_FileSysStartVolume_Impl(&token), OS_FS_ERR_DRIVE_NOT_CREATED); } void Test_OS_FileSysStopVolume_Impl(void) @@ -83,12 +89,15 @@ void Test_OS_FileSysStopVolume_Impl(void) /* Test Case For: * int32 OS_FileSysStopVolume_Impl (uint32 filesys_id) */ - OSAPI_TEST_FUNCTION_RC(OS_FileSysStopVolume_Impl(0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_FileSysStopVolume_Impl(&token), OS_SUCCESS); /* Failure to delete XBD layer */ OS_filesys_table[1].fstype = OS_FILESYS_TYPE_VOLATILE_DISK; UT_FileSysTest_SetupFileSysEntry(1, NULL, 1, 4); - OSAPI_TEST_FUNCTION_RC(OS_FileSysStopVolume_Impl(1), OS_SUCCESS); + token = UT_TOKEN_1; + OSAPI_TEST_FUNCTION_RC(OS_FileSysStopVolume_Impl(&token), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_xbdBlkDevDelete)) == 1, "xbdBlkDevDelete() called"); } @@ -97,21 +106,22 @@ void Test_OS_FileSysFormatVolume_Impl(void) /* Test Case For: * int32 OS_FileSysFormatVolume_Impl (uint32 filesys_id) */ + OS_object_token_t token = UT_TOKEN_0; /* test unimplemented fs type */ OS_filesys_table[0].fstype = OS_FILESYS_TYPE_UNKNOWN; - OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(0), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(&token), OS_ERR_NOT_IMPLEMENTED); /* fs-based should be noop */ OS_filesys_table[0].fstype = OS_FILESYS_TYPE_FS_BASED; - OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(&token), OS_SUCCESS); OS_filesys_table[0].fstype = OS_FILESYS_TYPE_VOLATILE_DISK; - OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(&token), OS_SUCCESS); /* Failure of the dosFsVolFormat() call */ UT_SetDefaultReturnValue(UT_KEY(OCS_dosFsVolFormat), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(0), OS_FS_ERR_DRIVE_NOT_CREATED); + OSAPI_TEST_FUNCTION_RC(OS_FileSysFormatVolume_Impl(&token), OS_FS_ERR_DRIVE_NOT_CREATED); } void Test_OS_FileSysMountVolume_Impl(void) @@ -119,11 +129,12 @@ void Test_OS_FileSysMountVolume_Impl(void) /* Test Case For: * int32 OS_FileSysMountVolume_Impl (uint32 filesys_id) */ + OS_object_token_t token = UT_TOKEN_0; - OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); } @@ -132,15 +143,16 @@ void Test_OS_FileSysUnmountVolume_Impl(void) /* Test Case For: * int32 OS_FileSysUnmountVolume_Impl (uint32 filesys_id) */ + OS_object_token_t token = UT_TOKEN_0; - OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); UT_SetDefaultReturnValue(UT_KEY(OCS_ioctl), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_ioctl)); } @@ -150,11 +162,13 @@ void Test_OS_FileSysStatVolume_Impl(void) * Test Case For: * int32 OS_FileSysStatVolume_Impl (uint32 filesys_id, OS_statvfs_t *result) */ - OS_statvfs_t stat; - OSAPI_TEST_FUNCTION_RC(OS_FileSysStatVolume_Impl(0, &stat), OS_SUCCESS); + OS_statvfs_t stat; + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_FileSysStatVolume_Impl(&token, &stat), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_statvfs), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysStatVolume_Impl(0, &stat), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysStatVolume_Impl(&token, &stat), OS_ERROR); } void Test_OS_FileSysCheckVolume_Impl(void) @@ -163,14 +177,16 @@ void Test_OS_FileSysCheckVolume_Impl(void) * Test Case For: * int32 OS_FileSysCheckVolume_Impl (uint32 filesys_id, bool repair) */ - OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(0, true), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(&token, true), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(0, false), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(&token, false), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); UT_SetDefaultReturnValue(UT_KEY(OCS_ioctl), -1); - OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(0, false), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(&token, false), OS_ERROR); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c index 5c718df1c..21fcb7858 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c @@ -50,12 +50,14 @@ void Test_OS_ModuleLoad_Impl(void) /* Test Case For: * int32 OS_ModuleLoad_Impl ( uint32 module_id, char *translated_path ) */ - OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(UT_INDEX_0, "local"), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(&token, "local"), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); - OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(UT_INDEX_0, "local"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(&token, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); UT_SetDefaultReturnValue(UT_KEY(OCS_loadModule), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(UT_INDEX_0, "local"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(&token, "local"), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_loadModule)); } @@ -64,9 +66,11 @@ void Test_OS_ModuleUnload_Impl(void) /* Test Case For: * int32 OS_ModuleUnload_Impl ( uint32 module_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_unldByModuleId), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(UT_INDEX_0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(&token), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_unldByModuleId)); } @@ -75,10 +79,11 @@ void Test_OS_ModuleGetInfo_Impl(void) /* Test Case For: * int32 OS_ModuleGetInfo_Impl ( uint32 module_id, OS_module_prop_t *module_prop ) */ - OS_module_prop_t module_prop; + OS_module_prop_t module_prop; + OS_object_token_t token = UT_TOKEN_0; memset(&module_prop, 0, sizeof(module_prop)); - OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(UT_INDEX_0, &module_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(&token, &module_prop), OS_SUCCESS); UtAssert_True(module_prop.addr.valid, "addresses in output valid"); /* @@ -87,7 +92,7 @@ void Test_OS_ModuleGetInfo_Impl(void) */ memset(&module_prop, 0, sizeof(module_prop)); UT_SetDefaultReturnValue(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(UT_INDEX_0, &module_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(&token, &module_prop), OS_SUCCESS); UT_ClearForceFail(UT_KEY(OCS_moduleInfoGet)); UtAssert_True(!module_prop.addr.valid, "addresses in output not valid"); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c b/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c index 2320fb3a1..c606a95fb 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-mutex.c @@ -43,10 +43,12 @@ void Test_OS_MutSemCreate_Impl(void) * Test Case For: * int32 OS_MutSemCreate_Impl (uint32 sem_id, uint32 options) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(UT_INDEX_0, 0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(&token, 0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_semMInitialize), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(UT_INDEX_0, 0), OS_SEM_FAILURE); + OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate_Impl(&token, 0), OS_SEM_FAILURE); } void Test_OS_MutSemDelete_Impl(void) @@ -55,7 +57,9 @@ void Test_OS_MutSemDelete_Impl(void) * Test Case For: * int32 OS_MutSemDelete_Impl (uint32 sem_id) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemDelete_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_MutSemDelete_Impl(&token), OS_SUCCESS); } void Test_OS_MutSemGive_Impl(void) @@ -64,7 +68,9 @@ void Test_OS_MutSemGive_Impl(void) * Test Case For: * int32 OS_MutSemGive_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemGive_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_MutSemGive_Impl(&token), OS_SUCCESS); } void Test_OS_MutSemTake_Impl(void) @@ -73,7 +79,9 @@ void Test_OS_MutSemTake_Impl(void) * Test Case For: * int32 OS_MutSemTake_Impl ( uint32 sem_id ) */ - OSAPI_TEST_FUNCTION_RC(OS_MutSemTake_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_MutSemTake_Impl(&token), OS_SUCCESS); } void Test_OS_MutSemGetInfo_Impl(void) @@ -83,8 +91,10 @@ void Test_OS_MutSemGetInfo_Impl(void) * int32 OS_MutSemGetInfo_Impl (uint32 sem_id, OS_mut_sem_prop_t *mut_prop) */ OS_mut_sem_prop_t mut_prop; + OS_object_token_t token = UT_TOKEN_0; + memset(&mut_prop, 0xEE, sizeof(mut_prop)); - OSAPI_TEST_FUNCTION_RC(OS_MutSemGetInfo_Impl(UT_INDEX_0, &mut_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_MutSemGetInfo_Impl(&token, &mut_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-queues.c b/src/unit-test-coverage/vxworks/src/coveragetest-queues.c index a752c4e25..f8f67afd4 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-queues.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-queues.c @@ -47,10 +47,12 @@ void Test_OS_QueueCreate_Impl(void) * Test Case For: * int32 OS_QueueCreate_Impl (uint32 queue_id, uint32 flags) */ - OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(UT_INDEX_0, 0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(&token, 0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_msgQCreate), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(UT_INDEX_0, 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueCreate_Impl(&token, 0), OS_ERROR); } void Test_OS_QueueDelete_Impl(void) @@ -59,10 +61,12 @@ void Test_OS_QueueDelete_Impl(void) * Test Case For: * int32 OS_QueueDelete_Impl (uint32 queue_id) */ - OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_msgQDelete), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(UT_INDEX_0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueDelete_Impl(&token), OS_ERROR); } void Test_OS_QueueGet_Impl(void) @@ -71,23 +75,24 @@ void Test_OS_QueueGet_Impl(void) * Test Case For: * int32 OS_QueueGet_Impl (uint32 queue_id, void *data, uint32 size, uint32 *size_copied, int32 timeout) */ - char Data[16]; - size_t ActSz; + char Data[16]; + size_t ActSz; + OS_object_token_t token = UT_TOKEN_0; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_PEND), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, 100), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(&token, &Data, sizeof(Data), &ActSz, OS_PEND), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(&token, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(&token, &Data, sizeof(Data), &ActSz, 100), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OS_Milli2Ticks), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, 100), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(&token, &Data, sizeof(Data), &ActSz, 100), OS_ERROR); UT_SetDefaultReturnValue(UT_KEY(OCS_msgQReceive), OCS_ERROR); OCS_errno = OCS_S_objLib_OBJ_TIMEOUT; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_TIMEOUT); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(&token, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_TIMEOUT); OCS_errno = OCS_S_objLib_OBJ_UNAVAILABLE; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_EMPTY); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(&token, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_QUEUE_EMPTY); OCS_errno = 0; - OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(UT_INDEX_0, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueueGet_Impl(&token, &Data, sizeof(Data), &ActSz, OS_CHECK), OS_ERROR); } void Test_OS_QueuePut_Impl(void) @@ -96,14 +101,16 @@ void Test_OS_QueuePut_Impl(void) * Test Case For: * int32 OS_QueuePut_Impl (uint32 queue_id, const void *data, uint32 size, uint32 flags) */ - char Data[16] = "Test"; - OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(UT_INDEX_0, Data, sizeof(Data), 0), OS_SUCCESS); + char Data[16] = "Test"; + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(&token, Data, sizeof(Data), 0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_msgQSend), OCS_ERROR); OCS_errno = OCS_S_objLib_OBJ_UNAVAILABLE; - OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(UT_INDEX_0, Data, sizeof(Data), 0), OS_QUEUE_FULL); + OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(&token, Data, sizeof(Data), 0), OS_QUEUE_FULL); OCS_errno = 0; - OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(UT_INDEX_0, Data, sizeof(Data), 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_QueuePut_Impl(&token, Data, sizeof(Data), 0), OS_ERROR); } void Test_OS_QueueGetInfo_Impl(void) @@ -112,9 +119,11 @@ void Test_OS_QueueGetInfo_Impl(void) * Test Case For: * int32 OS_QueueGetInfo_Impl (uint32 queue_id, OS_queue_prop_t *queue_prop) */ - OS_queue_prop_t queue_prop; + OS_queue_prop_t queue_prop; + OS_object_token_t token = UT_TOKEN_0; + memset(&queue_prop, 0xEE, sizeof(queue_prop)); - OSAPI_TEST_FUNCTION_RC(OS_QueueGetInfo_Impl(UT_INDEX_0, &queue_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_QueueGetInfo_Impl(&token, &queue_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-shell.c b/src/unit-test-coverage/vxworks/src/coveragetest-shell.c index b9f547159..2195ff349 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-shell.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-shell.c @@ -37,8 +37,9 @@ void Test_OS_ShellOutputToFile_Impl(void) * Test Case For: * int32 OS_ShellOutputToFile_Impl(uint32 file_id, const char *Cmd) */ - int32 expected = OS_SUCCESS; - int32 actual; + int32 expected = OS_SUCCESS; + int32 actual; + OS_object_token_t token = UT_TOKEN_0; /* * The ShellOutputToFile will loop until the @@ -47,7 +48,7 @@ void Test_OS_ShellOutputToFile_Impl(void) */ UT_SetDeferredRetcode(UT_KEY(OCS_taskNameToId), 2, -1); - actual = OS_ShellOutputToFile_Impl(UT_INDEX_0, "TestCmd"); + actual = OS_ShellOutputToFile_Impl(&token, "TestCmd"); UtAssert_True(actual == expected, "OS_ShellOutputToFile_Impl() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_shellGenericInit)) == 1, "shellGenericInit() called"); @@ -55,7 +56,7 @@ void Test_OS_ShellOutputToFile_Impl(void) /* failure to open the output file */ UT_SetDefaultReturnValue(UT_KEY(OS_OpenCreate), OS_ERROR); expected = OS_ERROR; - actual = OS_ShellOutputToFile_Impl(UT_INDEX_0, "TestCmd"); + actual = OS_ShellOutputToFile_Impl(&token, "TestCmd"); UtAssert_True(actual == expected, "OS_ShellOutputToFile_Impl() (%ld) == OS_ERROR", (long)actual); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index c7fddf233..9f7d9b9db 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -44,7 +44,6 @@ void Test_OS_GlobalSymbolLookup_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_GlobalSymbolLookup_Impl(NULL, NULL), OS_INVALID_POINTER); UT_SetDefaultReturnValue(UT_KEY(OCS_symFind), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_GlobalSymbolLookup_Impl(&SymAddr, "symname"), OS_ERROR); - } void Test_OS_ModuleSymbolLookup_Impl(void) @@ -52,11 +51,13 @@ void Test_OS_ModuleSymbolLookup_Impl(void) /* Test Case For: * int32 OS_ModuleSymbolLookup_Impl( uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName ) */ - cpuaddr SymAddr; + cpuaddr SymAddr; + OS_object_token_t token = UT_TOKEN_0; - OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, &SymAddr, "symname"), OS_SUCCESS); - OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, NULL, NULL), OS_INVALID_POINTER); - UT_SetDefaultReturnValue(UT_KEY(OCS_symFind), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(UT_INDEX_0, &SymAddr, "symname"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(&token, &SymAddr, "symname"), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(&token, NULL, NULL), OS_INVALID_POINTER); + UT_SetDefaultReturnValue(UT_KEY(OCS_symFind), OCS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_ModuleSymbolLookup_Impl(&token, &SymAddr, "symname"), OS_ERROR); } void Test_OS_SymTableIterator_Impl(void) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c index 1705b5fc9..7f27a328d 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c @@ -54,7 +54,7 @@ void Test_OS_VxWorksEntry(void) * Test Case For: * static int OS_VxWorksEntry(int arg) */ - OSAPI_TEST_FUNCTION_RC(UT_TaskTest_CallEntryPoint(0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(UT_TaskTest_CallEntryPoint(OS_OBJECT_ID_UNDEFINED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OS_TaskEntryPoint)) == 1, "OS_TaskEntryPoint() called"); } @@ -64,6 +64,8 @@ void Test_OS_TaskCreate_Impl(void) * Test Case For: * int32 OS_TaskCreate_Impl (uint32 task_id, uint32 flags) */ + OS_object_token_t token = UT_TOKEN_0; + UT_SetDataBuffer(UT_KEY(OCS_malloc), TestHeap, sizeof(TestHeap), false); UT_SetDataBuffer(UT_KEY(OCS_free), TestHeap, sizeof(TestHeap), false); @@ -71,10 +73,10 @@ void Test_OS_TaskCreate_Impl(void) * The first call checks the failure path and ensures that a malloc failure gets handled */ OS_task_table[0].stack_size = 250; UT_SetDefaultReturnValue(UT_KEY(OCS_malloc), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(&token, 0), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_malloc)); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, OS_FP_ENABLED), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(&token, OS_FP_ENABLED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_malloc)) == 2, "malloc() called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_free)) == 0, "free() not called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskInit)) == 1, "taskInit() called"); @@ -82,7 +84,7 @@ void Test_OS_TaskCreate_Impl(void) /* create again with smaller stack - this should re-use existing buffer */ OS_task_table[0].stack_size = 100; - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, OS_FP_ENABLED), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(&token, OS_FP_ENABLED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_malloc)) == 2, "malloc() not called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_free)) == 0, "free() not called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskInit)) == 2, "taskInit() called"); @@ -90,7 +92,7 @@ void Test_OS_TaskCreate_Impl(void) /* create again with larger stack - this should free existing and malloc() new buffer */ OS_task_table[0].stack_size = 400; - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, OS_FP_ENABLED), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(&token, OS_FP_ENABLED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_malloc)) == 3, "malloc() called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_free)) == 1, "free() called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_taskInit)) == 3, "taskInit() called"); @@ -98,7 +100,7 @@ void Test_OS_TaskCreate_Impl(void) /* other failure modes */ UT_SetDefaultReturnValue(UT_KEY(OCS_taskInit), -1); - OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(UT_INDEX_0, 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(&token, 0), OS_ERROR); } void Test_OS_TaskMatch_Impl(void) @@ -107,10 +109,12 @@ void Test_OS_TaskMatch_Impl(void) * Test Case For: * int32 OS_TaskMatch_Impl(uint32 task_id) */ + OS_object_token_t token = UT_TOKEN_0; + UT_TaskTest_SetImplTaskId(UT_INDEX_0, OCS_taskIdSelf()); - OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(UT_INDEX_0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(&token), OS_SUCCESS); UT_TaskTest_SetImplTaskId(UT_INDEX_0, (OCS_TASK_ID)0); - OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(UT_INDEX_0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskMatch_Impl(&token), OS_ERROR); } void Test_OS_TaskDelete_Impl(void) @@ -119,11 +123,13 @@ void Test_OS_TaskDelete_Impl(void) * Test Case For: * int32 OS_TaskDelete_Impl (uint32 task_id) */ - OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(UT_INDEX_0), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(&token), OS_SUCCESS); /* failure mode */ UT_SetDefaultReturnValue(UT_KEY(OCS_taskDelete), -1); - OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(UT_INDEX_0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(&token), OS_ERROR); } void Test_OS_TaskExit_Impl(void) @@ -157,10 +163,12 @@ void Test_OS_TaskSetPriority_Impl(void) * Test Case For: * int32 OS_TaskSetPriority_Impl (uint32 task_id, uint32 new_priority) */ - OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(UT_INDEX_0, OSAL_PRIORITY_C(100)), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(&token, OSAL_PRIORITY_C(100)), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_taskPrioritySet), OCS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(UT_INDEX_0, OSAL_PRIORITY_C(100)), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_TaskSetPriority_Impl(&token, OSAL_PRIORITY_C(100)), OS_ERROR); } void Test_OS_TaskRegister_Impl(void) @@ -196,9 +204,11 @@ void Test_OS_TaskGetInfo_Impl(void) * Test Case For: * int32 OS_TaskGetInfo_Impl (uint32 task_id, OS_task_prop_t *task_prop) */ - OS_task_prop_t task_prop; + OS_task_prop_t task_prop; + OS_object_token_t token = UT_TOKEN_0; + memset(&task_prop, 0xEE, sizeof(task_prop)); - OSAPI_TEST_FUNCTION_RC(OS_TaskGetInfo_Impl(UT_INDEX_0, &task_prop), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TaskGetInfo_Impl(&token, &task_prop), OS_SUCCESS); } void Test_OS_TaskValidateSystemData_Impl(void) @@ -222,15 +232,16 @@ void Test_OS_TaskIdMatchSystemData_Impl(void) * Test Case For: * bool OS_TaskIdMatchSystemData_Impl(void *ref, uint32 local_id, const OS_common_record_t *obj) */ - OCS_TASK_ID test_sys_id; + OCS_TASK_ID test_sys_id; + OS_object_token_t token = UT_TOKEN_0; memset(&test_sys_id, 'x', sizeof(test_sys_id)); UT_TaskTest_SetImplTaskId(UT_INDEX_0, test_sys_id); - OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, UT_INDEX_0, NULL), true); + OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, &token, NULL), true); memset(&test_sys_id, 'y', sizeof(test_sys_id)); - OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, UT_INDEX_0, NULL), false); + OSAPI_TEST_FUNCTION_RC(OS_TaskIdMatchSystemData_Impl(&test_sys_id, &token, NULL), false); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c index d001875bd..82098fe2c 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c @@ -50,7 +50,8 @@ void Test_OS_TimeBaseLock_Impl(void) /* Test Case For: * void OS_TimeBaseLock_Impl(uint32 local_id) */ - OS_TimeBaseLock_Impl(UT_INDEX_0); + OS_object_token_t token = UT_TOKEN_0; + OS_TimeBaseLock_Impl(&token); } void Test_OS_TimeBaseUnlock_Impl(void) @@ -58,7 +59,8 @@ void Test_OS_TimeBaseUnlock_Impl(void) /* Test Case For: * void OS_TimeBaseUnlock_Impl(uint32 local_id) */ - OS_TimeBaseUnlock_Impl(UT_INDEX_0); + OS_object_token_t token = UT_TOKEN_0; + OS_TimeBaseUnlock_Impl(&token); } static int32 UT_TimeBaseTest_TimeBaseRegHook(void *UserObj, int32 StubRetcode, uint32 CallCount, @@ -99,7 +101,8 @@ void Test_OS_TimeBaseCreate_Impl(void) /* Test Case For: * int32 OS_TimeBaseCreate_Impl(uint32 timer_id) */ - osal_id_t id; + osal_id_t id; + OS_object_token_t token = UT_TOKEN_0; /* * Test paths though the signal number assignment. @@ -111,17 +114,17 @@ void Test_OS_TimeBaseCreate_Impl(void) OS_global_timebase_table[1].active_id = id; UT_TimeBaseTest_Setup(UT_INDEX_1, OCS_SIGRTMIN, false); UT_SetDefaultReturnValue(UT_KEY(OCS_sigismember), true); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_UNAVAILABLE); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_TIMER_ERR_UNAVAILABLE); UT_ResetState(UT_KEY(OCS_sigismember)); /* fail to initialize the sem */ UT_SetDefaultReturnValue(UT_KEY(OCS_semMInitialize), -1); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_INTERNAL); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_TIMER_ERR_INTERNAL); UT_ClearForceFail(UT_KEY(OCS_semMInitialize)); /* fail to spawn the task */ UT_SetDefaultReturnValue(UT_KEY(OCS_taskSpawn), -1); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_INTERNAL); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_TIMER_ERR_INTERNAL); UT_ClearForceFail(UT_KEY(OCS_taskSpawn)); /* @@ -129,7 +132,7 @@ void Test_OS_TimeBaseCreate_Impl(void) * this mimics the situation where the reg global is never * set past OS_TimerRegState_INIT */ - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_TIMER_ERR_INTERNAL); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_TIMER_ERR_INTERNAL); /* * Do Nominal/success case now. @@ -137,7 +140,7 @@ void Test_OS_TimeBaseCreate_Impl(void) * mimic registration success */ UT_SetHookFunction(UT_KEY(OCS_taskSpawn), UT_TimeBaseTest_TimeBaseRegHook, NULL); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(UT_INDEX_0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_SUCCESS); /* * For coverage, call the OS_VxWorks_TimeBaseTask() function. @@ -147,13 +150,13 @@ void Test_OS_TimeBaseCreate_Impl(void) /* * Check outputs of OS_VxWorks_RegisterTimer() function. */ - UT_TimeBaseTest_ClearTimeBaseRegState(UT_INDEX_0); - UT_TimeBaseTest_CallRegisterTimer(UT_INDEX_0); + UT_TimeBaseTest_ClearTimeBaseRegState(UT_INDEX_1); + UT_TimeBaseTest_CallRegisterTimer(OS_OBJECT_ID_UNDEFINED); UtAssert_True(UT_TimeBaseTest_CheckTimeBaseRegisteredState(UT_INDEX_0), "timer successfully registered"); - UT_TimeBaseTest_ClearTimeBaseRegState(UT_INDEX_0); + UT_TimeBaseTest_ClearTimeBaseRegState(UT_INDEX_1); UT_SetDefaultReturnValue(UT_KEY(OCS_timer_create), -1); - UT_TimeBaseTest_CallRegisterTimer(UT_INDEX_0); + UT_TimeBaseTest_CallRegisterTimer(OS_OBJECT_ID_UNDEFINED); UtAssert_True(UT_TimeBaseTest_CheckTimeBaseErrorState(UT_INDEX_0), "timer registration failure state"); } @@ -166,6 +169,7 @@ void Test_OS_VxWorks_SigWait(void) int signo = OCS_SIGRTMIN; struct OCS_itimerspec config_value; osal_id_t id; + OS_object_token_t token = UT_TOKEN_0; memset(&id, 0x02, sizeof(id)); OS_global_timebase_table[0].active_id = id; @@ -176,7 +180,7 @@ void Test_OS_VxWorks_SigWait(void) UT_SetDataBuffer(UT_KEY(OCS_timer_settime), &config_value, sizeof(config_value), false); UT_SetDataBuffer(UT_KEY(OCS_timer_gettime), &config_value, sizeof(config_value), false); UT_TimeBaseTest_Setup(UT_INDEX_0, signo, true); - OS_TimeBaseSet_Impl(UT_INDEX_0, 1111111, 2222222); + OS_TimeBaseSet_Impl(&token, 1111111, 2222222); UT_SetDataBuffer(UT_KEY(OCS_sigwait), &signo, sizeof(signo), false); OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(UT_INDEX_0), 1111111); @@ -195,13 +199,15 @@ void Test_OS_TimeBaseSet_Impl(void) /* Test Case For: * int32 OS_TimeBaseSet_Impl(uint32 timer_id, int32 start_time, int32 interval_time) */ - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(UT_INDEX_0, 1, 1), OS_ERR_NOT_IMPLEMENTED); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(&token, 1, 1), OS_ERR_NOT_IMPLEMENTED); UT_TimeBaseTest_Setup(UT_INDEX_0, OCS_SIGRTMIN, false); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(UT_INDEX_0, 1, 1), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(&token, 1, 1), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_timer_settime), -1); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(UT_INDEX_0, 1, 1), OS_TIMER_ERR_INVALID_ARGS); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseSet_Impl(&token, 1, 1), OS_TIMER_ERR_INVALID_ARGS); } void Test_OS_TimeBaseDelete_Impl(void) @@ -209,8 +215,10 @@ void Test_OS_TimeBaseDelete_Impl(void) /* Test Case For: * int32 OS_TimeBaseDelete_Impl(uint32 timer_id) */ + OS_object_token_t token = UT_TOKEN_0; + UT_TimeBaseTest_Setup(UT_INDEX_0, OCS_SIGRTMIN, false); - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseDelete_Impl(UT_INDEX_0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseDelete_Impl(&token), OS_SUCCESS); } void Test_OS_TimeBaseGetInfo_Impl(void) @@ -219,7 +227,9 @@ void Test_OS_TimeBaseGetInfo_Impl(void) * int32 OS_TimeBaseGetInfo_Impl (uint32 timer_id, OS_timebase_prop_t *timer_prop) */ OS_timebase_prop_t timer_prop; - OSAPI_TEST_FUNCTION_RC(OS_TimeBaseGetInfo_Impl(UT_INDEX_0, &timer_prop), OS_SUCCESS); + OS_object_token_t token = UT_TOKEN_0; + + OSAPI_TEST_FUNCTION_RC(OS_TimeBaseGetInfo_Impl(&token, &timer_prop), OS_SUCCESS); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h index 989f27da7..629929372 100644 --- a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h +++ b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h @@ -47,6 +47,22 @@ #define UT_INDEX_1 OSAL_INDEX_C(1) #define UT_INDEX_2 OSAL_INDEX_C(2) +#define UT_TOKEN_0 \ + (OS_object_token_t) \ + { \ + .obj_id = (osal_id_t) {0x10000}, .obj_idx = 0 \ + } +#define UT_TOKEN_1 \ + (OS_object_token_t) \ + { \ + .obj_id = (osal_id_t) {0x10001}, .obj_idx = 1 \ + } +#define UT_TOKEN_2 \ + (OS_object_token_t) \ + { \ + .obj_id = (osal_id_t) {0x10002}, .obj_idx = 2 \ + } + /* Osapi_Test_Setup * * Purpose: From cbead8e54ebdb3106396d6e2c182988e3511b622 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 1 Dec 2020 10:51:00 -0500 Subject: [PATCH 022/111] Fix #649, use full object ID in timecb list For the linked list of timer callbacks, use the full object ID value rather than just the index. This ensures consistency in the list and also makes it easier to manage. --- src/os/shared/inc/os-shared-time.h | 4 +- src/os/shared/src/osapi-time.c | 61 +++++++++++-------- src/os/shared/src/osapi-timebase.c | 19 +++--- .../timer-add-api-test/timer-add-api-test.c | 2 +- .../shared/src/coveragetest-time.c | 4 +- .../shared/src/coveragetest-timebase.c | 9 ++- 6 files changed, 57 insertions(+), 42 deletions(-) diff --git a/src/os/shared/inc/os-shared-time.h b/src/os/shared/inc/os-shared-time.h index 6c0ac43f9..456991f8c 100644 --- a/src/os/shared/inc/os-shared-time.h +++ b/src/os/shared/inc/os-shared-time.h @@ -38,8 +38,8 @@ typedef struct char timer_name[OS_MAX_API_NAME]; uint32 flags; OS_object_token_t timebase_token; - osal_index_t prev_ref; - osal_index_t next_ref; + osal_id_t prev_cb; + osal_id_t next_cb; uint32 backlog_resets; int32 wait_time; int32 interval_time; diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index 6c78ea160..6df1fdab0 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -94,10 +94,10 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ osal_objtype_t objtype; OS_object_token_t timebase_token; OS_object_token_t timecb_token; + OS_object_token_t listcb_token; OS_timecb_internal_record_t * timecb; + OS_timecb_internal_record_t * list_timecb; OS_timebase_internal_record_t *timebase; - osal_id_t cb_list; - osal_index_t attach_id; /* ** Check Parameters @@ -166,8 +166,8 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ timecb->callback_ptr = callback_ptr; timecb->callback_arg = callback_arg; timecb->flags = flags; - timecb->prev_ref = OS_ObjectIndexFromToken(&timecb_token); - timecb->next_ref = OS_ObjectIndexFromToken(&timecb_token); + timecb->prev_cb = OS_ObjectIdFromToken(&timecb_token); + timecb->next_cb = OS_ObjectIdFromToken(&timecb_token); /* * Now we need to add it to the time base callback ring, so take the @@ -175,18 +175,23 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ */ OS_TimeBaseLock_Impl(&timebase_token); - cb_list = timebase->first_cb; - timebase->first_cb = OS_ObjectIdFromToken(&timecb_token); - - if (OS_ObjectIdDefined(cb_list)) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timebase->first_cb, &listcb_token) == OS_SUCCESS) { - OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TIMECB, cb_list, &attach_id); - timecb->next_ref = attach_id; - timecb->prev_ref = OS_timecb_table[attach_id].prev_ref; - OS_timecb_table[timecb->prev_ref].next_ref = OS_ObjectIndexFromToken(&timecb_token); - OS_timecb_table[timecb->next_ref].prev_ref = OS_ObjectIndexFromToken(&timecb_token); + list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); + + timecb->next_cb = OS_ObjectIdFromToken(&listcb_token); + timecb->prev_cb = list_timecb->prev_cb; + + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->prev_cb, &listcb_token) == OS_SUCCESS) + { + list_timecb->prev_cb = OS_ObjectIdFromToken(&timecb_token); + list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); + list_timecb->next_cb = OS_ObjectIdFromToken(&timecb_token); + } } + timebase->first_cb = OS_ObjectIdFromToken(&timecb_token); + OS_TimeBaseUnlock_Impl(&timebase_token); /* Check result, finalize record, and unlock global table. */ @@ -399,8 +404,10 @@ int32 OS_TimerDelete(osal_id_t timer_id) osal_id_t dedicated_timebase_id; OS_object_token_t timecb_token; OS_object_token_t timebase_token; + OS_object_token_t listcb_token; OS_timebase_internal_record_t *timebase; OS_timecb_internal_record_t * timecb; + OS_timecb_internal_record_t * list_timecb; dedicated_timebase_id = OS_OBJECT_ID_UNDEFINED; memset(&timebase_token, 0, sizeof(timebase_token)); @@ -436,25 +443,31 @@ int32 OS_TimerDelete(osal_id_t timer_id) /* * Now we need to remove it from the time base callback ring */ - if (OS_ObjectIdEqual(timebase->first_cb, timer_id)) + if (OS_ObjectIdEqual(timebase->first_cb, OS_ObjectIdFromToken(&timecb_token))) { - if (timecb->next_ref != OS_ObjectIndexFromToken(&timecb_token)) + if (OS_ObjectIdEqual(OS_ObjectIdFromToken(&timecb_token), timecb->next_cb)) { - OS_ObjectIdCompose_Impl(OS_OBJECT_TYPE_OS_TIMEBASE, timecb->next_ref, &timebase->first_cb); + timebase->first_cb = OS_OBJECT_ID_UNDEFINED; } else { - /* - * consider the list empty - */ - timebase->first_cb = OS_OBJECT_ID_UNDEFINED; + timebase->first_cb = timecb->next_cb; } } - OS_timecb_table[timecb->prev_ref].next_ref = timecb->next_ref; - OS_timecb_table[timecb->next_ref].prev_ref = timecb->prev_ref; - timecb->next_ref = OS_ObjectIndexFromToken(&timecb_token); - timecb->prev_ref = OS_ObjectIndexFromToken(&timecb_token); + if(OS_ObjectIdGetById(OS_LOCK_MODE_NONE,OS_OBJECT_TYPE_OS_TIMECB,timecb->prev_cb,&listcb_token) == OS_SUCCESS) + { + list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); + list_timecb->next_cb = timecb->next_cb; + } + if(OS_ObjectIdGetById(OS_LOCK_MODE_NONE,OS_OBJECT_TYPE_OS_TIMECB,timecb->next_cb,&listcb_token) == OS_SUCCESS) + { + list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); + list_timecb->prev_cb = timecb->prev_cb; + } + + timecb->next_cb = OS_ObjectIdFromToken(&timecb_token); + timecb->prev_cb = OS_ObjectIdFromToken(&timecb_token); OS_TimeBaseUnlock_Impl(&timecb->timebase_token); diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index 62e935a95..8eb4ad6f4 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -402,9 +402,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) OS_timecb_internal_record_t * timecb; OS_common_record_t * record; OS_object_token_t token; - osal_index_t timer_id; - osal_index_t curr_cb_local_id; - osal_id_t curr_cb_public_id; + OS_object_token_t cb_token; uint32 tick_time; uint32 spin_cycles; int32 saved_wait_time; @@ -493,14 +491,12 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) } timebase->freerun_time += tick_time; - if (OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TIMECB, timebase->first_cb, &timer_id) == 0) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timebase->first_cb, &cb_token) == 0) { - curr_cb_local_id = timer_id; do { - curr_cb_public_id = OS_global_timecb_table[curr_cb_local_id].active_id; - timecb = &OS_timecb_table[curr_cb_local_id]; - saved_wait_time = timecb->wait_time; + timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, cb_token); + saved_wait_time = timecb->wait_time; timecb->wait_time -= tick_time; while (timecb->wait_time <= 0) { @@ -525,7 +521,7 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) */ if (saved_wait_time > 0 && timecb->callback_ptr != NULL) { - (*timecb->callback_ptr)(curr_cb_public_id, timecb->callback_arg); + (*timecb->callback_ptr)(OS_ObjectIdFromToken(&cb_token), timecb->callback_arg); } /* @@ -536,8 +532,9 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) break; } } - curr_cb_local_id = timecb->next_ref; - } while (curr_cb_local_id != timer_id); + + } while (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->next_cb, &cb_token) == OS_SUCCESS && + !OS_ObjectIdEqual(OS_ObjectIdFromToken(&cb_token), timebase->first_cb)); } OS_TimeBaseUnlock_Impl(&token); diff --git a/src/tests/timer-add-api-test/timer-add-api-test.c b/src/tests/timer-add-api-test/timer-add-api-test.c index 608eacdca..c33d53bbe 100644 --- a/src/tests/timer-add-api-test/timer-add-api-test.c +++ b/src/tests/timer-add-api-test/timer-add-api-test.c @@ -130,7 +130,7 @@ void TestTimerAddApi(void) OS_GetLocalTime(&EndTime); - for (i = 0; i < NUMBER_OF_TIMERS; i++) + for (i = NUMBER_OF_TIMERS-1; i >= 0; --i) { TimerStatus[i] = OS_TimerDelete(TimerID[i]); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-time.c b/src/unit-test-coverage/shared/src/coveragetest-time.c index 9ab947db0..840638d10 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-time.c +++ b/src/unit-test-coverage/shared/src/coveragetest-time.c @@ -205,8 +205,8 @@ void Test_OS_TimerDelete(void) OS_timecb_table[1].timebase_token.obj_id = UT_OBJID_1; OS_timecb_table[1].timebase_token.obj_idx = UT_INDEX_0; OS_timecb_table[2].timebase_token = OS_timecb_table[1].timebase_token; - OS_timecb_table[2].next_ref = UT_INDEX_1; - OS_timecb_table[1].next_ref = UT_INDEX_1; + OS_timecb_table[2].next_cb = UT_OBJID_1; + OS_timecb_table[1].next_cb = UT_OBJID_1; OS_timebase_table[0].first_cb = UT_OBJID_2; actual = OS_TimerDelete(UT_OBJID_2); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index 6239ffd71..aea8714e4 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -243,14 +243,19 @@ void Test_OS_TimeBase_CallbackThread(void) * void OS_TimeBase_CallbackThread(uint32 timebase_id) */ OS_common_record_t *recptr; + OS_object_token_t timecb_token; recptr = &OS_global_timebase_table[2]; memset(recptr, 0, sizeof(*recptr)); recptr->active_id = UT_OBJID_2; + OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, UT_OBJID_1, &timecb_token); OS_timebase_table[2].external_sync = UT_TimerSync; - OS_timecb_table[0].wait_time = 2000; - OS_timecb_table[0].callback_ptr = UT_TimeCB; + OS_timebase_table[2].first_cb = timecb_token.obj_id; + OS_timecb_table[1].prev_cb = timecb_token.obj_id; + OS_timecb_table[1].next_cb = timecb_token.obj_id; + OS_timecb_table[1].wait_time = 2000; + OS_timecb_table[1].callback_ptr = UT_TimeCB; TimerSyncCount = 0; TimerSyncRetVal = 0; TimeCB = 0; From ba3bc0175bd4c4329a5ba4e1b41ffa6cae2a38bf Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 1 Dec 2020 16:56:43 -0500 Subject: [PATCH 023/111] Fix #664, change type of sync callback argument to osal_id_t ID is preferable to an array index because direct table access should not be done outside OSAL itself. --- src/os/inc/osapi-os-timer.h | 4 +- src/os/posix/src/os-impl-timebase.c | 65 ++++++++++--------- src/os/rtems/src/os-impl-timebase.c | 50 +++++++------- src/os/vxworks/inc/os-vxworks.h | 2 +- src/os/vxworks/src/os-impl-timebase.c | 26 ++++---- .../time-base-api-test/time-base-api-test.c | 2 +- .../shared/src/coveragetest-timebase.c | 2 +- .../adaptors/inc/ut-adaptor-timebase.h | 2 +- .../adaptors/src/ut-adaptor-timebase.c | 4 +- .../vxworks/src/coveragetest-timebase.c | 6 +- 10 files changed, 87 insertions(+), 76 deletions(-) diff --git a/src/os/inc/osapi-os-timer.h b/src/os/inc/osapi-os-timer.h index e9b7ef3c6..1dff895e1 100644 --- a/src/os/inc/osapi-os-timer.h +++ b/src/os/inc/osapi-os-timer.h @@ -33,8 +33,8 @@ /* ** Typedefs */ -typedef void (*OS_TimerCallback_t)(osal_id_t timer_id); /**< @brief Timer callback */ -typedef uint32 (*OS_TimerSync_t)(osal_index_t timer_id); /**< @brief Timer sync */ +typedef void (*OS_TimerCallback_t)(osal_id_t timer_id); /**< @brief Timer callback */ +typedef uint32 (*OS_TimerSync_t)(osal_id_t timer_id); /**< @brief Timer sync */ /** @brief Timer properties */ typedef struct diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index bbd177bc4..517411cda 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -141,42 +141,49 @@ void OS_TimeBaseUnlock_Impl(const OS_object_token_t *token) * Purpose: Local helper routine, not part of OSAL API. * *-----------------------------------------------------------------*/ -static uint32 OS_TimeBase_SigWaitImpl(osal_index_t timer_id) +static uint32 OS_TimeBase_SigWaitImpl(osal_id_t obj_id) { int ret; - OS_impl_timebase_internal_record_t *local; + OS_object_token_t token; + OS_impl_timebase_internal_record_t *impl; + OS_timebase_internal_record_t * timebase; uint32 interval_time; int sig; - local = &OS_impl_timebase_table[timer_id]; - - ret = sigwait(&local->sigset, &sig); + interval_time = 0; - if (ret != 0) - { - /* - * the sigwait call failed. - * returning 0 will cause the process to repeat. - */ - interval_time = 0; - } - else if (local->reset_flag == 0) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMEBASE, obj_id, &token) == OS_SUCCESS) { - /* - * Normal steady-state behavior. - * interval_time reflects the configured interval time. - */ - interval_time = OS_timebase_table[timer_id].nominal_interval_time; - } - else - { - /* - * Reset/First interval behavior. - * timer_set() was invoked since the previous interval occurred (if any). - * interval_time reflects the configured start time. - */ - interval_time = OS_timebase_table[timer_id].nominal_start_time; - local->reset_flag = 0; + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); + + ret = sigwait(&impl->sigset, &sig); + + if (ret != 0) + { + /* + * the sigwait call failed. + * returning 0 will cause the process to repeat. + */ + } + else if (impl->reset_flag == 0) + { + /* + * Normal steady-state behavior. + * interval_time reflects the configured interval time. + */ + interval_time = timebase->nominal_interval_time; + } + else + { + /* + * Reset/First interval behavior. + * timer_set() was invoked since the previous interval occurred (if any). + * interval_time reflects the configured start time. + */ + interval_time = timebase->nominal_start_time; + impl->reset_flag = 0; + } } return interval_time; diff --git a/src/os/rtems/src/os-impl-timebase.c b/src/os/rtems/src/os-impl-timebase.c index c4c72a349..1ccf7beeb 100644 --- a/src/os/rtems/src/os-impl-timebase.c +++ b/src/os/rtems/src/os-impl-timebase.c @@ -162,33 +162,39 @@ static rtems_timer_service_routine OS_TimeBase_ISR(rtems_id rtems_timer_id, void * Pends on the semaphore for the next timer tick * *-----------------------------------------------------------------*/ -static uint32 OS_TimeBase_WaitImpl(osal_index_t local_id) +static uint32 OS_TimeBase_WaitImpl(osal_id_t timebase_id) { - OS_impl_timebase_internal_record_t *local; + OS_object_token_t token; + OS_impl_timebase_internal_record_t *impl; uint32 tick_time; - local = &OS_impl_timebase_table[local_id]; - - /* - * Pend for the tick arrival - */ - rtems_semaphore_obtain(local->tick_sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + tick_time = 0; - /* - * Determine how long this tick was. - * Note that there are plenty of ways this become wrong if the timer - * is reset right around the time a tick comes in. However, it is - * impossible to guarantee the behavior of a reset if the timer is running. - * (This is not an expected use-case anyway; the timer should be set and forget) - */ - if (local->reset_flag == 0) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_id, &token) == OS_SUCCESS) { - tick_time = local->configured_interval_time; - } - else - { - tick_time = local->configured_start_time; - local->reset_flag = 0; + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, token); + + /* + * Pend for the tick arrival + */ + rtems_semaphore_obtain(impl->tick_sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + + /* + * Determine how long this tick was. + * Note that there are plenty of ways this become wrong if the timer + * is reset right around the time a tick comes in. However, it is + * impossible to guarantee the behavior of a reset if the timer is running. + * (This is not an expected use-case anyway; the timer should be set and forget) + */ + if (impl->reset_flag == 0) + { + tick_time = impl->configured_interval_time; + } + else + { + tick_time = impl->configured_start_time; + impl->reset_flag = 0; + } } return tick_time; diff --git a/src/os/vxworks/inc/os-vxworks.h b/src/os/vxworks/inc/os-vxworks.h index 88bbe1826..7090b1c00 100644 --- a/src/os/vxworks/inc/os-vxworks.h +++ b/src/os/vxworks/inc/os-vxworks.h @@ -92,7 +92,7 @@ int32 OS_VxWorks_DirAPI_Impl_Init(void); int OS_VxWorks_TaskEntry(int arg); int OS_VxWorks_ConsoleTask_Entry(int arg); -uint32 OS_VxWorks_SigWait(osal_index_t local_id); +uint32 OS_VxWorks_SigWait(osal_id_t timebase_id); int OS_VxWorks_TimeBaseTask(int arg); void OS_VxWorks_RegisterTimer(osal_id_t obj_id); void OS_VxWorks_UsecToTimespec(uint32 usecs, struct timespec *time_spec); diff --git a/src/os/vxworks/src/os-impl-timebase.c b/src/os/vxworks/src/os-impl-timebase.c index 04b90513e..a7bfebba5 100644 --- a/src/os/vxworks/src/os-impl-timebase.c +++ b/src/os/vxworks/src/os-impl-timebase.c @@ -148,26 +148,24 @@ void OS_VxWorks_UsecToTimespec(uint32 usecs, struct timespec *time_spec) * Blocks the calling task until the timer tick arrives * *-----------------------------------------------------------------*/ -uint32 OS_VxWorks_SigWait(osal_index_t local_id) +uint32 OS_VxWorks_SigWait(osal_id_t timebase_id) { - OS_impl_timebase_internal_record_t *local; - OS_common_record_t * global; - osal_id_t active_id; + OS_object_token_t token; + OS_impl_timebase_internal_record_t *impl; uint32 tick_time; int signo; int ret; - local = &OS_impl_timebase_table[local_id]; - global = &OS_global_timebase_table[local_id]; - active_id = global->active_id; tick_time = 0; - if (OS_ObjectIdDefined(active_id) && local->assigned_signal > 0) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_id, &token) == OS_SUCCESS) { + impl = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, token); + /* * Pend for the tick arrival */ - ret = sigwait(&local->timer_sigset, &signo); + ret = sigwait(&impl->timer_sigset, &signo); /* * The sigwait() can be interrupted.... @@ -187,17 +185,17 @@ uint32 OS_VxWorks_SigWait(osal_index_t local_id) * conditions. Samples from before/after a reconfig * are generally not comparable. */ - if (ret == OK && signo == local->assigned_signal && OS_ObjectIdEqual(global->active_id, active_id)) + if (ret == OK && signo == impl->assigned_signal) { - if (local->reset_flag) + if (impl->reset_flag) { /* first interval after reset, use start time */ - tick_time = local->configured_start_time; - local->reset_flag = false; + tick_time = impl->configured_start_time; + impl->reset_flag = false; } else { - tick_time = local->configured_interval_time; + tick_time = impl->configured_interval_time; } } } diff --git a/src/tests/time-base-api-test/time-base-api-test.c b/src/tests/time-base-api-test/time-base-api-test.c index 4a589a845..94bc69a9b 100644 --- a/src/tests/time-base-api-test/time-base-api-test.c +++ b/src/tests/time-base-api-test/time-base-api-test.c @@ -35,7 +35,7 @@ #include "uttest.h" #include "utbsp.h" -static uint32 UT_TimerSync(osal_index_t timer_id) +static uint32 UT_TimerSync(osal_id_t timer_id) { OS_TaskDelay(1); return 1; diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index aea8714e4..4edf634bf 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -38,7 +38,7 @@ static uint32 TimerSyncCount = 0; static uint32 TimerSyncRetVal = 0; static uint32 TimeCB = 0; -static uint32 UT_TimerSync(osal_index_t timer_id) +static uint32 UT_TimerSync(osal_id_t timer_id) { ++TimerSyncCount; return TimerSyncRetVal; diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h index af148e2f1..515cb534c 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h @@ -43,7 +43,7 @@ void UT_TimeBaseTest_Setup(osal_index_t local_id, int signo, bool reset_flag); * Invokes OS_VxWorks_SigWait() with the given arguments. * This is normally a static function but exposed via a non-static wrapper for UT purposes. */ -int32 UT_TimeBaseTest_CallSigWaitFunc(osal_index_t local_id); +int32 UT_TimeBaseTest_CallSigWaitFunc(osal_id_t timebase_id); /* Invokes the static OS_VxWorks_TimeBaseTask() function with given argument */ int UT_TimeBaseTest_CallHelperTaskFunc(int arg); diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c index f7814058a..e1eb97c8f 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-timebase.c @@ -40,9 +40,9 @@ int32 UT_Call_OS_VxWorks_TimeBaseAPI_Impl_Init(void) return OS_VxWorks_TimeBaseAPI_Impl_Init(); } -int32 UT_TimeBaseTest_CallSigWaitFunc(osal_index_t local_id) +int32 UT_TimeBaseTest_CallSigWaitFunc(osal_id_t timebase_id) { - return OS_VxWorks_SigWait(local_id); + return OS_VxWorks_SigWait(timebase_id); } int UT_TimeBaseTest_CallHelperTaskFunc(int arg) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c index 82098fe2c..2690966e4 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c @@ -183,11 +183,11 @@ void Test_OS_VxWorks_SigWait(void) OS_TimeBaseSet_Impl(&token, 1111111, 2222222); UT_SetDataBuffer(UT_KEY(OCS_sigwait), &signo, sizeof(signo), false); - OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(UT_INDEX_0), 1111111); + OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(OS_OBJECT_ID_UNDEFINED), 1111111); UT_SetDataBuffer(UT_KEY(OCS_sigwait), &signo, sizeof(signo), false); - OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(UT_INDEX_0), 2222222); + OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(OS_OBJECT_ID_UNDEFINED), 2222222); UT_SetDataBuffer(UT_KEY(OCS_sigwait), &signo, sizeof(signo), false); - OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(UT_INDEX_0), 2222222); + OSAPI_TEST_FUNCTION_RC(UT_TimeBaseTest_CallSigWaitFunc(OS_OBJECT_ID_UNDEFINED), 2222222); UT_TimeBaseTest_Setup(UT_INDEX_0, 0, false); OS_global_timebase_table[0].active_id = OS_OBJECT_ID_UNDEFINED; From 292e0c16b07c1225bd9138a071b34a37d865214f Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 7 Dec 2020 17:40:14 -0500 Subject: [PATCH 024/111] Fix #670, clean up task definitions in core test Move all definitions and instantiations out of the header file. Reuse the single task definition that was already defined. Also only define 3 instances of each type, as this is all that the test actually uses (no need for 20). --- src/tests/osal-core-test/osal-core-test.c | 81 ++-- src/tests/osal-core-test/osal-core-test.h | 475 +--------------------- 2 files changed, 37 insertions(+), 519 deletions(-) diff --git a/src/tests/osal-core-test/osal-core-test.c b/src/tests/osal-core-test/osal-core-test.c index b2771cd6c..70f4dbb50 100644 --- a/src/tests/osal-core-test/osal-core-test.c +++ b/src/tests/osal-core-test/osal-core-test.c @@ -51,6 +51,32 @@ void TestMutexes(void); void TestGetInfos(void); void TestGenericQueries(void); +/* *************************************** GLOBALS ************************************** */ +osal_id_t task_0_id; +osal_id_t task_1_id; +osal_id_t task_2_id; +osal_id_t task_3_id; + +uint32 task_0_stack[TASK_0_STACK_SIZE]; +uint32 task_1_stack[TASK_1_STACK_SIZE]; +uint32 task_2_stack[TASK_2_STACK_SIZE]; +uint32 task_3_stack[TASK_3_STACK_SIZE]; + +osal_id_t msgq_0; +osal_id_t msgq_1; +osal_id_t msgq_2; +osal_id_t msgq_3; + +osal_id_t bin_0; +osal_id_t bin_1; +osal_id_t bin_2; +osal_id_t bin_3; + +osal_id_t mut_0; +osal_id_t mut_1; +osal_id_t mut_2; +osal_id_t mut_3; + /* helper function for "OS_ForEachObject" test cases */ static void TestForEachCallback(osal_id_t object_id, void *arg) { @@ -195,22 +221,22 @@ void TestTasks(void) InitializeTaskIds(); /* Create Task 0 again */ - status = OS_TaskCreate(&task_0_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); /*UtDebug("Create Status = %d, Id = %d\n",status,task_0_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 0"); /* Try and create another "Task 0", should fail as we already have one named "Task 0" */ - status = OS_TaskCreate(&task_1_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + status = OS_TaskCreate(&task_1_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status != OS_SUCCESS, "OS_TaskCreate, dupe name 0"); - status = OS_TaskCreate(&task_2_id, "Task 2", task_2, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), + status = OS_TaskCreate(&task_2_id, "Task 2", task_generic_no_exit, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); /* UtDebug("Create Status = %d, Id = %d\n",status,task_2_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 2"); - status = OS_TaskCreate(&task_3_id, "Task 3", task_3, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), + status = OS_TaskCreate(&task_3_id, "Task 3", task_generic_no_exit, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); /* UtDebug("Create Status = %d, Id = %d\n",status,task_3_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 3"); @@ -530,29 +556,10 @@ void TestMutexes(void) /* ************************************************************************** */ void InitializeTaskIds(void) { - task_0_id = OS_OBJECT_ID_UNDEFINED; task_1_id = OS_OBJECT_ID_UNDEFINED; task_2_id = OS_OBJECT_ID_UNDEFINED; task_3_id = OS_OBJECT_ID_UNDEFINED; - task_4_id = OS_OBJECT_ID_UNDEFINED; - task_5_id = OS_OBJECT_ID_UNDEFINED; - task_6_id = OS_OBJECT_ID_UNDEFINED; - task_7_id = OS_OBJECT_ID_UNDEFINED; - task_8_id = OS_OBJECT_ID_UNDEFINED; - task_9_id = OS_OBJECT_ID_UNDEFINED; - task_10_id = OS_OBJECT_ID_UNDEFINED; - task_11_id = OS_OBJECT_ID_UNDEFINED; - task_12_id = OS_OBJECT_ID_UNDEFINED; - task_13_id = OS_OBJECT_ID_UNDEFINED; - task_14_id = OS_OBJECT_ID_UNDEFINED; - task_15_id = OS_OBJECT_ID_UNDEFINED; - task_16_id = OS_OBJECT_ID_UNDEFINED; - task_17_id = OS_OBJECT_ID_UNDEFINED; - task_18_id = OS_OBJECT_ID_UNDEFINED; - task_19_id = OS_OBJECT_ID_UNDEFINED; - task_20_id = OS_OBJECT_ID_UNDEFINED; - return; } /* end InitializeTaskIds */ @@ -563,15 +570,6 @@ void InitializeQIds(void) msgq_1 = OS_OBJECT_ID_UNDEFINED; msgq_2 = OS_OBJECT_ID_UNDEFINED; msgq_3 = OS_OBJECT_ID_UNDEFINED; - msgq_4 = OS_OBJECT_ID_UNDEFINED; - msgq_5 = OS_OBJECT_ID_UNDEFINED; - msgq_6 = OS_OBJECT_ID_UNDEFINED; - msgq_7 = OS_OBJECT_ID_UNDEFINED; - msgq_8 = OS_OBJECT_ID_UNDEFINED; - msgq_9 = OS_OBJECT_ID_UNDEFINED; - msgq_10 = OS_OBJECT_ID_UNDEFINED; - msgq_id = OS_OBJECT_ID_UNDEFINED; - return; } /* end InitializeQIds */ @@ -582,13 +580,6 @@ void InitializeBinIds(void) bin_1 = OS_OBJECT_ID_UNDEFINED; bin_2 = OS_OBJECT_ID_UNDEFINED; bin_3 = OS_OBJECT_ID_UNDEFINED; - bin_4 = OS_OBJECT_ID_UNDEFINED; - bin_5 = OS_OBJECT_ID_UNDEFINED; - bin_6 = OS_OBJECT_ID_UNDEFINED; - bin_7 = OS_OBJECT_ID_UNDEFINED; - bin_8 = OS_OBJECT_ID_UNDEFINED; - bin_9 = OS_OBJECT_ID_UNDEFINED; - bin_10 = OS_OBJECT_ID_UNDEFINED; return; } /* end InitializeBinIds */ @@ -599,15 +590,9 @@ void InitializeMutIds(void) mut_1 = OS_OBJECT_ID_UNDEFINED; mut_2 = OS_OBJECT_ID_UNDEFINED; mut_3 = OS_OBJECT_ID_UNDEFINED; - mut_4 = OS_OBJECT_ID_UNDEFINED; - mut_5 = OS_OBJECT_ID_UNDEFINED; - mut_6 = OS_OBJECT_ID_UNDEFINED; - mut_7 = OS_OBJECT_ID_UNDEFINED; - mut_8 = OS_OBJECT_ID_UNDEFINED; - mut_9 = OS_OBJECT_ID_UNDEFINED; - mut_10 = OS_OBJECT_ID_UNDEFINED; return; } /* end InitializeMutIds */ + /* ***************************************************************************** */ void TestGetInfos(void) { @@ -619,7 +604,7 @@ void TestGetInfos(void) /* first step is to create an object to to get the properties of */ - status = OS_TaskCreate(&task_0_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate"); @@ -675,7 +660,7 @@ void TestGenericQueries(void) TestCallbackState_t State; char ResourceName[OS_MAX_API_NAME]; - status = OS_TaskCreate(&task_0_id, "Task 0", task_0, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), + status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate (%ld) == OS_SUCCESS", (long)status); diff --git a/src/tests/osal-core-test/osal-core-test.h b/src/tests/osal-core-test/osal-core-test.h index 0bc5ea052..b6c7c7099 100644 --- a/src/tests/osal-core-test/osal-core-test.h +++ b/src/tests/osal-core-test/osal-core-test.h @@ -24,496 +24,29 @@ * This is a simple header file used to remove a lot of the task definitions * from the example1.c file so as to make that code easier to read * - * - * - * */ +#ifndef INCLUDE_osal_core_test_h +#define INCLUDE_osal_core_test_h + /* Task 0 */ #define TASK_0_STACK_SIZE 1024 #define TASK_0_PRIORITY 230 -uint32 task_0_stack[TASK_0_STACK_SIZE]; - -void task_0(void); - /* Task 1 */ - #define TASK_1_STACK_SIZE 1024 #define TASK_1_PRIORITY 231 -uint32 task_1_stack[TASK_1_STACK_SIZE]; - -void task_1(void); - /* Task 2 */ - #define TASK_2_STACK_SIZE 1024 #define TASK_2_PRIORITY 232 -uint32 task_2_stack[TASK_2_STACK_SIZE]; - -void task_2(void); - /* Task 3 */ - #define TASK_3_STACK_SIZE 1024 #define TASK_3_PRIORITY 233 -uint32 task_3_stack[TASK_3_STACK_SIZE]; - -void task_3(void); - -/* Task 4 */ - -#define TASK_4_STACK_SIZE 1024 -#define TASK_4_PRIORITY 234 - -uint32 task_4_stack[TASK_4_STACK_SIZE]; - -void task_4(void); - -/* Task 5 */ - -#define TASK_5_STACK_SIZE 1024 -#define TASK_5_PRIORITY 235 - -uint32 task_5_stack[TASK_5_STACK_SIZE]; - -void task_5(void); - -/* Task 6 */ - -#define TASK_6_STACK_SIZE 1024 -#define TASK_6_PRIORITY 236 - -uint32 task_6_stack[TASK_6_STACK_SIZE]; - -void task_6(void); - -/* Task 7 */ - -#define TASK_7_STACK_SIZE 1024 -#define TASK_7_PRIORITY 237 - -uint32 task_7_stack[TASK_7_STACK_SIZE]; - -void task_7(void); - -/* Task 8 */ - -#define TASK_8_STACK_SIZE 1024 -#define TASK_8_PRIORITY 238 - -uint32 task_8_stack[TASK_8_STACK_SIZE]; - -void task_8(void); - -/* Task 9 */ - -#define TASK_9_STACK_SIZE 1024 -#define TASK_9_PRIORITY 239 - -uint32 task_9_stack[TASK_9_STACK_SIZE]; - -void task_9(void); - -/* Task 10 */ - -#define TASK_10_STACK_SIZE 1024 -#define TASK_10_PRIORITY 240 - -uint32 task_10_stack[TASK_10_STACK_SIZE]; - -void task_10(void); - -/* Task 11 */ - -#define TASK_11_STACK_SIZE 1024 -#define TASK_11_PRIORITY 241 - -uint32 task_11_stack[TASK_11_STACK_SIZE]; - -void task_11(void); - -/* Task 12 */ - -#define TASK_12_STACK_SIZE 1024 -#define TASK_12_PRIORITY 242 - -uint32 task_12_stack[TASK_12_STACK_SIZE]; - -void task_12(void); - -/* Task 13 */ - -#define TASK_13_STACK_SIZE 1024 -#define TASK_13_PRIORITY 243 - -uint32 task_13_stack[TASK_13_STACK_SIZE]; - -void task_13(void); - -/* Task 14 */ - -#define TASK_14_STACK_SIZE 1024 -#define TASK_14_PRIORITY 244 - -uint32 task_14_stack[TASK_14_STACK_SIZE]; - -void task_14(void); -/* Task 15 */ - -#define TASK_15_STACK_SIZE 1024 -#define TASK_15_PRIORITY 245 - -uint32 task_15_stack[TASK_15_STACK_SIZE]; - -void task_15(void); - -/* Task 16 */ - -#define TASK_16_STACK_SIZE 1024 -#define TASK_16_PRIORITY 246 - -uint32 task_16_stack[TASK_16_STACK_SIZE]; - -void task_16(void); - -/* Task 17 */ - -#define TASK_17_STACK_SIZE 1024 -#define TASK_17_PRIORITY 247 - -uint32 task_17_stack[TASK_17_STACK_SIZE]; - -void task_17(void); - -/* Task 18 */ - -#define TASK_18_STACK_SIZE 1024 -#define TASK_18_PRIORITY 248 - -uint32 task_18_stack[TASK_18_STACK_SIZE]; - -void task_18(void); - -/* Task 19 */ - -#define TASK_19_STACK_SIZE 1024 -#define TASK_19_PRIORITY 249 - -uint32 task_19_stack[TASK_19_STACK_SIZE]; - -void task_19(void); - -/* Task 20 */ - -#define TASK_20_STACK_SIZE 1024 -#define TASK_20_PRIORITY 250 - -uint32 task_20_stack[TASK_20_STACK_SIZE]; - -void task_20(void); - /* Global Data */ - -/* Task Id's for testing the number of tasks that can be created */ -osal_id_t task_0_id, task_1_id, task_2_id, task_3_id, task_4_id, task_5_id; -osal_id_t task_6_id, task_7_id, task_8_id, task_9_id, task_10_id, task_11_id; -osal_id_t task_12_id, task_13_id, task_14_id, task_15_id, task_16_id, task_17_id; -osal_id_t task_18_id, task_19_id, task_20_id; -/* uint32 extra_id; */ - -osal_id_t mutex_id; - -/* Queue ID for testing the number of queues that can be created */ -osal_id_t msgq_0, msgq_1, msgq_2, msgq_3, msgq_4, msgq_5, msgq_6; -osal_id_t msgq_7, msgq_8, msgq_9; -osal_id_t msgq_10; - -osal_id_t msgq_id; - -osal_id_t bin_0, bin_1, bin_2, bin_3, bin_4, bin_5, bin_6; -osal_id_t bin_7, bin_8, bin_9, bin_10; - -osal_id_t mut_0, mut_1, mut_2, mut_3, mut_4, mut_5, mut_6; -osal_id_t mut_7, mut_8, mut_9, mut_10; -osal_id_t mutex_id; - -uint32 shared_resource_x; - #define MSGQ_DEPTH 50 #define MSGQ_SIZE 4 -#define PASS 0 -#define FAIL 1 - -/* ********************** TASK 0 **************************** */ - -void task_0(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; -} /* end task_0 */ - -/* ********************** TASK 1 **************************** */ - -void task_1(void) -{ - - OS_TaskRegister(); - - while (1) - ; - - return; -} /* end task_1 */ - -/* ********************** TASK 2 **************************** */ - -void task_2(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; -} /* end task_2 */ - -/* ********************** TASK 3 **************************** */ - -void task_3(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; -} /* end task_3 */ - -/* ********************** TASK 4 **************************** */ - -void task_4(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; -} /* end task_4 */ - -/* ********************** TASK 0 **************************** */ - -void task_5(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_5 */ - -/* ********************** TASK 6 **************************** */ - -void task_6(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_6 */ - -/* ********************** TASK 7 **************************** */ - -void task_7(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_7 */ - -/* ********************** TASK 8 **************************** */ - -void task_8(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_8 */ - -/* ********************** TASK 9 **************************** */ - -void task_9(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_9 */ - -/* ********************** TASK 10 **************************** */ - -void task_10(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_10 */ - -/* ********************** TASK 11 **************************** */ - -void task_11(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_11 */ - -/* ********************** TASK 12 **************************** */ - -void task_12(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_12 */ - -/* ********************** TASK 13 **************************** */ - -void task_13(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_13 */ - -/* ********************** TASK 14 **************************** */ - -void task_14(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_14 */ - -/* ********************** TASK 15 **************************** */ - -void task_15(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_15 */ - -/* ********************** TASK 16 **************************** */ - -void task_16(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_16 */ - -/* ********************** TASK 17 **************************** */ - -void task_17(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_17 */ - -/* ********************** TASK 18 **************************** */ - -void task_18(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_18 */ - -/* ********************** TASK 19 **************************** */ - -void task_19(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_19 */ - -/* ********************** TASK 20 **************************** */ - -void task_20(void) -{ - OS_TaskRegister(); - - while (1) - ; - - return; - -} /* end task_20 */ +#endif /* INCLUDE_osal_core_test_h */ From 4a4a98bbf856b8501f3bb81efceeaa84903d1fe5 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 8 Dec 2020 14:33:11 -0500 Subject: [PATCH 025/111] Fix #290, Remove obsolete printf tests --- src/unit-tests/osprintf-test/CMakeLists.txt | 28 -- src/unit-tests/osprintf-test/ut_osprintf.c | 326 ------------- src/unit-tests/osprintf-test/ut_osprintf.h | 111 ----- src/unit-tests/osprintf-test/ut_osprintf_c.c | 82 ---- src/unit-tests/osprintf-test/ut_osprintf_d.c | 174 ------- src/unit-tests/osprintf-test/ut_osprintf_f.c | 96 ---- src/unit-tests/osprintf-test/ut_osprintf_i.c | 174 ------- src/unit-tests/osprintf-test/ut_osprintf_ld.c | 181 ------- src/unit-tests/osprintf-test/ut_osprintf_lf.c | 98 ---- src/unit-tests/osprintf-test/ut_osprintf_li.c | 181 ------- src/unit-tests/osprintf-test/ut_osprintf_lu.c | 91 ---- src/unit-tests/osprintf-test/ut_osprintf_lx.c | 90 ---- .../osprintf-test/ut_osprintf_lx_uc.c | 90 ---- .../osprintf-test/ut_osprintf_misc.c | 179 ------- .../osprintf-test/ut_osprintf_offset.c | 454 ------------------ .../osprintf-test/ut_osprintf_offset.h | 76 --- .../osprintf-test/ut_osprintf_offset_dummy.c | 87 ---- src/unit-tests/osprintf-test/ut_osprintf_p.c | 84 ---- .../osprintf-test/ut_osprintf_printf.c | 49 -- src/unit-tests/osprintf-test/ut_osprintf_s.c | 84 ---- src/unit-tests/osprintf-test/ut_osprintf_u.c | 85 ---- src/unit-tests/osprintf-test/ut_osprintf_x.c | 90 ---- .../osprintf-test/ut_osprintf_x_uc.c | 90 ---- 23 files changed, 3000 deletions(-) delete mode 100644 src/unit-tests/osprintf-test/CMakeLists.txt delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf.h delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_c.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_d.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_f.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_i.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_ld.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_lf.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_li.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_lu.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_lx.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_lx_uc.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_misc.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_offset.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_offset.h delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_offset_dummy.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_p.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_printf.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_s.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_u.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_x.c delete mode 100644 src/unit-tests/osprintf-test/ut_osprintf_x_uc.c diff --git a/src/unit-tests/osprintf-test/CMakeLists.txt b/src/unit-tests/osprintf-test/CMakeLists.txt deleted file mode 100644 index 86abb7f0f..000000000 --- a/src/unit-tests/osprintf-test/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -# CMake snippet for OSAL printf test - -set(TEST_MODULE_FILES - ut_osprintf.c - ut_osprintf_c.c - ut_osprintf_d.c - ut_osprintf_f.c - ut_osprintf_i.c - ut_osprintf_ld.c - ut_osprintf_lf.c - ut_osprintf_li.c - ut_osprintf_lu.c - ut_osprintf_lx.c - ut_osprintf_lx_uc.c - ut_osprintf_misc.c - ut_osprintf_offset.c - ut_osprintf_offset_dummy.c - ut_osprintf_p.c - ut_osprintf_printf.c - ut_osprintf_s.c - ut_osprintf_u.c - ut_osprintf_x.c - ut_osprintf_x_uc.c -) - -add_stubs(TEST_STUBS os) -add_osal_ut_exe(osal_osprintf_UT ${TEST_MODULE_FILES} ${TEST_STUBS}) - diff --git a/src/unit-tests/osprintf-test/ut_osprintf.c b/src/unit-tests/osprintf-test/ut_osprintf.c deleted file mode 100644 index f6da52c2b..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * ut_osprintf.c - * - * Created on: May 20, 2013 - * Author: Kevin McCluney - */ - -/* -** Includes -*/ -#include "ut_osprintf.h" -#ifdef UT_DO_OFFSET -#include "ut_osprintf_offset.h" -#endif - -#ifndef OSP_ARINC653 -#include - -FILE *UT_logfile; -#endif - -/* -** Global variables -*/ -unsigned OS_printf_enabled = 1; -int ut_passed; -int ut_failed; -char cMsg[UT_MAX_MESSAGE_LENGTH]; -char cNum[UT_MAX_MESSAGE_LENGTH]; -char strg_buf[BUF_LEN]; -char trunc_buf[BUF_LEN]; -char fill_strg[BUF_LEN]; - -/* -** Functions -*/ -#ifdef OSP_ARINC653 -int os_printf_main() -#else -int main() -#endif -{ - int i; - -#ifndef OSP_ARINC653 - UT_logfile = fopen("ut_osal_osprintf_log.txt", "w"); -#endif - -#ifdef OS_USE_EMBEDDED_PRINTF - UT_Text("Using replacement printf functions\n\n"); -#else - UT_Text("Using standard printf functions\n\n"); -#endif - - for (i = 0; i < BUF_LEN; i++) - { - fill_strg[i] = '*'; - } - - ut_passed = 0; - ut_failed = 0; - - /* Test sprintf and snprintf for each format */ - UT_osprintf_d(); - UT_osprintf_i(); - UT_osprintf_u(); - UT_osprintf_x(); - UT_osprintf_X(); - UT_osprintf_p(); - UT_osprintf_c(); - UT_osprintf_s(); - UT_osprintf_ld(); - UT_osprintf_li(); - UT_osprintf_lu(); - UT_osprintf_lx(); - UT_osprintf_lX(); - -#ifndef UT_NO_FLOAT - UT_osprintf_f(); - UT_osprintf_lf(); - UT_osprintf_misc(); -#endif - -#ifdef OS_USE_EMBEDDED_PRINTF - UT_osprintf_printf(); -#endif - - UT_ReportFailures(); - -#ifdef UT_DO_OFFSET - /* Calculate argument offsets for cFE variadic functions */ - UT_osprintf_CalcOffsets(); -#endif - -#ifndef OSP_ARINC653 - /* Ensure everything gets written */ - fflush(stdout); - fclose(UT_logfile); -#endif - - return 0; -} - -/* -** Initialize string buffer to all asterisks -*/ -void init_test(void) -{ - memcpy(strg_buf, fill_strg, BUF_LEN); -} - -/* -** Compare expected string output to actual string output; return -** pass/fail result -*/ -int check_test(char *expected, char *actual) -{ - int result = UT_PASS; - - if (memcmp(expected, actual, strlen(expected) + 1)) - { - strcpy(cMsg, " Mismatch: exp = ["); - strcat(cMsg, expected); - strcat(cMsg, "], act = ["); - strcat(cMsg, actual); - strcat(cMsg, "]\n"); - UT_Text(cMsg); - result = UT_FAIL; - } - - return result; -} - -/* -** Output text -*/ -void UT_Text(char *out_text) -{ -#ifdef OSP_ARINC653 - TUTF_print(out_text); - TUTF_print("\n"); -#else - fprintf(UT_logfile, "%s", out_text); - fflush(UT_logfile); -#endif -} - -/* -** Output result of a test -*/ -void UT_Report(int test, char *fun_name, char *info, char *test_num, char *test_seq) -{ - if (test == UT_PASS) - { -#ifdef UT_SHOW_PASS - strcpy(cMsg, "PASSED ["); - strcat(cMsg, fun_name); - strcat(cMsg, "."); - strcat(cMsg, test_num); - strcat(cMsg, "."); - strcat(cMsg, test_seq); - strcat(cMsg, "] "); - strcat(cMsg, info); - strcat(cMsg, "\n-----\n"); - UT_Text(cMsg); -#endif - ut_passed++; - } - else - { - strcpy(cMsg, "FAILED ["); - strcat(cMsg, fun_name); - strcat(cMsg, "."); - strcat(cMsg, test_num); - strcat(cMsg, "."); - strcat(cMsg, test_seq); - strcat(cMsg, "] "); - strcat(cMsg, info); - strcat(cMsg, "\n-----\n"); - UT_Text(cMsg); - ut_failed++; - } -} - -/* -** Convert an integer to its character representation -*/ -void UT_itoa(int value, char *string, int radix, int out_len) -{ - char revertedStr[50]; - int revertedLength = 0; - unsigned int length = 0; - unsigned int neg = 0; - unsigned int digit_value = 0; - unsigned int uvalue; - - if ((radix == 10) && (value < 0)) - { - neg = 1; - uvalue = -value; - } - else - { - uvalue = (unsigned int)value; - } - - revertedLength = 0; - - while (uvalue >= radix) - { - digit_value = uvalue % radix; - - if (digit_value >= 10) - { - revertedStr[revertedLength] = digit_value - 10 + 'a'; - } - else - { - revertedStr[revertedLength] = digit_value + '0'; - } - - uvalue /= radix; - revertedLength++; - } - - if (uvalue >= 10) - { - revertedStr[revertedLength] = uvalue - 10 + 'a'; - } - else - { - revertedStr[revertedLength] = uvalue + '0'; - } - - if (neg == 1) - { - string[length] = '-'; - length++; - } - - if (revertedLength < out_len - 1) - { - while (revertedLength < out_len - 1) - { - revertedLength++; - revertedStr[revertedLength] = '0'; - } - } - - while (revertedLength >= 0) - { - string[length] = revertedStr[revertedLength]; - revertedLength--; - length++; - } - - string[length] = '\0'; -} - -/* -** Output summary of test results (# of passed & failed tests) -*/ -void UT_ReportFailures(void) -{ - char cNum[10]; - - strcpy(cMsg, "\nosprintf PASSED "); - UT_itoa(ut_passed, cNum, 10, 0); - strcat(cMsg, cNum); - strcat(cMsg, " tests.\n"); - strcat(cMsg, "osprintf FAILED "); - UT_itoa(ut_failed, cNum, 10, 0); - strcat(cMsg, cNum); - strcat(cMsg, " tests.\n"); - UT_Text(cMsg); - -#ifndef OSP_ARINC653 - printf("\nosprintf PASSED %d tests.\nosprintf FAILED %d tests.\n\n", ut_passed, ut_failed); -#endif -} - -#ifdef OSP_ARINC653 -/* -** Stub function for OS_MutSemCreate() -*/ -int32 OS_MutSemCreate(uint32 *mutex_id, const char *mutex_name, uint32 options) -{ - return 0; -} - -/* -** Stub function for OS_MutSemGive() -*/ -int32 OS_MutSemGive(uint32 mutex_id) -{ - return 0; -} - -/* -** Stub function for OS_MutSemTake() -*/ -int32 OS_MutSemTake(uint32 mutex_id) -{ - return 0; -} -#endif diff --git a/src/unit-tests/osprintf-test/ut_osprintf.h b/src/unit-tests/osprintf-test/ut_osprintf.h deleted file mode 100644 index 1a691fd79..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * ut_osprintf.h - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#ifndef UT_OSPRINTF_H_ -#define UT_OSPRINTF_H_ - -/* -** Includes -*/ -#include -#include - -/* printf Replacement Unit Test Compiler Flags - - Define UT_SHOW_PASS in order to display passing tests; if undefined then - only the failed tests are displayed. In either case the total number of - tests passes and failed are displayed - - Define UT_NO_FLOAT to skip the tests for floating point printf's; - undefine to include these tests - - Define UT_DO_OFFSET when compiling on the GHS target to perform tests to - determine variable parameter offset values for the cFE variadic functions - - Define OSP_GHS to compile on the GHS platform - osprintf Compiler Flags - - Define OS_USE_EMBEDDED_PRINTF to test the replacement printf functions; - undefine it to test the standard printf functions - - Define OSP_ARINC653 if using embedded (replacement) printf functions - and compiling on the GHS target using cFE modified for ARINC653 -*/ - -#ifdef OS_USE_EMBEDDED_PRINTF -#include "osprintf.h" -#ifndef OSP_GHS -int putchar(int); -#endif -#else -#include -#endif - -#ifdef OSP_ARINC653 -#include "common_types.h" -#endif - -/* -** Macro Definitions -*/ -#define BUF_LEN 200 -#define UT_MAX_MESSAGE_LENGTH 300 -#define UT_TRUE 1 -#define UT_FALSE 0 -#define UT_PASS 0 -#define UT_FAIL 1 - -/* -** Function prototypes -*/ -void init_test(void); -int check_test(char *expected, char *actual); - -void UT_osprintf_d(void); -void UT_osprintf_i(void); -void UT_osprintf_u(void); -void UT_osprintf_x(void); -void UT_osprintf_X(void); -void UT_osprintf_p(void); -void UT_osprintf_c(void); -void UT_osprintf_s(void); -void UT_osprintf_ld(void); -void UT_osprintf_li(void); -void UT_osprintf_lu(void); -void UT_osprintf_lx(void); -void UT_osprintf_lX(void); - -#ifndef UT_NO_FLOAT -void UT_osprintf_f(void); -void UT_osprintf_lf(void); -void UT_osprintf_misc(void); -#endif - -#ifdef OS_USE_EMBEDDED_PRINTF -void UT_osprintf_printf(void); -#endif - -void UT_Text(char *out_text); -void UT_Report(int test, char *fun_name, char *info, char *test_num, char *test_seq); -void UT_itoa(int value, char *string, int radix, int out_len); -void UT_ReportFailures(void); - -#endif /* UT_OSPRINTF_H_ */ diff --git a/src/unit-tests/osprintf-test/ut_osprintf_c.c b/src/unit-tests/osprintf-test/ut_osprintf_c.c deleted file mode 100644 index 28990c2e4..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_c.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_c.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %c format - *****************************************************************************/ -void UT_osprintf_c(void) -{ - char *test_fmt = "c"; /* Test format character(s) */ - int i; - - struct - { - char *test_num; /* Test identifier; sequential numbers */ - char test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char *format; /* Format string */ - char *expected; /* Expected result */ - char *description; /* Test description */ - } osp_tests[] = { - {"01", 'k', 1, "%c", "k", "%c"}, - {"02", 'w', 5, "$$$%c$$$", "$$$w$$$", "%c embedded"}, - {"03", '?', 19, "%20c", " ?", "%c with minimum field size"}, - {"04", 'Q', 2, "%.10c", "Q", "%c with maximum field size"}, - {"05", '>', 5, "%7.9c", " >", "%c with minimum and maximum field size"}, - {"06", '#', 17, "%-20c", "# ", "%c with left-justify"}, - {"07", 'H', 2, "%+c", "H", "%c with sign"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_d.c b/src/unit-tests/osprintf-test/ut_osprintf_d.c deleted file mode 100644 index ef33168d6..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_d.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_d.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %d format - *****************************************************************************/ -void UT_osprintf_d(void) -{ - char *test_fmt = "d"; /* Test format character(s) */ - int i; - - struct - { - char *test_num; /* Test identifier; sequential numbers */ - int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char *format; /* Format string */ - char *expected; /* Expected result */ - char *description; /* Test description */ - } osp_tests[] = { - {"01", 98765, 5, "%d", "98765", "%d only"}, - {"02", 46372, 8, "$$$%d$$$", "$$$46372$$$", "%d embedded, positive value"}, - {"03", 98765, 5, "% d", " 98765", "%d with space for sign, positive value"}, - {"04", 91827, 6, "%8d", " 91827", "%d with minimum field size > number of digits, positive value"}, - {"05", 91827, 4, "%4d", "91827", "%d with minimum field size < number of digits, positive value"}, - {"06", 33225, 8, "%.10d", "0000033225", "%d with precision field size > number of digits, positive value"}, - {"07", 33225, 5, "%.3d", "33225", "%d with precision field size < number of digits, positive value"}, - {"08", 12345, 8, "%9.7d", " 0012345", - "%d with minimum field size > precision field size > number of digits, positive value"}, - {"09", 12345, 6, "%9.3d", " 12345", - "%d with minimum field size > number of digits > precision field size, positive value"}, - {"10", 12345, 3, "%4.2d", "12345", - "%d with number of digits > minimum field size > precision field size, positive value"}, - {"11", 12345, 7, "%7.9d", "000012345", - "%d with precision field size > minimum field size > number of digits, positive value"}, - {"12", 12345, 8, "%3.9d", "000012345", - "%d with precision field size > number of digits > minimum field size, positive value"}, - {"13", 12345, 4, "%2.4d", "12345", - "%d with number of digits > precision field size > minimum field size, positive value"}, - {"14", 98765, 17, "%-.20d", "00000000000000098765", - "%d with left-justify and precision field size > number of digits, positive value"}, - {"15", 98765, 5, "%-.3d", "98765", - "%d with left-justify and precision field size < number of digits, positive value"}, - {"16", 98765, 4, "%+d", "+98765", "%d with sign, positive value"}, - {"17", 46372, 9, "$$$%+d$$$", "$$$+46372$$$", "%d sign and embedded, positive value"}, - {"18", 91827, 8, "%+8d", " +91827", "%d with sign and minimum field size > number of digits, positive value"}, - {"19", 91827, 5, "%+4d", "+91827", "%d with sign and minimum field size < number of digits, positive value"}, - {"20", 33225, 10, "%+.10d", "+0000033225", - "%d with sign and precision field size > number of digits, positive value"}, - {"21", 33225, 4, "%+.3d", "+33225", "%d with sign and precision field size < number of digits, positive value"}, - {"22", 12345, 6, "%+9.7d", " +0012345", - "%d with sign and minimum field size > precision field size > number of digits, positive value"}, - {"23", 12345, 7, "%+9.3d", " +12345", - "%d with sign and minimum field size > number of digits > precision field size, positive value"}, - {"24", 12345, 2, "%+4.2d", "+12345", - "%d with sign and number of digits > minimum field size > precision field size, positive value"}, - {"25", 12345, 6, "%+7.9d", "+000012345", - "%d with sign and precision field size > minimum field size > number of digits, positive value"}, - {"26", 12345, 8, "%+3.9d", "+000012345", - "%d with sign and precision field size > number of digits > minimum field size, positive value"}, - {"27", 12345, 5, "%+2.4d", "+12345", - "%d with sign and number of digits > precision field size > minimum field size, positive value"}, - {"28", 98765, 16, "%+-.20d", "+00000000000000098765", - "%d with sign and left-justify and precision field size > number of digits, positive value"}, - {"29", 98765, 5, "%+-.3d", "+98765", - "%d with sign and left-justify and precision field size < number of digits, positive value"}, - {"30", 98765, 3, "%+d", "+98765", "%d with sign, positive value"}, - {"31", -98765, 2, "%d", "-98765", "%d, negative value"}, - {"32", -46372, 8, "$$$%d$$$", "$$$-46372$$$", "%d embedded, negative value"}, - {"33", -98765, 5, "% d", "-98765", "%d with space for sign, negative value"}, - {"34", -91827, 9, "%10d", " -91827", "%d with minimum field size > number of digits, negative value"}, - {"35", -91827, 5, "%4d", "-91827", "%d with minimum field size < number of digits, negative value"}, - {"36", -33225, 7, "%.10d", "-0000033225", "%d with precision field size > number of digits, negative value"}, - {"37", -33225, 4, "%.3d", "-33225", "%d with precision field size < number of digits, negative value"}, - {"38", -12345, 8, "%9.7d", " -0012345", - "%d with minimum field size > precision field size > number of digits, negative value"}, - {"39", -12345, 9, "%9.3d", " -12345", - "%d with minimum field size > number of digits > precision field size, negative value"}, - {"40", -12345, 5, "%4.2d", "-12345", - "%d with number of digits > minimum field size > precision field size, negative value"}, - {"41", -12345, 7, "%7.9d", "-000012345", - "%d with precision field size > minimum field size > number of digits, negative value"}, - {"42", -12345, 8, "%3.9d", "-000012345", - "%d with precision field size > number of digits > minimum field size, negative value"}, - {"43", -12345, 5, "%2.4d", "-12345", - "%d with number of digits > precision field size > minimum field size, negative value"}, - {"44", -98765, 20, "%-.20d", "-00000000000000098765", - "%d with left-justify and precision field size > number of digits, negative value"}, - {"45", -98765, 5, "%-.3d", "-98765", - "%d with left-justify and precision field size < number of digits, negative value"}, - {"46", -98765, 6, "%+d", "-98765", "%d with sign, negative value"}, - {"47", -46372, 8, "$$$%+d$$$", "$$$-46372$$$", "%d sign and embedded, negative value"}, - {"48", -91827, 7, "%+8d", " -91827", "%d with sign and minimum field size > number of digits, negative value"}, - {"49", -91827, 5, "%+4d", "-91827", "%d with sign and minimum field size < number of digits, negative value"}, - {"50", -33225, 9, "%+.10d", "-0000033225", - "%d with sign and precision field size > number of digits, negative value"}, - {"51", -33225, 5, "%+.3d", "-33225", - "%d with sign and precision field size < number of digits, negative value"}, - {"52", -12345, 6, "%+9.7d", " -0012345", - "%d with sign and minimum field size > precision field size > number of digits, negative value"}, - {"53", -12345, 7, "%+9.3d", " -12345", - "%d with sign and minimum field size > number of digits > precision field size, negative value"}, - {"54", -12345, 5, "%+4.2d", "-12345", - "%d with sign and number of digits > minimum field size > precision field size, negative value"}, - {"55", -12345, 8, "%+7.9d", "-000012345", - "%d with sign and precision field size > minimum field size > number of digits, negative value"}, - {"56", -12345, 7, "%+3.9d", "-000012345", - "%d with sign and precision field size > number of digits > minimum field size, negative value"}, - {"57", -12345, 6, "%+2.4d", "-12345", - "%d with sign and number of digits > precision field size > minimum field size, negative value"}, - {"58", -98765, 13, "%+-.20d", "-00000000000000098765", - "%d with sign and left-justify and precision field size > number of digits, negative value"}, - {"59", -98765, 4, "%+-.3d", "-98765", - "%d with sign and left-justify and precision field size < number of digits, negative value"}, - {"60", -98765, 5, "%+d", "-98765", "%d with sign, negative value"}, - {"61", 0, 6, "%d", "0", "%d, zero value"}, - {"62", 162534, 5, "%08d", "00162534", "%d with zero padding, positive value"}, - {"63", -162534, 6, "%08d", "-0162534", "%d with zero padding, negative value"}, - {"64", 0, 6, "%04d", "0000", "%d, with zero padding, zero value"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_f.c b/src/unit-tests/osprintf-test/ut_osprintf_f.c deleted file mode 100644 index 08ca59d6f..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_f.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_f.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %f format - *****************************************************************************/ -void UT_osprintf_f(void) -{ - char *test_fmt = "f"; /* Test format character(s) */ - int i; - - struct - { - char *test_num; /* Test identifier; sequential numbers */ - float test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char *format; /* Format string */ - char *expected; /* Expected result */ - char *description; /* Test description */ - } osp_tests[] = { - {"01", 5.230, 6, "%f", "5.230000", "%f, positive value"}, - {"02", 2.1056, 9, "$$$%f$$$", "$$$2.105600$$$", "%f embedded, positive value"}, - {"03", 91827.3, 4, "%3f", "91827.296875", "%f with maximum field size, positive value"}, - {"04", 5.82345, 5, "%.3f", "5.823", "%f with minimum field size, positive value"}, - {"05", 12.6789, 8, "%9.5f", " 12.67890", "%f with minimum and maximum field size, positive value"}, - {"06", 65.5678, 13, "%-20.5f", "65.56780 ", "%f with left-justify, positive value"}, - {"07", 2.7944, 8, "%+f", "+2.794400", "%f with sign, positive value"}, - {"08", -0.6712237, 7, "%f", "-0.671224", "%f, negative value"}, - {"09", -7.1109, 8, "$$$%f$$$", "$$$-7.110900$$$", "%f embedded, negative value"}, - {"10", -918.987, 6, "%3f", "-918.987000", "%f with maximum field size, negative value"}, - {"11", -3.1415, 3, "%.2f", "-3.14", "%f with precision, negative value"}, - {"12", -1.23456, 6, "%9.7f", "-1.2345600", "%f with precision and maximum field size, negative value"}, - {"13", -65.65, 5, "%-8.3f", "-65.650 ", "%f with left-justify, negative value"}, - {"14", 0.0, 4, "%f", "0.000000", "%f, zero value"}, - {"15", 4.0, 6, "%7.0f", " 4", "%f, no fraction, positive value"}, - {"16", -56.0, 6, "%6.0f", " -56", "%f, no fraction, negative value"}, - {"17", 4887.12, 5, "%010.3f", "004887.120", "%f with zero padding, positive value"}, - {"18", -4887.12, 5, "%010.3f", "-04887.120", "%f with zero padding, negative value"}, - {"19", 0.0, 6, "%06.2f", "000.00", "%f, with zero padding, zero value"}, - {"20", 4.0, 6, "%07.0f", "0000004", "%f, zero padding, no fraction, positive value"}, - {"21", -56.0, 6, "%06.0f", "-00056", "%f, zero padding, no fraction, negative value"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_i.c b/src/unit-tests/osprintf-test/ut_osprintf_i.c deleted file mode 100644 index 83ed728ca..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_i.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_i.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %i format - *****************************************************************************/ -void UT_osprintf_i(void) -{ - char *test_fmt = "i"; /* Test format character(s) */ - int i; - - struct - { - char *test_num; /* Test identifier; sequential numbers */ - int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char *format; /* Format string */ - char *expected; /* Expected result */ - char *description; /* Test description */ - } osp_tests[] = { - {"01", 98765, 5, "%i", "98765", "%i, positive value"}, - {"02", 46372, 9, "$$$%i$$$", "$$$46372$$$", "%i embedded, positive value"}, - {"03", 98765, 5, "% i", " 98765", "%i with space for sign, positive value"}, - {"04", 91827, 7, "%8i", " 91827", "%i with minimum field size > number of digits, positive value"}, - {"05", 91827, 2, "%4i", "91827", "%i with minimum field size < number of digits, positive value"}, - {"06", 33225, 7, "%.10i", "0000033225", "%i with precision field size > number of digits, positive value"}, - {"07", 33225, 3, "%.3i", "33225", "%i with precision field size < number of digits, positive value"}, - {"08", 12345, 5, "%9.7i", " 0012345", - "%i with minimum field size > precision field size > number of digits, positive value"}, - {"09", 12345, 5, "%9.3i", " 12345", - "%i with minimum field size > number of digits > precision field size, positive value"}, - {"10", 12345, 5, "%4.2i", "12345", - "%i with number of digits > minimum field size > precision field size, positive value"}, - {"11", 12345, 8, "%7.9i", "000012345", - "%i with precision field size > minimum field size > number of digits, positive value"}, - {"12", 12345, 7, "%3.9i", "000012345", - "%i with precision field size > number of digits > minimum field size, positive value"}, - {"13", 12345, 4, "%2.4i", "12345", - "%i with number of digits > precision field size > minimum field size, positive value"}, - {"14", 98765, 5, "%-.20i", "00000000000000098765", - "%i with left-justify and precision field size > number of digits, positive value"}, - {"15", 98765, 5, "%-.3i", "98765", - "%i with left-justify and precision field size < number of digits, positive value"}, - {"16", 98765, 5, "%+i", "+98765", "%i with sign, positive value"}, - {"17", 46372, 5, "$$$%+d$$$", "$$$+46372$$$", "%i sign and embedded, positive value"}, - {"18", 91827, 6, "%+8i", " +91827", "%i with sign and minimum field size > number of digits, positive value"}, - {"19", 91827, 4, "%+4i", "+91827", "%i with sign and minimum field size < number of digits, positive value"}, - {"20", 33225, 8, "%+.10i", "+0000033225", - "%i with sign and precision field size > number of digits, positive value"}, - {"21", 33225, 5, "%+.3i", "+33225", "%i with sign and precision field size < number of digits, positive value"}, - {"22", 12345, 5, "%+9.7i", " +0012345", - "%i with sign and minimum field size > precision field size > number of digits, positive value"}, - {"23", 12345, 5, "%+9.3i", " +12345", - "%i with sign and minimum field size > number of digits > precision field size, positive value"}, - {"24", 12345, 5, "%+4.2i", "+12345", - "%i with sign and number of digits > minimum field size > precision field size, positive value"}, - {"25", 12345, 8, "%+7.9i", "+000012345", - "%i with sign and precision field size > minimum field size > number of digits, positive value"}, - {"26", 12345, 7, "%+3.9i", "+000012345", - "%i with sign and precision field size > number of digits > minimum field size, positive value"}, - {"27", 12345, 5, "%+2.4i", "+12345", - "%i with sign and number of digits > precision field size > minimum field size, positive value"}, - {"28", 98765, 16, "%+-.20i", "+00000000000000098765", - "%i with sign and left-justify and precision field size > number of digits, positive value"}, - {"29", 98765, 5, "%+-.3i", "+98765", - "%i with sign and left-justify and precision field size < number of digits, positive value"}, - {"30", 98765, 4, "%+i", "+98765", "%i with sign, positive value"}, - {"31", -98765, 6, "%i", "-98765", "%i, negative value"}, - {"32", -46372, 6, "$$$%i$$$", "$$$-46372$$$", "%i embedded, negative value"}, - {"33", -98765, 5, "% i", "-98765", "%i with space for sign, negative value"}, - {"34", -91827, 9, "%10i", " -91827", "%i with minimum field size > number of digits, negative value"}, - {"35", -91827, 6, "%4i", "-91827", "%i with minimum field size < number of digits, negative value"}, - {"36", -33225, 9, "%.10i", "-0000033225", "%i with precision field size > number of digits, negative value"}, - {"37", -33225, 5, "%.3i", "-33225", "%i with precision field size < number of digits, negative value"}, - {"38", -12345, 8, "%9.7i", " -0012345", - "%i with minimum field size > precision field size > number of digits, negative value"}, - {"39", -12345, 7, "%9.3i", " -12345", - "%i with minimum field size > number of digits > precision field size, negative value"}, - {"40", -12345, 6, "%4.2i", "-12345", - "%i with number of digits > minimum field size > precision field size, negative value"}, - {"41", -12345, 7, "%7.9i", "-000012345", - "%i with precision field size > minimum field size > number of digits, negative value"}, - {"42", -12345, 8, "%3.9i", "-000012345", - "%i with precision field size > number of digits > minimum field size, negative value"}, - {"43", -12345, 5, "%2.4i", "-12345", - "%i with number of digits > precision field size > minimum field size, negative value"}, - {"44", -98765, 18, "%-.20i", "-00000000000000098765", - "%i with left-justify and precision field size > number of digits, negative value"}, - {"45", -98765, 5, "%-.3i", "-98765", - "%i with left-justify and precision field size < number of digits, negative value"}, - {"46", -98765, 6, "%+i", "-98765", "%i with sign, negative value"}, - {"47", -46372, 7, "$$$%+d$$$", "$$$-46372$$$", "%i sign and embedded, negative value"}, - {"48", -91827, 5, "%+8i", " -91827", "%i with sign and minimum field size > number of digits, negative value"}, - {"49", -91827, 5, "%+4i", "-91827", "%i with sign and minimum field size < number of digits, negative value"}, - {"50", -33225, 7, "%+.10i", "-0000033225", - "%i with sign and precision field size > number of digits, negative value"}, - {"51", -33225, 5, "%+.3i", "-33225", - "%i with sign and precision field size < number of digits, negative value"}, - {"52", -12345, 7, "%+9.7i", " -0012345", - "%i with sign and minimum field size > precision field size > number of digits, negative value"}, - {"53", -12345, 8, "%+9.3i", " -12345", - "%i with sign and minimum field size > number of digits > precision field size, negative value"}, - {"54", -12345, 4, "%+4.2i", "-12345", - "%i with sign and number of digits > minimum field size > precision field size, negative value"}, - {"55", -12345, 8, "%+7.9i", "-000012345", - "%i with sign and precision field size > minimum field size > number of digits, negative value"}, - {"56", -12345, 7, "%+3.9i", "-000012345", - "%i with sign and precision field size > number of digits > minimum field size, negative value"}, - {"57", -12345, 5, "%+2.4i", "-12345", - "%i with sign and number of digits > precision field size > minimum field size, negative value"}, - {"58", -98765, 19, "%+-.20i", "-00000000000000098765", - "%i with sign and left-justify and precision field size > number of digits, negative value"}, - {"59", -98765, 6, "%+-.3i", "-98765", - "%i with sign and left-justify and precision field size < number of digits, negative value"}, - {"60", -98765, 5, "%+i", "-98765", "%i with sign, negative value"}, - {"61", 0, 6, "%i", "0", "%i, zero value"}, - {"62", 162534, 5, "%08i", "00162534", "%i with zero padding, positive value"}, - {"63", -162534, 6, "%08i", "-0162534", "%i with zero padding, negative value"}, - {"64", 0, 6, "%04i", "0000", "%i, with zero padding, zero value"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_ld.c b/src/unit-tests/osprintf-test/ut_osprintf_ld.c deleted file mode 100644 index 9236fa157..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_ld.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_ld.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %ld format - *****************************************************************************/ -void UT_osprintf_ld(void) -{ - char *test_fmt = "ld"; /* Test format character(s) */ - int i; - - struct - { - char * test_num; /* Test identifier; sequential numbers */ - long int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 12798765, 5, "%ld", "12798765", "%ld, positive value"}, - {"02", 43246372, 9, "$$$%ld$$$", "$$$43246372$$$", "%ld embedded, positive value"}, - {"03", 63198765, 9, "% ld", " 63198765", "%ld with space for sign, positive value"}, - {"04", 77691827, 8, "%11ld", " 77691827", "%ld with minimum field size > number of digits, positive value"}, - {"05", 54691827, 5, "%4ld", "54691827", "%ld with minimum field size < number of digits, positive value"}, - {"06", 77833225, 7, "%.10ld", "0077833225", "%ld with precision field size > number of digits, positive value"}, - {"07", 99933225, 6, "%.3ld", "99933225", "%ld with precision field size < number of digits, positive value"}, - {"08", 12345789, 8, "%12.10ld", " 0012345789", - "%ld with minimum field size > precision field size > number of digits, positive value"}, - {"09", 12345987, 7, "%12.3ld", " 12345987", - "%ld with minimum field size > number of digits > precision field size, positive value"}, - {"10", 12345444, 8, "%4.2ld", "12345444", - "%ld with number of digits > minimum field size > precision field size, positive value"}, - {"11", 12345321, 10, "%10.12ld", "000012345321", - "%ld with precision field size > minimum field size > number of digits, positive value"}, - {"12", 12333345, 9, "%6.12ld", "000012333345", - "%ld with precision field size > number of digits > minimum field size, positive value"}, - {"13", 12345777, 8, "%2.4ld", "12345777", - "%ld with number of digits > precision field size > minimum field size, positive value"}, - {"14", 98765321, 15, "%-.20ld", "00000000000098765321", - "%ld with left-justify and precision field size > number of digits, positive value"}, - {"15", 98765111, 8, "%-.3ld", "98765111", - "%ld with left-justify and precision field size < number of digits, positive value"}, - {"16", 98765222, 8, "%+ld", "+98765222", "%ld with sign, positive value"}, - {"17", 46372333, 7, "$$$%+ld$$$", "$$$+46372333$$$", "%ld sign and embedded, positive value"}, - {"18", 91827444, 6, "%+11ld", " +91827444", - "%ld with sign and minimum field size > number of digits, positive value"}, - {"19", 91827555, 5, "%+4ld", "+91827555", - "%ld with sign and minimum field size < number of digits, positive value"}, - {"20", 33225666, 7, "%+.13ld", "+0000033225666", - "%ld with sign and precision field size > number of digits, positive value"}, - {"21", 33225777, 8, "%+.3ld", "+33225777", - "%ld with sign and precision field size < number of digits, positive value"}, - {"22", 12345888, 9, "%+12.10ld", " +0012345888", - "%ld with sign and minimum field size > precision field size > number of digits, positive value"}, - {"23", 12345999, 10, "%+12.3ld", " +12345999", - "%ld with sign and minimum field size > number of digits > precision field size, positive value"}, - {"24", 12345000, 8, "%+4.2ld", "+12345000", - "%ld with sign and number of digits > minimum field size > precision field size, positive value"}, - {"25", 12345121, 9, "%+10.12ld", "+000012345121", - "%ld with sign and precision field size > minimum field size > number of digits, positive value"}, - {"26", 12345232, 8, "%+6.12ld", "+000012345232", - "%ld with sign and precision field size > number of digits > minimum field size, positive value"}, - {"27", 12345343, 6, "%+2.4ld", "+12345343", - "%ld with sign and number of digits > precision field size > minimum field size, positive value"}, - {"28", 98765454, 19, "%+-.20ld", "+00000000000098765454", - "%ld with sign and left-justify and precision field size > number of digits, positive value"}, - {"29", 98765565, 7, "%+-.3ld", "+98765565", - "%ld with sign and left-justify and precision field size < number of digits, positive value"}, - {"30", 98765676, 8, "%+ld", "+98765676", "%ld with sign, positive value"}, - {"31", -98765787, 9, "%ld", "-98765787", "%ld, negative value"}, - {"32", -46372898, 10, "$$$%ld$$$", "$$$-46372898$$$", "%ld embedded, negative value"}, - {"33", -98765909, 9, "% ld", "-98765909", "%ld with space for sign, negative value"}, - {"34", -91827121, 8, "%13ld", " -91827121", - "%ld with minimum field size > number of digits, negative value"}, - {"35", -91827232, 5, "%4ld", "-91827232", "%ld with minimum field size < number of digits, negative value"}, - {"36", -33225343, 8, "%.13ld", "-0000033225343", - "%ld with precision field size > number of digits, negative value"}, - {"37", -33225454, 6, "%.3ld", "-33225454", "%ld with precision field size < number of digits, negative value"}, - {"38", -12345565, 7, "%12.10ld", " -0012345565", - "%ld with minimum field size > precision field size > number of digits, negative value"}, - {"39", -12345676, 8, "%12.4ld", " -12345676", - "%ld with minimum field size > number of digits > precision field size, negative value"}, - {"40", -12345787, 9, "%4.2ld", "-12345787", - "%ld with number of digits > minimum field size > precision field size, negative value"}, - {"41", -12345898, 11, "%7.12ld", "-000012345898", - "%ld with precision field size > minimum field size > number of digits, negative value"}, - {"42", -12345909, 10, "%3.12ld", "-000012345909", - "%ld with precision field size > number of digits > minimum field size, negative value"}, - {"43", -12345101, 9, "%2.4ld", "-12345101", - "%ld with number of digits > precision field size > minimum field size, negative value"}, - {"44", -98765292, 10, "%-.20ld", "-00000000000098765292", - "%ld with left-justify and precision field size > number of digits, negative value"}, - {"45", -98765383, 8, "%-.3ld", "-98765383", - "%ld with left-justify and precision field size < number of digits, negative value"}, - {"46", -98765474, 9, "%+ld", "-98765474", "%ld with sign, negative value"}, - {"47", -46372565, 8, "$$$%+ld$$$", "$$$-46372565$$$", "%ld sign and embedded, negative value"}, - {"48", -91827112, 7, "%+11ld", " -91827112", - "%ld with sign and minimum field size > number of digits, negative value"}, - {"49", -91827223, 6, "%+4ld", "-91827223", - "%ld with sign and minimum field size < number of digits, negative value"}, - {"50", -33225334, 11, "%+.13ld", "-0000033225334", - "%ld with sign and precision field size > number of digits, negative value"}, - {"51", -33225445, 9, "%+.3ld", "-33225445", - "%ld with sign and precision field size < number of digits, negative value"}, - {"52", -12345556, 11, "%+12.10ld", " -0012345556", - "%ld with sign and minimum field size > precision field size > number of digits, negative value"}, - {"53", -12345667, 10, "%+12.3ld", " -12345667", - "%ld with sign and minimum field size > number of digits > precision field size, negative value"}, - {"54", -12345778, 9, "%+4.2ld", "-12345778", - "%ld with sign and number of digits > minimum field size > precision field size, negative value"}, - {"55", -12345889, 10, "%+7.12ld", "-000012345889", - "%ld with sign and precision field size > minimum field size > number of digits, negative value"}, - {"56", -12345990, 9, "%+3.12ld", "-000012345990", - "%ld with sign and precision field size > number of digits > minimum field size, negative value"}, - {"57", -12345221, 8, "%+2.4ld", "-12345221", - "%ld with sign and number of digits > precision field size > minimum field size, negative value"}, - {"58", -98765332, 7, "%+-.20ld", "-00000000000098765332", - "%ld with sign and left-justify and precision field size > number of digits, negative value"}, - {"59", -98765443, 6, "%+-.3ld", "-98765443", - "%ld with sign and left-justify and precision field size < number of digits, negative value"}, - {"60", -98765554, 5, "%+ld", "-98765554", "%ld with sign, negative value"}, - {"61", 0, 6, "%ld", "0", "%ld, zero value"}, - {"62", 16253409, 5, "%010ld", "0016253409", "%ld with zero padding, positive value"}, - {"63", -16253409, 6, "%010ld", "-016253409", "%ld with zero padding, negative value"}, - {"64", 0, 6, "%012ld", "000000000000", "%ld, with zero padding, zero value"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_lf.c b/src/unit-tests/osprintf-test/ut_osprintf_lf.c deleted file mode 100644 index bba38dcd2..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_lf.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_lf.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %lf format - *****************************************************************************/ -void UT_osprintf_lf(void) -{ - char *test_fmt = "lf"; /* Test format character(s) */ - int i; - - struct - { - char * test_num; /* Test identifier; sequential numbers */ - double test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 9876543.125, 14, "%lf", "9876543.125000", "%lf, positive value"}, - {"02", 4637210.36, 12, "$$$%lf$$$", "$$$4637210.360000$$$", "%lf embedded, positive value"}, - {"03", 9182755.2756, 9, "%3lf", "9182755.275600", "%lf with maximum field size, positive value"}, - {"04", 12554.08, 5, "%.7lf", "12554.0800000", "%lf with precision, positive value"}, - {"05", 123456.2311, 11, "%9.7lf", "123456.2311000", - "%lf with precision and maximum field size, positive value"}, - {"06", 9876543.6765, 15, "%-20lf", "9876543.676500 ", "%lf with left-justify, positive value"}, - {"07", 9876543.001, 13, "%+lf", "+9876543.001000", "%lf with sign, positive value"}, - {"08", -9876543.1987, 12, "%lf", "-9876543.198700", "%lf, negative value"}, - {"09", -4637210.871, 14, "$$$%lf$$$", "$$$-4637210.871000$$$", "%lf embedded, negative value"}, - {"10", -9182755.22222, 15, "%3lf", "-9182755.222220", "%lf with maximum field size, negative value"}, - {"11", -3355.6109, 11, "%.5lf", "-3355.61090", "%lf with precision, negative value"}, - {"12", -123456.7, 14, "%15.4lf", " -123456.7000", - "%lf with precision and maximum field size, negative value"}, - {"13", -9876543.64388, 17, "%-20lf", "-9876543.643880 ", "%lf with left-justify, negative value"}, - {"14", 0.0, 4, "%lf", "0.000000", "%lf, zero value"}, - {"15", 123456789.0, 6, "%10.0lf", " 123456789", "%lf, no fraction, positive value"}, - {"16", -987654321.0, 6, "%12.0lf", " -987654321", "%lf, no fraction, negative value"}, - {"17", 34887.1255667, 5, "%020.4lf", "000000000034887.1256", "%lf with zero padding, positive value"}, - {"18", -34887.1255667, 5, "%020.4lf", "-00000000034887.1256", "%lf with zero padding, negative value"}, - {"19", 0.0, 6, "%09.4lf", "0000.0000", "%lf, with zero padding, zero value"}, - {"20", 467812.3, 6, "%9.0lf", " 467812", "%lf, no fraction, positive value"}, - {"21", -544446.0, 6, "%8.0lf", " -544446", "%lf, no fraction, negative value"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_li.c b/src/unit-tests/osprintf-test/ut_osprintf_li.c deleted file mode 100644 index b366e3966..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_li.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_li.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %li format - *****************************************************************************/ -void UT_osprintf_li(void) -{ - char *test_fmt = "li"; /* Test format character(s) */ - int i; - - struct - { - char * test_num; /* Test identifier; sequential numbers */ - long int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 12798765, 7, "%li", "12798765", "%li, positive value"}, - {"02", 43246372, 9, "$$$%li$$$", "$$$43246372$$$", "%li embedded, positive value"}, - {"03", 63198765, 8, "% li", " 63198765", "%li with space for sign, positive value"}, - {"04", 77691827, 7, "%11li", " 77691827", "%li with minimum field size > number of digits, positive value"}, - {"05", 54691827, 5, "%4li", "54691827", "%li with minimum field size < number of digits, positive value"}, - {"06", 77833225, 8, "%.10li", "0077833225", "%li with precision field size > number of digits, positive value"}, - {"07", 99933225, 5, "%.3li", "99933225", "%li with precision field size < number of digits, positive value"}, - {"08", 12345789, 10, "%12.10li", " 0012345789", - "%li with minimum field size > precision field size > number of digits, positive value"}, - {"09", 12345987, 12, "%12.3li", " 12345987", - "%li with minimum field size > number of digits > precision field size, positive value"}, - {"10", 12345444, 8, "%4.2li", "12345444", - "%li with number of digits > minimum field size > precision field size, positive value"}, - {"11", 12345321, 11, "%10.12li", "000012345321", - "%li with precision field size > minimum field size > number of digits, positive value"}, - {"12", 12333345, 7, "%6.12li", "000012333345", - "%li with precision field size > number of digits > minimum field size, positive value"}, - {"13", 12345777, 5, "%2.4li", "12345777", - "%li with number of digits > precision field size > minimum field size, positive value"}, - {"14", 98765321, 19, "%-.20li", "00000000000098765321", - "%li with left-justify and precision field size > number of digits, positive value"}, - {"15", 98765111, 7, "%-.3li", "98765111", - "%li with left-justify and precision field size < number of digits, positive value"}, - {"16", 98765222, 10, "%+li", "+98765222", "%li with sign, positive value"}, - {"17", 46372333, 9, "$$$%+li$$$", "$$$+46372333$$$", "%li sign and embedded, positive value"}, - {"18", 91827444, 8, "%+11li", " +91827444", - "%li with sign and minimum field size > number of digits, positive value"}, - {"19", 91827555, 7, "%+4li", "+91827555", - "%li with sign and minimum field size < number of digits, positive value"}, - {"20", 33225666, 2, "%+.13li", "+0000033225666", - "%li with sign and precision field size > number of digits, positive value"}, - {"21", 33225777, 5, "%+.3li", "+33225777", - "%li with sign and precision field size < number of digits, positive value"}, - {"22", 12345888, 9, "%+12.10li", " +0012345888", - "%li with sign and minimum field size > precision field size > number of digits, positive value"}, - {"23", 12345999, 8, "%+12.3li", " +12345999", - "%li with sign and minimum field size > number of digits > precision field size, positive value"}, - {"24", 12345000, 9, "%+4.2li", "+12345000", - "%li with sign and number of digits > minimum field size > precision field size, positive value"}, - {"25", 12345121, 11, "%+10.12li", "+000012345121", - "%li with sign and precision field size > minimum field size > number of digits, positive value"}, - {"26", 12345232, 10, "%+6.12li", "+000012345232", - "%li with sign and precision field size > number of digits > minimum field size, positive value"}, - {"27", 12345343, 7, "%+2.4li", "+12345343", - "%li with sign and number of digits > precision field size > minimum field size, positive value"}, - {"28", 98765454, 15, "%+-.20li", "+00000000000098765454", - "%li with sign and left-justify and precision field size > number of digits, positive value"}, - {"29", 98765565, 8, "%+-.3li", "+98765565", - "%li with sign and left-justify and precision field size < number of digits, positive value"}, - {"30", 98765676, 7, "%+li", "+98765676", "%li with sign, positive value"}, - {"31", -98765787, 6, "%li", "-98765787", "%li, negative value"}, - {"32", -46372898, 15, "$$$%li$$$", "$$$-46372898$$$", "%li embedded, negative value"}, - {"33", -98765909, 9, "% li", "-98765909", "%li with space for sign, negative value"}, - {"34", -91827121, 11, "%13li", " -91827121", - "%li with minimum field size > number of digits, negative value"}, - {"35", -91827232, 5, "%4li", "-91827232", "%li with minimum field size < number of digits, negative value"}, - {"36", -33225343, 8, "%.13li", "-0000033225343", - "%li with precision field size > number of digits, negative value"}, - {"37", -33225454, 7, "%.3li", "-33225454", "%li with precision field size < number of digits, negative value"}, - {"38", -12345565, 9, "%12.10li", " -0012345565", - "%li with minimum field size > precision field size > number of digits, negative value"}, - {"39", -12345676, 8, "%12.4li", " -12345676", - "%li with minimum field size > number of digits > precision field size, negative value"}, - {"40", -12345787, 4, "%4.2li", "-12345787", - "%li with number of digits > minimum field size > precision field size, negative value"}, - {"41", -12345898, 10, "%7.12li", "-000012345898", - "%li with precision field size > minimum field size > number of digits, negative value"}, - {"42", -12345909, 9, "%3.12li", "-000012345909", - "%li with precision field size > number of digits > minimum field size, negative value"}, - {"43", -12345101, 7, "%2.4li", "-12345101", - "%li with number of digits > precision field size > minimum field size, negative value"}, - {"44", -98765292, 18, "%-.20li", "-00000000000098765292", - "%li with left-justify and precision field size > number of digits, negative value"}, - {"45", -98765383, 7, "%-.3li", "-98765383", - "%li with left-justify and precision field size < number of digits, negative value"}, - {"46", -98765474, 8, "%+li", "-98765474", "%li with sign, negative value"}, - {"47", -46372565, 10, "$$$%+li$$$", "$$$-46372565$$$", "%li sign and embedded, negative value"}, - {"48", -91827112, 9, "%+11li", " -91827112", - "%li with sign and minimum field size > number of digits, negative value"}, - {"49", -91827223, 5, "%+4li", "-91827223", - "%li with sign and minimum field size < number of digits, negative value"}, - {"50", -33225334, 11, "%+.13li", "-0000033225334", - "%li with sign and precision field size > number of digits, negative value"}, - {"51", -33225445, 8, "%+.3li", "-33225445", - "%li with sign and precision field size < number of digits, negative value"}, - {"52", -12345556, 12, "%+12.10li", " -0012345556", - "%li with sign and minimum field size > precision field size > number of digits, negative value"}, - {"53", -12345667, 10, "%+12.3li", " -12345667", - "%li with sign and minimum field size > number of digits > precision field size, negative value"}, - {"54", -12345778, 6, "%+4.2li", "-12345778", - "%li with sign and number of digits > minimum field size > precision field size, negative value"}, - {"55", -12345889, 9, "%+7.12li", "-000012345889", - "%li with sign and precision field size > minimum field size > number of digits, negative value"}, - {"56", -12345990, 11, "%+3.12li", "-000012345990", - "%li with sign and precision field size > number of digits > minimum field size, negative value"}, - {"57", -12345221, 7, "%+2.4li", "-12345221", - "%li with sign and number of digits > precision field size > minimum field size, negative value"}, - {"58", -98765332, 15, "%+-.20li", "-00000000000098765332", - "%li with sign and left-justify and precision field size > number of digits, negative value"}, - {"59", -98765443, 7, "%+-.3li", "-98765443", - "%li with sign and left-justify and precision field size < number of digits, negative value"}, - {"60", -98765554, 5, "%+li", "-98765554", "%li with sign, negative value"}, - {"61", 0, 6, "%li", "0", "%li, zero value"}, - {"62", 16253409, 5, "%010li", "0016253409", "%li with zero padding, positive value"}, - {"63", -16253409, 6, "%010li", "-016253409", "%li with zero padding, negative value"}, - {"64", 0, 6, "%012li", "000000000000", "%li, with zero padding, zero value"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_lu.c b/src/unit-tests/osprintf-test/ut_osprintf_lu.c deleted file mode 100644 index 182c55620..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_lu.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_lu.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %lu format - *****************************************************************************/ -void UT_osprintf_lu(void) -{ - char *test_fmt = "lu"; /* Test format character(s) */ - int i; - -#ifdef OSP_ARINC653 -#pragma ghs nowarning 68 -#endif - struct - { - char * test_num; /* Test identifier; sequential numbers */ - unsigned long int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 9876543, 6, "%lu", "9876543", "%lu, negative value"}, - {"02", 4637210, 12, "$$$%lu$$$", "$$$4637210$$$", "%lu embedded"}, - {"03", 9182755, 6, "%3lu", "9182755", "%lu with maximum field size"}, - {"04", 3322554, 10, "%.10lu", "0003322554", "%lu with minimum field size"}, - {"05", 123456, 8, "%9.7lu", " 0123456", "%lu with minimum and maximum field size"}, - {"06", 9876543, 16, "%-.20lu", "00000000000009876543", "%lu with left-justify"}, - {"07", 9876543, 5, "%+lu", "9876543", "%lu with sign"}, - {"08", -9876543, 8, "%lu", "4285090753", "%lu, negative value"}, - {"09", 0, 6, "%lu", "0", "%lu, zero value"}, - {"10", 162534098, 5, "%011lu", "00162534098", "%lu with zero padding"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; -#ifdef OSP_ARINC653 -#pragma ghs endnowarning -#endif - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_lx.c b/src/unit-tests/osprintf-test/ut_osprintf_lx.c deleted file mode 100644 index 72678d73c..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_lx.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_lx.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %x format - *****************************************************************************/ -void UT_osprintf_lx(void) -{ - char *test_fmt = "lx"; /* Test format character(s) */ - int i; - -#ifdef OSP_ARINC653 -#pragma ghs nowarning 68 -#endif - struct - { - char * test_num; /* Test identifier; sequential numbers */ - unsigned long int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 0x9a8b7c6d, 5, "%lx", "9a8b7c6d", "%lx"}, - {"02", 0xdd46ee21, 12, "$$$%lx$$$", "$$$dd46ee21$$$", "%lx embedded"}, - {"03", 0x9ccc8275, 7, "%3lx", "9ccc8275", "%lx with minimum field size < number of digits"}, - {"04", 0xbee33225, 10, "%.10lx", "00bee33225", "%lx with precision field size"}, - {"05", 0x123fdb, 7, "%9.7lx", " 0123fdb", "%lx with minimum and precision field size"}, - {"06", 0xabc6543f, 19, "%-.20lx", "000000000000abc6543f", "%lx with left-justify"}, - {"07", -9876543, 7, "%lx", "ff694bc1", "%lx, negative value"}, - {"08", 0x12b45, 5, "%8lx", " 12b45", "%lx with minimum field size > number of digits"}, - {"09", 0x12b45, 6, "%08lx", "00012b45", "%lx with minimum field size > number of digits and leading zeroes"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; -#ifdef OSP_ARINC653 -#pragma ghs endnowarning -#endif - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_lx_uc.c b/src/unit-tests/osprintf-test/ut_osprintf_lx_uc.c deleted file mode 100644 index ab98a17a4..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_lx_uc.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_lX.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %lX format - *****************************************************************************/ -void UT_osprintf_lX(void) -{ - char *test_fmt = "lx"; /* Test format character(s) */ - int i; - -#ifdef OSP_ARINC653 -#pragma ghs nowarning 68 -#endif - struct - { - char * test_num; /* Test identifier; sequential numbers */ - unsigned long int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 0x9a8b7c6d, 8, "%lX", "9A8B7C6D", "%lX"}, - {"02", 0xdd46ee21, 8, "$$$%lX$$$", "$$$DD46EE21$$$", "%lX embedded"}, - {"03", 0x9ccc8275, 7, "%3lX", "9CCC8275", "%lX with minimum field size < number of digits"}, - {"04", 0xbee33225, 10, "%.10lX", "00BEE33225", "%lX with precision field size"}, - {"05", 0x123fdb, 7, "%9.7lX", " 0123FDB", "%lX with minimum and precision field size"}, - {"06", 0xabc6543f, 16, "%-.20lX", "000000000000ABC6543F", "%lX with left-justify"}, - {"07", -9876543, 5, "%lX", "FF694BC1", "%lX, negative value"}, - {"08", 0x12b45, 3, "%8lX", " 12B45", "%lX with minimum field size > number of digits"}, - {"09", 0x12b45, 2, "%08lX", "00012B45", "%lX with minimum field size > number of digits and leading zeroes"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; -#ifdef OSP_ARINC653 -#pragma ghs endnowarning -#endif - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_misc.c b/src/unit-tests/osprintf-test/ut_osprintf_misc.c deleted file mode 100644 index a191f1c79..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_misc.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_misc.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; - -/***************************************************************************** - * Test miscellaneous formats & combinations - *****************************************************************************/ -void UT_osprintf_misc(void) -{ - int test_int; - long test_long; - unsigned test_unsigned; - unsigned test_hex; - char * test_num = "misc"; - int return_value; - -#ifndef UT_NO_FLOAT - float test_float; - double test_double; - char test_char; -#endif - - /* Test representing percent character using %% */ - init_test(); - sprintf(strg_buf, "Show percent character .%%."); - UT_Report(check_test("Show percent character .%.", strg_buf), "SPRINTF", "Represent percent character using %%", - test_num, "01"); - - /* Test representing percent character using %%, truncated */ - init_test(); - snprintf(strg_buf, 11, "Show percent character .%%."); - UT_Report(check_test("Show perce", strg_buf), "SNPRINTF", "Represent percent character using %%, truncated", - test_num, "01"); - - /* Test format string ending with percent character */ - init_test(); - sprintf(strg_buf, "End with percent character %"); - UT_Report(check_test("End with percent character ", strg_buf), "SPRINTF", "End with percent character", test_num, - "02"); - - /* Test representing percent character using %%, truncated */ - init_test(); - snprintf(strg_buf, 11, "End with percent character %"); - UT_Report(check_test("End with p", strg_buf), "SNPRINTF", "End with percent character, truncated", test_num, "02"); - - /* Test null format string */ - init_test(); - sprintf(strg_buf, ""); - UT_Report(check_test("", strg_buf), "SPRINTF", "Null format string", test_num, "03"); - - /* Test representing percent character using %%, truncated */ - init_test(); - snprintf(strg_buf, 5, ""); - UT_Report(check_test("", strg_buf), "SNPRINTF", "Null format string", test_num, "03"); - - /* Test too many decimals in format width/precision modifier */ - init_test(); - return_value = sprintf(strg_buf, "Too many decimals"); - UT_Report(return_value < 0, "SPRINTF", "Invalid format string", test_num, "04"); - - /* Test too many decimals in format width/precision modifier, truncated */ - init_test(); - return_value = snprintf(strg_buf, 23, "Too many decimals"); - UT_Report(return_value < 0, "SNPRINTF", "Invalid format string", test_num, "04"); - - /* Test multiple parameters */ - init_test(); - test_int = 121; - test_long = -9876222; - test_unsigned = 5432; - test_hex = 72635; - sprintf(strg_buf, "Multiple parameters %d:%d, %d:%d, %d:%d, %d:%d", 1, test_int, 2, test_long, 3, test_unsigned, 4, - test_hex); - UT_Report(check_test("Multiple parameters 1:121, 2:-9876222, " - "3:5432, 4:72635", - strg_buf), - "SPRINTF", "Multiple parameters", test_num, "05"); - - /* Test multiple parameters, truncated */ - init_test(); - test_int = 121; - test_long = -9876222; - test_unsigned = 5432; - test_hex = 72635; - snprintf(strg_buf, 52, "Multiple parameters %d:%d, %d:%d, %d:%d, %d:%d", 1, test_int, 2, test_long, 3, - test_unsigned, 4, test_hex); - UT_Report(check_test("Multiple parameters 1:121, 2:-9876222, " - "3:5432, 4:72", - strg_buf), - "SNPRINTF", "Multiple parameters", test_num, "05"); - -#ifndef UT_NO_FLOAT - /* Test combination of types */ - init_test(); - test_int = -123; - test_long = 9876543; - test_unsigned = 4321; - test_hex = 0xa1b2; - test_float = -2.3456; - test_double = 6543.123456; - test_char = '$'; - sprintf(strg_buf, - "int = %d long = %ld uns = %u hex = 0x%x flt = %f " - "dbl = %lf chr = %c", - test_int, test_long, test_unsigned, test_hex, test_float, test_double, test_char); - UT_Report(check_test("int = -123 long = 9876543 uns = 4321 hex = " - "0xa1b2 flt = -2.345600 dbl = 6543.123456 " - "chr = $", - strg_buf), - "SPRINTF", "Combination of types", test_num, "06"); - - /* Test combination of types, truncated */ - init_test(); - test_int = -123; - test_long = 9876543; - test_unsigned = 4321; - test_hex = 0xa1b2; - test_float = -2.3456; - test_double = 6543.123456; - test_char = '$'; - snprintf(strg_buf, 16, - "int = %d long = %ld uns = %u hex = 0x%x flt = %f " - "dbl = %lf chr = %c", - test_int, test_long, test_unsigned, test_hex, test_float, test_double, test_char); - UT_Report(check_test("int = -123 lon", strg_buf), "SNPRINTF", "Combination of types, truncated", test_num, "06"); - - /* Test combination of types 2 */ - init_test(); - test_int = -123; - test_long = 9876543; - test_unsigned = 4321; - test_hex = 0xa1b2; - test_float = -2.3456; - test_double = 6543.123456; - test_char = '$'; - sprintf(strg_buf, "flt = %f dbl = %lf flt = %f", test_float, test_double, test_float); - UT_Report(check_test("flt = -2.345600 dbl = 6543.123456 flt = -2.345600", strg_buf), "SPRINTF", - "Combination of types 2", test_num, "07"); - - /* Test combination of types 2, truncated */ - init_test(); - test_int = -123; - test_long = 9876543; - test_unsigned = 4321; - test_hex = 0xa1b2; - test_float = -2.3456; - test_double = 6543.123456; - test_char = '$'; - snprintf(strg_buf, 10, "flt = %f dbl = %lf flt = %f", test_float, test_double, test_float); - UT_Report(check_test("flt = -2.", strg_buf), "SNPRINTF", "Combination of types 2", test_num, "07"); -#endif -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_offset.c b/src/unit-tests/osprintf-test/ut_osprintf_offset.c deleted file mode 100644 index f9874edb9..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_offset.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* Calculate offset, breakpoint, and skip values for the cFE and cFE unit - * test variadic functions. Note that some "dummy" function calls from - * the original function are needed in order for the correct offset, - * breakpoint, and skip values to be calculated. The ordering of these - * dummy functions must match that in the actual function - */ -#ifdef UT_DO_OFFSET - -#include "ut_osprintf.h" -#include "ut_osprintf_offset.h" - -extern char cMsg[]; -extern char cNum[]; - -extern int OS_printf_break; -extern int OS_printf_skip; -extern int OS_printf_enabled; - -unsigned long testPattern[12][10] = {{0x12ab34cd, 0x19999991, 0x18888881, 0x17777771, 0x16666661, 0x15555551, - 0x14444441, 0x13333331, 0x12222221, 0x11111111}, - {0x23bc45de, 0x29999992, 0x28888882, 0x27777772, 0x26666662, 0x25555552, - 0x24444442, 0x23333332, 0x22222222, 0x21111112}, - {0x34cd56ef, 0x39999993, 0x38888883, 0x37777773, 0x36666663, 0x35555553, - 0x34444443, 0x33333333, 0x32222223, 0x31111113}, - {0x45ab67cd, 0x49999994, 0x48888884, 0x47777774, 0x46666664, 0x45555554, - 0x44444444, 0x43333334, 0x42222224, 0x41111114}, - {0x56bc78de, 0x59999995, 0x58888885, 0x57777775, 0x56666665, 0x55555555, - 0x54444445, 0x53333335, 0x52222225, 0x51111115}, - {0x67cd78ef, 0x69999996, 0x68888886, 0x67777776, 0x66666666, 0x65555556, - 0x64444446, 0x63333336, 0x62222226, 0x61111116}, - {0x78ab9acd, 0x79999997, 0x78888887, 0x77777777, 0x76666667, 0x75555557, - 0x74444447, 0x73333337, 0x72222227, 0x71111117}, - {0x89bcabde, 0x89999998, 0x88888888, 0x87777778, 0x86666668, 0x85555558, - 0x84444448, 0x83333338, 0x82222228, 0x81111118}, - {0x9acdbcef, 0x99999999, 0x98888889, 0x97777779, 0x96666669, 0x95555559, - 0x94444449, 0x93333339, 0x92222229, 0x91111119}, - {0xababcdcd, 0xa999999a, 0xa888888a, 0xa777777a, 0xa666666a, 0xa555555a, - 0xa444444a, 0xa333333a, 0xa222222a, 0xa111111a}, - {0xbcbcdede, 0xb999999b, 0xb888888b, 0xb777777b, 0xb666666b, 0xb555555b, - 0xb444444b, 0xb333333b, 0xb222222b, 0xb111111b}, - {0xcdcdefef, 0xc999999c, 0xc888888c, 0xc777777c, 0xc666666c, 0xc555555c, - 0xc444444c, 0xc333333c, 0xc222222c, 0xc111111c}}; - -void UT_osprintf_CalcOffsets(void) -{ - CFE_TIME_SysTime_t Time = {0, 0}; - - /* Determine variadic offsets */ - CalcOffset_CFE_ES_WriteToSysLog("CFE_ES_WriteToSysLog test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", - testPattern[0][0], testPattern[0][1], testPattern[0][2], testPattern[0][3], - testPattern[0][4], testPattern[0][5], testPattern[0][6], testPattern[0][7], - testPattern[0][8], testPattern[0][9]); - CalcOffset_EVS_SendEvent(111, 222, "EVS_SendEvent test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[1][0], - testPattern[1][1], testPattern[1][2], testPattern[1][3], testPattern[1][4], - testPattern[1][5], testPattern[1][6], testPattern[1][7], testPattern[1][8], - testPattern[1][9]); - CalcOffset_CFE_EVS_SendEvent(333, 444, "CFE_EVS_SendEvent test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", - testPattern[2][0], testPattern[2][1], testPattern[2][2], testPattern[2][3], - testPattern[2][4], testPattern[2][5], testPattern[2][6], testPattern[2][7], - testPattern[2][8], testPattern[2][9]); - CalcOffset_CFE_EVS_SendEventWithAppID( - 555, 666, 7, "CFE_EVS_SendEventWithAppID test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[3][0], - testPattern[3][1], testPattern[3][2], testPattern[3][3], testPattern[3][4], testPattern[3][5], - testPattern[3][6], testPattern[3][7], testPattern[3][8], testPattern[3][9]); - CalcOffset_CFE_EVS_SendTimedEvent( - Time, 888, 999, "CFE_EVS_SendTimedEvent test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[4][0], - testPattern[4][1], testPattern[4][2], testPattern[4][3], testPattern[4][4], testPattern[4][5], - testPattern[4][6], testPattern[4][7], testPattern[4][8], testPattern[4][9]); - CalcOffset_OS_printf("OS_printf test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[5][0], testPattern[5][1], - testPattern[5][2], testPattern[5][3], testPattern[5][4], testPattern[5][5], testPattern[5][6], - testPattern[5][7], testPattern[5][8], testPattern[5][9]); - CalcOffset_OS_sprintf(cMsg, "OS_sprintf test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[6][0], - testPattern[6][1], testPattern[6][2], testPattern[6][3], testPattern[6][4], testPattern[6][5], - testPattern[6][6], testPattern[6][7], testPattern[6][8], testPattern[6][9]); - CalcOffset_OS_snprintf(cMsg, 100, "OS_snprintf test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[7][0], - testPattern[7][1], testPattern[7][2], testPattern[7][3], testPattern[7][4], - testPattern[7][5], testPattern[7][6], testPattern[7][7], testPattern[7][8], - testPattern[7][9]); - CalcOffset_OS_printf_stub("OS_printf stub test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[8][0], - testPattern[8][1], testPattern[8][2], testPattern[8][3], testPattern[8][4], - testPattern[8][5], testPattern[8][6], testPattern[8][7], testPattern[8][8], - testPattern[8][9]); - CalcOffset_CFE_ES_WriteToSysLog_stub("CFE_ES_WriteToSysLog stub test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", - testPattern[9][0], testPattern[9][1], testPattern[9][2], testPattern[9][3], - testPattern[9][4], testPattern[9][5], testPattern[9][6], testPattern[9][7], - testPattern[9][8], testPattern[9][9]); - CalcOffset_CFE_EVS_SendEvent_stub(333, 444, "CFE_EVS_SendEvent stub test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", - testPattern[10][0], testPattern[10][1], testPattern[10][2], testPattern[10][3], - testPattern[10][4], testPattern[10][5], testPattern[10][6], testPattern[10][7], - testPattern[10][8], testPattern[10][9]); - CalcOffset_CFE_EVS_SendEventWithAppID_stub( - 555, 666, 5, "CFE_EVS_SendEventWithAppID stub test %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", testPattern[11][0], - testPattern[11][1], testPattern[11][2], testPattern[11][3], testPattern[11][4], testPattern[11][5], - testPattern[11][6], testPattern[11][7], testPattern[11][8], testPattern[11][9]); -} - -void UT_ShowHex(unsigned char *ptr, int numBytes) -{ - int i, j; - unsigned char *bytePtr = (unsigned char *)ptr; - char hMsg[3000]; - - strcpy(hMsg, "args = "); - - for (i = 0, j = 1; i < numBytes; i++, j++) - { - UT_itoa(*bytePtr, cNum, 16, 2); - strcat(hMsg, cNum); - strcat(hMsg, " "); - bytePtr++; - - if (j == 4) - { - strcat(hMsg, "\n "); - j = 0; - } - } - - UT_Text(hMsg); -} - -/* Determine the offset, breakpoint, and skip values for a variadic function */ -void UT_CheckArgumentOffset(va_list ptr, int tpIndex) -{ - int i = 0; - int offset = -1; - int breakpoint = 0; - int skip = 0; - int max_allowed_offset = 20; - int max_allowed_skip = 100; - int num_parms = 10; - unsigned char *bytePtr = (unsigned char *)ptr; - unsigned char *testPtr = (void *)&testPattern[tpIndex][0]; - - /* - UT_ShowHex(ptr, 440); - */ - - while (offset < max_allowed_offset && i < sizeof(unsigned long)) - { - offset++; - - for (i = 0; i < sizeof(unsigned long); i++) - { - if (*(bytePtr + (offset * sizeof(va_list)) + i) != *(testPtr + i)) - { - break; - } - } - } - - if (offset == max_allowed_offset) - { - UT_Text(" Offset could not be determined\n"); - } - else - { - sprintf(cMsg, " Offset = %d\n", offset); - UT_Text(cMsg); - i = sizeof(unsigned long); - - /* Find breakpoint value */ - while (offset < max_allowed_offset + num_parms && i == sizeof(unsigned long)) - { - offset++; - breakpoint++; - testPtr += sizeof(unsigned long); - - for (i = 0; i < sizeof(unsigned long); i++) - { - if (*(bytePtr + (offset * sizeof(va_list)) + i) != *(testPtr + i)) - { - break; - } - } - } - - if (breakpoint == num_parms) - { - UT_Text(" No breakpoint found\n"); - } - else - { - sprintf(cMsg, " Breakpoint = %d\n", breakpoint); - UT_Text(cMsg); - - /* Find skip value */ - while (offset < max_allowed_offset + num_parms + max_allowed_skip && i < sizeof(unsigned long)) - { - offset++; - skip++; - - for (i = 0; i < sizeof(unsigned long); i++) - { - if (*(bytePtr + (offset * sizeof(va_list)) + i) != *(testPtr + i)) - { - break; - } - } - } - - if (skip == max_allowed_skip) - { - UT_Text(" Skip could not be determined\n"); - } - else - { - sprintf(cMsg, " Skip = %d\n", skip); - UT_Text(cMsg); - } - } - } -} - -/* Mimic actual CFE_ES_WriteToSysLog() */ -int32 CalcOffset_CFE_ES_WriteToSysLog(const char *SpecStringPtr, ...) -{ - char TmpString[CFE_ES_MAX_SYSLOG_MSG_SIZE]; - char MsgWithoutTime[CFE_EVS_MAX_MESSAGE_LENGTH]; - CFE_TIME_SysTime_t time = {0, 0}; - va_list Ptr; - - va_start(Ptr, SpecStringPtr, 0, 0, 0); - OS_vsnprintfDummy(MsgWithoutTime, 1, SpecStringPtr, Ptr); - CFE_TIME_PrintDummy(TmpString, time); - strcatDummy(TmpString, " "); - strncatDummy(TmpString, MsgWithoutTime, 1); - OS_printfDummy("%s", TmpString); - strlenDummy(TmpString); - strncpyDummy(TmpString, TmpString, 1); - strncpyDummy(TmpString, "\0", 1); - OS_printfDummy("Warning: Last System Log Message Truncated.\n"); - strlenDummy(TmpString); - strncpyDummy(TmpString, TmpString, 1); - - UT_Text("\nCFE_ES_WriteToSysLog Argument Calculation:\n"); - UT_CheckArgumentOffset(Ptr, 0); - va_end(Ptr); - return 0; -} - -/* Mimic actual EVS_SendEvent() */ -int32 CalcOffset_EVS_SendEvent(uint16 EventID, uint16 EventType, const char *Spec, ...) -{ - CFE_EVS_Packet_t EVS_Packet; - CFE_TIME_SysTime_t Time = {0, 0}; - va_list Ptr; - - EVS_IsFilteredDummy(0, EventID, EventType); - CFE_SB_InitMsgDummy(&EVS_Packet, 1, sizeof(CFE_EVS_Packet_t), 1); - va_start(Ptr, Spec, 0, 0, 0); - OS_vsnprintfDummy(EVS_Packet.Message, 1, Spec, Ptr); - CFE_TIME_GetTimeDummy(); - EVS_SendPacketDummy(0, Time, &EVS_Packet); - - UT_Text("\nEVS_SendEvent Argument Calculation:\n"); - UT_CheckArgumentOffset(Ptr, 1); - va_end(Ptr); - return 0; -} - -/* Mimic actual CFE_EVS_SendEvent() */ -int32 CalcOffset_CFE_EVS_SendEvent(uint16 EventID, uint16 EventType, const char *Spec, ...) -{ - CFE_EVS_Packet_t EVS_Packet; - uint32 AppID = 0; - CFE_TIME_SysTime_t Time = {0, 0}; - va_list Ptr; - - EVS_GetAppIDDummy(&AppID); - EVS_NotRegisteredDummy(AppID); - EVS_IsFilteredDummy(AppID, EventID, EventType); - CFE_SB_InitMsgDummy(&EVS_Packet, 1, sizeof(CFE_EVS_Packet_t), 1); - va_start(Ptr, Spec, 0, 0, 0); - OS_vsnprintfDummy(EVS_Packet.Message, 1, Spec, Ptr); - CFE_TIME_GetTimeDummy(); - EVS_SendPacketDummy(AppID, Time, &EVS_Packet); - - UT_Text("\nCFE_EVS_SendEvent Argument Calculation:\n"); - UT_CheckArgumentOffset(Ptr, 2); - va_end(Ptr); - return 0; -} - -/* Mimic actual CFE_EVS_SendEventWithAppID() */ -/* THIS IS RETURNING THE WRONG SKIP VALUE!!! (off by -2) */ -int32 CalcOffset_CFE_EVS_SendEventWithAppID(uint16 EventID, uint16 EventType, uint32 AppID, const char *Spec, ...) -{ - CFE_EVS_Packet_t EVS_Packet; - CFE_TIME_SysTime_t Time = {0, 0}; - va_list Ptr; - - EVS_NotRegisteredDummy(AppID); - EVS_IsFilteredDummy(AppID, EventID, EventType); - CFE_SB_InitMsgDummy(&EVS_Packet, 1, sizeof(CFE_EVS_Packet_t), 1); - va_start(Ptr, Spec, 0, 0, 0); - OS_vsnprintfDummy(EVS_Packet.Message, 1, Spec, Ptr); - CFE_TIME_GetTimeDummy(); - EVS_SendPacketDummy(AppID, Time, &EVS_Packet); - - UT_Text("\nCFE_EVS_SendEventWithAppID Argument Calculation:\n"); - UT_CheckArgumentOffset(Ptr, 3); - va_end(Ptr); - return 0; -} - -/* Mimic actual CFE_EVS_SendTimedEvent() */ -int32 CalcOffset_CFE_EVS_SendTimedEvent(CFE_TIME_SysTime_t Time, uint16 EventID, uint16 EventType, const char *Spec, - ...) -{ - CFE_EVS_Packet_t EVS_Packet; - uint32 AppID = 0; - va_list Ptr; - - EVS_GetAppIDDummy(&AppID); - EVS_NotRegisteredDummy(AppID); - EVS_IsFilteredDummy(AppID, EventID, EventType); - CFE_SB_InitMsgDummy(&EVS_Packet, 0, sizeof(CFE_EVS_Packet_t), 0); - va_start(Ptr, Spec, 0, 0, 0); - OS_vsnprintfDummy(EVS_Packet.Message, 0, Spec, Ptr); - EVS_SendPacketDummy(AppID, Time, &EVS_Packet); - - UT_Text("\nCFE_EVS_SendTimedEvent Argument Calculation:\n"); - UT_CheckArgumentOffset(Ptr, 4); - va_end(Ptr); - return 0; -} - -/* Mimic actual OS_printf() */ -void CalcOffset_OS_printf(const char *format, ...) -{ - va_list varg; - - va_start(varg, format, 0, 0, 0); - OS_vsnprintfDummy(0, -1, format, varg) - - UT_Text("\nOS_printf Argument Calculation:\n"); - UT_CheckArgumentOffset(varg, 5); - va_end(varg); -} - -/* Mimic actual and stub OS_sprintf() */ -int CalcOffset_OS_sprintf(char *out, const char *format, ...) -{ - va_list varg; - int length; - - va_start(varg, format, 0, 0, 0); - length = OS_vsnprintfDummy(out, -1, format, varg); - - UT_Text("\nOS_sprintf Argument Calculation:\n"); - UT_CheckArgumentOffset(varg, 6); - va_end(varg); - return (length); -} - -/* Mimic actual and stub OS_snprintf() */ -int CalcOffset_OS_snprintf(char *out, unsigned max_len, const char *format, ...) -{ - va_list varg; - int length; - - va_start(varg, format, 0, 0, 0); - length = OS_vsnprintfDummy(out, (int)max_len - 1, format, varg); - - UT_Text("\nOS_snprintf Argument Calculation:\n"); - UT_CheckArgumentOffset(varg, 7); - va_end(varg); - return (length); -} - -/* Mimic stub OS_printf() */ -void CalcOffset_OS_printf_stub(const char *string, ...) -{ - char tmpString[CFE_ES_MAX_SYSLOG_MSG_SIZE * 2]; - va_list ptr; - - va_start(ptr, string, 0, 0, 0); - OS_vsnprintfDummy(tmpString, CFE_ES_MAX_SYSLOG_MSG_SIZE * 2, string, ptr); - - UT_Text("\nOS_printf Stub Argument Calculation:\n"); - UT_CheckArgumentOffset(ptr, 8); - va_end(ptr); -} - -int32 CalcOffset_CFE_ES_WriteToSysLog_stub(const char *pSpecString, ...) -{ - char tmpString[CFE_ES_MAX_SYSLOG_MSG_SIZE]; - va_list ap; - - va_start(ap, pSpecString, 0, 0, 0); - OS_vsnprintfDummy(tmpString, CFE_ES_MAX_SYSLOG_MSG_SIZE, pSpecString, ap); - - UT_Text("\nCFE_ES_WriteToSysLog Stub Argument Calculation:\n"); - UT_CheckArgumentOffset(ap, 9); - va_end(ap); - return 0; -} - -/* Mimic stub CFE_EVS_SendEvent() */ -int32 CalcOffset_CFE_EVS_SendEvent_stub(uint16 EventID, uint16 EventType, const char *Spec, ...) -{ - char BigBuf[CFE_EVS_MAX_MESSAGE_LENGTH]; - va_list Ptr; - - va_start(Ptr, Spec, 0, 0, 0); - OS_vsnprintfDummy(BigBuf, CFE_EVS_MAX_MESSAGE_LENGTH, Spec, Ptr); - UT_AddEventToHistoryDummy(EventID); - - UT_Text("\nCFE_EVS_SendEvent Stub Argument Calculation:\n"); - UT_CheckArgumentOffset(Ptr, 10); - va_end(Ptr); - return 0; -} - -/* Mimic stub CFE_EVS_SendEventWithAppID() */ -int32 CalcOffset_CFE_EVS_SendEventWithAppID_stub(uint16 EventID, uint16 EventType, uint32 AppID, const char *Spec, ...) -{ - char BigBuf[CFE_EVS_MAX_MESSAGE_LENGTH]; - va_list Ptr; - - va_start(Ptr, Spec, 0, 0, 0); - OS_vsnprintfDummy(BigBuf, CFE_EVS_MAX_MESSAGE_LENGTH, Spec, Ptr); - UT_AddEventToHistoryDummy(EventID); - OS_snprintfDummy(cMsg, UT_MAX_MESSAGE_LENGTH, " CFE_EVS_SendEvent from app %lu: %u, %u - %s", AppID, EventID, - EventType, BigBuf); - - UT_Text("\nCFE_EVS_SendEventWithAppID Stub Argument Calculation:\n"); - UT_CheckArgumentOffset(Ptr, 11); - va_end(Ptr); - return 0; -} - -#endif diff --git a/src/unit-tests/osprintf-test/ut_osprintf_offset.h b/src/unit-tests/osprintf-test/ut_osprintf_offset.h deleted file mode 100644 index f86c4c2cf..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_offset.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * ut_osprintf_offset.h - * - * Variadic argument offset calculation - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ -#ifdef UT_DO_OFFSET - -#ifndef UT_OSPRINTF_OFFSET_H_ -#define UT_OSPRINTF_OFFSET_H_ - -#include "common_types.h" -#include "osapi.h" -#include "cfe_es.h" -#include "cfe_sb.h" -#include "cfe_evs_task.h" -#include "cfe_time.h" -#include "cfe_mission_cfg.h" -#include "osprintf.h" - -void UT_ShowHex(unsigned char *, int); -void UT_CheckArgumentOffset(va_list, int); -void UT_osprintf_CalcOffsets(void); -int32 CalcOffset_CFE_ES_WriteToSysLog(const char *, ...); -int32 CalcOffset_EVS_SendEvent(uint16, uint16, const char *, ...); -int32 CalcOffset_CFE_EVS_SendEvent(uint16, uint16, const char *, ...); -int32 CalcOffset_CFE_EVS_SendEventWithAppID(uint16, uint16, uint32, const char *, ...); -int32 CalcOffset_CFE_EVS_SendTimedEvent(CFE_TIME_SysTime_t, uint16, uint16, const char *, ...); -void CalcOffset_OS_printf(const char *, ...); -int CalcOffset_OS_sprintf(char *, const char *, ...); -int CalcOffset_OS_snprintf(char *, unsigned, const char *, ...); -void CalcOffset_OS_printf_stub(const char *, ...); -int32 CalcOffset_CFE_ES_WriteToSysLog_stub(const char *, ...); -int32 CalcOffset_CFE_EVS_SendEvent_stub(uint16, uint16, const char *, ...); -int32 CalcOffset_CFE_EVS_SendEventWithAppID_stub(uint16, uint16, uint32, const char *, ...); -void CFE_TIME_PrintDummy(char *, CFE_TIME_SysTime_t); -unsigned char EVS_IsFilteredDummy(uint32, uint16, uint16); -void CFE_SB_InitMsgDummy(void *, uint16, uint16, unsigned char); -CFE_TIME_SysTime_t CFE_TIME_GetTimeDummy(void); -void EVS_SendPacketDummy(uint32, CFE_TIME_SysTime_t, CFE_EVS_Packet_t *); -long int EVS_GetAppIDDummy(uint32 *); -long int EVS_NotRegisteredDummy(uint32); -int OS_vsnprintfDummy(char *, int, const char *, ...); -void OS_printfDummy(const char *, ...); -int OS_snprintfDummy(char *, unsigned, const char *, ...); -char * strcatDummy(char *, const char *); -char * strncatDummy(char *, const char *, int); -char * strncpyDummy(char *, const char *, int); -int strlenDummy(const char *); -void UT_AddEventToHistoryDummy(uint16 EventID); - -#endif /* UT_OSPRINTF_OFFSET_H_ */ - -#endif diff --git a/src/unit-tests/osprintf-test/ut_osprintf_offset_dummy.c b/src/unit-tests/osprintf-test/ut_osprintf_offset_dummy.c deleted file mode 100644 index d462d49a1..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_offset_dummy.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -#ifdef UT_DO_OFFSET - -#include "ut_osprintf.h" -#include "ut_osprintf_offset.h" - -void CFE_TIME_PrintDummy(char *PrintBuffer, CFE_TIME_SysTime_t TimeToPrint) {} - -unsigned char EVS_IsFilteredDummy(uint32 AppID, uint16 EventID, uint16 EventType) -{ - return 0; -} - -void CFE_SB_InitMsgDummy(void *MsgPtr, uint16 MsgId, uint16 Length, unsigned char Clear) {} - -CFE_TIME_SysTime_t CFE_TIME_GetTimeDummy(void) -{ - CFE_TIME_SysTime_t Time = {0, 0}; - - return Time; -} - -void EVS_SendPacketDummy(uint32 AppID, CFE_TIME_SysTime_t Time, CFE_EVS_Packet_t *EVS_PktPtr) {} - -long int EVS_GetAppIDDummy(uint32 *AppIdPtr) -{ - return 0; -} - -long int EVS_NotRegisteredDummy(uint32 AppID) -{ - return 0; -} - -int OS_vsnprintfDummy(char *out_buffer, int max_len, const char *format, ...) -{ - return 0; -} - -void OS_printfDummy(const char *format, ...) {} - -int OS_snprintfDummy(char *out_buffer, unsigned max_len, const char *format, ...) -{ - return 0; -} - -char *strcatDummy(char *out, const char *in) -{ - return out; -} - -char *strncatDummy(char *out, const char *in, int len) -{ - return out; -} - -char *strncpyDummy(char *out, const char *in, int len) -{ - return out; -} - -int strlenDummy(const char *in) -{ - return 0; -} - -void UT_AddEventToHistoryDummy(uint16 EventID) {} -#endif diff --git a/src/unit-tests/osprintf-test/ut_osprintf_p.c b/src/unit-tests/osprintf-test/ut_osprintf_p.c deleted file mode 100644 index 4d5ce8ec9..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_p.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_p.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %p format - *****************************************************************************/ -void UT_osprintf_p(void) -{ - char *test_fmt = "p"; /* Test format character(s) */ - int i; - - struct - { - char * test_num; /* Test identifier; sequential numbers */ - long int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 98765, 5, "%p", "0x181cd", "%p"}, - {"02", 46372, 10, "$$$%p$$$", "$$$0xb524$$$", "%p embedded"}, - {"03", 91827, 5, "%3p", "0x166b3", "%p with minimum field size"}, - {"04", 33225, 11, "%.10p", "0x00000081c9", "%p with precision field size"}, - {"05", 12345, 9, "%9.7p", "0x0003039", "%p with minimum and precision field size"}, - {"06", 98765, 19, "%-.20p", "0x000000000000000181cd", "%p with left-justify"}, - {"07", -98765, 8, "%p", "0xfffe7e33", "%p, negative value"}, - {"08", 4108, 4, "%8p", " 0x100c", "%p with minimum field size > number of digits"}, - {"09", 55220, 6, "%010p", "0x0000d7b4", "%p with minimum field size > number of digits and leading zeroes"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, (void *)osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, (void *)osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_printf.c b/src/unit-tests/osprintf-test/ut_osprintf_printf.c deleted file mode 100644 index 182261db2..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_printf.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_printf.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#ifdef OS_USE_EMBEDDED_PRINTF - -#include "ut_osprintf.h" - -extern unsigned OS_printf_enabled; - -/***************************************************************************** - * Tests of embedded printf to get complete osprintf.c code coverage - *****************************************************************************/ -void UT_osprintf_printf(void) -{ - /* Perform printf enabled test */ - OS_printf("%s", "printf_test_string\n"); - UT_Report(UT_PASS, "PRINTF", "Output to console", "%s", "01"); - - /* Perform printf disabled test */ - OS_printf_enabled = 0; - OS_printf("%s", "printf_test_string_disabled\n"); - UT_Report(UT_PASS, "PRINTF", "Output to console disabled", "%s", "02"); - OS_printf_enabled = 1; -} -#endif diff --git a/src/unit-tests/osprintf-test/ut_osprintf_s.c b/src/unit-tests/osprintf-test/ut_osprintf_s.c deleted file mode 100644 index 9ee055b4d..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_s.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_s.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %s format - *****************************************************************************/ -void UT_osprintf_s(void) -{ - char *test_fmt = "s"; /* Test format character(s) */ - int i; - - struct - { - char *test_num; /* Test identifier; sequential numbers */ - char test_val[30]; /* Test value */ - int max_len; /* Maximum output string length */ - char *format; /* Format string */ - char *expected; /* Expected result */ - char *description; /* Test description */ - } osp_tests[] = { - {"01", "123456789abcd", 7, "%s", "123456789abcd", "%s"}, - {"02", "123456789abcd", 7, "$$$%s$$$", "$$$123456789abcd$$$", "%s embedded"}, - {"03", "123456789abcd", 11, "%20s", " 123456789abcd", "%s with minimum field size"}, - {"04", "123456789abcd", 8, "%.10s", "123456789a", "%s with maximum field size"}, - {"05", "123456789abcd", 7, "%5.7s", "1234567", "%s with minimum and maximum field size"}, - {"06", "123456789abcd", 10, "%-20s", "123456789abcd ", "%s with left-justify"}, - {"07", "3456789abcd", 7, "%+s", "3456789abcd", "%s with sign"}, - {"08", "", 3, "%s", "", "%s with null string"}, - {"09", "123456789abcd", 11, "%020s", " 123456789abcd", "%s with minimum field size, ignore zero padding"}, - {"", "", 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_u.c b/src/unit-tests/osprintf-test/ut_osprintf_u.c deleted file mode 100644 index ff9bcafd8..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_u.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_u.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %u format - *****************************************************************************/ -void UT_osprintf_u(void) -{ - char *test_fmt = "u"; /* Test format character(s) */ - int i; - - struct - { - char *test_num; /* Test identifier; sequential numbers */ - int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char *format; /* Format string */ - char *expected; /* Expected result */ - char *description; /* Test description */ - } osp_tests[] = { - {"01", 98765, 5, "%u", "98765", "%u"}, - {"02", 46372, 10, "$$$%u$$$", "$$$46372$$$", "%u embedded"}, - {"03", 91827, 5, "%3u", "91827", "%u with maximum field size"}, - {"04", 33225, 8, "%.10u", "0000033225", "%u with minimum field size"}, - {"05", 12345, 7, "%9.7u", " 0012345", "%u with minimum and maximum field size"}, - {"06", 98765, 18, "%-.20u", "00000000000000098765", "%u with left-justify"}, - {"07", 98765, 5, "%+u", "98765", "%u with sign"}, - {"08", -98765, 8, "%u", "4294868531", "%u, negative value"}, - {"09", 0, 6, "%u", "0", "%u, zero value"}, - {"10", 162534, 5, "%08u", "00162534", "%u with zero padding"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_x.c b/src/unit-tests/osprintf-test/ut_osprintf_x.c deleted file mode 100644 index aebc3d671..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_x.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_x.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %x format - *****************************************************************************/ -void UT_osprintf_x(void) -{ - char *test_fmt = "x"; /* Test format character(s) */ - int i; - -#ifdef OSP_ARINC653 -#pragma ghs nowarning 68 -#endif - struct - { - char * test_num; /* Test identifier; sequential numbers */ - unsigned int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 0xa8b7, 3, "%x", "a8b7", "%x"}, - {"02", 0xff123, 10, "$$$%x$$$", "$$$ff123$$$", "%x embedded"}, - {"03", 0xd1827, 5, "%3x", "d1827", "%x with minimum field size < number of digits"}, - {"04", 0x3c225, 9, "%.10x", "000003c225", "%x with precision field size"}, - {"05", 0x12b45, 9, "%9.7x", " 0012b45", "%x with minimum and precision field size"}, - {"06", 0xe8a60, 19, "%-.20x", "000000000000000e8a60", "%x with left-justify"}, - {"07", -16, 7, "%x", "fffffff0", "%x, negative value"}, - {"08", 0x12b45, 3, "%8x", " 12b45", "%x with minimum field size > number of digits"}, - {"09", 0x12b45, 5, "%08x", "00012b45", "%x with minimum field size > number of digits and leading zeroes"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; -#ifdef OSP_ARINC653 -#pragma ghs endnowarning -#endif - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} diff --git a/src/unit-tests/osprintf-test/ut_osprintf_x_uc.c b/src/unit-tests/osprintf-test/ut_osprintf_x_uc.c deleted file mode 100644 index ceac0202a..000000000 --- a/src/unit-tests/osprintf-test/ut_osprintf_x_uc.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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. - */ - -/* - * UT_osprintf_X.c - * - * Created on: May 22, 2013 - * Author: Kevin McCluney - */ - -#include "ut_osprintf.h" - -extern char strg_buf[]; -extern char trunc_buf[]; - -/***************************************************************************** - * Test %X format - *****************************************************************************/ -void UT_osprintf_X(void) -{ - char *test_fmt = "x"; /* Test format character(s) */ - int i; - -#ifdef OSP_ARINC653 -#pragma ghs nowarning 68 -#endif - struct - { - char * test_num; /* Test identifier; sequential numbers */ - unsigned int test_val; /* Test value */ - int max_len; /* Maximum output string length */ - char * format; /* Format string */ - char * expected; /* Expected result */ - char * description; /* Test description */ - } osp_tests[] = { - {"01", 0xa8b7, 3, "%X", "A8B7", "%X"}, - {"02", 0xff123, 10, "$$$%X$$$", "$$$FF123$$$", "%X embedded"}, - {"03", 0xd1827, 5, "%3X", "D1827", "%X with minimum field size < number of digits"}, - {"04", 0x3c225, 9, "%.10X", "000003C225", "%X with precision field size"}, - {"05", 0x12b45, 7, "%9.7X", " 0012B45", "%X with minimum and precision field size"}, - {"06", 0xe8a60, 19, "%-.20X", "000000000000000E8A60", "%X with left-justify"}, - {"07", -16, 7, "%X", "FFFFFFF0", "%X, negative value"}, - {"08", 0x12b45, 4, "%8X", " 12B45", "%X with minimum field size > number of digits"}, - {"09", 0x12b45, 5, "%08X", "00012B45", "%X with minimum field size > number of digits and leading zeroes"}, - {"", 0, 0, "", "", ""} /* End with a null format to terminate list */ - }; -#ifdef OSP_ARINC653 -#pragma ghs endnowarning -#endif - - for (i = 0; osp_tests[i].format[0] != '\0'; i++) - { - /* Perform sprintf test */ - init_test(); - sprintf(strg_buf, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(osp_tests[i].expected, strg_buf), "SPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - - /* Truncate expected string in preparation for snprintf test */ - strcpy(trunc_buf, osp_tests[i].expected); - - if (strlen(trunc_buf) >= osp_tests[i].max_len) - { - trunc_buf[osp_tests[i].max_len - 1] = '\0'; - } - - /* Perform snprintf test */ - init_test(); - snprintf(strg_buf, osp_tests[i].max_len, osp_tests[i].format, osp_tests[i].test_val); - UT_Report(check_test(trunc_buf, strg_buf), "SNPRINTF", osp_tests[i].description, test_fmt, - osp_tests[i].test_num); - } -} From 443f3f900c4892aa2a77fb410939dd33733dc815 Mon Sep 17 00:00:00 2001 From: Steven Seeger Date: Wed, 16 Sep 2020 03:37:27 -0400 Subject: [PATCH 026/111] Fix #610, add support for vxworks7 This adds support for vxworks7 with its minor differences from vxworks6. --- src/os/vxworks/CMakeLists.txt | 11 ++- src/os/vxworks/inc/os-impl-tasks.h | 16 +++- src/os/vxworks/src/os-impl-common.c | 5 +- src/os/vxworks/src/os-impl-dirs-globals.c | 55 ++++++++++++++ src/os/vxworks/src/os-impl-dirs.c | 18 ----- src/os/vxworks/src/os-impl-tasks.c | 2 +- src/unit-test-coverage/vxworks/CMakeLists.txt | 1 + .../vxworks/adaptors/CMakeLists.txt | 1 + .../adaptors/src/ut-adaptor-dirtable-stub.c | 36 +++++++++ .../vxworks/src/coveragetest-dirs-globals.c | 76 +++++++++++++++++++ .../vxworks/src/coveragetest-dirs.c | 10 --- 11 files changed, 196 insertions(+), 35 deletions(-) create mode 100644 src/os/vxworks/src/os-impl-dirs-globals.c create mode 100644 src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c create mode 100644 src/unit-test-coverage/vxworks/src/coveragetest-dirs-globals.c diff --git a/src/os/vxworks/CMakeLists.txt b/src/os/vxworks/CMakeLists.txt index 9a510d041..9d1cc84d7 100644 --- a/src/os/vxworks/CMakeLists.txt +++ b/src/os/vxworks/CMakeLists.txt @@ -14,7 +14,7 @@ set(VXWORKS_BASE_SRCLIST src/os-impl-console.c src/os-impl-countsem.c src/os-impl-errors.c - src/os-impl-dirs.c + src/os-impl-dirs-globals.c src/os-impl-files.c src/os-impl-filesys.c src/os-impl-heap.c @@ -45,6 +45,15 @@ else () ) endif () +if (CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 7.0) + list(APPEND VXWORKS_IMPL_SRCLIST + ../portable/os-impl-posix-dirs.c + ) +else () + list(APPEND VXWORKS_IMPL_SRCLIST + src/os-impl-dirs.c + ) +endif () # If some form of module loading is configured, # then build the module loader if (OSAL_CONFIG_INCLUDE_DYNAMIC_LOADER) diff --git a/src/os/vxworks/inc/os-impl-tasks.h b/src/os/vxworks/inc/os-impl-tasks.h index 8ae32d36b..d716ba88a 100644 --- a/src/os/vxworks/inc/os-impl-tasks.h +++ b/src/os/vxworks/inc/os-impl-tasks.h @@ -31,13 +31,21 @@ #include #include +#if defined(VX_WIND_TCB_SIZE) +/* vxworks >= 7.0 should provide this symbol via taskLib.h. WIND_TCB is an opaque type */ +typedef char OS_VxWorks_TCB_t[VX_WIND_TCB_SIZE]; +#else +/* older vxworks expose the definition of VX_WIND_TCB_SIZE */ +typedef WIND_TCB OS_VxWorks_TCB_t; +#endif /* !defined(VX_WIND_TCB_SIZE) */ + /*tasks */ typedef struct { - WIND_TCB tcb; /* Must be first */ - TASK_ID vxid; - void * heap_block; /* set non-null if the stack was obtained with malloc() */ - size_t heap_block_size; + OS_VxWorks_TCB_t tcb; /* Must be first */ + TASK_ID vxid; + void *heap_block; /* set non-null if the stack was obtained with malloc() */ + size_t heap_block_size; } OS_impl_task_internal_record_t; /* Tables where the OS object information is stored */ diff --git a/src/os/vxworks/src/os-impl-common.c b/src/os/vxworks/src/os-impl-common.c index beed30470..8d98dce3b 100644 --- a/src/os/vxworks/src/os-impl-common.c +++ b/src/os/vxworks/src/os-impl-common.c @@ -184,8 +184,11 @@ int32 OS_VxWorks_GenericSemTake(SEM_ID vxid, int sys_ticks) * check for the timeout condition, * which has a different return code and * not necessarily an error of concern. + * + * vxworks7: if sys_ticks == 0, then if the semaphore can + * not be taken S_objLib_OBJ_UNAVAILABLE will be returned */ - if (errno == S_objLib_OBJ_TIMEOUT) + if ((errno == S_objLib_OBJ_TIMEOUT) || (!sys_ticks && (errno == S_objLib_OBJ_UNAVAILABLE))) { return OS_SEM_TIMEOUT; } diff --git a/src/os/vxworks/src/os-impl-dirs-globals.c b/src/os/vxworks/src/os-impl-dirs-globals.c new file mode 100644 index 000000000..7be3ab73a --- /dev/null +++ b/src/os/vxworks/src/os-impl-dirs-globals.c @@ -0,0 +1,55 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 os-impl-dirs.c + * \ingroup vxworks + * \author joseph.p.hickey@nasa.gov + * + */ + +/**************************************************************************************** + INCLUDE FILES +****************************************************************************************/ + +#include "os-vxworks.h" +#include "os-impl-dirs.h" +#include "os-shared-dir.h" + + +/* + * The directory handle table. + */ +OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; + + +/*---------------------------------------------------------------- + * + * Function: OS_VxWorks_DirAPI_Impl_Init + * + * Purpose: Local helper routine, not part of OSAL API. + * + *-----------------------------------------------------------------*/ +int32 OS_VxWorks_DirAPI_Impl_Init(void) +{ + memset(OS_impl_dir_table, 0, sizeof(OS_impl_dir_table)); + return OS_SUCCESS; +} /* end OS_VxWorks_DirAPI_Impl_Init */ + diff --git a/src/os/vxworks/src/os-impl-dirs.c b/src/os/vxworks/src/os-impl-dirs.c index 513b8b878..5933030f4 100644 --- a/src/os/vxworks/src/os-impl-dirs.c +++ b/src/os/vxworks/src/os-impl-dirs.c @@ -33,24 +33,6 @@ #include "os-impl-dirs.h" #include "os-shared-dir.h" -/* - * The directory handle table. - */ -OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; - -/*---------------------------------------------------------------- - * - * Function: OS_VxWorks_DirAPI_Impl_Init - * - * Purpose: Local helper routine, not part of OSAL API. - * - *-----------------------------------------------------------------*/ -int32 OS_VxWorks_DirAPI_Impl_Init(void) -{ - memset(OS_impl_dir_table, 0, sizeof(OS_impl_dir_table)); - return OS_SUCCESS; -} /* end OS_VxWorks_DirAPI_Impl_Init */ - /*---------------------------------------------------------------- * * Function: OS_DirCreate_Impl diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index 83afb2922..eaa125619 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -238,7 +238,7 @@ int32 OS_TaskCreate_Impl(osal_index_t task_id, uint32 flags) #endif id.id = OS_global_task_table[task_id].active_id; - status = taskInit(&lrec->tcb, /* address of new task's TCB */ + status = taskInit((WIND_TCB*)&lrec->tcb, /* address of new task's TCB */ (char *)OS_global_task_table[task_id].name_entry, vxpri, /* priority of new task */ vxflags, /* task option word */ (char *)actualstackbase, /* base of new task's stack */ diff --git a/src/unit-test-coverage/vxworks/CMakeLists.txt b/src/unit-test-coverage/vxworks/CMakeLists.txt index fee10fc5e..afcf47eb1 100644 --- a/src/unit-test-coverage/vxworks/CMakeLists.txt +++ b/src/unit-test-coverage/vxworks/CMakeLists.txt @@ -6,6 +6,7 @@ set(VXWORKS_MODULE_LIST console countsem dirs + dirs-globals files filesys idmap diff --git a/src/unit-test-coverage/vxworks/adaptors/CMakeLists.txt b/src/unit-test-coverage/vxworks/adaptors/CMakeLists.txt index f5e1d59f5..459d59373 100644 --- a/src/unit-test-coverage/vxworks/adaptors/CMakeLists.txt +++ b/src/unit-test-coverage/vxworks/adaptors/CMakeLists.txt @@ -13,6 +13,7 @@ add_library(ut-adaptor-${SETNAME} STATIC src/ut-adaptor-console.c src/ut-adaptor-countsem.c src/ut-adaptor-dirs.c + src/ut-adaptor-dirtable-stub.c src/ut-adaptor-files.c src/ut-adaptor-filesys.c src/ut-adaptor-idmap.c diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c new file mode 100644 index 000000000..766326414 --- /dev/null +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c @@ -0,0 +1,36 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 ut-adaptor-filetable-stub.c + * \ingroup adaptors + * \author joseph.p.hickey@nasa.gov + * + */ +/* pull in the OSAL configuration */ +#include "osconfig.h" +#include "ut-adaptor-filetable-stub.h" + +#include +#include +#include + +OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; + diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-dirs-globals.c b/src/unit-test-coverage/vxworks/src/coveragetest-dirs-globals.c new file mode 100644 index 000000000..c7c402383 --- /dev/null +++ b/src/unit-test-coverage/vxworks/src/coveragetest-dirs-globals.c @@ -0,0 +1,76 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 coveragetest-dirs-globals.c + * \ingroup vxworks + * \author steven.seeger@nasa.gov + * + */ + +#include "os-vxworks-coveragetest.h" +#include "ut-adaptor-dirs.h" + +#include "os-shared-dir.h" + +#include +#include +#include +#include +#include + +void Test_OS_VxWorks_DirAPI_Impl_Init(void) +{ + /* + * Test Case For: + * int32 OS_VxWorks_DirAPI_Impl_Init(void) + */ + OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_DirAPI_Impl_Init(), OS_SUCCESS); +} + +/* ------------------- End of test cases --------------------------------------*/ + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* UtTest_Setup + * + * Purpose: + * Registers the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(OS_VxWorks_DirAPI_Impl_Init); +} diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c index f31a0bbe2..e96a7cc8e 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c @@ -36,15 +36,6 @@ #include #include -void Test_OS_VxWorks_DirAPI_Impl_Init(void) -{ - /* - * Test Case For: - * int32 OS_VxWorks_DirAPI_Impl_Init(void) - */ - OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_DirAPI_Impl_Init(), OS_SUCCESS); -} - void Test_OS_DirCreate_Impl(void) { /* @@ -139,7 +130,6 @@ void Osapi_Test_Teardown(void) {} */ void UtTest_Setup(void) { - ADD_TEST(OS_VxWorks_DirAPI_Impl_Init); ADD_TEST(OS_DirCreate_Impl); ADD_TEST(OS_DirOpen_Impl); ADD_TEST(OS_DirClose_Impl); From 9d523b67e5cccb10aa9b437a7c0d2932f5576fb8 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 9 Dec 2020 10:42:55 -0500 Subject: [PATCH 027/111] Fix #120, Exit console loop on shutdown --- src/os/posix/src/os-impl-console.c | 5 ++++- src/os/rtems/src/os-impl-console.c | 5 ++++- src/os/vxworks/src/os-impl-console.c | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/os/posix/src/os-impl-console.c b/src/os/posix/src/os-impl-console.c index 7ba6baa63..74881962e 100644 --- a/src/os/posix/src/os-impl-console.c +++ b/src/os/posix/src/os-impl-console.c @@ -34,6 +34,7 @@ #include "os-shared-idmap.h" #include "os-shared-printf.h" +#include "os-shared-common.h" /* * By default the console output is always asynchronous @@ -96,7 +97,9 @@ static void *OS_ConsoleTask_Entry(void *arg) if (OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_CONSOLE, local_arg.id, &token) == OS_SUCCESS) { local = OS_OBJECT_TABLE_GET(OS_impl_console_table, token); - while (true) + + /* Loop forever (unless shutdown is set) */ + while (OS_SharedGlobalVars.ShutdownFlag != OS_SHUTDOWN_MAGIC_NUMBER) { OS_ConsoleOutput_Impl(&token); sem_wait(&local->data_sem); diff --git a/src/os/rtems/src/os-impl-console.c b/src/os/rtems/src/os-impl-console.c index ba0f2534a..7aa2622e3 100644 --- a/src/os/rtems/src/os-impl-console.c +++ b/src/os/rtems/src/os-impl-console.c @@ -38,6 +38,7 @@ #include "os-rtems.h" #include "os-shared-printf.h" #include "os-shared-idmap.h" +#include "os-shared-common.h" /**************************************************************************************** DEFINES @@ -120,7 +121,9 @@ static void OS_ConsoleTask_Entry(rtems_task_argument arg) OS_SUCCESS) { local = OS_OBJECT_TABLE_GET(OS_impl_console_table, token); - while (true) + + /* Loop forever (unless shutdown is set) */ + while (OS_SharedGlobalVars.ShutdownFlag != OS_SHUTDOWN_MAGIC_NUMBER) { OS_ConsoleOutput_Impl(&token); rtems_semaphore_obtain(local->data_sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); diff --git a/src/os/vxworks/src/os-impl-console.c b/src/os/vxworks/src/os-impl-console.c index 0a8bbe886..f5d44dc69 100644 --- a/src/os/vxworks/src/os-impl-console.c +++ b/src/os/vxworks/src/os-impl-console.c @@ -33,6 +33,7 @@ #include "os-shared-printf.h" #include "os-shared-idmap.h" +#include "os-shared-common.h" /**************************************************************************************** DEFINES @@ -104,7 +105,9 @@ int OS_VxWorks_ConsoleTask_Entry(int arg) OS_SUCCESS) { local = OS_OBJECT_TABLE_GET(OS_impl_console_table, token); - while (true) + + /* Loop forever (unless shutdown is set) */ + while (OS_SharedGlobalVars.ShutdownFlag != OS_SHUTDOWN_MAGIC_NUMBER) { OS_ConsoleOutput_Impl(&token); if (semTake(local->datasem, WAIT_FOREVER) == ERROR) From 9a73cb59a2293cf8a90cf7eb40f4d616e8284896 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 9 Dec 2020 14:24:37 -0500 Subject: [PATCH 028/111] Fix #542, Avoid UT failure if SEM_VALUE_MAX >= UINT32_MAX --- src/unit-tests/oscore-test/ut_oscore_countsem_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unit-tests/oscore-test/ut_oscore_countsem_test.c b/src/unit-tests/oscore-test/ut_oscore_countsem_test.c index b76651b9e..855d5e9f5 100644 --- a/src/unit-tests/oscore-test/ut_oscore_countsem_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_countsem_test.c @@ -125,7 +125,7 @@ void UT_os_count_sem_create_test() * The OSAL should define this for itself, but it currently does not. * (This macro is not currently defined in RTEMS) */ -#ifdef SEM_VALUE_MAX +#if defined SEM_VALUE_MAX && SEM_VALUE_MAX < UINT32_MAX res = OS_CountSemCreate(&count_sem_ids[0], "CountSem1", ((uint32)SEM_VALUE_MAX) + 1, 0); if (res == OS_INVALID_SEM_VALUE) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); From 52124890af1b156363d4d4260826cc22ecf38f9f Mon Sep 17 00:00:00 2001 From: Gerardo E Cruz-Ortiz <59618057+astrogeco@users.noreply.github.com> Date: Wed, 9 Dec 2020 14:51:38 -0500 Subject: [PATCH 029/111] Bump to v5.1.0-rc1+dev109 --- README.md | 10 ++++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8be71b9c4..bd682fb32 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,16 @@ The autogenerated OSAL user's guide can be viewed at + + ### Development Build: 5.1.0-rc1+dev91 - Rename `UT_SetForceFail` to `UT_SetDefaultReturnValue` since some functions that retain more than 1 value are not necessarily failing diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index 66d55dab0..885439130 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 91 +#define OS_BUILD_NUMBER 109 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* From 4b56ac13504781aae68caccc20d751d7f1c7391d Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 9 Dec 2020 15:46:04 -0500 Subject: [PATCH 030/111] Fix #569, Check and report sysconf error return --- src/os/posix/src/os-impl-tasks.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/os/posix/src/os-impl-tasks.c b/src/os/posix/src/os-impl-tasks.c index a529264ee..7fd81f21e 100644 --- a/src/os/posix/src/os-impl-tasks.c +++ b/src/os/posix/src/os-impl-tasks.c @@ -206,6 +206,7 @@ static bool OS_Posix_GetSchedulerParams(int sched_policy, POSIX_PriorityLimits_t int32 OS_Posix_TaskAPI_Impl_Init(void) { int ret; + long ret_long; int sig; struct sched_param sched_param; int sched_policy; @@ -417,7 +418,13 @@ int32 OS_Posix_TaskAPI_Impl_Init(void) } #endif - POSIX_GlobalVars.PageSize = sysconf(_SC_PAGESIZE); + ret_long = sysconf(_SC_PAGESIZE); + if (ret_long < 0) + { + OS_DEBUG("Could not get page size via sysconf: %s\n", strerror(errno)); + return OS_ERROR; + } + POSIX_GlobalVars.PageSize = ret_long; return OS_SUCCESS; } /* end OS_Posix_TaskAPI_Impl_Init */ From f0bd42edb8d731c2ba899292b3fd8f56e0f5fcb4 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Thu, 3 Dec 2020 15:38:54 -0500 Subject: [PATCH 031/111] Fix #410, breakup OSAL includes Includes compatibility wrappers for the old header names. Refactors inclusions in all OSAL source files to only include the components they actually use/refer to. Refactor all inclusion guards to follow the same general format (uppercase filename, no leading/trailing underscore) --- osconfig.h.in | 14 +- src/bsp/generic-linux/src/bsp_console.c | 2 + src/bsp/generic-linux/src/bsp_start.c | 1 + .../src/generic_linux_bsp_internal.h | 6 +- .../src/generic_vxworks_bsp_internal.h | 3 +- src/bsp/pc-rtems/src/pcrtems_bsp_internal.h | 7 +- src/bsp/shared/inc/bsp-impl.h | 12 +- src/bsp/shared/src/bsp_default_app_run.c | 2 +- src/bsp/shared/src/bsp_default_app_startup.c | 1 - src/bsp/shared/src/bsp_default_symtab.c | 2 +- src/os/inc/common_types.h | 11 +- src/os/inc/osapi-binsem.h | 205 +++ src/os/inc/osapi-bsp.h | 94 + src/os/inc/osapi-clock.h | 72 + src/os/inc/osapi-common.h | 215 +++ src/os/inc/osapi-constants.h | 58 + src/os/inc/osapi-countsem.h | 178 ++ src/os/inc/osapi-dir.h | 141 ++ src/os/inc/osapi-error.h | 122 ++ src/os/inc/osapi-file.h | 523 ++++++ src/os/inc/osapi-filesys.h | 272 +++ src/os/inc/osapi-heap.h | 58 + src/os/inc/osapi-idmap.h | 273 +++ src/os/inc/osapi-module.h | 235 +++ src/os/inc/osapi-mutex.h | 153 ++ src/os/inc/osapi-network.h | 71 + src/os/inc/osapi-os-core.h | 1558 +---------------- src/os/inc/osapi-os-filesys.h | 891 +--------- src/os/inc/osapi-os-loader.h | 205 +-- src/os/inc/osapi-os-net.h | 373 +--- src/os/inc/osapi-os-timer.h | 331 +--- src/os/inc/osapi-printf.h | 71 + src/os/inc/osapi-queue.h | 167 ++ src/os/inc/osapi-select.h | 157 ++ src/os/inc/osapi-shell.h | 54 + src/os/inc/osapi-sockets.h | 402 +++++ src/os/inc/osapi-task.h | 251 +++ src/os/inc/osapi-timebase.h | 188 ++ src/os/inc/osapi-timer.h | 211 +++ src/os/inc/osapi-version.h | 6 +- src/os/inc/osapi.h | 85 +- src/os/portable/os-impl-bsd-select.c | 1 - src/os/portable/os-impl-console-bsp.c | 2 + src/os/portable/os-impl-no-loader.c | 1 - src/os/portable/os-impl-no-network.c | 1 - src/os/portable/os-impl-no-sockets.c | 2 +- src/os/portable/os-impl-no-symtab.c | 2 +- src/os/portable/os-impl-posix-files.c | 2 + src/os/portable/os-impl-posix-gettime.c | 2 +- src/os/posix/inc/os-impl-binsem.h | 8 +- src/os/posix/inc/os-impl-console.h | 8 +- src/os/posix/inc/os-impl-countsem.h | 8 +- src/os/posix/inc/os-impl-dirs.h | 8 +- src/os/posix/inc/os-impl-files.h | 6 +- src/os/posix/inc/os-impl-gettime.h | 8 +- src/os/posix/inc/os-impl-io.h | 10 +- src/os/posix/inc/os-impl-loader.h | 8 +- src/os/posix/inc/os-impl-mutex.h | 8 +- src/os/posix/inc/os-impl-network.h | 6 +- src/os/posix/inc/os-impl-queues.h | 8 +- src/os/posix/inc/os-impl-select.h | 6 +- src/os/posix/inc/os-impl-sockets.h | 6 +- src/os/posix/inc/os-impl-tasks.h | 14 +- src/os/posix/inc/os-impl-timebase.h | 8 +- src/os/posix/inc/os-posix.h | 8 +- src/os/posix/src/os-impl-common.c | 1 - src/os/posix/src/os-impl-console.c | 1 + src/os/posix/src/os-impl-no-module.c | 2 +- src/os/posix/src/os-impl-timebase.c | 1 + src/os/rtems/inc/os-impl-binsem.h | 8 +- src/os/rtems/inc/os-impl-console.h | 8 +- src/os/rtems/inc/os-impl-countsem.h | 8 +- src/os/rtems/inc/os-impl-dirs.h | 8 +- src/os/rtems/inc/os-impl-files.h | 6 +- src/os/rtems/inc/os-impl-gettime.h | 8 +- src/os/rtems/inc/os-impl-io.h | 8 +- src/os/rtems/inc/os-impl-loader.h | 8 +- src/os/rtems/inc/os-impl-mutex.h | 8 +- src/os/rtems/inc/os-impl-queues.h | 8 +- src/os/rtems/inc/os-impl-select.h | 6 +- src/os/rtems/inc/os-impl-sockets.h | 6 +- src/os/rtems/inc/os-impl-tasks.h | 8 +- src/os/rtems/inc/os-impl-timebase.h | 8 +- src/os/rtems/inc/os-rtems.h | 6 +- src/os/rtems/src/os-impl-common.c | 1 + src/os/rtems/src/os-impl-tasks.c | 2 + src/os/rtems/src/os-impl-timebase.c | 2 + src/os/shared/inc/os-shared-binsem.h | 7 +- src/os/shared/inc/os-shared-clock.h | 7 +- src/os/shared/inc/os-shared-common.h | 7 +- src/os/shared/inc/os-shared-countsem.h | 7 +- src/os/shared/inc/os-shared-dir.h | 7 +- src/os/shared/inc/os-shared-errors.h | 6 +- src/os/shared/inc/os-shared-file.h | 7 +- src/os/shared/inc/os-shared-filesys.h | 7 +- src/os/shared/inc/os-shared-globaldefs.h | 15 +- src/os/shared/inc/os-shared-heap.h | 7 +- src/os/shared/inc/os-shared-idmap.h | 7 +- src/os/shared/inc/os-shared-module.h | 7 +- src/os/shared/inc/os-shared-mutex.h | 7 +- src/os/shared/inc/os-shared-network.h | 7 +- src/os/shared/inc/os-shared-printf.h | 7 +- src/os/shared/inc/os-shared-queue.h | 7 +- src/os/shared/inc/os-shared-select.h | 7 +- src/os/shared/inc/os-shared-shell.h | 7 +- src/os/shared/inc/os-shared-sockets.h | 7 +- src/os/shared/inc/os-shared-task.h | 7 +- src/os/shared/inc/os-shared-time.h | 8 +- src/os/shared/inc/os-shared-timebase.h | 7 +- src/os/shared/src/osapi-dir.c | 2 + src/os/shared/src/osapi-file.c | 8 + src/os/shared/src/osapi-module.c | 6 + src/os/shared/src/osapi-mutex.c | 5 + src/os/shared/src/osapi-printf.c | 1 + src/os/shared/src/osapi-sockets.c | 6 + src/os/shared/src/osapi-time.c | 10 +- src/os/vxworks/inc/os-impl-binsem.h | 8 +- src/os/vxworks/inc/os-impl-console.h | 8 +- src/os/vxworks/inc/os-impl-countsem.h | 8 +- src/os/vxworks/inc/os-impl-dirs.h | 8 +- src/os/vxworks/inc/os-impl-files.h | 6 +- src/os/vxworks/inc/os-impl-filesys.h | 10 +- src/os/vxworks/inc/os-impl-gettime.h | 8 +- src/os/vxworks/inc/os-impl-io.h | 10 +- src/os/vxworks/inc/os-impl-loader.h | 8 +- src/os/vxworks/inc/os-impl-mutex.h | 8 +- src/os/vxworks/inc/os-impl-network.h | 6 +- src/os/vxworks/inc/os-impl-queues.h | 8 +- src/os/vxworks/inc/os-impl-select.h | 6 +- src/os/vxworks/inc/os-impl-sockets.h | 6 +- src/os/vxworks/inc/os-impl-symtab.h | 8 +- src/os/vxworks/inc/os-impl-tasks.h | 8 +- src/os/vxworks/inc/os-impl-timebase.h | 10 +- src/os/vxworks/inc/os-vxworks.h | 6 +- src/os/vxworks/src/os-impl-common.c | 1 + src/os/vxworks/src/os-impl-timebase.c | 2 + .../inc/ut-adaptor-portable-posix-files.h | 8 +- .../inc/ut-adaptor-portable-posix-io.h | 20 +- .../portable/src/os-portable-coveragetest.h | 18 +- .../shared/adaptors/inc/ut-adaptor-module.h | 10 +- .../shared/src/os-shared-coveragetest.h | 8 +- .../ut-stubs/inc/OCS_arpa_inet.h | 6 +- .../ut-stubs/inc/OCS_assert.h | 6 +- .../ut-stubs/inc/OCS_basetypes.h | 6 +- .../ut-stubs/inc/OCS_blkIo.h | 6 +- .../ut-stubs/inc/OCS_bsp-impl.h | 6 +- .../ut-stubs/inc/OCS_cbioLib.h | 6 +- .../ut-stubs/inc/OCS_complex.h | 6 +- .../ut-stubs/inc/OCS_ctype.h | 6 +- .../ut-stubs/inc/OCS_dirent.h | 6 +- .../ut-stubs/inc/OCS_dlfcn.h | 6 +- .../ut-stubs/inc/OCS_dosFsLib.h | 6 +- .../ut-stubs/inc/OCS_drv_hdisk_ataDrv.h | 6 +- .../ut-stubs/inc/OCS_errno.h | 6 +- .../ut-stubs/inc/OCS_errnoLib.h | 6 +- .../ut-stubs/inc/OCS_fcntl.h | 6 +- .../ut-stubs/inc/OCS_fenv.h | 6 +- .../ut-stubs/inc/OCS_float.h | 6 +- .../ut-stubs/inc/OCS_hostLib.h | 6 +- .../ut-stubs/inc/OCS_intLib.h | 6 +- .../ut-stubs/inc/OCS_inttypes.h | 6 +- .../ut-stubs/inc/OCS_ioLib.h | 6 +- src/unit-test-coverage/ut-stubs/inc/OCS_iv.h | 6 +- .../ut-stubs/inc/OCS_loadLib.h | 6 +- .../ut-stubs/inc/OCS_locale.h | 6 +- .../ut-stubs/inc/OCS_logLib.h | 6 +- .../ut-stubs/inc/OCS_math.h | 6 +- .../ut-stubs/inc/OCS_memPartLib.h | 6 +- .../ut-stubs/inc/OCS_moduleLib.h | 6 +- .../ut-stubs/inc/OCS_mqueue.h | 6 +- .../ut-stubs/inc/OCS_msgQLib.h | 6 +- .../ut-stubs/inc/OCS_net_if.h | 6 +- .../ut-stubs/inc/OCS_netdb.h | 6 +- .../ut-stubs/inc/OCS_netinet_in.h | 6 +- .../ut-stubs/inc/OCS_netinet_tcp.h | 6 +- .../ut-stubs/inc/OCS_objLib.h | 6 +- .../ut-stubs/inc/OCS_poll.h | 6 +- .../ut-stubs/inc/OCS_pthread.h | 6 +- .../ut-stubs/inc/OCS_ramDiskCbio.h | 6 +- .../ut-stubs/inc/OCS_ramDrv.h | 6 +- .../ut-stubs/inc/OCS_sched.h | 6 +- .../ut-stubs/inc/OCS_semLib.h | 6 +- .../ut-stubs/inc/OCS_semaphore.h | 6 +- .../ut-stubs/inc/OCS_setjmp.h | 6 +- .../ut-stubs/inc/OCS_shellLib.h | 6 +- .../ut-stubs/inc/OCS_signal.h | 6 +- .../ut-stubs/inc/OCS_stat.h | 6 +- .../ut-stubs/inc/OCS_stdarg.h | 6 +- .../ut-stubs/inc/OCS_stdio.h | 6 +- .../ut-stubs/inc/OCS_stdlib.h | 6 +- .../ut-stubs/inc/OCS_string.h | 6 +- .../ut-stubs/inc/OCS_strings.h | 6 +- .../ut-stubs/inc/OCS_symLib.h | 6 +- .../ut-stubs/inc/OCS_sysLib.h | 6 +- .../ut-stubs/inc/OCS_sys_ioctl.h | 6 +- .../ut-stubs/inc/OCS_sys_ipc.h | 6 +- .../ut-stubs/inc/OCS_sys_mman.h | 6 +- .../ut-stubs/inc/OCS_sys_select.h | 6 +- .../ut-stubs/inc/OCS_sys_socket.h | 6 +- .../ut-stubs/inc/OCS_sys_time.h | 6 +- .../ut-stubs/inc/OCS_sys_times.h | 6 +- .../ut-stubs/inc/OCS_sys_types.h | 6 +- .../ut-stubs/inc/OCS_sys_un.h | 6 +- .../ut-stubs/inc/OCS_sys_wait.h | 6 +- .../ut-stubs/inc/OCS_taskLib.h | 6 +- .../ut-stubs/inc/OCS_taskVarLib.h | 6 +- .../ut-stubs/inc/OCS_termios.h | 6 +- .../ut-stubs/inc/OCS_tgmath.h | 6 +- .../ut-stubs/inc/OCS_time.h | 6 +- .../ut-stubs/inc/OCS_timers.h | 6 +- .../ut-stubs/inc/OCS_ulimit.h | 6 +- .../ut-stubs/inc/OCS_unistd.h | 6 +- .../ut-stubs/inc/OCS_unldLib.h | 6 +- .../ut-stubs/inc/OCS_usrLib.h | 6 +- .../ut-stubs/inc/OCS_version.h | 6 +- .../ut-stubs/inc/OCS_vxWorks.h | 6 +- .../ut-stubs/inc/OCS_wchar.h | 6 +- .../ut-stubs/inc/OCS_wctype.h | 6 +- .../ut-stubs/inc/OCS_xbdBlkDev.h | 6 +- .../ut-stubs/inc/OCS_xbdRamDisk.h | 6 +- .../ut-stubs/override_inc/arpa/inet.h | 6 +- .../ut-stubs/override_inc/assert.h | 6 +- .../ut-stubs/override_inc/blkIo.h | 6 +- .../ut-stubs/override_inc/bsp-impl.h | 6 +- .../ut-stubs/override_inc/cbioLib.h | 6 +- .../ut-stubs/override_inc/complex.h | 6 +- .../ut-stubs/override_inc/ctype.h | 6 +- .../ut-stubs/override_inc/dirent.h | 6 +- .../ut-stubs/override_inc/dlfcn.h | 6 +- .../ut-stubs/override_inc/dosFsLib.h | 6 +- .../ut-stubs/override_inc/drv/hdisk/ataDrv.h | 6 +- .../ut-stubs/override_inc/errno.h | 6 +- .../ut-stubs/override_inc/errnoLib.h | 6 +- .../ut-stubs/override_inc/fcntl.h | 6 +- .../ut-stubs/override_inc/fenv.h | 6 +- .../ut-stubs/override_inc/float.h | 6 +- .../ut-stubs/override_inc/hostLib.h | 6 +- .../ut-stubs/override_inc/intLib.h | 6 +- .../ut-stubs/override_inc/inttypes.h | 6 +- .../ut-stubs/override_inc/ioLib.h | 6 +- .../ut-stubs/override_inc/iv.h | 6 +- .../ut-stubs/override_inc/loadLib.h | 6 +- .../ut-stubs/override_inc/locale.h | 6 +- .../ut-stubs/override_inc/logLib.h | 6 +- .../ut-stubs/override_inc/math.h | 6 +- .../ut-stubs/override_inc/memPartLib.h | 6 +- .../ut-stubs/override_inc/moduleLib.h | 6 +- .../ut-stubs/override_inc/mqueue.h | 6 +- .../ut-stubs/override_inc/msgQLib.h | 6 +- .../ut-stubs/override_inc/net/if.h | 6 +- .../ut-stubs/override_inc/netdb.h | 6 +- .../ut-stubs/override_inc/netinet/in.h | 6 +- .../ut-stubs/override_inc/netinet/tcp.h | 6 +- .../ut-stubs/override_inc/objLib.h | 6 +- .../ut-stubs/override_inc/poll.h | 6 +- .../ut-stubs/override_inc/pthread.h | 6 +- .../ut-stubs/override_inc/ramDiskCbio.h | 6 +- .../ut-stubs/override_inc/ramDrv.h | 6 +- .../ut-stubs/override_inc/sched.h | 6 +- .../ut-stubs/override_inc/selectLib.h | 6 +- .../ut-stubs/override_inc/semLib.h | 6 +- .../ut-stubs/override_inc/semaphore.h | 6 +- .../ut-stubs/override_inc/setjmp.h | 6 +- .../ut-stubs/override_inc/shellLib.h | 6 +- .../ut-stubs/override_inc/signal.h | 6 +- .../ut-stubs/override_inc/stat.h | 6 +- .../ut-stubs/override_inc/stdarg.h | 6 +- .../ut-stubs/override_inc/stdio.h | 6 +- .../ut-stubs/override_inc/stdlib.h | 6 +- .../ut-stubs/override_inc/string.h | 6 +- .../ut-stubs/override_inc/strings.h | 6 +- .../ut-stubs/override_inc/symLib.h | 6 +- .../ut-stubs/override_inc/sys/ioctl.h | 6 +- .../ut-stubs/override_inc/sys/ipc.h | 6 +- .../ut-stubs/override_inc/sys/mman.h | 6 +- .../ut-stubs/override_inc/sys/select.h | 6 +- .../ut-stubs/override_inc/sys/signal.h | 6 +- .../ut-stubs/override_inc/sys/socket.h | 6 +- .../ut-stubs/override_inc/sys/stat.h | 6 +- .../ut-stubs/override_inc/sys/statvfs.h | 6 +- .../ut-stubs/override_inc/sys/time.h | 6 +- .../ut-stubs/override_inc/sys/times.h | 6 +- .../ut-stubs/override_inc/sys/types.h | 6 +- .../ut-stubs/override_inc/sys/un.h | 6 +- .../ut-stubs/override_inc/sys/wait.h | 6 +- .../ut-stubs/override_inc/sysLib.h | 6 +- .../ut-stubs/override_inc/taskLib.h | 6 +- .../ut-stubs/override_inc/taskVarLib.h | 6 +- .../ut-stubs/override_inc/termios.h | 6 +- .../ut-stubs/override_inc/tgmath.h | 6 +- .../ut-stubs/override_inc/time.h | 6 +- .../ut-stubs/override_inc/timers.h | 6 +- .../ut-stubs/override_inc/ulimit.h | 6 +- .../ut-stubs/override_inc/unistd.h | 6 +- .../ut-stubs/override_inc/unldLib.h | 6 +- .../ut-stubs/override_inc/usrLib.h | 6 +- .../ut-stubs/override_inc/version.h | 6 +- .../ut-stubs/override_inc/vxWorks.h | 6 +- .../ut-stubs/override_inc/wchar.h | 6 +- .../ut-stubs/override_inc/wctype.h | 6 +- .../ut-stubs/override_inc/xbdBlkDev.h | 6 +- .../ut-stubs/override_inc/xbdRamDisk.h | 6 +- .../ut-stubs/src/osapi-task-impl-stubs.c | 1 + .../ut-stubs/src/posix-dlfcn-stubs.c | 6 +- .../vxworks/adaptors/inc/ut-adaptor-binsem.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-common.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-console.h | 8 +- .../adaptors/inc/ut-adaptor-countsem.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-dirs.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-files.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-filesys.h | 8 +- .../adaptors/inc/ut-adaptor-filetable-stub.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-idmap.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-loader.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-mutex.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-queues.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-symtab.h | 8 +- .../vxworks/adaptors/inc/ut-adaptor-tasks.h | 8 +- .../adaptors/inc/ut-adaptor-timebase.h | 8 +- .../vxworks/adaptors/src/ut-adaptor-common.c | 2 +- .../vxworks/adaptors/src/ut-adaptor-idmap.c | 2 +- .../vxworks/adaptors/src/ut-adaptor-tasks.c | 1 + .../vxworks/src/os-vxworks-coveragetest.h | 6 +- src/unit-tests/inc/ut_os_support.h | 6 +- .../oscore-test/ut_oscore_binsem_test.h | 6 +- .../oscore-test/ut_oscore_countsem_test.h | 6 +- .../oscore-test/ut_oscore_misc_test.h | 6 +- .../oscore-test/ut_oscore_mutex_test.h | 6 +- .../oscore-test/ut_oscore_queue_test.h | 6 +- .../oscore-test/ut_oscore_select_test.h | 6 +- .../oscore-test/ut_oscore_task_test.h | 6 +- src/unit-tests/oscore-test/ut_oscore_test.h | 6 +- .../osfile-test/ut_osfile_dirio_test.h | 6 +- .../osfile-test/ut_osfile_fileio_test.h | 6 +- src/unit-tests/osfile-test/ut_osfile_test.h | 6 +- .../osfilesys-test/ut_osfilesys_diskio_test.h | 6 +- .../osfilesys-test/ut_osfilesys_test.h | 6 +- .../osloader-test/ut_osloader_module_test.h | 6 +- .../osloader-test/ut_osloader_symtable_test.h | 6 +- .../osloader-test/ut_osloader_test.h | 6 +- .../ut_osloader_test_platforms.h | 6 +- .../osnetwork-test/ut_osnetwork_misc_test.h | 6 +- .../osnetwork-test/ut_osnetwork_test.h | 6 +- src/unit-tests/ostimer-test/ut_ostimer_test.h | 6 +- .../ostimer-test/ut_ostimer_timerio_test.h | 6 +- src/ut-stubs/osapi-utstub-binsem.c | 1 + src/ut-stubs/osapi-utstub-bsp.c | 1 + src/ut-stubs/osapi-utstub-clock.c | 1 + src/ut-stubs/osapi-utstub-common.c | 1 + src/ut-stubs/osapi-utstub-countsem.c | 1 + src/ut-stubs/osapi-utstub-dir.c | 1 + src/ut-stubs/osapi-utstub-errors.c | 1 + src/ut-stubs/osapi-utstub-file.c | 2 + src/ut-stubs/osapi-utstub-filesys.c | 1 + src/ut-stubs/osapi-utstub-heap.c | 1 + src/ut-stubs/osapi-utstub-idmap.c | 1 + src/ut-stubs/osapi-utstub-module.c | 1 + src/ut-stubs/osapi-utstub-mutex.c | 1 + src/ut-stubs/osapi-utstub-network.c | 1 + src/ut-stubs/osapi-utstub-printf.c | 1 + src/ut-stubs/osapi-utstub-queue.c | 2 + src/ut-stubs/osapi-utstub-select.c | 1 + src/ut-stubs/osapi-utstub-sockets.c | 1 + src/ut-stubs/osapi-utstub-task.c | 1 + src/ut-stubs/osapi-utstub-time.c | 1 + src/ut-stubs/osapi-utstub-timebase.c | 1 + src/ut-stubs/utstub-helpers.c | 2 + src/ut-stubs/utstub-helpers.h | 8 +- ut_assert/inc/utassert.h | 4 +- ut_assert/inc/utbsp.h | 6 +- ut_assert/inc/utlist.h | 4 +- ut_assert/inc/utstubs.h | 6 +- ut_assert/inc/uttest.h | 4 +- ut_assert/inc/uttools.h | 4 +- ut_assert/src/utglobal.h | 6 +- 375 files changed, 5326 insertions(+), 4328 deletions(-) create mode 100644 src/os/inc/osapi-binsem.h create mode 100644 src/os/inc/osapi-bsp.h create mode 100644 src/os/inc/osapi-clock.h create mode 100644 src/os/inc/osapi-common.h create mode 100644 src/os/inc/osapi-constants.h create mode 100644 src/os/inc/osapi-countsem.h create mode 100644 src/os/inc/osapi-dir.h create mode 100644 src/os/inc/osapi-error.h create mode 100644 src/os/inc/osapi-file.h create mode 100644 src/os/inc/osapi-filesys.h create mode 100644 src/os/inc/osapi-heap.h create mode 100644 src/os/inc/osapi-idmap.h create mode 100644 src/os/inc/osapi-module.h create mode 100644 src/os/inc/osapi-mutex.h create mode 100644 src/os/inc/osapi-network.h create mode 100644 src/os/inc/osapi-printf.h create mode 100644 src/os/inc/osapi-queue.h create mode 100644 src/os/inc/osapi-select.h create mode 100644 src/os/inc/osapi-shell.h create mode 100644 src/os/inc/osapi-sockets.h create mode 100644 src/os/inc/osapi-task.h create mode 100644 src/os/inc/osapi-timebase.h create mode 100644 src/os/inc/osapi-timer.h diff --git a/osconfig.h.in b/osconfig.h.in index 49ee2768c..a825d99f7 100644 --- a/osconfig.h.in +++ b/osconfig.h.in @@ -32,8 +32,8 @@ * @CMAKE_CURRENT_SOURCE_DIR@/default_config.cmake */ -#ifndef INCLUDE_OSCONFIG_H_ -#define INCLUDE_OSCONFIG_H_ +#ifndef OSCONFIG_H +#define OSCONFIG_H /* * OSAL feature selection options from build config @@ -275,5 +275,13 @@ */ #define OS_MODULE_FILE_EXTENSION "@CMAKE_SHARED_LIBRARY_SUFFIX@" +/* +** Length of a Device and Volume name +*/ +#define OS_FS_DEV_NAME_LEN 32 /**< Device name length */ +#define OS_FS_PHYS_NAME_LEN 64 /**< Physical drive name length */ +#define OS_FS_VOL_NAME_LEN 32 /**< Volume name length */ + + +#endif /* OSCONFIG_H */ -#endif /* INCLUDE_OSCONFIG_H_ */ diff --git a/src/bsp/generic-linux/src/bsp_console.c b/src/bsp/generic-linux/src/bsp_console.c index ddae03c99..29b09b19a 100644 --- a/src/bsp/generic-linux/src/bsp_console.c +++ b/src/bsp/generic-linux/src/bsp_console.c @@ -25,6 +25,8 @@ * OSAL BSP debug console abstraction */ +#include +#include #include #include #include diff --git a/src/bsp/generic-linux/src/bsp_start.c b/src/bsp/generic-linux/src/bsp_start.c index 1267b18d3..71b6afeb3 100644 --- a/src/bsp/generic-linux/src/bsp_start.c +++ b/src/bsp/generic-linux/src/bsp_start.c @@ -28,6 +28,7 @@ * 2005/07/26 A. Cudmore | Initial version for linux */ +#include #include #include #include diff --git a/src/bsp/generic-linux/src/generic_linux_bsp_internal.h b/src/bsp/generic-linux/src/generic_linux_bsp_internal.h index 60b0a0174..75548fe08 100644 --- a/src/bsp/generic-linux/src/generic_linux_bsp_internal.h +++ b/src/bsp/generic-linux/src/generic_linux_bsp_internal.h @@ -28,7 +28,9 @@ #ifndef GENERIC_LINUX_BSP_INTERNAL_H_ #define GENERIC_LINUX_BSP_INTERNAL_H_ -#include "osapi.h" +#include "osapi-common.h" +#include "osapi-bsp.h" +#include "osapi-error.h" #include "bsp-impl.h" /* @@ -44,4 +46,4 @@ typedef struct */ extern OS_BSP_GenericLinuxGlobalData_t OS_BSP_GenericLinuxGlobal; -#endif /* GENERIC_LINUX_BSP_INTERNAL_H_ */ +#endif /* GENERIC_LINUX_BSP_INTERNAL_H */ diff --git a/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h b/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h index 6734dde78..b879a4c16 100644 --- a/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h +++ b/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h @@ -31,7 +31,6 @@ /* ** OSAL includes */ -#include "osapi.h" #include "bsp-impl.h" -#endif /* GENERIC_VXWORKS_BSP_INTERNAL_H_ */ +#endif /* GENERIC_VXWORKS_BSP_INTERNAL_H */ diff --git a/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h b/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h index 12c04509c..919e219a4 100644 --- a/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h +++ b/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h @@ -25,13 +25,12 @@ * Header file for internal data to the PC-RTEMS BSP */ -#ifndef _PCRTEMS_BSP_INTERNAL_H_ -#define _PCRTEMS_BSP_INTERNAL_H_ +#ifndef PCRTEMS_BSP_INTERNAL_H +#define PCRTEMS_BSP_INTERNAL_H /* ** OSAL includes */ -#include "osapi.h" #include "bsp-impl.h" /* @@ -74,4 +73,4 @@ typedef struct */ extern OS_BSP_PcRtemsGlobalData_t OS_BSP_PcRtemsGlobal; -#endif /* _PCRTEMS_BSP_INTERNAL_H_ */ +#endif /* PCRTEMS_BSP_INTERNAL_H */ diff --git a/src/bsp/shared/inc/bsp-impl.h b/src/bsp/shared/inc/bsp-impl.h index 4c26a9b63..73f2ce4eb 100644 --- a/src/bsp/shared/inc/bsp-impl.h +++ b/src/bsp/shared/inc/bsp-impl.h @@ -40,10 +40,14 @@ * BSP-provided console or debug terminal device. */ -#ifndef _osapi_bsp_impl_ -#define _osapi_bsp_impl_ +#ifndef BSP_IMPL_H +#define BSP_IMPL_H -#include "osapi.h" +#include + +#include "osapi-common.h" +#include "osapi-bsp.h" +#include "osapi-error.h" /* * A set of simplified console control options @@ -151,4 +155,4 @@ void OS_BSP_Shutdown_Impl(void); /********************* END bsp-impl.h *********************/ -#endif /* _osapi_bsp_impl_ */ +#endif /* BSP_IMPL_H */ diff --git a/src/bsp/shared/src/bsp_default_app_run.c b/src/bsp/shared/src/bsp_default_app_run.c index 7366555df..b0f1f545b 100644 --- a/src/bsp/shared/src/bsp_default_app_run.c +++ b/src/bsp/shared/src/bsp_default_app_run.c @@ -29,7 +29,7 @@ * which will override this default. */ -#include "osapi.h" +#include "osapi-common.h" #include "bsp-impl.h" /* diff --git a/src/bsp/shared/src/bsp_default_app_startup.c b/src/bsp/shared/src/bsp_default_app_startup.c index 57afb31c2..40e3aa511 100644 --- a/src/bsp/shared/src/bsp_default_app_startup.c +++ b/src/bsp/shared/src/bsp_default_app_startup.c @@ -30,7 +30,6 @@ */ #include -#include "osapi.h" #include "bsp-impl.h" diff --git a/src/bsp/shared/src/bsp_default_symtab.c b/src/bsp/shared/src/bsp_default_symtab.c index d2c0e8c32..7650da395 100644 --- a/src/bsp/shared/src/bsp_default_symtab.c +++ b/src/bsp/shared/src/bsp_default_symtab.c @@ -29,7 +29,7 @@ * which will override this default. */ -#include "osapi.h" +#include "osapi-module.h" #include "bsp-impl.h" OS_static_symbol_record_t OS_STATIC_SYMBOL_TABLE[] = { diff --git a/src/os/inc/common_types.h b/src/os/inc/common_types.h index d29c0b7e0..937f9db83 100644 --- a/src/os/inc/common_types.h +++ b/src/os/inc/common_types.h @@ -28,8 +28,8 @@ * Assumes make file has defined processor family */ -#ifndef _common_types_ -#define _common_types_ +#ifndef COMMON_TYPES_H +#define COMMON_TYPES_H #ifdef __cplusplus extern "C" @@ -123,6 +123,13 @@ extern "C" */ typedef uint32 osal_objtype_t; + /** + * @brief General purpose OSAL callback function + * + * This may be used by multiple APIS + */ + typedef void (*OS_ArgCallback_t)(osal_id_t object_id, void *arg); + #ifndef NULL /* pointer to nothing */ #define NULL ((void *)0) #endif diff --git a/src/os/inc/osapi-binsem.h b/src/os/inc/osapi-binsem.h new file mode 100644 index 000000000..99c18e4d2 --- /dev/null +++ b/src/os/inc/osapi-binsem.h @@ -0,0 +1,205 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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: osapi-binsem.h + */ + +#ifndef OSAPI_BINSEM_H +#define OSAPI_BINSEM_H + +#include "osconfig.h" +#include "common_types.h" + + +/** @defgroup OSSemaphoreStates OSAL Semaphore State Defines + * @{ + */ +#define OS_SEM_FULL 1 /**< @brief Semaphore full state */ +#define OS_SEM_EMPTY 0 /**< @brief Semaphore empty state */ +/**@}*/ + + +/** @brief OSAL binary semaphore properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; + int32 value; +} OS_bin_sem_prop_t; + +/** @defgroup OSAPIBinSem OSAL Binary Semaphore APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Creates a binary semaphore + * + * Creates a binary semaphore with initial value specified by + * sem_initial_value and name specified by sem_name. sem_id will be + * returned to the caller + * + * @param[out] sem_id will be set to the non-zero ID of the newly-created resource + * @param[in] sem_name the name of the new resource to create + * @param[in] sem_initial_value the initial value of the binary semaphore + * @param[in] options Reserved for future use, should be passed as 0. + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if sen name or sem_id are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NO_FREE_IDS if all of the semaphore ids are taken + * @retval #OS_ERR_NAME_TAKEN if this is already the name of a binary semaphore + * @retval #OS_SEM_FAILURE if the OS call failed + */ +int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initial_value, uint32 options); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Unblock all tasks pending on the specified semaphore + * + * The function unblocks all tasks pending on the specified semaphore. However, + * this function does not change the state of the semaphore. + * + * @param[in] sem_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a binary semaphore + * @retval #OS_SEM_FAILURE if an unspecified failure occurs + */ +int32 OS_BinSemFlush(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Increment the semaphore value + * + * The function unlocks the semaphore referenced by sem_id by performing + * a semaphore unlock operation on that semaphore. If the semaphore value + * resulting from this operation is positive, then no threads were blocked + * waiting for the semaphore to become unlocked; the semaphore value is + * simply incremented for this semaphore. + * + * @param[in] sem_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not + * in the array of semaphores defined by the system + * @retval #OS_ERR_INVALID_ID if the id passed in is not a binary semaphore + */ +int32 OS_BinSemGive(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Decrement the semaphore value + * + * The locks the semaphore referenced by sem_id by performing a + * semaphore lock operation on that semaphore. If the semaphore value + * is currently zero, then the calling thread shall not return from + * the call until it either locks the semaphore or the call is + * interrupted. + * + * @param[in] sem_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID the Id passed in is not a valid binary semaphore + * @retval #OS_SEM_FAILURE if the OS call failed + */ +int32 OS_BinSemTake(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Decrement the semaphore value with a timeout + * + * The function locks the semaphore referenced by sem_id. However, + * if the semaphore cannot be locked without waiting for another process + * or thread to unlock the semaphore, this wait shall be terminated when + * the specified timeout, msecs, expires. + * + * @param[in] sem_id The object ID to operate on + * @param[in] msecs The maximum amount of time to block, in milliseconds + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_SEM_TIMEOUT if semaphore was not relinquished in time + * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not + * in the array of semaphores defined by the system + * @retval #OS_ERR_INVALID_ID if the ID passed in is not a valid semaphore ID + */ +int32 OS_BinSemTimedWait(osal_id_t sem_id, uint32 msecs); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes the specified Binary Semaphore + * + * This is the function used to delete a binary semaphore in the operating system. + * This also frees the respective sem_id to be used again when another semaphore is created. + * + * @param[in] sem_id The object ID to delete + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid binary semaphore + * @retval #OS_SEM_FAILURE the OS call failed + */ +int32 OS_BinSemDelete(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find an existing semaphore ID by name + * + * This function tries to find a binary sem Id given the name of a bin_sem + * The id is returned through sem_id + * + * @param[out] sem_id will be set to the ID of the existing resource + * @param[in] sem_name the name of the existing resource to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER is semid or sem_name are NULL pointers + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + */ +int32 OS_BinSemGetIdByName(osal_id_t *sem_id, const char *sem_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Fill a property object buffer with details regarding the resource + * + * This function will pass back a pointer to structure that contains + * all of the relevant info( name and creator) about the specified binary + * semaphore. + * + * @param[in] sem_id The object ID to operate on + * @param[out] bin_prop The property object buffer to fill + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore + * @retval #OS_INVALID_POINTER if the bin_prop pointer is null + */ +int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-bsp.h b/src/os/inc/osapi-bsp.h new file mode 100644 index 000000000..250fb30d2 --- /dev/null +++ b/src/os/inc/osapi-bsp.h @@ -0,0 +1,94 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-bsp.h + */ + +#ifndef OSAPI_BSP_H +#define OSAPI_BSP_H + +#include "osconfig.h" +#include "common_types.h" + + +/**************************************************************************************** + BSP LOW-LEVEL IMPLEMENTATION FUNCTIONS + ****************************************************************************************/ + +/** @defgroup OSAPIBsp OSAL BSP low level access APIs + * + * These are for OSAL internal BSP information access to pass any BSP-specific + * boot/command line/startup arguments through to the application, and return a + * status code back to the OS after exit. + * + * Not intended for user application use + * @{ + */ + +/*---------------------------------------------------------------- + Function: OS_BSP_GetArgC + + Purpose: Obtain the number of boot arguments passed from the bootloader + or shell if supported by the platform + + Returns: The number of boot arguments, or 0 if no arguments were passed + or not supported by the BSP. + ------------------------------------------------------------------*/ +uint32 OS_BSP_GetArgC(void); + +/*---------------------------------------------------------------- + Function: OS_BSP_GetArgV + + Purpose: Obtain an array of boot argument strings passed from the bootloader + or shell if supported by the platform + + Returns: Pointer to char* array containing the argument strings, or NULL if + no arguments are available or not supported by the BSP. + + The array is sized according to OS_BSP_GetArgC() + ------------------------------------------------------------------*/ +char *const *OS_BSP_GetArgV(void); + +/*---------------------------------------------------------------- + Function: OS_BSP_SetExitCode + + Purpose: Sets the status to be returned to the shell or bootloader + if supported by the platform. The value is an integer with + platform and application-defined meaning, but BSP's should + attempt to provide consistent meaning for the following values + + OS_SUCCESS: normal status (default) + OS_ERROR: any abnormal status + + Other more specific status values may be passed, with + implementation-defined behavior. Depending on the system + capabilities, the BSP implementation may either pass the + value through as-is, translate it to defined value, or + ignore it. + + Note this does NOT cause the application to exit, it only + sets the state that will be returned if/when the application + exits itself at a future time. + + ------------------------------------------------------------------*/ +void OS_BSP_SetExitCode(int32 code); + +#endif diff --git a/src/os/inc/osapi-clock.h b/src/os/inc/osapi-clock.h new file mode 100644 index 000000000..f664d3582 --- /dev/null +++ b/src/os/inc/osapi-clock.h @@ -0,0 +1,72 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-clock.h + */ + +#ifndef OSAPI_CLOCK_H +#define OSAPI_CLOCK_H + +#include "osconfig.h" +#include "common_types.h" + +/** @brief OSAL time */ +typedef struct +{ + uint32 seconds; + uint32 microsecs; +} OS_time_t; + + +/** @defgroup OSAPIClock OSAL Real Time Clock APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get the local time + * + * This function gets the local time from the underlying OS. + * + * @note Mission time management typically uses the cFE Time Service + * + * @param[out] time_struct An OS_time_t that will be set to the current time + * + * @return Get local time status, see @ref OSReturnCodes + */ +int32 OS_GetLocalTime(OS_time_t *time_struct); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Set the local time + * + * This function sets the local time on the underlying OS. + * + * @note Mission time management typically uses the cFE Time Services + * + * @param[in] time_struct An OS_time_t containing the current time + * + * @return Set local time status, see @ref OSReturnCodes + */ +int32 OS_SetLocalTime(OS_time_t *time_struct); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-common.h b/src/os/inc/osapi-common.h new file mode 100644 index 000000000..5a2c66db7 --- /dev/null +++ b/src/os/inc/osapi-common.h @@ -0,0 +1,215 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-common.h + */ + +#ifndef OSAPI_COMMON_H +#define OSAPI_COMMON_H + +#include "osconfig.h" +#include "common_types.h" + + +/** + * @brief A set of events that can be used with BSP event callback routines + */ +typedef enum +{ + OS_EVENT_RESERVED = 0, /**< no-op/reserved event id value */ + + /** + * resource/id has been newly allocated but not yet created. + * + * This event is invoked from WITHIN the locked region, in + * the context of the task which is allocating the resource. + * + * If the handler returns non-success, the error will be returned + * to the caller and the creation process is aborted. + */ + OS_EVENT_RESOURCE_ALLOCATED, + + /** + * resource/id has been fully created/finalized. + * + * Invoked outside locked region, in the context + * of the task which created the resource. + * + * Data object is not used, passed as NULL. + * + * Return value is ignored - this is for information purposes only. + */ + OS_EVENT_RESOURCE_CREATED, + + /** + * resource/id has been deleted. + * + * Invoked outside locked region, in the context + * of the task which deleted the resource. + * + * Data object is not used, passed as NULL. + * + * Return value is ignored - this is for information purposes only. + */ + OS_EVENT_RESOURCE_DELETED, + + /** + * New task is starting. + * + * Invoked outside locked region, in the context + * of the task which is currently starting, before + * the entry point is called. + * + * Data object is not used, passed as NULL. + * + * If the handler returns non-success, task startup is aborted + * and the entry point is not called. + */ + OS_EVENT_TASK_STARTUP, + + OS_EVENT_MAX /**< placeholder for end of enum, not used */ +} OS_Event_t; + +/** + * @brief A callback routine for event handling. + * + * @param[in] event The event that occurred + * @param[in] object_id The associated object_id, or 0 if not associated with an object + * @param[inout] data An abstract data/context object associated with the event, or NULL. + * @return status Execution status, see @ref OSReturnCodes. + */ +typedef int32 (*OS_EventHandler_t)(OS_Event_t event, osal_id_t object_id, void *data); + + +/** @defgroup OSAPICore OSAL Core Operation APIs + * + * These are for OSAL core operations for startup/initialization, running, and shutdown. + * Typically only used in bsps, unit tests, psps, etc. + * + * Not intended for user application use + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Application startup + * + * Startup abstraction such that the same BSP can be used for operations and testing. + */ +void OS_Application_Startup(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Application run + * + * Run abstraction such that the same BSP can be used for operations and testing. + */ +void OS_Application_Run(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Initialization of API + * + * This function returns initializes the internal data structures of the OS + * Abstraction Layer. It must be called in the application startup code before + * calling any other OS routines. + * + * @return Execution status, see @ref OSReturnCodes. Any error code (negative) + * means the OSAL can not be initialized. Typical platform specific response + * is to abort since additional OSAL calls will have undefined behavior. + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR @copybrief OS_ERROR + */ +int32 OS_API_Init(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Background thread implementation - waits forever for events to occur. + * + * This should be called from the BSP main routine or initial thread after all other + * board and application initialization has taken place and all other tasks are running. + * + * Typically just waits forever until "OS_shutdown" flag becomes true. + */ +void OS_IdleLoop(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief delete all resources created in OSAL. + * + * provides a means to clean up all resources allocated by this + * instance of OSAL. It would typically be used during an orderly + * shutdown but may also be helpful for testing purposes. + */ +void OS_DeleteAllObjects(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Initiate orderly shutdown + * + * Indicates that the OSAL application should perform an orderly shutdown + * of ALL tasks, clean up all resources, and exit the application. + * + * This allows the task currently blocked in OS_IdleLoop() to wake up, and + * for that function to return to its caller. + * + * This is preferred over e.g. OS_ApplicationExit() which exits immediately and + * does not provide for any means to clean up first. + * + * @param[in] flag set to true to initiate shutdown, false to cancel + */ +void OS_ApplicationShutdown(uint8 flag); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Exit/Abort the application + * + * Indicates that the OSAL application should exit and return control to the OS + * This is intended for e.g. scripted unit testing where the test needs to end + * without user intervention. + * + * This function does not return. Production code typically should not ever call this. + * + * @note This exits the entire process including tasks that have been created. + */ +void OS_ApplicationExit(int32 Status); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Callback routine registration + * + * This hook enables the application code to perform extra platform-specific + * operations on various system events such as resource creation/deletion. + * + * @note Some events are invoked while the resource is "locked" and therefore + * application-defined handlers for these events should not block or attempt + * to access other OSAL resources. + * + * @param[in] handler The application-provided event handler + * @return Execution status, see @ref OSReturnCodes. + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR @copybrief OS_ERROR + */ +int32 OS_RegisterEventHandler(OS_EventHandler_t handler); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-constants.h b/src/os/inc/osapi-constants.h new file mode 100644 index 000000000..0d10fdf46 --- /dev/null +++ b/src/os/inc/osapi-constants.h @@ -0,0 +1,58 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-constants.h + */ + +#ifndef OSAPI_CONSTANTS_H +#define OSAPI_CONSTANTS_H + +#include "osconfig.h" +#include "common_types.h" + +/* +** Defines for Queue Timeout parameters +*/ +#define OS_PEND (-1) +#define OS_CHECK (0) + + +/** + * @brief Initializer for the osal_id_t type which will not match any valid value + */ +#define OS_OBJECT_ID_UNDEFINED ((osal_id_t) {0}) + +/** + * @brief Constant that may be passed to OS_ForEachObject()/OS_ForEachObjectOfType() to match any + * creator (i.e. get all objects) + */ +#define OS_OBJECT_CREATOR_ANY OS_OBJECT_ID_UNDEFINED + +/** + * @brief Maximum length of a local/native path name string + * + * This is a concatenation of the OSAL virtual path with the system + * mount point or device name + */ +#define OS_MAX_LOCAL_PATH_LEN (OS_MAX_PATH_LEN + OS_FS_PHYS_NAME_LEN) + + +#endif diff --git a/src/os/inc/osapi-countsem.h b/src/os/inc/osapi-countsem.h new file mode 100644 index 000000000..b74cde754 --- /dev/null +++ b/src/os/inc/osapi-countsem.h @@ -0,0 +1,178 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-countsem.h + */ + +#ifndef OSAPI_COUNTSEM_H +#define OSAPI_COUNTSEM_H + +#include "osconfig.h" +#include "common_types.h" + +/** @brief OSAL counting semaphore properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; + int32 value; +} OS_count_sem_prop_t; + +/** @defgroup OSAPICountSem OSAL Counting Semaphore APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Creates a counting semaphore + * + * Creates a counting semaphore with initial value specified by + * sem_initial_value and name specified by sem_name. sem_id will be + * returned to the caller + * + * @param[out] sem_id will be set to the non-zero ID of the newly-created resource + * @param[in] sem_name the name of the new resource to create + * @param[in] sem_initial_value the initial value of the counting semaphore + * @param[in] options Reserved for future use, should be passed as 0. + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if sen name or sem_id are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NO_FREE_IDS if all of the semaphore ids are taken + * @retval #OS_ERR_NAME_TAKEN if this is already the name of a counting semaphore + * @retval #OS_SEM_FAILURE if the OS call failed + * @retval #OS_INVALID_SEM_VALUE if the semaphore value is too high + */ +int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initial_value, uint32 options); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Increment the semaphore value + * + * The function unlocks the semaphore referenced by sem_id by performing + * a semaphore unlock operation on that semaphore. If the semaphore value + * resulting from this operation is positive, then no threads were blocked + * waiting for the semaphore to become unlocked; the semaphore value is + * simply incremented for this semaphore. + * + * @param[in] sem_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not + * in the array of semaphores defined by the system + * @retval #OS_ERR_INVALID_ID if the id passed in is not a counting semaphore + */ +int32 OS_CountSemGive(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Decrement the semaphore value + * + * The locks the semaphore referenced by sem_id by performing a + * semaphore lock operation on that semaphore. If the semaphore value + * is currently zero, then the calling thread shall not return from + * the call until it either locks the semaphore or the call is + * interrupted. + * + * @param[in] sem_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID the Id passed in is not a valid counting semaphore + * @retval #OS_SEM_FAILURE if the OS call failed + */ +int32 OS_CountSemTake(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Decrement the semaphore value with timeout + * + * The function locks the semaphore referenced by sem_id. However, + * if the semaphore cannot be locked without waiting for another process + * or thread to unlock the semaphore, this wait shall be terminated when + * the specified timeout, msecs, expires. + * + * @param[in] sem_id The object ID to operate on + * @param[in] msecs The maximum amount of time to block, in milliseconds + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_SEM_TIMEOUT if semaphore was not relinquished in time + * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not + * in the array of semaphores defined by the system + * @retval #OS_ERR_INVALID_ID if the ID passed in is not a valid semaphore ID + */ +int32 OS_CountSemTimedWait(osal_id_t sem_id, uint32 msecs); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes the specified counting Semaphore. + * + * @param[in] sem_id The object ID to delete + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid counting semaphore + * @retval #OS_SEM_FAILURE the OS call failed + */ +int32 OS_CountSemDelete(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find an existing semaphore ID by name + * + * This function tries to find a counting sem Id given the name of a count_sem + * The id is returned through sem_id + * + * @param[out] sem_id will be set to the ID of the existing resource + * @param[in] sem_name the name of the existing resource to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER is semid or sem_name are NULL pointers + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + */ +int32 OS_CountSemGetIdByName(osal_id_t *sem_id, const char *sem_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Fill a property object buffer with details regarding the resource + * + * This function will pass back a pointer to structure that contains + * all of the relevant info( name and creator) about the specified counting + * semaphore. + * + * @param[in] sem_id The object ID to operate on + * @param[out] count_prop The property object buffer to fill + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore + * @retval #OS_INVALID_POINTER if the count_prop pointer is null + */ +int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-dir.h b/src/os/inc/osapi-dir.h new file mode 100644 index 000000000..a2c6f3e2f --- /dev/null +++ b/src/os/inc/osapi-dir.h @@ -0,0 +1,141 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-dir.h + */ + +#ifndef OSAPI_DIR_H +#define OSAPI_DIR_H + +#include "osconfig.h" +#include "common_types.h" + + + +/** @brief Directory entry */ +typedef struct +{ + char FileName[OS_MAX_FILE_NAME]; +} os_dirent_t; + +/** @brief Access filename part of the dirent structure */ +#define OS_DIRENTRY_NAME(x) ((x).FileName) + +/* + * Exported Functions + */ + +/** @defgroup OSAPIDir OSAL Directory APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Opens a directory + * + * Prepares for reading the files within a directory + * + * @param[out] dir_id The non-zero handle ID of the directory + * @param[in] path The directory to open + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Closes an open directory + * + * The directory referred to by dir_id will be closed + * + * @param[in] dir_id The handle ID of the directory + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_DirectoryClose(osal_id_t dir_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Rewinds an open directory + * + * Resets a directory read handle back to the first file. + * + * @param[in] dir_id The handle ID of the directory + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_DirectoryRewind(osal_id_t dir_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Reads the next name in the directory + * + * Obtains directory entry data for the next file from an open directory + * + * @param[in] dir_id The handle ID of the directory + * @param[out] dirent Buffer to store directory entry information + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Makes a new directory + * + * Makes a directory specified by path. + * + * @param[in] path The new directory name + * @param[in] access The permissions for the directory (reserved for future use) + * + * @note Current implementations do not utilize the "access" parameter. Applications + * should still pass the intended value (#OS_READ_WRITE or #OS_READ_ONLY) to be compatible + * with future implementations. + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if path is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if the path is too long to be stored locally + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_ERROR if the OS call fails + */ +int32 OS_mkdir(const char *path, uint32 access); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Removes a directory from the file system. + * + * Removes a directory from the structure. + * The directory must be empty prior to this operation. + * + * @param[in] path The directory to remove + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if path is NULL + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_FS_ERR_PATH_TOO_LONG + * @retval #OS_ERROR if the directory remove operation failed + */ +int32 OS_rmdir(const char *path); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-error.h b/src/os/inc/osapi-error.h new file mode 100644 index 000000000..39a2e65d5 --- /dev/null +++ b/src/os/inc/osapi-error.h @@ -0,0 +1,122 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-error.h + */ + +#ifndef OSAPI_ERROR_H +#define OSAPI_ERROR_H + +#include "common_types.h" + +/** @brief Error string name length + * + * The sizes of strings in OSAL functions are built with this limit in mind. + * Always check the uses of os_err_name_t when changing this value. + */ +#define OS_ERROR_NAME_LENGTH 35 + +/** + * @brief For the @ref OS_GetErrorName() function, to ensure + * everyone is making an array of the same length. + * + * Implementation note for developers: + * + * The sizes of strings in OSAL functions are built with this + * #OS_ERROR_NAME_LENGTH limit in mind. Always check the uses of os_err_name_t + * when changing this value. + */ +typedef char os_err_name_t[OS_ERROR_NAME_LENGTH]; + +/** @defgroup OSReturnCodes OSAL Return Code Defines + * + * @{ + */ +#define OS_SUCCESS (0) /**< @brief Successful execution */ +#define OS_ERROR (-1) /**< @brief Failed execution */ +#define OS_INVALID_POINTER (-2) /**< @brief Invalid pointer */ +#define OS_ERROR_ADDRESS_MISALIGNED (-3) /**< @brief Address misalignment */ +#define OS_ERROR_TIMEOUT (-4) /**< @brief Error timeout */ +#define OS_INVALID_INT_NUM (-5) /**< @brief Invalid Interrupt number */ +#define OS_SEM_FAILURE (-6) /**< @brief Semaphore failure */ +#define OS_SEM_TIMEOUT (-7) /**< @brief Semaphore timeout */ +#define OS_QUEUE_EMPTY (-8) /**< @brief Queue empty */ +#define OS_QUEUE_FULL (-9) /**< @brief Queue full */ +#define OS_QUEUE_TIMEOUT (-10) /**< @brief Queue timeout */ +#define OS_QUEUE_INVALID_SIZE (-11) /**< @brief Queue invalid size */ +#define OS_QUEUE_ID_ERROR (-12) /**< @brief Queue ID error */ +#define OS_ERR_NAME_TOO_LONG (-13) /**< @brief name length including null terminator greater than #OS_MAX_API_NAME */ +#define OS_ERR_NO_FREE_IDS (-14) /**< @brief No free IDs */ +#define OS_ERR_NAME_TAKEN (-15) /**< @brief Name taken */ +#define OS_ERR_INVALID_ID (-16) /**< @brief Invalid ID */ +#define OS_ERR_NAME_NOT_FOUND (-17) /**< @brief Name not found */ +#define OS_ERR_SEM_NOT_FULL (-18) /**< @brief Semaphore not full */ +#define OS_ERR_INVALID_PRIORITY (-19) /**< @brief Invalid priority */ +#define OS_INVALID_SEM_VALUE (-20) /**< @brief Invalid semaphore value */ +#define OS_ERR_FILE (-27) /**< @brief File error */ +#define OS_ERR_NOT_IMPLEMENTED (-28) /**< @brief Not implemented */ +#define OS_TIMER_ERR_INVALID_ARGS (-29) /**< @brief Timer invalid arguments */ +#define OS_TIMER_ERR_TIMER_ID (-30) /**< @brief Timer ID error */ +#define OS_TIMER_ERR_UNAVAILABLE (-31) /**< @brief Timer unavailable */ +#define OS_TIMER_ERR_INTERNAL (-32) /**< @brief Timer internal error */ +#define OS_ERR_OBJECT_IN_USE (-33) /**< @brief Object in use */ +#define OS_ERR_BAD_ADDRESS (-34) /**< @brief Bad address */ +#define OS_ERR_INCORRECT_OBJ_STATE (-35) /**< @brief Incorrect object state */ +#define OS_ERR_INCORRECT_OBJ_TYPE (-36) /**< @brief Incorrect object type */ +#define OS_ERR_STREAM_DISCONNECTED (-37) /**< @brief Stream disconnected */ +#define OS_ERR_OPERATION_NOT_SUPPORTED (-38) /**< @brief Requested operation is not support on the supplied object(s) \ + */ +/* +** Defines for File System Calls +*/ +/* + * NOTE - these values used to overlap with the + * other OSAPI error codes. They now start at -100 + * to avoid this overlap. + */ +#define OS_FS_ERR_PATH_TOO_LONG (-103) /**< @brief FS path too long */ +#define OS_FS_ERR_NAME_TOO_LONG (-104) /**< @brief FS name too long */ +#define OS_FS_ERR_DRIVE_NOT_CREATED (-106) /**< @brief FS drive not created */ +#define OS_FS_ERR_DEVICE_NOT_FREE (-107) /**< @brief FS device not free */ +#define OS_FS_ERR_PATH_INVALID (-108) /**< @brief FS path invalid */ + + +/**@}*/ + + +/** @defgroup OSAPIError OSAL Error Info APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Convert an error number to a string + * + * @param[in] error_num Error number to convert + * @param[out] err_name Buffer to store error string + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name); +/**@}*/ + + +#endif diff --git a/src/os/inc/osapi-file.h b/src/os/inc/osapi-file.h new file mode 100644 index 000000000..fea9f7519 --- /dev/null +++ b/src/os/inc/osapi-file.h @@ -0,0 +1,523 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-file.h + */ + +#ifndef OSAPI_FILE_H +#define OSAPI_FILE_H + +#include "osconfig.h" +#include "common_types.h" + + +/** @defgroup OSFileAccess OSAL File Access Option Defines + * @{ + */ +#define OS_READ_ONLY 0 /**< Read only file access */ +#define OS_WRITE_ONLY 1 /**< Write only file access */ +#define OS_READ_WRITE 2 /**< Read write file access */ +/**@}*/ + +/** @defgroup OSFileOffset OSAL Reference Point For Seek Offset Defines + * @{ + */ +#define OS_SEEK_SET 0 /**< Seek offset set */ +#define OS_SEEK_CUR 1 /**< Seek offset current */ +#define OS_SEEK_END 2 /**< Seek offset end */ +/**@}*/ + +/** @brief OSAL file properties */ +typedef struct +{ + char Path[OS_MAX_PATH_LEN]; + osal_id_t User; + uint8 IsValid; /* For backward compatibility -- always true if OS_FDGetInfo returned true */ +} OS_file_prop_t; + +/** + * @brief File system status + * + * @note This used to be directly typedef'ed to the "struct stat" from the C library + * + * Some C libraries (glibc in particular) actually define member names to reference into + * sub-structures, so attempting to reuse a name like "st_mtime" might not work. + */ +typedef struct +{ + uint32 FileModeBits; + int32 FileTime; + size_t FileSize; +} os_fstat_t; + +/** + * @brief File stat mode bits + * + * We must also define replacements for the stat structure's mode bits. + * This is currently just a small subset since the OSAL just presents a very + * simplified view of the filesystem to the upper layers. And since not all + * OS'es are POSIX, the more POSIX-specific bits are not relevant anyway. + */ +enum +{ + OS_FILESTAT_MODE_EXEC = 0x00001, + OS_FILESTAT_MODE_WRITE = 0x00002, + OS_FILESTAT_MODE_READ = 0x00004, + OS_FILESTAT_MODE_DIR = 0x10000 +}; + +/** @brief Access file stat mode bits */ +#define OS_FILESTAT_MODE(x) ((x).FileModeBits) +/** @brief File stat is directory logical */ +#define OS_FILESTAT_ISDIR(x) ((x).FileModeBits & OS_FILESTAT_MODE_DIR) +/** @brief File stat is executable logical */ +#define OS_FILESTAT_EXEC(x) ((x).FileModeBits & OS_FILESTAT_MODE_EXEC) +/** @brief File stat is write enabled logical */ +#define OS_FILESTAT_WRITE(x) ((x).FileModeBits & OS_FILESTAT_MODE_WRITE) +/** @brief File stat is read enabled logical */ +#define OS_FILESTAT_READ(x) ((x).FileModeBits & OS_FILESTAT_MODE_READ) +/** @brief Access file stat size field */ +#define OS_FILESTAT_SIZE(x) ((x).FileSize) +/** @brief Access file stat time field */ +#define OS_FILESTAT_TIME(x) ((x).FileTime) + +/** + * @brief Flags that can be used with opening of a file (bitmask) + */ +typedef enum +{ + OS_FILE_FLAG_NONE = 0x00, + OS_FILE_FLAG_CREATE = 0x01, + OS_FILE_FLAG_TRUNCATE = 0x02, +} OS_file_flag_t; + +/* + * Exported Functions + */ + +/** @defgroup OSAPIFile OSAL Standard File APIs + * @{ + */ + +#ifndef OSAL_OMIT_DEPRECATED + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Creates a file specified by path + * + * Creates a file specified by const char *path, with read/write + * permissions by access. The file is also automatically opened by the + * create call. + * + * @param[in] path File name to create + * @param[in] access Intended access mode - see @ref OSFileAccess + * + * @note Valid handle IDs are never negative. Failure of this + * call can be checked by testing if the result is less than 0. + * + * @return A file handle ID or appropriate error code, see @ref OSReturnCodes + * @retval #OS_INVALID_POINTER if path is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if path exceeds the maximum number of chars + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file is too long + * @retval #OS_ERROR if permissions are unknown or OS call fails + * @retval #OS_ERR_NO_FREE_IDS if there are no free file descriptors left + * + * @deprecated Replaced by OS_OpenCreate() with flags set to + * OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE. + */ +int32 OS_creat(const char *path, int32 access); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Opens a file + * + * Opens a file. + * + * @param[in] path File name to create + * @param[in] access Intended access mode - see @ref OSFileAccess + * @param[in] mode The file permissions. This parameter is passed through to the + * native open call, but will be ignored. The file mode (or permissions) + * are ignored by the POSIX open call when the O_CREAT access flag is not passed in. + * + * @note Valid handle IDs are never negative. Failure of this + * call can be checked by testing if the result is less than 0. + * + * @return A file handle ID or appropriate error code, see @ref OSReturnCodes + * @retval #OS_INVALID_POINTER if path is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if path exceeds the maximum number of chars + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file is too long + * @retval #OS_ERROR if permissions are unknown or OS call fails + * @retval #OS_ERR_NO_FREE_IDS if there are no free file descriptors left + * + * @deprecated Replaced by OS_OpenCreate() with flags set to + * OS_FILE_FLAG_NONE. + */ +int32 OS_open(const char *path, int32 access, uint32 mode); + +#endif + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Open or create a file + * + * Implements the same as OS_open/OS_creat but follows the OSAL paradigm + * of outputting the ID/descriptor separately from the return value, rather + * than relying on the user to convert it back. + * + * @param[out] filedes The handle ID + * @param[in] path File name to create or open + * @param[in] flags The file permissions - see @ref OS_file_flag_t + * @param[in] access Intended access mode - see @ref OSFileAccess + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the command was not executed properly + */ +int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 access); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Closes an open file handle + * + * This closes regular file handles and any other file-like resource, such as + * network streams or pipes. + * + * @param[in] filedes The handle ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if file descriptor could not be closed + * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid + */ +int32 OS_close(osal_id_t filedes); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Read from a file handle + * + * Reads up to nbytes from a file, and puts them into buffer. + * + * @param[in] filedes The handle ID to operate on + * @param[out] buffer Storage location for file data + * @param[in] nbytes Maximum number of bytes to read + * + * @note All OSAL error codes are negative int32 values. Failure of this + * call can be checked by testing if the result is less than 0. + * + * @return A non-negative byte count or appropriate error code, see @ref OSReturnCodes + * @retval #OS_INVALID_POINTER if buffer is a null pointer + * @retval #OS_ERROR if OS call failed + * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid + */ +int32 OS_read(osal_id_t filedes, void *buffer, size_t nbytes); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Write to a file handle + * + * Writes to a file. copies up to a maximum of nbytes of buffer to the file + * described in filedes + * + * @param[in] filedes The handle ID to operate on + * @param[in] buffer Source location for file data + * @param[in] nbytes Maximum number of bytes to read + * + * @note All OSAL error codes are negative int32 values. Failure of this + * call can be checked by testing if the result is less than 0. + * + * @return A non-negative byte count or appropriate error code, see @ref OSReturnCodes + * @retval #OS_INVALID_POINTER if buffer is NULL + * @retval #OS_ERROR if OS call failed + * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid + */ +int32 OS_write(osal_id_t filedes, const void *buffer, size_t nbytes); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief File/Stream input read with a timeout + * + * This implements a time-limited read and is primarily intended for use with + * sockets but may also work with any other stream-like resource that the underlying + * OS supports. + * + * If data is immediately available on the file/socket, this will return that data + * along with the actual number of bytes that were immediately available. It will + * not block. + * + * If no data is immediately available, this will wait up to the given timeout for + * data to appear. If no data appears within the timeout period, then this returns + * an error code (not zero). + * + * In all cases this will return successfully as soon as at least 1 byte of actual + * data is available. It will not attempt to read the entire input buffer. + * + * If an EOF condition occurs prior to timeout, this function returns zero. + * + * @param[in] filedes The handle ID to operate on + * @param[in] buffer Source location for file data + * @param[in] nbytes Maximum number of bytes to read + * @param[in] timeout Maximum time to wait, in milliseconds (OS_PEND = forever) + * + * @return Byte count on success, zero for timeout, or appropriate error code, + * see @ref OSReturnCodes + */ +int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief File/Stream output write with a timeout + * + * This implements a time-limited write and is primarily intended for use with + * sockets but may also work with any other stream-like resource that the underlying + * OS supports. + * + * If output buffer space is immediately available on the file/socket, this will + * place data into the buffer and return the actual number of bytes that were + * queued for output. It will not block. + * + * If no output buffer space is immediately available, this will wait up to the + * given timeout for space to become available. If no space becomes available within + * the timeout period, then this returns an error code (not zero). + * + * In all cases this will return successfully as soon as at least 1 byte of actual + * data is output. It will _not_ attempt to write the entire output buffer. + * + * If an EOF condition occurs prior to timeout, this function returns zero. + * + * @param[in] filedes The handle ID to operate on + * @param[in] buffer Source location for file data + * @param[in] nbytes Maximum number of bytes to read + * @param[in] timeout Maximum time to wait, in milliseconds (OS_PEND = forever) + * + * @return Byte count on success, zero for timeout, or appropriate error code, + * see @ref OSReturnCodes + */ +int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Changes the permissions of a file + * + * @param[in] path File to change + * @param[in] access Desired access mode - see @ref OSFileAccess + * + * @note Some file systems do not implement permissions + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_chmod(const char *path, uint32 access); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain information about a file or directory + * + * Returns information about a file or directory in a os_fstat_t structure + * + * @param[in] path The file to operate on + * @param[out] filestats Buffer to store file information + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if path or filestats is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if the path is too long to be stored locally + * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file is too long to be stored + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_ERROR if the OS call failed + */ +int32 OS_stat(const char *path, os_fstat_t *filestats); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Seeks to the specified position of an open file + * + * Sets the read/write pointer to a specific offset in a specific file. + * + * @param[in] filedes The handle ID to operate on + * @param[in] offset The file offset to seek to + * @param[in] whence The reference point for offset, see @ref OSFileOffset + * + * @return Byte offset from the beginning of the file or appropriate error code, + see @ref OSReturnCodes + * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid + * @retval #OS_ERROR if OS call failed + */ +int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Removes a file from the file system + * + * Removes a given filename from the drive + * + * @note The behvior of this API on an open file is not defined at the OSAL level + * due to dependencies on the underlying OS which may or may not allow the related + * operation based on a varienty of potential configurations. For portability, + * it is recommended that applications ensure the file is closed prior to removal. + * + * @param[in] path The file to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if there is no device or the driver returns error + * @retval #OS_INVALID_POINTER if path is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if path is too long to be stored locally + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file to remove is too long + */ +int32 OS_remove(const char *path); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Renames a file + * + * Changes the name of a file, where the source and destination + * reside on the same file system. + * + * @note The behvior of this API on an open file is not defined at the OSAL level + * due to dependencies on the underlying OS which may or may not allow the related + * operation based on a varienty of potential configurations. For portability, + * it is recommended that applications ensure the file is closed prior to removal. + * + * @param[in] old_filename The original filename + * @param[in] new_filename The desired filename + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the file could not be opened or renamed. + * @retval #OS_INVALID_POINTER if old or new are NULL + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_FS_ERR_PATH_TOO_LONG if the paths given are too long to be stored locally + * @retval #OS_FS_ERR_NAME_TOO_LONG if the new name is too long to be stored locally + */ +int32 OS_rename(const char *old_filename, const char *new_filename); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Copies a single file from src to dest + * + * @note The behvior of this API on an open file is not defined at the OSAL level + * due to dependencies on the underlying OS which may or may not allow the related + * operation based on a varienty of potential configurations. For portability, + * it is recommended that applications ensure the file is closed prior to removal. + * + * @param[in] src The source file to operate on + * @param[in] dest The destination file + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the file could not be accessed + * @retval #OS_INVALID_POINTER if src or dest are NULL + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_FS_ERR_PATH_TOO_LONG if the paths given are too long to be stored locally + * @retval #OS_FS_ERR_NAME_TOO_LONG if the dest name is too long to be stored locally + */ +int32 OS_cp(const char *src, const char *dest); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Move a single file from src to dest + * + * This first attempts to rename the file, which is faster if + * the source and destination reside on the same file system. + * + * If this fails, it falls back to copying the file and removing + * the original. + * + * @note The behvior of this API on an open file is not defined at the OSAL level + * due to dependencies on the underlying OS which may or may not allow the related + * operation based on a varienty of potential configurations. For portability, + * it is recommended that applications ensure the file is closed prior to removal. + * + * @param[in] src The source file to operate on + * @param[in] dest The destination file + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the file could not be renamed. + * @retval #OS_INVALID_POINTER if src or dest are NULL + * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed + * @retval #OS_FS_ERR_PATH_TOO_LONG if the paths given are too long to be stored locally + * @retval #OS_FS_ERR_NAME_TOO_LONG if the dest name is too long to be stored locally + */ +int32 OS_mv(const char *src, const char *dest); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain information about an open file + * + * Copies the information of the given file descriptor into a structure passed in + * + * @param[in] filedes The handle ID to operate on + * @param[out] fd_prop Storage buffer for file information + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid + */ +int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Checks to see if a file is open + * + * This function takes a filename and determines if the file is open. The function + * will return success if the file is open. + * + * @param[in] Filename The file to operate on + * + * @return OS_SUCCESS if the file is open, or appropriate error code + * @retval #OS_ERROR if the file is not open + */ +int32 OS_FileOpenCheck(const char *Filename); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Close all open files + * + * Closes All open files that were opened through the OSAL + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if one or more file close returned an error + */ +int32 OS_CloseAllFiles(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Close a file by filename + * + * Allows a file to be closed by name. + * This will only work if the name passed in is the same name used to open + * the file. + * + * @param[in] Filename The file to close + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_FS_ERR_PATH_INVALID if the file is not found + * @retval #OS_ERROR if the file close returned an error + */ +int32 OS_CloseFileByName(const char *Filename); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-filesys.h b/src/os/inc/osapi-filesys.h new file mode 100644 index 000000000..8b3d6797c --- /dev/null +++ b/src/os/inc/osapi-filesys.h @@ -0,0 +1,272 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-filesys.h + */ + +#ifndef OSAPI_FILESYS_H +#define OSAPI_FILESYS_H + +#include "osconfig.h" +#include "common_types.h" + +#define OS_CHK_ONLY 0 /**< Unused, API takes bool */ +#define OS_REPAIR 1 /**< Unused, API takes bool */ + + +/** @brief OSAL file system info */ +typedef struct +{ + uint32 MaxFds; /**< @brief Total number of file descriptors */ + uint32 FreeFds; /**< @brief Total number that are free */ + uint32 MaxVolumes; /**< @brief Maximum number of volumes */ + uint32 FreeVolumes; /**< @brief Total number of volumes free */ +} os_fsinfo_t; + +/* + * Exported Functions + */ + +/** @defgroup OSAPIFileSys OSAL File System Level APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Create a fixed mapping between an existing directory and a virtual OSAL mount point. + * + * This mimics the behavior of a "FS_BASED" entry in the VolumeTable but is registered + * at runtime. It is intended to be called by the PSP/BSP prior to starting the application. + * + * @param[out] filesys_id A non-zero OSAL ID reflecting the file system + * @param[in] phys_path The native system directory (an existing mount point) + * @param[in] virt_path The virtual mount point of this filesystem + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const char *virt_path); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Makes a file system on the target + * + * Makes a file system on the target. Highly dependent on underlying OS and + * dependent on OS volume table definition. + * + * @note The "volname" parameter of RAM disks should always begin with the string "RAM", + * e.g. "RAMDISK" or "RAM0","RAM1", etc if multiple devices are created. The underlying + * implementation uses this to select the correct filesystem type/format, and this may + * also be used to differentiate between RAM disks and real physical disks. + * + * @param[in] address The address at which to start the new disk. If address == 0 + * space will be allocated by the OS. + * @param[in] devname The underlying kernel device to use, if applicable. + * @param[in] volname The name of the volume (see note) + * @param[in] blocksize The size of a single block on the drive + * @param[in] numblocks The number of blocks to allocate for the drive + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_INVALID_POINTER if devname is NULL + * @retval #OS_FS_ERR_DRIVE_NOT_CREATED if the OS calls to create the the drive failed + * @retval #OS_FS_ERR_DEVICE_NOT_FREE if the volume table is full + * @retval #OS_SUCCESS on creating the disk + */ +int32 OS_mkfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks); +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Mounts a file system + * + * Mounts a file system / block device at the given mount point. + * + * @param[in] devname The name of the drive to mount. devname is the same from #OS_mkfs + * @param[in] mountpoint The name to call this disk from now on + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_mount(const char *devname, const char *mountpoint); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Initializes an existing file system + * + * Initializes a file system on the target. + * + * @note The "volname" parameter of RAM disks should always begin with the string "RAM", + * e.g. "RAMDISK" or "RAM0","RAM1", etc if multiple devices are created. The underlying + * implementation uses this to select the correct filesystem type/format, and this may + * also be used to differentiate between RAM disks and real physical disks. + * + * @param[in] address The address at which to start the new disk. If address == 0, + * then space will be allocated by the OS + * @param[in] devname The underlying kernel device to use, if applicable. + * @param[in] volname The name of the volume (see note) + * @param[in] blocksize The size of a single block on the drive + * @param[in] numblocks The number of blocks to allocate for the drive + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if devname or volname are NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long + * @retval #OS_FS_ERR_DEVICE_NOT_FREE if the volume table is full + * @retval #OS_FS_ERR_DRIVE_NOT_CREATED on error + */ +int32 OS_initfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Removes a file system + * + * This function will remove or un-map the target file system. Note that this is not + * the same as un-mounting the file system. + * + * @param[in] devname The name of the "generic" drive + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if devname is NULL + * @retval #OS_ERROR is the drive specified cannot be located + */ +int32 OS_rmfs(const char *devname); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Unmounts a mounted file system + * + * This function will unmount a drive from the file system and make all open file + * descriptors useless. + * + * @note Any open file descriptors referencing this file system should + * be closed prior to unmounting a drive + * + * @param[in] mountpoint The mount point to remove from #OS_mount + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if name is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if the absolute path given is too long + * @retval #OS_ERROR if the OS calls failed + */ +int32 OS_unmount(const char *mountpoint); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain number of blocks free + * + * Returns the number of free blocks in a volume + * + * @param[in] name The device/path to operate on + * + * @return Block count or appropriate error code, see @ref OSReturnCodes + * @retval #OS_INVALID_POINTER if name is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long + * @retval #OS_ERROR if the OS call failed + */ +int32 OS_fsBlocksFree(const char *name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtains the number of free bytes in a volume + * + * Returns the number of free bytes in a volume + * + * @note uses a 64 bit data type to support filesystems that + * are greater than 4 Gigabytes + * + * @param[in] name The device/path to operate on + * @param[out] bytes_free The number of free bytes + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if name is NULL + * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long + * @retval #OS_ERROR if the OS call failed + */ +int32 OS_fsBytesFree(const char *name, uint64 *bytes_free); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Checks the health of a file system and repairs it if necessary + * + * Checks the drives for inconsistencies and optionally also repairs it + * + * @note not all operating systems implement this function + * + * @param[in] name The device/path to operate on + * @param[in] repair Whether to also repair inconsistencies + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER Name is NULL + * @retval #OS_ERR_NOT_IMPLEMENTED @copybrief OS_ERR_NOT_IMPLEMENTED + * @retval #OS_ERROR @copybrief OS_ERROR + */ +int32 OS_chkfs(const char *name, bool repair); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtains the physical drive name associated with a mount point + * + * Returns the name of the physical volume associated with the drive, + * when given the OSAL mount point of the drive + * + * @param[out] PhysDriveName Buffer to store physical drive name + * @param[in] MountPoint OSAL mount point + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if either parameter is NULL + * @retval #OS_ERROR if the mountpoint could not be found + */ +int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Translates a OSAL Virtual file system path to a host Local path + * + * Translates a virtual path to an actual system path name + * + * @param[in] VirtualPath OSAL virtual path name + * @param[out] LocalPath Buffer to store native/translated path name + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if either parameter is NULL + */ +int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Returns information about the file system + * + * Returns information about the file system in an os_fsinfo_t. + * This includes the number of open files and file systems + * + * @param[out] filesys_info Buffer to store filesystem information + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if filesys_info is NULL + */ +int32 OS_GetFsInfo(os_fsinfo_t *filesys_info); +/**@}*/ + + +#endif diff --git a/src/os/inc/osapi-heap.h b/src/os/inc/osapi-heap.h new file mode 100644 index 000000000..5bdd32973 --- /dev/null +++ b/src/os/inc/osapi-heap.h @@ -0,0 +1,58 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-heap.h + */ + +#ifndef OSAPI_HEAP_H +#define OSAPI_HEAP_H + +#include "osconfig.h" +#include "common_types.h" + +/** + * @brief OSAL heap properties + * + * @sa OS_HeapGetInfo() + */ +typedef struct +{ + size_t free_bytes; + osal_blockcount_t free_blocks; + size_t largest_free_block; +} OS_heap_prop_t; + +/** @defgroup OSAPIHeap OSAL Heap APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Return current info on the heap + * + * @param[out] heap_prop Storage buffer for heap info + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_HeapGetInfo(OS_heap_prop_t *heap_prop); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-idmap.h b/src/os/inc/osapi-idmap.h new file mode 100644 index 000000000..4458848dc --- /dev/null +++ b/src/os/inc/osapi-idmap.h @@ -0,0 +1,273 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-idmap.h + */ + +#ifndef OSAPI_IDMAP_H +#define OSAPI_IDMAP_H + +#include "osconfig.h" +#include "common_types.h" + +/* Defines constants for making object ID's unique */ +#define OS_OBJECT_INDEX_MASK 0xFFFF /**< @brief Object index mask */ +#define OS_OBJECT_TYPE_SHIFT 16 /**< @brief Object type shift */ + +/** @defgroup OSObjectTypes OSAL Object Type Defines + * @{ + */ +#define OS_OBJECT_TYPE_UNDEFINED 0x00 /**< @brief Object type undefined */ +#define OS_OBJECT_TYPE_OS_TASK 0x01 /**< @brief Object task type */ +#define OS_OBJECT_TYPE_OS_QUEUE 0x02 /**< @brief Object queue type */ +#define OS_OBJECT_TYPE_OS_COUNTSEM 0x03 /**< @brief Object counting semaphore type */ +#define OS_OBJECT_TYPE_OS_BINSEM 0x04 /**< @brief Object binary semaphore type */ +#define OS_OBJECT_TYPE_OS_MUTEX 0x05 /**< @brief Object mutex type */ +#define OS_OBJECT_TYPE_OS_STREAM 0x06 /**< @brief Object stream type */ +#define OS_OBJECT_TYPE_OS_DIR 0x07 /**< @brief Object directory type */ +#define OS_OBJECT_TYPE_OS_TIMEBASE 0x08 /**< @brief Object timebase type */ +#define OS_OBJECT_TYPE_OS_TIMECB 0x09 /**< @brief Object timer callback type */ +#define OS_OBJECT_TYPE_OS_MODULE 0x0A /**< @brief Object module type */ +#define OS_OBJECT_TYPE_OS_FILESYS 0x0B /**< @brief Object file system type */ +#define OS_OBJECT_TYPE_OS_CONSOLE 0x0C /**< @brief Object console type */ +#define OS_OBJECT_TYPE_USER 0x10 /**< @brief Object user type */ +/**@}*/ + +/** @defgroup OSAPICore OSAL Core Operation APIs + * + * These are for OSAL core operations for startup/initialization, running, and shutdown. + * Typically only used in bsps, unit tests, psps, etc. + * + * Not intended for user application use + * @{ + */ + +/** @defgroup OSAPIObjUtil OSAL Object ID Utility APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain an integer value corresponding to an object ID + * + * Obtains an integer representation of an object id, generally + * for the purpose of printing to the console or system logs. + * + * The returned value is of the type "unsigned long" for direct use with + * printf-style functions. It is recommended to use the "%lx" conversion + * specifier as the hexidecimal encoding clearly delineates the internal fields. + * + * @note This provides the raw integer value and is _not_ suitable for use + * as an array index, as the result is not zero-based. See the + * OS_ConvertToArrayIndex() to obtain a zero-based index value. + * + * @param[in] object_id The object ID + * @returns integer value representation of object ID + * + * @hidecallgraph + * @hidecallergraph + */ +static inline unsigned long OS_ObjectIdToInteger(osal_id_t object_id) +{ + return object_id; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain an osal ID corresponding to an integer value + * + * Provides the inverse of OS_ObjectIdToInteger(). Reconstitutes the original + * osal_id_t type from an integer representation. + * + * @param[in] value The integer representation of an OSAL ID + * @returns The ID value converted to an osal_id_t + * + * @hidecallgraph + * @hidecallergraph + */ +static inline osal_id_t OS_ObjectIdFromInteger(unsigned long value) +{ + return (osal_id_t)value; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Check two OSAL object ID values for equality + * + * The OSAL ID values should be treated as abstract values by applications, and not + * directly manipulated using standard C operators. + * + * This checks two values for equality, replacing the "==" operator. + * + * @param[in] object_id1 The first object ID + * @param[in] object_id2 The second object ID + * @returns true if the object IDs are equal + * + * @hidecallgraph + * @hidecallergraph + */ +static inline bool OS_ObjectIdEqual(osal_id_t object_id1, osal_id_t object_id2) +{ + return (object_id1 == object_id2); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Check if an object ID is defined. + * + * The OSAL ID values should be treated as abstract values by applications, and not + * directly manipulated using standard C operators. + * + * This returns false if the ID is NOT a defined resource (i.e. free/empty/invalid). + * + * @note OS_ObjectIdDefined(OS_OBJECT_ID_UNDEFINED) is always guaranteed to be false. + * + * @param[in] object_id The first object ID + * + * @hidecallgraph + * @hidecallergraph + */ +static inline bool OS_ObjectIdDefined(osal_id_t object_id) +{ + return (object_id != 0); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain the name of an object given an arbitrary object ID + * + * All OSAL resources generally have a name associated with them. This + * allows application code to retrieve the name of any valid OSAL object ID. + * + * @param[in] object_id The object ID to operate on + * @param[out] buffer Buffer in which to store the name + * @param[in] buffer_size Size of the output storage buffer + * + * @returns #OS_SUCCESS if successful + * #OS_ERR_INVALID_ID if the passed-in ID is not a valid OSAL ID + * #OS_INVALID_POINTER if the passed-in buffer is invalid + * #OS_ERR_NAME_TOO_LONG if the name will not fit in the buffer provided + */ +int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain the type of an object given an arbitrary object ID + * + * Given an arbitrary object ID, get the type of the object + * + * @param[in] object_id The object ID to operate on + * + * @return The object type portion of the object_id, see @ref OSObjectTypes for + * expected values + */ +osal_objtype_t OS_IdentifyObject(osal_id_t object_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Converts an abstract ID into a number suitable for use as an array index. + * + * This will return a unique zero-based integer number in the range of [0,MAX) for + * any valid object ID. This may be used by application code as an array index + * for indexing into local tables. + * + * @note This does NOT verify the validity of the ID, that is left to the caller. + * This is only the conversion logic. + * + * This routine accepts any object type, and returns a value based on the + * maximum number of objects for that type. This is equivalent to invoking + * OS_ObjectIdToArrayIndex() with the idtype set to OS_OBJECT_TYPE_UNDEFINED. + * + * @sa OS_ObjectIdToArrayIndex + * + * @param[in] object_id The object ID to operate on + * @param[out] *ArrayIndex The Index to return + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INCORRECT_OBJ_TYPE @copybrief OS_ERR_INCORRECT_OBJ_TYPE + */ +int32 OS_ConvertToArrayIndex(osal_id_t object_id, osal_index_t *ArrayIndex); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Converts an abstract ID into a number suitable for use as an array index. + * + * This will return a unique zero-based integer number in the range of [0,MAX) for + * any valid object ID. This may be used by application code as an array index + * for indexing into local tables. + * + * This routine operates on a specific object type, and returns a value based on the + * maximum number of objects for that type. + * + * If the idtype is passed as #OS_OBJECT_TYPE_UNDEFINED, then object type verification + * is skipped and any object ID will be accepted and converted to an index. In this + * mode, the range of the output depends on the actual passed-in object type. + * + * If the idtype is passed as any other value, the passed-in ID value is first + * confirmed to be the correct type. This check will guarantee that the output + * is within an expected range; for instance, if the type is passed as + * #OS_OBJECT_TYPE_OS_TASK, then the output index is guaranteed to be between 0 and + * #OS_MAX_TASKS-1 after successful conversion. + * + * @param[in] idtype The object type to convert + * @param[in] object_id The object ID to operate on + * @param[out] *ArrayIndex The Index to return + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INCORRECT_OBJ_TYPE @copybrief OS_ERR_INCORRECT_OBJ_TYPE + * */ +int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t object_id, osal_index_t *ArrayIndex); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief call the supplied callback function for all valid object IDs + * + * Loops through all defined OSAL objects of all types and calls callback_ptr on each one + * If creator_id is nonzero then only objects with matching creator id are processed. + * + * @param[in] creator_id Filter objects to those created by a specific task + * This may be passed as OS_OBJECT_CREATOR_ANY to return all objects + * @param[in] callback_ptr Function to invoke for each matching object ID + * @param[in] callback_arg Opaque Argument to pass to callback function + */ +void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief call the supplied callback function for valid object IDs of a specific type + * + * Loops through all defined OSAL objects of a specific type and calls callback_ptr on each one + * If creator_id is nonzero then only objects with matching creator id are processed. + * + * @param[in] objtype The type of objects to iterate + * @param[in] creator_id Filter objects to those created by a specific task + * This may be passed as OS_OBJECT_CREATOR_ANY to return all objects + * @param[in] callback_ptr Function to invoke for each matching object ID + * @param[in] callback_arg Opaque Argument to pass to callback function + */ +void OS_ForEachObjectOfType(osal_objtype_t objtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, + void *callback_arg); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-module.h b/src/os/inc/osapi-module.h new file mode 100644 index 000000000..c3196e677 --- /dev/null +++ b/src/os/inc/osapi-module.h @@ -0,0 +1,235 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-module.h + */ + +#ifndef OSAPI_MODULE_H +#define OSAPI_MODULE_H + + +#include "osconfig.h" +#include "common_types.h" + +/* +** Defines +*/ + +/** + * @brief Requests OS_ModuleLoad() to add the symbols to the global symbol table + * + * When supplied as the "flags" argument to OS_ModuleLoad(), this indicates + * that the symbols in the loaded module should be added to the global symbol + * table. This will make symbols in this library available for use when + * resolving symbols in future module loads. + * + * This is the default mode of operation for OS_ModuleLoad(). + * + * @note On some operating systems, use of this option may make it difficult + * to unload the module in the future, if the symbols are in use by other entities. + * + */ +#define OS_MODULE_FLAG_GLOBAL_SYMBOLS 0x00 + +/** + * @brief Requests OS_ModuleLoad() to keep the symbols local/private to this module + * + * When supplied as the "flags" argument to OS_ModuleLoad(), this indicates + * that the symbols in the loaded module should NOT be added to the global + * symbol table. This means the symbols in the loaded library will not available + * to for use by other modules. + * + * Use this option is recommended for cases where no other entities will need + * to reference symbols within this module. This helps ensure that the module + * can be more safely unloaded in the future, by preventing other modules from + * binding to it. It also helps reduce the likelihood of symbol name conflicts + * among modules. + * + * @note To look up symbols within a module loaded with this flag, use + * OS_SymbolLookupInModule() instead of OS_SymbolLookup(). Also note that + * references obtained using this method are not tracked by the OS; the + * application must ensure that all references obtained in this manner have + * been cleaned up/released before unloading the module. + */ +#define OS_MODULE_FLAG_LOCAL_SYMBOLS 0x01 + +/* +** Typedefs +*/ + +/** @brief OSAL module address properties */ +typedef struct +{ + uint32 valid; + uint32 flags; + cpuaddr code_address; + cpuaddr code_size; + cpuaddr data_address; + cpuaddr data_size; + cpuaddr bss_address; + cpuaddr bss_size; +} OS_module_address_t; + +/** @brief OSAL module properties */ +typedef struct +{ + cpuaddr entry_point; + cpuaddr host_module_id; + char filename[OS_MAX_PATH_LEN]; + char name[OS_MAX_API_NAME]; + OS_module_address_t addr; +} OS_module_prop_t; + +/** + * @brief Associates a single symbol name with a memory address. + * + * If the OS_STATIC_SYMBOL_TABLE feature is enabled, then + * an array of these structures should be provided by the + * application. When the application needs to find a symbol + * address, the static table will be checked in addition + * to (or instead of) the OS/library-provided lookup function. + * + * This static symbol allows systems that do not implement + * dynamic module loading to maintain the same semantics + * as dynamically loaded modules. + */ +typedef const struct +{ + const char *Name; + void (*Address)(void); + const char *Module; +} OS_static_symbol_record_t; + +/** @defgroup OSAPILoader OSAL Dynamic Loader and Symbol APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find the Address of a Symbol + * + * This calls to the OS dynamic symbol lookup implementation, + * and/or checks a static symbol table for a matching symbol name. + * + * The static table is intended to support embedded targets that do + * not have module loading capability or have it disabled. + * + * @param[out] symbol_address Set to the address of the symbol + * @param[in] symbol_name Name of the symbol to look up + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the symbol could not be found + * @retval #OS_INVALID_POINTER if one of the pointers passed in are NULL + */ +int32 OS_SymbolLookup(cpuaddr *symbol_address, const char *symbol_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find the Address of a Symbol within a module + * + * This is similar to OS_SymbolLookup() but for a specific module ID. + * This should be used to look up a symbol in a module that has been + * loaded with the #OS_MODULE_FLAG_LOCAL_SYMBOLS flag. + * + * @param[in] module_id Module ID that should contain the symbol + * @param[out] symbol_address Set to the address of the symbol + * @param[in] symbol_name Name of the symbol to look up + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the symbol could not be found + * @retval #OS_INVALID_POINTER if one of the pointers passed in are NULL + */ +int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const char *symbol_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Dumps the system symbol table to a file + * + * Dumps the system symbol table to the specified filename + * + * @param[in] filename File to write to + * @param[in] size_limit Maximum number of bytes to write + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_NOT_IMPLEMENTED @copybrief OS_ERR_NOT_IMPLEMENTED + * @retval #OS_ERROR if the symbol table could not be read or dumped + */ +int32 OS_SymbolTableDump(const char *filename, size_t size_limit); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Loads an object file + * + * Loads an object file into the running operating system + * + * The "flags" parameter may influence how the loaded module symbols are made + * available for use in the application. See #OS_MODULE_FLAG_LOCAL_SYMBOLS + * and #OS_MODULE_FLAG_GLOBAL_SYMBOLS for descriptions. + * + * @param[out] module_id Non-zero OSAL ID corresponding to the loaded module + * @param[in] module_name Name of module + * @param[in] filename File containing the object code to load + * @param[in] flags Options for the loaded module + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the module cannot be loaded + * @retval #OS_INVALID_POINTER if one of the parameters is NULL + * @retval #OS_ERR_NO_FREE_IDS if the module table is full + * @retval #OS_ERR_NAME_TAKEN if the name is in use + */ +int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename, uint32 flags); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Unloads the module file + * + * Unloads the module file from the running operating system + * + * @param[in] module_id OSAL ID of the previously the loaded module + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the module is invalid or cannot be unloaded + */ +int32 OS_ModuleUnload(osal_id_t module_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain information about a module + * + * Returns information about the loadable module + * + * @param[in] module_id OSAL ID of the previously the loaded module + * @param[out] module_info Buffer to store module information + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the module id invalid + * @retval #OS_INVALID_POINTER if the pointer to the ModuleInfo structure is invalid + */ +int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_info); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-mutex.h b/src/os/inc/osapi-mutex.h new file mode 100644 index 000000000..b41d9a994 --- /dev/null +++ b/src/os/inc/osapi-mutex.h @@ -0,0 +1,153 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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: osapi-mutex.h + */ + +#ifndef OSAPI_MUTEX_H +#define OSAPI_MUTEX_H + +#include "osconfig.h" +#include "common_types.h" + + +/** @brief OSAL mutex properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; +} OS_mut_sem_prop_t; + +/** @defgroup OSAPIMutex OSAL Mutex APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Creates a mutex semaphore + * + * Mutex semaphores are always created in the unlocked (full) state. + * + * @param[out] sem_id will be set to the non-zero ID of the newly-created resource + * @param[in] sem_name the name of the new resource to create + * @param[in] options reserved for future use. Should be passed as 0. + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if sem_id or sem_name are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NO_FREE_IDS if there are no more free mutex Ids + * @retval #OS_ERR_NAME_TAKEN if there is already a mutex with the same name + * @retval #OS_SEM_FAILURE if the OS call failed + */ +int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Releases the mutex object referenced by sem_id. + * + * If there are threads blocked on the mutex object referenced by + * mutex when this function is called, resulting in the mutex becoming + * available, the scheduling policy shall determine which thread shall + * acquire the mutex. + * + * @param[in] sem_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid mutex + * @retval #OS_SEM_FAILURE if an unspecified error occurs + */ +int32 OS_MutSemGive(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Acquire the mutex object referenced by sem_id. + * + * If the mutex is already locked, the calling thread shall + * block until the mutex becomes available. This operation shall + * return with the mutex object referenced by mutex in the locked state + * with the calling thread as its owner. + * + * @param[in] sem_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_SEM_FAILURE if the semaphore was not previously initialized or is + * not in the array of semaphores defined by the system + * @retval #OS_ERR_INVALID_ID the id passed in is not a valid mutex + */ +int32 OS_MutSemTake(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes the specified Mutex Semaphore. + * + * Delete the semaphore. This also frees the respective sem_id such that it can be + * used again when another is created. + * + * @param[in] sem_id The object ID to delete + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid mutex + * @retval #OS_SEM_FAILURE if the OS call failed + */ +int32 OS_MutSemDelete(osal_id_t sem_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find an existing mutex ID by name + * + * This function tries to find a mutex sem Id given the name of a mut_sem. + * The id is returned through sem_id + * + * @param[out] sem_id will be set to the ID of the existing resource + * @param[in] sem_name the name of the existing resource to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER is semid or sem_name are NULL pointers + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + */ +int32 OS_MutSemGetIdByName(osal_id_t *sem_id, const char *sem_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Fill a property object buffer with details regarding the resource + * + * This function will pass back a pointer to structure that contains + * all of the relevant info( name and creator) about the specified mutex + * semaphore. + * + * @param[in] sem_id The object ID to operate on + * @param[out] mut_prop The property object buffer to fill + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore + * @retval #OS_INVALID_POINTER if the mut_prop pointer is null + */ +int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-network.h b/src/os/inc/osapi-network.h new file mode 100644 index 000000000..391492249 --- /dev/null +++ b/src/os/inc/osapi-network.h @@ -0,0 +1,71 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-network.h + */ + +#ifndef OSAPI_NETWORK_H +#define OSAPI_NETWORK_H + +#include "osconfig.h" +#include "common_types.h" + +/** + * @defgroup OSALAPINetwork Network ID APIs + * + * Provides some basic methods to query a network host name and ID + * + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets the network ID of the local machine + * + * The ID is an implementation-defined value and may not be consistent + * in meaning across different platform types. + * + * @note This API may be removed in a future version of OSAL due to + * inconsistencies between platforms. + * + * @return The ID or fixed value of -1 if the host id could not be found. + * Note it is not possible to differentiate between error codes and valid + * network IDs here. It is assumed, however, that -1 is never a valid ID. + */ +int32 OS_NetworkGetID(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets the local machine network host name + * + * If configured in the underlying network stack, + * this function retrieves the local hostname of the system. + * + * @param[out] host_name Buffer to hold name information + * @param[in] name_len Maximum length of host name buffer + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_NetworkGetHostName(char *host_name, size_t name_len); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-os-core.h b/src/os/inc/osapi-os-core.h index befa5583f..5ea3b2acb 100644 --- a/src/os/inc/osapi-os-core.h +++ b/src/os/inc/osapi-os-core.h @@ -30,1542 +30,30 @@ #ifndef _osapi_core_ #define _osapi_core_ -#include /* for va_list */ - -/* Defines constants for making object ID's unique */ -#define OS_OBJECT_INDEX_MASK 0xFFFF /**< @brief Object index mask */ -#define OS_OBJECT_TYPE_SHIFT 16 /**< @brief Object type shift */ - -/** @defgroup OSObjectTypes OSAL Object Type Defines - * @{ - */ -#define OS_OBJECT_TYPE_UNDEFINED 0x00 /**< @brief Object type undefined */ -#define OS_OBJECT_TYPE_OS_TASK 0x01 /**< @brief Object task type */ -#define OS_OBJECT_TYPE_OS_QUEUE 0x02 /**< @brief Object queue type */ -#define OS_OBJECT_TYPE_OS_COUNTSEM 0x03 /**< @brief Object counting semaphore type */ -#define OS_OBJECT_TYPE_OS_BINSEM 0x04 /**< @brief Object binary semaphore type */ -#define OS_OBJECT_TYPE_OS_MUTEX 0x05 /**< @brief Object mutex type */ -#define OS_OBJECT_TYPE_OS_STREAM 0x06 /**< @brief Object stream type */ -#define OS_OBJECT_TYPE_OS_DIR 0x07 /**< @brief Object directory type */ -#define OS_OBJECT_TYPE_OS_TIMEBASE 0x08 /**< @brief Object timebase type */ -#define OS_OBJECT_TYPE_OS_TIMECB 0x09 /**< @brief Object timer callback type */ -#define OS_OBJECT_TYPE_OS_MODULE 0x0A /**< @brief Object module type */ -#define OS_OBJECT_TYPE_OS_FILESYS 0x0B /**< @brief Object file system type */ -#define OS_OBJECT_TYPE_OS_CONSOLE 0x0C /**< @brief Object console type */ -#define OS_OBJECT_TYPE_USER 0x10 /**< @brief Object user type */ -/**@}*/ - -/** @brief Upper limit for OSAL task priorities */ -#define OS_MAX_TASK_PRIORITY 255 - -/** - * @brief Initializer for the osal_id_t type which will not match any valid value - */ -#define OS_OBJECT_ID_UNDEFINED ((osal_id_t) {0}) - -/** - * @brief Constant that may be passed to OS_ForEachObject()/OS_ForEachObjectOfType() to match any - * creator (i.e. get all objects) - */ -#define OS_OBJECT_CREATOR_ANY OS_OBJECT_ID_UNDEFINED - -/** @defgroup OSSemaphoreStates OSAL Semaphore State Defines - * @{ - */ -#define OS_SEM_FULL 1 /**< @brief Semaphore full state */ -#define OS_SEM_EMPTY 0 /**< @brief Semaphore empty state */ -/**@}*/ - -/** @brief Floating point enabled state for a task */ -#define OS_FP_ENABLED 1 - -/** @brief Error string name length - * - * The sizes of strings in OSAL functions are built with this limit in mind. - * Always check the uses of os_err_name_t when changing this value. - */ -#define OS_ERROR_NAME_LENGTH 35 - -/** - * @brief Type to be used for OSAL task priorities. - * - * OSAL priorities are in reverse order, and range - * from 0 (highest; will preempt all other tasks) to - * 255 (lowest; will not preempt any other task). - */ -typedef uint8_t osal_priority_t; - -#define OSAL_PRIORITY_C(X) ((osal_priority_t) {X}) - -/** - * @brief Type to be used for OSAL stack pointer. - */ -typedef void *osal_stackptr_t; - -#define OSAL_STACKPTR_C(X) ((osal_stackptr_t) {X}) -#define OSAL_TASK_STACK_ALLOCATE OSAL_STACKPTR_C(NULL) - -/* Object property structures */ - -/** @brief OSAL task properties */ -typedef struct -{ - char name[OS_MAX_API_NAME]; - osal_id_t creator; - size_t stack_size; - osal_priority_t priority; -} OS_task_prop_t; - -/** @brief OSAL queue properties */ -typedef struct -{ - char name[OS_MAX_API_NAME]; - osal_id_t creator; -} OS_queue_prop_t; - -/** @brief OSAL binary semaphore properties */ -typedef struct -{ - char name[OS_MAX_API_NAME]; - osal_id_t creator; - int32 value; -} OS_bin_sem_prop_t; - -/** @brief OSAL counting semaphore properties */ -typedef struct -{ - char name[OS_MAX_API_NAME]; - osal_id_t creator; - int32 value; -} OS_count_sem_prop_t; - -/** @brief OSAL mutexe properties */ -typedef struct -{ - char name[OS_MAX_API_NAME]; - osal_id_t creator; -} OS_mut_sem_prop_t; - -/** @brief OSAL time */ -typedef struct -{ - uint32 seconds; - uint32 microsecs; -} OS_time_t; - -/** @brief OSAL heap properties - * - * @sa OS_HeapGetInfo() - */ -typedef struct -{ - size_t free_bytes; - osal_blockcount_t free_blocks; - size_t largest_free_block; -} OS_heap_prop_t; - -/** - * @brief An abstract structure capable of holding several OSAL IDs - * - * This is part of the select API and is manipulated using the - * related API calls. It should not be modified directly by applications. - * - * @sa OS_SelectFdZero(), OS_SelectFdAdd(), OS_SelectFdClear(), OS_SelectFdIsSet() - */ -typedef struct -{ - uint8 object_ids[(OS_MAX_NUM_OPEN_FILES + 7) / 8]; -} OS_FdSet; - -/** - * @brief For the OS_SelectSingle() function's in/out StateFlags parameter, - * the state(s) of the stream and the result of the select is a combination - * of one or more of these states. - * - * @sa OS_SelectSingle() - */ -typedef enum -{ - OS_STREAM_STATE_BOUND = 0x01, /**< @brief whether the stream is bound */ - OS_STREAM_STATE_CONNECTED = 0x02, /**< @brief whether the stream is connected */ - OS_STREAM_STATE_READABLE = 0x04, /**< @brief whether the stream is readable */ - OS_STREAM_STATE_WRITABLE = 0x08, /**< @brief whether the stream is writable */ -} OS_StreamState_t; - -/** - * @brief A set of events that can be used with event callback routines - */ -typedef enum -{ - OS_EVENT_RESERVED = 0, /**< no-op/reserved event id value */ - - /** - * resource/id has been newly allocated but not yet created. - * - * This event is invoked from WITHIN the locked region, in - * the context of the task which is allocating the resource. - * - * If the handler returns non-success, the error will be returned - * to the caller and the creation process is aborted. - */ - OS_EVENT_RESOURCE_ALLOCATED, - - /** - * resource/id has been fully created/finalized. - * - * Invoked outside locked region, in the context - * of the task which created the resource. - * - * Data object is not used, passed as NULL. - * - * Return value is ignored - this is for information purposes only. - */ - OS_EVENT_RESOURCE_CREATED, - - /** - * resource/id has been deleted. - * - * Invoked outside locked region, in the context - * of the task which deleted the resource. - * - * Data object is not used, passed as NULL. - * - * Return value is ignored - this is for information purposes only. - */ - OS_EVENT_RESOURCE_DELETED, - - /** - * New task is starting. - * - * Invoked outside locked region, in the context - * of the task which is currently starting, before - * the entry point is called. - * - * Data object is not used, passed as NULL. - * - * If the handler returns non-success, task startup is aborted - * and the entry point is not called. - */ - OS_EVENT_TASK_STARTUP, - - OS_EVENT_MAX /**< placeholder for end of enum, not used */ -} OS_Event_t; - -/** - * @brief A callback routine for event handling. - * - * @param[in] event The event that occurred - * @param[in] object_id The associated object_id, or 0 if not associated with an object - * @param[inout] data An abstract data/context object associated with the event, or NULL. - * @return status Execution status, see @ref OSReturnCodes. - */ -typedef int32 (*OS_EventHandler_t)(OS_Event_t event, osal_id_t object_id, void *data); - -/** - * @brief For the @ref OS_GetErrorName() function, to ensure - * everyone is making an array of the same length. - * - * Implementation note for developers: - * - * The sizes of strings in OSAL functions are built with this - * #OS_ERROR_NAME_LENGTH limit in mind. Always check the uses of os_err_name_t - * when changing this value. - */ -typedef char os_err_name_t[OS_ERROR_NAME_LENGTH]; +#ifdef OSAL_OMIT_DEPRECATED +#error This header header is deprecated +#endif /* -** These typedefs are for the task entry point -*/ -typedef void osal_task; /**< @brief For task entry point */ -typedef osal_task((*osal_task_entry)(void)); /**< @brief For task entry point */ - -/** - * @brief General purpose OSAL callback function - * - * This may be used by multiple APIS - */ -typedef void (*OS_ArgCallback_t)(osal_id_t object_id, void *arg); - -/** @defgroup OSAPICore OSAL Core Operation APIs - * - * These are for OSAL core operations for startup/initialization, running, and shutdown. - * Typically only used in bsps, unit tests, psps, etc. - * - * Not intended for user application use - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Application startup - * - * Startup abstraction such that the same BSP can be used for operations and testing. - */ -void OS_Application_Startup(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Application run - * - * Run abstraction such that the same BSP can be used for operations and testing. - */ -void OS_Application_Run(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Initialization of API - * - * This function returns initializes the internal data structures of the OS - * Abstraction Layer. It must be called in the application startup code before - * calling any other OS routines. - * - * @return Execution status, see @ref OSReturnCodes. Any error code (negative) - * means the OSAL can not be initialized. Typical platform specific response - * is to abort since additional OSAL calls will have undefined behavior. - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR @copybrief OS_ERROR - */ -int32 OS_API_Init(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Background thread implementation - waits forever for events to occur. - * - * This should be called from the BSP main routine or initial thread after all other - * board and application initialization has taken place and all other tasks are running. - * - * Typically just waits forever until "OS_shutdown" flag becomes true. - */ -void OS_IdleLoop(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief delete all resources created in OSAL. - * - * provides a means to clean up all resources allocated by this - * instance of OSAL. It would typically be used during an orderly - * shutdown but may also be helpful for testing purposes. - */ -void OS_DeleteAllObjects(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Initiate orderly shutdown - * - * Indicates that the OSAL application should perform an orderly shutdown - * of ALL tasks, clean up all resources, and exit the application. - * - * This allows the task currently blocked in OS_IdleLoop() to wake up, and - * for that function to return to its caller. - * - * This is preferred over e.g. OS_ApplicationExit() which exits immediately and - * does not provide for any means to clean up first. - * - * @param[in] flag set to true to initiate shutdown, false to cancel - */ -void OS_ApplicationShutdown(uint8 flag); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Exit/Abort the application - * - * Indicates that the OSAL application should exit and return control to the OS - * This is intended for e.g. scripted unit testing where the test needs to end - * without user intervention. - * - * This function does not return. Production code typically should not ever call this. - * - * @note This exits the entire process including tasks that have been created. - */ -void OS_ApplicationExit(int32 Status); -/**@}*/ - -/** @defgroup OSAPIObjUtil OSAL Object Utility APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain an integer value corresponding to an object ID - * - * Obtains an integer representation of an object id, generally - * for the purpose of printing to the console or system logs. - * - * The returned value is of the type "unsigned long" for direct use with - * printf-style functions. It is recommended to use the "%lx" conversion - * specifier as the hexidecimal encoding clearly delineates the internal fields. - * - * @note This provides the raw integer value and is _not_ suitable for use - * as an array index, as the result is not zero-based. See the - * OS_ConvertToArrayIndex() to obtain a zero-based index value. - * - * @param[in] object_id The object ID - * @returns integer value representation of object ID - * - * @hidecallgraph - * @hidecallergraph - */ -static inline unsigned long OS_ObjectIdToInteger(osal_id_t object_id) -{ - return object_id; -} - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain an osal ID corresponding to an integer value - * - * Provides the inverse of OS_ObjectIdToInteger(). Reconstitutes the original - * osal_id_t type from an integer representation. - * - * @param[in] value The integer representation of an OSAL ID - * @returns The ID value converted to an osal_id_t - * - * @hidecallgraph - * @hidecallergraph - */ -static inline osal_id_t OS_ObjectIdFromInteger(unsigned long value) -{ - return value; -} - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Check two OSAL object ID values for equality - * - * The OSAL ID values should be treated as abstract values by applications, and not - * directly manipulated using standard C operators. - * - * This checks two values for equality, replacing the "==" operator. - * - * @param[in] object_id1 The first object ID - * @param[in] object_id2 The second object ID - * @returns true if the object IDs are equal - * - * @hidecallgraph - * @hidecallergraph - */ -static inline bool OS_ObjectIdEqual(osal_id_t object_id1, osal_id_t object_id2) -{ - return (object_id1 == object_id2); -} - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Check if an object ID is defined. - * - * The OSAL ID values should be treated as abstract values by applications, and not - * directly manipulated using standard C operators. - * - * This returns false if the ID is NOT a defined resource (i.e. free/empty/invalid). - * - * @note OS_ObjectIdDefined(OS_OBJECT_ID_UNDEFINED) is always guaranteed to be false. - * - * @param[in] object_id The first object ID - * - * @hidecallgraph - * @hidecallergraph - */ -static inline bool OS_ObjectIdDefined(osal_id_t object_id) -{ - return (object_id != 0); -} - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain the name of an object given an arbitrary object ID - * - * All OSAL resources generally have a name associated with them. This - * allows application code to retrieve the name of any valid OSAL object ID. - * - * @param[in] object_id The object ID to operate on - * @param[out] buffer Buffer in which to store the name - * @param[in] buffer_size Size of the output storage buffer - * - * @returns #OS_SUCCESS if successful - * #OS_ERR_INVALID_ID if the passed-in ID is not a valid OSAL ID - * #OS_INVALID_POINTER if the passed-in buffer is invalid - * #OS_ERR_NAME_TOO_LONG if the name will not fit in the buffer provided - */ -int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain the type of an object given an arbitrary object ID - * - * Given an arbitrary object ID, get the type of the object - * - * @param[in] object_id The object ID to operate on - * - * @return The object type portion of the object_id, see @ref OSObjectTypes for - * expected values - */ -osal_objtype_t OS_IdentifyObject(osal_id_t object_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Converts an abstract ID into a number suitable for use as an array index. - * - * This will return a unique zero-based integer number in the range of [0,MAX) for - * any valid object ID. This may be used by application code as an array index - * for indexing into local tables. - * - * @note This does NOT verify the validity of the ID, that is left to the caller. - * This is only the conversion logic. - * - * This routine accepts any object type, and returns a value based on the - * maximum number of objects for that type. This is equivalent to invoking - * OS_ObjectIdToArrayIndex() with the idtype set to OS_OBJECT_TYPE_UNDEFINED. - * - * @sa OS_ObjectIdToArrayIndex - * - * @param[in] object_id The object ID to operate on - * @param[out] *ArrayIndex The Index to return - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INCORRECT_OBJ_TYPE @copybrief OS_ERR_INCORRECT_OBJ_TYPE - */ -int32 OS_ConvertToArrayIndex(osal_id_t object_id, osal_index_t *ArrayIndex); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Converts an abstract ID into a number suitable for use as an array index. - * - * This will return a unique zero-based integer number in the range of [0,MAX) for - * any valid object ID. This may be used by application code as an array index - * for indexing into local tables. - * - * This routine operates on a specific object type, and returns a value based on the - * maximum number of objects for that type. - * - * If the idtype is passed as #OS_OBJECT_TYPE_UNDEFINED, then object type verification - * is skipped and any object ID will be accepted and converted to an index. In this - * mode, the range of the output depends on the actual passed-in object type. - * - * If the idtype is passed as any other value, the passed-in ID value is first - * confirmed to be the correct type. This check will guarantee that the output - * is within an expected range; for instance, if the type is passed as - * #OS_OBJECT_TYPE_OS_TASK, then the output index is guaranteed to be between 0 and - * #OS_MAX_TASKS-1 after successful conversion. - * - * @param[in] idtype The object type to convert - * @param[in] object_id The object ID to operate on - * @param[out] *ArrayIndex The Index to return - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INCORRECT_OBJ_TYPE @copybrief OS_ERR_INCORRECT_OBJ_TYPE - * */ -int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t object_id, osal_index_t *ArrayIndex); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief call the supplied callback function for all valid object IDs - * - * Loops through all defined OSAL objects of all types and calls callback_ptr on each one - * If creator_id is nonzero then only objects with matching creator id are processed. - * - * @param[in] creator_id Filter objects to those created by a specific task - * This may be passed as OS_OBJECT_CREATOR_ANY to return all objects - * @param[in] callback_ptr Function to invoke for each matching object ID - * @param[in] callback_arg Opaque Argument to pass to callback function - */ -void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief call the supplied callback function for valid object IDs of a specific type - * - * Loops through all defined OSAL objects of a specific type and calls callback_ptr on each one - * If creator_id is nonzero then only objects with matching creator id are processed. - * - * @param[in] objtype The type of objects to iterate - * @param[in] creator_id Filter objects to those created by a specific task - * This may be passed as OS_OBJECT_CREATOR_ANY to return all objects - * @param[in] callback_ptr Function to invoke for each matching object ID - * @param[in] callback_arg Opaque Argument to pass to callback function - */ -void OS_ForEachObjectOfType(osal_objtype_t objtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, - void *callback_arg); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Callback routine registration - * - * This hook enables the application code to perform extra platform-specific - * operations on various system events such as resource creation/deletion. - * - * @note Some events are invoked while the resource is "locked" and therefore - * application-defined handlers for these events should not block or attempt - * to access other OSAL resources. - * - * @param[in] handler The application-provided event handler - * @return Execution status, see @ref OSReturnCodes. - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR @copybrief OS_ERROR - */ -int32 OS_RegisterEventHandler(OS_EventHandler_t handler); - -/**@}*/ - -/** @defgroup OSAPITask OSAL Task APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Creates a task and starts running it. - * - * Creates a task and passes back the id of the task created. Task names must be unique; - * if the name already exists this function fails. Names cannot be NULL. - * - * @param[out] task_id will be set to the non-zero ID of the newly-created resource - * @param[in] task_name the name of the new resource to create - * @param[in] function_pointer the entry point of the new task - * @param[in] stack_pointer pointer to the stack for the task, or NULL - * to allocate a stack from the system memory heap - * @param[in] stack_size the size of the stack, or 0 to use a default stack size. - * @param[in] priority initial priority of the new task - * @param[in] flags initial options for the new task - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if any of the necessary pointers are NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_INVALID_PRIORITY if the priority is bad - * @retval #OS_ERR_NO_FREE_IDS if there can be no more tasks created - * @retval #OS_ERR_NAME_TAKEN if the name specified is already used by a task - * @retval #OS_ERROR if an unspecified/other error occurs - */ -int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, - osal_stackptr_t stack_pointer, size_t stack_size, osal_priority_t priority, uint32 flags); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Deletes the specified Task - * - * The task will be removed from the local tables. and the OS will - * be configured to stop executing the task at the next opportunity. - * - * @param[in] task_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the ID given to it is invalid - * @retval #OS_ERROR if the OS delete call fails - */ -int32 OS_TaskDelete(osal_id_t task_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Exits the calling task - * - * The calling thread is terminated. This function does not return. - */ -void OS_TaskExit(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Installs a handler for when the task is deleted. - * - * This function is used to install a callback that is called when the task is deleted. - * The callback is called when OS_TaskDelete is called with the task ID. A task delete - * handler is useful for cleaning up resources that a task creates, before the task is - * removed from the system. - * - * @param[in] function_pointer function to be called when task exits - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_TaskInstallDeleteHandler(osal_task_entry function_pointer); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Delay a task for specified amount of milliseconds - * - * Causes the current thread to be suspended from execution for the period of millisecond. - * - * @param[in] millisecond Amount of time to delay - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if sleep fails or millisecond = 0 - */ -int32 OS_TaskDelay(uint32 millisecond); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Sets the given task to a new priority - * - * @param[in] task_id The object ID to operate on - * - * @param[in] new_priority Set the new priority - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the ID passed to it is invalid - * @retval #OS_ERR_INVALID_PRIORITY if the priority is greater than the max allowed - * @retval #OS_ERROR if the OS call to change the priority fails - */ -int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obsolete - * @deprecated Explicit registration call no longer needed - * - * Obsolete function retained for compatibility purposes. - * Does Nothing in the current implementation. - * - * @return #OS_SUCCESS (always), see @ref OSReturnCodes - */ -int32 OS_TaskRegister(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain the task id of the calling task - * - * This function returns the task id of the calling task - * - * @return Task ID, or zero if the operation failed (zero is never a valid task ID) - */ -osal_id_t OS_TaskGetId(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find an existing task ID by name - * - * This function tries to find a task Id given the name of a task - * - * @param[out] task_id will be set to the ID of the existing resource - * @param[in] task_name the name of the existing resource to find - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if the pointers passed in are NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND if the name wasn't found in the table - */ -int32 OS_TaskGetIdByName(osal_id_t *task_id, const char *task_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Fill a property object buffer with details regarding the resource - * - * This function will pass back a pointer to structure that contains - * all of the relevant info (creator, stack size, priority, name) about the - * specified task. - * - * @param[in] task_id The object ID to operate on - * @param[out] task_prop The property object buffer to fill - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the ID passed to it is invalid - * @retval #OS_INVALID_POINTER if the task_prop pointer is NULL - */ -int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Reverse-lookup the OSAL task ID from an operating system ID - * - * This provides a method by which an external entity may find the OSAL task - * ID corresponding to a system-defined identifier (e.g. TASK_ID, pthread_t, rtems_id, etc). - * - * Normally OSAL does not expose the underlying OS-specific values to the application, - * but in some circumstances, such as exception handling, the OS may provide this information - * directly to handler outside of the normal OSAL API. - * - * @param[out] task_id The buffer where the task id output is stored - * @param[in] sysdata Pointer to the system-provided identification data - * @param[in] sysdata_size Size of the system-provided identification data - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - */ -int32 OS_TaskFindIdBySystemData(osal_id_t *task_id, const void *sysdata, size_t sysdata_size); - -/**@}*/ - -/** @defgroup OSAPIMsgQueue OSAL Message Queue APIs - * @{ - */ - -/** - * @brief Create a message queue - * - * This is the function used to create a queue in the operating system. - * Depending on the underlying operating system, the memory for the queue - * will be allocated automatically or allocated by the code that sets up - * the queue. Queue names must be unique; if the name already exists this - * function fails. Names cannot be NULL. - * - * - * @param[out] queue_id will be set to the non-zero ID of the newly-created resource - * @param[in] queue_name the name of the new resource to create - * @param[in] queue_depth the maximum depth of the queue - * @param[in] data_size the size of each entry in the queue - * @param[in] flags options for the queue (reserved for future use, pass as 0) - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if a pointer passed in is NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NO_FREE_IDS if there are already the max queues created - * @retval #OS_ERR_NAME_TAKEN if the name is already being used on another queue - * @retval #OS_QUEUE_INVALID_SIZE if the queue depth exceeds the limit - * @retval #OS_ERROR if the OS create call fails - */ -int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, - uint32 flags); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Deletes the specified message queue. - * - * This is the function used to delete a queue in the operating system. - * This also frees the respective queue_id to be used again when another queue is created. - * - * @note If There are messages on the queue, they will be lost and any subsequent - * calls to QueueGet or QueuePut to this queue will result in errors - * - * @param[in] queue_id The object ID to delete - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in does not exist - * @retval #OS_ERROR if the OS call to delete the queue fails - */ -int32 OS_QueueDelete(osal_id_t queue_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Receive a message on a message queue - * - * If a message is pending, it is returned immediately. Otherwise the calling task - * will block until a message arrives or the timeout expires. - * - * @param[in] queue_id The object ID to operate on - * @param[out] data The buffer to store the received message - * @param[in] size The size of the data buffer - * @param[out] size_copied Set to the actual size of the message - * @param[in] timeout The maximum amount of time to block, or OS_PEND to wait forever - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the given ID does not exist - * @retval #OS_INVALID_POINTER if a pointer passed in is NULL - * @retval #OS_QUEUE_EMPTY if the Queue has no messages on it to be recieved - * @retval #OS_QUEUE_TIMEOUT if the timeout was OS_PEND and the time expired - * @retval #OS_QUEUE_INVALID_SIZE if the size copied from the queue was not correct - */ -int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Put a message on a message queue. - * - * @param[in] queue_id The object ID to operate on - * @param[in] data The buffer containing the message to put - * @param[in] size The size of the data buffer - * @param[in] flags Currently reserved/unused, should be passed as 0 - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the queue id passed in is not a valid queue - * @retval #OS_INVALID_POINTER if the data pointer is NULL - * @retval #OS_QUEUE_FULL if the queue cannot accept another message - * @retval #OS_ERROR if the OS call returns an error - */ -int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flags); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find an existing queue ID by name - * - * This function tries to find a queue Id given the name of the queue. The - * id of the queue is passed back in queue_id. - * - * @param[out] queue_id will be set to the ID of the existing resource - * @param[in] queue_name the name of the existing resource to find - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if the name or id pointers are NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND the name was not found in the table - */ -int32 OS_QueueGetIdByName(osal_id_t *queue_id, const char *queue_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Fill a property object buffer with details regarding the resource - * - * This function will pass back a pointer to structure that contains - * all of the relevant info (name and creator) about the specified queue. - * - * @param[in] queue_id The object ID to operate on - * @param[out] queue_prop The property object buffer to fill - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if queue_prop is NULL - * @retval #OS_ERR_INVALID_ID if the ID given is not a valid queue - */ -int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop); -/**@}*/ - -/** @defgroup OSAPISem OSAL Semaphore APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Creates a binary semaphore - * - * Creates a binary semaphore with initial value specified by - * sem_initial_value and name specified by sem_name. sem_id will be - * returned to the caller - * - * @param[out] sem_id will be set to the non-zero ID of the newly-created resource - * @param[in] sem_name the name of the new resource to create - * @param[in] sem_initial_value the initial value of the binary semaphore - * @param[in] options Reserved for future use, should be passed as 0. - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if sen name or sem_id are NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NO_FREE_IDS if all of the semaphore ids are taken - * @retval #OS_ERR_NAME_TAKEN if this is already the name of a binary semaphore - * @retval #OS_SEM_FAILURE if the OS call failed - */ -int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initial_value, uint32 options); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Unblock all tasks pending on the specified semaphore - * - * The function unblocks all tasks pending on the specified semaphore. However, - * this function does not change the state of the semaphore. - * - * @param[in] sem_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a binary semaphore - * @retval #OS_SEM_FAILURE if an unspecified failure occurs - */ -int32 OS_BinSemFlush(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Increment the semaphore value - * - * The function unlocks the semaphore referenced by sem_id by performing - * a semaphore unlock operation on that semaphore. If the semaphore value - * resulting from this operation is positive, then no threads were blocked - * waiting for the semaphore to become unlocked; the semaphore value is - * simply incremented for this semaphore. - * - * @param[in] sem_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not - * in the array of semaphores defined by the system - * @retval #OS_ERR_INVALID_ID if the id passed in is not a binary semaphore - */ -int32 OS_BinSemGive(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Decrement the semaphore value - * - * The locks the semaphore referenced by sem_id by performing a - * semaphore lock operation on that semaphore. If the semaphore value - * is currently zero, then the calling thread shall not return from - * the call until it either locks the semaphore or the call is - * interrupted. - * - * @param[in] sem_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID the Id passed in is not a valid binary semaphore - * @retval #OS_SEM_FAILURE if the OS call failed - */ -int32 OS_BinSemTake(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Decrement the semaphore value with a timeout - * - * The function locks the semaphore referenced by sem_id. However, - * if the semaphore cannot be locked without waiting for another process - * or thread to unlock the semaphore, this wait shall be terminated when - * the specified timeout, msecs, expires. - * - * @param[in] sem_id The object ID to operate on - * @param[in] msecs The maximum amount of time to block, in milliseconds - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_SEM_TIMEOUT if semaphore was not relinquished in time - * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not - * in the array of semaphores defined by the system - * @retval #OS_ERR_INVALID_ID if the ID passed in is not a valid semaphore ID - */ -int32 OS_BinSemTimedWait(osal_id_t sem_id, uint32 msecs); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Deletes the specified Binary Semaphore - * - * This is the function used to delete a binary semaphore in the operating system. - * This also frees the respective sem_id to be used again when another semaphore is created. - * - * @param[in] sem_id The object ID to delete - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid binary semaphore - * @retval #OS_SEM_FAILURE the OS call failed - */ -int32 OS_BinSemDelete(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find an existing semaphore ID by name - * - * This function tries to find a binary sem Id given the name of a bin_sem - * The id is returned through sem_id - * - * @param[out] sem_id will be set to the ID of the existing resource - * @param[in] sem_name the name of the existing resource to find - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER is semid or sem_name are NULL pointers - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table - */ -int32 OS_BinSemGetIdByName(osal_id_t *sem_id, const char *sem_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Fill a property object buffer with details regarding the resource - * - * This function will pass back a pointer to structure that contains - * all of the relevant info( name and creator) about the specified binary - * semaphore. - * - * @param[in] sem_id The object ID to operate on - * @param[out] bin_prop The property object buffer to fill - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore - * @retval #OS_INVALID_POINTER if the bin_prop pointer is null - */ -int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Creates a counting semaphore - * - * Creates a counting semaphore with initial value specified by - * sem_initial_value and name specified by sem_name. sem_id will be - * returned to the caller - * - * @param[out] sem_id will be set to the non-zero ID of the newly-created resource - * @param[in] sem_name the name of the new resource to create - * @param[in] sem_initial_value the initial value of the counting semaphore - * @param[in] options Reserved for future use, should be passed as 0. - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if sen name or sem_id are NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NO_FREE_IDS if all of the semaphore ids are taken - * @retval #OS_ERR_NAME_TAKEN if this is already the name of a counting semaphore - * @retval #OS_SEM_FAILURE if the OS call failed - * @retval #OS_INVALID_SEM_VALUE if the semaphore value is too high - */ -int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initial_value, uint32 options); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Increment the semaphore value - * - * The function unlocks the semaphore referenced by sem_id by performing - * a semaphore unlock operation on that semaphore. If the semaphore value - * resulting from this operation is positive, then no threads were blocked - * waiting for the semaphore to become unlocked; the semaphore value is - * simply incremented for this semaphore. - * - * @param[in] sem_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not - * in the array of semaphores defined by the system - * @retval #OS_ERR_INVALID_ID if the id passed in is not a counting semaphore - */ -int32 OS_CountSemGive(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Decrement the semaphore value - * - * The locks the semaphore referenced by sem_id by performing a - * semaphore lock operation on that semaphore. If the semaphore value - * is currently zero, then the calling thread shall not return from - * the call until it either locks the semaphore or the call is - * interrupted. - * - * @param[in] sem_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID the Id passed in is not a valid counting semaphore - * @retval #OS_SEM_FAILURE if the OS call failed - */ -int32 OS_CountSemTake(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Decrement the semaphore value with timeout - * - * The function locks the semaphore referenced by sem_id. However, - * if the semaphore cannot be locked without waiting for another process - * or thread to unlock the semaphore, this wait shall be terminated when - * the specified timeout, msecs, expires. - * - * @param[in] sem_id The object ID to operate on - * @param[in] msecs The maximum amount of time to block, in milliseconds - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_SEM_TIMEOUT if semaphore was not relinquished in time - * @retval #OS_SEM_FAILURE the semaphore was not previously initialized or is not - * in the array of semaphores defined by the system - * @retval #OS_ERR_INVALID_ID if the ID passed in is not a valid semaphore ID - */ -int32 OS_CountSemTimedWait(osal_id_t sem_id, uint32 msecs); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Deletes the specified counting Semaphore. - * - * @param[in] sem_id The object ID to delete - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid counting semaphore - * @retval #OS_SEM_FAILURE the OS call failed - */ -int32 OS_CountSemDelete(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find an existing semaphore ID by name - * - * This function tries to find a counting sem Id given the name of a count_sem - * The id is returned through sem_id - * - * @param[out] sem_id will be set to the ID of the existing resource - * @param[in] sem_name the name of the existing resource to find - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER is semid or sem_name are NULL pointers - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table - */ -int32 OS_CountSemGetIdByName(osal_id_t *sem_id, const char *sem_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Fill a property object buffer with details regarding the resource - * - * This function will pass back a pointer to structure that contains - * all of the relevant info( name and creator) about the specified counting - * semaphore. - * - * @param[in] sem_id The object ID to operate on - * @param[out] count_prop The property object buffer to fill - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore - * @retval #OS_INVALID_POINTER if the count_prop pointer is null - */ -int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Creates a mutex semaphore - * - * Mutex semaphores are always created in the unlocked (full) state. - * - * @param[out] sem_id will be set to the non-zero ID of the newly-created resource - * @param[in] sem_name the name of the new resource to create - * @param[in] options reserved for future use. Should be passed as 0. - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if sem_id or sem_name are NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NO_FREE_IDS if there are no more free mutex Ids - * @retval #OS_ERR_NAME_TAKEN if there is already a mutex with the same name - * @retval #OS_SEM_FAILURE if the OS call failed - */ -int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Releases the mutex object referenced by sem_id. - * - * If there are threads blocked on the mutex object referenced by - * mutex when this function is called, resulting in the mutex becoming - * available, the scheduling policy shall determine which thread shall - * acquire the mutex. - * - * @param[in] sem_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid mutex - * @retval #OS_SEM_FAILURE if an unspecified error occurs - */ -int32 OS_MutSemGive(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Acquire the mutex object referenced by sem_id. - * - * If the mutex is already locked, the calling thread shall - * block until the mutex becomes available. This operation shall - * return with the mutex object referenced by mutex in the locked state - * with the calling thread as its owner. - * - * @param[in] sem_id The object ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_SEM_FAILURE if the semaphore was not previously initialized or is - * not in the array of semaphores defined by the system - * @retval #OS_ERR_INVALID_ID the id passed in is not a valid mutex - */ -int32 OS_MutSemTake(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Deletes the specified Mutex Semaphore. - * - * Delete the semaphore. This also frees the respective sem_id such that it can be - * used again when another is created. - * - * @param[in] sem_id The object ID to delete - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid mutex - * @retval #OS_SEM_FAILURE if the OS call failed - */ -int32 OS_MutSemDelete(osal_id_t sem_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find an existing mutex ID by name - * - * This function tries to find a mutex sem Id given the name of a mut_sem. - * The id is returned through sem_id - * - * @param[out] sem_id will be set to the ID of the existing resource - * @param[in] sem_name the name of the existing resource to find - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER is semid or sem_name are NULL pointers - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table - */ -int32 OS_MutSemGetIdByName(osal_id_t *sem_id, const char *sem_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Fill a property object buffer with details regarding the resource - * - * This function will pass back a pointer to structure that contains - * all of the relevant info( name and creator) about the specified mutex - * semaphore. - * - * @param[in] sem_id The object ID to operate on - * @param[out] mut_prop The property object buffer to fill - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore - * @retval #OS_INVALID_POINTER if the mut_prop pointer is null - */ -int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop); -/**@}*/ - -/** @defgroup OSAPITime OSAL Time APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Get the local time - * - * This function gets the local time from the underlying OS. - * - * @note Mission time management typically uses the cFE Time Service - * - * @param[out] time_struct An OS_time_t that will be set to the current time - * - * @return Get local time status, see @ref OSReturnCodes - */ -int32 OS_GetLocalTime(OS_time_t *time_struct); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Set the local time - * - * This function sets the local time on the underlying OS. - * - * @note Mission time management typically uses the cFE Time Services - * - * @param[in] time_struct An OS_time_t containing the current time - * - * @return Set local time status, see @ref OSReturnCodes - */ -int32 OS_SetLocalTime(OS_time_t *time_struct); -/**@}*/ - -/** @defgroup OSAPIHeap OSAL Heap APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Return current info on the heap - * - * @param[out] heap_prop Storage buffer for heap info - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_HeapGetInfo(OS_heap_prop_t *heap_prop); -/**@}*/ - -/** @defgroup OSAPIError OSAL Error Info APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Convert an error number to a string - * - * @param[in] error_num Error number to convert - * @param[out] err_name Buffer to store error string - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name); -/**@}*/ - -/** @defgroup OSAPISelect OSAL Select APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Wait for events across multiple file handles - * - * Wait for any of the given sets of IDs to be become readable or writable - * - * This function will block until any of the following occurs: - * - At least one OSAL ID in the ReadSet is readable - * - At least one OSAL ID in the WriteSet is writable - * - The timeout has elapsed - * - * The sets are input/output parameters. On entry, these indicate the - * file handle(s) to wait for. On exit, these are set to the actual - * file handle(s) that have activity. - * - * If the timeout occurs this returns an error code and all output sets - * should be empty. - * - * @note This does not lock or otherwise protect the file handles in the - * given sets. If a filehandle supplied via one of the FdSet arguments - * is closed or modified by another while this function is in progress, - * the results are undefined. Because of this limitation, it is recommended - * to use OS_SelectSingle() whenever possible. - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Wait for events on a single file handle - * - * Wait for a single OSAL filehandle to change state - * - * This function can be used to wait for a single OSAL stream ID - * to become readable or writable. On entry, the "StateFlags" - * parameter should be set to the desired state (OS_STREAM_STATE_READABLE - * and/or OS_STREAM_STATE_WRITABLE) and upon return the flags - * will be set to the state actually detected. - * - * As this operates on a single ID, the filehandle is protected - * during this call, such that another thread accessing the same - * handle will return an error. However, it is important to note that - * once the call returns then other threads may then also read/write - * and affect the state before the current thread can service it. - * - * To mitigate this risk the application may prefer to use - * the OS_TimedRead/OS_TimedWrite calls. - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SelectSingle(osal_id_t objid, uint32 *StateFlags, int32 msecs); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Clear a FdSet structure - * - * After this call the set will contain no OSAL IDs - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SelectFdZero(OS_FdSet *Set); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Add an ID to an FdSet structure - * - * After this call the set will contain the given OSAL ID - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SelectFdAdd(OS_FdSet *Set, osal_id_t objid); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Clear an ID from an FdSet structure - * - * After this call the set will no longer contain the given OSAL ID - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SelectFdClear(OS_FdSet *Set, osal_id_t objid); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Check if an FdSet structure contains a given ID - * - * @return Boolean set status - * @retval true FdSet structure contains ID - * @retval false FDSet structure does not contain ID - */ -bool OS_SelectFdIsSet(OS_FdSet *Set, osal_id_t objid); -/**@}*/ - -/** @defgroup OSAPIPrintf OSAL Printf APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Abstraction for the system printf() call - * - * This function abstracts out the printf type statements. This is - * useful for using OS- specific thats that will allow non-polled - * print statements for the real time systems. - * - * Operates in a manner similar to the printf() call defined by the standard C - * library and takes all the parameters and formatting options of printf. - * This abstraction may implement additional buffering, if necessary, - * to improve the real-time performance of the call. - * - * Strings (including terminator) longer than #OS_BUFFER_SIZE will be truncated. - * - * The output of this routine also may be dynamically enabled or disabled by - * the OS_printf_enable() and OS_printf_disable() calls, respectively. - * - * @param[in] string Format string, followed by additional arguments - */ -void OS_printf(const char *string, ...) OS_PRINTF(1, 2); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief This function disables the output from OS_printf. - */ -void OS_printf_disable(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief This function enables the output from OS_printf. - * - */ -void OS_printf_enable(void); -/**@}*/ - -/**************************************************************************************** - BSP LOW-LEVEL IMPLEMENTATION FUNCTIONS - ****************************************************************************************/ - -/*---------------------------------------------------------------- - Function: OS_BSP_GetArgC - - Purpose: Obtain the number of boot arguments passed from the bootloader - or shell if supported by the platform - - Returns: The number of boot arguments, or 0 if no arguments were passed - or not supported by the BSP. - ------------------------------------------------------------------*/ -uint32 OS_BSP_GetArgC(void); - -/*---------------------------------------------------------------- - Function: OS_BSP_GetArgV - - Purpose: Obtain an array of boot argument strings passed from the bootloader - or shell if supported by the platform - - Returns: Pointer to char* array containing the argument strings, or NULL if - no arguments are available or not supported by the BSP. - - The array is sized according to OS_BSP_GetArgC() - ------------------------------------------------------------------*/ -char *const *OS_BSP_GetArgV(void); - -/*---------------------------------------------------------------- - Function: OS_BSP_SetExitCode - - Purpose: Sets the status to be returned to the shell or bootloader - if supported by the platform. The value is an integer with - platform and application-defined meaning, but BSP's should - attempt to provide consistent meaning for the following values - - OS_SUCCESS: normal status (default) - OS_ERROR: any abnormal status - - Other more specific status values may be passed, with - implementation-defined behavior. Depending on the system - capabilities, the BSP implementation may either pass the - value through as-is, translate it to defined value, or - ignore it. - - Note this does NOT cause the application to exit, it only - sets the state that will be returned if/when the application - exits itself at a future time. - - ------------------------------------------------------------------*/ -void OS_BSP_SetExitCode(int32 code); + * BACKWARD COMPATIBILITY HEADER + * + * OSAPI headers have beens split into subsystem-based components. + * + * This header is now just a wrapper that includes the same general + * set of components that this file traditionally supplied. + */ +#include "osapi-common.h" +#include "osapi-idmap.h" +#include "osapi-task.h" +#include "osapi-queue.h" +#include "osapi-binsem.h" +#include "osapi-countsem.h" +#include "osapi-mutex.h" +#include "osapi-clock.h" +#include "osapi-heap.h" +#include "osapi-error.h" +#include "osapi-select.h" +#include "osapi-printf.h" +#include "osapi-bsp.h" #endif diff --git a/src/os/inc/osapi-os-filesys.h b/src/os/inc/osapi-os-filesys.h index d09c2616d..a786261ee 100644 --- a/src/os/inc/osapi-os-filesys.h +++ b/src/os/inc/osapi-os-filesys.h @@ -30,891 +30,20 @@ #ifndef _osapi_filesys_ #define _osapi_filesys_ -/** @defgroup OSFileAccess OSAL File Access Option Defines - * @{ - */ -#define OS_READ_ONLY 0 /**< Read only file access */ -#define OS_WRITE_ONLY 1 /**< Write only file access */ -#define OS_READ_WRITE 2 /**< Read write file access */ -/**@}*/ - -/** @defgroup OSFileOffset OSAL Refernce Point For Seek Offset Defines - * @{ - */ -#define OS_SEEK_SET 0 /**< Seek offset set */ -#define OS_SEEK_CUR 1 /**< Seek offset current */ -#define OS_SEEK_END 2 /**< Seek offset end */ -/**@}*/ - -#define OS_CHK_ONLY 0 /**< Unused, API takes bool */ -#define OS_REPAIR 1 /**< Unused, API takes bool */ - -/* -** Length of a Device and Volume name -*/ -#define OS_FS_DEV_NAME_LEN 32 /**< Device name length */ -#define OS_FS_PHYS_NAME_LEN 64 /**< Physical drive name length */ -#define OS_FS_VOL_NAME_LEN 32 /**< Volume name length */ - -/** - * @brief Maximum length of a local/native path name string - * - * This is a concatenation of the OSAL virtual path with the system - * mount point or device name - */ -#define OS_MAX_LOCAL_PATH_LEN (OS_MAX_PATH_LEN + OS_FS_PHYS_NAME_LEN) - -/** @addtogroup OSReturnCodes - * @{ - */ -/* -** Defines for File System Calls -*/ -/* - * NOTE - these values used to overlap with the - * other OSAPI error codes. They now start at -100 - * to avoid this overlap. - */ -#define OS_FS_ERR_PATH_TOO_LONG (-103) /**< @brief FS path too long */ -#define OS_FS_ERR_NAME_TOO_LONG (-104) /**< @brief FS name too long */ -#define OS_FS_ERR_DRIVE_NOT_CREATED (-106) /**< @brief FS drive not created */ -#define OS_FS_ERR_DEVICE_NOT_FREE (-107) /**< @brief FS device not free */ -#define OS_FS_ERR_PATH_INVALID (-108) /**< @brief FS path invalid */ - -/**@}*/ - -/** @brief OSAL file system info */ -typedef struct -{ - uint32 MaxFds; /**< @brief Total number of file descriptors */ - uint32 FreeFds; /**< @brief Total number that are free */ - uint32 MaxVolumes; /**< @brief Maximum number of volumes */ - uint32 FreeVolumes; /**< @brief Total number of volumes free */ -} os_fsinfo_t; - -/** @brief OSAL file properties */ -typedef struct -{ - char Path[OS_MAX_PATH_LEN]; - osal_id_t User; - uint8 IsValid; /* For backward compatibility -- always true if OS_FDGetInfo returned true */ -} OS_file_prop_t; - -/** - * @brief File system status - * - * @note This used to be directly typedef'ed to the "struct stat" from the C library - * - * Some C libraries (glibc in particular) actually define member names to reference into - * sub-structures, so attempting to reuse a name like "st_mtime" might not work. - */ -typedef struct -{ - uint32 FileModeBits; - int32 FileTime; - size_t FileSize; -} os_fstat_t; - -/** - * @brief File stat mode bits - * - * We must also define replacements for the stat structure's mode bits. - * This is currently just a small subset since the OSAL just presents a very - * simplified view of the filesystem to the upper layers. And since not all - * OS'es are POSIX, the more POSIX-specific bits are not relevant anyway. - */ -enum -{ - OS_FILESTAT_MODE_EXEC = 0x00001, - OS_FILESTAT_MODE_WRITE = 0x00002, - OS_FILESTAT_MODE_READ = 0x00004, - OS_FILESTAT_MODE_DIR = 0x10000 -}; - -/** @brief Access file stat mode bits */ -#define OS_FILESTAT_MODE(x) ((x).FileModeBits) -/** @brief File stat is directory logical */ -#define OS_FILESTAT_ISDIR(x) ((x).FileModeBits & OS_FILESTAT_MODE_DIR) -/** @brief File stat is executable logical */ -#define OS_FILESTAT_EXEC(x) ((x).FileModeBits & OS_FILESTAT_MODE_EXEC) -/** @brief File stat is write enabled logical */ -#define OS_FILESTAT_WRITE(x) ((x).FileModeBits & OS_FILESTAT_MODE_WRITE) -/** @brief File stat is read enabled logical */ -#define OS_FILESTAT_READ(x) ((x).FileModeBits & OS_FILESTAT_MODE_READ) -/** @brief Access file stat size field */ -#define OS_FILESTAT_SIZE(x) ((x).FileSize) -/** @brief Access file stat time field */ -#define OS_FILESTAT_TIME(x) ((x).FileTime) - -/** @brief Directory entry */ -typedef struct -{ - char FileName[OS_MAX_FILE_NAME]; -} os_dirent_t; - -/** - * @brief Flags that can be used with opening of a file (bitmask) - */ -typedef enum -{ - OS_FILE_FLAG_NONE = 0x00, - OS_FILE_FLAG_CREATE = 0x01, - OS_FILE_FLAG_TRUNCATE = 0x02, -} OS_file_flag_t; - -/** @brief Access filename part of the dirent structure */ -#define OS_DIRENTRY_NAME(x) ((x).FileName) - -/* - * Exported Functions - */ - -/** @defgroup OSAPIFile OSAL Standard File APIs - * @{ - */ - -#ifndef OSAL_OMIT_DEPRECATED - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Creates a file specified by path - * - * Creates a file specified by const char *path, with read/write - * permissions by access. The file is also automatically opened by the - * create call. - * - * @param[in] path File name to create - * @param[in] access Intended access mode - see @ref OSFileAccess - * - * @note Valid handle IDs are never negative. Failure of this - * call can be checked by testing if the result is less than 0. - * - * @return A file handle ID or appropriate error code, see @ref OSReturnCodes - * @retval #OS_INVALID_POINTER if path is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if path exceeds the maximum number of chars - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file is too long - * @retval #OS_ERROR if permissions are unknown or OS call fails - * @retval #OS_ERR_NO_FREE_IDS if there are no free file descriptors left - * - * @deprecated Replaced by OS_OpenCreate() with flags set to - * OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE. - */ -int32 OS_creat(const char *path, int32 access); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Opens a file - * - * Opens a file. - * - * @param[in] path File name to create - * @param[in] access Intended access mode - see @ref OSFileAccess - * @param[in] mode The file permissions. This parameter is passed through to the - * native open call, but will be ignored. The file mode (or permissions) - * are ignored by the POSIX open call when the O_CREAT access flag is not passed in. - * - * @note Valid handle IDs are never negative. Failure of this - * call can be checked by testing if the result is less than 0. - * - * @return A file handle ID or appropriate error code, see @ref OSReturnCodes - * @retval #OS_INVALID_POINTER if path is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if path exceeds the maximum number of chars - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file is too long - * @retval #OS_ERROR if permissions are unknown or OS call fails - * @retval #OS_ERR_NO_FREE_IDS if there are no free file descriptors left - * - * @deprecated Replaced by OS_OpenCreate() with flags set to - * OS_FILE_FLAG_NONE. - */ -int32 OS_open(const char *path, int32 access, uint32 mode); - +#ifdef OSAL_OMIT_DEPRECATED +#error This header header is deprecated #endif -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Open or create a file - * - * Implements the same as OS_open/OS_creat but follows the OSAL paradigm - * of outputting the ID/descriptor separately from the return value, rather - * than relying on the user to convert it back. - * - * @param[out] filedes The handle ID - * @param[in] path File name to create or open - * @param[in] flags The file permissions - see @ref OS_file_flag_t - * @param[in] access Intended access mode - see @ref OSFileAccess - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the command was not executed properly - */ -int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 access); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Closes an open file handle - * - * This closes regular file handles and any other file-like resource, such as - * network streams or pipes. - * - * @param[in] filedes The handle ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if file descriptor could not be closed - * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid - */ -int32 OS_close(osal_id_t filedes); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Read from a file handle - * - * Reads up to nbytes from a file, and puts them into buffer. - * - * @param[in] filedes The handle ID to operate on - * @param[out] buffer Storage location for file data - * @param[in] nbytes Maximum number of bytes to read - * - * @note All OSAL error codes are negative int32 values. Failure of this - * call can be checked by testing if the result is less than 0. - * - * @return A non-negative byte count or appropriate error code, see @ref OSReturnCodes - * @retval #OS_INVALID_POINTER if buffer is a null pointer - * @retval #OS_ERROR if OS call failed - * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid - */ -int32 OS_read(osal_id_t filedes, void *buffer, size_t nbytes); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Write to a file handle - * - * Writes to a file. copies up to a maximum of nbytes of buffer to the file - * described in filedes - * - * @param[in] filedes The handle ID to operate on - * @param[in] buffer Source location for file data - * @param[in] nbytes Maximum number of bytes to read - * - * @note All OSAL error codes are negative int32 values. Failure of this - * call can be checked by testing if the result is less than 0. - * - * @return A non-negative byte count or appropriate error code, see @ref OSReturnCodes - * @retval #OS_INVALID_POINTER if buffer is NULL - * @retval #OS_ERROR if OS call failed - * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid - */ -int32 OS_write(osal_id_t filedes, const void *buffer, size_t nbytes); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief File/Stream input read with a timeout - * - * This implements a time-limited read and is primarily intended for use with - * sockets but may also work with any other stream-like resource that the underlying - * OS supports. - * - * If data is immediately available on the file/socket, this will return that data - * along with the actual number of bytes that were immediately available. It will - * not block. - * - * If no data is immediately available, this will wait up to the given timeout for - * data to appear. If no data appears within the timeout period, then this returns - * an error code (not zero). - * - * In all cases this will return successfully as soon as at least 1 byte of actual - * data is available. It will not attempt to read the entire input buffer. - * - * If an EOF condition occurs prior to timeout, this function returns zero. - * - * @param[in] filedes The handle ID to operate on - * @param[in] buffer Source location for file data - * @param[in] nbytes Maximum number of bytes to read - * @param[in] timeout Maximum time to wait, in milliseconds (OS_PEND = forever) - * - * @return Byte count on success, zero for timeout, or appropriate error code, - * see @ref OSReturnCodes - */ -int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief File/Stream output write with a timeout - * - * This implements a time-limited write and is primarily intended for use with - * sockets but may also work with any other stream-like resource that the underlying - * OS supports. - * - * If output buffer space is immediately available on the file/socket, this will - * place data into the buffer and return the actual number of bytes that were - * queued for output. It will not block. - * - * If no output buffer space is immediately available, this will wait up to the - * given timeout for space to become available. If no space becomes available within - * the timeout period, then this returns an error code (not zero). - * - * In all cases this will return successfully as soon as at least 1 byte of actual - * data is output. It will _not_ attempt to write the entire output buffer. - * - * If an EOF condition occurs prior to timeout, this function returns zero. - * - * @param[in] filedes The handle ID to operate on - * @param[in] buffer Source location for file data - * @param[in] nbytes Maximum number of bytes to read - * @param[in] timeout Maximum time to wait, in milliseconds (OS_PEND = forever) - * - * @return Byte count on success, zero for timeout, or appropriate error code, - * see @ref OSReturnCodes - */ -int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Changes the permissions of a file - * - * @param[in] path File to change - * @param[in] access Desired access mode - see @ref OSFileAccess - * - * @note Some file systems do not implement permissions - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_chmod(const char *path, uint32 access); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain information about a file or directory - * - * Returns information about a file or directory in a os_fstat_t structure - * - * @param[in] path The file to operate on - * @param[out] filestats Buffer to store file information - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if path or filestats is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if the path is too long to be stored locally - * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file is too long to be stored - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_ERROR if the OS call failed - */ -int32 OS_stat(const char *path, os_fstat_t *filestats); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Seeks to the specified position of an open file - * - * Sets the read/write pointer to a specific offset in a specific file. - * - * @param[in] filedes The handle ID to operate on - * @param[in] offset The file offset to seek to - * @param[in] whence The reference point for offset, see @ref OSFileOffset - * - * @return Byte offset from the beginning of the file or appropriate error code, - see @ref OSReturnCodes - * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid - * @retval #OS_ERROR if OS call failed - */ -int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Removes a file from the file system - * - * Removes a given filename from the drive - * - * @note The behvior of this API on an open file is not defined at the OSAL level - * due to dependencies on the underlying OS which may or may not allow the related - * operation based on a varienty of potential configurations. For portability, - * it is recommended that applications ensure the file is closed prior to removal. - * - * @param[in] path The file to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if there is no device or the driver returns error - * @retval #OS_INVALID_POINTER if path is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if path is too long to be stored locally - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_FS_ERR_NAME_TOO_LONG if the name of the file to remove is too long - */ -int32 OS_remove(const char *path); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Renames a file - * - * Changes the name of a file, where the source and destination - * reside on the same file system. - * - * @note The behvior of this API on an open file is not defined at the OSAL level - * due to dependencies on the underlying OS which may or may not allow the related - * operation based on a varienty of potential configurations. For portability, - * it is recommended that applications ensure the file is closed prior to removal. - * - * @param[in] old_filename The original filename - * @param[in] new_filename The desired filename - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the file could not be opened or renamed. - * @retval #OS_INVALID_POINTER if old or new are NULL - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_FS_ERR_PATH_TOO_LONG if the paths given are too long to be stored locally - * @retval #OS_FS_ERR_NAME_TOO_LONG if the new name is too long to be stored locally - */ -int32 OS_rename(const char *old_filename, const char *new_filename); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Copies a single file from src to dest - * - * @note The behvior of this API on an open file is not defined at the OSAL level - * due to dependencies on the underlying OS which may or may not allow the related - * operation based on a varienty of potential configurations. For portability, - * it is recommended that applications ensure the file is closed prior to removal. - * - * @param[in] src The source file to operate on - * @param[in] dest The destination file - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the file could not be accessed - * @retval #OS_INVALID_POINTER if src or dest are NULL - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_FS_ERR_PATH_TOO_LONG if the paths given are too long to be stored locally - * @retval #OS_FS_ERR_NAME_TOO_LONG if the dest name is too long to be stored locally - */ -int32 OS_cp(const char *src, const char *dest); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Move a single file from src to dest - * - * This first attempts to rename the file, which is faster if - * the source and destination reside on the same file system. - * - * If this fails, it falls back to copying the file and removing - * the original. - * - * @note The behvior of this API on an open file is not defined at the OSAL level - * due to dependencies on the underlying OS which may or may not allow the related - * operation based on a varienty of potential configurations. For portability, - * it is recommended that applications ensure the file is closed prior to removal. - * - * @param[in] src The source file to operate on - * @param[in] dest The destination file - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the file could not be renamed. - * @retval #OS_INVALID_POINTER if src or dest are NULL - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_FS_ERR_PATH_TOO_LONG if the paths given are too long to be stored locally - * @retval #OS_FS_ERR_NAME_TOO_LONG if the dest name is too long to be stored locally - */ -int32 OS_mv(const char *src, const char *dest); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain information about an open file - * - * Copies the information of the given file descriptor into a structure passed in - * - * @param[in] filedes The handle ID to operate on - * @param[out] fd_prop Storage buffer for file information - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid - */ -int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Checks to see if a file is open - * - * This function takes a filename and determines if the file is open. The function - * will return success if the file is open. - * - * @param[in] Filename The file to operate on - * - * @return OS_SUCCESS if the file is open, or appropriate error code - * @retval #OS_ERROR if the file is not open - */ -int32 OS_FileOpenCheck(const char *Filename); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Close all open files - * - * Closes All open files that were opened through the OSAL - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if one or more file close returned an error - */ -int32 OS_CloseAllFiles(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Close a file by filename - * - * Allows a file to be closed by name. - * This will only work if the name passed in is the same name used to open - * the file. - * - * @param[in] Filename The file to close - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_FS_ERR_PATH_INVALID if the file is not found - * @retval #OS_ERROR if the file close returned an error - */ -int32 OS_CloseFileByName(const char *Filename); -/**@}*/ - -/** @defgroup OSAPIDir OSAL Directory APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Opens a directory - * - * Prepares for reading the files within a directory - * - * @param[out] dir_id The non-zero handle ID of the directory - * @param[in] path The directory to open - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Closes an open directory - * - * The directory referred to by dir_id will be closed - * - * @param[in] dir_id The handle ID of the directory - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_DirectoryClose(osal_id_t dir_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Rewinds an open directory - * - * Resets a directory read handle back to the first file. - * - * @param[in] dir_id The handle ID of the directory - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_DirectoryRewind(osal_id_t dir_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Reads the next name in the directory - * - * Obtains directory entry data for the next file from an open directory - * - * @param[in] dir_id The handle ID of the directory - * @param[out] dirent Buffer to store directory entry information - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Makes a new directory - * - * Makes a directory specified by path. - * - * @param[in] path The new directory name - * @param[in] access The permissions for the directory (reserved for future use) - * - * @note Current implementations do not utilize the "access" parameter. Applications - * should still pass the intended value (#OS_READ_WRITE or #OS_READ_ONLY) to be compatible - * with future implementations. - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if path is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if the path is too long to be stored locally - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_ERROR if the OS call fails - */ -int32 OS_mkdir(const char *path, uint32 access); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Removes a directory from the file system. - * - * Removes a directory from the structure. - * The directory must be empty prior to this operation. - * - * @param[in] path The directory to remove - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if path is NULL - * @retval #OS_FS_ERR_PATH_INVALID if path cannot be parsed - * @retval #OS_FS_ERR_PATH_TOO_LONG - * @retval #OS_ERROR if the directory remove operation failed - */ -int32 OS_rmdir(const char *path); -/**@}*/ - -/** @defgroup OSAPIFileSys OSAL File System Level APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Create a fixed mapping between an existing directory and a virtual OSAL mount point. - * - * This mimics the behavior of a "FS_BASED" entry in the VolumeTable but is registered - * at runtime. It is intended to be called by the PSP/BSP prior to starting the application. - * - * @param[out] filesys_id A non-zero OSAL ID reflecting the file system - * @param[in] phys_path The native system directory (an existing mount point) - * @param[in] virt_path The virtual mount point of this filesystem - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const char *virt_path); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Makes a file system on the target - * - * Makes a file system on the target. Highly dependent on underlying OS and - * dependent on OS volume table definition. - * - * @note The "volname" parameter of RAM disks should always begin with the string "RAM", - * e.g. "RAMDISK" or "RAM0","RAM1", etc if multiple devices are created. The underlying - * implementation uses this to select the correct filesystem type/format, and this may - * also be used to differentiate between RAM disks and real physical disks. - * - * @param[in] address The address at which to start the new disk. If address == 0 - * space will be allocated by the OS. - * @param[in] devname The underlying kernel device to use, if applicable. - * @param[in] volname The name of the volume (see note) - * @param[in] blocksize The size of a single block on the drive - * @param[in] numblocks The number of blocks to allocate for the drive - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_INVALID_POINTER if devname is NULL - * @retval #OS_FS_ERR_DRIVE_NOT_CREATED if the OS calls to create the the drive failed - * @retval #OS_FS_ERR_DEVICE_NOT_FREE if the volume table is full - * @retval #OS_SUCCESS on creating the disk - */ -int32 OS_mkfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks); -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Mounts a file system - * - * Mounts a file system / block device at the given mount point. - * - * @param[in] devname The name of the drive to mount. devname is the same from #OS_mkfs - * @param[in] mountpoint The name to call this disk from now on - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_mount(const char *devname, const char *mountpoint); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Initializes an existing file system - * - * Initializes a file system on the target. - * - * @note The "volname" parameter of RAM disks should always begin with the string "RAM", - * e.g. "RAMDISK" or "RAM0","RAM1", etc if multiple devices are created. The underlying - * implementation uses this to select the correct filesystem type/format, and this may - * also be used to differentiate between RAM disks and real physical disks. - * - * @param[in] address The address at which to start the new disk. If address == 0, - * then space will be allocated by the OS - * @param[in] devname The underlying kernel device to use, if applicable. - * @param[in] volname The name of the volume (see note) - * @param[in] blocksize The size of a single block on the drive - * @param[in] numblocks The number of blocks to allocate for the drive - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if devname or volname are NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long - * @retval #OS_FS_ERR_DEVICE_NOT_FREE if the volume table is full - * @retval #OS_FS_ERR_DRIVE_NOT_CREATED on error - */ -int32 OS_initfs(char *address, const char *devname, const char *volname, size_t blocksize, osal_blockcount_t numblocks); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Removes a file system - * - * This function will remove or un-map the target file system. Note that this is not - * the same as un-mounting the file system. - * - * @param[in] devname The name of the "generic" drive - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if devname is NULL - * @retval #OS_ERROR is the drive specified cannot be located - */ -int32 OS_rmfs(const char *devname); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Unmounts a mounted file system - * - * This function will unmount a drive from the file system and make all open file - * descriptors useless. - * - * @note Any open file descriptors referencing this file system should - * be closed prior to unmounting a drive - * - * @param[in] mountpoint The mount point to remove from #OS_mount - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if name is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if the absolute path given is too long - * @retval #OS_ERROR if the OS calls failed - */ -int32 OS_unmount(const char *mountpoint); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain number of blocks free - * - * Returns the number of free blocks in a volume - * - * @param[in] name The device/path to operate on - * - * @return Block count or appropriate error code, see @ref OSReturnCodes - * @retval #OS_INVALID_POINTER if name is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long - * @retval #OS_ERROR if the OS call failed - */ -int32 OS_fsBlocksFree(const char *name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtains the number of free bytes in a volume - * - * Returns the number of free bytes in a volume - * - * @note uses a 64 bit data type to support filesystems that - * are greater than 4 Gigabytes - * - * @param[in] name The device/path to operate on - * @param[out] bytes_free The number of free bytes - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if name is NULL - * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long - * @retval #OS_ERROR if the OS call failed - */ -int32 OS_fsBytesFree(const char *name, uint64 *bytes_free); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Checks the health of a file system and repairs it if necessary - * - * Checks the drives for inconsistencies and optionally also repairs it - * - * @note not all operating systems implement this function - * - * @param[in] name The device/path to operate on - * @param[in] repair Whether to also repair inconsistencies - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER Name is NULL - * @retval #OS_ERR_NOT_IMPLEMENTED @copybrief OS_ERR_NOT_IMPLEMENTED - * @retval #OS_ERROR @copybrief OS_ERROR - */ -int32 OS_chkfs(const char *name, bool repair); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtains the physical drive name associated with a mount point - * - * Returns the name of the physical volume associated with the drive, - * when given the OSAL mount point of the drive - * - * @param[out] PhysDriveName Buffer to store physical drive name - * @param[in] MountPoint OSAL mount point - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if either parameter is NULL - * @retval #OS_ERROR if the mountpoint could not be found - */ -int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Translates a OSAL Virtual file system path to a host Local path - * - * Translates a virtual path to an actual system path name - * - * @param[in] VirtualPath OSAL virtual path name - * @param[out] LocalPath Buffer to store native/translated path name - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if either parameter is NULL - */ -int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Returns information about the file system - * - * Returns information about the file system in an os_fsinfo_t. - * This includes the number of open files and file systems - * - * @param[out] filesys_info Buffer to store filesystem information - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if filesys_info is NULL - */ -int32 OS_GetFsInfo(os_fsinfo_t *filesys_info); -/**@}*/ - -/** @defgroup OSAPIShell OSAL Shell APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Executes the command and sends output to a file - * - * Takes a shell command in and writes the output of that command to the specified file - * The output file must be opened previously with write access (OS_WRITE_ONLY or OS_READ_WRITE). +/* + * BACKWARD COMPATIBILITY HEADER * - * @param[in] Cmd Command to pass to shell - * @param[in] filedes File to send output to. + * OSAPI headers have beens split into subsystem-based components. * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the command was not executed properly - * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid + * This header is now just a wrapper that includes the same general + * set of components that this file traditionally supplied. */ -int32 OS_ShellOutputToFile(const char *Cmd, osal_id_t filedes); - -/**@}*/ +#include "osapi-file.h" +#include "osapi-filesys.h" +#include "osapi-shell.h" #endif diff --git a/src/os/inc/osapi-os-loader.h b/src/os/inc/osapi-os-loader.h index 8aff625fc..433b1d1a7 100644 --- a/src/os/inc/osapi-os-loader.h +++ b/src/os/inc/osapi-os-loader.h @@ -30,207 +30,18 @@ #ifndef _osapi_loader_ #define _osapi_loader_ -/* -** Defines -*/ - -/** - * @brief Requests OS_ModuleLoad() to add the symbols to the global symbol table - * - * When supplied as the "flags" argument to OS_ModuleLoad(), this indicates - * that the symbols in the loaded module should be added to the global symbol - * table. This will make symbols in this library available for use when - * resolving symbols in future module loads. - * - * This is the default mode of operation for OS_ModuleLoad(). - * - * @note On some operating systems, use of this option may make it difficult - * to unload the module in the future, if the symbols are in use by other entities. - * - */ -#define OS_MODULE_FLAG_GLOBAL_SYMBOLS 0x00 - -/** - * @brief Requests OS_ModuleLoad() to keep the symbols local/private to this module - * - * When supplied as the "flags" argument to OS_ModuleLoad(), this indicates - * that the symbols in the loaded module should NOT be added to the global - * symbol table. This means the symbols in the loaded library will not available - * to for use by other modules. - * - * Use this option is recommended for cases where no other entities will need - * to reference symbols within this module. This helps ensure that the module - * can be more safely unloaded in the future, by preventing other modules from - * binding to it. It also helps reduce the likelihood of symbol name conflicts - * among modules. - * - * @note To look up symbols within a module loaded with this flag, use - * OS_SymbolLookupInModule() instead of OS_SymbolLookup(). Also note that - * references obtained using this method are not tracked by the OS; the - * application must ensure that all references obtained in this manner have - * been cleaned up/released before unloading the module. - */ -#define OS_MODULE_FLAG_LOCAL_SYMBOLS 0x01 +#ifdef OSAL_OMIT_DEPRECATED +#error This header header is deprecated +#endif /* -** Typedefs -*/ - -/** @brief OSAL module address properties */ -typedef struct -{ - uint32 valid; - uint32 flags; - cpuaddr code_address; - cpuaddr code_size; - cpuaddr data_address; - cpuaddr data_size; - cpuaddr bss_address; - cpuaddr bss_size; -} OS_module_address_t; - -/** @brief OSAL module properties */ -typedef struct -{ - cpuaddr entry_point; - cpuaddr host_module_id; - char filename[OS_MAX_PATH_LEN]; - char name[OS_MAX_API_NAME]; - OS_module_address_t addr; -} OS_module_prop_t; - -/** - * @brief Associates a single symbol name with a memory address. - * - * If the OS_STATIC_SYMBOL_TABLE feature is enabled, then - * an array of these structures should be provided by the - * application. When the application needs to find a symbol - * address, the static table will be checked in addition - * to (or instead of) the OS/library-provided lookup function. - * - * This static symbol allows systems that do not implement - * dynamic module loading to maintain the same semantics - * as dynamically loaded modules. - */ -typedef const struct -{ - const char *Name; - void (*Address)(void); - const char *Module; -} OS_static_symbol_record_t; - -/** @defgroup OSAPILoader OSAL Dynamic Loader and Symbol APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find the Address of a Symbol - * - * This calls to the OS dynamic symbol lookup implementation, - * and/or checks a static symbol table for a matching symbol name. - * - * The static table is intended to support embedded targets that do - * not have module loading capability or have it disabled. - * - * @param[out] symbol_address Set to the address of the symbol - * @param[in] symbol_name Name of the symbol to look up - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the symbol could not be found - * @retval #OS_INVALID_POINTER if one of the pointers passed in are NULL - */ -int32 OS_SymbolLookup(cpuaddr *symbol_address, const char *symbol_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find the Address of a Symbol within a module - * - * This is similar to OS_SymbolLookup() but for a specific module ID. - * This should be used to look up a symbol in a module that has been - * loaded with the #OS_MODULE_FLAG_LOCAL_SYMBOLS flag. - * - * @param[in] module_id Module ID that should contain the symbol - * @param[out] symbol_address Set to the address of the symbol - * @param[in] symbol_name Name of the symbol to look up - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the symbol could not be found - * @retval #OS_INVALID_POINTER if one of the pointers passed in are NULL - */ -int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const char *symbol_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Dumps the system symbol table to a file - * - * Dumps the system symbol table to the specified filename - * - * @param[in] filename File to write to - * @param[in] size_limit Maximum number of bytes to write - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_NOT_IMPLEMENTED @copybrief OS_ERR_NOT_IMPLEMENTED - * @retval #OS_ERROR if the symbol table could not be read or dumped - */ -int32 OS_SymbolTableDump(const char *filename, size_t size_limit); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Loads an object file - * - * Loads an object file into the running operating system - * - * The "flags" parameter may influence how the loaded module symbols are made - * available for use in the application. See #OS_MODULE_FLAG_LOCAL_SYMBOLS - * and #OS_MODULE_FLAG_GLOBAL_SYMBOLS for descriptions. - * - * @param[out] module_id Non-zero OSAL ID corresponding to the loaded module - * @param[in] module_name Name of module - * @param[in] filename File containing the object code to load - * @param[in] flags Options for the loaded module - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the module cannot be loaded - * @retval #OS_INVALID_POINTER if one of the parameters is NULL - * @retval #OS_ERR_NO_FREE_IDS if the module table is full - * @retval #OS_ERR_NAME_TAKEN if the name is in use - */ -int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *filename, uint32 flags); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Unloads the module file - * - * Unloads the module file from the running operating system - * - * @param[in] module_id OSAL ID of the previously the loaded module - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERROR if the module is invalid or cannot be unloaded - */ -int32 OS_ModuleUnload(osal_id_t module_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain information about a module - * - * Returns information about the loadable module + * BACKWARD COMPATIBILITY HEADER * - * @param[in] module_id OSAL ID of the previously the loaded module - * @param[out] module_info Buffer to store module information + * OSAPI headers have beens split into subsystem-based components. * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the module id invalid - * @retval #OS_INVALID_POINTER if the pointer to the ModuleInfo structure is invalid + * This header is now just a wrapper that includes the same general + * set of components that this file traditionally supplied. */ -int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_info); -/**@}*/ +#include "osapi-module.h" #endif diff --git a/src/os/inc/osapi-os-net.h b/src/os/inc/osapi-os-net.h index 2283ef2d6..3b8c43b84 100644 --- a/src/os/inc/osapi-os-net.h +++ b/src/os/inc/osapi-os-net.h @@ -30,377 +30,20 @@ #ifndef _osapi_network_ #define _osapi_network_ -/* NOTE - osconfig.h may optionally specify the value for OS_SOCADDR_MAX_LEN */ -#include - -/* - * The absolute maximum size of a network address - * - * The actual size varies by address type. - * - * This definition should be large enough to capture the - * largest address supported on the system. The default - * value here should be suitable for many use-cases while - * still keeping the address structure size within reason. - * - * The user may also provide a tuned value through osconfig.h - */ -#ifndef OS_SOCKADDR_MAX_LEN -#define OS_SOCKADDR_MAX_LEN 28 +#ifdef OSAL_OMIT_DEPRECATED +#error This header header is deprecated #endif /* - * -------------------------------------------------------------------------------------- - * Sockets API Data Types - * - * These data types are defined regardless of whether or not networking is compiled-in - * - * They are local to OSAL, they do not directly map to the library-provided types, and - * they do not occupy any space in the executable - * -------------------------------------------------------------------------------------- - */ - -/** @brief Socket domain */ -typedef enum -{ - OS_SocketDomain_INVALID, /**< @brief Invalid */ - OS_SocketDomain_INET, /**< @brief IPv4 address family, most commonly used) */ - OS_SocketDomain_INET6, /**< @brief IPv6 address family, depends on OS/network stack support */ - OS_SocketDomain_MAX /**< @brief Maximum */ -} OS_SocketDomain_t; - -/** @brief Socket type */ -typedef enum -{ - OS_SocketType_INVALID, /**< @brief Invalid */ - OS_SocketType_DATAGRAM, /**< @brief A connectionless, message-oriented socket */ - OS_SocketType_STREAM, /**< @brief A stream-oriented socket with the concept of a connection */ - OS_SocketType_MAX /**< @brief Maximum */ -} OS_SocketType_t; - -/** - * @brief Storage buffer for generic network address - * - * This is a union type that helps to ensure a minimum - * alignment value for the data storage, such that it can - * be cast to the system-specific type without - * increasing alignment requirements. - */ -typedef union -{ - uint8 Buffer[OS_SOCKADDR_MAX_LEN]; /**< @brief Ensures length of at least OS_SOCKADDR_MAX_LEN */ - uint32 AlignU32; /**< @brief Ensures uint32 alignment */ - void * AlignPtr; /**< @brief Ensures pointer alignment */ -} OS_SockAddrData_t; - -/** - * @brief Encapsulates a generic network address - * - * This is just an abstract buffer type that holds a network address. - * It is allocated for the worst-case size defined by OS_SOCKADDR_MAX_LEN, - * and the real size is stored within. - */ -typedef struct -{ - size_t ActualLength; /**< @brief Length of the actual address data */ - OS_SockAddrData_t AddrData; /**< @brief Abstract Address data */ -} OS_SockAddr_t; - -/** - * @brief Encapsulates socket properties - * - * This is for consistency with other OSAL resource types. - * Currently no extra properties are exposed here but this - * could change in a future revision of OSAL as needed. - */ -typedef struct -{ - char name[OS_MAX_API_NAME]; /**< @brief Name of the socket */ - osal_id_t creator; /**< @brief OSAL TaskID which opened the socket */ -} OS_socket_prop_t; - -/** - * @defgroup OSAPISocketAddr OSAL Socket Address APIs - * - * These functions provide a means to manipulate network addresses in a manner that - * is (mostly) agnostic to the actual network address type. - * - * Every network address should be representable as a string (i.e. dotted decimal IP, etc). - * This can serve as a the "common denominator" to all address types. - * - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Initialize a socket address structure to hold an address of the given family - * - * The address is set to a suitable default value for the family. - * - * @param[out] Addr The address buffer to initialize - * @param[in] Domain The address family - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Get a string representation of a network host address - * - * The specific format of the output string depends on the address family. - * - * This string should be suitable to pass back into OS_SocketAddrFromString() - * which should recreate the same network address, and it should also - * be meaningful to a user of printed or logged as a C string. - * - * @note For IPv4, this would typically be the dotted-decimal format (X.X.X.X). - * - * @param[out] buffer Buffer to hold the output string - * @param[in] buflen Maximum length of the output string - * @param[in] Addr The network address buffer to convert - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Addr); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Set a network host address from a string representation - * - * The specific format of the output string depends on the address family. - * - * The address structure should have been previously initialized using - * OS_SocketAddrInit() to set the address family type. - * - * @note For IPv4, this would typically be the dotted-decimal format (X.X.X.X). - * It is up to the discretion of the underlying implementation whether - * to accept hostnames, as this depends on the availability of DNS services. - * Since many embedded deployments do not have name services, this should - * not be relied upon. - * - * @param[out] Addr The address buffer to initialize - * @param[in] string The string to initialize the address from. - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketAddrFromString(OS_SockAddr_t *Addr, const char *string); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Get the port number of a network address - * - * For network prototcols that have the concept of a port number (such - * as TCP/IP and UDP/IP) this function gets the port number from the - * address structure. - * - * @param[out] PortNum Buffer to store the port number - * @param[in] Addr The network address buffer - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketAddrGetPort(uint16 *PortNum, const OS_SockAddr_t *Addr); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Set the port number of a network address - * - * For network prototcols that have the concept of a port number (such - * as TCP/IP and UDP/IP) this function sets the port number from the - * address structure. - * - * @param[in] PortNum The port number to set - * @param[out] Addr The network address buffer - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketAddrSetPort(OS_SockAddr_t *Addr, uint16 PortNum); -/**@}*/ - -/** - * @defgroup OSALAPISocket OSAL Socket Management APIs + * BACKWARD COMPATIBILITY HEADER * - * These functions are loosely related to the BSD Sockets API but made to be - * more consistent with other OSAL API functions. That is, they operate on - * OSAL IDs (32-bit opaque number values) and return an OSAL error code. + * OSAPI headers have beens split into subsystem-based components. * - * OSAL Socket IDs are very closely related to File IDs and share the same ID - * number space. Additionally, the file OS_read() / OS_write() / OS_close() - * calls also work on sockets. - * - * Note that all of functions may return #OS_ERR_NOT_IMPLEMENTED if network support - * is not configured at compile time. - * - * @{ - */ - -/** - * @brief Opens a socket. - * - * A new, unconnected and unbound socket is allocated of the given domain and type. - * - * @param[out] sock_id Buffer to hold the non-zero OSAL ID - * @param[in] Domain The domain / address family of the socket (INET or INET6, etc) - * @param[in] Type The type of the socket (STREAM or DATAGRAM) - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_t Type); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Binds a socket to a given local address. - * - * The specified socket will be bound to the local address and port, if available. - * - * If the socket is connectionless, then it only binds to the local address. - * - * If the socket is connection-oriented (stream), then this will also put the - * socket into a listening state for incoming connections at the local address. - * - * @param[in] sock_id The socket ID - * @param[in] Addr The local address to bind to - * - * @return Execution status, see @ref OSReturnCodes + * This header is now just a wrapper that includes the same general + * set of components that this file traditionally supplied. */ -int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr); +#include "osapi-sockets.h" +#include "osapi-network.h" -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Connects a socket to a given remote address. - * - * The socket will be connected to the remote address and port, if available. - * This only applies to stream-oriented sockets. Calling this on a datagram - * socket will return an error (these sockets should use SendTo/RecvFrom). - * - * @param[in] sock_id The socket ID - * @param[in] Addr The remote address to connect to - * @param[in] timeout The maximum amount of time to wait, or OS_PEND to wait forever - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 timeout); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Waits for and accept the next incoming connection on the given socket - * - * This is used for sockets operating in a "server" role. The socket must be - * a stream type (connection-oriented) and previously bound to a local address - * using OS_SocketBind(). This will block the caller up to the given timeout - * or until an incoming connection request occurs, whichever happens first. - * - * The new stream connection is then returned to the caller and the original - * server socket ID can be reused for the next connection. - * - * @param[in] sock_id The server socket ID, previously bound using OS_SocketBind() - * @param[out] connsock_id The connection socket, a new ID that can be read/written - * @param[in] Addr The remote address of the incoming connection - * @param[in] timeout The maximum amount of time to wait, or OS_PEND to wait forever - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t *Addr, int32 timeout); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Reads data from a message-oriented (datagram) socket - * - * If a message is already available on the socket, this should immediately return - * that data without blocking. Otherwise, it may block up to the given timeout. - * - * @param[in] sock_id The socket ID, previously bound using OS_SocketBind() - * @param[out] buffer Pointer to message data receive buffer - * @param[in] buflen The maximum length of the message data to receive - * @param[out] RemoteAddr Buffer to store the remote network address (may be NULL) - * @param[in] timeout The maximum amount of time to wait, or OS_PEND to wait forever - * - * @return Count of actual bytes received or error status, see @ref OSReturnCodes - */ -int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Sends data to a message-oriented (datagram) socket - * - * This sends data in a non-blocking mode. If the socket is not currently able to - * queue the message, such as if its outbound buffer is full, then this returns - * an error code. - * - * @param[in] sock_id The socket ID, which must be of the datagram type - * @param[in] buffer Pointer to message data to send - * @param[in] buflen The length of the message data to send - * @param[in] RemoteAddr Buffer containing the remote network address to send to - * - * @return Count of actual bytes sent or error status, see @ref OSReturnCodes - */ -int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Gets an OSAL ID from a given name - * - * @note OSAL Sockets use generated names according to the address and type. - * - * @sa OS_SocketGetInfo() - * - * @param[out] sock_id Buffer to hold result - * @param[in] sock_name Name of socket to find - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER is id or name are NULL pointers - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table - */ -int32 OS_SocketGetIdByName(osal_id_t *sock_id, const char *sock_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Gets information about an OSAL Socket ID - * - * OSAL Sockets use generated names according to the address and type. - * This allows applications to find the name of a given socket. - * - * @param[in] sock_id The socket ID - * @param[out] sock_prop Buffer to hold socket information - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore - * @retval #OS_INVALID_POINTER if the count_prop pointer is null - */ -int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Gets the network ID of the local machine - * - * The ID is an implementation-defined value and may not be consistent - * in meaning across different platform types. - * - * @note This API may be removed in a future version of OSAL due to - * inconsistencies between platforms. - * - * @return The ID or fixed value of -1 if the host id could not be found. - * Note it is not possible to differentiate between error codes and valid - * network IDs here. It is assumed, however, that -1 is never a valid ID. - */ -int32 OS_NetworkGetID(void); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Gets the local machine network host name - * - * If configured in the underlying network stack, - * this function retrieves the local hostname of the system. - * - * @param[out] host_name Buffer to hold name information - * @param[in] name_len Maximum length of host name buffer - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_NetworkGetHostName(char *host_name, size_t name_len); -/**@}*/ #endif diff --git a/src/os/inc/osapi-os-timer.h b/src/os/inc/osapi-os-timer.h index 1dff895e1..30535bc53 100644 --- a/src/os/inc/osapi-os-timer.h +++ b/src/os/inc/osapi-os-timer.h @@ -30,331 +30,20 @@ #ifndef _osapi_timer_ #define _osapi_timer_ -/* -** Typedefs -*/ -typedef void (*OS_TimerCallback_t)(osal_id_t timer_id); /**< @brief Timer callback */ -typedef uint32 (*OS_TimerSync_t)(osal_id_t timer_id); /**< @brief Timer sync */ - -/** @brief Timer properties */ -typedef struct -{ - char name[OS_MAX_API_NAME]; - osal_id_t creator; - uint32 start_time; - uint32 interval_time; - uint32 accuracy; - -} OS_timer_prop_t; - -/** @brief Time base properties */ -typedef struct -{ - char name[OS_MAX_API_NAME]; - osal_id_t creator; - uint32 nominal_interval_time; - uint32 freerun_time; - uint32 accuracy; -} OS_timebase_prop_t; - -/** @defgroup OSAPITimer OSAL Timer APIs - * @{ - */ - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Create an abstract Time Base resource - * - * An OSAL time base is an abstraction of a "timer tick" that can, in turn, be - * used for measurement of elapsed time between events. - * - * Time bases can be simulated by the operating system using the OS kernel-provided - * timing facilities, or based on a hardware timing source if provided by the BSP. - * - * A time base object has a servicing task associated with it, that runs at elevated - * priority and will thereby interrupt user-level tasks when timing ticks occur. - * - * If the external_sync function is passed as NULL, the operating system kernel - * timing resources will be utilized for a simulated timer tick. - * - * If the external_sync function is not NULL, this should point to a BSP-provided - * function that will block the calling task until the next tick occurs. This - * can be used for synchronizing with hardware events. - * - * @note When provisioning a tunable RTOS kernel, such as RTEMS, the kernel should - * be configured to support at least (OS_MAX_TASKS + OS_MAX_TIMEBASES) threads, - * to account for the helper threads associated with time base objects. - * - * @param[out] timebase_id A non-zero ID corresponding to the timebase resource - * @param[in] timebase_name The name of the time base - * @param[in] external_sync A synchronization function for BSP hardware-based timer ticks - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_TimeBaseCreate(osal_id_t *timebase_id, const char *timebase_name, OS_TimerSync_t external_sync); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Sets the tick period for simulated time base objects - * - * This sets the actual tick period for timing ticks that are - * simulated by the RTOS kernel (i.e. the "external_sync" parameter - * on the call to OS_TimeBaseCreate() is NULL). - * - * The RTOS will be configured to wake up the helper thread at the - * requested interval. - * - * This function has no effect for time bases that are using - * a BSP-provided external_sync function. - * - * @param[in] timebase_id The timebase resource to configure - * @param[in] start_time The amount of delay for the first tick, in microseconds. - * @param[in] interval_time The amount of delay between ticks, in microseconds. - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_TimeBaseSet(osal_id_t timebase_id, uint32 start_time, uint32 interval_time); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Deletes a time base object - * - * The helper task and any other resources associated with the time base - * abstraction will be freed. - * - * @param[in] timebase_id The timebase resource to delete - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_TimeBaseDelete(osal_id_t timebase_id); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Find the ID of an existing time base resource - * - * Given a time base name, find and output the ID associated with it. - * - * @param[out] timebase_id The timebase resource ID - * @param[in] timebase_name The name of the timebase resource to find - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if timebase_id or timebase_name are NULL pointers - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table - */ -int32 OS_TimeBaseGetIdByName(osal_id_t *timebase_id, const char *timebase_name); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Obtain information about a timebase resource - * - * Fills the buffer referred to by the timebase_prop parameter with - * relevant information about the time base resource. - * - * This function will pass back a pointer to structure that contains - * all of the relevant info( name and creator) about the specified timebase. - * - * @param[in] timebase_id The timebase resource ID - * @param[out] timebase_prop Buffer to store timebase properties - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid timebase - * @retval #OS_INVALID_POINTER if the timebase_prop pointer is null - */ -int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_prop); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Read the value of the timebase free run counter - * - * Poll the timer free-running time counter in a lightweight fashion. - * - * The free run count is a monotonically increasing value reflecting the - * total time elapsed since the timebase inception. Units are the - * same as the timebase itself, usually microseconds. - * - * Applications may quickly and efficiently calculate relative time - * differences by polling this value and subtracting the previous - * counter value. - * - * The absolute value of this counter is not relevant, because it - * will "roll over" after 2^32 units of time. For a timebase with - * microsecond units, this occurs approximately every 4294 seconds, - * or about 1.2 hours. - * - * @note To ensure consistency of results, the application should - * sample the value at a minimum of two times the roll over frequency, - * and calculate the difference between the consecutive samples. - * - * @param[in] timebase_id The timebase to operate on - * @param[out] freerun_val Buffer to store the free run counter - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid timebase - */ -int32 OS_TimeBaseGetFreeRun(osal_id_t timebase_id, uint32 *freerun_val); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Create a timer object - * - * A timer object is a resource that invokes the specified application-provided function - * upon timer expiration. Timers may be one-shot or periodic in nature. - * - * This function creates a dedicated (hidden) time base object to service this timer, - * which is created and deleted with the timer object itself. The internal time base - * is configured for an OS simulated timer tick at the same interval as the timer. - * - * @note clock_accuracy comes from the underlying OS tick value. The nearest integer - * microsecond value is returned, so may not be exact. - * - * @warning Depending on the OS, the callback_ptr function may be similar to an - * interrupt service routine. Calls that cause the code to block or require - * an application context (like sending events) are generally not supported. - * - * @param[out] timer_id The non-zero resource ID of the timer object - * @param[in] timer_name Name of the timer object - * @param[out] clock_accuracy Expected precision of the timer, in microseconds. This - * is the underlying tick value rounded to the nearest - * microsecond integer. - * @param[in] callback_ptr The function pointer of the timer callback or ISR that - * will be called by the timer. The user’s function is - * declared as follows: void timer_callback(uint32 timer_id) - * Where the timer_id is passed in to the function by the OSAL - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if any parameters are NULL - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_TAKEN if the name is already in use by another timer. - * @retval #OS_ERR_NO_FREE_IDS if all of the timers are already allocated. - * @retval #OS_TIMER_ERR_INVALID_ARGS if the callback pointer is zero. - * @retval #OS_TIMER_ERR_UNAVAILABLE if the timer cannot be created. - */ -int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *clock_accuracy, - OS_TimerCallback_t callback_ptr); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Add a timer object based on an existing TimeBase resource - * - * A timer object is a resource that invokes the specified application-provided function - * upon timer expiration. Timers may be one-shot or periodic in nature. - * - * This function uses an existing time base object to service this timer, which must - * exist prior to adding the timer. The precision of the timer is the same - * as that of the underlying time base object. Multiple timer objects can be - * created referring to a single time base object. - * - * This routine also uses a different callback function prototype from OS_TimerCreate(), - * allowing a single opaque argument to be passed to the callback routine. - * The OSAL implementation does not use this parameter, and may be set NULL. - * - * @warning Depending on the OS, the callback_ptr function may be similar to an - * interrupt service routine. Calls that cause the code to block or require - * an application context (like sending events) are generally not supported. - * - * @param[out] timer_id The non-zero resource ID of the timer object - * @param[in] timer_name Name of the timer object - * @param[in] timebase_id The time base resource to use as a reference - * @param[in] callback_ptr Application-provided function to invoke - * @param[in] callback_arg Opaque argument to pass to callback function - * - * @return Execution status, see @ref OSReturnCodes - */ -int32 OS_TimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_t timebase_id, OS_ArgCallback_t callback_ptr, - void *callback_arg); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Configures a periodic or one shot timer - * - * This function programs the timer with a start time and an optional interval time. - * The start time is the time in microseconds when the user callback function will be - * called. If the interval time is non-zero, the timer will be reprogrammed with that - * interval in microseconds to call the user callback function periodically. If the start - * time and interval time are zero, the function will return an error. - * - * For a "one-shot" timer, the start_time configures the - * expiration time, and the interval_time should be passed as - * zero to indicate the timer is not to be automatically reset. - * - * @note The resolution of the times specified is limited to the clock accuracy - * returned in the OS_TimerCreate call. If the times specified in the start_msec - * or interval_msec parameters are less than the accuracy, they will be rounded - * up to the accuracy of the timer. - * - * @param[in] timer_id The timer ID to operate on - * @param[in] start_time Time in microseconds to the first expiration - * @param[in] interval_time Time in microseconds between subsequent intervals, value - * of zero will only call the user callback function once - * after the start_msec time. - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the timer_id is not valid. - * @retval #OS_TIMER_ERR_INTERNAL if there was an error programming the OS timer. - * @retval #OS_ERROR if both start time and interval time are zero. - */ -int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time); - -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Deletes a timer resource - * - * The application callback associated with the timer will be stopped, - * and the resources freed for future use. - * - * @param[in] timer_id The timer ID to operate on - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the timer_id is invalid. - * @retval #OS_TIMER_ERR_INTERNAL if there was a problem deleting the timer in the host OS. - */ -int32 OS_TimerDelete(osal_id_t timer_id); +#ifdef OSAL_OMIT_DEPRECATED +#error This header header is deprecated +#endif -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Locate an existing timer resource by name - * - * Outputs the ID associated with the given timer, if it exists. +/* + * BACKWARD COMPATIBILITY HEADER * - * @param[out] timer_id The timer ID corresponding to the name - * @param[in] timer_name The timer name to find + * OSAPI headers have beens split into subsystem-based components. * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_INVALID_POINTER if timer_id or timer_name are NULL pointers - * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME - * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + * This header is now just a wrapper that includes the same general + * set of components that this file traditionally supplied. */ -int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name); +#include "osapi-timebase.h" +#include "osapi-timer.h" -/*-------------------------------------------------------------------------------------*/ -/** - * @brief Gets information about an existing timer - * - * This function takes timer_id, and looks it up in the OS table. It puts all of the - * information known about that timer into a structure pointer to by timer_prop. - * - * @param[in] timer_id The timer ID to operate on - * @param[out] timer_prop Buffer containing timer properties - * - creator: the OS task ID of the task that created this timer - * - name: the string name of the timer - * - start_time: the start time in microseconds, if any - * - interval_time: the interval time in microseconds, if any - * - accuracy: the accuracy of the timer in microseconds - * - * @return Execution status, see @ref OSReturnCodes - * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid timer - * @retval #OS_INVALID_POINTER if the timer_prop pointer is null - */ -int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop); -/**@}*/ #endif diff --git a/src/os/inc/osapi-printf.h b/src/os/inc/osapi-printf.h new file mode 100644 index 000000000..6e072419b --- /dev/null +++ b/src/os/inc/osapi-printf.h @@ -0,0 +1,71 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-printf.h + */ + +#ifndef OSAPI_PRINTF_H +#define OSAPI_PRINTF_H + +#include "osconfig.h" +#include "common_types.h" + +/** @defgroup OSAPIPrintf OSAL Printf APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Abstraction for the system printf() call + * + * This function abstracts out the printf type statements. This is + * useful for using OS- specific thats that will allow non-polled + * print statements for the real time systems. + * + * Operates in a manner similar to the printf() call defined by the standard C + * library and takes all the parameters and formatting options of printf. + * This abstraction may implement additional buffering, if necessary, + * to improve the real-time performance of the call. + * + * Strings (including terminator) longer than #OS_BUFFER_SIZE will be truncated. + * + * The output of this routine also may be dynamically enabled or disabled by + * the OS_printf_enable() and OS_printf_disable() calls, respectively. + * + * @param[in] string Format string, followed by additional arguments + */ +void OS_printf(const char *string, ...) OS_PRINTF(1, 2); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief This function disables the output from OS_printf. + */ +void OS_printf_disable(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief This function enables the output from OS_printf. + * + */ +void OS_printf_enable(void); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-queue.h b/src/os/inc/osapi-queue.h new file mode 100644 index 000000000..5f989ff80 --- /dev/null +++ b/src/os/inc/osapi-queue.h @@ -0,0 +1,167 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-queue.h + */ + +#ifndef OSAPI_QUEUE_H +#define OSAPI_QUEUE_H + +#include "osconfig.h" +#include "common_types.h" + +/** @brief OSAL queue properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; +} OS_queue_prop_t; + + +/** @defgroup OSAPIMsgQueue OSAL Message Queue APIs + * @{ + */ + +/** + * @brief Create a message queue + * + * This is the function used to create a queue in the operating system. + * Depending on the underlying operating system, the memory for the queue + * will be allocated automatically or allocated by the code that sets up + * the queue. Queue names must be unique; if the name already exists this + * function fails. Names cannot be NULL. + * + * + * @param[out] queue_id will be set to the non-zero ID of the newly-created resource + * @param[in] queue_name the name of the new resource to create + * @param[in] queue_depth the maximum depth of the queue + * @param[in] data_size the size of each entry in the queue + * @param[in] flags options for the queue (reserved for future use, pass as 0) + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if a pointer passed in is NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NO_FREE_IDS if there are already the max queues created + * @retval #OS_ERR_NAME_TAKEN if the name is already being used on another queue + * @retval #OS_QUEUE_INVALID_SIZE if the queue depth exceeds the limit + * @retval #OS_ERROR if the OS create call fails + */ +int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, + uint32 flags); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes the specified message queue. + * + * This is the function used to delete a queue in the operating system. + * This also frees the respective queue_id to be used again when another queue is created. + * + * @note If There are messages on the queue, they will be lost and any subsequent + * calls to QueueGet or QueuePut to this queue will result in errors + * + * @param[in] queue_id The object ID to delete + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in does not exist + * @retval #OS_ERROR if the OS call to delete the queue fails + */ +int32 OS_QueueDelete(osal_id_t queue_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Receive a message on a message queue + * + * If a message is pending, it is returned immediately. Otherwise the calling task + * will block until a message arrives or the timeout expires. + * + * @param[in] queue_id The object ID to operate on + * @param[out] data The buffer to store the received message + * @param[in] size The size of the data buffer + * @param[out] size_copied Set to the actual size of the message + * @param[in] timeout The maximum amount of time to block, or OS_PEND to wait forever + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the given ID does not exist + * @retval #OS_INVALID_POINTER if a pointer passed in is NULL + * @retval #OS_QUEUE_EMPTY if the Queue has no messages on it to be recieved + * @retval #OS_QUEUE_TIMEOUT if the timeout was OS_PEND and the time expired + * @retval #OS_QUEUE_INVALID_SIZE if the size copied from the queue was not correct + */ +int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copied, int32 timeout); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Put a message on a message queue. + * + * @param[in] queue_id The object ID to operate on + * @param[in] data The buffer containing the message to put + * @param[in] size The size of the data buffer + * @param[in] flags Currently reserved/unused, should be passed as 0 + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the queue id passed in is not a valid queue + * @retval #OS_INVALID_POINTER if the data pointer is NULL + * @retval #OS_QUEUE_FULL if the queue cannot accept another message + * @retval #OS_ERROR if the OS call returns an error + */ +int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flags); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find an existing queue ID by name + * + * This function tries to find a queue Id given the name of the queue. The + * id of the queue is passed back in queue_id. + * + * @param[out] queue_id will be set to the ID of the existing resource + * @param[in] queue_name the name of the existing resource to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if the name or id pointers are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND the name was not found in the table + */ +int32 OS_QueueGetIdByName(osal_id_t *queue_id, const char *queue_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Fill a property object buffer with details regarding the resource + * + * This function will pass back a pointer to structure that contains + * all of the relevant info (name and creator) about the specified queue. + * + * @param[in] queue_id The object ID to operate on + * @param[out] queue_prop The property object buffer to fill + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if queue_prop is NULL + * @retval #OS_ERR_INVALID_ID if the ID given is not a valid queue + */ +int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-select.h b/src/os/inc/osapi-select.h new file mode 100644 index 000000000..fefc18cd0 --- /dev/null +++ b/src/os/inc/osapi-select.h @@ -0,0 +1,157 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-select.h + */ + +#ifndef OSAPI_SELECT_H +#define OSAPI_SELECT_H + +#include "osconfig.h" +#include "common_types.h" + +/** + * @brief An abstract structure capable of holding several OSAL IDs + * + * This is part of the select API and is manipulated using the + * related API calls. It should not be modified directly by applications. + * + * @sa OS_SelectFdZero(), OS_SelectFdAdd(), OS_SelectFdClear(), OS_SelectFdIsSet() + */ +typedef struct +{ + uint8 object_ids[(OS_MAX_NUM_OPEN_FILES + 7) / 8]; +} OS_FdSet; + +/** + * @brief For the OS_SelectSingle() function's in/out StateFlags parameter, + * the state(s) of the stream and the result of the select is a combination + * of one or more of these states. + * + * @sa OS_SelectSingle() + */ +typedef enum +{ + OS_STREAM_STATE_BOUND = 0x01, /**< @brief whether the stream is bound */ + OS_STREAM_STATE_CONNECTED = 0x02, /**< @brief whether the stream is connected */ + OS_STREAM_STATE_READABLE = 0x04, /**< @brief whether the stream is readable */ + OS_STREAM_STATE_WRITABLE = 0x08, /**< @brief whether the stream is writable */ +} OS_StreamState_t; + +/** @defgroup OSAPISelect OSAL Select APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Wait for events across multiple file handles + * + * Wait for any of the given sets of IDs to be become readable or writable + * + * This function will block until any of the following occurs: + * - At least one OSAL ID in the ReadSet is readable + * - At least one OSAL ID in the WriteSet is writable + * - The timeout has elapsed + * + * The sets are input/output parameters. On entry, these indicate the + * file handle(s) to wait for. On exit, these are set to the actual + * file handle(s) that have activity. + * + * If the timeout occurs this returns an error code and all output sets + * should be empty. + * + * @note This does not lock or otherwise protect the file handles in the + * given sets. If a filehandle supplied via one of the FdSet arguments + * is closed or modified by another while this function is in progress, + * the results are undefined. Because of this limitation, it is recommended + * to use OS_SelectSingle() whenever possible. + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Wait for events on a single file handle + * + * Wait for a single OSAL filehandle to change state + * + * This function can be used to wait for a single OSAL stream ID + * to become readable or writable. On entry, the "StateFlags" + * parameter should be set to the desired state (OS_STREAM_STATE_READABLE + * and/or OS_STREAM_STATE_WRITABLE) and upon return the flags + * will be set to the state actually detected. + * + * As this operates on a single ID, the filehandle is protected + * during this call, such that another thread accessing the same + * handle will return an error. However, it is important to note that + * once the call returns then other threads may then also read/write + * and affect the state before the current thread can service it. + * + * To mitigate this risk the application may prefer to use + * the OS_TimedRead/OS_TimedWrite calls. + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SelectSingle(osal_id_t objid, uint32 *StateFlags, int32 msecs); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Clear a FdSet structure + * + * After this call the set will contain no OSAL IDs + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SelectFdZero(OS_FdSet *Set); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Add an ID to an FdSet structure + * + * After this call the set will contain the given OSAL ID + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SelectFdAdd(OS_FdSet *Set, osal_id_t objid); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Clear an ID from an FdSet structure + * + * After this call the set will no longer contain the given OSAL ID + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SelectFdClear(OS_FdSet *Set, osal_id_t objid); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Check if an FdSet structure contains a given ID + * + * @return Boolean set status + * @retval true FdSet structure contains ID + * @retval false FDSet structure does not contain ID + */ +bool OS_SelectFdIsSet(OS_FdSet *Set, osal_id_t objid); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-shell.h b/src/os/inc/osapi-shell.h new file mode 100644 index 000000000..914f0775f --- /dev/null +++ b/src/os/inc/osapi-shell.h @@ -0,0 +1,54 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-shell.h + */ + +#ifndef OSAPI_SHELL_H +#define OSAPI_SHELL_H + +#include "osconfig.h" +#include "common_types.h" + +/** @defgroup OSAPIShell OSAL Shell APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Executes the command and sends output to a file + * + * Takes a shell command in and writes the output of that command to the specified file + * The output file must be opened previously with write access (OS_WRITE_ONLY or OS_READ_WRITE). + * + * @param[in] Cmd Command to pass to shell + * @param[in] filedes File to send output to. + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if the command was not executed properly + * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid + */ +int32 OS_ShellOutputToFile(const char *Cmd, osal_id_t filedes); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-sockets.h b/src/os/inc/osapi-sockets.h new file mode 100644 index 000000000..743c6d810 --- /dev/null +++ b/src/os/inc/osapi-sockets.h @@ -0,0 +1,402 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-sockets.h + */ + +#ifndef OSAPI_SOCKETS_H +#define OSAPI_SOCKETS_H + +/* NOTE - osconfig.h may optionally specify the value for OS_SOCADDR_MAX_LEN */ +#include "osconfig.h" +#include "common_types.h" + +/* + * The absolute maximum size of a network address + * + * The actual size varies by address type. + * + * This definition should be large enough to capture the + * largest address supported on the system. The default + * value here should be suitable for many use-cases while + * still keeping the address structure size within reason. + * + * The user may also provide a tuned value through osconfig.h + */ +#ifndef OS_SOCKADDR_MAX_LEN +#define OS_SOCKADDR_MAX_LEN 28 +#endif + +/* + * -------------------------------------------------------------------------------------- + * Sockets API Data Types + * + * These data types are defined regardless of whether or not networking is compiled-in + * + * They are local to OSAL, they do not directly map to the library-provided types, and + * they do not occupy any space in the executable + * -------------------------------------------------------------------------------------- + */ + +/** @brief Socket domain */ +typedef enum +{ + OS_SocketDomain_INVALID, /**< @brief Invalid */ + OS_SocketDomain_INET, /**< @brief IPv4 address family, most commonly used) */ + OS_SocketDomain_INET6, /**< @brief IPv6 address family, depends on OS/network stack support */ + OS_SocketDomain_MAX /**< @brief Maximum */ +} OS_SocketDomain_t; + +/** @brief Socket type */ +typedef enum +{ + OS_SocketType_INVALID, /**< @brief Invalid */ + OS_SocketType_DATAGRAM, /**< @brief A connectionless, message-oriented socket */ + OS_SocketType_STREAM, /**< @brief A stream-oriented socket with the concept of a connection */ + OS_SocketType_MAX /**< @brief Maximum */ +} OS_SocketType_t; + +/** + * @brief Storage buffer for generic network address + * + * This is a union type that helps to ensure a minimum + * alignment value for the data storage, such that it can + * be cast to the system-specific type without + * increasing alignment requirements. + */ +typedef union +{ + uint8 Buffer[OS_SOCKADDR_MAX_LEN]; /**< @brief Ensures length of at least OS_SOCKADDR_MAX_LEN */ + uint32 AlignU32; /**< @brief Ensures uint32 alignment */ + void * AlignPtr; /**< @brief Ensures pointer alignment */ +} OS_SockAddrData_t; + +/** + * @brief Encapsulates a generic network address + * + * This is just an abstract buffer type that holds a network address. + * It is allocated for the worst-case size defined by OS_SOCKADDR_MAX_LEN, + * and the real size is stored within. + */ +typedef struct +{ + size_t ActualLength; /**< @brief Length of the actual address data */ + OS_SockAddrData_t AddrData; /**< @brief Abstract Address data */ +} OS_SockAddr_t; + +/** + * @brief Encapsulates socket properties + * + * This is for consistency with other OSAL resource types. + * Currently no extra properties are exposed here but this + * could change in a future revision of OSAL as needed. + */ +typedef struct +{ + char name[OS_MAX_API_NAME]; /**< @brief Name of the socket */ + osal_id_t creator; /**< @brief OSAL TaskID which opened the socket */ +} OS_socket_prop_t; + +/** + * @defgroup OSAPISocketAddr OSAL Socket Address APIs + * + * These functions provide a means to manipulate network addresses in a manner that + * is (mostly) agnostic to the actual network address type. + * + * Every network address should be representable as a string (i.e. dotted decimal IP, etc). + * This can serve as a the "common denominator" to all address types. + * + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Initialize a socket address structure to hold an address of the given family + * + * The address is set to a suitable default value for the family. + * + * @param[out] Addr The address buffer to initialize + * @param[in] Domain The address family + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get a string representation of a network host address + * + * The specific format of the output string depends on the address family. + * + * This string should be suitable to pass back into OS_SocketAddrFromString() + * which should recreate the same network address, and it should also + * be meaningful to a user of printed or logged as a C string. + * + * @note For IPv4, this would typically be the dotted-decimal format (X.X.X.X). + * + * @param[out] buffer Buffer to hold the output string + * @param[in] buflen Maximum length of the output string + * @param[in] Addr The network address buffer to convert + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Addr); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Set a network host address from a string representation + * + * The specific format of the output string depends on the address family. + * + * The address structure should have been previously initialized using + * OS_SocketAddrInit() to set the address family type. + * + * @note For IPv4, this would typically be the dotted-decimal format (X.X.X.X). + * It is up to the discretion of the underlying implementation whether + * to accept hostnames, as this depends on the availability of DNS services. + * Since many embedded deployments do not have name services, this should + * not be relied upon. + * + * @param[out] Addr The address buffer to initialize + * @param[in] string The string to initialize the address from. + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketAddrFromString(OS_SockAddr_t *Addr, const char *string); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get the port number of a network address + * + * For network prototcols that have the concept of a port number (such + * as TCP/IP and UDP/IP) this function gets the port number from the + * address structure. + * + * @param[out] PortNum Buffer to store the port number + * @param[in] Addr The network address buffer + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketAddrGetPort(uint16 *PortNum, const OS_SockAddr_t *Addr); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Set the port number of a network address + * + * For network prototcols that have the concept of a port number (such + * as TCP/IP and UDP/IP) this function sets the port number from the + * address structure. + * + * @param[in] PortNum The port number to set + * @param[out] Addr The network address buffer + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketAddrSetPort(OS_SockAddr_t *Addr, uint16 PortNum); +/**@}*/ + +/** + * @defgroup OSALAPISocket OSAL Socket Management APIs + * + * These functions are loosely related to the BSD Sockets API but made to be + * more consistent with other OSAL API functions. That is, they operate on + * OSAL IDs (32-bit opaque number values) and return an OSAL error code. + * + * OSAL Socket IDs are very closely related to File IDs and share the same ID + * number space. Additionally, the file OS_read() / OS_write() / OS_close() + * calls also work on sockets. + * + * Note that all of functions may return #OS_ERR_NOT_IMPLEMENTED if network support + * is not configured at compile time. + * + * @{ + */ + +/** + * @brief Opens a socket. + * + * A new, unconnected and unbound socket is allocated of the given domain and type. + * + * @param[out] sock_id Buffer to hold the non-zero OSAL ID + * @param[in] Domain The domain / address family of the socket (INET or INET6, etc) + * @param[in] Type The type of the socket (STREAM or DATAGRAM) + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_t Type); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Binds a socket to a given local address. + * + * The specified socket will be bound to the local address and port, if available. + * + * If the socket is connectionless, then it only binds to the local address. + * + * If the socket is connection-oriented (stream), then this will also put the + * socket into a listening state for incoming connections at the local address. + * + * @param[in] sock_id The socket ID + * @param[in] Addr The local address to bind to + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Connects a socket to a given remote address. + * + * The socket will be connected to the remote address and port, if available. + * This only applies to stream-oriented sockets. Calling this on a datagram + * socket will return an error (these sockets should use SendTo/RecvFrom). + * + * @param[in] sock_id The socket ID + * @param[in] Addr The remote address to connect to + * @param[in] timeout The maximum amount of time to wait, or OS_PEND to wait forever + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 timeout); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Waits for and accept the next incoming connection on the given socket + * + * This is used for sockets operating in a "server" role. The socket must be + * a stream type (connection-oriented) and previously bound to a local address + * using OS_SocketBind(). This will block the caller up to the given timeout + * or until an incoming connection request occurs, whichever happens first. + * + * The new stream connection is then returned to the caller and the original + * server socket ID can be reused for the next connection. + * + * @param[in] sock_id The server socket ID, previously bound using OS_SocketBind() + * @param[out] connsock_id The connection socket, a new ID that can be read/written + * @param[in] Addr The remote address of the incoming connection + * @param[in] timeout The maximum amount of time to wait, or OS_PEND to wait forever + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t *Addr, int32 timeout); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Reads data from a message-oriented (datagram) socket + * + * If a message is already available on the socket, this should immediately return + * that data without blocking. Otherwise, it may block up to the given timeout. + * + * @param[in] sock_id The socket ID, previously bound using OS_SocketBind() + * @param[out] buffer Pointer to message data receive buffer + * @param[in] buflen The maximum length of the message data to receive + * @param[out] RemoteAddr Buffer to store the remote network address (may be NULL) + * @param[in] timeout The maximum amount of time to wait, or OS_PEND to wait forever + * + * @return Count of actual bytes received or error status, see @ref OSReturnCodes + */ +int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Sends data to a message-oriented (datagram) socket + * + * This sends data in a non-blocking mode. If the socket is not currently able to + * queue the message, such as if its outbound buffer is full, then this returns + * an error code. + * + * @param[in] sock_id The socket ID, which must be of the datagram type + * @param[in] buffer Pointer to message data to send + * @param[in] buflen The length of the message data to send + * @param[in] RemoteAddr Buffer containing the remote network address to send to + * + * @return Count of actual bytes sent or error status, see @ref OSReturnCodes + */ +int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets an OSAL ID from a given name + * + * @note OSAL Sockets use generated names according to the address and type. + * + * @sa OS_SocketGetInfo() + * + * @param[out] sock_id Buffer to hold result + * @param[in] sock_name Name of socket to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER is id or name are NULL pointers + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + */ +int32 OS_SocketGetIdByName(osal_id_t *sock_id, const char *sock_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets information about an OSAL Socket ID + * + * OSAL Sockets use generated names according to the address and type. + * This allows applications to find the name of a given socket. + * + * @param[in] sock_id The socket ID + * @param[out] sock_prop Buffer to hold socket information + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore + * @retval #OS_INVALID_POINTER if the count_prop pointer is null + */ +int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets the network ID of the local machine + * + * The ID is an implementation-defined value and may not be consistent + * in meaning across different platform types. + * + * @note This API may be removed in a future version of OSAL due to + * inconsistencies between platforms. + * + * @return The ID or fixed value of -1 if the host id could not be found. + * Note it is not possible to differentiate between error codes and valid + * network IDs here. It is assumed, however, that -1 is never a valid ID. + */ +int32 OS_NetworkGetID(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets the local machine network host name + * + * If configured in the underlying network stack, + * this function retrieves the local hostname of the system. + * + * @param[out] host_name Buffer to hold name information + * @param[in] name_len Maximum length of host name buffer + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_NetworkGetHostName(char *host_name, size_t name_len); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-task.h b/src/os/inc/osapi-task.h new file mode 100644 index 000000000..acc7e1304 --- /dev/null +++ b/src/os/inc/osapi-task.h @@ -0,0 +1,251 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-task.h + */ + +#ifndef OSAPI_TASK_H +#define OSAPI_TASK_H + +#include "osconfig.h" +#include "common_types.h" + +/** @brief Upper limit for OSAL task priorities */ +#define OS_MAX_TASK_PRIORITY 255 + +/** @brief Floating point enabled state for a task */ +#define OS_FP_ENABLED 1 + +/** + * @brief Type to be used for OSAL task priorities. + * + * OSAL priorities are in reverse order, and range + * from 0 (highest; will preempt all other tasks) to + * 255 (lowest; will not preempt any other task). + */ +typedef uint8_t osal_priority_t; + +#define OSAL_PRIORITY_C(X) ((osal_priority_t) {X}) + +/** + * @brief Type to be used for OSAL stack pointer. + */ +typedef void *osal_stackptr_t; + +#define OSAL_STACKPTR_C(X) ((osal_stackptr_t) {X}) +#define OSAL_TASK_STACK_ALLOCATE OSAL_STACKPTR_C(NULL) + +/** @brief OSAL task properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; + size_t stack_size; + osal_priority_t priority; +} OS_task_prop_t; + +/* +** These typedefs are for the task entry point +*/ +typedef void osal_task; /**< @brief For task entry point */ +typedef osal_task((*osal_task_entry)(void)); /**< @brief For task entry point */ + +/** @defgroup OSAPITask OSAL Task APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Creates a task and starts running it. + * + * Creates a task and passes back the id of the task created. Task names must be unique; + * if the name already exists this function fails. Names cannot be NULL. + * + * @param[out] task_id will be set to the non-zero ID of the newly-created resource + * @param[in] task_name the name of the new resource to create + * @param[in] function_pointer the entry point of the new task + * @param[in] stack_pointer pointer to the stack for the task, or NULL + * to allocate a stack from the system memory heap + * @param[in] stack_size the size of the stack, or 0 to use a default stack size. + * @param[in] priority initial priority of the new task + * @param[in] flags initial options for the new task + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if any of the necessary pointers are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_INVALID_PRIORITY if the priority is bad + * @retval #OS_ERR_NO_FREE_IDS if there can be no more tasks created + * @retval #OS_ERR_NAME_TAKEN if the name specified is already used by a task + * @retval #OS_ERROR if an unspecified/other error occurs + */ +int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry function_pointer, + osal_stackptr_t stack_pointer, size_t stack_size, osal_priority_t priority, uint32 flags); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes the specified Task + * + * The task will be removed from the local tables. and the OS will + * be configured to stop executing the task at the next opportunity. + * + * @param[in] task_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the ID given to it is invalid + * @retval #OS_ERROR if the OS delete call fails + */ +int32 OS_TaskDelete(osal_id_t task_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Exits the calling task + * + * The calling thread is terminated. This function does not return. + */ +void OS_TaskExit(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Installs a handler for when the task is deleted. + * + * This function is used to install a callback that is called when the task is deleted. + * The callback is called when OS_TaskDelete is called with the task ID. A task delete + * handler is useful for cleaning up resources that a task creates, before the task is + * removed from the system. + * + * @param[in] function_pointer function to be called when task exits + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_TaskInstallDeleteHandler(osal_task_entry function_pointer); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Delay a task for specified amount of milliseconds + * + * Causes the current thread to be suspended from execution for the period of millisecond. + * + * @param[in] millisecond Amount of time to delay + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERROR if sleep fails or millisecond = 0 + */ +int32 OS_TaskDelay(uint32 millisecond); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Sets the given task to a new priority + * + * @param[in] task_id The object ID to operate on + * + * @param[in] new_priority Set the new priority + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the ID passed to it is invalid + * @retval #OS_ERR_INVALID_PRIORITY if the priority is greater than the max allowed + * @retval #OS_ERROR if the OS call to change the priority fails + */ +int32 OS_TaskSetPriority(osal_id_t task_id, osal_priority_t new_priority); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obsolete + * @deprecated Explicit registration call no longer needed + * + * Obsolete function retained for compatibility purposes. + * Does Nothing in the current implementation. + * + * @return #OS_SUCCESS (always), see @ref OSReturnCodes + */ +int32 OS_TaskRegister(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain the task id of the calling task + * + * This function returns the task id of the calling task + * + * @return Task ID, or zero if the operation failed (zero is never a valid task ID) + */ +osal_id_t OS_TaskGetId(void); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find an existing task ID by name + * + * This function tries to find a task Id given the name of a task + * + * @param[out] task_id will be set to the ID of the existing resource + * @param[in] task_name the name of the existing resource to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if the pointers passed in are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name wasn't found in the table + */ +int32 OS_TaskGetIdByName(osal_id_t *task_id, const char *task_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Fill a property object buffer with details regarding the resource + * + * This function will pass back a pointer to structure that contains + * all of the relevant info (creator, stack size, priority, name) about the + * specified task. + * + * @param[in] task_id The object ID to operate on + * @param[out] task_prop The property object buffer to fill + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the ID passed to it is invalid + * @retval #OS_INVALID_POINTER if the task_prop pointer is NULL + */ +int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Reverse-lookup the OSAL task ID from an operating system ID + * + * This provides a method by which an external entity may find the OSAL task + * ID corresponding to a system-defined identifier (e.g. TASK_ID, pthread_t, rtems_id, etc). + * + * Normally OSAL does not expose the underlying OS-specific values to the application, + * but in some circumstances, such as exception handling, the OS may provide this information + * directly to a BSP handler outside of the normal OSAL API. + * + * @param[out] task_id The buffer where the task id output is stored + * @param[in] sysdata Pointer to the system-provided identification data + * @param[in] sysdata_size Size of the system-provided identification data + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + */ +int32 OS_TaskFindIdBySystemData(osal_id_t *task_id, const void *sysdata, size_t sysdata_size); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-timebase.h b/src/os/inc/osapi-timebase.h new file mode 100644 index 000000000..ec038053e --- /dev/null +++ b/src/os/inc/osapi-timebase.h @@ -0,0 +1,188 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-timebase.h + */ + +#ifndef OSAPI_TIMEBASE_H +#define OSAPI_TIMEBASE_H + +#include "osconfig.h" +#include "common_types.h" + +/* +** Typedefs +*/ +typedef uint32 (*OS_TimerSync_t)(osal_id_t timer_id); /**< @brief Timer sync */ + +/** @brief Time base properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; + uint32 nominal_interval_time; + uint32 freerun_time; + uint32 accuracy; +} OS_timebase_prop_t; + +/** @defgroup OSAPITimebase OSAL Time Base APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Create an abstract Time Base resource + * + * An OSAL time base is an abstraction of a "timer tick" that can, in turn, be + * used for measurement of elapsed time between events. + * + * Time bases can be simulated by the operating system using the OS kernel-provided + * timing facilities, or based on a hardware timing source if provided by the BSP. + * + * A time base object has a servicing task associated with it, that runs at elevated + * priority and will thereby interrupt user-level tasks when timing ticks occur. + * + * If the external_sync function is passed as NULL, the operating system kernel + * timing resources will be utilized for a simulated timer tick. + * + * If the external_sync function is not NULL, this should point to a BSP-provided + * function that will block the calling task until the next tick occurs. This + * can be used for synchronizing with hardware events. + * + * @note When provisioning a tunable RTOS kernel, such as RTEMS, the kernel should + * be configured to support at least (OS_MAX_TASKS + OS_MAX_TIMEBASES) threads, + * to account for the helper threads associated with time base objects. + * + * @param[out] timebase_id A non-zero ID corresponding to the timebase resource + * @param[in] timebase_name The name of the time base + * @param[in] external_sync A synchronization function for BSP hardware-based timer ticks + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_TimeBaseCreate(osal_id_t *timebase_id, const char *timebase_name, OS_TimerSync_t external_sync); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Sets the tick period for simulated time base objects + * + * This sets the actual tick period for timing ticks that are + * simulated by the RTOS kernel (i.e. the "external_sync" parameter + * on the call to OS_TimeBaseCreate() is NULL). + * + * The RTOS will be configured to wake up the helper thread at the + * requested interval. + * + * This function has no effect for time bases that are using + * a BSP-provided external_sync function. + * + * @param[in] timebase_id The timebase resource to configure + * @param[in] start_time The amount of delay for the first tick, in microseconds. + * @param[in] interval_time The amount of delay between ticks, in microseconds. + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_TimeBaseSet(osal_id_t timebase_id, uint32 start_time, uint32 interval_time); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes a time base object + * + * The helper task and any other resources associated with the time base + * abstraction will be freed. + * + * @param[in] timebase_id The timebase resource to delete + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_TimeBaseDelete(osal_id_t timebase_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find the ID of an existing time base resource + * + * Given a time base name, find and output the ID associated with it. + * + * @param[out] timebase_id The timebase resource ID + * @param[in] timebase_name The name of the timebase resource to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if timebase_id or timebase_name are NULL pointers + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + */ +int32 OS_TimeBaseGetIdByName(osal_id_t *timebase_id, const char *timebase_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtain information about a timebase resource + * + * Fills the buffer referred to by the timebase_prop parameter with + * relevant information about the time base resource. + * + * This function will pass back a pointer to structure that contains + * all of the relevant info( name and creator) about the specified timebase. + * + * @param[in] timebase_id The timebase resource ID + * @param[out] timebase_prop Buffer to store timebase properties + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid timebase + * @retval #OS_INVALID_POINTER if the timebase_prop pointer is null + */ +int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_prop); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Read the value of the timebase free run counter + * + * Poll the timer free-running time counter in a lightweight fashion. + * + * The free run count is a monotonically increasing value reflecting the + * total time elapsed since the timebase inception. Units are the + * same as the timebase itself, usually microseconds. + * + * Applications may quickly and efficiently calculate relative time + * differences by polling this value and subtracting the previous + * counter value. + * + * The absolute value of this counter is not relevant, because it + * will "roll over" after 2^32 units of time. For a timebase with + * microsecond units, this occurs approximately every 4294 seconds, + * or about 1.2 hours. + * + * @note To ensure consistency of results, the application should + * sample the value at a minimum of two times the roll over frequency, + * and calculate the difference between the consecutive samples. + * + * @param[in] timebase_id The timebase to operate on + * @param[out] freerun_val Buffer to store the free run counter + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid timebase + */ +int32 OS_TimeBaseGetFreeRun(osal_id_t timebase_id, uint32 *freerun_val); + +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-timer.h b/src/os/inc/osapi-timer.h new file mode 100644 index 000000000..785364eb4 --- /dev/null +++ b/src/os/inc/osapi-timer.h @@ -0,0 +1,211 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-timer.h + */ + +#ifndef OSAPI_TIMER_H +#define OSAPI_TIMER_H + +#include "osconfig.h" +#include "common_types.h" + +/* +** Typedefs +*/ +typedef void (*OS_TimerCallback_t)(osal_id_t timer_id); /**< @brief Timer callback */ + +/** @brief Timer properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; + uint32 start_time; + uint32 interval_time; + uint32 accuracy; + +} OS_timer_prop_t; + +/** @defgroup OSAPITimer OSAL Timer APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Create a timer object + * + * A timer object is a resource that invokes the specified application-provided function + * upon timer expiration. Timers may be one-shot or periodic in nature. + * + * This function creates a dedicated (hidden) time base object to service this timer, + * which is created and deleted with the timer object itself. The internal time base + * is configured for an OS simulated timer tick at the same interval as the timer. + * + * @note clock_accuracy comes from the underlying OS tick value. The nearest integer + * microsecond value is returned, so may not be exact. + * + * @warning Depending on the OS, the callback_ptr function may be similar to an + * interrupt service routine. Calls that cause the code to block or require + * an application context (like sending events) are generally not supported. + * + * @param[out] timer_id The non-zero resource ID of the timer object + * @param[in] timer_name Name of the timer object + * @param[out] clock_accuracy Expected precision of the timer, in microseconds. This + * is the underlying tick value rounded to the nearest + * microsecond integer. + * @param[in] callback_ptr The function pointer of the timer callback or ISR that + * will be called by the timer. The user’s function is + * declared as follows: void timer_callback(uint32 timer_id) + * Where the timer_id is passed in to the function by the OSAL + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if any parameters are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_TAKEN if the name is already in use by another timer. + * @retval #OS_ERR_NO_FREE_IDS if all of the timers are already allocated. + * @retval #OS_TIMER_ERR_INVALID_ARGS if the callback pointer is zero. + * @retval #OS_TIMER_ERR_UNAVAILABLE if the timer cannot be created. + */ +int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *clock_accuracy, + OS_TimerCallback_t callback_ptr); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Add a timer object based on an existing TimeBase resource + * + * A timer object is a resource that invokes the specified application-provided function + * upon timer expiration. Timers may be one-shot or periodic in nature. + * + * This function uses an existing time base object to service this timer, which must + * exist prior to adding the timer. The precision of the timer is the same + * as that of the underlying time base object. Multiple timer objects can be + * created referring to a single time base object. + * + * This routine also uses a different callback function prototype from OS_TimerCreate(), + * allowing a single opaque argument to be passed to the callback routine. + * The OSAL implementation does not use this parameter, and may be set NULL. + * + * @warning Depending on the OS, the callback_ptr function may be similar to an + * interrupt service routine. Calls that cause the code to block or require + * an application context (like sending events) are generally not supported. + * + * @param[out] timer_id The non-zero resource ID of the timer object + * @param[in] timer_name Name of the timer object + * @param[in] timebase_id The time base resource to use as a reference + * @param[in] callback_ptr Application-provided function to invoke + * @param[in] callback_arg Opaque argument to pass to callback function + * + * @return Execution status, see @ref OSReturnCodes + */ +int32 OS_TimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_t timebase_id, OS_ArgCallback_t callback_ptr, + void *callback_arg); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Configures a periodic or one shot timer + * + * This function programs the timer with a start time and an optional interval time. + * The start time is the time in microseconds when the user callback function will be + * called. If the interval time is non-zero, the timer will be reprogrammed with that + * interval in microseconds to call the user callback function periodically. If the start + * time and interval time are zero, the function will return an error. + * + * For a "one-shot" timer, the start_time configures the + * expiration time, and the interval_time should be passed as + * zero to indicate the timer is not to be automatically reset. + * + * @note The resolution of the times specified is limited to the clock accuracy + * returned in the OS_TimerCreate call. If the times specified in the start_msec + * or interval_msec parameters are less than the accuracy, they will be rounded + * up to the accuracy of the timer. + * + * @param[in] timer_id The timer ID to operate on + * @param[in] start_time Time in microseconds to the first expiration + * @param[in] interval_time Time in microseconds between subsequent intervals, value + * of zero will only call the user callback function once + * after the start_msec time. + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the timer_id is not valid. + * @retval #OS_TIMER_ERR_INTERNAL if there was an error programming the OS timer. + * @retval #OS_ERROR if both start time and interval time are zero. + */ +int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes a timer resource + * + * The application callback associated with the timer will be stopped, + * and the resources freed for future use. + * + * @param[in] timer_id The timer ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the timer_id is invalid. + * @retval #OS_TIMER_ERR_INTERNAL if there was a problem deleting the timer in the host OS. + */ +int32 OS_TimerDelete(osal_id_t timer_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Locate an existing timer resource by name + * + * Outputs the ID associated with the given timer, if it exists. + * + * @param[out] timer_id The timer ID corresponding to the name + * @param[in] timer_name The timer name to find + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if timer_id or timer_name are NULL pointers + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + */ +int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets information about an existing timer + * + * This function takes timer_id, and looks it up in the OS table. It puts all of the + * information known about that timer into a structure pointer to by timer_prop. + * + * @param[in] timer_id The timer ID to operate on + * @param[out] timer_prop Buffer containing timer properties + * - creator: the OS task ID of the task that created this timer + * - name: the string name of the timer + * - start_time: the start time in microseconds, if any + * - interval_time: the interval time in microseconds, if any + * - accuracy: the accuracy of the timer in microseconds + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid timer + * @retval #OS_INVALID_POINTER if the timer_prop pointer is null + */ +int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop); +/**@}*/ + +#endif diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index 885439130..a8760a49c 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -24,8 +24,8 @@ * See @ref cfsversions for version and build number and description * */ -#ifndef _osapi_version_h_ -#define _osapi_version_h_ +#ifndef OSAPI_VERSION_H +#define OSAPI_VERSION_H /* * Development Build Macro Definitions @@ -70,7 +70,7 @@ OSAL 4.1 is present. */ #define OSAL_API_VERSION ((OS_MAJOR_VERSION * 10000) + (OS_MINOR_VERSION * 100) + OS_REVISION) -#endif /* _osapi_version_h_ */ +#endif /* OSAPI_VERSION_H */ /************************/ /* End of File Comment */ diff --git a/src/os/inc/osapi.h b/src/os/inc/osapi.h index 46ac687a0..a45e94be5 100644 --- a/src/os/inc/osapi.h +++ b/src/os/inc/osapi.h @@ -27,8 +27,8 @@ * for the OS Abstraction Layer, Core OS module */ -#ifndef _osapi_ -#define _osapi_ +#ifndef OSAPI_H +#define OSAPI_H /* * Note - the "osapi-os-filesys.h" file previously included these system headers @@ -46,59 +46,10 @@ */ #include #include +#include #include "common_types.h" -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @defgroup OSReturnCodes OSAL Return Code Defines - * @{ - */ -#define OS_SUCCESS (0) /**< @brief Successful execution */ -#define OS_ERROR (-1) /**< @brief Failed execution */ -#define OS_INVALID_POINTER (-2) /**< @brief Invalid pointer */ -#define OS_ERROR_ADDRESS_MISALIGNED (-3) /**< @brief Address misalignment */ -#define OS_ERROR_TIMEOUT (-4) /**< @brief Error timeout */ -#define OS_INVALID_INT_NUM (-5) /**< @brief Invalid Interrupt number */ -#define OS_SEM_FAILURE (-6) /**< @brief Semaphore failure */ -#define OS_SEM_TIMEOUT (-7) /**< @brief Semaphore timeout */ -#define OS_QUEUE_EMPTY (-8) /**< @brief Queue empty */ -#define OS_QUEUE_FULL (-9) /**< @brief Queue full */ -#define OS_QUEUE_TIMEOUT (-10) /**< @brief Queue timeout */ -#define OS_QUEUE_INVALID_SIZE (-11) /**< @brief Queue invalid size */ -#define OS_QUEUE_ID_ERROR (-12) /**< @brief Queue ID error */ -#define OS_ERR_NAME_TOO_LONG (-13) /**< @brief name length including null terminator greater than #OS_MAX_API_NAME */ -#define OS_ERR_NO_FREE_IDS (-14) /**< @brief No free IDs */ -#define OS_ERR_NAME_TAKEN (-15) /**< @brief Name taken */ -#define OS_ERR_INVALID_ID (-16) /**< @brief Invalid ID */ -#define OS_ERR_NAME_NOT_FOUND (-17) /**< @brief Name not found */ -#define OS_ERR_SEM_NOT_FULL (-18) /**< @brief Semaphore not full */ -#define OS_ERR_INVALID_PRIORITY (-19) /**< @brief Invalid priority */ -#define OS_INVALID_SEM_VALUE (-20) /**< @brief Invalid semaphore value */ -#define OS_ERR_FILE (-27) /**< @brief File error */ -#define OS_ERR_NOT_IMPLEMENTED (-28) /**< @brief Not implemented */ -#define OS_TIMER_ERR_INVALID_ARGS (-29) /**< @brief Timer invalid arguments */ -#define OS_TIMER_ERR_TIMER_ID (-30) /**< @brief Timer ID error */ -#define OS_TIMER_ERR_UNAVAILABLE (-31) /**< @brief Timer unavailable */ -#define OS_TIMER_ERR_INTERNAL (-32) /**< @brief Timer internal error */ -#define OS_ERR_OBJECT_IN_USE (-33) /**< @brief Object in use */ -#define OS_ERR_BAD_ADDRESS (-34) /**< @brief Bad address */ -#define OS_ERR_INCORRECT_OBJ_STATE (-35) /**< @brief Incorrect object state */ -#define OS_ERR_INCORRECT_OBJ_TYPE (-36) /**< @brief Incorrect object type */ -#define OS_ERR_STREAM_DISCONNECTED (-37) /**< @brief Stream disconnected */ -#define OS_ERR_OPERATION_NOT_SUPPORTED (-38) /**< @brief Requested operation is not support on the supplied object(s) \ - */ -/**@}*/ - -/* -** Defines for Queue Timeout parameters -*/ -#define OS_PEND (-1) -#define OS_CHECK (0) - #include "osapi-version.h" /* @@ -109,11 +60,28 @@ extern "C" /* ** Include the OS API modules */ -#include "osapi-os-core.h" -#include "osapi-os-filesys.h" -#include "osapi-os-net.h" -#include "osapi-os-loader.h" -#include "osapi-os-timer.h" +#include "osapi-binsem.h" +#include "osapi-clock.h" +#include "osapi-common.h" +#include "osapi-constants.h" +#include "osapi-countsem.h" +#include "osapi-dir.h" +#include "osapi-error.h" +#include "osapi-file.h" +#include "osapi-filesys.h" +#include "osapi-heap.h" +#include "osapi-idmap.h" +#include "osapi-module.h" +#include "osapi-mutex.h" +#include "osapi-network.h" +#include "osapi-printf.h" +#include "osapi-queue.h" +#include "osapi-select.h" +#include "osapi-shell.h" +#include "osapi-sockets.h" +#include "osapi-task.h" +#include "osapi-timebase.h" +#include "osapi-timer.h" /* ****************************************************************************** @@ -122,6 +90,9 @@ extern "C" ***************************************************************************** */ +#include "osapi-bsp.h" + + #ifdef __cplusplus } #endif diff --git a/src/os/portable/os-impl-bsd-select.c b/src/os/portable/os-impl-bsd-select.c index afe500527..dbfb19622 100644 --- a/src/os/portable/os-impl-bsd-select.c +++ b/src/os/portable/os-impl-bsd-select.c @@ -42,7 +42,6 @@ #include #include -#include #include "os-impl-select.h" #include "os-shared-select.h" #include "os-shared-idmap.h" diff --git a/src/os/portable/os-impl-console-bsp.c b/src/os/portable/os-impl-console-bsp.c index fc3d8290b..c0ba15325 100644 --- a/src/os/portable/os-impl-console-bsp.c +++ b/src/os/portable/os-impl-console-bsp.c @@ -35,6 +35,8 @@ #include #include +#include "osapi-printf.h" + #include "bsp-impl.h" #include "os-impl-console.h" diff --git a/src/os/portable/os-impl-no-loader.c b/src/os/portable/os-impl-no-loader.c index dbed7b8e8..b576bff62 100644 --- a/src/os/portable/os-impl-no-loader.c +++ b/src/os/portable/os-impl-no-loader.c @@ -27,7 +27,6 @@ * for all calls. */ -#include #include "os-shared-module.h" /*---------------------------------------------------------------- diff --git a/src/os/portable/os-impl-no-network.c b/src/os/portable/os-impl-no-network.c index 30d725937..b25a6faf9 100644 --- a/src/os/portable/os-impl-no-network.c +++ b/src/os/portable/os-impl-no-network.c @@ -28,7 +28,6 @@ * */ -#include #include "os-shared-network.h" /**************************************************************************************** diff --git a/src/os/portable/os-impl-no-sockets.c b/src/os/portable/os-impl-no-sockets.c index b87bb3395..4ccc9a765 100644 --- a/src/os/portable/os-impl-no-sockets.c +++ b/src/os/portable/os-impl-no-sockets.c @@ -30,7 +30,7 @@ INCLUDE FILES ***************************************************************************************/ -#include +#include "osapi-sockets.h" #include "os-shared-sockets.h" /**************************************************************************************** diff --git a/src/os/portable/os-impl-no-symtab.c b/src/os/portable/os-impl-no-symtab.c index 3525d5b81..3af60dfa4 100644 --- a/src/os/portable/os-impl-no-symtab.c +++ b/src/os/portable/os-impl-no-symtab.c @@ -27,7 +27,7 @@ * for all calls. */ -#include +#include "osapi-module.h" #include "os-shared-module.h" /*---------------------------------------------------------------- diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index 611b5d2ea..cb8d7df96 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -41,6 +41,8 @@ * remove() * rename() */ + +#include #include #include diff --git a/src/os/portable/os-impl-posix-gettime.c b/src/os/portable/os-impl-posix-gettime.c index 670a18353..59175d0a0 100644 --- a/src/os/portable/os-impl-posix-gettime.c +++ b/src/os/portable/os-impl-posix-gettime.c @@ -47,7 +47,7 @@ #include #include -#include +#include "osapi-clock.h" #include "os-impl-gettime.h" #include "os-shared-clock.h" diff --git a/src/os/posix/inc/os-impl-binsem.h b/src/os/posix/inc/os-impl-binsem.h index 41bb54870..d55f3e165 100644 --- a/src/os/posix/inc/os-impl-binsem.h +++ b/src/os/posix/inc/os-impl-binsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_BINSEM_H_ -#define INCLUDE_OS_IMPL_BINSEM_H_ +#ifndef OS_IMPL_BINSEM_H +#define OS_IMPL_BINSEM_H -#include +#include "osconfig.h" #include #include @@ -44,4 +44,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_binsem_internal_record_t OS_impl_bin_sem_table[OS_MAX_BIN_SEMAPHORES]; -#endif /* INCLUDE_OS_IMPL_BINSEM_H_ */ +#endif /* OS_IMPL_BINSEM_H */ diff --git a/src/os/posix/inc/os-impl-console.h b/src/os/posix/inc/os-impl-console.h index 82a65ee28..eb92465e3 100644 --- a/src/os/posix/inc/os-impl-console.h +++ b/src/os/posix/inc/os-impl-console.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_OS_IMPL_CONSOLE_H_ -#define INCLUDE_OS_IMPL_CONSOLE_H_ +#ifndef OS_IMPL_CONSOLE_H +#define OS_IMPL_CONSOLE_H #include -#include +#include "osconfig.h" #include #include @@ -42,4 +42,4 @@ typedef struct extern OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; -#endif /* INCLUDE_OS_IMPL_CONSOLE_H_ */ +#endif /* OS_IMPL_CONSOLE_H */ diff --git a/src/os/posix/inc/os-impl-countsem.h b/src/os/posix/inc/os-impl-countsem.h index 9c8c2f5e6..d6ee39a75 100644 --- a/src/os/posix/inc/os-impl-countsem.h +++ b/src/os/posix/inc/os-impl-countsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_COUNTSEM_H_ -#define INCLUDE_OS_IMPL_COUNTSEM_H_ +#ifndef OS_IMPL_COUNTSEM_H +#define OS_IMPL_COUNTSEM_H -#include +#include "osconfig.h" #include typedef struct @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_countsem_internal_record_t OS_impl_count_sem_table[OS_MAX_COUNT_SEMAPHORES]; -#endif /* INCLUDE_OS_IMPL_COUNTSEM_H_ */ +#endif /* OS_IMPL_COUNTSEM_H */ diff --git a/src/os/posix/inc/os-impl-dirs.h b/src/os/posix/inc/os-impl-dirs.h index 787bb5220..981f3530b 100644 --- a/src/os/posix/inc/os-impl-dirs.h +++ b/src/os/posix/inc/os-impl-dirs.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_DIRS_H_ -#define INCLUDE_OS_IMPL_DIRS_H_ +#ifndef OS_IMPL_DIRS_H +#define OS_IMPL_DIRS_H -#include +#include "osconfig.h" #include #include #include @@ -45,4 +45,4 @@ typedef struct */ extern OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; -#endif /* INCLUDE_OS_IMPL_DIRS_H_ */ +#endif /* OS_IMPL_DIRS_H */ diff --git a/src/os/posix/inc/os-impl-files.h b/src/os/posix/inc/os-impl-files.h index fb098aecd..df01c5b23 100644 --- a/src/os/posix/inc/os-impl-files.h +++ b/src/os/posix/inc/os-impl-files.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_IMPL_FILES_H_ -#define INCLUDE_OS_IMPL_FILES_H_ +#ifndef OS_IMPL_FILES_H +#define OS_IMPL_FILES_H #include "os-impl-io.h" @@ -48,4 +48,4 @@ extern gid_t OS_IMPL_SELF_EGID; extern const int OS_IMPL_REGULAR_FILE_FLAGS; -#endif /* INCLUDE_OS_IMPL_FILES_H_ */ +#endif /* OS_IMPL_FILES_H */ diff --git a/src/os/posix/inc/os-impl-gettime.h b/src/os/posix/inc/os-impl-gettime.h index 491bd27db..308d3b4d8 100644 --- a/src/os/posix/inc/os-impl-gettime.h +++ b/src/os/posix/inc/os-impl-gettime.h @@ -25,12 +25,12 @@ * */ -#ifndef INCLUDE_OS_IMPL_GETTIME_H_ -#define INCLUDE_OS_IMPL_GETTIME_H_ +#ifndef OS_IMPL_GETTIME_H +#define OS_IMPL_GETTIME_H -#include +#include "osconfig.h" #include #define OSAL_GETTIME_SOURCE_CLOCK CLOCK_MONOTONIC -#endif /* INCLUDE_OS_IMPL_GETTIME_H_ */ +#endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/posix/inc/os-impl-io.h b/src/os/posix/inc/os-impl-io.h index f8cf65f62..80a67119b 100644 --- a/src/os/posix/inc/os-impl-io.h +++ b/src/os/posix/inc/os-impl-io.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_OS_IMPL_IO_H_ -#define INCLUDE_OS_IMPL_IO_H_ +#ifndef OS_IMPL_IO_H +#define OS_IMPL_IO_H -#include -#include +#include "osconfig.h" +#include "common_types.h" #include #include #include @@ -48,4 +48,4 @@ typedef struct */ extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; -#endif /* INCLUDE_OS_IMPL_IO_H_ */ +#endif /* OS_IMPL_IO_H */ diff --git a/src/os/posix/inc/os-impl-loader.h b/src/os/posix/inc/os-impl-loader.h index d98a72883..3fbfb00b5 100644 --- a/src/os/posix/inc/os-impl-loader.h +++ b/src/os/posix/inc/os-impl-loader.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_LOADER_H_ -#define INCLUDE_OS_IMPL_LOADER_H_ +#ifndef OS_IMPL_LOADER_H +#define OS_IMPL_LOADER_H -#include +#include "osconfig.h" #include /* @@ -52,4 +52,4 @@ typedef struct */ extern OS_impl_module_internal_record_t OS_impl_module_table[OS_MAX_MODULES]; -#endif /* INCLUDE_OS_IMPL_LOADER_H_ */ +#endif /* OS_IMPL_LOADER_H */ diff --git a/src/os/posix/inc/os-impl-mutex.h b/src/os/posix/inc/os-impl-mutex.h index f3014c449..c286b0c10 100644 --- a/src/os/posix/inc/os-impl-mutex.h +++ b/src/os/posix/inc/os-impl-mutex.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_MUTEX_H_ -#define INCLUDE_OS_IMPL_MUTEX_H_ +#ifndef OS_IMPL_MUTEX_H +#define OS_IMPL_MUTEX_H -#include +#include "osconfig.h" #include /* Mutexes */ @@ -40,4 +40,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_mutex_internal_record_t OS_impl_mutex_table[OS_MAX_MUTEXES]; -#endif /* INCLUDE_OS_IMPL_MUTEX_H_ */ +#endif /* OS_IMPL_MUTEX_H */ diff --git a/src/os/posix/inc/os-impl-network.h b/src/os/posix/inc/os-impl-network.h index 6a912471c..eaa507cff 100644 --- a/src/os/posix/inc/os-impl-network.h +++ b/src/os/posix/inc/os-impl-network.h @@ -25,9 +25,9 @@ * */ -#ifndef INCLUDE_OS_IMPL_NETWORK_H_ -#define INCLUDE_OS_IMPL_NETWORK_H_ +#ifndef OS_IMPL_NETWORK_H +#define OS_IMPL_NETWORK_H #include -#endif /* INCLUDE_OS_IMPL_NETWORK_H_ */ +#endif /* OS_IMPL_NETWORK_H */ diff --git a/src/os/posix/inc/os-impl-queues.h b/src/os/posix/inc/os-impl-queues.h index 4f92150ca..f94091183 100644 --- a/src/os/posix/inc/os-impl-queues.h +++ b/src/os/posix/inc/os-impl-queues.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_QUEUES_H_ -#define INCLUDE_OS_IMPL_QUEUES_H_ +#ifndef OS_IMPL_QUEUES_H +#define OS_IMPL_QUEUES_H -#include +#include "osconfig.h" #include /* queues */ @@ -40,4 +40,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_queue_internal_record_t OS_impl_queue_table[OS_MAX_QUEUES]; -#endif /* INCLUDE_OS_IMPL_QUEUES_H_ */ +#endif /* OS_IMPL_QUEUES_H */ diff --git a/src/os/posix/inc/os-impl-select.h b/src/os/posix/inc/os-impl-select.h index 9b6cc8c34..13d299397 100644 --- a/src/os/posix/inc/os-impl-select.h +++ b/src/os/posix/inc/os-impl-select.h @@ -25,12 +25,12 @@ * */ -#ifndef INCLUDE_OS_IMPL_SELECT_H_ -#define INCLUDE_OS_IMPL_SELECT_H_ +#ifndef OS_IMPL_SELECT_H +#define OS_IMPL_SELECT_H #include "os-impl-io.h" #include #include -#endif /* INCLUDE_OS_IMPL_SELECT_H_ */ +#endif /* OS_IMPL_SELECT_H */ diff --git a/src/os/posix/inc/os-impl-sockets.h b/src/os/posix/inc/os-impl-sockets.h index bf93418b6..7911c9ddc 100644 --- a/src/os/posix/inc/os-impl-sockets.h +++ b/src/os/posix/inc/os-impl-sockets.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_IMPL_SOCKETS_H_ -#define INCLUDE_OS_IMPL_SOCKETS_H_ +#ifndef OS_IMPL_SOCKETS_H +#define OS_IMPL_SOCKETS_H #include "os-impl-io.h" @@ -43,4 +43,4 @@ */ #define OS_IMPL_SOCKET_FLAGS O_NONBLOCK -#endif /* INCLUDE_OS_IMPL_SOCKETS_H_ */ +#endif /* OS_IMPL_SOCKETS_H */ diff --git a/src/os/posix/inc/os-impl-tasks.h b/src/os/posix/inc/os-impl-tasks.h index 0c8eef544..d73d3628f 100644 --- a/src/os/posix/inc/os-impl-tasks.h +++ b/src/os/posix/inc/os-impl-tasks.h @@ -25,10 +25,12 @@ * */ -#ifndef INCLUDE_OS_IMPL_TASKS_H_ -#define INCLUDE_OS_IMPL_TASKS_H_ +#ifndef OS_IMPL_TASKS_H +#define OS_IMPL_TASKS_H -#include +#include + +#include "osconfig.h" #include /*tasks */ @@ -40,4 +42,8 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; -#endif /* INCLUDE_OS_IMPL_TASKS_H_ */ +int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority, size_t stacksz, + PthreadFuncPtr_t entry, void *entry_arg); + + +#endif /* OS_IMPL_TASKS_H */ diff --git a/src/os/posix/inc/os-impl-timebase.h b/src/os/posix/inc/os-impl-timebase.h index edd1a4c87..103b78911 100644 --- a/src/os/posix/inc/os-impl-timebase.h +++ b/src/os/posix/inc/os-impl-timebase.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_TIMEBASE_H_ -#define INCLUDE_OS_IMPL_TIMEBASE_H_ +#ifndef OS_IMPL_TIMEBASE_H +#define OS_IMPL_TIMEBASE_H -#include +#include "osconfig.h" #include #include @@ -50,4 +50,4 @@ typedef struct extern OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; -#endif /* INCLUDE_OS_IMPL_TIMEBASE_H_ */ +#endif /* OS_IMPL_TIMEBASE_H */ diff --git a/src/os/posix/inc/os-posix.h b/src/os/posix/inc/os-posix.h index c84391db6..d05d4ac5b 100644 --- a/src/os/posix/inc/os-posix.h +++ b/src/os/posix/inc/os-posix.h @@ -28,8 +28,8 @@ * may contain POSIX-specific definitions. */ -#ifndef INCLUDE_OS_POSIX_H_ -#define INCLUDE_OS_POSIX_H_ +#ifndef OS_POSIX_H +#define OS_POSIX_H /**************************************************************************************** COMMON INCLUDE FILES @@ -107,8 +107,6 @@ int32 OS_Posix_FileSysAPI_Impl_Init(void); int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype); -int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority, size_t stacksz, - PthreadFuncPtr_t entry, void *entry_arg); void OS_Posix_CompAbsDelayTime(uint32 msecs, struct timespec *tm); -#endif /* INCLUDE_OS_POSIX_H_ */ +#endif /* OS_POSIX_H */ diff --git a/src/os/posix/src/os-impl-common.c b/src/os/posix/src/os-impl-common.c index 23452b603..8fbd44ea4 100644 --- a/src/os/posix/src/os-impl-common.c +++ b/src/os/posix/src/os-impl-common.c @@ -40,7 +40,6 @@ #include "os-shared-common.h" #include "os-shared-idmap.h" -#include "os-shared-errors.h" POSIX_GlobalVars_t POSIX_GlobalVars = {0}; diff --git a/src/os/posix/src/os-impl-console.c b/src/os/posix/src/os-impl-console.c index 74881962e..e1bca4450 100644 --- a/src/os/posix/src/os-impl-console.c +++ b/src/os/posix/src/os-impl-console.c @@ -31,6 +31,7 @@ #include "os-posix.h" #include "os-impl-console.h" +#include "os-impl-tasks.h" #include "os-shared-idmap.h" #include "os-shared-printf.h" diff --git a/src/os/posix/src/os-impl-no-module.c b/src/os/posix/src/os-impl-no-module.c index 5d9eda065..c7c2c0ffb 100644 --- a/src/os/posix/src/os-impl-no-module.c +++ b/src/os/posix/src/os-impl-no-module.c @@ -32,7 +32,7 @@ #include #include -#include +#include "osapi.h" #include "os-shared-module.h" /*---------------------------------------------------------------- diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index 517411cda..7cd55381a 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -36,6 +36,7 @@ #include "os-posix.h" #include "os-impl-timebase.h" +#include "os-impl-tasks.h" #include "os-shared-timebase.h" #include "os-shared-idmap.h" diff --git a/src/os/rtems/inc/os-impl-binsem.h b/src/os/rtems/inc/os-impl-binsem.h index 5b0324cac..4af72c46c 100644 --- a/src/os/rtems/inc/os-impl-binsem.h +++ b/src/os/rtems/inc/os-impl-binsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_BINSEM_H_ -#define INCLUDE_OS_IMPL_BINSEM_H_ +#ifndef OS_IMPL_BINSEM_H +#define OS_IMPL_BINSEM_H -#include +#include "osconfig.h" #include typedef struct @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_binsem_internal_record_t OS_impl_bin_sem_table[OS_MAX_BIN_SEMAPHORES]; -#endif /* INCLUDE_OS_IMPL_BINSEM_H_ */ +#endif /* OS_IMPL_BINSEM_H */ diff --git a/src/os/rtems/inc/os-impl-console.h b/src/os/rtems/inc/os-impl-console.h index b74d52b00..adcaa49dd 100644 --- a/src/os/rtems/inc/os-impl-console.h +++ b/src/os/rtems/inc/os-impl-console.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_OS_IMPL_CONSOLE_H_ -#define INCLUDE_OS_IMPL_CONSOLE_H_ +#ifndef OS_IMPL_CONSOLE_H +#define OS_IMPL_CONSOLE_H #include -#include +#include "osconfig.h" #include #include @@ -42,4 +42,4 @@ typedef struct extern OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; -#endif /* INCLUDE_OS_IMPL_CONSOLE_H_ */ +#endif /* OS_IMPL_CONSOLE_H */ diff --git a/src/os/rtems/inc/os-impl-countsem.h b/src/os/rtems/inc/os-impl-countsem.h index fc3cf73a7..a992d62e6 100644 --- a/src/os/rtems/inc/os-impl-countsem.h +++ b/src/os/rtems/inc/os-impl-countsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_COUNTSEM_H_ -#define INCLUDE_OS_IMPL_COUNTSEM_H_ +#ifndef OS_IMPL_COUNTSEM_H +#define OS_IMPL_COUNTSEM_H -#include +#include "osconfig.h" #include typedef struct @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_countsem_internal_record_t OS_impl_count_sem_table[OS_MAX_COUNT_SEMAPHORES]; -#endif /* INCLUDE_OS_IMPL_COUNTSEM_H_ */ +#endif /* OS_IMPL_COUNTSEM_H */ diff --git a/src/os/rtems/inc/os-impl-dirs.h b/src/os/rtems/inc/os-impl-dirs.h index 82bca79b3..e7f7d073f 100644 --- a/src/os/rtems/inc/os-impl-dirs.h +++ b/src/os/rtems/inc/os-impl-dirs.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_DIRS_H_ -#define INCLUDE_OS_IMPL_DIRS_H_ +#ifndef OS_IMPL_DIRS_H +#define OS_IMPL_DIRS_H -#include +#include "osconfig.h" #include #include #include @@ -45,4 +45,4 @@ typedef struct */ extern OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; -#endif /* INCLUDE_OS_IMPL_DIRS_H_ */ +#endif /* OS_IMPL_DIRS_H */ diff --git a/src/os/rtems/inc/os-impl-files.h b/src/os/rtems/inc/os-impl-files.h index a5d5ea848..5b58da49a 100644 --- a/src/os/rtems/inc/os-impl-files.h +++ b/src/os/rtems/inc/os-impl-files.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_IMPL_FILES_H_ -#define INCLUDE_OS_IMPL_FILES_H_ +#ifndef OS_IMPL_FILES_H +#define OS_IMPL_FILES_H #include "os-impl-io.h" @@ -42,4 +42,4 @@ #define OS_IMPL_REGULAR_FILE_FLAGS 0 -#endif /* INCLUDE_OS_IMPL_FILES_H_ */ +#endif /* OS_IMPL_FILES_H */ diff --git a/src/os/rtems/inc/os-impl-gettime.h b/src/os/rtems/inc/os-impl-gettime.h index 166a125d2..5b3b8237c 100644 --- a/src/os/rtems/inc/os-impl-gettime.h +++ b/src/os/rtems/inc/os-impl-gettime.h @@ -25,12 +25,12 @@ * */ -#ifndef INCLUDE_OS_IMPL_GETTIME_H_ -#define INCLUDE_OS_IMPL_GETTIME_H_ +#ifndef OS_IMPL_GETTIME_H +#define OS_IMPL_GETTIME_H -#include +#include "osconfig.h" #include #define OSAL_GETTIME_SOURCE_CLOCK CLOCK_MONOTONIC -#endif /* INCLUDE_OS_IMPL_GETTIME_H_ */ +#endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/rtems/inc/os-impl-io.h b/src/os/rtems/inc/os-impl-io.h index 78a9e3ca5..3ad2aa372 100644 --- a/src/os/rtems/inc/os-impl-io.h +++ b/src/os/rtems/inc/os-impl-io.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_IO_H_ -#define INCLUDE_OS_IMPL_IO_H_ +#ifndef OS_IMPL_IO_H +#define OS_IMPL_IO_H -#include +#include "osconfig.h" #include #include @@ -46,4 +46,4 @@ typedef struct */ extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; -#endif /* INCLUDE_OS_IMPL_IO_H_ */ +#endif /* OS_IMPL_IO_H */ diff --git a/src/os/rtems/inc/os-impl-loader.h b/src/os/rtems/inc/os-impl-loader.h index 53c964630..126899e34 100644 --- a/src/os/rtems/inc/os-impl-loader.h +++ b/src/os/rtems/inc/os-impl-loader.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_LOADER_H_ -#define INCLUDE_OS_IMPL_LOADER_H_ +#ifndef OS_IMPL_LOADER_H +#define OS_IMPL_LOADER_H -#include +#include "osconfig.h" #include #include @@ -50,4 +50,4 @@ typedef struct extern OS_impl_module_internal_record_t OS_impl_module_table[OS_MAX_MODULES]; -#endif /* INCLUDE_OS_IMPL_LOADER_H_ */ +#endif /* OS_IMPL_LOADER_H */ diff --git a/src/os/rtems/inc/os-impl-mutex.h b/src/os/rtems/inc/os-impl-mutex.h index df247192e..d59896874 100644 --- a/src/os/rtems/inc/os-impl-mutex.h +++ b/src/os/rtems/inc/os-impl-mutex.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_MUTEX_H_ -#define INCLUDE_OS_IMPL_MUTEX_H_ +#ifndef OS_IMPL_MUTEX_H +#define OS_IMPL_MUTEX_H -#include +#include "osconfig.h" #include typedef struct @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_mutex_internal_record_t OS_impl_mutex_table[OS_MAX_MUTEXES]; -#endif /* INCLUDE_OS_IMPL_MUTEX_H_ */ +#endif /* OS_IMPL_MUTEX_H */ diff --git a/src/os/rtems/inc/os-impl-queues.h b/src/os/rtems/inc/os-impl-queues.h index cf47ff9e4..38542793b 100644 --- a/src/os/rtems/inc/os-impl-queues.h +++ b/src/os/rtems/inc/os-impl-queues.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_QUEUES_H_ -#define INCLUDE_OS_IMPL_QUEUES_H_ +#ifndef OS_IMPL_QUEUES_H +#define OS_IMPL_QUEUES_H -#include +#include "osconfig.h" #include typedef struct @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_queue_internal_record_t OS_impl_queue_table[OS_MAX_QUEUES]; -#endif /* INCLUDE_OS_IMPL_QUEUES_H_ */ +#endif /* OS_IMPL_QUEUES_H */ diff --git a/src/os/rtems/inc/os-impl-select.h b/src/os/rtems/inc/os-impl-select.h index a2080c79c..a4591dd76 100644 --- a/src/os/rtems/inc/os-impl-select.h +++ b/src/os/rtems/inc/os-impl-select.h @@ -25,12 +25,12 @@ * */ -#ifndef INCLUDE_OS_IMPL_SELECT_H_ -#define INCLUDE_OS_IMPL_SELECT_H_ +#ifndef OS_IMPL_SELECT_H +#define OS_IMPL_SELECT_H #include "os-impl-io.h" #include #include -#endif /* INCLUDE_OS_IMPL_SELECT_H_ */ +#endif /* OS_IMPL_SELECT_H */ diff --git a/src/os/rtems/inc/os-impl-sockets.h b/src/os/rtems/inc/os-impl-sockets.h index 1144bc383..286e37873 100644 --- a/src/os/rtems/inc/os-impl-sockets.h +++ b/src/os/rtems/inc/os-impl-sockets.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_IMPL_SOCKETS_H_ -#define INCLUDE_OS_IMPL_SOCKETS_H_ +#ifndef OS_IMPL_SOCKETS_H +#define OS_IMPL_SOCKETS_H #include "os-impl-io.h" @@ -43,4 +43,4 @@ */ #define OS_IMPL_SOCKET_FLAGS O_NONBLOCK -#endif /* INCLUDE_OS_IMPL_SOCKETS_H_ */ +#endif /* OS_IMPL_SOCKETS_H */ diff --git a/src/os/rtems/inc/os-impl-tasks.h b/src/os/rtems/inc/os-impl-tasks.h index f1e648c08..491a8c1b2 100644 --- a/src/os/rtems/inc/os-impl-tasks.h +++ b/src/os/rtems/inc/os-impl-tasks.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_TASKS_H_ -#define INCLUDE_OS_IMPL_TASKS_H_ +#ifndef OS_IMPL_TASKS_H +#define OS_IMPL_TASKS_H -#include +#include "osconfig.h" #include typedef struct @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; -#endif /* INCLUDE_OS_IMPL_TASKS_H_ */ +#endif /* OS_IMPL_TASKS_H */ diff --git a/src/os/rtems/inc/os-impl-timebase.h b/src/os/rtems/inc/os-impl-timebase.h index 86853f96c..747f74ce0 100644 --- a/src/os/rtems/inc/os-impl-timebase.h +++ b/src/os/rtems/inc/os-impl-timebase.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_TIMEBASE_H_ -#define INCLUDE_OS_IMPL_TIMEBASE_H_ +#ifndef OS_IMPL_TIMEBASE_H +#define OS_IMPL_TIMEBASE_H -#include +#include "osconfig.h" #include #include @@ -50,4 +50,4 @@ typedef struct extern OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; -#endif /* INCLUDE_OS_IMPL_TIMEBASE_H_ */ +#endif /* OS_IMPL_TIMEBASE_H */ diff --git a/src/os/rtems/inc/os-rtems.h b/src/os/rtems/inc/os-rtems.h index d989e24a5..2514bdf53 100644 --- a/src/os/rtems/inc/os-rtems.h +++ b/src/os/rtems/inc/os-rtems.h @@ -28,8 +28,8 @@ * may contain RTEMS-specific definitions. */ -#ifndef INCLUDE_OS_RTEMS_H_ -#define INCLUDE_OS_RTEMS_H_ +#ifndef OS_RTEMS_H +#define OS_RTEMS_H /**************************************************************************************** COMMON INCLUDE FILES @@ -100,4 +100,4 @@ int32 OS_Rtems_FileSysAPI_Impl_Init(void); int32 OS_Rtems_TableMutex_Init(osal_objtype_t idtype); -#endif /* INCLUDE_OS_RTEMS_H_ */ +#endif /* OS_RTEMS_H */ diff --git a/src/os/rtems/src/os-impl-common.c b/src/os/rtems/src/os-impl-common.c index 4e0720103..5e32e286b 100644 --- a/src/os/rtems/src/os-impl-common.c +++ b/src/os/rtems/src/os-impl-common.c @@ -37,6 +37,7 @@ #include "os-rtems.h" #include "os-shared-common.h" +#include "os-shared-idmap.h" RTEMS_GlobalVars_t RTEMS_GlobalVars = {0}; diff --git a/src/os/rtems/src/os-impl-tasks.c b/src/os/rtems/src/os-impl-tasks.c index a9db8a73b..606846648 100644 --- a/src/os/rtems/src/os-impl-tasks.c +++ b/src/os/rtems/src/os-impl-tasks.c @@ -42,6 +42,8 @@ #include "os-shared-idmap.h" #include "os-shared-timebase.h" +#include "osapi-printf.h" + /**************************************************************************************** DEFINES ***************************************************************************************/ diff --git a/src/os/rtems/src/os-impl-timebase.c b/src/os/rtems/src/os-impl-timebase.c index 1ccf7beeb..75bc531aa 100644 --- a/src/os/rtems/src/os-impl-timebase.c +++ b/src/os/rtems/src/os-impl-timebase.c @@ -36,6 +36,8 @@ #include "os-shared-timebase.h" #include "os-shared-idmap.h" +#include "osapi-printf.h" + /**************************************************************************************** INTERNAL FUNCTION PROTOTYPES ***************************************************************************************/ diff --git a/src/os/shared/inc/os-shared-binsem.h b/src/os/shared/inc/os-shared-binsem.h index 13070731f..9ba97e4d9 100644 --- a/src/os/shared/inc/os-shared-binsem.h +++ b/src/os/shared/inc/os-shared-binsem.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_BINSEM_H_ -#define INCLUDE_OS_SHARED_BINSEM_H_ +#ifndef OS_SHARED_BINSEM_H +#define OS_SHARED_BINSEM_H +#include "osapi-binsem.h" #include /* other objects that have only an API name and no other data */ @@ -121,4 +122,4 @@ int32 OS_BinSemDelete_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_BinSemGetInfo_Impl(const OS_object_token_t *token, OS_bin_sem_prop_t *bin_prop); -#endif /* INCLUDE_OS_SHARED_BINSEM_H_ */ +#endif /* OS_SHARED_BINSEM_H */ diff --git a/src/os/shared/inc/os-shared-clock.h b/src/os/shared/inc/os-shared-clock.h index 60cada199..97da529bb 100644 --- a/src/os/shared/inc/os-shared-clock.h +++ b/src/os/shared/inc/os-shared-clock.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_CLOCK_H_ -#define INCLUDE_OS_SHARED_CLOCK_H_ +#ifndef OS_SHARED_CLOCK_H +#define OS_SHARED_CLOCK_H +#include "osapi-clock.h" #include /* @@ -53,4 +54,4 @@ int32 OS_GetLocalTime_Impl(OS_time_t *time_struct); ------------------------------------------------------------------*/ int32 OS_SetLocalTime_Impl(const OS_time_t *time_struct); -#endif /* INCLUDE_OS_SHARED_CLOCK_H_ */ +#endif /* OS_SHARED_CLOCK_H */ diff --git a/src/os/shared/inc/os-shared-common.h b/src/os/shared/inc/os-shared-common.h index 7ad513e24..c3ae45f76 100644 --- a/src/os/shared/inc/os-shared-common.h +++ b/src/os/shared/inc/os-shared-common.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_COMMON_H_ -#define INCLUDE_OS_SHARED_COMMON_H_ +#ifndef OS_SHARED_COMMON_H +#define OS_SHARED_COMMON_H +#include "osapi-common.h" #include /* @@ -127,4 +128,4 @@ void OS_IdleLoop_Impl(void); ------------------------------------------------------------------*/ void OS_ApplicationShutdown_Impl(void); -#endif /* INCLUDE_OS_SHARED_COMMON_H_ */ +#endif /* OS_SHARED_COMMON_H */ diff --git a/src/os/shared/inc/os-shared-countsem.h b/src/os/shared/inc/os-shared-countsem.h index 08966db51..4330125ab 100644 --- a/src/os/shared/inc/os-shared-countsem.h +++ b/src/os/shared/inc/os-shared-countsem.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_COUNTSEM_H_ -#define INCLUDE_OS_SHARED_COUNTSEM_H_ +#ifndef OS_SHARED_COUNTSEM_H +#define OS_SHARED_COUNTSEM_H +#include "osapi-countsem.h" #include /* other objects that have only an API name and no other data */ @@ -111,4 +112,4 @@ int32 OS_CountSemDelete_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_CountSemGetInfo_Impl(const OS_object_token_t *token, OS_count_sem_prop_t *count_prop); -#endif /* INCLUDE_OS_SHARED_COUNTSEM_H_ */ +#endif /* OS_SHARED_COUNTSEM_H */ diff --git a/src/os/shared/inc/os-shared-dir.h b/src/os/shared/inc/os-shared-dir.h index 638fac1ad..df8d1257b 100644 --- a/src/os/shared/inc/os-shared-dir.h +++ b/src/os/shared/inc/os-shared-dir.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_DIR_H_ -#define INCLUDE_OS_SHARED_DIR_H_ +#ifndef OS_SHARED_DIR_H +#define OS_SHARED_DIR_H +#include "osapi-dir.h" #include /* directory objects */ @@ -110,4 +111,4 @@ int32 OS_DirRewind_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_DirRemove_Impl(const char *local_path); -#endif /* INCLUDE_OS_SHARED_DIR_H_ */ +#endif /* OS_SHARED_DIR_H */ diff --git a/src/os/shared/inc/os-shared-errors.h b/src/os/shared/inc/os-shared-errors.h index 0b4968f62..131db4435 100644 --- a/src/os/shared/inc/os-shared-errors.h +++ b/src/os/shared/inc/os-shared-errors.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_SHARED_ERRORS_H_ -#define INCLUDE_OS_SHARED_ERRORS_H_ +#ifndef OS_SHARED_ERRORS_H +#define OS_SHARED_ERRORS_H #include @@ -39,4 +39,4 @@ typedef struct extern const OS_ErrorTable_Entry_t OS_IMPL_ERROR_NAME_TABLE[]; -#endif /* INCLUDE_OS_SHARED_ERRORS_H_ */ +#endif /* OS_SHARED_ERRORS_H */ diff --git a/src/os/shared/inc/os-shared-file.h b/src/os/shared/inc/os-shared-file.h index 32058fa1a..fcadb2c40 100644 --- a/src/os/shared/inc/os-shared-file.h +++ b/src/os/shared/inc/os-shared-file.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_FILE_H_ -#define INCLUDE_OS_SHARED_FILE_H_ +#ifndef OS_SHARED_FILE_H +#define OS_SHARED_FILE_H +#include "osapi-file.h" #include typedef struct @@ -182,4 +183,4 @@ int32 OS_FileRename_Impl(const char *old_path, const char *new_path); ------------------------------------------------------------------*/ int32 OS_FileChmod_Impl(const char *local_path, uint32 access); -#endif /* INCLUDE_OS_SHARED_FILE_H_ */ +#endif /* OS_SHARED_FILE_H */ diff --git a/src/os/shared/inc/os-shared-filesys.h b/src/os/shared/inc/os-shared-filesys.h index bba3ec767..e00058301 100644 --- a/src/os/shared/inc/os-shared-filesys.h +++ b/src/os/shared/inc/os-shared-filesys.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_FILESYS_H_ -#define INCLUDE_OS_SHARED_FILESYS_H_ +#ifndef OS_SHARED_FILESYS_H +#define OS_SHARED_FILESYS_H +#include "osapi-filesys.h" #include /** @@ -206,4 +207,4 @@ bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, c int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, size_t blocksize, osal_blockcount_t numblocks, bool should_format); -#endif /* INCLUDE_OS_SHARED_FILESYS_H_ */ +#endif /* OS_SHARED_FILESYS_H */ diff --git a/src/os/shared/inc/os-shared-globaldefs.h b/src/os/shared/inc/os-shared-globaldefs.h index b94009722..324fd7e65 100644 --- a/src/os/shared/inc/os-shared-globaldefs.h +++ b/src/os/shared/inc/os-shared-globaldefs.h @@ -28,11 +28,14 @@ * so they are put into a common header file. */ -#ifndef INCLUDE_OSAPI_SHARED_GLOBALDEFS_H_ -#define INCLUDE_OSAPI_SHARED_GLOBALDEFS_H_ +#ifndef OSAPI_SHARED_GLOBALDEFS_H_ +#define OSAPI_SHARED_GLOBALDEFS_H_ -/* All subsystems reference the public API */ -#include +/* All subsystems reference the same config, common types, and other constants */ +#include "osconfig.h" +#include "common_types.h" +#include "osapi-constants.h" +#include "osapi-error.h" /* * The "common_record" is part of the generic ID mapping - @@ -67,8 +70,6 @@ typedef union { void * opaque_arg; OS_ArgCallback_t arg_callback_func; - OS_TimerCallback_t timer_callback_func; - osal_task_entry entry_func; osal_id_t id; osal_index_t idx; } OS_U32ValueWrapper_t; @@ -88,4 +89,4 @@ extern void OS_DebugPrintf(uint32 Level, const char *Func, uint32 Line, const ch #define OS_DEBUG(...) #endif -#endif /* INCLUDE_OS_SHARED_GLOBALDEFS_H_ */ +#endif /* OS_SHARED_GLOBALDEFS_H */ diff --git a/src/os/shared/inc/os-shared-heap.h b/src/os/shared/inc/os-shared-heap.h index 510eb432c..0bd19d854 100644 --- a/src/os/shared/inc/os-shared-heap.h +++ b/src/os/shared/inc/os-shared-heap.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_HEAP_H_ -#define INCLUDE_OS_SHARED_HEAP_H_ +#ifndef OS_SHARED_HEAP_H +#define OS_SHARED_HEAP_H +#include "osapi-heap.h" #include /**************************************************************************************** @@ -47,4 +48,4 @@ ------------------------------------------------------------------*/ int32 OS_HeapGetInfo_Impl(OS_heap_prop_t *heap_prop); -#endif /* INCLUDE_OS_SHARED_HEAP_H_ */ +#endif /* OS_SHARED_HEAP_H */ diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index a63d2eea6..c177161d9 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_IDMAP_H_ -#define INCLUDE_OS_SHARED_IDMAP_H_ +#ifndef OS_SHARED_IDMAP_H +#define OS_SHARED_IDMAP_H +#include "osapi-idmap.h" #include #define OS_OBJECT_EXCL_REQ_FLAG 0x0001 @@ -485,4 +486,4 @@ bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_com int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_object_token_t *token); int32 OS_ObjectIdFindNextFree(OS_object_token_t *token); -#endif /* INCLUDE_OS_SHARED_IDMAP_H_ */ +#endif /* OS_SHARED_IDMAP_H */ diff --git a/src/os/shared/inc/os-shared-module.h b/src/os/shared/inc/os-shared-module.h index 6f651b648..58bd6f542 100644 --- a/src/os/shared/inc/os-shared-module.h +++ b/src/os/shared/inc/os-shared-module.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_MODULE_H_ -#define INCLUDE_OS_SHARED_MODULE_H_ +#ifndef OS_SHARED_MODULE_H +#define OS_SHARED_MODULE_H +#include "osapi-module.h" #include typedef enum @@ -129,4 +130,4 @@ int32 OS_SymbolTableDump_Impl(const char *filename, size_t size_limit); int32 OS_ModuleLoad_Static(const char *ModuleName); int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName); -#endif /* INCLUDE_OS_SHARED_MODULE_H_ */ +#endif /* OS_SHARED_MODULE_H */ diff --git a/src/os/shared/inc/os-shared-mutex.h b/src/os/shared/inc/os-shared-mutex.h index b7703aa66..7658ed28b 100644 --- a/src/os/shared/inc/os-shared-mutex.h +++ b/src/os/shared/inc/os-shared-mutex.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_MUTEX_H_ -#define INCLUDE_OS_SHARED_MUTEX_H_ +#ifndef OS_SHARED_MUTEX_H +#define OS_SHARED_MUTEX_H +#include "osapi-mutex.h" #include typedef struct @@ -96,4 +97,4 @@ int32 OS_MutSemDelete_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_MutSemGetInfo_Impl(const OS_object_token_t *token, OS_mut_sem_prop_t *mut_prop); -#endif /* INCLUDE_OS_SHARED_MUTEX_H_ */ +#endif /* OS_SHARED_MUTEX_H */ diff --git a/src/os/shared/inc/os-shared-network.h b/src/os/shared/inc/os-shared-network.h index f933ee166..8515d5be8 100644 --- a/src/os/shared/inc/os-shared-network.h +++ b/src/os/shared/inc/os-shared-network.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_NETWORK_H_ -#define INCLUDE_OS_SHARED_NETWORK_H_ +#ifndef OS_SHARED_NETWORK_H +#define OS_SHARED_NETWORK_H +#include "osapi-network.h" #include /**************************************************************************************** @@ -62,4 +63,4 @@ int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len); ------------------------------------------------------------------*/ int32 OS_NetworkGetID_Impl(int32 *IdBuf); -#endif /* INCLUDE_OS_SHARED_NETWORK_H_ */ +#endif /* OS_SHARED_NETWORK_H */ diff --git a/src/os/shared/inc/os-shared-printf.h b/src/os/shared/inc/os-shared-printf.h index 6bc2b6b48..8deeaab68 100644 --- a/src/os/shared/inc/os-shared-printf.h +++ b/src/os/shared/inc/os-shared-printf.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_PRINTF_H_ -#define INCLUDE_OS_SHARED_PRINTF_H_ +#ifndef OS_SHARED_PRINTF_H +#define OS_SHARED_PRINTF_H +#include "osapi-printf.h" #include /* @@ -102,4 +103,4 @@ void OS_ConsoleOutput_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ void OS_ConsoleWakeup_Impl(const OS_object_token_t *token); -#endif /* INCLUDE_OS_SHARED_PRINTF_H_ */ +#endif /* OS_SHARED_PRINTF_H */ diff --git a/src/os/shared/inc/os-shared-queue.h b/src/os/shared/inc/os-shared-queue.h index 03b5c309d..3f68ef98f 100644 --- a/src/os/shared/inc/os-shared-queue.h +++ b/src/os/shared/inc/os-shared-queue.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_QUEUE_H_ -#define INCLUDE_OS_SHARED_QUEUE_H_ +#ifndef OS_SHARED_QUEUE_H +#define OS_SHARED_QUEUE_H +#include "osapi-queue.h" #include typedef struct @@ -106,4 +107,4 @@ int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, size_t ------------------------------------------------------------------*/ int32 OS_QueueGetInfo_Impl(const OS_object_token_t *token, OS_queue_prop_t *queue_prop); -#endif /* INCLUDE_OS_SHARED_QUEUE_H_ */ +#endif /* OS_SHARED_QUEUE_H */ diff --git a/src/os/shared/inc/os-shared-select.h b/src/os/shared/inc/os-shared-select.h index 66cf33f3c..7b8d58cc9 100644 --- a/src/os/shared/inc/os-shared-select.h +++ b/src/os/shared/inc/os-shared-select.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_SELECT_H_ -#define INCLUDE_OS_SHARED_SELECT_H_ +#ifndef OS_SHARED_SELECT_H +#define OS_SHARED_SELECT_H +#include "osapi-select.h" #include /* @@ -77,4 +78,4 @@ int32 OS_SelectSingle_Impl(const OS_object_token_t *token, uint32 *SelectFlags, ------------------------------------------------------------------*/ int32 OS_SelectMultiple_Impl(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs); -#endif /* INCLUDE_OS_SHARED_SELECT_H_ */ +#endif /* OS_SHARED_SELECT_H */ diff --git a/src/os/shared/inc/os-shared-shell.h b/src/os/shared/inc/os-shared-shell.h index 1b896ee8f..be16a296c 100644 --- a/src/os/shared/inc/os-shared-shell.h +++ b/src/os/shared/inc/os-shared-shell.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_SHELL_H_ -#define INCLUDE_OS_SHARED_SHELL_H_ +#ifndef OS_SHARED_SHELL_H +#define OS_SHARED_SHELL_H +#include "osapi-shell.h" #include /**************************************************************************************** @@ -43,4 +44,4 @@ ------------------------------------------------------------------*/ int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd); -#endif /* INCLUDE_OS_SHARED_SHELL_H_ */ +#endif /* OS_SHARED_SHELL_H */ diff --git a/src/os/shared/inc/os-shared-sockets.h b/src/os/shared/inc/os-shared-sockets.h index 12a9cc7b9..3bcdcbd62 100644 --- a/src/os/shared/inc/os-shared-sockets.h +++ b/src/os/shared/inc/os-shared-sockets.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_SOCKETS_H_ -#define INCLUDE_OS_SHARED_SOCKETS_H_ +#ifndef OS_SHARED_SOCKETS_H +#define OS_SHARED_SOCKETS_H +#include "osapi-sockets.h" #include /* @@ -179,4 +180,4 @@ int32 OS_SocketAddrSetPort_Impl(OS_SockAddr_t *Addr, uint16 PortNum); */ void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Addr, const char *parent_name); -#endif /* INCLUDE_OS_SHARED_SOCKETS_H_ */ +#endif /* OS_SHARED_SOCKETS_H */ diff --git a/src/os/shared/inc/os-shared-task.h b/src/os/shared/inc/os-shared-task.h index 03fc11fe7..4c7d74b22 100644 --- a/src/os/shared/inc/os-shared-task.h +++ b/src/os/shared/inc/os-shared-task.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_TASK_H_ -#define INCLUDE_OS_SHARED_TASK_H_ +#ifndef OS_SHARED_TASK_H +#define OS_SHARED_TASK_H +#include "osapi-task.h" #include /*tasks */ @@ -181,4 +182,4 @@ bool OS_TaskIdMatchSystemData_Impl(void *ref, const OS_object_token_t *token, co ------------------------------------------------------------------*/ int32 OS_TaskValidateSystemData_Impl(const void *sysdata, size_t sysdata_size); -#endif /* INCLUDE_OS_SHARED_TASK_H_ */ +#endif /* OS_SHARED_TASK_H */ diff --git a/src/os/shared/inc/os-shared-time.h b/src/os/shared/inc/os-shared-time.h index 456991f8c..74f0a8dcc 100644 --- a/src/os/shared/inc/os-shared-time.h +++ b/src/os/shared/inc/os-shared-time.h @@ -25,8 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_TIME_H_ -#define INCLUDE_OS_SHARED_TIME_H_ +#ifndef OS_SHARED_TIME_H +#define OS_SHARED_TIME_H + +#include "osapi-timer.h" #include #include @@ -62,4 +64,4 @@ extern OS_timecb_internal_record_t OS_timecb_table[OS_MAX_TIMERS]; ---------------------------------------------------------------------------------------*/ int32 OS_TimerCbAPI_Init(void); -#endif /* INCLUDE_OS_SHARED_TIME_H_ */ +#endif /* OS_SHARED_TIME_H */ diff --git a/src/os/shared/inc/os-shared-timebase.h b/src/os/shared/inc/os-shared-timebase.h index 3e06d4f18..3875da5f3 100644 --- a/src/os/shared/inc/os-shared-timebase.h +++ b/src/os/shared/inc/os-shared-timebase.h @@ -25,9 +25,10 @@ * */ -#ifndef INCLUDE_OS_SHARED_TIMEBASE_H_ -#define INCLUDE_OS_SHARED_TIMEBASE_H_ +#ifndef OS_SHARED_TIMEBASE_H +#define OS_SHARED_TIMEBASE_H +#include "osapi-timebase.h" #include typedef struct @@ -137,4 +138,4 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id); ------------------------------------------------------------------*/ int32 OS_Milli2Ticks(uint32 milli_seconds, int *ticks); -#endif /* INCLUDE_OS_SHARED_TIMEBASE_H_ */ +#endif /* OS_SHARED_TIMEBASE_H */ diff --git a/src/os/shared/src/osapi-dir.c b/src/os/shared/src/osapi-dir.c index 0c82b98a6..6ee72f124 100644 --- a/src/os/shared/src/osapi-dir.c +++ b/src/os/shared/src/osapi-dir.c @@ -35,6 +35,8 @@ #include #include +#include "osapi-filesys.h" + /* * User defined include files */ diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 2b045375b..8756c1c4d 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -41,6 +41,14 @@ #include "os-shared-file.h" #include "os-shared-idmap.h" +/* + * Other OSAL public APIs used by this module + */ +#include "osapi-filesys.h" +#include "osapi-sockets.h" + + + /* * Sanity checks on the user-supplied configuration * The relevent OS_MAX limit should be defined and greater than zero diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index ad42b5fd0..944a9434b 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -41,6 +41,12 @@ #include "os-shared-module.h" #include "os-shared-idmap.h" +/* + * Other OSAL public APIs used by this module + */ +#include "osapi-filesys.h" + + /* * Sanity checks on the user-supplied configuration * The relevent OS_MAX limit should be defined diff --git a/src/os/shared/src/osapi-mutex.c b/src/os/shared/src/osapi-mutex.c index e861ff667..1840daa15 100644 --- a/src/os/shared/src/osapi-mutex.c +++ b/src/os/shared/src/osapi-mutex.c @@ -41,6 +41,11 @@ #include "os-shared-idmap.h" #include "os-shared-mutex.h" +/* + * Other OSAL public APIs used by this module + */ +#include "osapi-task.h" + /* * Sanity checks on the user-supplied configuration * The relevent OS_MAX limit should be defined and greater than zero diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index 780476a72..a174a4c61 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -47,6 +47,7 @@ #include #include #include +#include /* * User defined include files diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 99c2968ee..97de82755 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -43,6 +43,12 @@ #include "os-shared-file.h" #include "os-shared-sockets.h" +/* + * Other OSAL public APIs used by this module + */ +#include "osapi-select.h" + + /* * Global data for the API */ diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index 6df1fdab0..4b71abeb6 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -56,6 +56,12 @@ OS_timecb_internal_record_t OS_timecb_table[OS_MAX_TIMERS]; +typedef union +{ + OS_TimerCallback_t timer_callback_func; + void *opaque_arg; +} OS_Timer_ArgWrapper_t; + /**************************************************************************************** Timer API ***************************************************************************************/ @@ -228,7 +234,7 @@ int32 OS_TimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_t timebas *-----------------------------------------------------------------*/ static void OS_Timer_NoArgCallback(osal_id_t objid, void *arg) { - OS_U32ValueWrapper_t Conv; + OS_Timer_ArgWrapper_t Conv; /* * Note - did not write this as simply *((OS_SimpleCallback_t)arg) because @@ -250,7 +256,7 @@ int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *accura { int32 return_code; osal_id_t timebase_ref_id; - OS_U32ValueWrapper_t Conv; + OS_Timer_ArgWrapper_t Conv; /* ** Check Parameters. Although DoTimerAdd will also diff --git a/src/os/vxworks/inc/os-impl-binsem.h b/src/os/vxworks/inc/os-impl-binsem.h index 3da1e1a97..0cb2e426e 100644 --- a/src/os/vxworks/inc/os-impl-binsem.h +++ b/src/os/vxworks/inc/os-impl-binsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_BINSEM_H_ -#define INCLUDE_OS_IMPL_BINSEM_H_ +#ifndef OS_IMPL_BINSEM_H +#define OS_IMPL_BINSEM_H -#include +#include "osconfig.h" #include /* Binary Semaphores */ @@ -41,4 +41,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_binsem_internal_record_t OS_impl_bin_sem_table[OS_MAX_BIN_SEMAPHORES]; -#endif /* INCLUDE_OS_IMPL_BINSEM_H_ */ +#endif /* OS_IMPL_BINSEM_H */ diff --git a/src/os/vxworks/inc/os-impl-console.h b/src/os/vxworks/inc/os-impl-console.h index e10f88534..9941471b3 100644 --- a/src/os/vxworks/inc/os-impl-console.h +++ b/src/os/vxworks/inc/os-impl-console.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_OS_IMPL_CONSOLE_H_ -#define INCLUDE_OS_IMPL_CONSOLE_H_ +#ifndef OS_IMPL_CONSOLE_H +#define OS_IMPL_CONSOLE_H #include -#include +#include "osconfig.h" #include #include @@ -44,4 +44,4 @@ typedef struct extern OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; -#endif /* INCLUDE_OS_IMPL_CONSOLE_H_ */ +#endif /* OS_IMPL_CONSOLE_H */ diff --git a/src/os/vxworks/inc/os-impl-countsem.h b/src/os/vxworks/inc/os-impl-countsem.h index 4698756c3..511f2513b 100644 --- a/src/os/vxworks/inc/os-impl-countsem.h +++ b/src/os/vxworks/inc/os-impl-countsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_COUNTSEM_H_ -#define INCLUDE_OS_IMPL_COUNTSEM_H_ +#ifndef OS_IMPL_COUNTSEM_H +#define OS_IMPL_COUNTSEM_H -#include +#include "osconfig.h" #include /* Counting & Binary Semaphores */ @@ -41,4 +41,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_countsem_internal_record_t OS_impl_count_sem_table[OS_MAX_COUNT_SEMAPHORES]; -#endif /* INCLUDE_OS_IMPL_COUNTSEM_H_ */ +#endif /* OS_IMPL_COUNTSEM_H */ diff --git a/src/os/vxworks/inc/os-impl-dirs.h b/src/os/vxworks/inc/os-impl-dirs.h index e391792c1..43029aaa1 100644 --- a/src/os/vxworks/inc/os-impl-dirs.h +++ b/src/os/vxworks/inc/os-impl-dirs.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_DIRS_H_ -#define INCLUDE_OS_IMPL_DIRS_H_ +#ifndef OS_IMPL_DIRS_H +#define OS_IMPL_DIRS_H -#include +#include "osconfig.h" #include #include #include @@ -43,4 +43,4 @@ typedef struct */ extern OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; -#endif /* INCLUDE_OS_IMPL_DIRS_H_ */ +#endif /* OS_IMPL_DIRS_H */ diff --git a/src/os/vxworks/inc/os-impl-files.h b/src/os/vxworks/inc/os-impl-files.h index d32892dec..29461d94b 100644 --- a/src/os/vxworks/inc/os-impl-files.h +++ b/src/os/vxworks/inc/os-impl-files.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_IMPL_FILES_H_ -#define INCLUDE_OS_IMPL_FILES_H_ +#ifndef OS_IMPL_FILES_H +#define OS_IMPL_FILES_H #include "os-impl-io.h" @@ -47,4 +47,4 @@ */ #define OS_IMPL_REGULAR_FILE_FLAGS 0 -#endif /* INCLUDE_OS_IMPL_FILES_H_ */ +#endif /* OS_IMPL_FILES_H */ diff --git a/src/os/vxworks/inc/os-impl-filesys.h b/src/os/vxworks/inc/os-impl-filesys.h index d0649d348..d39863f6f 100644 --- a/src/os/vxworks/inc/os-impl-filesys.h +++ b/src/os/vxworks/inc/os-impl-filesys.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_OS_IMPL_FILESYS_H_ -#define INCLUDE_OS_IMPL_FILESYS_H_ +#ifndef OS_IMPL_FILESYS_H +#define OS_IMPL_FILESYS_H -#include -#include +#include "osconfig.h" +#include "common_types.h" #include #include @@ -42,4 +42,4 @@ typedef struct extern OS_impl_filesys_internal_record_t OS_impl_filesys_table[OS_MAX_FILE_SYSTEMS]; -#endif /* INCLUDE_OS_IMPL_FILESYS_H_ */ +#endif /* OS_IMPL_FILESYS_H */ diff --git a/src/os/vxworks/inc/os-impl-gettime.h b/src/os/vxworks/inc/os-impl-gettime.h index c0e7a5f44..a24a37ccf 100644 --- a/src/os/vxworks/inc/os-impl-gettime.h +++ b/src/os/vxworks/inc/os-impl-gettime.h @@ -25,12 +25,12 @@ * */ -#ifndef INCLUDE_OS_IMPL_GETTIME_H_ -#define INCLUDE_OS_IMPL_GETTIME_H_ +#ifndef OS_IMPL_GETTIME_H +#define OS_IMPL_GETTIME_H -#include +#include "osconfig.h" #include #define OSAL_GETTIME_SOURCE_CLOCK CLOCK_MONOTONIC -#endif /* INCLUDE_OS_IMPL_GETTIME_H_ */ +#endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/vxworks/inc/os-impl-io.h b/src/os/vxworks/inc/os-impl-io.h index 04034d807..e0ee37baa 100644 --- a/src/os/vxworks/inc/os-impl-io.h +++ b/src/os/vxworks/inc/os-impl-io.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_OS_IMPL_IO_H_ -#define INCLUDE_OS_IMPL_IO_H_ +#ifndef OS_IMPL_IO_H +#define OS_IMPL_IO_H -#include -#include +#include "osconfig.h" +#include "common_types.h" #include #include #include @@ -55,4 +55,4 @@ extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_F */ #define GENERIC_IO_CONST_DATA_CAST (void *) -#endif /* INCLUDE_OS_IMPL_IO_H_ */ +#endif /* OS_IMPL_IO_H */ diff --git a/src/os/vxworks/inc/os-impl-loader.h b/src/os/vxworks/inc/os-impl-loader.h index 05da9da70..031899364 100644 --- a/src/os/vxworks/inc/os-impl-loader.h +++ b/src/os/vxworks/inc/os-impl-loader.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_LOADER_H_ -#define INCLUDE_OS_IMPL_LOADER_H_ +#ifndef OS_IMPL_LOADER_H +#define OS_IMPL_LOADER_H -#include +#include "osconfig.h" #include /* @@ -51,4 +51,4 @@ typedef struct */ extern OS_impl_module_internal_record_t OS_impl_module_table[OS_MAX_MODULES]; -#endif /* INCLUDE_OS_IMPL_LOADER_H_ */ +#endif /* OS_IMPL_LOADER_H */ diff --git a/src/os/vxworks/inc/os-impl-mutex.h b/src/os/vxworks/inc/os-impl-mutex.h index 91c1d93a6..45b286429 100644 --- a/src/os/vxworks/inc/os-impl-mutex.h +++ b/src/os/vxworks/inc/os-impl-mutex.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_MUTEX_H_ -#define INCLUDE_OS_IMPL_MUTEX_H_ +#ifndef OS_IMPL_MUTEX_H +#define OS_IMPL_MUTEX_H -#include +#include "osconfig.h" #include typedef struct @@ -40,4 +40,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_mutsem_internal_record_t OS_impl_mutex_table[OS_MAX_MUTEXES]; -#endif /* INCLUDE_OS_IMPL_MUTEX_H_ */ +#endif /* OS_IMPL_MUTEX_H */ diff --git a/src/os/vxworks/inc/os-impl-network.h b/src/os/vxworks/inc/os-impl-network.h index 5f7943edf..482ddbdb9 100644 --- a/src/os/vxworks/inc/os-impl-network.h +++ b/src/os/vxworks/inc/os-impl-network.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_IMPL_NETWORK_H_ -#define INCLUDE_OS_IMPL_NETWORK_H_ +#ifndef OS_IMPL_NETWORK_H +#define OS_IMPL_NETWORK_H #include #include @@ -36,4 +36,4 @@ #include #include -#endif /* INCLUDE_OS_IMPL_NETWORK_H_ */ +#endif /* OS_IMPL_NETWORK_H */ diff --git a/src/os/vxworks/inc/os-impl-queues.h b/src/os/vxworks/inc/os-impl-queues.h index 48a47269a..6305af6e8 100644 --- a/src/os/vxworks/inc/os-impl-queues.h +++ b/src/os/vxworks/inc/os-impl-queues.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_QUEUES_H_ -#define INCLUDE_OS_IMPL_QUEUES_H_ +#ifndef OS_IMPL_QUEUES_H +#define OS_IMPL_QUEUES_H -#include +#include "osconfig.h" #include typedef struct @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_queue_internal_record_t OS_impl_queue_table[OS_MAX_QUEUES]; -#endif /* INCLUDE_OS_IMPL_QUEUES_H_ */ +#endif /* OS_IMPL_QUEUES_H */ diff --git a/src/os/vxworks/inc/os-impl-select.h b/src/os/vxworks/inc/os-impl-select.h index fd88d6e8e..338814f5e 100644 --- a/src/os/vxworks/inc/os-impl-select.h +++ b/src/os/vxworks/inc/os-impl-select.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_SELECT_H_ -#define INCLUDE_OS_IMPL_SELECT_H_ +#ifndef OS_IMPL_SELECT_H +#define OS_IMPL_SELECT_H #include "os-impl-io.h" #include -#endif /* INCLUDE_OS_IMPL_SELECT_H_ */ +#endif /* OS_IMPL_SELECT_H */ diff --git a/src/os/vxworks/inc/os-impl-sockets.h b/src/os/vxworks/inc/os-impl-sockets.h index 8c17d2254..cf7732093 100644 --- a/src/os/vxworks/inc/os-impl-sockets.h +++ b/src/os/vxworks/inc/os-impl-sockets.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_IMPL_SOCKETS_H_ -#define INCLUDE_OS_IMPL_SOCKETS_H_ +#ifndef OS_IMPL_SOCKETS_H +#define OS_IMPL_SOCKETS_H #include "os-impl-io.h" @@ -46,4 +46,4 @@ /* The "in.h" header file supplied in VxWorks 6.9 is missing the "in_port_t" typedef */ typedef u_short in_port_t; -#endif /* INCLUDE_OS_IMPL_SOCKETS_H_ */ +#endif /* OS_IMPL_SOCKETS_H */ diff --git a/src/os/vxworks/inc/os-impl-symtab.h b/src/os/vxworks/inc/os-impl-symtab.h index 9f0caa46c..5dab5df28 100644 --- a/src/os/vxworks/inc/os-impl-symtab.h +++ b/src/os/vxworks/inc/os-impl-symtab.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_SYMTAB_H_ -#define INCLUDE_OS_IMPL_SYMTAB_H_ +#ifndef OS_IMPL_SYMTAB_H +#define OS_IMPL_SYMTAB_H -#include +#include "osconfig.h" #include typedef struct @@ -44,4 +44,4 @@ extern SymbolDumpState_t OS_VxWorks_SymbolDumpState; BOOL OS_SymTableIterator_Impl(char *name, SYM_VALUE val, SYM_TYPE type, _Vx_usr_arg_t arg, SYM_GROUP group); -#endif /* INCLUDE_OS_IMPL_SYMTAB_H_ */ +#endif /* OS_IMPL_SYMTAB_H */ diff --git a/src/os/vxworks/inc/os-impl-tasks.h b/src/os/vxworks/inc/os-impl-tasks.h index 8ae32d36b..4cee06048 100644 --- a/src/os/vxworks/inc/os-impl-tasks.h +++ b/src/os/vxworks/inc/os-impl-tasks.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_OS_IMPL_TASKS_H_ -#define INCLUDE_OS_IMPL_TASKS_H_ +#ifndef OS_IMPL_TASKS_H +#define OS_IMPL_TASKS_H -#include +#include "osconfig.h" #include /*tasks */ @@ -43,4 +43,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; -#endif /* INCLUDE_OS_IMPL_TASKS_H_ */ +#endif /* OS_IMPL_TASKS_H */ diff --git a/src/os/vxworks/inc/os-impl-timebase.h b/src/os/vxworks/inc/os-impl-timebase.h index 2c3afab8b..559ca2e3e 100644 --- a/src/os/vxworks/inc/os-impl-timebase.h +++ b/src/os/vxworks/inc/os-impl-timebase.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_OS_IMPL_TIMEBASE_H_ -#define INCLUDE_OS_IMPL_TIMEBASE_H_ +#ifndef OS_IMPL_TIMEBASE_H +#define OS_IMPL_TIMEBASE_H -#include -#include +#include "osconfig.h" +#include "common_types.h" #include #include #include @@ -61,4 +61,4 @@ typedef struct extern OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; -#endif /* INCLUDE_OS_IMPL_TIMEBASE_H_ */ +#endif /* OS_IMPL_TIMEBASE_H */ diff --git a/src/os/vxworks/inc/os-vxworks.h b/src/os/vxworks/inc/os-vxworks.h index 7090b1c00..e497fee88 100644 --- a/src/os/vxworks/inc/os-vxworks.h +++ b/src/os/vxworks/inc/os-vxworks.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_VXWORKS_H_ -#define INCLUDE_OS_VXWORKS_H_ +#ifndef OS_VXWORKS_H +#define OS_VXWORKS_H /**************************************************************************************** COMMON INCLUDE FILES @@ -102,4 +102,4 @@ int32 OS_VxWorks_GenericSemGive(SEM_ID vxid); int32 OS_VxWorks_TableMutex_Init(osal_objtype_t idtype); -#endif /* INCLUDE_OS_VXWORKS_H_ */ +#endif /* OS_VXWORKS_H */ diff --git a/src/os/vxworks/src/os-impl-common.c b/src/os/vxworks/src/os-impl-common.c index beed30470..1a72c7c9d 100644 --- a/src/os/vxworks/src/os-impl-common.c +++ b/src/os/vxworks/src/os-impl-common.c @@ -31,6 +31,7 @@ #include "os-vxworks.h" #include "os-shared-common.h" +#include "os-shared-idmap.h" #include #include diff --git a/src/os/vxworks/src/os-impl-timebase.c b/src/os/vxworks/src/os-impl-timebase.c index a7bfebba5..bcaf5abce 100644 --- a/src/os/vxworks/src/os-impl-timebase.c +++ b/src/os/vxworks/src/os-impl-timebase.c @@ -42,6 +42,8 @@ #include #include +#include "osapi-task.h" + /**************************************************************************************** DEFINES ****************************************************************************************/ diff --git a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h index e048f5aa2..82806e680 100644 --- a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h +++ b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h @@ -25,13 +25,13 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_FILES_H_ -#define INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_FILES_H_ +#ifndef UT_ADAPTOR_PORTABLE_POSIX_FILES_H +#define UT_ADAPTOR_PORTABLE_POSIX_FILES_H -#include +#include "common_types.h" #include OCS_uid_t UT_PortablePosixFileTest_GetSelfEUID(void); OCS_gid_t UT_PortablePosixFileTest_GetSelfEGID(void); -#endif /* INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_FILES_H_ */ +#endif /* UT_ADAPTOR_PORTABLE_POSIX_FILES_H */ diff --git a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h index 1ec92754d..8385e3c2c 100644 --- a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h +++ b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h @@ -25,20 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_IO_H_ -#define INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_IO_H_ +#ifndef UT_ADAPTOR_PORTABLE_POSIX_IO_H +#define UT_ADAPTOR_PORTABLE_POSIX_IO_H -/** - * \file ut-osfileapi.h - * \ingroup adaptors - * \author joseph.p.hickey@nasa.gov - * - */ - -#ifndef _UT_PPOSFILEAPI_H_ -#define _UT_PPOSFILEAPI_H_ - -#include +#include "common_types.h" /***************************************************** * @@ -50,6 +40,4 @@ *****************************************************/ void UT_PortablePosixIOTest_Set_Selectable(osal_index_t local_id, bool is_selectable); -#endif /* _UT_OSFILEAPI_H_ */ - -#endif /* INCLUDE_UT_ADAPTOR_PORTABLE_POSIX_IO_H_ */ +#endif /* UT_ADAPTOR_PORTABLE_POSIX_IO_H */ diff --git a/src/unit-test-coverage/portable/src/os-portable-coveragetest.h b/src/unit-test-coverage/portable/src/os-portable-coveragetest.h index 127fc14dd..2d938fc4e 100644 --- a/src/unit-test-coverage/portable/src/os-portable-coveragetest.h +++ b/src/unit-test-coverage/portable/src/os-portable-coveragetest.h @@ -25,18 +25,8 @@ * */ -#ifndef INCLUDE_OS_PORTABLE_COVERAGETEST_H_ -#define INCLUDE_OS_PORTABLE_COVERAGETEST_H_ - -/** - * \file os-vxworks-coveragetest.h - * \ingroup vxworks - * \author joseph.p.hickey@nasa.gov - * - */ - -#ifndef _OS_PORTABLE_COVERAGETEST_H_ -#define _OS_PORTABLE_COVERAGETEST_H_ +#ifndef OS_PORTABLE_COVERAGETEST_H +#define OS_PORTABLE_COVERAGETEST_H /* * Includes @@ -76,6 +66,4 @@ void Osapi_Test_Setup(void); void Osapi_Test_Teardown(void); -#endif /* _OS_PORTABLE_COVERAGETEST_H_ */ - -#endif /* INCLUDE_OS_PORTABLE_COVERAGETEST_H_ */ +#endif /* OS_PORTABLE_COVERAGETEST_H */ diff --git a/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h b/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h index d65a2b2b3..0292ac666 100644 --- a/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h +++ b/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_MODULE_H_ -#define INCLUDE_UT_ADAPTOR_MODULE_H_ +#ifndef UT_ADAPTOR_MODULE_H +#define UT_ADAPTOR_MODULE_H -#include -#include +#include "common_types.h" +#include "osapi-module.h" /***************************************************** * @@ -52,4 +52,4 @@ void Test_DummyFunc(void); int32 Osapi_Call_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName); int32 Osapi_Call_ModuleLoad_Static(const char *ModuleName); -#endif /* INCLUDE_UT_ADAPTOR_MODULE_H_ */ +#endif /* UT_ADAPTOR_MODULE_H */ diff --git a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h index 59144c01f..4244a99d5 100644 --- a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h +++ b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h @@ -25,13 +25,13 @@ * */ -#ifndef INCLUDE_OS_SHARED_COVERAGETEST_H_ -#define INCLUDE_OS_SHARED_COVERAGETEST_H_ +#ifndef OS_SHARED_COVERAGETEST_H +#define OS_SHARED_COVERAGETEST_H #include #include #include -#include +#include "osapi.h" #include "os-shared-idmap.h" @@ -113,4 +113,4 @@ void Osapi_Test_Setup(void); */ void Osapi_Test_Teardown(void); -#endif /* INCLUDE_OS_SHARED_COVERAGETEST_H_ */ +#endif /* OS_SHARED_COVERAGETEST_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h b/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h index 09ea6539e..d75e8a18f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for arpa/inet.h */ -#ifndef _OSAL_STUB_ARPA_INET_H_ -#define _OSAL_STUB_ARPA_INET_H_ +#ifndef OCS_ARPA_INET_H +#define OCS_ARPA_INET_H #include @@ -39,4 +39,4 @@ extern const char *OCS_inet_ntop(int af, const void *cp, char *buf, size_t len); extern int OCS_inet_pton(int af, const char *cp, void *buf); -#endif /* _OSAL_STUB_ARPA_INET_H_ */ +#endif /* OCS_ARPA_INET_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h b/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h index da4f69005..6018cf0da 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for assert.h */ -#ifndef _OSAL_STUB_ASSERT_H_ -#define _OSAL_STUB_ASSERT_H_ +#ifndef OCS_ASSERT_H +#define OCS_ASSERT_H #include @@ -38,4 +38,4 @@ void OCS_assert(bool expression); -#endif /* _OSAL_STUB_ASSERT_H_ */ +#endif /* OCS_ASSERT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h b/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h index 368286bfd..ec19105b5 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub basic data types */ -#ifndef _OSAL_STUB_BASETYPES_H_ -#define _OSAL_STUB_BASETYPES_H_ +#ifndef OCS_BASETYPES_H +#define OCS_BASETYPES_H /* * NOTE: These header files are intentionally _not_ overridden @@ -36,4 +36,4 @@ #include /* for correct INT_MAX, etc. */ #include /* for correct boolean semantics */ -#endif /* _OSAL_STUB_BASETYPES_H_ */ +#endif /* OCS_BASETYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h b/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h index 9883751e7..dae8c8643 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub basic data types */ -#ifndef _OSAL_STUB_BLKIO_H_ -#define _OSAL_STUB_BLKIO_H_ +#ifndef OCS_BLKIO_H +#define OCS_BLKIO_H #include #include @@ -32,4 +32,4 @@ typedef struct OCS_BLK_DEV } OCS_BLK_DEV; typedef OCS_BLK_DEV *OCS_BLK_DEV_ID; -#endif /* _OSAL_STUB_BLKIO_H_ */ +#endif /* OCS_BLKIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h index 8a6a906e2..e14d43cf2 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h @@ -42,8 +42,8 @@ * BSP-provided console or debug terminal device. */ -#ifndef INCLUDE_OCS_BSP_IMPL_H_ -#define INCLUDE_OCS_BSP_IMPL_H_ +#ifndef OCS_BSP_IMPL_H +#define OCS_BSP_IMPL_H #include @@ -90,4 +90,4 @@ extern void OCS_OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen); ------------------------------------------------------------------*/ extern void OCS_OS_BSP_ConsoleSetMode_Impl(uint32_t ModeBits); -#endif /* INCLUDE_OCS_BSP_IMPL_H_ */ +#endif /* OCS_BSP_IMPL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h index 0a7700f19..655b0f8d7 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for cbioLib.h */ -#ifndef _OSAL_STUB_CBIOLIB_H_ -#define _OSAL_STUB_CBIOLIB_H_ +#ifndef OCS_CBIOLIB_H +#define OCS_CBIOLIB_H #include #include @@ -37,4 +37,4 @@ /* prototypes normally declared in cbioLib.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_CBIOLIB_H_ */ +#endif /* OCS_CBIOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h b/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h index ec467a2df..011fb2e12 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for complex.h */ -#ifndef _OSAL_STUB_COMPLEX_H_ -#define _OSAL_STUB_COMPLEX_H_ +#ifndef OCS_COMPLEX_H +#define OCS_COMPLEX_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in complex.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_COMPLEX_H_ */ +#endif /* OCS_COMPLEX_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h index b74c2d2e2..254eb0183 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ctype.h */ -#ifndef _OSAL_STUB_CTYPE_H_ -#define _OSAL_STUB_CTYPE_H_ +#ifndef OCS_CTYPE_H +#define OCS_CTYPE_H #include @@ -38,4 +38,4 @@ extern int OCS_isgraph(int c); -#endif /* _OSAL_STUB_CTYPE_H_ */ +#endif /* OCS_CTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h b/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h index 3e0768ec6..44089bb73 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for dirent.h */ -#ifndef _OSAL_STUB_DIRENT_H_ -#define _OSAL_STUB_DIRENT_H_ +#ifndef OCS_DIRENT_H +#define OCS_DIRENT_H #include @@ -48,4 +48,4 @@ extern OCS_DIR * OCS_opendir(const char *name); extern struct OCS_dirent *OCS_readdir(OCS_DIR *dirp); extern void OCS_rewinddir(OCS_DIR *dirp); -#endif /* _OSAL_STUB_DIRENT_H_ */ +#endif /* OCS_DIRENT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h b/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h index 3e1016218..e576ff3ee 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for dlfcn.h */ -#ifndef _OSAL_STUB_DLFCN_H_ -#define _OSAL_STUB_DLFCN_H_ +#ifndef OCS_DLFCN_H +#define OCS_DLFCN_H #include @@ -41,4 +41,4 @@ extern char *OCS_dlerror(void); extern void *OCS_dlopen(const char *file, int flags); extern void *OCS_dlsym(void *handle, const char *name); -#endif /* _OSAL_STUB_DLFCN_H_ */ +#endif /* OCS_DLFCN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h index 00951db11..e17165a44 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for dosFsLib.h */ -#ifndef _OSAL_STUB_DOSFSLIB_H_ -#define _OSAL_STUB_DOSFSLIB_H_ +#ifndef OCS_DOSFSLIB_H +#define OCS_DOSFSLIB_H #include #include @@ -43,4 +43,4 @@ /* ----------------------------------------- */ extern OCS_STATUS OCS_dosFsVolFormat(char *path, int opt, OCS_FUNCPTR pPromptFunc); -#endif /* _OSAL_STUB_DOSFSLIB_H_ */ +#endif /* OCS_DOSFSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h index c9970c19a..2e87822c1 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for drv/hdisk/ataDrv.h */ -#ifndef _OSAL_STUB_DRV_HDISK_ATADRV_H_ -#define _OSAL_STUB_DRV_HDISK_ATADRV_H_ +#ifndef OCS_DRV_HDISK_ATADRV_H +#define OCS_DRV_HDISK_ATADRV_H #include #include @@ -39,4 +39,4 @@ /* ----------------------------------------- */ extern OCS_BLK_DEV *OCS_ataDevCreate(int ctrl, int drive, unsigned int nBlocks, unsigned int blkOffset); -#endif /* _OSAL_STUB_DRV_HDISK_ATADRV_H_ */ +#endif /* OCS_DRV_HDISK_ATADRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h index 98bfc8847..8d7d89b93 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for errno.h */ -#ifndef _OSAL_STUB_ERRNO_H_ -#define _OSAL_STUB_ERRNO_H_ +#ifndef OCS_ERRNO_H +#define OCS_ERRNO_H #include @@ -45,4 +45,4 @@ extern int OCS_errno; -#endif /* _OSAL_STUB_ERRNO_H_ */ +#endif /* OCS_ERRNO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h index 27bdde88f..88cbb5563 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for errnoLib.h */ -#ifndef _OSAL_STUB_ERRNOLIB_H_ -#define _OSAL_STUB_ERRNOLIB_H_ +#ifndef OCS_ERRNOLIB_H +#define OCS_ERRNOLIB_H #include #include @@ -39,4 +39,4 @@ extern int OCS_errnoGet(void); -#endif /* _OSAL_STUB_ERRNOLIB_H_ */ +#endif /* OCS_ERRNOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h index 1aec16909..96bc3cdb1 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for fcntl.h */ -#ifndef _OSAL_STUB_FCNTL_H_ -#define _OSAL_STUB_FCNTL_H_ +#ifndef OCS_FCNTL_H +#define OCS_FCNTL_H #include @@ -77,4 +77,4 @@ extern int OCS_fcntl(int fd, int cmd, ...); extern int OCS_open(const char *file, int oflag, ...); -#endif /* _OSAL_STUB_FCNTL_H_ */ +#endif /* OCS_FCNTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h index fd6d80ceb..b1a9bc92d 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for fenv.h */ -#ifndef _OSAL_STUB_FENV_H_ -#define _OSAL_STUB_FENV_H_ +#ifndef OCS_FENV_H +#define OCS_FENV_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in fenv.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_FENV_H_ */ +#endif /* OCS_FENV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_float.h b/src/unit-test-coverage/ut-stubs/inc/OCS_float.h index afe94b3e1..afc4cb397 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_float.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_float.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for float.h */ -#ifndef _OSAL_STUB_FLOAT_H_ -#define _OSAL_STUB_FLOAT_H_ +#ifndef OCS_FLOAT_H +#define OCS_FLOAT_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in float.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_FLOAT_H_ */ +#endif /* OCS_FLOAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h index 6198581e8..a070b2533 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OCS_HOSTLIB_H_ -#define INCLUDE_OCS_HOSTLIB_H_ +#ifndef OCS_HOSTLIB_H +#define OCS_HOSTLIB_H #include #include @@ -44,4 +44,4 @@ /* ----------------------------------------- */ extern int OCS_hostGetByName(char *name); -#endif /* INCLUDE_OCS_HOSTLIB_H_ */ +#endif /* OCS_HOSTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h index 1a0b2c0bb..45d0ad544 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for intLib.h */ -#ifndef _OSAL_STUB_INTLIB_H_ -#define _OSAL_STUB_INTLIB_H_ +#ifndef OCS_INTLIB_H +#define OCS_INTLIB_H #include #include @@ -44,4 +44,4 @@ extern int OCS_intLock(void); extern int OCS_intUnlock(int lockKey); extern OCS_VOIDFUNCPTR *OCS_INUM_TO_IVEC(unsigned int ui); -#endif /* _OSAL_STUB_INTLIB_H_ */ +#endif /* OCS_INTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h b/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h index 205ca36d0..700c9c822 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for inttypes.h */ -#ifndef _OSAL_STUB_INTTYPES_H_ -#define _OSAL_STUB_INTTYPES_H_ +#ifndef OCS_INTTYPES_H +#define OCS_INTTYPES_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in inttypes.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_INTTYPES_H_ */ +#endif /* OCS_INTTYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h index 88138eaff..bee9238ec 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ioLib.h */ -#ifndef _OSAL_STUB_IOLIB_H_ -#define _OSAL_STUB_IOLIB_H_ +#ifndef OCS_IOLIB_H +#define OCS_IOLIB_H #include #include @@ -42,4 +42,4 @@ extern int OCS_ioctl(int fd, unsigned long request, ...); -#endif /* _OSAL_STUB_IOLIB_H_ */ +#endif /* OCS_IOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h index c43c74831..8252f66e0 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h @@ -19,9 +19,9 @@ */ /* OSAL coverage stub replacement for iv.h */ -#ifndef _OSAL_STUB_IV_H_ -#define _OSAL_STUB_IV_H_ +#ifndef OCS_IV_H +#define OCS_IV_H #include -#endif /* _OSAL_STUB_IV_H_ */ +#endif /* OCS_IV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h index 06e83f4b8..d042c16de 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for loadLib.h */ -#ifndef _OSAL_STUB_LOADLIB_H_ -#define _OSAL_STUB_LOADLIB_H_ +#ifndef OCS_LOADLIB_H +#define OCS_LOADLIB_H #include #include @@ -40,4 +40,4 @@ extern OCS_MODULE_ID OCS_loadModule(int fd, unsigned int symFlag); -#endif /* _OSAL_STUB_LOADLIB_H_ */ +#endif /* OCS_LOADLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h b/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h index 5fe7584bc..278ced3ce 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for locale.h */ -#ifndef _OSAL_STUB_LOCALE_H_ -#define _OSAL_STUB_LOCALE_H_ +#ifndef OCS_LOCALE_H +#define OCS_LOCALE_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in locale.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_LOCALE_H_ */ +#endif /* OCS_LOCALE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h index 122326fce..22de5a19a 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for logLib.h */ -#ifndef _OSAL_STUB_LOGLIB_H_ -#define _OSAL_STUB_LOGLIB_H_ +#ifndef OCS_LOGLIB_H +#define OCS_LOGLIB_H #include #include @@ -37,4 +37,4 @@ /* prototypes normally declared in logLib.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_LOGLIB_H_ */ +#endif /* OCS_LOGLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_math.h b/src/unit-test-coverage/ut-stubs/inc/OCS_math.h index 2de714646..a8cfe8c28 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_math.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_math.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for math.h */ -#ifndef _OSAL_STUB_MATH_H_ -#define _OSAL_STUB_MATH_H_ +#ifndef OCS_MATH_H +#define OCS_MATH_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in math.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_MATH_H_ */ +#endif /* OCS_MATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h index c7c6a2b5c..c0a7b1935 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for memPartLib.h */ -#ifndef _OSAL_STUB_MEMPARTLIB_H_ -#define _OSAL_STUB_MEMPARTLIB_H_ +#ifndef OCS_MEMPARTLIB_H +#define OCS_MEMPARTLIB_H #include #include @@ -54,4 +54,4 @@ extern OCS_STATUS OCS_memPartInfoGet(OCS_PART_ID partId, /* partition ID extern OCS_PART_ID OCS_memSysPartId; -#endif /* _OSAL_STUB_MEMPARTLIB_H_ */ +#endif /* OCS_MEMPARTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h index 98637b23a..63c73db4c 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for moduleLib.h */ -#ifndef _OSAL_STUB_MODULELIB_H_ -#define _OSAL_STUB_MODULELIB_H_ +#ifndef OCS_MODULELIB_H +#define OCS_MODULELIB_H #include #include @@ -58,4 +58,4 @@ typedef struct OCS_MODULE_INFO extern OCS_STATUS OCS_moduleInfoGet(OCS_MODULE_ID moduleId, OCS_MODULE_INFO *pModuleInfo); -#endif /* _OSAL_STUB_MODULELIB_H_ */ +#endif /* OCS_MODULELIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h b/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h index b3c051bcb..d317d4f22 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for mqueue.h */ -#ifndef _OSAL_STUB_MQUEUE_H_ -#define _OSAL_STUB_MQUEUE_H_ +#ifndef OCS_MQUEUE_H +#define OCS_MQUEUE_H #include #include @@ -55,4 +55,4 @@ extern int OCS_mq_timedsend(OCS_mqd_t mqdes, const char *msg_ptr, size_t const struct OCS_timespec *abs_timeout); extern int OCS_mq_unlink(const char *name); -#endif /* _OSAL_STUB_MQUEUE_H_ */ +#endif /* OCS_MQUEUE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h index f313b71e4..5a5086671 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for msgQLib.h */ -#ifndef _OSAL_STUB_MSGQLIB_H_ -#define _OSAL_STUB_MSGQLIB_H_ +#ifndef OCS_MSGQLIB_H +#define OCS_MSGQLIB_H #include #include @@ -54,4 +54,4 @@ extern OCS_STATUS OCS_msgQDelete(OCS_MSG_Q_ID msgQId); extern int OCS_msgQReceive(OCS_MSG_Q_ID msgQId, char *buffer, OCS_UINT maxNBytes, int timeout); extern OCS_STATUS OCS_msgQSend(OCS_MSG_Q_ID msgQId, char *buffer, OCS_UINT nBytes, int timeout, int priority); -#endif /* _OSAL_STUB_MSGQLIB_H_ */ +#endif /* OCS_MSGQLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h b/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h index 3bcb94134..c1dafe5b3 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for net/if.h */ -#ifndef _OSAL_STUB_NET_IF_H_ -#define _OSAL_STUB_NET_IF_H_ +#ifndef OCS_NET_IF_H +#define OCS_NET_IF_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in net/if.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_NET_IF_H_ */ +#endif /* OCS_NET_IF_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h index 5803f098e..bd1390376 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for netdb.h */ -#ifndef _OSAL_STUB_NETDB_H_ -#define _OSAL_STUB_NETDB_H_ +#ifndef OCS_NETDB_H +#define OCS_NETDB_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in netdb.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_NETDB_H_ */ +#endif /* OCS_NETDB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h index 1ea9295fe..cd9bba777 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for netinet/in.h */ -#ifndef _OSAL_STUB_NETINET_IN_H_ -#define _OSAL_STUB_NETINET_IN_H_ +#ifndef OCS_NETINET_IN_H +#define OCS_NETINET_IN_H #include @@ -41,4 +41,4 @@ extern uint16_t OCS_ntohs(uint16_t netshort); extern uint32_t OCS_htonl(uint32_t hostlong); extern uint32_t OCS_ntohl(uint32_t netlong); -#endif /* _OSAL_STUB_NETINET_IN_H_ */ +#endif /* OCS_NETINET_IN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h index 0a755caf0..8c5e03ef6 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for netinet/tcp.h */ -#ifndef _OSAL_STUB_NETINET_TCP_H_ -#define _OSAL_STUB_NETINET_TCP_H_ +#ifndef OCS_NETINET_TCP_H +#define OCS_NETINET_TCP_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in netinet/tcp.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_NETINET_TCP_H_ */ +#endif /* OCS_NETINET_TCP_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h index ac057bd71..1b01331f0 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for objLib.h */ -#ifndef _OSAL_STUB_OBJLIB_H_ -#define _OSAL_STUB_OBJLIB_H_ +#ifndef OCS_OBJLIB_H +#define OCS_OBJLIB_H #include #include @@ -44,4 +44,4 @@ /* prototypes normally declared in objLib.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_OBJLIB_H_ */ +#endif /* OCS_OBJLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h b/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h index 92d0ae860..d9c58f557 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for poll.h */ -#ifndef _OSAL_STUB_POLL_H_ -#define _OSAL_STUB_POLL_H_ +#ifndef OCS_POLL_H +#define OCS_POLL_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in poll.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_POLL_H_ */ +#endif /* OCS_POLL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h b/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h index 03003f848..20bd35c3f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for pthread.h */ -#ifndef _OSAL_STUB_PTHREAD_H_ -#define _OSAL_STUB_PTHREAD_H_ +#ifndef OCS_PTHREAD_H +#define OCS_PTHREAD_H #include #include @@ -122,4 +122,4 @@ extern int OCS_pthread_setschedprio(OCS_pthread_t target_thread, int prio); extern int OCS_pthread_setspecific(OCS_pthread_key_t key, const void *pointer); extern int OCS_pthread_sigmask(int how, const OCS_sigset_t *set, OCS_sigset_t *oldset); -#endif /* _OSAL_STUB_PTHREAD_H_ */ +#endif /* OCS_PTHREAD_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h index 9aad6bb0e..9a5f65856 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ramDiskCbio.h */ -#ifndef _OSAL_STUB_RAMDISKCBIO_H_ -#define _OSAL_STUB_RAMDISKCBIO_H_ +#ifndef OCS_RAMDISKCBIO_H +#define OCS_RAMDISKCBIO_H #include #include @@ -37,4 +37,4 @@ /* prototypes normally declared in ramDiskCbio.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_RAMDISKCBIO_H_ */ +#endif /* OCS_RAMDISKCBIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h index 3195323a1..faa89be57 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ramDrv.h */ -#ifndef _OSAL_STUB_RAMDRV_H_ -#define _OSAL_STUB_RAMDRV_H_ +#ifndef OCS_RAMDRV_H +#define OCS_RAMDRV_H #include #include @@ -39,4 +39,4 @@ /* ----------------------------------------- */ extern OCS_BLK_DEV *OCS_ramDevCreate(char *ramAddr, int bytesPerSec, int secPerTrack, int nSectors, int secOffset); -#endif /* _OSAL_STUB_RAMDRV_H_ */ +#endif /* OCS_RAMDRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h index 8a7cdf4d9..14ca9fe5d 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sched.h */ -#ifndef _OSAL_STUB_SCHED_H_ -#define _OSAL_STUB_SCHED_H_ +#ifndef OCS_SCHED_H +#define OCS_SCHED_H #include @@ -45,4 +45,4 @@ struct OCS_sched_param extern int OCS_sched_get_priority_max(int policy); extern int OCS_sched_get_priority_min(int policy); -#endif /* _OSAL_STUB_SCHED_H_ */ +#endif /* OCS_SCHED_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h index 5fe016edb..e6c386a0c 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for semLib.h */ -#ifndef _OSAL_STUB_SEMLIB_H_ -#define _OSAL_STUB_SEMLIB_H_ +#ifndef OCS_SEMLIB_H +#define OCS_SEMLIB_H #include #include @@ -70,4 +70,4 @@ extern OCS_STATUS OCS_semFlush(OCS_SEM_ID semId); extern OCS_STATUS OCS_semTake(OCS_SEM_ID semId, int timeout); extern OCS_STATUS OCS_semGive(OCS_SEM_ID semId); -#endif /* _OSAL_STUB_SEMLIB_H_ */ +#endif /* OCS_SEMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h b/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h index 034ad6f0f..be7862691 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for semaphore.h */ -#ifndef _OSAL_STUB_SEMAPHORE_H_ -#define _OSAL_STUB_SEMAPHORE_H_ +#ifndef OCS_SEMAPHORE_H +#define OCS_SEMAPHORE_H #include #include @@ -49,4 +49,4 @@ extern int OCS_sem_post(OCS_sem_t *sem); extern int OCS_sem_timedwait(OCS_sem_t *sem, const struct OCS_timespec *abstime); extern int OCS_sem_wait(OCS_sem_t *sem); -#endif /* _OSAL_STUB_SEMAPHORE_H_ */ +#endif /* OCS_SEMAPHORE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h b/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h index 89ed14b05..63ac867f2 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for setjmp.h */ -#ifndef _OSAL_STUB_SETJMP_H_ -#define _OSAL_STUB_SETJMP_H_ +#ifndef OCS_SETJMP_H +#define OCS_SETJMP_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in setjmp.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_SETJMP_H_ */ +#endif /* OCS_SETJMP_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h index 8f2dc631c..c79987ce8 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for shellLib.h */ -#ifndef _OSAL_STUB_SHELLLIB_H_ -#define _OSAL_STUB_SHELLLIB_H_ +#ifndef OCS_SHELLLIB_H +#define OCS_SHELLLIB_H #include #include @@ -40,4 +40,4 @@ extern OCS_STATUS OCS_shellGenericInit(const char *config, int stackSize, const char *shellName, char **pShellName, OCS_BOOL interactive, OCS_BOOL loginAccess, int fdin, int fdout, int fderr); -#endif /* _OSAL_STUB_SHELLLIB_H_ */ +#endif /* OCS_SHELLLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h b/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h index c0d3006bb..dfdda0041 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for signal.h */ -#ifndef _OSAL_STUB_SIGNAL_H_ -#define _OSAL_STUB_SIGNAL_H_ +#ifndef OCS_SIGNAL_H +#define OCS_SIGNAL_H #include #include @@ -74,4 +74,4 @@ extern int OCS_sigprocmask(int how, const OCS_sigset_t *set, OCS_si extern int OCS_sigsuspend(const OCS_sigset_t *set); extern int OCS_sigwait(const OCS_sigset_t *set, int *sig); -#endif /* _OSAL_STUB_SIGNAL_H_ */ +#endif /* OCS_SIGNAL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h index c05d4f53a..841af324a 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stat.h */ -#ifndef _OSAL_STUB_STAT_H_ -#define _OSAL_STUB_STAT_H_ +#ifndef OCS_STAT_H +#define OCS_STAT_H #include #include @@ -72,4 +72,4 @@ extern int OCS_fstat(int fd, struct OCS_stat *buf); extern int OCS_statvfs(const char *file, struct OCS_statvfs *buf); -#endif /* _OSAL_STUB_STAT_H_ */ +#endif /* OCS_STAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h index 474e68c3e..b0299c8d1 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stdarg.h */ -#ifndef _OSAL_STUB_STDARG_H_ -#define _OSAL_STUB_STDARG_H_ +#ifndef OCS_STDARG_H +#define OCS_STDARG_H #include @@ -43,4 +43,4 @@ typedef struct #define OCS_va_start(ap, last) ap.p = &last #define OCS_va_end(ap) -#endif /* _OSAL_STUB_STDARG_H_ */ +#endif /* OCS_STDARG_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h index b6a03a08c..0070b36b7 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stdio.h */ -#ifndef _OSAL_STUB_STDIO_H_ -#define _OSAL_STUB_STDIO_H_ +#ifndef OCS_STDIO_H +#define OCS_STDIO_H #include #include @@ -53,4 +53,4 @@ extern OCS_FILE *OCS_stdin; extern OCS_FILE *OCS_stdout; extern OCS_FILE *OCS_stderr; -#endif /* _OSAL_STUB_STDIO_H_ */ +#endif /* OCS_STDIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h index 7332b9d32..80b0838fb 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stdlib.h */ -#ifndef _OSAL_STUB_STDLIB_H_ -#define _OSAL_STUB_STDLIB_H_ +#ifndef OCS_STDLIB_H +#define OCS_STDLIB_H #include @@ -45,4 +45,4 @@ extern int OCS_system(const char *command); extern void * OCS_malloc(size_t sz); extern void OCS_free(void *ptr); -#endif /* _OSAL_STUB_STDLIB_H_ */ +#endif /* OCS_STDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_string.h b/src/unit-test-coverage/ut-stubs/inc/OCS_string.h index a4a931284..855b3d14b 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_string.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_string.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for string.h */ -#ifndef _OSAL_STUB_STRING_H_ -#define _OSAL_STUB_STRING_H_ +#ifndef OCS_STRING_H +#define OCS_STRING_H #include @@ -49,4 +49,4 @@ extern char * OCS_strcat(char *dest, const char *src); extern char * OCS_strncat(char *dest, const char *src, size_t n); extern char * OCS_strerror(int errnum); -#endif /* _OSAL_STUB_STRING_H_ */ +#endif /* OCS_STRING_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h b/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h index 480522ec2..b71872507 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for strings.h */ -#ifndef _OSAL_STUB_STRINGS_H_ -#define _OSAL_STUB_STRINGS_H_ +#ifndef OCS_STRINGS_H +#define OCS_STRINGS_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in strings.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_STRINGS_H_ */ +#endif /* OCS_STRINGS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h index 61a437942..69b886112 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h @@ -26,8 +26,8 @@ * OSAL coverage stub replacement for symLib.h */ -#ifndef INCLUDE_OCS_SYMLIB_H_ -#define INCLUDE_OCS_SYMLIB_H_ +#ifndef OCS_SYMLIB_H +#define OCS_SYMLIB_H #include #include @@ -70,4 +70,4 @@ extern OCS_STATUS OCS_symFindByName(OCS_SYMTAB_ID symTblId, char *name, char ** extern OCS_SYMBOL *OCS_symEach(OCS_SYMTAB_ID symTblId, OCS_symEach_Routine_t routine, int routineArg); extern OCS_STATUS OCS_symFind(OCS_SYMTAB_ID symTblId, OCS_SYMBOL_DESC *pSymbol); -#endif /* INCLUDE_OCS_SYMLIB_H_ */ +#endif /* OCS_SYMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h index 36b43f7e8..06b96ff7d 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sysLib.h */ -#ifndef _OSAL_STUB_SYSLIB_H_ -#define _OSAL_STUB_SYSLIB_H_ +#ifndef OCS_SYSLIB_H +#define OCS_SYSLIB_H #include #include @@ -38,4 +38,4 @@ /* ----------------------------------------- */ extern int OCS_sysClkRateGet(void); -#endif /* _OSAL_STUB_SYSLIB_H_ */ +#endif /* OCS_SYSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h index 230ecb053..3a09a9486 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/ioctl.h */ -#ifndef _OSAL_STUB_SYS_IOCTL_H_ -#define _OSAL_STUB_SYS_IOCTL_H_ +#ifndef OCS_SYS_IOCTL_H +#define OCS_SYS_IOCTL_H #include @@ -38,4 +38,4 @@ extern int OCS_ioctl(int fd, unsigned long request, ...); -#endif /* _OSAL_STUB_SYS_IOCTL_H_ */ +#endif /* OCS_SYS_IOCTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h index 9384f38a0..f2f8b58ad 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/ipc.h */ -#ifndef _OSAL_STUB_SYS_IPC_H_ -#define _OSAL_STUB_SYS_IPC_H_ +#ifndef OCS_SYS_IPC_H +#define OCS_SYS_IPC_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in sys/ipc.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_SYS_IPC_H_ */ +#endif /* OCS_SYS_IPC_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h index 944ac9d43..dab686d11 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/mman.h */ -#ifndef _OSAL_STUB_SYS_MMAN_H_ -#define _OSAL_STUB_SYS_MMAN_H_ +#ifndef OCS_SYS_MMAN_H +#define OCS_SYS_MMAN_H #include @@ -45,4 +45,4 @@ void *OCS_mmap(void *addr, size_t length, int prot, int flags, int fd, OCS_off_t offset); int OCS_munmap(void *addr, size_t length); -#endif /* _OSAL_STUB_SYS_MMAN_H_ */ +#endif /* OCS_SYS_MMAN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h index 10c1c1e7b..627c1df4a 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OCS_SYS_SELECT_H_ -#define INCLUDE_OCS_SYS_SELECT_H_ +#ifndef OCS_SYS_SELECT_H +#define OCS_SYS_SELECT_H #include #include @@ -55,4 +55,4 @@ extern int OCS_FD_ISSET(int fd, OCS_fd_set *set); extern void OCS_FD_CLR(int fd, OCS_fd_set *set); extern void OCS_FD_ZERO(OCS_fd_set *set); -#endif /* INCLUDE_OCS_SYS_SELECT_H_ */ +#endif /* OCS_SYS_SELECT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h index c5c13391d..f87ababdc 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/socket.h */ -#ifndef _OSAL_STUB_SYS_SOCKET_H_ -#define _OSAL_STUB_SYS_SOCKET_H_ +#ifndef OCS_SYS_SOCKET_H +#define OCS_SYS_SOCKET_H #include #include @@ -55,4 +55,4 @@ extern OCS_ssize_t OCS_sendto(int fd, const void *buf, size_t n, int flags, cons extern int OCS_setsockopt(int fd, int level, int optname, const void *optval, OCS_socklen_t optlen); extern int OCS_socket(int domain, int type, int protocol); -#endif /* _OSAL_STUB_SYS_SOCKET_H_ */ +#endif /* OCS_SYS_SOCKET_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h index d510083df..8f905ab12 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/time.h */ -#ifndef _OSAL_STUB_SYS_TIME_H_ -#define _OSAL_STUB_SYS_TIME_H_ +#ifndef OCS_SYS_TIME_H +#define OCS_SYS_TIME_H #include #include @@ -37,4 +37,4 @@ /* prototypes normally declared in sys/time.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_SYS_TIME_H_ */ +#endif /* OCS_SYS_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h index eb177637f..3957d99a6 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/times.h */ -#ifndef _OSAL_STUB_SYS_TIMES_H_ -#define _OSAL_STUB_SYS_TIMES_H_ +#ifndef OCS_SYS_TIMES_H +#define OCS_SYS_TIMES_H #include #include @@ -37,4 +37,4 @@ /* prototypes normally declared in sys/times.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_SYS_TIMES_H_ */ +#endif /* OCS_SYS_TIMES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h index c9f8a5a3b..40158454f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/types.h */ -#ifndef _OSAL_STUB_SYS_TYPES_H_ -#define _OSAL_STUB_SYS_TYPES_H_ +#ifndef OCS_SYS_TYPES_H +#define OCS_SYS_TYPES_H #include @@ -43,4 +43,4 @@ typedef int OCS_uid_t; /* prototypes normally declared in sys/types.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_SYS_TYPES_H_ */ +#endif /* OCS_SYS_TYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h index 1a1cdafb0..a5d62205f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/un.h */ -#ifndef _OSAL_STUB_SYS_UN_H_ -#define _OSAL_STUB_SYS_UN_H_ +#ifndef OCS_SYS_UN_H +#define OCS_SYS_UN_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in sys/un.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_SYS_UN_H_ */ +#endif /* OCS_SYS_UN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h index ceef2726d..be91da5ce 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/wait.h */ -#ifndef _OSAL_STUB_SYS_WAIT_H_ -#define _OSAL_STUB_SYS_WAIT_H_ +#ifndef OCS_SYS_WAIT_H +#define OCS_SYS_WAIT_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in sys/wait.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_SYS_WAIT_H_ */ +#endif /* OCS_SYS_WAIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h index 6760a41f0..72a7b7e63 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for taskLib.h */ -#ifndef _OSAL_STUB_TASKLIB_H_ -#define _OSAL_STUB_TASKLIB_H_ +#ifndef OCS_TASKLIB_H +#define OCS_TASKLIB_H #include #include @@ -79,4 +79,4 @@ OCS_STATUS OCS_taskInit(OCS_WIND_TCB *pTcb, char *name, int priority, int option OCS_WIND_TCB *OCS_taskTcb(OCS_TASK_ID tid); -#endif /* _OSAL_STUB_TASKLIB_H_ */ +#endif /* OCS_TASKLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h index 611e61d78..332998e47 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for taskVarLib.h */ -#ifndef _OSAL_STUB_TASKVARLIB_H_ -#define _OSAL_STUB_TASKVARLIB_H_ +#ifndef OCS_TASKVARLIB_H +#define OCS_TASKVARLIB_H #include #include @@ -39,4 +39,4 @@ extern OCS_STATUS OCS_taskVarAdd(int tid, int *pVar); -#endif /* _OSAL_STUB_TASKVARLIB_H_ */ +#endif /* OCS_TASKVARLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h b/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h index 69f91ddcd..70b3dcc17 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for termios.h */ -#ifndef _OSAL_STUB_TERMIOS_H_ -#define _OSAL_STUB_TERMIOS_H_ +#ifndef OCS_TERMIOS_H +#define OCS_TERMIOS_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in termios.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_TERMIOS_H_ */ +#endif /* OCS_TERMIOS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h b/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h index d095228a5..7cb26cf0e 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for tgmath.h */ -#ifndef _OSAL_STUB_TGMATH_H_ -#define _OSAL_STUB_TGMATH_H_ +#ifndef OCS_TGMATH_H +#define OCS_TGMATH_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in tgmath.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_TGMATH_H_ */ +#endif /* OCS_TGMATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_time.h b/src/unit-test-coverage/ut-stubs/inc/OCS_time.h index 88decb45c..003b2f3b1 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_time.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_time.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for time.h */ -#ifndef _OSAL_STUB_TIME_H_ -#define _OSAL_STUB_TIME_H_ +#ifndef OCS_TIME_H +#define OCS_TIME_H #include #include @@ -79,4 +79,4 @@ extern int OCS_timer_settime(OCS_timer_t timerid, int flags, const struct OCS_it extern int OCS_timer_connect(OCS_timer_t timerid, OCS_TIMER_CONNECT_FUNC func, int arg); -#endif /* _OSAL_STUB_TIME_H_ */ +#endif /* OCS_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h b/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h index 6f1707626..f80d25d27 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for timers.h */ -#ifndef _OSAL_STUB_TIMERS_H_ -#define _OSAL_STUB_TIMERS_H_ +#ifndef OCS_TIMERS_H +#define OCS_TIMERS_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in timers.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_TIMERS_H_ */ +#endif /* OCS_TIMERS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h index d2789d3ec..3b9453282 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ulimit.h */ -#ifndef _OSAL_STUB_ULIMIT_H_ -#define _OSAL_STUB_ULIMIT_H_ +#ifndef OCS_ULIMIT_H +#define OCS_ULIMIT_H #include @@ -37,4 +37,4 @@ /* ----------------------------------------- */ long OCS_ulimit(int cmd, long newlimit); -#endif /* _OSAL_STUB_ULIMIT_H_ */ +#endif /* OCS_ULIMIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h b/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h index 43eb9b74c..565924255 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for unistd.h */ -#ifndef _OSAL_STUB_UNISTD_H_ -#define _OSAL_STUB_UNISTD_H_ +#ifndef OCS_UNISTD_H +#define OCS_UNISTD_H #include #include @@ -56,4 +56,4 @@ extern int OCS_rmdir(const char *path); extern long int OCS_sysconf(int name); extern OCS_ssize_t OCS_write(int fd, const void *buf, size_t n); -#endif /* _OSAL_STUB_UNISTD_H_ */ +#endif /* OCS_UNISTD_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h index ed4847847..2f1c709b7 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for unldLib.h */ -#ifndef _OSAL_STUB_UNLDLIB_H_ -#define _OSAL_STUB_UNLDLIB_H_ +#ifndef OCS_UNLDLIB_H +#define OCS_UNLDLIB_H #include #include @@ -39,4 +39,4 @@ /* ----------------------------------------- */ extern OCS_STATUS OCS_unldByModuleId(OCS_MODULE_ID moduleId, int options); -#endif /* _OSAL_STUB_UNLDLIB_H_ */ +#endif /* OCS_UNLDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h index 0929b6049..f45e873f2 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for usrLib.h */ -#ifndef _OSAL_STUB_USRLIB_H_ -#define _OSAL_STUB_USRLIB_H_ +#ifndef OCS_USRLIB_H +#define OCS_USRLIB_H #include #include @@ -37,4 +37,4 @@ /* prototypes normally declared in usrLib.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_USRLIB_H_ */ +#endif /* OCS_USRLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_version.h b/src/unit-test-coverage/ut-stubs/inc/OCS_version.h index 1839ce637..203e8e828 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_version.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_version.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for version.h */ -#ifndef _OSAL_STUB_VERSION_H_ -#define _OSAL_STUB_VERSION_H_ +#ifndef OCS_VERSION_H +#define OCS_VERSION_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in version.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_VERSION_H_ */ +#endif /* OCS_VERSION_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h b/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h index cbb7f6c64..6b4f24d6b 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h @@ -25,8 +25,8 @@ * OSAL coverage stub replacement for vxWorks.h */ -#ifndef INCLUDE_OCS_VXWORKS_H_ -#define INCLUDE_OCS_VXWORKS_H_ +#ifndef OCS_VXWORKS_H +#define OCS_VXWORKS_H #include @@ -76,4 +76,4 @@ typedef void (*OCS_VOIDFUNCPTR)(void); /* prototypes normally declared in vxWorks.h */ /* ----------------------------------------- */ -#endif /* INCLUDE_OCS_VXWORKS_H_ */ +#endif /* OCS_VXWORKS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h b/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h index f2e667c26..dd9fb6709 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for wchar.h */ -#ifndef _OSAL_STUB_WCHAR_H_ -#define _OSAL_STUB_WCHAR_H_ +#ifndef OCS_WCHAR_H +#define OCS_WCHAR_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in wchar.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_WCHAR_H_ */ +#endif /* OCS_WCHAR_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h b/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h index 5fa115d55..a7d975dee 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for wctype.h */ -#ifndef _OSAL_STUB_WCTYPE_H_ -#define _OSAL_STUB_WCTYPE_H_ +#ifndef OCS_WCTYPE_H +#define OCS_WCTYPE_H #include @@ -36,4 +36,4 @@ /* prototypes normally declared in wctype.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_WCTYPE_H_ */ +#endif /* OCS_WCTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h index 314ca080e..f805cbe6c 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for xbdBlkDev.h */ -#ifndef _OSAL_STUB_XBDBLKDEV_H_ -#define _OSAL_STUB_XBDBLKDEV_H_ +#ifndef OCS_XBDBLKDEV_H +#define OCS_XBDBLKDEV_H #include #include @@ -42,4 +42,4 @@ typedef int OCS_device_t; extern OCS_device_t OCS_xbdBlkDevCreateSync(OCS_BLK_DEV *bd, const char *name); extern OCS_STATUS OCS_xbdBlkDevDelete(OCS_device_t dev, OCS_BLK_DEV **ppbd); -#endif /* _OSAL_STUB_XBDBLKDEV_H_ */ +#endif /* OCS_XBDBLKDEV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h index 92bf6ba87..4ef1f945f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for xbdRamDisk.h */ -#ifndef _OSAL_STUB_XBDRAMDISK_H_ -#define _OSAL_STUB_XBDRAMDISK_H_ +#ifndef OCS_XBDRAMDISK_H +#define OCS_XBDRAMDISK_H #include #include @@ -37,4 +37,4 @@ /* prototypes normally declared in xbdRamDisk.h */ /* ----------------------------------------- */ -#endif /* _OSAL_STUB_XBDRAMDISK_H_ */ +#endif /* OCS_XBDRAMDISK_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h b/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h index 5c5a9f90d..74b0c48d0 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for arpa/inet.h */ -#ifndef _OSAL_OVERRIDE_ARPA_INET_H_ -#define _OSAL_OVERRIDE_ARPA_INET_H_ +#ifndef OSAL_OVERRIDE_ARPA_INET_H +#define OSAL_OVERRIDE_ARPA_INET_H #include @@ -30,4 +30,4 @@ #define inet_ntop OCS_inet_ntop #define inet_pton OCS_inet_pton -#endif /* _OSAL_OVERRIDE_ARPA_INET_H_ */ +#endif /* OSAL_OVERRIDE_ARPA_INET_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/assert.h b/src/unit-test-coverage/ut-stubs/override_inc/assert.h index 6e889619e..6999e07ec 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/assert.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/assert.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for assert.h */ -#ifndef _OSAL_OVERRIDE_ASSERT_H_ -#define _OSAL_OVERRIDE_ASSERT_H_ +#ifndef OSAL_OVERRIDE_ASSERT_H +#define OSAL_OVERRIDE_ASSERT_H #include @@ -30,4 +30,4 @@ #define assert OCS_assert -#endif /* _OSAL_OVERRIDE_ASSERT_H_ */ +#endif /* OSAL_OVERRIDE_ASSERT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h b/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h index 645c242a6..3667b3f13 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for blkIo.h */ -#ifndef _OSAL_OVERRIDE_BLKIO_H_ -#define _OSAL_OVERRIDE_BLKIO_H_ +#ifndef OSAL_OVERRIDE_BLKIO_H +#define OSAL_OVERRIDE_BLKIO_H #include #include @@ -32,4 +32,4 @@ #define BLK_DEV OCS_BLK_DEV #define BLK_DEV_ID OCS_BLK_DEV_ID -#endif /* _OSAL_OVERRIDE_BLKIO_H_ */ +#endif /* OSAL_OVERRIDE_BLKIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h b/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h index eadea5868..3e4c5cebb 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_BSP_IMPL_H_ -#define INCLUDE_BSP_IMPL_H_ +#ifndef BSP_IMPL_H +#define BSP_IMPL_H #include "OCS_bsp-impl.h" @@ -43,4 +43,4 @@ END bsp-impl.h *********************/ -#endif /* INCLUDE_BSP_IMPL_H_ */ +#endif /* BSP_IMPL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h b/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h index 0310e8f77..d970c13d4 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for cbioLib.h */ -#ifndef _OSAL_OVERRIDE_CBIOLIB_H_ -#define _OSAL_OVERRIDE_CBIOLIB_H_ +#ifndef OSAL_OVERRIDE_CBIOLIB_H +#define OSAL_OVERRIDE_CBIOLIB_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in cbioLib.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_CBIOLIB_H_ */ +#endif /* OSAL_OVERRIDE_CBIOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/complex.h b/src/unit-test-coverage/ut-stubs/override_inc/complex.h index 941797e33..48c6b9cd1 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/complex.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/complex.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for complex.h */ -#ifndef _OSAL_OVERRIDE_COMPLEX_H_ -#define _OSAL_OVERRIDE_COMPLEX_H_ +#ifndef OSAL_OVERRIDE_COMPLEX_H +#define OSAL_OVERRIDE_COMPLEX_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in complex.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_COMPLEX_H_ */ +#endif /* OSAL_OVERRIDE_COMPLEX_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ctype.h b/src/unit-test-coverage/ut-stubs/override_inc/ctype.h index 1a7903a0e..b3d66aead 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ctype.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ctype.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ctype.h */ -#ifndef _OSAL_OVERRIDE_CTYPE_H_ -#define _OSAL_OVERRIDE_CTYPE_H_ +#ifndef OSAL_OVERRIDE_CTYPE_H +#define OSAL_OVERRIDE_CTYPE_H #include @@ -30,4 +30,4 @@ #define isgraph OCS_isgraph -#endif /* _OSAL_OVERRIDE_CTYPE_H_ */ +#endif /* OSAL_OVERRIDE_CTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/dirent.h b/src/unit-test-coverage/ut-stubs/override_inc/dirent.h index bbf7648a4..b29378369 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/dirent.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/dirent.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for dirent.h */ -#ifndef _OSAL_OVERRIDE_DIRENT_H_ -#define _OSAL_OVERRIDE_DIRENT_H_ +#ifndef OSAL_OVERRIDE_DIRENT_H +#define OSAL_OVERRIDE_DIRENT_H #include @@ -35,4 +35,4 @@ #define readdir OCS_readdir #define rewinddir OCS_rewinddir -#endif /* _OSAL_OVERRIDE_DIRENT_H_ */ +#endif /* OSAL_OVERRIDE_DIRENT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h b/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h index 02f9d57a0..b5cd80ebd 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for dlfcn.h */ -#ifndef _OSAL_OVERRIDE_DLFCN_H_ -#define _OSAL_OVERRIDE_DLFCN_H_ +#ifndef OSAL_OVERRIDE_DLFCN_H +#define OSAL_OVERRIDE_DLFCN_H #include @@ -33,4 +33,4 @@ #define dlopen OCS_dlopen #define dlsym OCS_dlsym -#endif /* _OSAL_OVERRIDE_DLFCN_H_ */ +#endif /* OSAL_OVERRIDE_DLFCN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h b/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h index bc3935e57..46772ffa7 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for dosFsLib.h */ -#ifndef _OSAL_OVERRIDE_DOSFSLIB_H_ -#define _OSAL_OVERRIDE_DOSFSLIB_H_ +#ifndef OSAL_OVERRIDE_DOSFSLIB_H +#define OSAL_OVERRIDE_DOSFSLIB_H #include #include @@ -36,4 +36,4 @@ #define dosFsVolFormat OCS_dosFsVolFormat -#endif /* _OSAL_OVERRIDE_DOSFSLIB_H_ */ +#endif /* OSAL_OVERRIDE_DOSFSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h b/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h index 7aca05fd5..1b9d9f659 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for drv/hdisk/ataDrv.h */ -#ifndef _OSAL_OVERRIDE_DRV_HDISK_ATADRV_H_ -#define _OSAL_OVERRIDE_DRV_HDISK_ATADRV_H_ +#ifndef OSAL_OVERRIDE_DRV_HDISK_ATADRV_H +#define OSAL_OVERRIDE_DRV_HDISK_ATADRV_H #include #include @@ -31,4 +31,4 @@ /* ----------------------------------------- */ #define ataDevCreate OCS_ataDevCreate -#endif /* _OSAL_OVERRIDE_DRV_HDISK_ATADRV_H_ */ +#endif /* OSAL_OVERRIDE_DRV_HDISK_ATADRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/errno.h b/src/unit-test-coverage/ut-stubs/override_inc/errno.h index ada97f87e..636ac2a34 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/errno.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/errno.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for errno.h */ -#ifndef _OSAL_OVERRIDE_ERRNO_H_ -#define _OSAL_OVERRIDE_ERRNO_H_ +#ifndef OSAL_OVERRIDE_ERRNO_H +#define OSAL_OVERRIDE_ERRNO_H #include @@ -36,4 +36,4 @@ #define errno OCS_errno -#endif /* _OSAL_OVERRIDE_ERRNO_H_ */ +#endif /* OSAL_OVERRIDE_ERRNO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h b/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h index c28e22fbb..0616fce77 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for errnoLib.h */ -#ifndef _OSAL_OVERRIDE_ERRNOLIB_H_ -#define _OSAL_OVERRIDE_ERRNOLIB_H_ +#ifndef OSAL_OVERRIDE_ERRNOLIB_H +#define OSAL_OVERRIDE_ERRNOLIB_H #include #include @@ -30,4 +30,4 @@ /* ----------------------------------------- */ #define errnoGet OCS_errnoGet -#endif /* _OSAL_OVERRIDE_ERRNOLIB_H_ */ +#endif /* OSAL_OVERRIDE_ERRNOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h index e78b8b3a4..8b0f2f289 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for fcntl.h */ -#ifndef _OSAL_OVERRIDE_FCNTL_H_ -#define _OSAL_OVERRIDE_FCNTL_H_ +#ifndef OSAL_OVERRIDE_FCNTL_H +#define OSAL_OVERRIDE_FCNTL_H #include @@ -53,4 +53,4 @@ #define fcntl OCS_fcntl #define open OCS_open -#endif /* _OSAL_OVERRIDE_FCNTL_H_ */ +#endif /* OSAL_OVERRIDE_FCNTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/fenv.h b/src/unit-test-coverage/ut-stubs/override_inc/fenv.h index f260c305b..0f57e4ac3 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/fenv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/fenv.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for fenv.h */ -#ifndef _OSAL_OVERRIDE_FENV_H_ -#define _OSAL_OVERRIDE_FENV_H_ +#ifndef OSAL_OVERRIDE_FENV_H +#define OSAL_OVERRIDE_FENV_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in fenv.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_FENV_H_ */ +#endif /* OSAL_OVERRIDE_FENV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/float.h b/src/unit-test-coverage/ut-stubs/override_inc/float.h index 22c3d745a..17cbacb5f 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/float.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/float.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for float.h */ -#ifndef _OSAL_OVERRIDE_FLOAT_H_ -#define _OSAL_OVERRIDE_FLOAT_H_ +#ifndef OSAL_OVERRIDE_FLOAT_H +#define OSAL_OVERRIDE_FLOAT_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in float.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_FLOAT_H_ */ +#endif /* OSAL_OVERRIDE_FLOAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h b/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h index 5ac654f15..c1597bee9 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h @@ -26,8 +26,8 @@ * OSAL coverage stub replacement for hostLib.h */ -#ifndef INCLUDE_HOSTLIB_H_ -#define INCLUDE_HOSTLIB_H_ +#ifndef HOSTLIB_H +#define HOSTLIB_H #include #include @@ -37,4 +37,4 @@ /* ----------------------------------------- */ #define hostGetByName OCS_hostGetByName -#endif /* INCLUDE_HOSTLIB_H_ */ +#endif /* HOSTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/intLib.h b/src/unit-test-coverage/ut-stubs/override_inc/intLib.h index 98b666ec6..ad7b71d30 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/intLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/intLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for intLib.h */ -#ifndef _OSAL_OVERRIDE_INTLIB_H_ -#define _OSAL_OVERRIDE_INTLIB_H_ +#ifndef OSAL_OVERRIDE_INTLIB_H +#define OSAL_OVERRIDE_INTLIB_H #include #include @@ -36,4 +36,4 @@ #define intUnlock OCS_intUnlock #define INUM_TO_IVEC OCS_INUM_TO_IVEC -#endif /* _OSAL_OVERRIDE_INTLIB_H_ */ +#endif /* OSAL_OVERRIDE_INTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h b/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h index 95d44dd03..16ea9a0de 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for inttypes.h */ -#ifndef _OSAL_OVERRIDE_INTTYPES_H_ -#define _OSAL_OVERRIDE_INTTYPES_H_ +#ifndef OSAL_OVERRIDE_INTTYPES_H +#define OSAL_OVERRIDE_INTTYPES_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in inttypes.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_INTTYPES_H_ */ +#endif /* OSAL_OVERRIDE_INTTYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h b/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h index aa8d04501..9057af7b2 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ioLib.h */ -#ifndef _OSAL_OVERRIDE_IOLIB_H_ -#define _OSAL_OVERRIDE_IOLIB_H_ +#ifndef OSAL_OVERRIDE_IOLIB_H +#define OSAL_OVERRIDE_IOLIB_H #include #include @@ -33,4 +33,4 @@ #define FIOUNMOUNT OCS_FIOUNMOUNT #define ioctl OCS_ioctl -#endif /* _OSAL_OVERRIDE_IOLIB_H_ */ +#endif /* OSAL_OVERRIDE_IOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/iv.h b/src/unit-test-coverage/ut-stubs/override_inc/iv.h index af02ea147..6d7070fda 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/iv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/iv.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for iv.h */ -#ifndef _OSAL_OVERRIDE_IV_H_ -#define _OSAL_OVERRIDE_IV_H_ +#ifndef OSAL_OVERRIDE_IV_H +#define OSAL_OVERRIDE_IV_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in iv.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_IV_H_ */ +#endif /* OSAL_OVERRIDE_IV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h b/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h index cd8324ec6..bb6503866 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for loadLib.h */ -#ifndef _OSAL_OVERRIDE_LOADLIB_H_ -#define _OSAL_OVERRIDE_LOADLIB_H_ +#ifndef OSAL_OVERRIDE_LOADLIB_H +#define OSAL_OVERRIDE_LOADLIB_H #include #include @@ -32,4 +32,4 @@ #define loadModule OCS_loadModule -#endif /* _OSAL_OVERRIDE_LOADLIB_H_ */ +#endif /* OSAL_OVERRIDE_LOADLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/locale.h b/src/unit-test-coverage/ut-stubs/override_inc/locale.h index 124963b3f..4b23b4361 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/locale.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/locale.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for locale.h */ -#ifndef _OSAL_OVERRIDE_LOCALE_H_ -#define _OSAL_OVERRIDE_LOCALE_H_ +#ifndef OSAL_OVERRIDE_LOCALE_H +#define OSAL_OVERRIDE_LOCALE_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in locale.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_LOCALE_H_ */ +#endif /* OSAL_OVERRIDE_LOCALE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/logLib.h b/src/unit-test-coverage/ut-stubs/override_inc/logLib.h index 005a1eb4f..d746d7117 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/logLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/logLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for logLib.h */ -#ifndef _OSAL_OVERRIDE_LOGLIB_H_ -#define _OSAL_OVERRIDE_LOGLIB_H_ +#ifndef OSAL_OVERRIDE_LOGLIB_H +#define OSAL_OVERRIDE_LOGLIB_H #include #include @@ -29,4 +29,4 @@ /* mappings for declarations in logLib.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_LOGLIB_H_ */ +#endif /* OSAL_OVERRIDE_LOGLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/math.h b/src/unit-test-coverage/ut-stubs/override_inc/math.h index 07d08024e..cc3845973 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/math.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/math.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for math.h */ -#ifndef _OSAL_OVERRIDE_MATH_H_ -#define _OSAL_OVERRIDE_MATH_H_ +#ifndef OSAL_OVERRIDE_MATH_H +#define OSAL_OVERRIDE_MATH_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in math.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_MATH_H_ */ +#endif /* OSAL_OVERRIDE_MATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h b/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h index 6c40c603e..37e46b4b1 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for memPartLib.h */ -#ifndef _OSAL_OVERRIDE_MEMPARTLIB_H_ -#define _OSAL_OVERRIDE_MEMPARTLIB_H_ +#ifndef OSAL_OVERRIDE_MEMPARTLIB_H +#define OSAL_OVERRIDE_MEMPARTLIB_H #include #include @@ -35,4 +35,4 @@ #define memPartInfoGet OCS_memPartInfoGet #define memSysPartId OCS_memSysPartId -#endif /* _OSAL_OVERRIDE_MEMPARTLIB_H_ */ +#endif /* OSAL_OVERRIDE_MEMPARTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h b/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h index c92fd2e0c..9e8d949de 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for moduleLib.h */ -#ifndef _OSAL_OVERRIDE_MODULELIB_H_ -#define _OSAL_OVERRIDE_MODULELIB_H_ +#ifndef OSAL_OVERRIDE_MODULELIB_H +#define OSAL_OVERRIDE_MODULELIB_H #include #include @@ -34,4 +34,4 @@ #define moduleInfoGet OCS_moduleInfoGet -#endif /* _OSAL_OVERRIDE_MODULELIB_H_ */ +#endif /* OSAL_OVERRIDE_MODULELIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h b/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h index 44b6464b3..14613166c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for mqueue.h */ -#ifndef _OSAL_OVERRIDE_MQUEUE_H_ -#define _OSAL_OVERRIDE_MQUEUE_H_ +#ifndef OSAL_OVERRIDE_MQUEUE_H +#define OSAL_OVERRIDE_MQUEUE_H #include #include @@ -39,4 +39,4 @@ #define mq_timedsend OCS_mq_timedsend #define mq_unlink OCS_mq_unlink -#endif /* _OSAL_OVERRIDE_MQUEUE_H_ */ +#endif /* OSAL_OVERRIDE_MQUEUE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h b/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h index 88a269e17..41050a5b9 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for msgQLib.h */ -#ifndef _OSAL_OVERRIDE_MSGQLIB_H_ -#define _OSAL_OVERRIDE_MSGQLIB_H_ +#ifndef OSAL_OVERRIDE_MSGQLIB_H +#define OSAL_OVERRIDE_MSGQLIB_H #include #include @@ -42,4 +42,4 @@ #define msgQReceive OCS_msgQReceive #define msgQSend OCS_msgQSend -#endif /* _OSAL_OVERRIDE_MSGQLIB_H_ */ +#endif /* OSAL_OVERRIDE_MSGQLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/net/if.h b/src/unit-test-coverage/ut-stubs/override_inc/net/if.h index e92f24a1c..04bdc16c3 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/net/if.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/net/if.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for net/if.h */ -#ifndef _OSAL_OVERRIDE_NET_IF_H_ -#define _OSAL_OVERRIDE_NET_IF_H_ +#ifndef OSAL_OVERRIDE_NET_IF_H +#define OSAL_OVERRIDE_NET_IF_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in net/if.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_NET_IF_H_ */ +#endif /* OSAL_OVERRIDE_NET_IF_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netdb.h b/src/unit-test-coverage/ut-stubs/override_inc/netdb.h index cbc87575a..44385a8b0 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netdb.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netdb.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for netdb.h */ -#ifndef _OSAL_OVERRIDE_NETDB_H_ -#define _OSAL_OVERRIDE_NETDB_H_ +#ifndef OSAL_OVERRIDE_NETDB_H +#define OSAL_OVERRIDE_NETDB_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in netdb.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_NETDB_H_ */ +#endif /* OSAL_OVERRIDE_NETDB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h b/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h index ddedb8e16..093738874 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for netinet/in.h */ -#ifndef _OSAL_OVERRIDE_NETINET_IN_H_ -#define _OSAL_OVERRIDE_NETINET_IN_H_ +#ifndef OSAL_OVERRIDE_NETINET_IN_H +#define OSAL_OVERRIDE_NETINET_IN_H #include @@ -33,4 +33,4 @@ #define htonl OCS_htonl #define ntohl OCS_ntohl -#endif /* _OSAL_OVERRIDE_NETINET_IN_H_ */ +#endif /* OSAL_OVERRIDE_NETINET_IN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h b/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h index 0aecd0f69..2509afc0e 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for netinet/tcp.h */ -#ifndef _OSAL_OVERRIDE_NETINET_TCP_H_ -#define _OSAL_OVERRIDE_NETINET_TCP_H_ +#ifndef OSAL_OVERRIDE_NETINET_TCP_H +#define OSAL_OVERRIDE_NETINET_TCP_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in netinet/tcp.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_NETINET_TCP_H_ */ +#endif /* OSAL_OVERRIDE_NETINET_TCP_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/objLib.h b/src/unit-test-coverage/ut-stubs/override_inc/objLib.h index e90e69c8d..12dc589b5 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/objLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/objLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for objLib.h */ -#ifndef _OSAL_OVERRIDE_OBJLIB_H_ -#define _OSAL_OVERRIDE_OBJLIB_H_ +#ifndef OSAL_OVERRIDE_OBJLIB_H +#define OSAL_OVERRIDE_OBJLIB_H #include #include @@ -36,4 +36,4 @@ #define S_objLib_OBJ_TIMEOUT OCS_S_objLib_OBJ_TIMEOUT #define S_objLib_OBJ_NO_METHOD OCS_S_objLib_OBJ_NO_METHOD -#endif /* _OSAL_OVERRIDE_OBJLIB_H_ */ +#endif /* OSAL_OVERRIDE_OBJLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/poll.h b/src/unit-test-coverage/ut-stubs/override_inc/poll.h index cbd8efe16..205e1f9a0 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/poll.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/poll.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for poll.h */ -#ifndef _OSAL_OVERRIDE_POLL_H_ -#define _OSAL_OVERRIDE_POLL_H_ +#ifndef OSAL_OVERRIDE_POLL_H +#define OSAL_OVERRIDE_POLL_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in poll.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_POLL_H_ */ +#endif /* OSAL_OVERRIDE_POLL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/pthread.h b/src/unit-test-coverage/ut-stubs/override_inc/pthread.h index 127afa071..858ef5b5a 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/pthread.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/pthread.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for pthread.h */ -#ifndef _OSAL_OVERRIDE_PTHREAD_H_ -#define _OSAL_OVERRIDE_PTHREAD_H_ +#ifndef OSAL_OVERRIDE_PTHREAD_H +#define OSAL_OVERRIDE_PTHREAD_H #include #include @@ -76,4 +76,4 @@ #define pthread_setspecific OCS_pthread_setspecific #define pthread_sigmask OCS_pthread_sigmask -#endif /* _OSAL_OVERRIDE_PTHREAD_H_ */ +#endif /* OSAL_OVERRIDE_PTHREAD_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h b/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h index bb55400b7..09b138a2d 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ramDiskCbio.h */ -#ifndef _OSAL_OVERRIDE_RAMDISKCBIO_H_ -#define _OSAL_OVERRIDE_RAMDISKCBIO_H_ +#ifndef OSAL_OVERRIDE_RAMDISKCBIO_H +#define OSAL_OVERRIDE_RAMDISKCBIO_H #include #include @@ -29,4 +29,4 @@ /* mappings for declarations in ramDiskCbio.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_RAMDISKCBIO_H_ */ +#endif /* OSAL_OVERRIDE_RAMDISKCBIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h b/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h index 7e37959c7..892e2212c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ramDrv.h */ -#ifndef _OSAL_OVERRIDE_RAMDRV_H_ -#define _OSAL_OVERRIDE_RAMDRV_H_ +#ifndef OSAL_OVERRIDE_RAMDRV_H +#define OSAL_OVERRIDE_RAMDRV_H #include #include @@ -32,4 +32,4 @@ #define ramDevCreate OCS_ramDevCreate -#endif /* _OSAL_OVERRIDE_RAMDRV_H_ */ +#endif /* OSAL_OVERRIDE_RAMDRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sched.h b/src/unit-test-coverage/ut-stubs/override_inc/sched.h index 1d2811ea9..f9cb17c56 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sched.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sched.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sched.h */ -#ifndef _OSAL_OVERRIDE_SCHED_H_ -#define _OSAL_OVERRIDE_SCHED_H_ +#ifndef OSAL_OVERRIDE_SCHED_H +#define OSAL_OVERRIDE_SCHED_H #include @@ -36,4 +36,4 @@ #define sched_get_priority_max OCS_sched_get_priority_max #define sched_get_priority_min OCS_sched_get_priority_min -#endif /* _OSAL_OVERRIDE_SCHED_H_ */ +#endif /* OSAL_OVERRIDE_SCHED_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h b/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h index 153bbf321..efe8f9b57 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_SELECTLIB_H_ -#define INCLUDE_SELECTLIB_H_ +#ifndef SELECTLIB_H +#define SELECTLIB_H #include #include @@ -35,4 +35,4 @@ /* mappings for declarations in selectLib.h */ /* ----------------------------------------- */ -#endif /* INCLUDE_SELECTLIB_H_ */ +#endif /* SELECTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/semLib.h b/src/unit-test-coverage/ut-stubs/override_inc/semLib.h index f7704907b..33b7a81e6 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/semLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/semLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for semLib.h */ -#ifndef _OSAL_OVERRIDE_SEMLIB_H_ -#define _OSAL_OVERRIDE_SEMLIB_H_ +#ifndef OSAL_OVERRIDE_SEMLIB_H +#define OSAL_OVERRIDE_SEMLIB_H #include #include @@ -54,4 +54,4 @@ #define semTake OCS_semTake #define semGive OCS_semGive -#endif /* _OSAL_OVERRIDE_SEMLIB_H_ */ +#endif /* OSAL_OVERRIDE_SEMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h b/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h index cf04b8636..4821f5a63 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for semaphore.h */ -#ifndef _OSAL_OVERRIDE_SEMAPHORE_H_ -#define _OSAL_OVERRIDE_SEMAPHORE_H_ +#ifndef OSAL_OVERRIDE_SEMAPHORE_H +#define OSAL_OVERRIDE_SEMAPHORE_H #include #include @@ -36,4 +36,4 @@ #define sem_timedwait OCS_sem_timedwait #define sem_wait OCS_sem_wait -#endif /* _OSAL_OVERRIDE_SEMAPHORE_H_ */ +#endif /* OSAL_OVERRIDE_SEMAPHORE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h b/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h index bf56ccd51..614e0158a 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for setjmp.h */ -#ifndef _OSAL_OVERRIDE_SETJMP_H_ -#define _OSAL_OVERRIDE_SETJMP_H_ +#ifndef OSAL_OVERRIDE_SETJMP_H +#define OSAL_OVERRIDE_SETJMP_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in setjmp.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_SETJMP_H_ */ +#endif /* OSAL_OVERRIDE_SETJMP_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h b/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h index d072d0fb3..07fe614ee 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for shellLib.h */ -#ifndef _OSAL_OVERRIDE_SHELLLIB_H_ -#define _OSAL_OVERRIDE_SHELLLIB_H_ +#ifndef OSAL_OVERRIDE_SHELLLIB_H +#define OSAL_OVERRIDE_SHELLLIB_H #include #include @@ -30,4 +30,4 @@ /* ----------------------------------------- */ #define shellGenericInit OCS_shellGenericInit -#endif /* _OSAL_OVERRIDE_SHELLLIB_H_ */ +#endif /* OSAL_OVERRIDE_SHELLLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/signal.h b/src/unit-test-coverage/ut-stubs/override_inc/signal.h index 82ac74ae9..ae34e7973 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/signal.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/signal.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for signal.h */ -#ifndef _OSAL_OVERRIDE_SIGNAL_H_ -#define _OSAL_OVERRIDE_SIGNAL_H_ +#ifndef OSAL_OVERRIDE_SIGNAL_H +#define OSAL_OVERRIDE_SIGNAL_H #include @@ -56,4 +56,4 @@ #define sigsuspend OCS_sigsuspend #define sigwait OCS_sigwait -#endif /* _OSAL_OVERRIDE_SIGNAL_H_ */ +#endif /* OSAL_OVERRIDE_SIGNAL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stat.h b/src/unit-test-coverage/ut-stubs/override_inc/stat.h index a53ada220..250dfd2b6 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stat.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stat.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stat.h */ -#ifndef _OSAL_OVERRIDE_STAT_H_ -#define _OSAL_OVERRIDE_STAT_H_ +#ifndef OSAL_OVERRIDE_STAT_H +#define OSAL_OVERRIDE_STAT_H #include @@ -40,4 +40,4 @@ #define statvfs OCS_statvfs #define statfs OCS_statvfs -#endif /* _OSAL_OVERRIDE_STAT_H_ */ +#endif /* OSAL_OVERRIDE_STAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h b/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h index 50f84b773..bff62d729 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stdarg.h */ -#ifndef _OSAL_OVERRIDE_STDARG_H_ -#define _OSAL_OVERRIDE_STDARG_H_ +#ifndef OSAL_OVERRIDE_STDARG_H +#define OSAL_OVERRIDE_STDARG_H #include @@ -32,4 +32,4 @@ #define va_start(ap, last) OCS_va_start(ap, last) #define va_end(ap) OCS_va_end(ap) -#endif /* _OSAL_OVERRIDE_STDARG_H_ */ +#endif /* OSAL_OVERRIDE_STDARG_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdio.h b/src/unit-test-coverage/ut-stubs/override_inc/stdio.h index ef1afa2c1..b8c5e42fa 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdio.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdio.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stdio.h */ -#ifndef _OSAL_OVERRIDE_STDIO_H_ -#define _OSAL_OVERRIDE_STDIO_H_ +#ifndef OSAL_OVERRIDE_STDIO_H +#define OSAL_OVERRIDE_STDIO_H #include @@ -44,4 +44,4 @@ #define stdout OCS_stdout #define stderr OCS_stderr -#endif /* _OSAL_OVERRIDE_STDIO_H_ */ +#endif /* OSAL_OVERRIDE_STDIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h b/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h index 2d16d6cf2..5659a1daa 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for stdlib.h */ -#ifndef _OSAL_OVERRIDE_STDLIB_H_ -#define _OSAL_OVERRIDE_STDLIB_H_ +#ifndef OSAL_OVERRIDE_STDLIB_H +#define OSAL_OVERRIDE_STDLIB_H #include @@ -36,4 +36,4 @@ #define malloc OCS_malloc #define free OCS_free -#endif /* _OSAL_OVERRIDE_STDLIB_H_ */ +#endif /* OSAL_OVERRIDE_STDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/string.h b/src/unit-test-coverage/ut-stubs/override_inc/string.h index 86b4d6046..e9048c118 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/string.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/string.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for string.h */ -#ifndef _OSAL_OVERRIDE_STRING_H_ -#define _OSAL_OVERRIDE_STRING_H_ +#ifndef OSAL_OVERRIDE_STRING_H +#define OSAL_OVERRIDE_STRING_H #include @@ -40,4 +40,4 @@ #define strncat OCS_strncat #define strerror OCS_strerror -#endif /* _OSAL_OVERRIDE_STRING_H_ */ +#endif /* OSAL_OVERRIDE_STRING_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/strings.h b/src/unit-test-coverage/ut-stubs/override_inc/strings.h index 8e799498b..226344f2d 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/strings.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/strings.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for strings.h */ -#ifndef _OSAL_OVERRIDE_STRINGS_H_ -#define _OSAL_OVERRIDE_STRINGS_H_ +#ifndef OSAL_OVERRIDE_STRINGS_H +#define OSAL_OVERRIDE_STRINGS_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in strings.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_STRINGS_H_ */ +#endif /* OSAL_OVERRIDE_STRINGS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/symLib.h b/src/unit-test-coverage/ut-stubs/override_inc/symLib.h index 8513fa755..66ede2c2e 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/symLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/symLib.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_SYMLIB_H_ -#define INCLUDE_SYMLIB_H_ +#ifndef SYMLIB_H +#define SYMLIB_H #include #include @@ -51,4 +51,4 @@ #define symEach OCS_symEach #define symFind OCS_symFind -#endif /* INCLUDE_SYMLIB_H_ */ +#endif /* SYMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h index d0748e8a5..e510b4c15 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/ioctl.h */ -#ifndef _OSAL_OVERRIDE_SYS_IOCTL_H_ -#define _OSAL_OVERRIDE_SYS_IOCTL_H_ +#ifndef OSAL_OVERRIDE_SYS_IOCTL_H +#define OSAL_OVERRIDE_SYS_IOCTL_H #include @@ -30,4 +30,4 @@ #define ioctl OCS_ioctl -#endif /* _OSAL_OVERRIDE_SYS_IOCTL_H_ */ +#endif /* OSAL_OVERRIDE_SYS_IOCTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h index db1c81f5b..e94760c2d 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/ipc.h */ -#ifndef _OSAL_OVERRIDE_SYS_IPC_H_ -#define _OSAL_OVERRIDE_SYS_IPC_H_ +#ifndef OSAL_OVERRIDE_SYS_IPC_H +#define OSAL_OVERRIDE_SYS_IPC_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in sys/ipc.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_SYS_IPC_H_ */ +#endif /* OSAL_OVERRIDE_SYS_IPC_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h index 675abaf7f..f4d9e40bb 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/mman.h */ -#ifndef _OSAL_OVERRIDE_SYS_MMAN_H_ -#define _OSAL_OVERRIDE_SYS_MMAN_H_ +#ifndef OSAL_OVERRIDE_SYS_MMAN_H +#define OSAL_OVERRIDE_SYS_MMAN_H #include @@ -38,4 +38,4 @@ #define mmap OCS_mmap #define munmap OCS_munmap -#endif /* _OSAL_OVERRIDE_SYS_MMAN_H_ */ +#endif /* OSAL_OVERRIDE_SYS_MMAN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h index 649137bdf..8f7809ef1 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_SELECT_H_ -#define INCLUDE_SELECT_H_ +#ifndef SELECT_H +#define SELECT_H #include @@ -50,4 +50,4 @@ #define FD_CLR OCS_FD_CLR #define FD_ZERO OCS_FD_ZERO -#endif /* INCLUDE_SELECT_H_ */ +#endif /* SELECT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h index e3d401b9f..d2014f1f9 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h @@ -19,10 +19,10 @@ */ /* OSAL coverage stub replacement for sys/signal.h */ -#ifndef _OSAL_OVERRIDE_SYS_SIGNAL_H_ -#define _OSAL_OVERRIDE_SYS_SIGNAL_H_ +#ifndef OSAL_OVERRIDE_SYS_SIGNAL_H +#define OSAL_OVERRIDE_SYS_SIGNAL_H /* alias to signal.h */ #include -#endif /* _OSAL_OVERRIDE_SYS_SIGNAL_H_ */ +#endif /* OSAL_OVERRIDE_SYS_SIGNAL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h index bb1ef7309..50c5bf346 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/socket.h */ -#ifndef _OSAL_OVERRIDE_SYS_SOCKET_H_ -#define _OSAL_OVERRIDE_SYS_SOCKET_H_ +#ifndef OSAL_OVERRIDE_SYS_SOCKET_H +#define OSAL_OVERRIDE_SYS_SOCKET_H #include @@ -39,4 +39,4 @@ #define setsockopt OCS_setsockopt #define socket OCS_socket -#endif /* _OSAL_OVERRIDE_SYS_SOCKET_H_ */ +#endif /* OSAL_OVERRIDE_SYS_SOCKET_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h index a63bfc525..575ad693a 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h @@ -19,10 +19,10 @@ */ /* OSAL coverage stub replacement for sys/stat.h */ -#ifndef _OSAL_OVERRIDE_SYS_STAT_H_ -#define _OSAL_OVERRIDE_SYS_STAT_H_ +#ifndef OSAL_OVERRIDE_SYS_STAT_H +#define OSAL_OVERRIDE_SYS_STAT_H /* alias to stat.h */ #include -#endif /* _OSAL_OVERRIDE_SYS_STAT_H_ */ +#endif /* OSAL_OVERRIDE_SYS_STAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h index feb6fa97d..a024f1700 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h @@ -19,10 +19,10 @@ */ /* OSAL coverage stub replacement for sys/statvfs.h */ -#ifndef _OSAL_OVERRIDE_SYS_STATVFS_H_ -#define _OSAL_OVERRIDE_SYS_STATVFS_H_ +#ifndef OSAL_OVERRIDE_SYS_STATVFS_H +#define OSAL_OVERRIDE_SYS_STATVFS_H /* alias to stat.h */ #include -#endif /* _OSAL_OVERRIDE_SYS_STATVFS_H_ */ +#endif /* OSAL_OVERRIDE_SYS_STATVFS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h index d327024cb..5c25ab547 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/time.h */ -#ifndef _OSAL_OVERRIDE_SYS_TIME_H_ -#define _OSAL_OVERRIDE_SYS_TIME_H_ +#ifndef OSAL_OVERRIDE_SYS_TIME_H +#define OSAL_OVERRIDE_SYS_TIME_H #include #include @@ -29,4 +29,4 @@ /* mappings for declarations in sys/time.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_SYS_TIME_H_ */ +#endif /* OSAL_OVERRIDE_SYS_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h index e4c6626c7..fe9f01c68 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/times.h */ -#ifndef _OSAL_OVERRIDE_SYS_TIMES_H_ -#define _OSAL_OVERRIDE_SYS_TIMES_H_ +#ifndef OSAL_OVERRIDE_SYS_TIMES_H +#define OSAL_OVERRIDE_SYS_TIMES_H #include #include @@ -29,4 +29,4 @@ /* mappings for declarations in sys/times.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_SYS_TIMES_H_ */ +#endif /* OSAL_OVERRIDE_SYS_TIMES_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h index 50ef43ffa..a6e83d510 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/types.h */ -#ifndef _OSAL_OVERRIDE_SYS_TYPES_H_ -#define _OSAL_OVERRIDE_SYS_TYPES_H_ +#ifndef OSAL_OVERRIDE_SYS_TYPES_H +#define OSAL_OVERRIDE_SYS_TYPES_H #include @@ -34,4 +34,4 @@ #define gid_t OCS_gid_t #define uid_t OCS_uid_t -#endif /* _OSAL_OVERRIDE_SYS_TYPES_H_ */ +#endif /* OSAL_OVERRIDE_SYS_TYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h index 7f093ac5c..57540467e 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/un.h */ -#ifndef _OSAL_OVERRIDE_SYS_UN_H_ -#define _OSAL_OVERRIDE_SYS_UN_H_ +#ifndef OSAL_OVERRIDE_SYS_UN_H +#define OSAL_OVERRIDE_SYS_UN_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in sys/un.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_SYS_UN_H_ */ +#endif /* OSAL_OVERRIDE_SYS_UN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h index 358781c80..497834d24 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sys/wait.h */ -#ifndef _OSAL_OVERRIDE_SYS_WAIT_H_ -#define _OSAL_OVERRIDE_SYS_WAIT_H_ +#ifndef OSAL_OVERRIDE_SYS_WAIT_H +#define OSAL_OVERRIDE_SYS_WAIT_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in sys/wait.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_SYS_WAIT_H_ */ +#endif /* OSAL_OVERRIDE_SYS_WAIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h b/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h index 06363364e..b26213cc7 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for sysLib.h */ -#ifndef _OSAL_OVERRIDE_SYSLIB_H_ -#define _OSAL_OVERRIDE_SYSLIB_H_ +#ifndef OSAL_OVERRIDE_SYSLIB_H +#define OSAL_OVERRIDE_SYSLIB_H #include #include @@ -30,4 +30,4 @@ /* ----------------------------------------- */ #define sysClkRateGet OCS_sysClkRateGet -#endif /* _OSAL_OVERRIDE_SYSLIB_H_ */ +#endif /* OSAL_OVERRIDE_SYSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h b/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h index 625923443..dcf88983f 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for taskLib.h */ -#ifndef _OSAL_OVERRIDE_TASKLIB_H_ -#define _OSAL_OVERRIDE_TASKLIB_H_ +#ifndef OSAL_OVERRIDE_TASKLIB_H +#define OSAL_OVERRIDE_TASKLIB_H #include #include @@ -53,4 +53,4 @@ #define taskInit OCS_taskInit #define taskTcb OCS_taskTcb -#endif /* _OSAL_OVERRIDE_TASKLIB_H_ */ +#endif /* OSAL_OVERRIDE_TASKLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h b/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h index 470bafd88..1e89cb3b3 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for taskVarLib.h */ -#ifndef _OSAL_OVERRIDE_TASKVARLIB_H_ -#define _OSAL_OVERRIDE_TASKVARLIB_H_ +#ifndef OSAL_OVERRIDE_TASKVARLIB_H +#define OSAL_OVERRIDE_TASKVARLIB_H #include #include @@ -31,4 +31,4 @@ #define taskVarAdd OCS_taskVarAdd -#endif /* _OSAL_OVERRIDE_TASKVARLIB_H_ */ +#endif /* OSAL_OVERRIDE_TASKVARLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/termios.h b/src/unit-test-coverage/ut-stubs/override_inc/termios.h index fbab2171d..8713f77a0 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/termios.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/termios.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for termios.h */ -#ifndef _OSAL_OVERRIDE_TERMIOS_H_ -#define _OSAL_OVERRIDE_TERMIOS_H_ +#ifndef OSAL_OVERRIDE_TERMIOS_H +#define OSAL_OVERRIDE_TERMIOS_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in termios.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_TERMIOS_H_ */ +#endif /* OSAL_OVERRIDE_TERMIOS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h b/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h index 0643ca2bd..419f4118c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for tgmath.h */ -#ifndef _OSAL_OVERRIDE_TGMATH_H_ -#define _OSAL_OVERRIDE_TGMATH_H_ +#ifndef OSAL_OVERRIDE_TGMATH_H +#define OSAL_OVERRIDE_TGMATH_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in tgmath.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_TGMATH_H_ */ +#endif /* OSAL_OVERRIDE_TGMATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/time.h b/src/unit-test-coverage/ut-stubs/override_inc/time.h index 67e0cf09e..d5d4cd298 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/time.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/time.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for time.h */ -#ifndef _OSAL_OVERRIDE_TIME_H_ -#define _OSAL_OVERRIDE_TIME_H_ +#ifndef OSAL_OVERRIDE_TIME_H +#define OSAL_OVERRIDE_TIME_H #include @@ -51,4 +51,4 @@ #define timer_settime OCS_timer_settime #define timer_connect OCS_timer_connect -#endif /* _OSAL_OVERRIDE_TIME_H_ */ +#endif /* OSAL_OVERRIDE_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/timers.h b/src/unit-test-coverage/ut-stubs/override_inc/timers.h index eae5889c6..843fcdbff 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/timers.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/timers.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for timers.h */ -#ifndef _OSAL_OVERRIDE_TIMERS_H_ -#define _OSAL_OVERRIDE_TIMERS_H_ +#ifndef OSAL_OVERRIDE_TIMERS_H +#define OSAL_OVERRIDE_TIMERS_H #include #include @@ -29,4 +29,4 @@ * Note: this is just an alias for time.h */ -#endif /* _OSAL_OVERRIDE_TIMERS_H_ */ +#endif /* OSAL_OVERRIDE_TIMERS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h b/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h index 7a26b4009..93d0c4039 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for ulimit.h */ -#ifndef _OSAL_OVERRIDE_ULIMIT_H_ -#define _OSAL_OVERRIDE_ULIMIT_H_ +#ifndef OSAL_OVERRIDE_ULIMIT_H +#define OSAL_OVERRIDE_ULIMIT_H #include @@ -29,4 +29,4 @@ /* ----------------------------------------- */ #define ulimit OCS_ulimit -#endif /* _OSAL_OVERRIDE_ULIMIT_H_ */ +#endif /* OSAL_OVERRIDE_ULIMIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/unistd.h b/src/unit-test-coverage/ut-stubs/override_inc/unistd.h index 2f77e11a6..a4c334d25 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/unistd.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/unistd.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for unistd.h */ -#ifndef _OSAL_OVERRIDE_UNISTD_H_ -#define _OSAL_OVERRIDE_UNISTD_H_ +#ifndef OSAL_OVERRIDE_UNISTD_H +#define OSAL_OVERRIDE_UNISTD_H #include @@ -47,4 +47,4 @@ #define sysconf OCS_sysconf #define write OCS_write -#endif /* _OSAL_OVERRIDE_UNISTD_H_ */ +#endif /* OSAL_OVERRIDE_UNISTD_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h b/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h index ed7fb77f7..29a5f4546 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for unldLib.h */ -#ifndef _OSAL_OVERRIDE_UNLDLIB_H_ -#define _OSAL_OVERRIDE_UNLDLIB_H_ +#ifndef OSAL_OVERRIDE_UNLDLIB_H +#define OSAL_OVERRIDE_UNLDLIB_H #include #include @@ -31,4 +31,4 @@ /* ----------------------------------------- */ #define unldByModuleId OCS_unldByModuleId -#endif /* _OSAL_OVERRIDE_UNLDLIB_H_ */ +#endif /* OSAL_OVERRIDE_UNLDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h b/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h index 7d1eda6b1..3ff95193c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for usrLib.h */ -#ifndef _OSAL_OVERRIDE_USRLIB_H_ -#define _OSAL_OVERRIDE_USRLIB_H_ +#ifndef OSAL_OVERRIDE_USRLIB_H +#define OSAL_OVERRIDE_USRLIB_H #include #include @@ -29,4 +29,4 @@ /* mappings for declarations in usrLib.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_USRLIB_H_ */ +#endif /* OSAL_OVERRIDE_USRLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/version.h b/src/unit-test-coverage/ut-stubs/override_inc/version.h index fac7aaaef..f9c4cc62f 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/version.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/version.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for version.h */ -#ifndef _OSAL_OVERRIDE_VERSION_H_ -#define _OSAL_OVERRIDE_VERSION_H_ +#ifndef OSAL_OVERRIDE_VERSION_H +#define OSAL_OVERRIDE_VERSION_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in version.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_VERSION_H_ */ +#endif /* OSAL_OVERRIDE_VERSION_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h b/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h index 1c9572df7..2fd8fe4f3 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_VXWORKS_H_ -#define INCLUDE_VXWORKS_H_ +#ifndef VXWORKS_H +#define VXWORKS_H #include @@ -53,4 +53,4 @@ #define _Vx_usr_arg_t OCS_Vx_usr_arg_t -#endif /* INCLUDE_VXWORKS_H_ */ +#endif /* VXWORKS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/wchar.h b/src/unit-test-coverage/ut-stubs/override_inc/wchar.h index 00f72b272..253f6b37e 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/wchar.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/wchar.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for wchar.h */ -#ifndef _OSAL_OVERRIDE_WCHAR_H_ -#define _OSAL_OVERRIDE_WCHAR_H_ +#ifndef OSAL_OVERRIDE_WCHAR_H +#define OSAL_OVERRIDE_WCHAR_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in wchar.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_WCHAR_H_ */ +#endif /* OSAL_OVERRIDE_WCHAR_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/wctype.h b/src/unit-test-coverage/ut-stubs/override_inc/wctype.h index cc2d3fbc3..5718491ec 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/wctype.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/wctype.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for wctype.h */ -#ifndef _OSAL_OVERRIDE_WCTYPE_H_ -#define _OSAL_OVERRIDE_WCTYPE_H_ +#ifndef OSAL_OVERRIDE_WCTYPE_H +#define OSAL_OVERRIDE_WCTYPE_H #include @@ -28,4 +28,4 @@ /* mappings for declarations in wctype.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_WCTYPE_H_ */ +#endif /* OSAL_OVERRIDE_WCTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h b/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h index 03bf58d16..4f8d7ca3b 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for xbdBlkDev.h */ -#ifndef _OSAL_OVERRIDE_XBDBLKDEV_H_ -#define _OSAL_OVERRIDE_XBDBLKDEV_H_ +#ifndef OSAL_OVERRIDE_XBDBLKDEV_H +#define OSAL_OVERRIDE_XBDBLKDEV_H #include #include @@ -35,4 +35,4 @@ #define xbdBlkDevCreateSync OCS_xbdBlkDevCreateSync #define xbdBlkDevDelete OCS_xbdBlkDevDelete -#endif /* _OSAL_OVERRIDE_XBDBLKDEV_H_ */ +#endif /* OSAL_OVERRIDE_XBDBLKDEV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h b/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h index 4b01cf054..f5e282797 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for xbdRamDisk.h */ -#ifndef _OSAL_OVERRIDE_XBDRAMDISK_H_ -#define _OSAL_OVERRIDE_XBDRAMDISK_H_ +#ifndef OSAL_OVERRIDE_XBDRAMDISK_H +#define OSAL_OVERRIDE_XBDRAMDISK_H #include #include @@ -29,4 +29,4 @@ /* mappings for declarations in xbdRamDisk.h */ /* ----------------------------------------- */ -#endif /* _OSAL_OVERRIDE_XBDRAMDISK_H_ */ +#endif /* OSAL_OVERRIDE_XBDRAMDISK_H */ diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c index fdf9844c4..963d79173 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c @@ -33,6 +33,7 @@ #include "utstubs.h" #include "os-shared-task.h" +#include "osapi-idmap.h" /* ** Task API diff --git a/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c index 0ce005221..5f93bddfb 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c @@ -19,8 +19,8 @@ */ /* OSAL coverage stub replacement for dlfcn.h */ -#ifndef _OSAL_STUB_DLFCN_H_ -#define _OSAL_STUB_DLFCN_H_ +#ifndef OCS_DLFCN_H +#define OCS_DLFCN_H /* ----------------------------------------- */ /* constants normally defined in dlfcn.h */ @@ -39,4 +39,4 @@ extern char *OCS_dlerror(void); extern void *OCS_dlopen(const char *file, int mode); extern void *OCS_dlsym(void *handle, const char *name); -#endif /* _OSAL_STUB_DLFCN_H_ */ +#endif /* OCS_DLFCN_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h index 01033e846..7975d296b 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_BINSEM_H_ -#define INCLUDE_UT_ADAPTOR_BINSEM_H_ +#ifndef UT_ADAPTOR_BINSEM_H +#define UT_ADAPTOR_BINSEM_H -#include +#include "common_types.h" #include #include #include @@ -48,4 +48,4 @@ extern const UT_EntryKey_t UT_StubKey_GenericSemGive; extern int32 UT_Call_OS_VxWorks_BinSemAPI_Impl_Init(void); -#endif /* INCLUDE_UT_ADAPTOR_BINSEM_H_ */ +#endif /* UT_ADAPTOR_BINSEM_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h index 30d9dfd18..c1c7b645d 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_COMMON_H_ -#define INCLUDE_UT_ADAPTOR_COMMON_H_ +#ifndef UT_ADAPTOR_COMMON_H +#define UT_ADAPTOR_COMMON_H -#include +#include "common_types.h" #include #include @@ -55,4 +55,4 @@ extern int32 OS_VxWorks_GenericSemGive(OCS_SEM_ID vxid); */ extern const UT_EntryKey_t UT_StubKey_OS_VxWorks_TableMutex_Init; -#endif /* INCLUDE_UT_ADAPTOR_COMMON_H_ */ +#endif /* UT_ADAPTOR_COMMON_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h index 09e32d736..835ca465f 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_CONSOLE_H_ -#define INCLUDE_UT_ADAPTOR_CONSOLE_H_ +#ifndef UT_ADAPTOR_CONSOLE_H +#define UT_ADAPTOR_CONSOLE_H -#include +#include "common_types.h" #include "ut-adaptor-common.h" extern void *const UT_Ref_OS_impl_console_table; @@ -44,4 +44,4 @@ extern void UT_ConsoleTest_TaskEntry(int arg); */ extern void UT_ConsoleTest_SetConsoleAsync(osal_index_t local_id, bool is_async); -#endif /* INCLUDE_UT_ADAPTOR_CONSOLE_H_ */ +#endif /* UT_ADAPTOR_CONSOLE_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h index eed755c48..b074ce878 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_COUNTSEM_H_ -#define INCLUDE_UT_ADAPTOR_COUNTSEM_H_ +#ifndef UT_ADAPTOR_COUNTSEM_H +#define UT_ADAPTOR_COUNTSEM_H -#include +#include "common_types.h" #include #include @@ -46,4 +46,4 @@ extern size_t const UT_Ref_OS_impl_count_sem_table_SIZE; int32 UT_Call_OS_VxWorks_CountSemAPI_Impl_Init(void); -#endif /* INCLUDE_UT_ADAPTOR_COUNTSEM_H_ */ +#endif /* UT_ADAPTOR_COUNTSEM_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h index b93409c41..3ffb95cf4 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_DIRS_H_ -#define INCLUDE_UT_ADAPTOR_DIRS_H_ +#ifndef UT_ADAPTOR_DIRS_H +#define UT_ADAPTOR_DIRS_H -#include +#include "common_types.h" /***************************************************** * @@ -44,4 +44,4 @@ */ extern int32 UT_Call_OS_VxWorks_DirAPI_Impl_Init(void); -#endif /* INCLUDE_UT_ADAPTOR_DIRS_H_ */ +#endif /* UT_ADAPTOR_DIRS_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h index 949902ff8..4bc2f7b44 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_FILES_H_ -#define INCLUDE_UT_ADAPTOR_FILES_H_ +#ifndef UT_ADAPTOR_FILES_H +#define UT_ADAPTOR_FILES_H -#include +#include "common_types.h" /***************************************************** * @@ -55,4 +55,4 @@ unsigned int UT_FileTest_GetSelfEGID(void); void UT_FileTest_Set_Selectable(osal_index_t local_id, bool is_selectable); -#endif /* INCLUDE_UT_ADAPTOR_FILES_H_ */ +#endif /* UT_ADAPTOR_FILES_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h index 8bba10b82..5f6ec4f51 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_FILESYS_H_ -#define INCLUDE_UT_ADAPTOR_FILESYS_H_ +#ifndef UT_ADAPTOR_FILESYS_H +#define UT_ADAPTOR_FILESYS_H -#include +#include "common_types.h" #include extern void *const UT_Ref_OS_impl_filesys_table; @@ -36,4 +36,4 @@ extern size_t const UT_Ref_OS_impl_filesys_table_SIZE; void UT_FileSysTest_SetupFileSysEntry(osal_index_t id, OCS_BLK_DEV *blkdev, OCS_device_t xbddev, uint32 MaxParts); -#endif /* INCLUDE_UT_ADAPTOR_FILESYS_H_ */ +#endif /* UT_ADAPTOR_FILESYS_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h index 873c17237..4b4e00172 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h @@ -25,13 +25,13 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_FILETABLE_STUB_H_ -#define INCLUDE_UT_ADAPTOR_FILETABLE_STUB_H_ +#ifndef UT_ADAPTOR_FILETABLE_STUB_H +#define UT_ADAPTOR_FILETABLE_STUB_H -#include +#include "common_types.h" #include extern void *const UT_FileTableTest_OS_impl_filehandle_table; extern size_t const UT_FileTableTest_OS_impl_filehandle_table_SIZE; -#endif /* INCLUDE_UT_ADAPTOR_FILETABLE_STUB_H_ */ +#endif /* UT_ADAPTOR_FILETABLE_STUB_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h index 53e158e1e..b2daaa36a 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_IDMAP_H_ -#define INCLUDE_UT_ADAPTOR_IDMAP_H_ +#ifndef UT_ADAPTOR_IDMAP_H +#define UT_ADAPTOR_IDMAP_H -#include +#include "common_types.h" #include /***************************************************** @@ -42,4 +42,4 @@ int32 UT_Call_OS_VxWorks_TableMutex_Init(osal_objtype_t idtype); void UT_IdMapTest_SetImplTableMutex(osal_objtype_t idtype, OCS_SEM_ID vxid); -#endif /* INCLUDE_UT_ADAPTOR_IDMAP_H_ */ +#endif /* UT_ADAPTOR_IDMAP_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h index e3447fe52..4e04fb3e3 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_LOADER_H_ -#define INCLUDE_UT_ADAPTOR_LOADER_H_ +#ifndef UT_ADAPTOR_LOADER_H +#define UT_ADAPTOR_LOADER_H -#include +#include "common_types.h" #include #include #include @@ -38,4 +38,4 @@ extern size_t const UT_Ref_OS_impl_module_table_SIZE; extern int32 UT_Call_OS_VxWorks_ModuleAPI_Impl_Init(void); -#endif /* INCLUDE_UT_ADAPTOR_LOADER_H_ */ +#endif /* UT_ADAPTOR_LOADER_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h index f30c94c27..52485d7a4 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_MUTEX_H_ -#define INCLUDE_UT_ADAPTOR_MUTEX_H_ +#ifndef UT_ADAPTOR_MUTEX_H +#define UT_ADAPTOR_MUTEX_H -#include +#include "common_types.h" #include #include @@ -46,4 +46,4 @@ extern size_t const UT_Ref_OS_impl_mutex_table_SIZE; int32 UT_Call_OS_VxWorks_MutexAPI_Impl_Init(void); -#endif /* INCLUDE_UT_ADAPTOR_MUTEX_H_ */ +#endif /* UT_ADAPTOR_MUTEX_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h index e630e85ba..4e0cd2360 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_QUEUES_H_ -#define INCLUDE_UT_ADAPTOR_QUEUES_H_ +#ifndef UT_ADAPTOR_QUEUES_H +#define UT_ADAPTOR_QUEUES_H -#include +#include "common_types.h" #include extern void *const UT_Ref_OS_impl_queue_table; @@ -45,4 +45,4 @@ extern size_t const UT_Ref_OS_impl_queue_table_SIZE; int32 UT_Call_OS_VxWorks_QueueAPI_Impl_Init(void); -#endif /* INCLUDE_UT_ADAPTOR_QUEUES_H_ */ +#endif /* UT_ADAPTOR_QUEUES_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h index a234335fe..01d3d86db 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h @@ -25,11 +25,11 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_SYMTAB_H_ -#define INCLUDE_UT_ADAPTOR_SYMTAB_H_ +#ifndef UT_ADAPTOR_SYMTAB_H +#define UT_ADAPTOR_SYMTAB_H -#include +#include "common_types.h" int32 UT_SymTabTest_CallIteratorFunc(const char *name, void *val, size_t TestSize, size_t SizeLimit); -#endif /* INCLUDE_UT_ADAPTOR_SYMTAB_H_ */ +#endif /* UT_ADAPTOR_SYMTAB_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h index b0a4bbb67..df8114f4a 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_TASKS_H_ -#define INCLUDE_UT_ADAPTOR_TASKS_H_ +#ifndef UT_ADAPTOR_TASKS_H +#define UT_ADAPTOR_TASKS_H -#include +#include "common_types.h" #include extern void *const UT_Ref_OS_impl_task_table; @@ -48,4 +48,4 @@ void UT_TaskTest_SetImplTaskId(osal_index_t local_id, OCS_TASK_ID TaskI int UT_TaskTest_CallEntryPoint(osal_id_t arg); OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(osal_index_t local_id); -#endif /* INCLUDE_UT_ADAPTOR_TASKS_H_ */ +#endif /* UT_ADAPTOR_TASKS_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h index 515cb534c..6581b0329 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h @@ -25,10 +25,10 @@ * */ -#ifndef INCLUDE_UT_ADAPTOR_TIMEBASE_H_ -#define INCLUDE_UT_ADAPTOR_TIMEBASE_H_ +#ifndef UT_ADAPTOR_TIMEBASE_H +#define UT_ADAPTOR_TIMEBASE_H -#include +#include "common_types.h" #include #include @@ -62,4 +62,4 @@ bool UT_TimeBaseTest_CheckTimeBaseErrorState(osal_index_t local_id); /* Invoke the internal UsecToTimespec API */ void UT_TimeBaseTest_UsecToTimespec(uint32 usecs, struct OCS_timespec *time_spec); -#endif /* INCLUDE_UT_ADAPTOR_TIMEBASE_H_ */ +#endif /* UT_ADAPTOR_TIMEBASE_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-common.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-common.c index 9c68e5cdb..065795735 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-common.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-common.c @@ -26,7 +26,7 @@ */ /* pull in the OSAL configuration */ -#include +#include "osconfig.h" #include #include diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c index 4b4440eb7..272937652 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c @@ -25,7 +25,7 @@ * */ /* pull in the OSAL configuration */ -#include +#include "osconfig.h" #include #include diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c index f256dbaa9..4fdeabb57 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-tasks.c @@ -31,6 +31,7 @@ #include #include +#include "osapi-idmap.h" void *const UT_Ref_OS_impl_task_table = OS_impl_task_table; size_t const UT_Ref_OS_impl_task_table_SIZE = sizeof(OS_impl_task_table); diff --git a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h index 629929372..334ebe41c 100644 --- a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h +++ b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h @@ -25,8 +25,8 @@ * */ -#ifndef INCLUDE_OS_VXWORKS_COVERAGETEST_H_ -#define INCLUDE_OS_VXWORKS_COVERAGETEST_H_ +#ifndef OS_VXWORKS_COVERAGETEST_H +#define OS_VXWORKS_COVERAGETEST_H #include #include @@ -71,4 +71,4 @@ void Osapi_Test_Setup(void); void Osapi_Test_Teardown(void); -#endif /* INCLUDE_OS_VXWORKS_COVERAGETEST_H_ */ +#endif /* OS_VXWORKS_COVERAGETEST_H */ diff --git a/src/unit-tests/inc/ut_os_support.h b/src/unit-tests/inc/ut_os_support.h index 86e841b83..147fef09f 100644 --- a/src/unit-tests/inc/ut_os_support.h +++ b/src/unit-tests/inc/ut_os_support.h @@ -24,8 +24,8 @@ ** Date: May 2013 **================================================================================*/ -#ifndef _UT_OS_SUPPORT_H_ -#define _UT_OS_SUPPORT_H_ +#ifndef UT_OS_SUPPORT_H +#define UT_OS_SUPPORT_H /*--------------------------------------------------------------------------------* ** Includes @@ -137,7 +137,7 @@ static inline bool UtOsalImplemented(int32 Fn, const char *File, uint32 Line) /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OS_SUPPORT_H_ */ +#endif /* UT_OS_SUPPORT_H */ /*================================================================================* ** End of File: ut_os_support.h diff --git a/src/unit-tests/oscore-test/ut_oscore_binsem_test.h b/src/unit-tests/oscore-test/ut_oscore_binsem_test.h index 591c207ca..6aa311fe0 100644 --- a/src/unit-tests/oscore-test/ut_oscore_binsem_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_binsem_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSCORE_BINSEM_TEST_H_ -#define _UT_OSCORE_BINSEM_TEST_H_ +#ifndef UT_OSCORE_BINSEM_TEST_H +#define UT_OSCORE_BINSEM_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -64,7 +64,7 @@ void UT_os_bin_sem_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_BINSEM_TEST_H_ */ +#endif /* UT_OSCORE_BINSEM_TEST_H */ /*================================================================================* ** End of File: ut_oscore_binsem_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_countsem_test.h b/src/unit-tests/oscore-test/ut_oscore_countsem_test.h index 3e011f7b2..71e9d31d6 100644 --- a/src/unit-tests/oscore-test/ut_oscore_countsem_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_countsem_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSCORE_COUNTSEM_TEST_H_ -#define _UT_OSCORE_COUNTSEM_TEST_H_ +#ifndef UT_OSCORE_COUNTSEM_TEST_H +#define UT_OSCORE_COUNTSEM_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -63,7 +63,7 @@ void UT_os_count_sem_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_COUNTSEM_TEST_H_ */ +#endif /* UT_OSCORE_COUNTSEM_TEST_H */ /*================================================================================* ** End of File: ut_oscore_countsem_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.h b/src/unit-tests/oscore-test/ut_oscore_misc_test.h index 1510f5c42..ffed19bea 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSCORE_MISC_TEST_H_ -#define _UT_OSCORE_MISC_TEST_H_ +#ifndef UT_OSCORE_MISC_TEST_H +#define UT_OSCORE_MISC_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -68,7 +68,7 @@ void UT_os_heapgetinfo_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_MISC_TEST_H_ */ +#endif /* UT_OSCORE_MISC_TEST_H */ /*================================================================================* ** End of File: ut_oscore_misc_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_mutex_test.h b/src/unit-tests/oscore-test/ut_oscore_mutex_test.h index 6c0b30b1a..a476ca410 100644 --- a/src/unit-tests/oscore-test/ut_oscore_mutex_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_mutex_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSCORE_MUTEX_TEST_H_ -#define _UT_OSCORE_MUTEX_TEST_H_ +#ifndef UT_OSCORE_MUTEX_TEST_H +#define UT_OSCORE_MUTEX_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -62,7 +62,7 @@ void UT_os_mut_sem_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_MUTEX_TEST_H_ */ +#endif /* UT_OSCORE_MUTEX_TEST_H */ /*================================================================================* ** End of File: ut_oscore_mutex_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_queue_test.h b/src/unit-tests/oscore-test/ut_oscore_queue_test.h index ab8305cbf..1499ac770 100644 --- a/src/unit-tests/oscore-test/ut_oscore_queue_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_queue_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSCORE_QUEUE_TEST_H_ -#define _UT_OSCORE_QUEUE_TEST_H_ +#ifndef UT_OSCORE_QUEUE_TEST_H +#define UT_OSCORE_QUEUE_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -62,7 +62,7 @@ void UT_os_queue_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_QUEUE_TEST_H_ */ +#endif /* UT_OSCORE_QUEUE_TEST_H */ /*================================================================================* ** End of File: ut_oscore_queue_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_select_test.h b/src/unit-tests/oscore-test/ut_oscore_select_test.h index 1187f3ea7..ab2e57c6b 100644 --- a/src/unit-tests/oscore-test/ut_oscore_select_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_select_test.h @@ -24,8 +24,8 @@ ** Date: March 2020 **================================================================================*/ -#ifndef _UT_OSCORE_SELECT_TEST_H_ -#define _UT_OSCORE_SELECT_TEST_H_ +#ifndef UT_OSCORE_SELECT_TEST_H +#define UT_OSCORE_SELECT_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -59,7 +59,7 @@ void UT_os_select_multi_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_SELECT_TEST_H_ */ +#endif /* UT_OSCORE_SELECT_TEST_H */ /*================================================================================* ** End of File: ut_oscore_select_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_task_test.h b/src/unit-tests/oscore-test/ut_oscore_task_test.h index 2a1a55df3..69425ad15 100644 --- a/src/unit-tests/oscore-test/ut_oscore_task_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_task_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSCORE_TASK_TEST_H_ -#define _UT_OSCORE_TASK_TEST_H_ +#ifndef UT_OSCORE_TASK_TEST_H +#define UT_OSCORE_TASK_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -69,7 +69,7 @@ void UT_os_task_get_id_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_TASK_TEST_H_ */ +#endif /* UT_OSCORE_TASK_TEST_H */ /*================================================================================* ** End of File: ut_oscore_task_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_test.h b/src/unit-tests/oscore-test/ut_oscore_test.h index 1be4ae0f9..90848ac2b 100644 --- a/src/unit-tests/oscore-test/ut_oscore_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_test.h @@ -24,8 +24,8 @@ ** Date: May 2013 **================================================================================*/ -#ifndef _UT_OSCORE_TEST_H_ -#define _UT_OSCORE_TEST_H_ +#ifndef UT_OSCORE_TEST_H +#define UT_OSCORE_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -62,7 +62,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSCORE_TEST_H_ */ +#endif /* UT_OSCORE_TEST_H */ /*================================================================================* ** End of File: ut_oscore_test_posix.h diff --git a/src/unit-tests/osfile-test/ut_osfile_dirio_test.h b/src/unit-tests/osfile-test/ut_osfile_dirio_test.h index e118631c8..62cca6385 100644 --- a/src/unit-tests/osfile-test/ut_osfile_dirio_test.h +++ b/src/unit-tests/osfile-test/ut_osfile_dirio_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSFILE_DIRIO_H_ -#define _UT_OSFILE_DIRIO_H_ +#ifndef UT_OSFILE_DIRIO_H +#define UT_OSFILE_DIRIO_H /*--------------------------------------------------------------------------------* ** Includes @@ -64,7 +64,7 @@ void UT_os_removedir_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSFILE_DIRIO_H_ */ +#endif /* UT_OSFILE_DIRIO_H */ /*================================================================================* ** End of File: ut_osfile_dirio.h diff --git a/src/unit-tests/osfile-test/ut_osfile_fileio_test.h b/src/unit-tests/osfile-test/ut_osfile_fileio_test.h index 9db8da7f1..c605f912b 100644 --- a/src/unit-tests/osfile-test/ut_osfile_fileio_test.h +++ b/src/unit-tests/osfile-test/ut_osfile_fileio_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSFILE_FILEIO_H_ -#define _UT_OSFILE_FILEIO_H_ +#ifndef UT_OSFILE_FILEIO_H +#define UT_OSFILE_FILEIO_H /*--------------------------------------------------------------------------------* ** Includes @@ -80,7 +80,7 @@ void UT_os_closefilebyname_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSFILE_FILEIO_H_ */ +#endif /* UT_OSFILE_FILEIO_H */ /*================================================================================* ** End of File: ut_osfile_fileio.h diff --git a/src/unit-tests/osfile-test/ut_osfile_test.h b/src/unit-tests/osfile-test/ut_osfile_test.h index a5d2497e3..ab4c9c624 100644 --- a/src/unit-tests/osfile-test/ut_osfile_test.h +++ b/src/unit-tests/osfile-test/ut_osfile_test.h @@ -24,8 +24,8 @@ ** Date: May 2013 **================================================================================*/ -#ifndef _UT_OSFILE_TEST_H_ -#define _UT_OSFILE_TEST_H_ +#ifndef UT_OSFILE_TEST_H +#define UT_OSFILE_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -57,7 +57,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSFILE_TEST_H_ */ +#endif /* UT_OSFILE_TEST_H */ /*================================================================================* ** End of File: ut_osfile_test.h diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h index 65e4e4f37..c6ab2dd2a 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSFILESYS_DISKIO_TEST_H_ -#define _UT_OSFILESYS_DISKIO_TEST_H_ +#ifndef UT_OSFILESYS_DISKIO_TEST_H +#define UT_OSFILESYS_DISKIO_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -74,7 +74,7 @@ void UT_os_fsbytesfree_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSFILESYS_DISKIO_TEST_H_ */ +#endif /* UT_OSFILESYS_DISKIO_TEST_H */ /*================================================================================* ** End of File: ut_osfilesys_diskio_test.h diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_test.h b/src/unit-tests/osfilesys-test/ut_osfilesys_test.h index 71e1074bb..d80f62bdc 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_test.h +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_test.h @@ -24,8 +24,8 @@ ** Date: May 2013 **================================================================================*/ -#ifndef _UT_OSFILESYS_TEST_H_ -#define _UT_OSFILESYS_TEST_H_ +#ifndef UT_OSFILESYS_TEST_H +#define UT_OSFILESYS_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -56,7 +56,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSFILESYS_TEST_H_ */ +#endif /* UT_OSFILESYS_TEST_H */ /*================================================================================* ** End of File: ut_osfilesys_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_module_test.h b/src/unit-tests/osloader-test/ut_osloader_module_test.h index c27ee25b1..c63c923f5 100644 --- a/src/unit-tests/osloader-test/ut_osloader_module_test.h +++ b/src/unit-tests/osloader-test/ut_osloader_module_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSLOADER_MODULE_TEST_H_ -#define _UT_OSLOADER_MODULE_TEST_H_ +#ifndef UT_OSLOADER_MODULE_TEST_H +#define UT_OSLOADER_MODULE_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -59,7 +59,7 @@ void UT_os_module_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSLOADER_MODULE_TEST_H_ */ +#endif /* UT_OSLOADER_MODULE_TEST_H */ /*================================================================================* ** End of File: ut_osloader_module_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_symtable_test.h b/src/unit-tests/osloader-test/ut_osloader_symtable_test.h index a98972cac..de756c85e 100644 --- a/src/unit-tests/osloader-test/ut_osloader_symtable_test.h +++ b/src/unit-tests/osloader-test/ut_osloader_symtable_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSLOADER_SYMTABLE_TEST_H_ -#define _UT_OSLOADER_SYMTABLE_TEST_H_ +#ifndef UT_OSLOADER_SYMTABLE_TEST_H +#define UT_OSLOADER_SYMTABLE_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -59,7 +59,7 @@ void UT_os_symbol_table_dump_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSLOADER_SYMTABLE_TEST_H_ */ +#endif /* UT_OSLOADER_SYMTABLE_TEST_H */ /*================================================================================* ** End of File: ut_osloader_symtable_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_test.h b/src/unit-tests/osloader-test/ut_osloader_test.h index 07cca7b47..43941ef39 100644 --- a/src/unit-tests/osloader-test/ut_osloader_test.h +++ b/src/unit-tests/osloader-test/ut_osloader_test.h @@ -24,8 +24,8 @@ ** Date: May 2013 **================================================================================*/ -#ifndef _UT_OSLOADER_TEST_H_ -#define _UT_OSLOADER_TEST_H_ +#ifndef UT_OSLOADER_TEST_H +#define UT_OSLOADER_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -57,7 +57,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSLOADER_TEST_H_ */ +#endif /* UT_OSLOADER_TEST_H */ /*================================================================================* ** End of File: ut_osloader_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_test_platforms.h b/src/unit-tests/osloader-test/ut_osloader_test_platforms.h index f15858a3b..49aadbe12 100644 --- a/src/unit-tests/osloader-test/ut_osloader_test_platforms.h +++ b/src/unit-tests/osloader-test/ut_osloader_test_platforms.h @@ -24,8 +24,8 @@ ** Date: November 2014 **================================================================================*/ -#ifndef _UT_OSLOADER_TEST_PLATFORMS_H_ -#define _UT_OSLOADER_TEST_PLATFORMS_H_ +#ifndef UT_OSLOADER_TEST_PLATFORMS_H +#define UT_OSLOADER_TEST_PLATFORMS_H /*--------------------------------------------------------------------------------* ** Includes @@ -63,7 +63,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSLOADER_TEST_PLATFORMS_H_ */ +#endif /* UT_OSLOADER_TEST_PLATFORMS_H */ /*================================================================================* ** End of File: ut_osloader_test_platforms.h diff --git a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h index 1ecca7390..aeb22d05f 100644 --- a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h +++ b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSNETWORK_MISC_TEST_H_ -#define _UT_OSNETWORK_MISC_TEST_H_ +#ifndef UT_OSNETWORK_MISC_TEST_H +#define UT_OSNETWORK_MISC_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -58,7 +58,7 @@ void UT_os_networkgethostname_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSNETWORK_MISC_TEST_H_ */ +#endif /* UT_OSNETWORK_MISC_TEST_H */ /*================================================================================* ** End of File: ut_osnetwork_misc_test.h diff --git a/src/unit-tests/osnetwork-test/ut_osnetwork_test.h b/src/unit-tests/osnetwork-test/ut_osnetwork_test.h index 447e9a9a3..8a08d2767 100644 --- a/src/unit-tests/osnetwork-test/ut_osnetwork_test.h +++ b/src/unit-tests/osnetwork-test/ut_osnetwork_test.h @@ -24,8 +24,8 @@ ** Date: May 2013 **================================================================================*/ -#ifndef _UT_OSNETWORK_TEST_H_ -#define _UT_OSNETWORK_TEST_H_ +#ifndef UT_OSNETWORK_TEST_H +#define UT_OSNETWORK_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -56,7 +56,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSNETWORK_TEST_H_ */ +#endif /* UT_OSNETWORK_TEST_H */ /*================================================================================* ** End of File: ut_osnetwork_test.h diff --git a/src/unit-tests/ostimer-test/ut_ostimer_test.h b/src/unit-tests/ostimer-test/ut_ostimer_test.h index 100e80b49..e5f890386 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_test.h +++ b/src/unit-tests/ostimer-test/ut_ostimer_test.h @@ -24,8 +24,8 @@ ** Date: May 2013 **================================================================================*/ -#ifndef _UT_OSTIMER_TEST_H_ -#define _UT_OSTIMER_TEST_H_ +#ifndef UT_OSTIMER_TEST_H +#define UT_OSTIMER_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -56,7 +56,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSTIMER_TEST_H_ */ +#endif /* UT_OSTIMER_TEST_H */ /*================================================================================* ** End of File: ut_ostimer_test.h diff --git a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h index 22ad95c14..9a1501906 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h +++ b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h @@ -24,8 +24,8 @@ ** Date: April 2013 **================================================================================*/ -#ifndef _UT_OSTIMER_TIMERIO_TEST_H_ -#define _UT_OSTIMER_TIMERIO_TEST_H_ +#ifndef UT_OSTIMER_TIMERIO_TEST_H +#define UT_OSTIMER_TIMERIO_TEST_H /*--------------------------------------------------------------------------------* ** Includes @@ -64,7 +64,7 @@ void UT_os_timergetinfo_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* _UT_OSTIMER_TIMERIO_TEST_H_ */ +#endif /* UT_OSTIMER_TIMERIO_TEST_H */ /*================================================================================* ** End of File: ut_ostimer_timerio_test.h diff --git a/src/ut-stubs/osapi-utstub-binsem.c b/src/ut-stubs/osapi-utstub-binsem.c index 77f94d94e..e85d4559e 100644 --- a/src/ut-stubs/osapi-utstub-binsem.c +++ b/src/ut-stubs/osapi-utstub-binsem.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-binsem.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_BinSemAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-bsp.c b/src/ut-stubs/osapi-utstub-bsp.c index cb0262844..0b2acd90d 100644 --- a/src/ut-stubs/osapi-utstub-bsp.c +++ b/src/ut-stubs/osapi-utstub-bsp.c @@ -30,6 +30,7 @@ * can be executed. */ +#include "osapi-bsp.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" /* diff --git a/src/ut-stubs/osapi-utstub-clock.c b/src/ut-stubs/osapi-utstub-clock.c index 7aaa20498..37686f582 100644 --- a/src/ut-stubs/osapi-utstub-clock.c +++ b/src/ut-stubs/osapi-utstub-clock.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-clock.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" /***************************************************************************** diff --git a/src/ut-stubs/osapi-utstub-common.c b/src/ut-stubs/osapi-utstub-common.c index 6ebc96c8a..bd121f640 100644 --- a/src/ut-stubs/osapi-utstub-common.c +++ b/src/ut-stubs/osapi-utstub-common.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-common.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" /***************************************************************************** diff --git a/src/ut-stubs/osapi-utstub-countsem.c b/src/ut-stubs/osapi-utstub-countsem.c index f6cc0db10..f4c4d3934 100644 --- a/src/ut-stubs/osapi-utstub-countsem.c +++ b/src/ut-stubs/osapi-utstub-countsem.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-countsem.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_CountSemAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-dir.c b/src/ut-stubs/osapi-utstub-dir.c index 7d4bc977f..7f53306e8 100644 --- a/src/ut-stubs/osapi-utstub-dir.c +++ b/src/ut-stubs/osapi-utstub-dir.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-dir.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_DirAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-errors.c b/src/ut-stubs/osapi-utstub-errors.c index 082881ae1..151b44cc4 100644 --- a/src/ut-stubs/osapi-utstub-errors.c +++ b/src/ut-stubs/osapi-utstub-errors.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-error.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) diff --git a/src/ut-stubs/osapi-utstub-file.c b/src/ut-stubs/osapi-utstub-file.c index 196d9a74e..6efd2913f 100644 --- a/src/ut-stubs/osapi-utstub-file.c +++ b/src/ut-stubs/osapi-utstub-file.c @@ -32,6 +32,8 @@ * can be executed. */ +#include "osapi-file.h" /* OSAL public API for this subsystem */ +#include "osapi-idmap.h" #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_FileAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-filesys.c b/src/ut-stubs/osapi-utstub-filesys.c index de1d2a5b9..02188510c 100644 --- a/src/ut-stubs/osapi-utstub-filesys.c +++ b/src/ut-stubs/osapi-utstub-filesys.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-filesys.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_FileSysAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-heap.c b/src/ut-stubs/osapi-utstub-heap.c index b2229da86..bf3145f75 100644 --- a/src/ut-stubs/osapi-utstub-heap.c +++ b/src/ut-stubs/osapi-utstub-heap.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-heap.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" /***************************************************************************** diff --git a/src/ut-stubs/osapi-utstub-idmap.c b/src/ut-stubs/osapi-utstub-idmap.c index 3526f98e5..3c9972b9b 100644 --- a/src/ut-stubs/osapi-utstub-idmap.c +++ b/src/ut-stubs/osapi-utstub-idmap.c @@ -36,6 +36,7 @@ * OSAL itself (not for coverage testing other units). */ +#include "osapi-idmap.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" #include "os-shared-idmap.h" diff --git a/src/ut-stubs/osapi-utstub-module.c b/src/ut-stubs/osapi-utstub-module.c index 0d4839e91..793369360 100644 --- a/src/ut-stubs/osapi-utstub-module.c +++ b/src/ut-stubs/osapi-utstub-module.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-module.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_ModuleAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-mutex.c b/src/ut-stubs/osapi-utstub-mutex.c index 0e3d28629..baf060e93 100644 --- a/src/ut-stubs/osapi-utstub-mutex.c +++ b/src/ut-stubs/osapi-utstub-mutex.c @@ -30,6 +30,7 @@ * can be executed. */ +#include "osapi-mutex.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_MutexAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-network.c b/src/ut-stubs/osapi-utstub-network.c index d7348d062..549ffb8bc 100644 --- a/src/ut-stubs/osapi-utstub-network.c +++ b/src/ut-stubs/osapi-utstub-network.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-network.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_NetworkAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-printf.c b/src/ut-stubs/osapi-utstub-printf.c index cdbed0bf6..afe5d8db2 100644 --- a/src/ut-stubs/osapi-utstub-printf.c +++ b/src/ut-stubs/osapi-utstub-printf.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-printf.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" int32 OS_ConsoleAPI_Init(void) diff --git a/src/ut-stubs/osapi-utstub-queue.c b/src/ut-stubs/osapi-utstub-queue.c index 9a94a937b..77ed039ac 100644 --- a/src/ut-stubs/osapi-utstub-queue.c +++ b/src/ut-stubs/osapi-utstub-queue.c @@ -32,6 +32,8 @@ * can be executed. */ +#include "osapi-queue.h" /* OSAL public API for this subsystem */ +#include "osapi-idmap.h" #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_QueueAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-select.c b/src/ut-stubs/osapi-utstub-select.c index 96514bd33..eca0b48cd 100644 --- a/src/ut-stubs/osapi-utstub-select.c +++ b/src/ut-stubs/osapi-utstub-select.c @@ -30,6 +30,7 @@ * can be executed. */ +#include "osapi-select.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" /***************************************************************************** diff --git a/src/ut-stubs/osapi-utstub-sockets.c b/src/ut-stubs/osapi-utstub-sockets.c index 78e0264c7..3eb783d15 100644 --- a/src/ut-stubs/osapi-utstub-sockets.c +++ b/src/ut-stubs/osapi-utstub-sockets.c @@ -30,6 +30,7 @@ * can be executed. */ +#include "osapi-sockets.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_SocketAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-task.c b/src/ut-stubs/osapi-utstub-task.c index ea980de68..f29990f8b 100644 --- a/src/ut-stubs/osapi-utstub-task.c +++ b/src/ut-stubs/osapi-utstub-task.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-task.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_TaskAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-time.c b/src/ut-stubs/osapi-utstub-time.c index e6783689d..585463c67 100644 --- a/src/ut-stubs/osapi-utstub-time.c +++ b/src/ut-stubs/osapi-utstub-time.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-timer.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_TimerCbAPI_Init, (void)) diff --git a/src/ut-stubs/osapi-utstub-timebase.c b/src/ut-stubs/osapi-utstub-timebase.c index 96664c7bd..16b490479 100644 --- a/src/ut-stubs/osapi-utstub-timebase.c +++ b/src/ut-stubs/osapi-utstub-timebase.c @@ -32,6 +32,7 @@ * can be executed. */ +#include "osapi-timebase.h" /* OSAL public API for this subsystem */ #include "utstub-helpers.h" UT_DEFAULT_STUB(OS_TimeBaseAPI_Init, (void)) diff --git a/src/ut-stubs/utstub-helpers.c b/src/ut-stubs/utstub-helpers.c index ce6750e7d..22abd573e 100644 --- a/src/ut-stubs/utstub-helpers.c +++ b/src/ut-stubs/utstub-helpers.c @@ -34,6 +34,8 @@ #include "utstub-helpers.h" +#include "osapi-idmap.h" + const uint32 UT_MAXOBJS[UT_OBJTYPE_MAX] = {[UT_OBJTYPE_TASK] = OS_MAX_TASKS, [UT_OBJTYPE_QUEUE] = OS_MAX_QUEUES, [UT_OBJTYPE_COUNTSEM] = OS_MAX_COUNT_SEMAPHORES, diff --git a/src/ut-stubs/utstub-helpers.h b/src/ut-stubs/utstub-helpers.h index 5d8997639..bb7775e9c 100644 --- a/src/ut-stubs/utstub-helpers.h +++ b/src/ut-stubs/utstub-helpers.h @@ -32,8 +32,8 @@ * can be executed. */ -#ifndef __OSAPI_UTSTUB_INTERNAL_H_ -#define __OSAPI_UTSTUB_INTERNAL_H_ +#ifndef OSAPI_UTSTUB_INTERNAL_H +#define OSAPI_UTSTUB_INTERNAL_H /* * Commonly used C library headers @@ -43,7 +43,9 @@ /* * Include all relevant OSAPI (public) and UT-assert headers */ -#include "osapi.h" +#include "common_types.h" +#include "osapi-error.h" +#include "osapi-constants.h" #include "utstubs.h" #include "utbsp.h" #include "utassert.h" diff --git a/ut_assert/inc/utassert.h b/ut_assert/inc/utassert.h index 2cf56b747..87ebf9a14 100644 --- a/ut_assert/inc/utassert.h +++ b/ut_assert/inc/utassert.h @@ -31,8 +31,8 @@ * - All asserts must call the function UtAssert. */ -#ifndef _utassert_ -#define _utassert_ +#ifndef UTASSERT_H +#define UTASSERT_H /* * Includes diff --git a/ut_assert/inc/utbsp.h b/ut_assert/inc/utbsp.h index 949c62347..109e94ce6 100644 --- a/ut_assert/inc/utbsp.h +++ b/ut_assert/inc/utbsp.h @@ -40,8 +40,8 @@ * and the way pass/fail determinations are made. */ -#ifndef _UTBSP_H_ -#define _UTBSP_H_ +#ifndef UTBSP_H +#define UTBSP_H #include "common_types.h" #include "utassert.h" @@ -100,4 +100,4 @@ void UT_BSP_DoText(uint8 MessageType, const char *OutputMessage); */ void UT_BSP_EndTest(const UtAssert_TestCounter_t *TestCounters); -#endif /* _UTBSP_H_ */ +#endif /* UTBSP_H */ diff --git a/ut_assert/inc/utlist.h b/ut_assert/inc/utlist.h index be834d128..e51d1f69b 100644 --- a/ut_assert/inc/utlist.h +++ b/ut_assert/inc/utlist.h @@ -24,8 +24,8 @@ * Purpose: This file contains functions to implement a generic linked list data structure. */ -#ifndef _utlist_ -#define _utlist_ +#ifndef UTLIST_H +#define UTLIST_H /* * Includes diff --git a/ut_assert/inc/utstubs.h b/ut_assert/inc/utstubs.h index 79082c8fa..af525e553 100644 --- a/ut_assert/inc/utstubs.h +++ b/ut_assert/inc/utstubs.h @@ -36,8 +36,8 @@ * */ -#ifndef _UTSTUBS_H_ -#define _UTSTUBS_H_ +#ifndef UTSTUBS_H +#define UTSTUBS_H #include #include "common_types.h" @@ -520,4 +520,4 @@ int32 UT_DefaultStubImpl(const char *FunctionName, UT_EntryKey_t FuncKey, int32 return UT_DEFAULT_IMPL(FuncName); \ } -#endif /* _UTSTUBS_H_ */ +#endif /* UTSTUBS_H */ diff --git a/ut_assert/inc/uttest.h b/ut_assert/inc/uttest.h index fe56cd7fc..b5bc71adb 100644 --- a/ut_assert/inc/uttest.h +++ b/ut_assert/inc/uttest.h @@ -29,8 +29,8 @@ * test output define the macro UT_VERBOSE. */ -#ifndef _uttest_ -#define _uttest_ +#ifndef UTTEST_H +#define UTTEST_H #include diff --git a/ut_assert/inc/uttools.h b/ut_assert/inc/uttools.h index ecdaf9d6b..95db31dcd 100644 --- a/ut_assert/inc/uttools.h +++ b/ut_assert/inc/uttools.h @@ -24,8 +24,8 @@ * Purpose: This file contains functions to implement a set of tools for use in unit testing. */ -#ifndef _uttools_ -#define _uttools_ +#ifndef UTTOOLS_H +#define UTTOOLS_H /* * Includes diff --git a/ut_assert/src/utglobal.h b/ut_assert/src/utglobal.h index dcc569781..7664a3415 100644 --- a/ut_assert/src/utglobal.h +++ b/ut_assert/src/utglobal.h @@ -28,8 +28,8 @@ * Includes */ -#ifndef INCLUDE_UTASSERT_GLOBAL_H_ -#define INCLUDE_UTASSERT_GLOBAL_H_ +#ifndef UTASSERT_GLOBAL_H +#define UTASSERT_GLOBAL_H #include "osapi.h" #include "utassert.h" @@ -64,4 +64,4 @@ typedef struct */ extern UtAssert_Global_t UtAssert_Global; -#endif /* INCLUDE_UTASSERT_GLOBAL_H_ */ +#endif /* UTASSERT_GLOBAL_H */ From a41f748e460eadd279370d69907d2c302efe798c Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Wed, 9 Dec 2020 09:07:14 -0500 Subject: [PATCH 032/111] Fix #673 #677, improve global lock on POSIX Removes the signal mask updates from the POSIX global lock (not needed). Adds a condition variable to the structure, which can be used to directly wake up a waiting task rather than requiring that task to poll the global state. --- src/os/posix/src/os-impl-idmap.c | 137 ++++++++++++++---- src/os/rtems/src/os-impl-idmap.c | 26 ++++ src/os/shared/inc/os-shared-common.h | 16 ++ src/os/shared/inc/os-shared-idmap.h | 13 ++ src/os/shared/src/osapi-idmap.c | 42 +++++- .../shared/src/coveragetest-idmap.c | 5 +- .../ut-stubs/src/osapi-common-impl-stubs.c | 5 + 7 files changed, 208 insertions(+), 36 deletions(-) diff --git a/src/os/posix/src/os-impl-idmap.c b/src/os/posix/src/os-impl-idmap.c index 64b29aeef..348bb75ad 100644 --- a/src/os/posix/src/os-impl-idmap.c +++ b/src/os/posix/src/os-impl-idmap.c @@ -38,7 +38,7 @@ typedef struct { pthread_mutex_t mutex; - sigset_t sigmask; + pthread_cond_t cond; } POSIX_GlobalLock_t; static POSIX_GlobalLock_t OS_global_task_table_mut; @@ -75,6 +75,15 @@ enum MUTEX_TABLE_SIZE = (sizeof(MUTEX_TABLE) / sizeof(MUTEX_TABLE[0])) }; +/*--------------------------------------------------------------------------------------- + * Helper function for releasing the mutex in case the thread + * executing pthread_condwait() is canceled. + ----------------------------------------------------------------------------------------*/ +void OS_Posix_ReleaseTableMutex(void *mut) +{ + pthread_mutex_unlock(mut); +} + /*---------------------------------------------------------------- * * Function: OS_Lock_Global_Impl @@ -86,28 +95,27 @@ enum int32 OS_Lock_Global_Impl(osal_objtype_t idtype) { POSIX_GlobalLock_t *mut; - sigset_t previous; - - mut = MUTEX_TABLE[idtype]; + int ret; - if (mut == NULL) + if (idtype < MUTEX_TABLE_SIZE) { - return OS_ERROR; + mut = MUTEX_TABLE[idtype]; } - - if (pthread_sigmask(SIG_SETMASK, &POSIX_GlobalVars.MaximumSigMask, &previous) != 0) + else { - return OS_ERROR; + mut = NULL; } - if (pthread_mutex_lock(&mut->mutex) != 0) + if (mut != NULL) { - return OS_ERROR; + ret = pthread_mutex_lock(&mut->mutex); + if (ret != 0) + { + OS_DEBUG("pthread_mutex_lock(&mut->mutex): %s", strerror(ret)); + return OS_ERROR; + } } - /* Only set values inside the GlobalLock _after_ it is locked */ - mut->sigmask = previous; - return OS_SUCCESS; } /* end OS_Lock_Global_Impl */ @@ -122,7 +130,7 @@ int32 OS_Lock_Global_Impl(osal_objtype_t idtype) int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) { POSIX_GlobalLock_t *mut; - sigset_t previous; + int ret; if (idtype < MUTEX_TABLE_SIZE) { @@ -133,23 +141,74 @@ int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) mut = NULL; } - if (mut == NULL) + if (mut != NULL) { - return OS_ERROR; + /* Notify any waiting threads that the state _may_ have changed */ + ret = pthread_cond_broadcast(&mut->cond); + if (ret != 0) + { + OS_DEBUG("pthread_cond_broadcast(&mut->cond): %s", strerror(ret)); + /* unexpected but keep going (not critical) */ + } + + ret = pthread_mutex_unlock(&mut->mutex); + if (ret != 0) + { + OS_DEBUG("pthread_mutex_unlock(&mut->mutex): %s", strerror(ret)); + return OS_ERROR; + } } - /* Only get values inside the GlobalLock _before_ it is unlocked */ - previous = mut->sigmask; + return OS_SUCCESS; +} /* end OS_Unlock_Global_Impl */ + +/*---------------------------------------------------------------- + * + * Function: OS_WaitForStateChange_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) +{ + POSIX_GlobalLock_t *impl; + struct timespec ts; + + impl = MUTEX_TABLE[idtype]; - if (pthread_mutex_unlock(&mut->mutex) != 0) + if (impl != NULL) { - return OS_ERROR; - } + /* + * because pthread_cond_timedwait() is also a cancellation point, + * this pushes a cleanup handler to ensure that if canceled during this call, + * the mutex will be released. + */ + pthread_cleanup_push(OS_Posix_ReleaseTableMutex, &impl->mutex); - pthread_sigmask(SIG_SETMASK, &previous, NULL); + clock_gettime(CLOCK_REALTIME, &ts); - return OS_SUCCESS; -} /* end OS_Unlock_Global_Impl */ + if (attempts <= 10) + { + /* Wait an increasing amount of time, starting at 10ms */ + ts.tv_nsec += attempts * attempts * 10000000; + if (ts.tv_nsec >= 1000000000) + { + ts.tv_nsec -= 1000000000; + ++ts.tv_sec; + } + } + else + { + /* wait 1 second (max for polling) */ + ++ts.tv_sec; + } + + pthread_cond_timedwait(&impl->cond, &impl->mutex, &ts); + + pthread_cleanup_pop(false); + } +} /*--------------------------------------------------------------------------------------- Name: OS_Posix_TableMutex_Init @@ -163,6 +222,7 @@ int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) int ret; int32 return_code = OS_SUCCESS; pthread_mutexattr_t mutex_attr; + POSIX_GlobalLock_t *impl; do { @@ -171,14 +231,16 @@ int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) break; } + impl = MUTEX_TABLE[idtype]; + /* Initialize the table mutex for the given idtype */ - if (MUTEX_TABLE[idtype] == NULL) + if (impl == NULL) { break; } /* - ** initialize the pthread mutex attribute structure with default values + * initialize the pthread mutex attribute structure with default values */ ret = pthread_mutexattr_init(&mutex_attr); if (ret != 0) @@ -189,7 +251,7 @@ int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) } /* - ** Allow the mutex to use priority inheritance + * Allow the mutex to use priority inheritance */ ret = pthread_mutexattr_setprotocol(&mutex_attr, PTHREAD_PRIO_INHERIT); if (ret != 0) @@ -200,10 +262,10 @@ int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) } /* - ** Set the mutex type to RECURSIVE so a thread can do nested locks - ** TBD - not sure if this is really desired, but keep it for now. + * Use normal (faster/non-recursive) mutex implementation + * There should not be any instances of OSAL locking its own table more than once. */ - ret = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + ret = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_NORMAL); if (ret != 0) { OS_DEBUG("Error: pthread_mutexattr_settype failed: %s\n", strerror(ret)); @@ -211,13 +273,24 @@ int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) break; } - ret = pthread_mutex_init(&MUTEX_TABLE[idtype]->mutex, &mutex_attr); + ret = pthread_mutex_init(&impl->mutex, &mutex_attr); if (ret != 0) { OS_DEBUG("Error: pthread_mutex_init failed: %s\n", strerror(ret)); return_code = OS_ERROR; break; } + + /* create a condition variable with default attributes. + * This will be broadcast every time the object table changes */ + ret = pthread_cond_init(&impl->cond, NULL); + if (ret != 0) + { + OS_DEBUG("Error: pthread_cond_init failed: %s\n", strerror(ret)); + return_code = OS_ERROR; + break; + } + } while (0); return (return_code); diff --git a/src/os/rtems/src/os-impl-idmap.c b/src/os/rtems/src/os-impl-idmap.c index 7e08b6986..5036e97b1 100644 --- a/src/os/rtems/src/os-impl-idmap.c +++ b/src/os/rtems/src/os-impl-idmap.c @@ -146,6 +146,32 @@ int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) return OS_SUCCESS; } /* end OS_Unlock_Global_Impl */ +/*---------------------------------------------------------------- + * + * Function: OS_WaitForStateChange_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) +{ + uint32 wait_ms; + + if (attempts <= 10) + { + wait_ms = attempts * attempts * 10; + } + else + { + wait_ms = 1000; + } + + OS_Unlock_Global_Impl(idtype); + OS_TaskDelay(wait_ms); + OS_Lock_Global_Impl(idtype); +} + /**************************************************************************************** INITIALIZATION FUNCTION ***************************************************************************************/ diff --git a/src/os/shared/inc/os-shared-common.h b/src/os/shared/inc/os-shared-common.h index 7ad513e24..0cc8a07db 100644 --- a/src/os/shared/inc/os-shared-common.h +++ b/src/os/shared/inc/os-shared-common.h @@ -127,4 +127,20 @@ void OS_IdleLoop_Impl(void); ------------------------------------------------------------------*/ void OS_ApplicationShutdown_Impl(void); +/*---------------------------------------------------------------- + + Function: OS_WaitForStateChange_Impl + + Purpose: Block the caller until some sort of change event + has occurred for the given object type, such as a record changing + state i.e. the acquisition or release of a lock/refcount from + another thread. + + It is not guaranteed what, if any, state change has actually + occured when this function returns. This may be implement as + a simple OS_TaskDelay(). + + ------------------------------------------------------------------*/ +void OS_WaitForStateChange_Impl(osal_objtype_t objtype, uint32 attempts); + #endif /* INCLUDE_OS_SHARED_COMMON_H_ */ diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index a63d2eea6..a9e244137 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -176,6 +176,19 @@ void OS_Unlock_Global(osal_objtype_t idtype); ------------------------------------------------------------------*/ int32 OS_Unlock_Global_Impl(osal_objtype_t idtype); +/*---------------------------------------------------------------- + + Function: OS_WaitForStateChange + + Purpose: Waits for a change in the global table identified by "idtype" + + NOTE: The table must be already "owned" (via OS_Lock_Global) by the calling + at the time this function is invoked. The lock is released and re-acquired + before returning from this function. + + -----------------------------------------------------------------*/ +void OS_WaitForStateChange(osal_objtype_t idtype, uint32 attempts); + /* Function prototypes for routines implemented in common layers but private to OSAL diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 0ccaf16f0..c4d944ea6 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -433,9 +433,10 @@ int32 OS_ObjectIdConvertToken(OS_object_token_t *token) break; } - OS_Unlock_Global(token->obj_type); - OS_TaskDelay_Impl(attempts); - OS_Lock_Global(token->obj_type); + /* + * Call the impl layer to wait for some sort of change to occur. + */ + OS_WaitForStateChange(token->obj_type, attempts); } /* @@ -730,6 +731,41 @@ void OS_Unlock_Global(osal_objtype_t idtype) } } +/*---------------------------------------------------------------- + * + * Function: OS_WaitForStateChange + * + * Purpose: Local helper routine, not part of OSAL API. + * Waits for a change in the global table identified by "idtype" + * + *-----------------------------------------------------------------*/ +void OS_WaitForStateChange(osal_objtype_t idtype, uint32 attempts) +{ + osal_id_t saved_owner_id; + OS_objtype_state_t *objtype; + + if (idtype < OS_OBJECT_TYPE_USER) + { + objtype = &OS_objtype_state[idtype]; + saved_owner_id = objtype->table_owner; + + /* temporarily release the table */ + objtype->table_owner = OS_OBJECT_ID_UNDEFINED; + + /* + * The implementation layer takes care of the actual unlock + wait. + * This permits use of condition variables where these two actions + * are done atomically. + */ + OS_WaitForStateChange_Impl(idtype, attempts); + + /* + * After return, this task owns the table again + */ + objtype->table_owner = saved_owner_id; + } +} + /*---------------------------------------------------------------- * * Function: OS_ObjectIdFinalizeNew diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index b5bd75288..178f69801 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -187,7 +187,10 @@ void Test_OS_ObjectIdConvertToken(void) (long)actual, (long)expected); /* should have delayed 4 times, on the 5th try it returns error */ - UtAssert_STUB_COUNT(OS_TaskDelay_Impl, 4); + UtAssert_STUB_COUNT(OS_WaitForStateChange_Impl, 4); + + /* It should also have preserved the original ID */ + UtAssert_True(OS_ObjectIdEqual(record->active_id, objid), "OS_ObjectIdConvertLock(EXCLUSIVE) objid restored"); /* * Use mode OS_LOCK_MODE_EXCLUSIVE with matching ID and no other refs. diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c index 5f3ee077a..07edfa887 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-common-impl-stubs.c @@ -45,3 +45,8 @@ void OS_ApplicationShutdown_Impl(void) { UT_DEFAULT_IMPL(OS_ApplicationShutdown_Impl); } + +void OS_WaitForStateChange_Impl(osal_objtype_t objtype, uint32 attempts) +{ + UT_DEFAULT_IMPL(OS_WaitForStateChange_Impl); +} From 8121f5ba860df7dac31f23e34a33878b83688834 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 14 Dec 2020 09:50:23 -0500 Subject: [PATCH 033/111] Fix #686, Use errno in clock_getres error reporting --- src/os/posix/src/os-impl-timebase.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index 517411cda..c725e2c3a 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -225,7 +225,7 @@ int32 OS_Posix_TimeBaseAPI_Impl_Init(void) status = clock_getres(OS_PREFERRED_CLOCK, &clock_resolution); if (status != 0) { - OS_DEBUG("failed in clock_getres: %s\n", strerror(status)); + OS_DEBUG("failed in clock_getres: %s\n", strerror(errno)); return_code = OS_ERROR; break; } From f9e9b284bf937d377ebb9611cdf6b858d0dddaf7 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 15 Dec 2020 09:12:56 -0500 Subject: [PATCH 034/111] Fix #688, Initial macro implementation and config options Add macros for configurable behavior of argument bug checking. - BUGCHECK for checking argument values which should never happen and indicate bugs if they do. - ARGCHECK for checking argument values which may happen and can be mitigated if they do. The behavior of BUGCHECK is influenced by two new OSAL config options, which can disable it completely or make it strict/enforcing such that it will abort() for debugging if a condition is not met. --- default_config.cmake | 47 ++++++++ osconfig.h.in | 49 ++++---- src/os/inc/osapi-error.h | 5 +- src/os/inc/osapi-macros.h | 139 +++++++++++++++++++++++ src/os/inc/osapi.h | 1 + src/os/shared/inc/os-shared-globaldefs.h | 51 ++++++++- 6 files changed, 266 insertions(+), 26 deletions(-) create mode 100644 src/os/inc/osapi-macros.h diff --git a/default_config.cmake b/default_config.cmake index fe993a457..f71dafbc5 100644 --- a/default_config.cmake +++ b/default_config.cmake @@ -15,6 +15,53 @@ # ########################################################################## +############################################################## +# Argument/Bug-checking options +############################################################## + +# OSAL_CONFIG_BUGCHECK_DISABLE +# ---------------------------------- +# +# Disable/compile-out the "bugcheck" macro +# +# The bugcheck macro is used to validate the inputs to functions and/or +# assert on other conditions that should _always_ be true. If any of these +# conditions ever evaluate as false, it indicates a bug in the code - +# either in the OSAL or the application which invoked OSAL. +# +# If set FALSE (default), then the OSAL bugcheck macro will evaluate its +# boolean conditional and generate an action if that conditional evaulates +# false. (The specific action to take is configured via a different +# directive -- see OSAL_CONFIG_BUGCHECK_STRICT). +# +# These extra bug checks do consume a slight bit of code+data space as +# well as some runtime CPU cycles on every call, depending on the conditions +# being tested. +# +# Once the application has reached a sufficient level of stability and +# confidence is obtained that these bug checks are not possible to be +# triggered, this directive may be set TRUE which disables the bug checks +# completely - rendering these statements as no-ops. +# +set(OSAL_CONFIG_BUGCHECK_DISABLE FALSE) + + +# OSAL_CONFIG_BUGCHECK_STRICT +# ---------------------------------- +# +# Select a strict implementation for the "bugcheck" macro +# +# If set FALSE (default), then the OSAL bugcheck macro will generate a +# debug message and return an error code if the conditional evaluates +# as false. This is a soft error - the application will get the +# error code and keep running. +# +# If set to TRUE, then any failure of any bugcheck macro is considered +# fatal and will trigger an abort(). On many platforms this will +# generate an abnormal application exit with a core file for debugging. +# +set(OSAL_CONFIG_BUGCHECK_STRICT FALSE) + ############################################################## # Code/Feature Selection Options for the OSAL implementation diff --git a/osconfig.h.in b/osconfig.h.in index a825d99f7..a7f947b18 100644 --- a/osconfig.h.in +++ b/osconfig.h.in @@ -20,38 +20,41 @@ /** * \brief Configuration file Operating System Abstraction Layer - * + * * The specific definitions in this file may only be modified - * by setting the respective OSAL configuration options in the CMake - * build. + * by setting the respective OSAL configuration options in the CMake + * build. * * Any direct modifications to the generated copy will - * be overwritten each time CMake executes. + * be overwritten each time CMake executes. * * \note This file was automatically generated by CMake from * @CMAKE_CURRENT_SOURCE_DIR@/default_config.cmake */ - + #ifndef OSCONFIG_H #define OSCONFIG_H -/* - * OSAL feature selection options from build config +/* + * OSAL feature selection options from build config */ #cmakedefine OSAL_CONFIG_INCLUDE_DYNAMIC_LOADER -#cmakedefine OSAL_CONFIG_INCLUDE_NETWORK -#cmakedefine OSAL_CONFIG_INCLUDE_STATIC_LOADER +#cmakedefine OSAL_CONFIG_INCLUDE_NETWORK +#cmakedefine OSAL_CONFIG_INCLUDE_STATIC_LOADER #cmakedefine OSAL_CONFIG_INCLUDE_SHELL -#cmakedefine OSAL_CONFIG_DEBUG_PRINTF -#cmakedefine OSAL_CONFIG_DEBUG_PERMISSIVE_MODE +#cmakedefine OSAL_CONFIG_DEBUG_PRINTF +#cmakedefine OSAL_CONFIG_DEBUG_PERMISSIVE_MODE + +#cmakedefine OSAL_CONFIG_BUGCHECK_DISABLE +#cmakedefine OSAL_CONFIG_BUGCHECK_STRICT -/* +/* * OSAL resource limits from build config * * (These are prefixed with OS_ for compatibility * with existing code referencing these symbols) */ - + /** * \brief The maximum number of to support * @@ -140,8 +143,8 @@ /** * \brief The maximum length of OSAL file names - * - * This limit applies specifically to the file name portion, not the + * + * This limit applies specifically to the file name portion, not the * directory portion, of a path name. * * Based on the OSAL_CONFIG_MAX_FILE_NAME configuration option @@ -175,14 +178,14 @@ * \brief The maximum size of the socket address structure * * This is part of the Socket API, and should be set large enough to hold - * the largest address type in use on the target system. + * the largest address type in use on the target system. * * Based on the OSAL_CONFIG_SOCKADDR_MAX_LEN configuration option */ #define OS_SOCKADDR_MAX_LEN @OSAL_CONFIG_SOCKADDR_MAX_LEN@ /** - * \brief The maximum size of output produced by a single OS_printf() + * \brief The maximum size of output produced by a single OS_printf() * * Based on the OSAL_CONFIG_PRINTF_BUFFER_SIZE configuration option */ @@ -234,7 +237,7 @@ #define OS_QUEUE_MAX_DEPTH @OSAL_CONFIG_QUEUE_MAX_DEPTH@ /** - * \brief The name of the temporary file used to store shell commands + * \brief The name of the temporary file used to store shell commands * * This configuration is only applicable if shell support is enabled, and * only necessary/relevant on some OS implementations. @@ -251,14 +254,14 @@ * * Based on the OSAL_CONFIG_PRINTF_CONSOLE_NAME configuration option */ -#define OS_PRINTF_CONSOLE_NAME "@OSAL_CONFIG_PRINTF_CONSOLE_NAME@" +#define OS_PRINTF_CONSOLE_NAME "@OSAL_CONFIG_PRINTF_CONSOLE_NAME@" -/* +/* * OSAL fixed resource limits * * The resource limits here are not user-configurable, but - * may be changed in a future revision of OSAL, so it is - * still present in osconfig.h along with the others. + * may be changed in a future revision of OSAL, so it is + * still present in osconfig.h along with the others. */ /** @@ -269,7 +272,7 @@ #define OS_MAX_CONSOLES 1 /** - * \brief The system-specific file extension used on loadable module files + * \brief The system-specific file extension used on loadable module files * * Fixed value based on system selection, not user configurable. */ diff --git a/src/os/inc/osapi-error.h b/src/os/inc/osapi-error.h index 39a2e65d5..77bfcf296 100644 --- a/src/os/inc/osapi-error.h +++ b/src/os/inc/osapi-error.h @@ -82,8 +82,9 @@ typedef char os_err_name_t[OS_ERROR_NAME_LENGTH]; #define OS_ERR_INCORRECT_OBJ_STATE (-35) /**< @brief Incorrect object state */ #define OS_ERR_INCORRECT_OBJ_TYPE (-36) /**< @brief Incorrect object type */ #define OS_ERR_STREAM_DISCONNECTED (-37) /**< @brief Stream disconnected */ -#define OS_ERR_OPERATION_NOT_SUPPORTED (-38) /**< @brief Requested operation is not support on the supplied object(s) \ - */ +#define OS_ERR_OPERATION_NOT_SUPPORTED (-38) /**< @brief Requested operation is not support on the supplied object(s) */ +#define OS_ERR_INVALID_SIZE (-40) /**< @brief Invalid Size */ + /* ** Defines for File System Calls */ diff --git a/src/os/inc/osapi-macros.h b/src/os/inc/osapi-macros.h new file mode 100644 index 000000000..120499a51 --- /dev/null +++ b/src/os/inc/osapi-macros.h @@ -0,0 +1,139 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 osapi-macros.h + */ + +#ifndef OSAPI_MACROS_H +#define OSAPI_MACROS_H + +#include +#include +#include + +#include "osconfig.h" +#include "common_types.h" + +#ifdef OSAL_CONFIG_BUGCHECK_DISABLE + +/** + * @brief Placeholder for BUGCHECK + * + * When OSAL_CONFIG_BUGCHECK_DISABLE is specified, then + * the BUGCHECK/BUGREPORT macros become no-ops. + */ +#define BUGCHECK(...) + +/** + * @brief Placeholder for BUGREPORT + * + * When OSAL_CONFIG_BUGCHECK_DISABLE is specified, then + * the BUGCHECK/BUGREPORT macros become no-ops. + */ +#define BUGREPORT(...) + +#else /* Bug checking enabled */ + +#ifdef OSAL_CONFIG_BUGCHECK_STRICT + +/* + * This BUGREPORT implementation aborts the application so that the applicaiton + * can be debugged immediately. This prints the message direct to stderr, which is + * typically not buffered, so it should appear on the console before the abort occurs, + * but may appear out of order with respect to calls to OS_printf(). + */ +#define BUGREPORT(...) \ + do \ + { \ + fprintf(stderr, __VA_ARGS__); \ + abort(); \ + } while (false) + +#else + +#include "osapi-printf.h" + +/* + * This BUGREPORT simply prints the message using OS_printf, which is buffered. This + * has a minimal realtime impact as it only copies to the buffer, and the print will + * appear in order with respect to other calls to OS_printf() by the application. + */ +#define BUGREPORT(...) OS_printf(__VA_ARGS__) + +#endif /* OSAL_CONFIG_BUGCHECK_STRICT */ + +/** + * @brief Basic Bug-Checking macro + * + * This macro checks a conditional, and if it is FALSE, then it generates a report - + * which may in turn contain additional actions. + * + * BUGCHECK should only be used for conditions which are critical and must always be true. + * If such a condition is ever false then it indicates a bug in the application which + * must be resolved. It may or may not be possible to continue operation if a bugcheck + * fails. + * + * @sa ARGCHECK for checking non-critical values + */ +#define BUGCHECK(cond, errcode) \ + if (!(cond)) \ + { \ + BUGREPORT("\n**BUG** %s():%d:check \'%s\' FAILED --> %s\n\n", __func__, __LINE__, #cond, #errcode); \ + return errcode; \ + } + +#endif /* OSAL_CONFIG_BUGCHECK_DISABLE */ + +/** + * @brief Generic argument checking macro for non-critical values + * + * This macro checks a conditional that is expected to be true, and return a value + * if it evaluates false. + * + * ARGCHECK can be used to check for out of range or other invalid argument conditions + * which may (validly) occur at runtime and do not necessarily indicate bugs in the + * application. + * + * These argument checks are NOT considered a fatal errors. The application + * continues to run normally. This does not report the error on the console. + * + * As such, ARGCHECK actions are always compiled in - not selectable at compile-time. + * + * @sa BUGCHECK for checking critical values that indicate bugs + */ +#define ARGCHECK(cond, errcode) \ + if (!(cond)) \ + { \ + return errcode; \ + } + +/** + * @brief String length limit check macro + * + * This macro is a specialized version of ARGCHECK that confirms a string will fit + * into a buffer of the specified length, and return an error code if it will not. + * + * @note this uses ARGCHECK, thus treating a string too long as a normal runtime + * (i.e. non-bug) error condition with a typical error return to the caller. + */ +#define LENGTHCHECK(str, len, errcode) ARGCHECK(memchr(str, '\0', len), errcode) + +#endif diff --git a/src/os/inc/osapi.h b/src/os/inc/osapi.h index a45e94be5..96b62a0bb 100644 --- a/src/os/inc/osapi.h +++ b/src/os/inc/osapi.h @@ -70,6 +70,7 @@ #include "osapi-file.h" #include "osapi-filesys.h" #include "osapi-heap.h" +#include "osapi-macros.h" #include "osapi-idmap.h" #include "osapi-module.h" #include "osapi-mutex.h" diff --git a/src/os/shared/inc/os-shared-globaldefs.h b/src/os/shared/inc/os-shared-globaldefs.h index 324fd7e65..39da9b5e2 100644 --- a/src/os/shared/inc/os-shared-globaldefs.h +++ b/src/os/shared/inc/os-shared-globaldefs.h @@ -36,6 +36,7 @@ #include "common_types.h" #include "osapi-constants.h" #include "osapi-error.h" +#include "osapi-macros.h" /* * The "common_record" is part of the generic ID mapping - @@ -89,4 +90,52 @@ extern void OS_DebugPrintf(uint32 Level, const char *Func, uint32 Line, const ch #define OS_DEBUG(...) #endif -#endif /* OS_SHARED_GLOBALDEFS_H */ +/* + * An OSAL-specific check macro for NULL pointer. + * Checked via BUGCHECK - considered a bug/fatal error if check fails. + * + * Returns OS_INVALID_POINTER if pointer is NULL. + */ +#define OS_CHECK_POINTER(ptr) BUGCHECK((ptr) != NULL, OS_INVALID_POINTER) + +/* + * An OSAL-specific check macro for an input buffer size. + * Checked via ARGCHECK - non-fatal if check fails. + * + * Returns OS_ERR_INVALID_SIZE if size is 0. + * + * Also returns OS_ERR_INVALID_SIZE if size is excessively large. + * Currently (UINT32_MAX/2) is used as the upper limit, as some API calls + * (e.g. read/write) return a size as an int32 type, and therefore the + * operation cannot exceed the bounds of this type. + */ +#define OS_CHECK_SIZE(val) ARGCHECK((val) > 0 && (val) < (UINT32_MAX/2), OS_ERR_INVALID_SIZE) + +/* + * An OSAL-specific check macro for arbitrary string argument validation. + * + * First confirms string is not null using OS_CHECK_POINTER, then checks the maximum + * length of the string using LENGTHCHECK. + */ +#define OS_CHECK_STRING(str, maxlen, errcode) \ + do \ + { \ + OS_CHECK_POINTER(str); \ + LENGTHCHECK(str, maxlen, errcode); \ + } while (0) + +/* + * An OSAL-specific check macro for object name strings. + * + * Returns OS_ERR_NAME_TOO_LONG if length is exceeded. + */ +#define OS_CHECK_APINAME(str) OS_CHECK_STRING(str, OS_MAX_API_NAME, OS_ERR_NAME_TOO_LONG) + +/* + * An OSAL specific argument check macro for path names + * + * Returns OS_FS_ERR_PATH_TOO_LONG if length is exceeded. + */ +#define OS_CHECK_PATHNAME(str) OS_CHECK_STRING(str, OS_MAX_PATH_LEN, OS_FS_ERR_PATH_TOO_LONG) + +#endif /* OS_SHARED_GLOBALDEFS_H */ From 5d22ca685981aed3fe044f9fc838b5b0640b5c1a Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 15 Dec 2020 10:14:10 -0500 Subject: [PATCH 035/111] Fix #688, update all OSAL argument checks Use the new macros to validate arguments to OS API calls. Also includes coverage test updates, which revealed some areas where return types were not consistent, and the macro makes them consistent now. --- src/os/shared/src/osapi-binsem.c | 27 ++-- src/os/shared/src/osapi-clock.c | 12 +- src/os/shared/src/osapi-common.c | 5 +- src/os/shared/src/osapi-countsem.c | 27 ++-- src/os/shared/src/osapi-dir.c | 12 +- src/os/shared/src/osapi-errors.c | 5 +- src/os/shared/src/osapi-file.c | 45 ++----- src/os/shared/src/osapi-filesys.c | 122 ++++-------------- src/os/shared/src/osapi-heap.c | 5 +- src/os/shared/src/osapi-idmap.c | 11 +- src/os/shared/src/osapi-module.c | 33 ++--- src/os/shared/src/osapi-mutex.c | 25 +--- src/os/shared/src/osapi-network.c | 26 ++-- src/os/shared/src/osapi-queue.c | 107 ++++++--------- src/os/shared/src/osapi-select.c | 20 +-- src/os/shared/src/osapi-shell.c | 5 +- src/os/shared/src/osapi-sockets.c | 74 ++++------- src/os/shared/src/osapi-task.c | 38 ++---- src/os/shared/src/osapi-time.c | 63 ++------- src/os/shared/src/osapi-timebase.c | 32 +---- src/tests/network-api-test/network-api-test.c | 8 +- .../timer-add-api-test/timer-add-api-test.c | 4 +- .../shared/src/coveragetest-binsem.c | 2 +- .../shared/src/coveragetest-countsem.c | 2 +- .../shared/src/coveragetest-filesys.c | 40 +++--- .../shared/src/coveragetest-idmap.c | 4 +- .../shared/src/coveragetest-module.c | 4 +- .../shared/src/coveragetest-mutex.c | 2 +- .../shared/src/coveragetest-network.c | 2 +- .../shared/src/coveragetest-queue.c | 16 ++- .../shared/src/coveragetest-task.c | 4 +- .../shared/src/coveragetest-time.c | 12 +- .../shared/src/coveragetest-timebase.c | 4 +- .../ut-stubs/inc/OCS_stdio.h | 1 + .../ut-stubs/inc/OCS_stdlib.h | 1 + .../ut-stubs/inc/OCS_string.h | 1 + .../ut-stubs/override_inc/stdio.h | 23 ++-- .../ut-stubs/override_inc/stdlib.h | 1 + .../ut-stubs/override_inc/string.h | 1 + .../ut-stubs/src/libc-stdio-stubs.c | 5 + .../ut-stubs/src/libc-stdlib-stubs.c | 7 + .../ut-stubs/src/libc-string-stubs.c | 18 +++ .../osnetwork-test/ut_osnetwork_misc_test.c | 2 +- .../ostimer-test/ut_ostimer_timerio_test.c | 2 +- 44 files changed, 295 insertions(+), 565 deletions(-) diff --git a/src/os/shared/src/osapi-binsem.c b/src/os/shared/src/osapi-binsem.c index 8fbe7ec20..49510ae1c 100644 --- a/src/os/shared/src/osapi-binsem.c +++ b/src/os/shared/src/osapi-binsem.c @@ -100,16 +100,9 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia OS_object_token_t token; OS_bin_sem_internal_record_t *binsem; - /* Check for NULL pointers */ - if (sem_id == NULL || sem_name == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(sem_name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } + /* Check inputs */ + OS_CHECK_POINTER(sem_id); + OS_CHECK_APINAME(sem_name); /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &token); @@ -262,10 +255,9 @@ int32 OS_BinSemGetIdByName(osal_id_t *sem_id, const char *sem_name) { int32 return_code; - if (sem_id == NULL || sem_name == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(sem_id); + OS_CHECK_POINTER(sem_name); return_code = OS_ObjectIdFindByName(LOCAL_OBJID_TYPE, sem_name, sem_id); @@ -286,11 +278,8 @@ int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) OS_object_token_t token; int32 return_code; - /* Check parameters */ - if (bin_prop == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(bin_prop); memset(bin_prop, 0, sizeof(OS_bin_sem_prop_t)); diff --git a/src/os/shared/src/osapi-clock.c b/src/os/shared/src/osapi-clock.c index 7cd2c8c17..09dbf110d 100644 --- a/src/os/shared/src/osapi-clock.c +++ b/src/os/shared/src/osapi-clock.c @@ -50,10 +50,8 @@ *-----------------------------------------------------------------*/ int32 OS_GetLocalTime(OS_time_t *time_struct) { - if (time_struct == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(time_struct); return OS_GetLocalTime_Impl(time_struct); @@ -69,10 +67,8 @@ int32 OS_GetLocalTime(OS_time_t *time_struct) *-----------------------------------------------------------------*/ int32 OS_SetLocalTime(OS_time_t *time_struct) { - if (time_struct == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(time_struct); return OS_SetLocalTime_Impl(time_struct); diff --git a/src/os/shared/src/osapi-common.c b/src/os/shared/src/osapi-common.c index 609fbe045..c3b7fb0b5 100644 --- a/src/os/shared/src/osapi-common.c +++ b/src/os/shared/src/osapi-common.c @@ -229,10 +229,7 @@ int32 OS_API_Init(void) *-----------------------------------------------------------------*/ int32 OS_RegisterEventHandler(OS_EventHandler_t handler) { - if (handler == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(handler); OS_SharedGlobalVars.EventHandler = handler; return OS_SUCCESS; diff --git a/src/os/shared/src/osapi-countsem.c b/src/os/shared/src/osapi-countsem.c index a73f55843..9afcd2850 100644 --- a/src/os/shared/src/osapi-countsem.c +++ b/src/os/shared/src/osapi-countsem.c @@ -92,16 +92,9 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init OS_object_token_t token; OS_count_sem_internal_record_t *countsem; - /* Check for NULL pointers */ - if (sem_id == NULL || sem_name == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(sem_name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } + /* Check inputs */ + OS_CHECK_POINTER(sem_id); + OS_CHECK_APINAME(sem_name); /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &token); @@ -231,10 +224,9 @@ int32 OS_CountSemGetIdByName(osal_id_t *sem_id, const char *sem_name) { int32 return_code; - if (sem_id == NULL || sem_name == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(sem_id); + OS_CHECK_POINTER(sem_name); return_code = OS_ObjectIdFindByName(LOCAL_OBJID_TYPE, sem_name, sem_id); @@ -255,11 +247,8 @@ int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) OS_object_token_t token; int32 return_code; - /* Check parameters */ - if (count_prop == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(count_prop); memset(count_prop, 0, sizeof(OS_count_sem_prop_t)); diff --git a/src/os/shared/src/osapi-dir.c b/src/os/shared/src/osapi-dir.c index 6ee72f124..06f55cdb3 100644 --- a/src/os/shared/src/osapi-dir.c +++ b/src/os/shared/src/osapi-dir.c @@ -118,10 +118,8 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) OS_dir_internal_record_t *dir; int32 return_code; - if (dir_id == NULL || path == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(dir_id); return_code = OS_TranslatePath(path, local_path); if (return_code == OS_SUCCESS) @@ -185,10 +183,8 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) OS_object_token_t token; int32 return_code; - if (dirent == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(dirent); /* Make sure the file descriptor is legit before using it */ return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, dir_id, &token); diff --git a/src/os/shared/src/osapi-errors.c b/src/os/shared/src/osapi-errors.c index a8e077fb3..ddfe12f9b 100644 --- a/src/os/shared/src/osapi-errors.c +++ b/src/os/shared/src/osapi-errors.c @@ -101,10 +101,7 @@ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) uint32 return_code; const OS_ErrorTable_Entry_t *Error; - if (err_name == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(err_name); Error = OS_GLOBAL_ERROR_NAME_TABLE; while (Error->Name != NULL && Error->Number != error_num) diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 8756c1c4d..8947398a6 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -102,10 +102,7 @@ int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 acc OS_object_token_t token; OS_stream_internal_record_t *stream; - if (filedes == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(filedes); /* ** Check for a valid access mode @@ -266,10 +263,8 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout int32 return_code; /* Check Parameters */ - if (buffer == NULL || nbytes == 0) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(buffer); + OS_CHECK_SIZE(nbytes); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) @@ -296,10 +291,8 @@ int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 int32 return_code; /* Check Parameters */ - if (buffer == NULL || nbytes == 0) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(buffer); + OS_CHECK_SIZE(nbytes); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); if (return_code == OS_SUCCESS) @@ -373,10 +366,8 @@ int32 OS_stat(const char *path, os_fstat_t *filestats) int32 return_code; char local_path[OS_MAX_LOCAL_PATH_LEN]; - if (filestats == NULL) - { - return OS_INVALID_POINTER; - } + /* Check Parameters */ + OS_CHECK_POINTER(filestats); memset(filestats, 0, sizeof(*filestats)); @@ -502,10 +493,9 @@ int32 OS_cp(const char *src, const char *dest) osal_id_t file2; uint8 copyblock[512]; - if (src == NULL || dest == NULL) - { - return OS_INVALID_POINTER; - } + /* Check Parameters */ + OS_CHECK_POINTER(src); + OS_CHECK_POINTER(dest); file1 = OS_OBJECT_ID_UNDEFINED; file2 = OS_OBJECT_ID_UNDEFINED; @@ -595,10 +585,7 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) int32 return_code; /* Check parameters */ - if (fd_prop == NULL) - { - return (OS_INVALID_POINTER); - } + OS_CHECK_POINTER(fd_prop); memset(fd_prop, 0, sizeof(OS_file_prop_t)); @@ -633,10 +620,7 @@ int32 OS_FileOpenCheck(const char *Filename) OS_object_iter_t iter; OS_stream_internal_record_t *stream; - if (Filename == NULL) - { - return (OS_INVALID_POINTER); - } + OS_CHECK_POINTER(Filename); return_code = OS_ERROR; @@ -672,10 +656,7 @@ int32 OS_CloseFileByName(const char *Filename) OS_object_iter_t iter; OS_stream_internal_record_t *stream; - if (Filename == NULL) - { - return (OS_INVALID_POINTER); - } + OS_CHECK_POINTER(Filename); return_code = OS_FS_ERR_PATH_INVALID; diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index 3c51d646e..bc8156307 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -113,10 +113,8 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs /* ** Check parameters */ - if (fsdevname == NULL || fsvolname == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_STRING(fsdevname, sizeof(filesys->device_name), OS_FS_ERR_PATH_TOO_LONG); + OS_CHECK_STRING(fsvolname, sizeof(filesys->volume_name), OS_FS_ERR_PATH_TOO_LONG); /* check names are not empty strings */ if (fsdevname[0] == 0 || fsvolname[0] == 0) @@ -124,12 +122,6 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs return OS_FS_ERR_PATH_INVALID; } - /* check names are not excessively long strings */ - if (strlen(fsdevname) >= sizeof(filesys->device_name) || strlen(fsvolname) >= sizeof(filesys->volume_name)) - { - return OS_FS_ERR_PATH_TOO_LONG; - } - return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, fsdevname, &token); if (return_code == OS_SUCCESS) { @@ -234,15 +226,8 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const /* * Validate inputs */ - if (phys_path == NULL || virt_path == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(phys_path) >= OS_MAX_LOCAL_PATH_LEN || strlen(virt_path) >= OS_MAX_PATH_LEN) - { - return OS_ERR_NAME_TOO_LONG; - } + OS_CHECK_STRING(phys_path, sizeof(filesys->system_mountpt), OS_FS_ERR_PATH_TOO_LONG); + OS_CHECK_PATHNAME(virt_path); /* * Generate a dev name by taking the basename of the phys_path. @@ -350,15 +335,7 @@ int32 OS_rmfs(const char *devname) int32 return_code; OS_object_token_t token; - if (devname == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(devname) >= OS_MAX_API_NAME) - { - return OS_FS_ERR_PATH_TOO_LONG; - } + OS_CHECK_PATHNAME(devname); return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, devname, &token); if (return_code == OS_SUCCESS) @@ -429,15 +406,8 @@ int32 OS_mount(const char *devname, const char *mountpoint) OS_filesys_internal_record_t *filesys; /* Check parameters */ - if (devname == NULL || mountpoint == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(devname) >= sizeof(filesys->device_name) || strlen(mountpoint) >= sizeof(filesys->virtual_mountpt)) - { - return OS_FS_ERR_PATH_TOO_LONG; - } + OS_CHECK_STRING(devname, sizeof(filesys->device_name), OS_FS_ERR_PATH_TOO_LONG); + OS_CHECK_STRING(mountpoint, sizeof(filesys->virtual_mountpt), OS_FS_ERR_PATH_TOO_LONG); return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, devname, &token); if (return_code == OS_SUCCESS) @@ -503,15 +473,7 @@ int32 OS_unmount(const char *mountpoint) OS_filesys_internal_record_t *filesys; /* Check parameters */ - if (mountpoint == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(mountpoint) >= sizeof(filesys->virtual_mountpt)) - { - return OS_FS_ERR_PATH_TOO_LONG; - } + OS_CHECK_STRING(mountpoint, sizeof(filesys->virtual_mountpt), OS_FS_ERR_PATH_TOO_LONG); return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, (void *)mountpoint, &token); @@ -570,15 +532,8 @@ int32 OS_fsBlocksFree(const char *name) OS_statvfs_t statfs; OS_object_token_t token; - if (name == NULL) - { - return (OS_INVALID_POINTER); - } - - if (strlen(name) >= OS_MAX_PATH_LEN) - { - return OS_FS_ERR_PATH_TOO_LONG; - } + /* Check parameters */ + OS_CHECK_PATHNAME(name); return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, (void *)name, &token); @@ -618,15 +573,9 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) OS_statvfs_t statfs; OS_object_token_t token; - if (name == NULL || bytes_free == NULL) - { - return (OS_INVALID_POINTER); - } - - if (strlen(name) >= OS_MAX_PATH_LEN) - { - return OS_FS_ERR_PATH_TOO_LONG; - } + /* Check parameters */ + OS_CHECK_PATHNAME(name); + OS_CHECK_POINTER(bytes_free); return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, (void *)name, &token); @@ -665,21 +614,8 @@ int32 OS_chkfs(const char *name, bool repair) OS_object_token_t token; int32 return_code; - /* - ** Check for a null pointer - */ - if (name == NULL) - { - return OS_INVALID_POINTER; - } - - /* - ** Check the length of the volume name - */ - if (strlen(name) >= OS_MAX_PATH_LEN) - { - return (OS_FS_ERR_PATH_TOO_LONG); - } + /* Check parameters */ + OS_CHECK_PATHNAME(name); /* Get a reference lock, as a filesystem check could take some time. */ return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, @@ -710,15 +646,9 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) int32 return_code; OS_filesys_internal_record_t *filesys; - if (MountPoint == NULL || PhysDriveName == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(MountPoint) >= OS_MAX_PATH_LEN) - { - return OS_FS_ERR_PATH_TOO_LONG; - } + /* Check parameters */ + OS_CHECK_PATHNAME(MountPoint); + OS_CHECK_POINTER(PhysDriveName); /* Get a reference lock, as a filesystem check could take some time. */ return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, @@ -760,13 +690,8 @@ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) { osal_index_t idx; - /* - ** Check to see if the file pointers are NULL - */ - if (filesys_info == NULL) - { - return OS_INVALID_POINTER; - } + /* Check parameters */ + OS_CHECK_POINTER(filesys_info); memset(filesys_info, 0, sizeof(*filesys_info)); @@ -821,10 +746,9 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) /* ** Check to see if the path pointers are NULL */ - if (VirtualPath == NULL || LocalPath == NULL) - { - return OS_INVALID_POINTER; - } + /* Check inputs */ + OS_CHECK_POINTER(VirtualPath); + OS_CHECK_POINTER(LocalPath); /* ** Check length diff --git a/src/os/shared/src/osapi-heap.c b/src/os/shared/src/osapi-heap.c index ed833f814..15ec6750e 100644 --- a/src/os/shared/src/osapi-heap.c +++ b/src/os/shared/src/osapi-heap.c @@ -50,10 +50,7 @@ *-----------------------------------------------------------------*/ int32 OS_HeapGetInfo(OS_heap_prop_t *heap_prop) { - if (heap_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(heap_prop); return OS_HeapGetInfo_Impl(heap_prop); } /* end OS_HeapGetInfo */ diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 0ccaf16f0..03a992530 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -900,15 +900,8 @@ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t * * This is required by the file/dir/socket API since these DO allow multiple * instances of the same name. */ - if (name == NULL) - { - return OS_ERR_NAME_NOT_FOUND; - } - - if (strlen(name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } + ARGCHECK(name, OS_ERR_NAME_NOT_FOUND); + LENGTHCHECK(name, OS_MAX_API_NAME, OS_ERR_NAME_TOO_LONG); return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_GLOBAL, idtype, name, &token); if (return_code == OS_SUCCESS) diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 944a9434b..e5673ab51 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -199,15 +199,8 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f ** Note "filename" is not checked, because in certain configurations it can be validly ** null. filename is checked for NULL-ness by the OS_TranslatePath() later. */ - if ((module_id == NULL) || (module_name == NULL)) - { - return (OS_INVALID_POINTER); - } - - if (strlen(module_name) >= OS_MAX_API_NAME) - { - return (OS_ERR_NAME_TOO_LONG); - } + OS_CHECK_POINTER(module_id); + OS_CHECK_APINAME(module_name); /* * Preemptively translate the filename, and hold it in a temporary buffer. @@ -330,10 +323,7 @@ int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_prop) OS_object_token_t token; /* Check parameters */ - if (module_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(module_prop); memset(module_prop, 0, sizeof(OS_module_prop_t)); @@ -371,10 +361,8 @@ int32 OS_SymbolLookup(cpuaddr *SymbolAddress, const char *SymbolName) /* ** Check parameters */ - if ((SymbolAddress == NULL) || (SymbolName == NULL)) - { - return (OS_INVALID_POINTER); - } + OS_CHECK_POINTER(SymbolAddress); + OS_CHECK_POINTER(SymbolName); /* * attempt to find the symbol in the global symbol table. @@ -421,10 +409,8 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const /* ** Check parameters */ - if ((symbol_address == NULL) || (symbol_name == NULL)) - { - return (OS_INVALID_POINTER); - } + OS_CHECK_POINTER(symbol_address); + OS_CHECK_POINTER(symbol_name); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, module_id, &token); if (return_code == OS_SUCCESS) @@ -470,10 +456,7 @@ int32 OS_SymbolTableDump(const char *filename, size_t SizeLimit) /* ** Check parameters */ - if (filename == NULL) - { - return (OS_INVALID_POINTER); - } + OS_CHECK_POINTER(filename); /* ** Translate the filename to the Host System diff --git a/src/os/shared/src/osapi-mutex.c b/src/os/shared/src/osapi-mutex.c index 1840daa15..50d6a1fee 100644 --- a/src/os/shared/src/osapi-mutex.c +++ b/src/os/shared/src/osapi-mutex.c @@ -97,16 +97,9 @@ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) OS_object_token_t token; OS_mutex_internal_record_t *mutex; - /* Check for NULL pointers */ - if (sem_id == NULL || sem_name == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(sem_name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } + /* Check parameters */ + OS_CHECK_POINTER(sem_id); + OS_CHECK_APINAME(sem_name); /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, sem_name, &token); @@ -245,10 +238,9 @@ int32 OS_MutSemGetIdByName(osal_id_t *sem_id, const char *sem_name) { int32 return_code; - if (sem_id == NULL || sem_name == NULL) - { - return OS_INVALID_POINTER; - } + /* Check parameters */ + OS_CHECK_POINTER(sem_id); + OS_CHECK_POINTER(sem_name); return_code = OS_ObjectIdFindByName(LOCAL_OBJID_TYPE, sem_name, sem_id); @@ -271,10 +263,7 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) OS_object_token_t token; /* Check parameters */ - if (mut_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(mut_prop); memset(mut_prop, 0, sizeof(OS_mut_sem_prop_t)); diff --git a/src/os/shared/src/osapi-network.c b/src/os/shared/src/osapi-network.c index e43e05561..3e6b9eeb9 100644 --- a/src/os/shared/src/osapi-network.c +++ b/src/os/shared/src/osapi-network.c @@ -67,24 +67,16 @@ int32 OS_NetworkGetHostName(char *host_name, size_t name_len) { uint32 return_code; - if (host_name == NULL) - { - return_code = OS_INVALID_POINTER; - } - else if (name_len == 0) - { - return_code = OS_ERROR; - } - else - { - /* delegate to low-level API */ - return_code = OS_NetworkGetHostName_Impl(host_name, name_len); + /* Check parameters */ + OS_CHECK_POINTER(host_name); + OS_CHECK_SIZE(name_len); - if (return_code != OS_SUCCESS) - { - /* return an empty string on failure, just in case */ - host_name[0] = 0; - } + /* delegate to low-level API */ + return_code = OS_NetworkGetHostName_Impl(host_name, name_len); + if (return_code != OS_SUCCESS) + { + /* return an empty string on failure, just in case */ + host_name[0] = 0; } return (return_code); diff --git a/src/os/shared/src/osapi-queue.c b/src/os/shared/src/osapi-queue.c index 509680df7..cda46e141 100644 --- a/src/os/shared/src/osapi-queue.c +++ b/src/os/shared/src/osapi-queue.c @@ -87,27 +87,17 @@ int32 OS_QueueAPI_Init(void) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, - uint32 flags) +int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, uint32 flags) { int32 return_code; OS_object_token_t token; OS_queue_internal_record_t *queue; - if (queue_name == NULL || queue_id == NULL) - { - return OS_INVALID_POINTER; - } - - if (strlen(queue_name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } - - if (queue_depth > OS_QUEUE_MAX_DEPTH) - { - return OS_QUEUE_INVALID_SIZE; - } + /* validate inputs */ + OS_CHECK_POINTER(queue_id); + OS_CHECK_APINAME(queue_name); + OS_CHECK_SIZE(data_size); + ARGCHECK(queue_depth <= OS_QUEUE_MAX_DEPTH, OS_QUEUE_INVALID_SIZE); /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, queue_name, &token); @@ -173,29 +163,25 @@ int32 OS_QueueGet(osal_id_t queue_id, void *data, size_t size, size_t *size_copi OS_queue_internal_record_t *queue; /* Check Parameters */ - if (data == NULL || size_copied == NULL) - { - return_code = OS_INVALID_POINTER; - } - else + OS_CHECK_POINTER(data); + OS_CHECK_POINTER(size_copied); + + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &token); + if (return_code == OS_SUCCESS) { - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &token); - if (return_code == OS_SUCCESS) + queue = OS_OBJECT_TABLE_GET(OS_queue_table, token); + + if (size < queue->max_size) { - queue = OS_OBJECT_TABLE_GET(OS_queue_table, token); - - if (size < queue->max_size) - { - /* - ** The buffer that the user is passing in is potentially too small - */ - *size_copied = 0; - return_code = OS_QUEUE_INVALID_SIZE; - } - else - { - return_code = OS_QueueGet_Impl(&token, data, size, size_copied, timeout); - } + /* + ** The buffer that the user is passing in is potentially too small + */ + *size_copied = 0; + return_code = OS_QUEUE_INVALID_SIZE; + } + else + { + return_code = OS_QueueGet_Impl(&token, data, size, size_copied, timeout); } } @@ -217,28 +203,23 @@ int32 OS_QueuePut(osal_id_t queue_id, const void *data, size_t size, uint32 flag OS_queue_internal_record_t *queue; /* Check Parameters */ - if (data == NULL) - { - return_code = OS_INVALID_POINTER; - } - else + OS_CHECK_POINTER(data); + + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &token); + if (return_code == OS_SUCCESS) { - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, queue_id, &token); - if (return_code == OS_SUCCESS) + queue = OS_OBJECT_TABLE_GET(OS_queue_table, token); + + if (size > queue->max_size) { - queue = OS_OBJECT_TABLE_GET(OS_queue_table, token); - - if (size > queue->max_size) - { - /* - ** The buffer that the user is passing in is too large - */ - return_code = OS_QUEUE_INVALID_SIZE; - } - else - { - return_code = OS_QueuePut_Impl(&token, data, size, flags); - } + /* + ** The buffer that the user is passing in is too large + */ + return_code = OS_QUEUE_INVALID_SIZE; + } + else + { + return_code = OS_QueuePut_Impl(&token, data, size, flags); } } @@ -257,10 +238,9 @@ int32 OS_QueueGetIdByName(osal_id_t *queue_id, const char *queue_name) { int32 return_code; - if (queue_id == NULL || queue_name == NULL) - { - return OS_INVALID_POINTER; - } + /* Check Parameters */ + OS_CHECK_POINTER(queue_id); + OS_CHECK_POINTER(queue_name); return_code = OS_ObjectIdFindByName(LOCAL_OBJID_TYPE, queue_name, queue_id); @@ -283,10 +263,7 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) OS_object_token_t token; /* Check parameters */ - if (queue_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(queue_prop); memset(queue_prop, 0, sizeof(OS_queue_prop_t)); diff --git a/src/os/shared/src/osapi-select.c b/src/os/shared/src/osapi-select.c index cecad98c0..d60b03288 100644 --- a/src/os/shared/src/osapi-select.c +++ b/src/os/shared/src/osapi-select.c @@ -63,8 +63,8 @@ int32 OS_SelectSingle(osal_id_t objid, uint32 *StateFlags, int32 msecs) int32 return_code; OS_object_token_t token; - if (StateFlags == NULL) - return OS_INVALID_POINTER; + /* check parameters */ + OS_CHECK_POINTER(StateFlags); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, objid, &token); if (return_code == OS_SUCCESS) @@ -109,8 +109,8 @@ int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs) *-----------------------------------------------------------------*/ int32 OS_SelectFdZero(OS_FdSet *Set) { - if (Set == NULL) - return OS_INVALID_POINTER; + /* check parameters */ + OS_CHECK_POINTER(Set); memset(Set, 0, sizeof(OS_FdSet)); return OS_SUCCESS; @@ -129,8 +129,8 @@ int32 OS_SelectFdAdd(OS_FdSet *Set, osal_id_t objid) int32 return_code; osal_index_t local_id; - if (Set == NULL) - return OS_INVALID_POINTER; + /* check parameters */ + OS_CHECK_POINTER(Set); return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_STREAM, objid, &local_id); if (return_code == OS_SUCCESS) @@ -154,8 +154,8 @@ int32 OS_SelectFdClear(OS_FdSet *Set, osal_id_t objid) int32 return_code; osal_index_t local_id; - if (Set == NULL) - return OS_INVALID_POINTER; + /* check parameters */ + OS_CHECK_POINTER(Set); return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_STREAM, objid, &local_id); if (return_code == OS_SUCCESS) @@ -179,8 +179,8 @@ bool OS_SelectFdIsSet(OS_FdSet *Set, osal_id_t objid) int32 return_code; osal_index_t local_id; - if (Set == NULL) - return false; + /* check parameters */ + BUGCHECK(Set != NULL, false); return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_STREAM, objid, &local_id); if (return_code != OS_SUCCESS) diff --git a/src/os/shared/src/osapi-shell.c b/src/os/shared/src/osapi-shell.c index 62e182fcc..0443259c1 100644 --- a/src/os/shared/src/osapi-shell.c +++ b/src/os/shared/src/osapi-shell.c @@ -56,10 +56,7 @@ int32 OS_ShellOutputToFile(const char *Cmd, osal_id_t filedes) int32 return_code; /* Check Parameters */ - if (Cmd == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Cmd); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, filedes, &token); if (return_code == OS_SUCCESS) diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 97de82755..1aad07df0 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -133,10 +133,7 @@ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_ int32 return_code; /* Check for NULL pointers */ - if (sock_id == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(sock_id); /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, NULL, &token); @@ -175,10 +172,7 @@ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) int32 return_code; /* Check Parameters */ - if (Addr == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) @@ -234,10 +228,8 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * int32 return_code; /* Check Parameters */ - if (Addr == NULL || connsock_id == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); + OS_CHECK_POINTER(connsock_id); /* * Note: setting "connrecord" here avoids a false warning @@ -344,10 +336,7 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo int32 return_code; /* Check Parameters */ - if (Addr == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) @@ -403,10 +392,8 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockA int32 return_code; /* Check Parameters */ - if (buffer == NULL || buflen == 0) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(buffer); + OS_CHECK_SIZE(buflen); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) @@ -448,10 +435,8 @@ int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, cons int32 return_code; /* Check Parameters */ - if (buffer == NULL || buflen == 0) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(buffer); + OS_CHECK_SIZE(buflen); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) @@ -485,10 +470,9 @@ int32 OS_SocketGetIdByName(osal_id_t *sock_id, const char *sock_name) { int32 return_code; - if (sock_id == NULL || sock_name == NULL) - { - return OS_INVALID_POINTER; - } + /* Check Parameters */ + OS_CHECK_POINTER(sock_id); + OS_CHECK_POINTER(sock_name); return_code = OS_ObjectIdFindByName(LOCAL_OBJID_TYPE, sock_name, sock_id); @@ -510,10 +494,7 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) int32 return_code; /* Check parameters */ - if (sock_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(sock_prop); memset(sock_prop, 0, sizeof(OS_socket_prop_t)); @@ -543,10 +524,7 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) *-----------------------------------------------------------------*/ int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) { - if (Addr == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); return OS_SocketAddrInit_Impl(Addr, Domain); } /* end OS_SocketAddrInit */ @@ -561,10 +539,9 @@ int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) *-----------------------------------------------------------------*/ int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) { - if (Addr == NULL || buffer == NULL || buflen == 0) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); + OS_CHECK_POINTER(buffer); + OS_CHECK_SIZE(buflen); return OS_SocketAddrToString_Impl(buffer, buflen, Addr); } /* end OS_SocketAddrToString */ @@ -579,10 +556,8 @@ int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Ad *-----------------------------------------------------------------*/ int32 OS_SocketAddrFromString(OS_SockAddr_t *Addr, const char *string) { - if (Addr == NULL || string == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); + OS_CHECK_POINTER(string); return OS_SocketAddrFromString_Impl(Addr, string); } /* end OS_SocketAddrFromString */ @@ -597,10 +572,8 @@ int32 OS_SocketAddrFromString(OS_SockAddr_t *Addr, const char *string) *-----------------------------------------------------------------*/ int32 OS_SocketAddrGetPort(uint16 *PortNum, const OS_SockAddr_t *Addr) { - if (PortNum == NULL || Addr == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); + OS_CHECK_POINTER(PortNum); return OS_SocketAddrGetPort_Impl(PortNum, Addr); } /* end OS_SocketAddrGetPort */ @@ -615,10 +588,7 @@ int32 OS_SocketAddrGetPort(uint16 *PortNum, const OS_SockAddr_t *Addr) *-----------------------------------------------------------------*/ int32 OS_SocketAddrSetPort(OS_SockAddr_t *Addr, uint16 PortNum) { - if (Addr == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(Addr); return OS_SocketAddrSetPort_Impl(Addr, PortNum); } /* end OS_SocketAddrSetPort */ diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index 54738a855..eff849d30 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -179,24 +179,10 @@ int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry f OS_task_internal_record_t *task; /* Check for NULL pointers */ - if (task_name == NULL || task_id == NULL || function_pointer == NULL) - { - return OS_INVALID_POINTER; - } - - /* Check for bad stack size. Note that NULL stack_pointer is - * OK (impl will allocate) but size must be nonzero. */ - if (stack_size == 0) - { - return OS_ERROR; - } - - /* we don't want to allow names too long*/ - /* if truncated, two names might be the same */ - if (strlen(task_name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } + OS_CHECK_POINTER(task_id); + OS_CHECK_POINTER(function_pointer); + OS_CHECK_APINAME(task_name); + OS_CHECK_SIZE(stack_size); /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, task_name, &token); @@ -393,10 +379,8 @@ int32 OS_TaskGetIdByName(osal_id_t *task_id, const char *task_name) { int32 return_code; - if (task_id == NULL || task_name == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(task_id); + OS_CHECK_POINTER(task_name); return_code = OS_ObjectIdFindByName(LOCAL_OBJID_TYPE, task_name, task_id); @@ -420,10 +404,7 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) OS_task_internal_record_t *task; /* Check parameters */ - if (task_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(task_prop); memset(task_prop, 0, sizeof(OS_task_prop_t)); @@ -497,10 +478,7 @@ int32 OS_TaskFindIdBySystemData(osal_id_t *task_id, const void *sysdata, size_t OS_object_token_t token; /* Check parameters */ - if (task_id == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(task_id); /* The "sysdata" and "sysdata_size" must be passed to the underlying impl for validation */ return_code = OS_TaskValidateSystemData_Impl(sysdata, sysdata_size); diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index 4b71abeb6..11e654caa 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -108,27 +108,9 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ /* ** Check Parameters */ - if (timer_id == NULL || timer_name == NULL) - { - return OS_INVALID_POINTER; - } - - /* - ** we don't want to allow names too long - ** if truncated, two names might be the same - */ - if (strlen(timer_name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } - - /* - ** Verify callback parameter - */ - if (callback_ptr == NULL) - { - return OS_TIMER_ERR_INVALID_ARGS; - } + OS_CHECK_POINTER(timer_id); + OS_CHECK_APINAME(timer_name); + OS_CHECK_POINTER(callback_ptr); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -263,18 +245,10 @@ int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *accura ** check this stuff, also doing it here avoids unnecessarily ** creating and deleting a timebase object in case something is bad. */ - if (timer_id == NULL || timer_name == NULL || accuracy == NULL) - { - return OS_INVALID_POINTER; - } - - /* - ** Verify callback parameter - */ - if (callback_ptr == NULL) - { - return OS_TIMER_ERR_INVALID_ARGS; - } + OS_CHECK_POINTER(timer_id); + OS_CHECK_APINAME(timer_name); + OS_CHECK_POINTER(accuracy); + OS_CHECK_POINTER(callback_ptr); /* * Create our dedicated time base object to drive this timer @@ -335,15 +309,9 @@ int32 OS_TimerSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time) dedicated_timebase_id = OS_OBJECT_ID_UNDEFINED; - if (start_time >= (UINT32_MAX / 2) || interval_time >= (UINT32_MAX / 2)) - { - return OS_TIMER_ERR_INVALID_ARGS; - } - - if (start_time == 0 && interval_time == 0) - { - return OS_ERROR; - } + ARGCHECK(start_time < (UINT32_MAX / 2), OS_TIMER_ERR_INVALID_ARGS); + ARGCHECK(interval_time < (UINT32_MAX / 2), OS_TIMER_ERR_INVALID_ARGS); + ARGCHECK(start_time != 0 || interval_time != 0, OS_ERROR); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -510,10 +478,8 @@ int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name) int32 return_code; osal_objtype_t objtype; - if (timer_id == NULL || timer_name == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(timer_id); + OS_CHECK_POINTER(timer_name); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -548,10 +514,7 @@ int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop) OS_timebase_internal_record_t *timebase; /* Check parameters */ - if (timer_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(timer_prop); /* * Check our context. Not allowed to use the timer API from a timer callback. diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index 8eb4ad6f4..8ed4537cc 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -111,19 +111,8 @@ int32 OS_TimeBaseCreate(osal_id_t *timer_id, const char *timebase_name, OS_Timer /* ** Check Parameters */ - if (timer_id == NULL || timebase_name == NULL) - { - return OS_INVALID_POINTER; - } - - /* - ** we don't want to allow names too long - ** if truncated, two names might be the same - */ - if (strlen(timebase_name) >= OS_MAX_API_NAME) - { - return OS_ERR_NAME_TOO_LONG; - } + OS_CHECK_POINTER(timer_id); + OS_CHECK_APINAME(timebase_name); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -187,10 +176,8 @@ int32 OS_TimeBaseSet(osal_id_t timer_id, uint32 start_time, uint32 interval_time * Note that the units are intentionally left unspecified. The external sync period * could be measured in microseconds or hours -- it is whatever the application requires. */ - if (interval_time >= 1000000000 || start_time >= 1000000000) - { - return OS_TIMER_ERR_INVALID_ARGS; - } + ARGCHECK(start_time < 1000000000, OS_TIMER_ERR_INVALID_ARGS); + ARGCHECK(interval_time < 1000000000, OS_TIMER_ERR_INVALID_ARGS); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -276,10 +263,8 @@ int32 OS_TimeBaseGetIdByName(osal_id_t *timer_id, const char *timebase_name) int32 return_code; osal_objtype_t objtype; - if (timer_id == NULL || timebase_name == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(timer_id); + OS_CHECK_APINAME(timebase_name); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -313,10 +298,7 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro OS_timebase_internal_record_t *timebase; /* Check parameters */ - if (timebase_prop == NULL) - { - return OS_INVALID_POINTER; - } + OS_CHECK_POINTER(timebase_prop); /* * Check our context. Not allowed to use the timer API from a timer callback. diff --git a/src/tests/network-api-test/network-api-test.c b/src/tests/network-api-test/network-api-test.c index 93a275c62..019bbdb9b 100644 --- a/src/tests/network-api-test/network-api-test.c +++ b/src/tests/network-api-test/network-api-test.c @@ -292,13 +292,13 @@ void TestDatagramNetworkApi(void) actual = OS_SocketRecvFrom(objid, &Buf2, sizeof(Buf2), &l_addr, 100); UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_ERR_INVALID_ID", (long)actual); - expected = OS_INVALID_POINTER; + expected = OS_ERR_INVALID_SIZE; actual = OS_SocketRecvFrom(p2_socket_id, &Buf2, OSAL_SIZE_C(0), &l_addr, 100); - UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_INVALID_POINTER", (long)actual); + UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_ERR_INVALID_SIZE", (long)actual); - expected = OS_INVALID_POINTER; + expected = OS_ERR_INVALID_SIZE; actual = OS_SocketRecvFrom(p2_socket_id, &Buf2, OSAL_SIZE_C(0), NULL, 100); - UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_INVALID_POINTER", (long)actual); + UtAssert_True(actual == expected, "OS_SocketRecvFrom() (%ld) == OS_ERR_INVALID_SIZE", (long)actual); /* OS_SocketAddrToString */ expected = OS_INVALID_POINTER; diff --git a/src/tests/timer-add-api-test/timer-add-api-test.c b/src/tests/timer-add-api-test/timer-add-api-test.c index c33d53bbe..2ec048fd4 100644 --- a/src/tests/timer-add-api-test/timer-add-api-test.c +++ b/src/tests/timer-add-api-test/timer-add-api-test.c @@ -186,9 +186,9 @@ void TestTimerAddApi(void) actual = OS_TimerAdd(&timer_id, "Timer", OS_OBJECT_ID_UNDEFINED, null_func, NULL); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERR_INVALID_ID", (long)actual); - expected = OS_TIMER_ERR_INVALID_ARGS; + expected = OS_INVALID_POINTER; actual = OS_TimerAdd(&timer_id, "Timer", time_base_id, NULL, NULL); - UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_TIMER_ERR_INVALID_ARGS", (long)actual); + UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_ERR_NAME_TAKEN; actual = OS_TimerAdd(&timer_id, "Timer", time_base_id, null_func, NULL); diff --git a/src/unit-test-coverage/shared/src/coveragetest-binsem.c b/src/unit-test-coverage/shared/src/coveragetest-binsem.c index 2b92b9626..d46010c8b 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-binsem.c @@ -62,7 +62,7 @@ void Test_OS_BinSemCreate(void) OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate(NULL, NULL, 0, 0), OS_INVALID_POINTER); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate(&objid, "UT", 0, 0), OS_ERR_NAME_TOO_LONG); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-countsem.c b/src/unit-test-coverage/shared/src/coveragetest-countsem.c index 6c947a12e..b89a2c6ed 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-countsem.c @@ -62,7 +62,7 @@ void Test_OS_CountSemCreate(void) OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate(NULL, NULL, 0, 0), OS_INVALID_POINTER); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_CountSemCreate(&objid, "UT", 0, 0), OS_ERR_NAME_TOO_LONG); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 6aaceacff..eb744b0f3 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -58,14 +58,14 @@ void Test_OS_FileSysAddFixedMap(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_SUCCESS); OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, NULL, NULL), OS_INVALID_POINTER); - UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 1, 2 + OS_MAX_LOCAL_PATH_LEN); - OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_ERR_NAME_TOO_LONG); - UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 2, 2 + OS_MAX_PATH_LEN); - OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_ERR_NAME_TOO_LONG); + UT_SetDeferredRetcode(UT_KEY(OCS_memchr), 1, OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_FS_ERR_PATH_TOO_LONG); + UT_SetDeferredRetcode(UT_KEY(OCS_memchr), 2, OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_FS_ERR_PATH_TOO_LONG); UT_ResetState(UT_KEY(OCS_strlen)); UT_SetDefaultReturnValue(UT_KEY(OCS_strrchr), -1); - UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 3, 2 + OS_FS_DEV_NAME_LEN); + UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 1, 2 + OS_FS_DEV_NAME_LEN); OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_ERR_NAME_TOO_LONG); UT_ResetState(UT_KEY(OCS_strlen)); UT_ResetState(UT_KEY(OCS_strrchr)); @@ -99,11 +99,11 @@ void Test_OS_mkfs(void) actual = OS_mkfs(NULL, NULL, NULL, OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); /* set up for failure due to empty strings */ expected = OS_FS_ERR_PATH_INVALID; @@ -146,7 +146,7 @@ void Test_OS_rmfs(void) actual = OS_rmfs(NULL); UtAssert_True(actual == expected, "OS_rmfs() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_rmfs("/ramdev4"); UtAssert_True(actual == expected, "OS_rmfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -174,11 +174,11 @@ void Test_OS_initfs(void) actual = OS_initfs(NULL, NULL, NULL, OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_initfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); /* set up for failure */ UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); @@ -217,7 +217,7 @@ void Test_OS_mount(void) actual = OS_mount(NULL, NULL); UtAssert_True(actual == expected, "OS_mount() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_FS_DEV_NAME_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_mount("/ramdev0", "/ram0"); UtAssert_True(actual == expected, "OS_mount() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -247,7 +247,7 @@ void Test_OS_unmount(void) actual = OS_unmount(NULL); UtAssert_True(actual == expected, "OS_unmount() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_unmount("/ram0"); UtAssert_True(actual == expected, "OS_unmount() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); @@ -277,11 +277,11 @@ void Test_OS_fsBlocksFree(void) actual = OS_fsBlocksFree(NULL); UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_fsBlocksFree("/cf"); UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); expected = OS_FS_ERR_PATH_INVALID; @@ -316,11 +316,11 @@ void Test_OS_fsBytesFree(void) actual = OS_fsBytesFree(NULL, NULL); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_fsBytesFree("/cf", &bytes_free); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); expected = OS_FS_ERR_PATH_INVALID; @@ -346,11 +346,11 @@ void Test_OS_chkfs(void) actual = OS_chkfs(NULL, false); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_PATH_LEN); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_chkfs("/cf", false); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); /* Test Fail due to no matching VolTab entry */ UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); @@ -371,11 +371,11 @@ void Test_OS_FS_GetPhysDriveName(void) UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_PATH_LEN + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index b5bd75288..1be3bb48d 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -341,12 +341,12 @@ void Test_OS_ObjectIdFindByName(void) /* * Pass in a name that is beyond OS_MAX_API_NAME */ - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_API_NAME + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_ERR_NAME_TOO_LONG; actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_OS_TASK, TaskName, &objid); UtAssert_True(actual == expected, "OS_ObjectFindIdByName(%s) (%ld) == OS_ERR_NAME_TOO_LONG", TaskName, (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); /* * Pass in a name that is actually not found diff --git a/src/unit-test-coverage/shared/src/coveragetest-module.c b/src/unit-test-coverage/shared/src/coveragetest-module.c index 1a13d9389..043ebeb36 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-module.c +++ b/src/unit-test-coverage/shared/src/coveragetest-module.c @@ -94,11 +94,11 @@ void Test_OS_ModuleLoad(void) expected = OS_INVALID_POINTER; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); actual = OS_ModuleLoad(&objid, "UTS", "File2", OS_MODULE_FLAG_GLOBAL_SYMBOLS); expected = OS_ERR_NAME_TOO_LONG; UtAssert_True(actual == expected, "OS_ModuleLoad() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ResetState(UT_KEY(OCS_strlen)); + UT_ResetState(UT_KEY(OCS_memchr)); UT_SetDefaultReturnValue(UT_KEY(OS_TranslatePath), OS_ERROR); actual = OS_ModuleLoad(&objid, "UT", "FileBad", OS_MODULE_FLAG_GLOBAL_SYMBOLS); diff --git a/src/unit-test-coverage/shared/src/coveragetest-mutex.c b/src/unit-test-coverage/shared/src/coveragetest-mutex.c index b14655ecd..4c68e64a3 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/shared/src/coveragetest-mutex.c @@ -61,7 +61,7 @@ void Test_OS_MutSemCreate(void) OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate(NULL, NULL, 0), OS_INVALID_POINTER); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_MutSemCreate(&objid, "UT", 0), OS_ERR_NAME_TOO_LONG); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-network.c b/src/unit-test-coverage/shared/src/coveragetest-network.c index a48a75589..8a076a551 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-network.c +++ b/src/unit-test-coverage/shared/src/coveragetest-network.c @@ -61,7 +61,7 @@ void Test_OS_NetworkGetHostName(void) actual = OS_NetworkGetHostName(NULL, sizeof(Buffer)); UtAssert_True(actual == expected, "OS_NetworkGetHostName(Ptr=NULL) (%ld) == OS_INVALID_POINTER", (long)actual); - expected = OS_ERROR; + expected = OS_ERR_INVALID_SIZE; actual = OS_NetworkGetHostName(Buffer, 0); UtAssert_True(actual == expected, "OS_NetworkGetHostName(Size=0) (%ld) == OS_ERROR", (long)actual); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-queue.c b/src/unit-test-coverage/shared/src/coveragetest-queue.c index d5efa54ac..ba4387118 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-queue.c +++ b/src/unit-test-coverage/shared/src/coveragetest-queue.c @@ -56,23 +56,27 @@ void Test_OS_QueueCreate(void) */ int32 expected = OS_SUCCESS; osal_id_t objid; - int32 actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(0), 0); + int32 actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(4), OSAL_SIZE_C(4), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_SUCCESS", (long)actual); /* test error cases */ expected = OS_INVALID_POINTER; - actual = OS_QueueCreate(NULL, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(0), 0); + actual = OS_QueueCreate(NULL, "UT", OSAL_BLOCKCOUNT_C(4), OSAL_SIZE_C(4), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + expected = OS_ERR_INVALID_SIZE; + actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(4), OSAL_SIZE_C(0), 0); + UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_ERR_INVALID_SIZE", (long)actual); + + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_ERR_NAME_TOO_LONG; - actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(0), 0); + actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(4), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); expected = OS_QUEUE_INVALID_SIZE; - actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(1 + OS_QUEUE_MAX_DEPTH), OSAL_SIZE_C(0), 0); + actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(1 + OS_QUEUE_MAX_DEPTH), OSAL_SIZE_C(4), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_QUEUE_INVALID_SIZE", (long)actual); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-task.c b/src/unit-test-coverage/shared/src/coveragetest-task.c index 1d9d20d8c..ad34cf8c0 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-task.c +++ b/src/unit-test-coverage/shared/src/coveragetest-task.c @@ -119,8 +119,8 @@ void Test_OS_TaskCreate(void) OS_INVALID_POINTER); OSAPI_TEST_FUNCTION_RC( OS_TaskCreate(&objid, "UT", UT_TestHook, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(0), OSAL_PRIORITY_C(0), 0), - OS_ERROR); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME); + OS_ERR_INVALID_SIZE); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); OSAPI_TEST_FUNCTION_RC( OS_TaskCreate(&objid, "UT", UT_TestHook, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(128), OSAL_PRIORITY_C(0), 0), OS_ERR_NAME_TOO_LONG); diff --git a/src/unit-test-coverage/shared/src/coveragetest-time.c b/src/unit-test-coverage/shared/src/coveragetest-time.c index 840638d10..445714f32 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-time.c +++ b/src/unit-test-coverage/shared/src/coveragetest-time.c @@ -81,13 +81,13 @@ void Test_OS_TimerAdd(void) actual = OS_TimerAdd(NULL, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); - expected = OS_TIMER_ERR_INVALID_ARGS; + expected = OS_INVALID_POINTER; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, NULL, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_TIMER_ERR_INVALID_ARGS", (long)actual); @@ -139,7 +139,7 @@ void Test_OS_TimerCreate(void) actual = OS_TimerCreate(&objid, NULL, NULL, NULL); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_INVALID_POINTER", (long)actual); - expected = OS_TIMER_ERR_INVALID_ARGS; + expected = OS_INVALID_POINTER; actual = OS_TimerCreate(&objid, "UT", &accuracy, NULL); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_TIMER_ERR_INVALID_ARGS", (long)actual); @@ -149,11 +149,11 @@ void Test_OS_TimerCreate(void) UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERROR", (long)actual); UT_ClearForceFail(UT_KEY(OS_TimeBaseCreate)); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); } void Test_OS_TimerSet(void) diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index 4edf634bf..fc1675c5d 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -99,11 +99,11 @@ void Test_OS_TimeBaseCreate(void) actual = OS_TimeBaseCreate(NULL, NULL, NULL); UtAssert_True(actual == expected, "OS_TimeBaseCreate() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), 2 + OS_MAX_API_NAME); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimeBaseCreate(&objid, "UT", UT_TimerSync); UtAssert_True(actual == expected, "OS_TimeBaseCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearForceFail(UT_KEY(OCS_memchr)); UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h index 0070b36b7..f6fa1fb37 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h @@ -47,6 +47,7 @@ extern int OCS_rename(const char *old, const char *nw); extern int OCS_snprintf(char *s, size_t maxlen, const char *format, ...); extern int OCS_vsnprintf(char *s, size_t maxlen, const char *format, OCS_va_list arg); extern int OCS_printf(const char *format, ...); +extern int OCS_fprintf(OCS_FILE *fp, const char *format, ...); extern int OCS_putchar(int c); extern OCS_FILE *OCS_stdin; diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h index 80b0838fb..21f58f107 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h @@ -39,6 +39,7 @@ /* prototypes normally declared in stdlib.h */ /* ----------------------------------------- */ +extern void OCS_abort(void); extern void OCS_exit(int status); extern unsigned long int OCS_strtoul(const char *nptr, char **endptr, int base); extern int OCS_system(const char *command); diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_string.h b/src/unit-test-coverage/ut-stubs/inc/OCS_string.h index 855b3d14b..f58965910 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_string.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_string.h @@ -36,6 +36,7 @@ /* prototypes normally declared in string.h */ /* ----------------------------------------- */ +extern void * OCS_memchr(const void *s, int c, size_t n); extern void * OCS_memcpy(void *dest, const void *src, size_t n); extern void * OCS_memset(void *s, int c, size_t n); extern int OCS_strcmp(const char *s1, const char *s2); diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdio.h b/src/unit-test-coverage/ut-stubs/override_inc/stdio.h index b8c5e42fa..659f7056f 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdio.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdio.h @@ -28,17 +28,18 @@ /* mappings for declarations in stdio.h */ /* ----------------------------------------- */ -#define FILE OCS_FILE -#define fclose OCS_fclose -#define fgets OCS_fgets -#define fopen OCS_fopen -#define fputs OCS_fputs -#define remove OCS_remove -#define rename OCS_rename -#define snprintf OCS_snprintf -#define vsnprintf OCS_vsnprintf -#define printf(...) OCS_printf(__VA_ARGS__) -#define putchar OCS_putchar +#define FILE OCS_FILE +#define fclose OCS_fclose +#define fgets OCS_fgets +#define fopen OCS_fopen +#define fputs OCS_fputs +#define remove OCS_remove +#define rename OCS_rename +#define snprintf OCS_snprintf +#define vsnprintf OCS_vsnprintf +#define printf(...) OCS_printf(__VA_ARGS__) +#define fprintf(...) OCS_fprintf(__VA_ARGS__) +#define putchar OCS_putchar #define stdin OCS_stdin #define stdout OCS_stdout diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h b/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h index 5659a1daa..bf1d54f40 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h @@ -30,6 +30,7 @@ #define EXIT_SUCCESS OCS_EXIT_SUCCESS #define EXIT_FAILURE OCS_EXIT_FAILURE +#define abort OCS_abort #define exit OCS_exit #define strtoul OCS_strtoul #define system OCS_system diff --git a/src/unit-test-coverage/ut-stubs/override_inc/string.h b/src/unit-test-coverage/ut-stubs/override_inc/string.h index e9048c118..b5d14fcbb 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/string.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/string.h @@ -27,6 +27,7 @@ /* ----------------------------------------- */ /* mappings for declarations in string.h */ /* ----------------------------------------- */ +#define memchr OCS_memchr #define memcpy OCS_memcpy #define memset OCS_memset #define strcmp OCS_strcmp diff --git a/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c b/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c index 5ffc9c262..c1bfd05ea 100644 --- a/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/libc-stdio-stubs.c @@ -196,6 +196,11 @@ int OCS_printf(const char *format, ...) return UT_DEFAULT_IMPL(OCS_printf); } +int OCS_fprintf(OCS_FILE *fp, const char *format, ...) +{ + return UT_DEFAULT_IMPL(OCS_fprintf); +} + static OCS_FILE LOCAL_FP[3] = {{10}, {11}, {12}}; OCS_FILE *OCS_stdin = &LOCAL_FP[0]; diff --git a/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c b/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c index 721dece9b..97a8e3492 100644 --- a/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/libc-stdlib-stubs.c @@ -59,6 +59,13 @@ void OCS_exit(int c) */ } +void OCS_abort(void) +{ + UT_DEFAULT_IMPL(OCS_abort); + + /* Note - same issue as with OCS_exit() - this isn't supposed to return */ +} + unsigned long int OCS_strtoul(const char *nptr, char **endptr, int base) { int32 Status; diff --git a/src/unit-test-coverage/ut-stubs/src/libc-string-stubs.c b/src/unit-test-coverage/ut-stubs/src/libc-string-stubs.c index d8cac53a7..3cc275c2d 100644 --- a/src/unit-test-coverage/ut-stubs/src/libc-string-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/libc-string-stubs.c @@ -45,6 +45,24 @@ void *OCS_memset(void *s, int c, size_t n) return Result; } +void *OCS_memchr(const void *s, int c, size_t n) +{ + int32 Status; + void *Result; + + Status = UT_DEFAULT_IMPL(OCS_memchr); + if (Status == 0) + { + Result = memchr(s, c, n); + } + else + { + Result = NULL; + } + + return Result; +} + void *OCS_memcpy(void *dest, const void *src, size_t n) { int32 Status; diff --git a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c index c58b98780..400695917 100644 --- a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c +++ b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c @@ -177,7 +177,7 @@ void UT_os_networkgethostname_test() testDesc = "#2 Zero-name-length-arg"; res = OS_NetworkGetHostName(buffer, 0); - if (res == OS_ERROR) + if (res == OS_ERR_INVALID_SIZE) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); diff --git a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c index d1e0a15e9..94e8060e5 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c +++ b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c @@ -318,7 +318,7 @@ void UT_os_timercreate_test() /*-----------------------------------------------------*/ testDesc = "#6 Invalid-arg"; - if (OS_TimerCreate(&g_timerIds[5], g_timerNames[5], &g_clkAccuracy, NULL) == OS_TIMER_ERR_INVALID_ARGS) + if (OS_TimerCreate(&g_timerIds[5], g_timerNames[5], &g_clkAccuracy, NULL) == OS_INVALID_POINTER) UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); else UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); From d5727f9858e377c46a07c8b28fffd456a52db523 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Wed, 16 Dec 2020 12:31:36 -0500 Subject: [PATCH 036/111] Fix #377 Add "OSAL Select" functional tests --- src/tests/select-test/select-test.c | 571 ++++++++++++++++++++++++++++ 1 file changed, 571 insertions(+) create mode 100644 src/tests/select-test/select-test.c diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c new file mode 100644 index 000000000..80c8cc5bc --- /dev/null +++ b/src/tests/select-test/select-test.c @@ -0,0 +1,571 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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. + */ + +/* + * Filename: select-test.c + * + * Purpose: This file contains functional tests for "osapi-select" + * Single select test will create a server and client to stream data between them and the select watches that stream. + * Multi select test will setup a second server and client also streaming data between them so that it can watch + * multiple streams. + * + */ + +#include +#include +#include +#include "common_types.h" +#include "osapi.h" +#include "utassert.h" +#include "uttest.h" +#include "utbsp.h" +#define MAX_BUFFER_LOOP 1000000 + +osal_id_t s_task_id; +osal_id_t s2_task_id; +osal_id_t s_socket_id; +osal_id_t s2_socket_id; +osal_id_t c_socket_id; +osal_id_t c2_socket_id; +OS_SockAddr_t s_addr; +OS_SockAddr_t s2_addr; +OS_SockAddr_t c_addr; +OS_SockAddr_t c2_addr; +osal_id_t bin_sem_id; +osal_id_t bin_sem_id2; + +/* *************************************** MAIN ************************************** */ + +char * fsAddrPtr = NULL; +static osal_id_t setup_file(void) +{ + osal_id_t id; + OS_mkfs(fsAddrPtr, "/ramdev0", "RAM", 512, 20); + OS_mount("/ramdev0", "/drive0"); + OS_OpenCreate(&id, "/drive0/select_test.txt", OS_FILE_FLAG_CREATE, OS_READ_WRITE); + return id; +} + +void BinSemSetup(void) +{ + uint32 status; + OS_bin_sem_prop_t bin_sem_prop; + OS_bin_sem_prop_t bin_sem_prop2; + + /* + * Create the binary semaphore + * BinSem1 is used to control when the server can accept connections + * BinSem2 is used to make sure all sub task finish before the main task does. + */ + status = OS_BinSemCreate(&bin_sem_id, "BinSem1", 0, 0); + UtAssert_True(status == OS_SUCCESS, "BinSem1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(bin_sem_id), (int)status); + + status = OS_BinSemGetInfo(bin_sem_id, &bin_sem_prop); + UtAssert_True(status == OS_SUCCESS, "BinSem1 value=%d Rc=%d", (int)bin_sem_prop.value, (int)status); + + status = OS_BinSemCreate(&bin_sem_id2, "BinSem2", 0, 0); + UtAssert_True(status == OS_SUCCESS, "BinSem2 create Id=%lx Rc=%d", OS_ObjectIdToInteger(bin_sem_id2), (int)status); + + status = OS_BinSemGetInfo(bin_sem_id2, &bin_sem_prop2); + UtAssert_True(status == OS_SUCCESS, "BinSem2 value=%d Rc=%d", (int)bin_sem_prop2.value, (int)status); +} + +void Setup_Server(void) +{ + int32 expected; + int32 actual; + + /* + * Set up a server + */ + + /* Open a server socket */ + s_socket_id = OS_OBJECT_ID_UNDEFINED; + expected = OS_SUCCESS; + actual = OS_SocketOpen(&s_socket_id, OS_SocketDomain_INET, OS_SocketType_STREAM); + UtAssert_True(actual == expected, "OS_SocketOpen() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(OS_ObjectIdDefined(s_socket_id), "s_socket_id (%lu) != 0", OS_ObjectIdToInteger(s_socket_id)); + + /* Initialize server address */ + actual = OS_SocketAddrInit(&s_addr, OS_SocketDomain_INET); + UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); + + /* Set server port */ + actual = OS_SocketAddrSetPort(&s_addr, 9997); + UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); + + /* Set server address */ + actual = OS_SocketAddrFromString(&s_addr, "127.0.0.1"); + UtAssert_True(actual == expected, "OS_SocketAddrFromString() (%ld) == OS_SUCCESS", (long)actual); + + /* Bind server socket to server address */ + actual = OS_SocketBind(s_socket_id, &s_addr); + UtAssert_True(actual == expected, "OS_SocketBind() (%ld) == OS_SUCCESS", (long)actual); +} + +void Setup_Client(void) +{ + int32 expected; + int32 actual; + + /* + * Set up a client + */ + + /* Open a client socket */ + expected = OS_SUCCESS; + c_socket_id = OS_OBJECT_ID_UNDEFINED; + + actual = OS_SocketOpen(&c_socket_id, OS_SocketDomain_INET, OS_SocketType_STREAM); + UtAssert_True(actual == expected, "OS_SocketOpen() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(OS_ObjectIdDefined(c_socket_id), "c_socket_id (%lu) != 0", OS_ObjectIdToInteger(c_socket_id)); + + /* Initialize client address */ + actual = OS_SocketAddrInit(&c_addr, OS_SocketDomain_INET); + UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); + + /* Set client port */ + actual = OS_SocketAddrSetPort(&c_addr, 9996); + UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); + + /* Set client address */ + actual = OS_SocketAddrFromString(&c_addr, "127.0.0.1"); + UtAssert_True(actual == expected, "OS_SocketAddrFromString() (%ld) == OS_SUCCESS", (long)actual); +} + +void Server_Fn(void) +{ + osal_id_t connsock_id = OS_OBJECT_ID_UNDEFINED; + OS_SockAddr_t addr; + uint32 status; + + /* Accept incoming connections */ + OS_SocketAccept(s_socket_id, &connsock_id, &addr, OS_PEND); + + status = OS_BinSemTake(bin_sem_id); + UtAssert_True(status == OS_SUCCESS, "BinSem1 Server 1 take Rc=%d", (int)status); + + status = OS_close(s_socket_id); + UtAssert_True(status == OS_SUCCESS, "status after close s_socket_id = %d", (int)status); + + status = OS_close(connsock_id); + UtAssert_True(status == OS_SUCCESS, "status after close connsock_id = %d", (int)status); + + status = OS_BinSemGive(bin_sem_id2); + UtAssert_True(status == OS_SUCCESS, "BinSem2 Server 1 give Rc=%d", (int)status); +} /* end Server_Fn */ + +void Setup_Server2(void) +{ + int32 expected; + int32 actual; + + /* + * Set up a server + */ + + /* Open a server socket */ + s2_socket_id = OS_OBJECT_ID_UNDEFINED; + expected = OS_SUCCESS; + actual = OS_SocketOpen(&s2_socket_id, OS_SocketDomain_INET, OS_SocketType_STREAM); + UtAssert_True(actual == expected, "OS_SocketOpen() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(OS_ObjectIdDefined(s2_socket_id), "s2_socket_id (%lu) != 0", OS_ObjectIdToInteger(s2_socket_id)); + + /* Initialize server address */ + actual = OS_SocketAddrInit(&s2_addr, OS_SocketDomain_INET); + UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); + + /* Set server port */ + actual = OS_SocketAddrSetPort(&s2_addr, 9998); + UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); + + /* Set server address */ + actual = OS_SocketAddrFromString(&s2_addr, "127.0.0.1"); + UtAssert_True(actual == expected, "OS_SocketAddrFromString() (%ld) == OS_SUCCESS", (long)actual); + + /* Bind server socket to server address */ + actual = OS_SocketBind(s2_socket_id, &s2_addr); + UtAssert_True(actual == expected, "OS_SocketBind() (%ld) == OS_SUCCESS", (long)actual); +} + +void Setup_Client2(void) +{ + int32 expected; + int32 actual; + + /* + * Set up a client + */ + + /* Open a client socket */ + expected = OS_SUCCESS; + c2_socket_id = OS_OBJECT_ID_UNDEFINED; + + actual = OS_SocketOpen(&c2_socket_id, OS_SocketDomain_INET, OS_SocketType_STREAM); + UtAssert_True(actual == expected, "OS_SocketOpen() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(OS_ObjectIdDefined(c2_socket_id), "c2_socket_id (%lu) != 0", OS_ObjectIdToInteger(c2_socket_id)); + + /* Initialize client address */ + actual = OS_SocketAddrInit(&c2_addr, OS_SocketDomain_INET); + UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); + + /* Set client port */ + actual = OS_SocketAddrSetPort(&c2_addr, 9995); + UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); + + /* Set client address */ + actual = OS_SocketAddrFromString(&c2_addr, "127.0.0.1"); + UtAssert_True(actual == expected, "OS_SocketAddrFromString() (%ld) == OS_SUCCESS", (long)actual); +} + +void Server_Fn2(void) +{ + osal_id_t connsock_id = OS_OBJECT_ID_UNDEFINED; + OS_SockAddr_t addr; + uint32 status; + + /* Accept incoming connections */ + OS_SocketAccept(s2_socket_id, &connsock_id, &addr, OS_PEND); + + status = OS_close(s2_socket_id); + UtAssert_True(status == OS_SUCCESS, "status after close s2_socket_id = %d", (int)status); + + status = OS_close(connsock_id); + UtAssert_True(status == OS_SUCCESS, "status after close connsock_id = %d", (int)status); +} /* end Server_Fn */ + +void Setup_Single(void) +{ + Setup_Server(); + Setup_Client(); + BinSemSetup(); +} + +void Setup_Multi(void) +{ + Setup_Single(); + Setup_Server2(); + Setup_Client2(); +} + +void Teardown_Single(void) +{ + uint32 status; + + OS_close(c_socket_id); + status = OS_BinSemTake(bin_sem_id2); + UtAssert_True(status == OS_SUCCESS, "BinSem2 Teardown single take Rc=%d", (int)status); + + OS_BinSemDelete(bin_sem_id); + OS_BinSemDelete(bin_sem_id2); +} + +void Teardown_Multi(void) +{ + uint32 status; + + status = OS_BinSemFlush(bin_sem_id); + UtAssert_True(status == OS_SUCCESS, "BinSem1 Teardown multi flush Rc=%d", (int)status); + + OS_close(c2_socket_id); + Teardown_Single(); +} + +void TestSelectSingleRead(void) +{ + /* + * Test Case For: + * int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs); + */ + int32 expected = OS_SUCCESS; + int32 actual; + + /* + * Create a server thread, and connect client from + * this thread to server thread and verify connection + */ + + /* Create a server task/thread */ + int32 status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + OSAL_PRIORITY_C(50), 0); + UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); + + /* Connect to a server */ + actual = OS_SocketConnect(c_socket_id, &s_addr, 10); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + + uint32 StateFlags; + expected = OS_ERROR_TIMEOUT; + StateFlags = OS_STREAM_STATE_READABLE; + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); + UtAssert_True(StateFlags == 0, "OS_SelectSingle() (%d) == None", StateFlags); + + status = OS_BinSemGive(bin_sem_id); + + expected = OS_SUCCESS; + StateFlags = OS_STREAM_STATE_READABLE; + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", + StateFlags); +} + +void TestSelectMultipleRead(void) +{ + /* + * Test Case For: + * int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs); + */ + OS_FdSet ReadSet; + OS_FdSet WriteSet; + int32 expected = OS_SUCCESS; + int32 actual; + int32 status; + + OS_SelectFdZero(&ReadSet); + OS_SelectFdZero(&WriteSet); + + /* + * Create a server thread, and connect client from + * this thread to server thread and verify connection + */ + + /* Create a server task/thread */ + status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + OSAL_PRIORITY_C(50), 0); + UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); + + /* Connect to a server */ + actual = OS_SocketConnect(c_socket_id, &s_addr, 10); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + + status = OS_TaskCreate(&s2_task_id, "Server2", Server_Fn2, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + OSAL_PRIORITY_C(50), 0); + UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); + + /* Connect to a server */ + actual = OS_SocketConnect(c2_socket_id, &s2_addr, 10); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + + OS_SelectFdAdd(&ReadSet, c_socket_id); + OS_SelectFdAdd(&ReadSet, c2_socket_id); + + UtAssert_True(OS_SelectFdIsSet(&ReadSet, c_socket_id), "OS_SelectFdIsSet(1) == true"); + UtAssert_True(OS_SelectFdIsSet(&ReadSet, c2_socket_id), "OS_SelectFdIsSet(1) == true"); + + actual = OS_SelectMultiple(&ReadSet, &WriteSet, 100); + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectMultiple() (%ld) == OS_SUCCESS", (long)actual); + + UtAssert_True(!OS_SelectFdIsSet(&ReadSet, c_socket_id), "OS_SelectFdIsSet(1) == false"); + UtAssert_True(OS_SelectFdIsSet(&ReadSet, c2_socket_id), "OS_SelectFdIsSet(2) == true"); +} + +void TestSelectSingleWrite(void) +{ + /* + * Test Case For: + * int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs); + */ + + int32 actual; + uint32 StateFlags; + int32 expected = OS_SUCCESS; + int count = 0; + char Buf_send_c[16834] = {0}; + + /* + * Create a server thread, and connect client from + * this thread to server thread and verify connection + */ + + /* Create a server task/thread */ + int32 status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + OSAL_PRIORITY_C(50), 0); + UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); + + /* Connect to a server */ + actual = OS_SocketConnect(c_socket_id, &s_addr, 10); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + + while (actual != OS_ERROR_TIMEOUT && count < MAX_BUFFER_LOOP) + { + strcpy(Buf_send_c, "16 KB buffer filler"); + actual = OS_TimedWrite(c_socket_id, Buf_send_c, sizeof(Buf_send_c), 10); + + StateFlags = OS_STREAM_STATE_WRITABLE; + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + + count++; + } + + status = OS_BinSemGive(bin_sem_id); + + if (count >= MAX_BUFFER_LOOP) + { + UtAssertEx(false, UTASSERT_CASETYPE_MIR, __FILE__, __LINE__, "%s", + "Unable to cause OS_STREAM_STATE_WRITEABLE timeout with large looped writes, skipping verification"); + } + else + { + expected = OS_ERROR_TIMEOUT; + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); + UtAssert_True(StateFlags == 0, "OS_SelectSingle() (%d) == None", StateFlags); + + expected = OS_SUCCESS; + StateFlags = OS_STREAM_STATE_WRITABLE; + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", + StateFlags); + } +} + +void TestSelectMultipleWrite(void) +{ + /* + * Test Case For: + * int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs); + */ + OS_FdSet ReadSet; + OS_FdSet WriteSet; + int32 expected = OS_SUCCESS; + int32 actual; + int32 status; + uint32 StateFlags; + int count = 0; + char Buf_send_c[16834] = {0}; + + OS_SelectFdZero(&ReadSet); + OS_SelectFdZero(&WriteSet); + + /* + * Create a server thread, and connect client from + * this thread to server thread and verify connection + */ + + /* Create a server task/thread */ + status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + OSAL_PRIORITY_C(50), 0); + UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); + + /* Connect to a server */ + actual = OS_SocketConnect(c_socket_id, &s_addr, 10); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + + status = OS_TaskCreate(&s2_task_id, "Server2", Server_Fn2, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + OSAL_PRIORITY_C(50), 0); + UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); + + /* Connect to a server */ + actual = OS_SocketConnect(c2_socket_id, &s2_addr, 10); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + + OS_SelectFdAdd(&WriteSet, c_socket_id); + OS_SelectFdAdd(&WriteSet, c2_socket_id); + + UtAssert_True(OS_SelectFdIsSet(&WriteSet, c_socket_id), "OS_SelectFdIsSet(1) == true"); + UtAssert_True(OS_SelectFdIsSet(&WriteSet, c2_socket_id), "OS_SelectFdIsSet(1) == true"); + + while (actual != OS_ERROR_TIMEOUT && count < MAX_BUFFER_LOOP) + { + strcpy(Buf_send_c, "16 KB buffer filler"); + actual = OS_TimedWrite(c_socket_id, Buf_send_c, sizeof(Buf_send_c), 10); + + StateFlags = OS_STREAM_STATE_WRITABLE; + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + + count++; + } + + if (count >= MAX_BUFFER_LOOP) + { + UtAssertEx(false, UTASSERT_CASETYPE_MIR, __FILE__, __LINE__, "%s", + "Unable to cause OS_STREAM_STATE_WRITEABLE timeout with large looped writes, skipping verification"); + } + else + { + actual = OS_SelectMultiple(&ReadSet, &WriteSet, 100); + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectMultiple() (%ld) == OS_SUCCESS", (long)actual); + + UtAssert_True(!OS_SelectFdIsSet(&WriteSet, c_socket_id), "OS_SelectFdIsSet(1) == false"); + UtAssert_True(OS_SelectFdIsSet(&WriteSet, c2_socket_id), "OS_SelectFdIsSet(2) == true"); + } +} + +void TestSelectSingleFile(void) +{ + int32 expected = OS_SUCCESS; + int32 actual; + uint32 StateFlags; + osal_id_t fd = setup_file(); + + expected = OS_SUCCESS; + StateFlags = OS_STREAM_STATE_READABLE; + actual = OS_SelectSingle(fd, &StateFlags, 100); + + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", + StateFlags); + + StateFlags = OS_STREAM_STATE_WRITABLE; + actual = OS_SelectSingle(fd, &StateFlags, 100); + + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", + StateFlags); + + expected = OS_ERROR_TIMEOUT; + StateFlags = OS_STREAM_STATE_BOUND; + actual = OS_SelectSingle(fd, &StateFlags, 100); + + /* Verify Outputs */ + UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); + UtAssert_True(StateFlags == 0, "OS_SelectSingle() (%d) == None", StateFlags); +} + +void UtTest_Setup(void) +{ + if (OS_API_Init() != OS_SUCCESS) + { + UtAssert_Abort("OS_API_Init() failed"); + } + + /* + * Register the test setup and check routines in UT assert + */ + + UtTest_Add(TestSelectSingleRead, Setup_Single, Teardown_Single, "TestSelectSingleRead"); + UtTest_Add(TestSelectMultipleRead, Setup_Multi, Teardown_Multi, "TestSelectMultipleRead"); + UtTest_Add(TestSelectSingleWrite, Setup_Single, Teardown_Single, "TestSelectSingleWrite"); + UtTest_Add(TestSelectMultipleWrite, Setup_Multi, Teardown_Multi, "TestSelectMultipleWrite"); + UtTest_Add(TestSelectSingleFile, NULL, NULL, "TestSelectSingleFile"); +} \ No newline at end of file From d6cb7db722cfe385e8e94dda138e9f41e4192dde Mon Sep 17 00:00:00 2001 From: asadams2 Date: Tue, 10 Nov 2020 15:43:24 -0600 Subject: [PATCH 037/111] Fix #679, Convert OSAL Config Guide to markdown Fix #697, Fix formatting --- doc/OSAL-Configuration-Guide.md | 869 +++++++++++++++++++++++++++++++ doc/OSAL-Configuration-guide.doc | Bin 429568 -> 0 bytes doc/OSAL-Configuration-guide.pdf | Bin 799249 -> 0 bytes 3 files changed, 869 insertions(+) create mode 100644 doc/OSAL-Configuration-Guide.md delete mode 100644 doc/OSAL-Configuration-guide.doc delete mode 100644 doc/OSAL-Configuration-guide.pdf diff --git a/doc/OSAL-Configuration-Guide.md b/doc/OSAL-Configuration-Guide.md new file mode 100644 index 000000000..e32ff65d0 --- /dev/null +++ b/doc/OSAL-Configuration-Guide.md @@ -0,0 +1,869 @@ +# Introduction + +## Scope + +The purpose of this document is to provide guidelines and conventions +for the configuration and deployment of the Operating System Abstraction +Layer (OSAL) to a desired platform or platforms. + +## Background + +The goal OS Abstraction Layer is to promote the creation of portable and +reusable real time embedded system software. Given the necessary OS +abstraction layer implementations, the same embedded software should +compile and run on a number of platforms ranging from spacecraft +computer systems to desktop PCs. + +## Applicable Documents + +| **Document ID** | **Document Title** | +| --- | --- | +| | | + + +## Acronyms + +| **Acronym** | **Description** | +|---|---| +| OS | Operating System | +| API | Application Programming Interface | +| CM | Configuration Management | +| CPU | Central Processing Unit | +| EEPROM | Electrically Erasable Programmable Read-Only Memory | +| HW, H/W | Hardware | +| RAM | Random-Access Memory | +| SW, S/W | Software | +| TBD | To Be Determined | + +## Glossary of Terms + +The following table defines the terms used throughout this document. +These terms are identified as proper nouns and are capitalized. + +| **Term** | **Definition** | +|---|---| +| Application (APP) | A generic term for a computer program in a desktop or embedded system. An Application is generally not part of the operating system. | +| Application Programmer's Interface (API) | A set of routines, protocols, and tools for building software applications | +| Board Support Package (BSP) | A collection of user-provided facilities that interface an OS and the cFE with a specific hardware platform. The BSP is responsible for hardware initialization. | +| Core Flight Executive (cFE) | A runtime environment and a set of services for hosting FSW Applications | +| Cyclic Redundancy Check | A polynomial based method for checking that a data set has remained unchanged from one time period to another. | +| Developer | Anyone who is coding a software Application. | +| Hardware Platform | The target hardware that hosts the Operating System and Application. | +| Interface Control Document | A document that describes the software interface, in detail, to another piece of software or hardware. | +| I/O Data | Any data being written to and read from an I/O port. No structure is placed on the data and no distinction as to the type of I/O device. I/O data is defined separately from memory data because it has a separate API and it's an optional interface of the cFE. | +| Log | A collection of data that an application stores that provides information to diagnose and debug FSW problems. | +| Memory Data | Any data being written to and read from memory. No structure is placed on the data and no distinction as to the type of memory is made. | +| MMU | Memory Management Unit. A piece of hardware that manages virtual memory systems. It automatically translates addresses into physical addresses so that an application can be linked with one set of addresses but actually reside in a different part of memory. | +| Network | A connection between subsystems used for communication purposes. | +| Platform | See "Hardware Platform" above. | +| User | Anyone who interacts with the Software Application or system in its operational state. A user can be a developer, a tester, an operator, or a maintainer. +| Application (APP) | A generic term for a computer program in a desktop or embedded system. An Application is generally not part of the operating system. | +| Application Programmer's Interface (API) | A set of routines, protocols, and tools for building software applications | +| Board Support Package (BSP) | A collection of user-provided facilities that interface an OS and the cFE with a specific hardware platform. The BSP is responsible for hardware initialization. | +| Core Flight Executive (cFE) | A runtime environment and a set of services for hosting FSW Applications | +| Cyclic Redundancy Check | A polynomial based method for checking that a data set has remained unchanged from one time period to another. | +| Developer | Anyone who is coding a software Application. | +| Hardware Platform | The target hardware that hosts the Operating System and Application. | +| Interface Control Document | A document that describes the software interface, in detail, to another piece of software or hardware. | +| I/O Data | Any data being written to and read from an I/O port. No structure is placed on the data and no distinction as to the type of I/O device. I/O data is defined separately from memory data because it has a separate API and it's an optional interface of the cFE. | +| Log | A collection of data that an application stores that provides information to diagnose and debug FSW problems. | +| Memory Data | Any data being written to and read from memory. No structure is placed on the data and no distinction as to the type of memory is made. | +| MMU | Memory Management Unit. A piece of hardware that manages virtual memory systems. It automatically translates addresses into physical addresses so that an application can be linked with one set of addresses but actually reside in a different part of memory. | +| Network | A connection between subsystems used for communication purposes. | +| Platform | See "Hardware Platform" above. | +| User | Anyone who interacts with the Software Application or system in its operational state. A user can be a developer, a tester, an operator, or a maintainer.| + +# How to Configure, Build, and Run the OSAL + + +The OSAL distribution includes a complete development environment with +support for a number of processors and operating systems. The OSAL +development environment has been designed to isolate the portable OS +source code from the OSAL applications, configuration parameters, and +build products. The development environment is an example of how to +configure and build portable software using the OSAL code, but it is by +no means a requirement to use the OSAL. The included platforms for the +OSAL can be used as starting points for other boards and CPUs. + +The following sections provide instructions on how to: + +- Setup the build environment + +- Configure the build directory for an OSAL application + +- Configure a OSAL Application + +- Build the OSAL Application + +- Load the OSAL Application on to the target platform + +- Run the OSAL Application on the target platform + +In the current OSAL release, two build systems are available: the +"classic" build using ordinary makefiles, and a new build utilizing the +"cmake" tool. The "classic" build is mostly carried over from previous +OSAL releases and preserves compatibility with existing +projects/workflows. The "cmake" build offers increased features by +introducing additional scripting and build-time configurability, +allowing direct inclusion into larger projects with less need to modify +files to support a specific target or configuration. + +## Setup the Build Environment + +This section details the steps needed to setup the OSAL source +distribution and prepare the host development environment to build the +OSAL. + +### Setup the OSAL Source Distribution + +Get a copy of the OSAL source distribution directory on your build +machine. The source distribution has the following directories: + +#### OSAL source distribution directories + +| **Directory** | **Description** | +|---|---| +| osal | The top level OSAL source distribution directory. OSAL version 2.10 is being used as an example. | +| osal/src | The src directory contains the OSAL source, and make rules. | +| osal/src/examples | The sample directory contains the sample applications for the osal. | +| osal/src/tests | The tests directory contains a small number of OSAL tests that can run on the targets. | +| osal/src/unit-tests |The unit-tests directory contains a suite of OSAL unit tests. | +| osal/src/bsp | The bsp directory contains the platform specific code for the OSAL as well as code to make the OSAL run on a particular platform. Everything in this directory is used to adapt the OSAL and Applications to a particular hardware platform. This directory also contains the startup code for the example programs. The included platforms are generic enough that they may be easy to port to other platforms and processor architectures. For example: The bsp/mcf5235-rtems board support package was ported to an ARM processor running RTEMS with minimal effort. | +| osal/src/make | The make directory contains common makefiles for building the OSAL and its applications (classic build only) | +| osal/src/os | The os directory is the heart of the OSAL, containing the implementation of the OSAL for each supported operating system. There is a sub-directory for each supported operating system in this directory. The OSAL include files are also contained in this directory (src/os/inc). | +| osal/src/inc | The inc directory contains system wide include files that are used by the OSAL on all platforms. | +| osal/build | The build directory contains the classic framework for building an OSAL application. The files in this directory allow easy customization and configuration for any supported OS or platform for the OSAL. By changing two variables in a file, the OSAL examples and test can be built for any of the supported platforms. | +| osal/doc | The doc directory contains the documentation and release notes for the OSAL. | + + +The osal directory can go just about anywhere on a host development +system. + +#### Example directory structure locations + +| **Host Operating System** | **Example Directory** | **Notes** | +|---|---|---| +| Windows/vxWorks 6 Development Shell | C:\\osalproject\\osal | Building on Windows with the vxWorks 6.x development tools requires using the "vxWorks Development Shell". The system will not build on a standard Cygwin Shell, or a windows DOS prompt. | +| Linux | /home/osaluser/osal| | + +## Configure the OSAL Parameter File + +The file **osconfig.h** has configuration parameters for tailoring the +OSAL parameters. Most parameters set upper bounds on the number of OS +objects that can be created. The OSAL keeps track of allocated OS +objects using fixed size tables. The OSAL source distribution contains a +sample osconfig.h file in the "osal/src/bsp/\/config" directory, +which can either be used as-is or tuned for specific project needs. The +osconfig.h file is required regardless of the build system in use +(classic or cmake). + +#### OSAL configuration parameters + +| **Parameter** | **Description** | +|---|---| +| OS_MAX_TASKS | The maximum number of tasks that can be created in the running OSAL application. | +| OS_MAX_QUEUES | The maximum number of queues that can be created in the running OSAL application. | +| OS_MAX_COUNT_SEMAPHORES | The maximum number of counting semaphores that can be created in the running OSAL application. | +| OS_MAX_BIN_SEMAPHORES | The maximum number of binary semaphores that can be created in the running OSAL application. | +| OS_MAX_MUTEXES | The maximum number of mutexes that can be created in the running OSAL application. | +|OS_MAX_PATH_LEN |The maximum length for an absolute path length in the OSAL File API.| +|OS_MAX_API_NAME|The maximum length for an individual file name in the OSAL File API.| |OS_BUFFER_SIZE|The maximum size of a formatted text message for the OS_printf API.| |OS_BUFFER_MSG_DEPTH|The maximum number of messages buffered by the OS_printf API.| +|OS_UTILITY_TASK_ON |Turns on a utility task that will read the statements to print from the OS_printf function. If this define is commented out OS_printf will print the text under the context of the caller.| +|OS_UTILITYTASK_STACK_SIZE|The size of the stack for the utility task.| |OS_UTILITYTASK_PRIORITY|The priority of the utility task.| +|OSAL_SOCKET_QUEUE |If this is defined, the posix port will use the socket implementation for message queues, rather than the POSIX message queue implementation.| |OS_MAX_MODULES |Used for defining the maximum number of loadable modules that the OS AL can keep track of. This is used for the new Module Load and Symbol API.| +|OS_MAX_SYM_LEN|Used for setting the maximum length of a symbol name in the symbol API .| +|OS_MAX_TIMERS|Used for defining the maximum number of timers in the OSAL.| + + +## Setting up "classic" build + +The following procedures are relevant only when using the classic +makefile build. For the equivalent cmake instructions, see the next +section. + +### Create System Environment Variable + +The OSAL development environment requires one system environment +variable to be set in order to build the example programs. The directory +also contains a shell script "setvars.sh" to set the environment to the +current OSAL directory. + +#### Environment Variables needed by the cFE + +| **Environment Variable** | **Value (in Linux as an example)** | **Notes** | +|---|---|---| +| OSAL_SRC | /home/osaluser/osal | The location of the OS Abstraction Layer source code. This directory can be moved anywhere as long as the environment variable is set accordingly. | + + +#### Example Environment Variable for Different Development Hosts + +| **Host Operating System** | **Example Environment Variables** | **Notes** | +|---|---|---| +| Windows/vxWorks 6 Development Shell | \% set OSAL_SRC=C:/osalproject/osal | 1\. These environment variables can be set in the Windows control panel under system/environment variables. 2\. Note the forward slash directory separators in the DOS environment variables. Because the vxWorks tools are half DOS and half-Unix, they don't seem to like the DOS style backslash.| +| Linux| \$ export OSAL_SRC=/home/osaluser/osal | These settings can be set in the user's .bash_profile | + +### Configure the Build Directory for the OSAL application + +The build directory is where the OSAL is configured and compiled for a +particular processor, board, and OS. The build directory is designed to +hold the OSAL configuration for the selected platform. The **core** +directory is where the core OS code, and bsp code are built. They are +left in the core directory for the applications to link against. The +build directory can have multiple OSAL applications to build for a +particular platform. The OSAL distribution contains directories for +example and test applications. Multiple build directories can be used to +configure the OSAL for different platforms in the same environment, each +with its own unique OSAL configuration. + +### Configure the 'build' Directory + +In order to build the OSAL for one of the supported platforms, the OSAL +build directory must be properly configured. This involves editing a +couple of configuration files and setting up one or more sample +applications that use the OSAL API. + +### Define the CPU, Operating System, and Processor Board + +In the build directory, edit the **'osal-config.mak'** file and set the +options for your target. The default settings in the osal-config.mak are +for running vxWorks6.4 on a generic PowerPC board. + + +#### osal-config.mak Settings + +| **osal-config.mak variable** | **Valid selections** | **Notes** | +|---|---|---| +| OS | vxworks6, rtems, posix | 1\. VxWorks 5.5 is no longer supported. 2\. posix is tested for 32 bit linux 2.6.x | +| BSP | genppc-vxworks6.4, mac-posix, pc-posix, mcf5235-rtems, sis-rtems | Use posix for linux | +| OSAL_M32 | -m32 (or commented out) | See below. | + +Note that not all combinations are valid. See the Platform Specific +Section for more information on each supported cFE target. + +In some cases, developers may find their compiler toolchain producing +"64-bit" images, when "32-bit" images are needed -- for example, when +using "native" GCC on a 64-bit X86 Linux. The OSAL build files support +use of an **OSAL_M32** build variable to insert the appropriate "please +build 32-bit images" compiler parameter into all compilation and linkage +commands. + +In this use case, the setting of the **OSAL_M32** build variable should +be uncommented in the **osal-config.mak** file, and set to the correct +flag for the compiler toolchain in use. The build system will also honor +settings of this variable made in the developer's shell environment or +on the "make" command line.. + +Usage of this flag may require an optional "multilib" (or similar) +package to be installed. Refer to your operating system and toolchain +documentation for details, if adding the appropriate flag causes your +builds to fail due to (for example) missing 32-bit or multilib related +headers or libraries. + +## Setting up the "cmake" build + +This section covers how to set up the host machine for building OSAL +using the cmake build system. Rather than using pre-written makefiles as +the classic build does, the cmake build generates makefiles entirely +from instructions specified in files contained with the source code +itself. This has several advantages: + +- Enhanced script-like capabilities + +- Generally no need to modify files to adapt to a particular target. + +- Easier integration with larger mission projects + +Typically, OSAL is not built by itself, but rather as a library to be +used within a larger application. The OSAL cmake build system allows +both options; building as a standalone entity for testing purposes, or +building as a sub-component within a larger project. The same scripts +are used in both cases, and no modification is required. + +### Prerequisites + +In order to build OSAL using cmake, the "cmake" package must be +installed for the host/development machine. On Linux, this is generally +available via the respective Linux distribution package management +system, i.e. "yum" on RedHat and derivatives, or "apt-get" on Debian and +derivatives. For other operating systems, the cmake tool is available in +source and binary form from . OSAL requires at least +version 2.6.4 of the cmake tool. + +### Variables that must be specified + +The OSAL cmake build is controlled by several user-supplied variables +when the build is first provisioned: + +| **CMake variable** | **Valid selections** | **Notes** | +|---|---|---| +| OSAL_SYSTEM_OSTYPE | Any directory name that exists under osal/src/os |All OS-specific source files in this directory will be built. An optional, OS-specific "build-options.cmake" file will also be included which may add necessary compiler options specific to that OS. | +| OSAL_SYSTEM_BSPTYPE | Any directory name that exists under osal/src/bsp | All BSP-specific source files in this directory will be built. An optional, BSP-specific "build-options.cmake" file will also be included which may add necessary compiler options specific to that BSP. | +| OSAL_INCLUDEDIR | Any directory on the host system (absolute path) | Optional; if specified, this will be included in the compiler include file search path. Typically this is used to specify the location of "osconfig.h" for standalone OSAL builds. | +| ENABLE_UNIT_TESTS | TRUE or FALSE | Optional; defaults to "FALSE" if not specified. If set to TRUE, the included unit test code will also be built in addition to the runtime library. | +| OSAL_USER_C\_FLAGS | Any valid switches for the compiler in use. | Optional; the user may specify any arbitrary compiler switches to use. | + + +It is important to note that the values specified for these variables +are **automatically cached** by the cmake build system. It is only +necessary to specify these values when first provisioning/configuring a +build; these are *not* required when simply building the binaries. + +This caching function removes the need for environment variables to be +set as in the "setvars.sh" file in the classic build. The cmake build +does not require the user to set environment variables; all necessary +context information is automatically stored in the cache when the build +is first provisioned. + +### Setting up a standalone OSAL build + +The OSAL may be built standalone in order to evaluate the library for a +particular target and/or execute the included unit tests. + +In the cmake build system, all generated files are placed in a dedicated +"binary" directory that is separate from the source tree. To provision a +build, the user must first create the binary directory by issuing the +"mkdir" command (on Linux), preferably outside the OSAL source tree. +Then, the "cmake" provisioning tool is invoked to generate the actual +makefiles, supplying values for the required variables: + +``` +$ mkdir build +$ cd build +$ cmake –DOSAL_SYSTEM_OSTYPE=posix –DOSAL_SYSTEM_BSPTYPE=pc-linux \ + –DENABLE_UNIT_TESTS=TRUE –DOSAL_INCLUDEDIR=/path/to/user/config \ + /path/to/osal/source + +``` + + +The cmake provisioning tool generates standard makefiles in the build +directory. To build the OSAL binaries, simply run "make" in the build +directory. + +### Integrating OSAL into a larger build + +Modularity is a key feature of the cmake system. As such, the OSAL cmake +build system can be directly used as a component within a larger +"mission" build, as long as the same variables are supplied via the +parent cmake script: + +``` +SET(OSAL_SYSTEM_OSTYPE “posix”) +SET(OSAL_SYSTEM_BSPTYPE “pc-linux”) +ADD_SUBDIRECTORY(path/to/osal) +``` + +The values for the variables can be obtained by any means, shown here is +just a simplified example of how it can be done for a known target. + +### Cross compiling with Cmake + +To cross compile, cmake uses a separate "toolchain file" that indicates +the specific compiler to use, and any machine-specific compiler options +that may be required. Documentation for the toolchain files is available +on the cmake website at . The toolchain file is +specified when the build is provisioned. No OSAL build scripts need to +be modified in order to cross compile or add extra machine-specific +options. + +## Check over or customize the OSAL BSP directory + +The glue logic that ties an OSAL application to a specific processor +board and platform is in the src/bsp directory. This directory contains +the BSP code, which contains all of the specific rules, glue code, and +startup code to make an OSAL application run on a particular board with +a particular OS. + +The platforms supported in the OSAL distribution should run out of the +box. They provide a starting point for a complete port to a new +processor board. + +This section will be expanded in the future to include information +needed for new OSAL ports. + +## Configure one or more OSAL Applications + +Once the OSAL is configured and ready to build, an OSAL application can +be configured in the build directory. Multiple OSAL applications can be +created in this directory. The application source code can come from the +src/examples directory, or the applications can be contained completely +within the build directory. The OSAL source distribution has a set of +test and example applications in the src/examples and src/tests +directories and a set of corresponding application directories and +makefiles in build directory. + +### Configure a sample application in the build directory + +The following show the files needed for a sample OSAL application in the +build directory. + + +#### Sample OSAL Applications and the associated files + +| **File** | **Description** | +|---|---| +| build/examples/tasking-example | Directory for the included OSAL example Application. | +| build/examples/tasking-example/Makefile | Makefile for the example OSAL app. Because the source is in the src/examples/tasking-example directory, there is no need to include it here. The Makefile will find it using the OSAL_SRC environment variable. The source could be copied here in order to customize it. | +| build/examples/new_osal_app | Directory for a new OSAL application. | +| build/examples/new_osal_app/Makefile | Makefile for a new OSAL application. | +| build/examples/new_osal_app/new_osal_app.c | Source file for the new OSAL application. | +| build/examples/new_osal_app/new_osal_app.h | Header file for the new OSAL application. | + + +The Application Makefiles have a specific format, so it is best to copy +one of the application Makefiles from the build directory, such as +build/examples/tasking-example. + +### Configure the application's main entry point + +The OSAL development environment provides the main entry point/startup +code for the Application. This code is located in the src/\/src +directory. The startup code will call the Application's entry point +which is named: void OS_Application_Startup(void) + +## Build the OSAL core and Applications + +Once the OSAL Core and Applications are set up in a build directory, +everything can be compiled. The OSAL Core or any of the Applications can +be built from individual make files, or they can be built from the +top-level Makefile in the build directory. + +#### Build Commands + +| **Shell command** | **Description** | +|---|---| +| **\$ cd build** | Change to the build directory. | +| **\$ make** | Build the OSAL Core, and all Applications. | +| **\$ make clean** | Clean the OSAL Core, and all Applications. | + + +The following additional make targets apply only to the "classic" build; +the cmake build handles configuration and dependencies automatically. + +| **Shell command** | **Description** | +|---|---| +| **\$ make config** | Copy the osconfig.h for the BSP to the build directory. | +| **\$ cd examples/tasking-example; make** | Build the tasking-example Application only. | +| **\$ make depend** | Recalculate the dependencies on the OSAL Core files and apps. | + +Once the OSAL Applications are built, they are ready to load and execute +on the target. The filename of the executable is dependent on the OS it +is built for. + +#### OSAL Application executable name + +| **Target Operating System** | **Application executable name** | **Notes** | +|---|---|---| +| vxWorks 6.x dynamic link | example1.elf | The vxWorks PowerPC platforms use a dynamically loaded object without the kernel. | +| Linux | example1.bin | | +| Rtems/Coldfire | example1.nxe | This is a static linked executable, linked with the RTEMS kernel and BSP. | +| RTEMS/SIS | example1.nxe | This is a static linked executable, linked with the RTEMS kernel and BSP. | + +## Load and Run the OSAL Applications + +Depending on the Target, it is usually straightforward to run an OSAL +Application on a target platform. On desktop platforms, it is just a +matter of running the executable program. On vxWorks, the example +programs are loadable modules. + +### Load the OSAL Application Executable on the Target + +On desktop targets the cFE Core can be run from the directory where it +was compiled. On embedded targets, the Application has to be loaded into +a remote file system, or booted over the network. On the vxWorks PowerPC +targets, the Application can be loaded into the EEPROM or Flash disk +after the vxWorks kernel is booted. On RTEMS targets, the Application +can be loaded using the CEXP dynamic loader or it can be linked in with +an RTEMS Binary. See the target specific sections for details on each +platform. + +### Setup the Target File Systems + +Because the OSAL runs on many different platforms, it must be able to +deal with different file system types and different paths. The OSAL +accomplishes this by using a file system abstraction. The abstracted +OSAL file system is similar to a UNIX file system, where the root +directory starts with "/" and all disks are mounted on directory trees. +For example: + +- /ram0/apps/ RAM disk 0, apps subdirectory + +- /ram1/data/ RAM disk 1, data subdirectory + +- /hd0/tables/ Hard Disk 0, tables subdirectory + +Using this abstraction, a file "datafile1.dat" on RAM disk 1 might be +accessed from the OSAL by using the path "/ram1/data/datafile1.dat". +Using the host vxWorks tools, the path to the same file would be: +"RAM:0/data/datafile1.dat". If the OSAL is running on a Linux +development workstation, the file might be located at: +"/tmp/ramdev1/data/datafile1.dat". The important part is that the OSAL +Application can access the files using a generic path, allowing the +software to remain portable. + +There are a few ways to map these host file systems to OSAL file +systems: + +- **Map existing target file systems to a OSAL path**. This is one of +the most common ways to map the Non-Volatile disk to the OSAL. The OSAL +relies on the target OS to create/mount a file system and it simply is +given a mapping to the disk to allow the OSAL to access it. + +- **Create EEPROM/Flash/ATA File systems**. The OSAL has the ability +on some targets to format or initialize a EEPROM or ATA disk device. +This is less commonly used. + +- **Create RAM File Systems**. The OSAL can create RAM disks on the +vxWorks targets. The OSAL will create or re-initialize the RAM disk for +the vxWorks targets. + +**RTEMS Note**: The RTEMS OS provides a base file system, called IMFS +that provides the root directory. Because this closely matches what the +OSAL file system abstraction provides, the RTEMS directories and +filenames are a one to one mapping. In other words the path on RTEMS is +the same as the path in the OSAL. + +The following table shows examples of these file system mappings on +various hosts. **Note** the change in the way the POSIX ports are +mapped. Linux will no longer remove or create sub-directories based on +the volume name. The path mapping for the FS_BASED option is now a +simple mapping from an OSAL path to a host path. This makes the OSAL +easier to use on linux platforms: + +#### OSAL File system mapping + +| **Target Operating system** | **cFE File system path** | **Target OS File system path** | **Notes** | +|---|---|---|---| +| vxWorks 6.x | /ram | RAM:0/ | Most vxWorks targets | +| | /cf | CF:0/ or CF:1/ | MCP750| +|| /cf | EEP:0/| RAD750 target | +| Linux | /ram | ./ram0 | Note the "." This will map the RAM disk to the current working directory + the "ram0" subdirectory. | +|| /cf | ./cf | Again, starts with the current working directory. | +| RTEMS | /ram | /ram | RTEMS has 1-1 mapping with the OSAL | +|| /cf | /cf || + +### Start the OSAL Application on the Target + +Starting an OSAL Application is a highly target dependant activity. The +following table gives examples of how to start an Application on various +platforms. For full details see the notes for each section. + +#### How to start an OSAL Application on Various Target Systems: + +| **"Target" operating system** | **How to start the cFE** | +|---|---| +|RTEMS / mcf5235 | Loaded through GDB/BDM using a shell script: "debug.sh" | +| RTEMS / SIS | Loaded through GDB/SIS simulator: \$ sparc-rtems4.10-gdb tasking-example.n (gdb) target sim (gdb) load (gdb) run | +| vxWorks 6.2 / RAD750 | Started from the vxWorks Target Shell commands: Vx\> ld \< tasking-example.elf Vx\> OS_BSPMain | +| Linux | Start directly from the linux shell: \$ ./tasking-example.bin | + + +# Target Specific Instructions + +This section provides details on how to load and run each of the +supported OSAL configurations. + +## Generic PPC / vxWorks 6.4 Platform: + +The Generic PPC applications will work on both the Motorola MCP750 and +the BAE RAD750 running vxWorks 6.4. On this platform, the OSAL +Applications are built as dynamic loadable vxWorks modules, rather than +being linked to the vxWorks kernel/BSP. The OSAL Applications are loaded +into the compact flash disk on the MCP750, so it can be started from a +vxWorks shell or startup script after the kernel comes up. + +### OSAL Configuration for the Generic PPC / VxWorks 6.4 + +#### osal-config.mak Settings + +| **osal-config.mak variable** | **Required selection** | **Notes** | + |---|---|---| +| OS | vxworks6 || +| BSP | genppc-vxworks6.4|| + +### File System Mappings on the MCP750 PPC Board + +The cFE uses the following file system mappings for the MCP750 PPC +Board. The file system mappings are defined in the bsp_voltab.c file in +the src/arch/ppc/genppc/vxworks6.4/bsp directory: + +#### OSAL File System Mappings + +| **OSAL "device"** | **File System Type** | **OSAL Path** | **Host Path** | **Notes** | +|---|---|---|---|---| +| /ramdev0|Real RAM Disk ( vxWorks )|/ram|RAM:0/| +| /eedev0|File System Mapped (FS_BASED)|/cf|eep:0/|This is the Compact Flash drive on the MCP750| +|/ramdev1 -- /ramdev5|Real RAM Disk|N/A|N/A|Unused table entries for applications to create new RAM disks| +| /ssedev0 - /ssrdev2|File System Mapped (FS_BASED)|N/A|/ssr:0/SSR1 - /ssr:0/SSR3|Unused table entries for applications to map Hard Disk device directories to "pseudo" SSR file systems.| + +### How to run the OSAL Applications on the MCP750 or RAD750 + +1\. Load the kernel. The custom vxWorks kernel is loaded into the MCP750 +via TFTP. We use a vxWorks boot image (Rather than the Motorola boot +monitor/loader ) to boot the MCP750 board, TFTP the "real" kernel to +RAM, and execute it. This vxWorks boot image also sets the network +settings for the "real" kernel image. On our OSAL/cFE development +system, we keep the loadable vxWorks kernel image in a TFTP directory on +the development workstation. So the vxWorks kernel image goes in +/tftpboot/cpu1/cfecpu1.st. **( \$ cp +/opt/workspace/mcp750image/default/vxWorks /tftpboot/cpu1/cfecpu1.st )** + +2\. Copy the "example1.elf" ( or other executable name ) loadable module +into the non-volatile disk. On the MCP750, this is done simply by FTPing +the tasking-example.elf file to the target: + +``` +$ ftp 192.168.1.4 + + +ftp\> username: target + +ftp\> password: password + +ftp\> cd "CF:0" + +ftp\> binary + +ftp\> put tasking-example.elf + +``` + +3\. Load the example Application in the vxWorks shell: +``` +vx\> cd "CF:0" + +vx\> ld \< tasking-example.elf +``` + +4\. Run the example Application in the vxWorks shell: +``` +vx\> OS_BSPMain +``` + +(The entry point for the examples and test programs is always +OS_BSPMain) + +## Axiom M5235 BCC / RTEMS 4.10: + +The OSAL supports the Axiom 5235 BCC single board computer with an RTEMS +4.10 board support package. The 4.10.2 version of RTEMS was used (as of +December 2012) along with the RTEMS 4.10 compiler for the m68k/coldfire. +The tests and examples are built as static RTEMS executable programs for +the board and can be loaded using the DBUG monitor or BDM port. When +developing for RTEMS, the libraries and BSP code is usually located in +/opt/rtems-4.10. The OSAL Makefiles use an environment variable +"RTEMS_BSP_BASE" to determine where the RTEMS libraries and BSPs are +installed. This variable is set from the "setvars.sh" file along with an +example of how to set the variable.. + +### OSAL Configuration for the Axiom M5235 BCC / RTEMS 4.10 + +#### osal-config.mak Settings + +| **osal-config.mak variable** | **Required selection** | **Notes** | +|---|---|---| +| OS|rtems|| +| BSP|rtems-mcf5235|| + + +### File System Mappings on the Axiom M5235 BCC / RTEMS 4.10 + +The RTEMS port of the OSAL has a one to one file system mapping. The +OSAL RAM disk will format an RTEMS NVRAM disk with the RFS file +system.The file system mappings are defined in the bsp_voltab.c file in +the src/bsp/mcf5235-rtems/src directory: + +#### OSAL File System Mappings + + |**OSAL "device"**|**File System Type**|**OSAL Path**|**Host Path**| **Notes**| +|---|---|---|---|---| +| /ramdev0|RAM_DISK ( NVRAM/RFS )|/ram|/ram|Mapped to the IMFS root directory| +| /eedev0|File System Mapped (FS_BASED)|/cf|/cf|Mapped to the IMFS root directory| +| /ramdev1 -- /ramdev5|Unused|N/A|N/A|Unused table entries for applications to create new RAM disks. RTEMS does not currently have support for creating new RAM disks.| +| /ssedev0 - /ssrdev2|File System Mapped (FS_BASED)|N/A|N/A|Unused table entries for applications to map Hard Disk device directories to "pseudo" SSR file systems.| + +### How to run the OSAL Applications on the Axiom M5235 BCC with RTEMS 4.10 + +When the example application and test programs are all built as static +executables for the M5235BCC board. The example programs can be loaded +in the following ways: + +Using the BDM port through the GNU debugger. If the board is connected +to the host PC with a BDM debugger cable, then the example programs can +be loaded and run from there. For our environment we use the Gnu +Debugger that was included with the RTEMS 4.10 tools and the +m68k-bdm-gdbserver from the BDM Tools project: + . The gdb-init script and a debug.sh +file are included in the src/bsp/mcf5235-rtems/bsp/rtems-support +directories. The debug.sh script gives the proper command line to load +the application to the board using the GDB debugger and BDM interface. + +## SPARC SIS Simulator / RTEMS 4.10: + +The OSAL supports the SPARC SIS simulator built into GDB with the sis +RTEMS 4.10 board support package. The 4.10.1 version of RTEMS was used +(as of December 2011) along with the RTEMS 4.10 compiler for the sparc. +The tests and examples are built as static RTEMS executable programs for +the simulator. The OSAL Makefiles use an environment variable +"RTEMS_BSP_BASE" to determine where the RTEMS libraries and BSPs are +installed. This variable is set from the "setvars.sh" file along with an +example of how to set the variable. + +### OSAL Configuration for the SPARC SIS Simulator / RTEMS 4.10 + +#### osal-config.mak Settings + + | **osal-config.mak variable** | **Required selection** | **Notes**| +|---|---|---| +| OS|rtems|| +| BSP|sis-rtems|| + +### File System Mappings on the SPARC SIS Simulator / RTEMS 4.10 + +The RTEMS port of the OSAL has a one to one file system mapping. The +OSAL RAM disk will format an RTEMS NVRAM disk with the RFS file system. +The file system mappings are defined in the bsp_voltab.c file in the +src/bsp/sis-rtems/src directory: + +#### OSAL File System Mappings + +| **OSAL "device"**|**File System Type**|**OSAL Path** | **Host Path** | **Notes**| +|---|---|---|---|---| +| /ramdev0 |RAM_DISK ( NVRAM/RFS )|/ram|/ram|Mapped to the IMFS root directory| +| /eedev0|File System Mapped (FS_BASED)|/cf|/cf|Mapped to the IMFS root directory| +| /ramdev1 -- /ramdev5|Unused|N/A|N/A|Unused table entries for applications to create new RAM disks. RTEMS does not currently have support for creating new RAM disks.| +| /ssedev0 - /ssrdev2|File System Mapped (FS_BASED)|N/A|N/A|Unused table entries for applications to map Hard Disk device directories to "pseudo" SSR file systems.| + +### How to run the OSAL Applications on the SPARC SIS Simulator with RTEMS 4.10 + +When the example application and test programs are all built as static +executables for the SIS Simulator built into the sparc-rtems4.10-gdb +executable. + +To run an example or test, simply do the following: +``` +**\$ sparc-rtems4.10-gdb tasking-example.nxe** + +**(gdb) target sim** + +**(gdb) load** + +**(gdb) run** +``` + +When you are finished running/debugging, hit \-c and quit the +debugger. + + +## PC / Linux Platform + +The OSAL can run on linux distributions. Testing is done with CentOS 6.5 +32 bit and Ubuntu 13.10 64 bit. Newer versions of the Linux 2.6 +kernel have POSIX message queues, which can be used for the OSAL Queue +implementation. If the POSIX message queues are not available, then the +OSAL Queues can use UDP sockets. (see the OS_SOCKET_QUEUE configuration +parameter). In general, the older versions of linux (2.4 kernel) are not +supported, but most modern Linux releases such as Ubuntu 12.10 and +later, and Cent OS/Redhat Enterprise Linux 5 and later should work. The +OSAL has also been used on the Raspberry Pi computer with the Raspbian +Debian based linux. The OSAL is primarily run on 32 bit linux +distributions, but it should compile and run as a 32 bit application on +64 bit linux. + +### OSAL Configuration for the PC / Linux Platform + +#### osal-config.mak Settings + +| **Prolog.mak variable** | **Required selection** | **Notes**| +|---|---|---| +| OS|posix|| +| BSP|pc-linux|| + +Additional configuration notes: + +To enable the POSIX message queues, make sure the OS_SOCKET_QUEUE +parameter is not defined in osconfig.h. + +If the OS_SOCKET_QUEUE option is not used, the OSAL will use POSIX +message queues. If POSIX message queues are used, your application may +need to run as root in order to create the queues you need. There are +kernel parameters that can be adjusted in order to avoid running as +root. + +### How to Run the OSAL on the PC / Linux Platform + +1\. To run an OSAL Application, simply execute the binary from a shell +prompt: + +``` +build/examples/tasking-example\]\$ ./tasking-example.bin +``` + +# OSAL Unit Tests + +The OSAL distribution includes a suite of black box unit tests, white +box unit tests (/src/unit-test-coverage), and functional tests +(/src/tests). Tam Ngo at NASA Johnson Space Flight Center developed the +suite of black box unit tests located in the /src/unit_tests directory. +This section describes how to build and run the suite of black box unit +tests using the "classic" build. Note: it is assumed the steps in +Section 2 How to Configure, Build, and Run the OSAL have been followed +to setup the build environment for the "classic" build. The unit tests +run on Linux, but could also be configured to run on other operating +systems (and will in future releases). + +Currently the osprintf tests are not compiled and run, and the ARINC 653 +tests are not used. A future release of the OSAL will contain support +for the ARINC653 operating system API. + +## OSAL Unit Test Configuration for the PC / Linux Platform + +#### osal-config.mak Settings + +| **Prolog.mak variable** | **Required selection** | **Notes**| +|---|---|---| +|OS|posix|Unit tests are for the POSIX port| +| BSP|pc-linux-ut|This is a special BSP for the unit tests| + +## How to Run the OSAL Unit Tests on the PC / Linux Platform + +To build and run the OSAL unit tests, run the following commands from +the "build" directory: + +#### Build Commands + +| **Shell command** | **Description**| +|---|---| +| **\$ cd build**|Change to the build directory.| +| **\$ make clean-unit-tests**| Clean the OSAL Core, and all Applications| +|**\$ make config**|Copy the osconfig.h for the BSP to the build directory| +| **\$ make unit-tests**|Build all of the unit tests.| +| **\$ make gcov**|Run the unit tests, collecting code coverage information.| + +Once the unit tests have run, the log files are available in the +individual unit test binary directories + +#### OSAL Unit Test Directories + + | **Directory**|**Description**| + |---|---| + | build|The top level OSAL build directory.| + | build/unit-tests|The top level unit test build directory.| + | build/unit-tests/oscore-test|Contains the test binary, log, and gcov files for the OSAL core tests| | build/unit-tests/osfile-test|Contains the test binary, log, and gcov files for the OSAL file API tests| + | build/unit-tests/osfilesys-test|Contains the test binary, log, and gcov files for the OSAL file system tests| + | build/unit-tests/osloader-test|Contains the test binary, log, and gcov files for the OSAL loader tests| + |build/unit-tests/ostimer-test|Contains the test binary, log, and gcov files for the OSAL timer tests| + +# Revision History + +| Revision Number | Release Date | Changes to Prior Revision | Approval | +|---|---|---|---| +| 1.0 | 10/17/07 | Initial Release. | A. Cudmore | +| 1.1 | 02/13/08 | Updates for RTEMS, Linux, and Cygwin for 2.11 release | A. Cudmore | +| 1.2 | 09/05/08 | Updates for OSAL 2.12 release | A. Cudmore | +| 1.3 | 03/10/10 | Updates for OSAL 3.1 release | A. Cudmore | +| 1.4 | 05/25/11 | Updates for OSAL 3.3 release | A. Cudmore | +| 1.5 | 12/13/11 | Updates for OSAL 3.4 release -- added support for sis-rtems Removed cFE configuration text | A. Cudmore | +| 1.6 | 12/21/12 | Updates for OSAL 4.0 release -- Removed Cygwin and OS X configurations | A. Cudmore | +| 4.1 | 01/17/14 | Updates for OSAL 4.1 release. Sync document version ID to software version. Add information for building and running unit tests. | A. Cudmore | +| 4.2 | 01/31/16 | Moved osconfig.h description into section 2.2.h Consolidated the \"classic\" build and prerequisites setup into section 2.3. Added new section 2.4 on provisioning a build using cmake. Minor
modifications to subsequent sections only where there was a difference between cmake and classic builds; i.e. the cmake build has no \"make config\" or \"make depend\". Updated title page to replace Code 582 banner with cFS. Added header. | J.Hickey S.Strege | \ No newline at end of file diff --git a/doc/OSAL-Configuration-guide.doc b/doc/OSAL-Configuration-guide.doc deleted file mode 100644 index c191d772d0fbb045aea101e89f499b4642068c10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429568 zcmeF431D1R_5WXK>9o+Wwq=(`snBAZtt(~unI`E1-E2}oM9L(YCPR}<%p`3CDxj!< zph63x_~Yk>AOZp+viO%xK`08cF9KBo0Y&yjK=^;ox%a+hGLuY8ktGd$J8!+)S?;;# zo_pV&cWk@v2bb;q7cb}UKyR@3_B+G9p^@tej{j${y|9hv9W==E_@C$Ac}K3+axx3l z@JuzB397&+0gr6@`vA7UKhL|tTe@!e5YKykyXy>Tp)7yHJnyV)JZ~$n;pm2=kGb`j zTg}brzr%-&_NJ}c%-iutGmj8leVMuY=jcO`<9FWKIyftI>>l`)9(-w(IhWrz#+c*2 zen-03`IW|&)2;S27o)$^xipLGpNCs-9Lw+K;d4))>3KVE=6MJ1<9W+q`5#w!o@9M9 zzw(#+`$nbbb?)GKtp|DDZxNUBPkCMw96yhANXA>hulyDBOHsVRXM5h2ym<9@J?~4L zck=!yNg(IXwZoeFoE!F3$|Zm9*FEQcCEe(sOV9nfdb(%id@}9zHQw8ci@#ZB?&SVT z`fqO)(#xfjo36A^^v|Uey;jVzt52cyB;C=p=Z@d~ zE`M|P-T&+IaVa@^Nj?{luWM)b>*(dq-LHGU(64(g_t){G`z`doyYBLL=Y@WA^Ks{{ zo!xn%Uze_FC<&PXR%3qM|N@v=Wt$tOili%*H zbYs>}wm1289m&R&U)9u>Zck^sI`y#<-}g(Re}keY953uh$&>BPeqB$tE7j&#HORY- zl7~Mp*^}z@$1SX@nm3+jt26D((#_o_Wq)>ex+zsMWqRer%JTAQ6U)m>N)Af4cPBf0 z{7DrP{L1o*ss6Y_Qk_{zX>w^LDO7cLwPZT8Ge~O?|8b$CqcgK2*=jFwrDQ}^-@Tu3Stb${rR9l=^0JC)W#!WnbKBEhX&Tk0QtJDOs#3qYyQwYHnUZHK z66KX;6_d)!rze(lG?7QvhbaEy`r7$*6a0DU_U=^^lnm89%`4OGdb6^$qQdVq<;qE} zGEu&7S^1RQ;0w-emWlf0mzYYJzRE-5nj7&MvKeHl3Z=2}@-mUR!1bcN=Hb`i(Ir>PoHZ%4wOY zl4)gy6t=Q=VJDZCM>2H@+cp;|SXk#D7SALb%V08;tPrA;{^We=2W?o2NVGTlO_|1S zVMKq0<>k3G!dBVLvaXfM&Xl`cisUu<>2@Qj!t=r&4c+P1CXp^FT4#5AyBv4JYd#Fr zl`V~P8B#*oCTZQLCgy9KWwNHlN?ZJH7|XExKC7T#>~ zyINBIn8wy*Hk)o7V~U|==;%y!rasq=EC~l^Q(fI16grmHB+{ZTB+{N*8OdX^Po+d& zRS>mOHsS89oHe#3m#27le!88Sw`H2r%hHXig;Wl+-3?iCmX@^T&XQnjkH4~oB1wVy zcV!Y?=JVz<&e~CD4XLh`sZ_g3Tx(z}WwOrh=ch}_RI01_+Y+^qPJ6~5BSo^@Fvh1; z=0a1dBh}tChO!z_rn%Bxttr1F*-Sw)Fjz;c=+f#;Q_4rf`3=eTb~NG2bXN;ZTo*J@ zODfrv>g3c<98@|d-MBo}Q&Lx2*VUP7Mro9cs82SKY-X9zrc0IC_I~}sYX689|A=G! zBf9)Cb4WoNuVO;Q1b19Hp)xq0G-1+&x~?8lad#_PD*R9Q6_fprE_tVBv5z8~P%*|I zxxGK<(~D{s&zrm8VE>3#f6UVQOylIqm6In=nKFIy7=O^nis5tHyE-#X-O4t@xAzxS z&8}TsJIjwfDWw}Ua>}StC4D70MH4Ko7+%+y=|~kwYf5oxO*Ls%4xgE9T;AN7>27Z- zkl@tf5}aldoHQJ5-wG276>6*;XA2}ft+=G8o1`ZXuWF?G?P)8N-1Op-+t(yFW%%sY zOg1Z>C)`q>>MWS)4rXpEcI!PK$EihE^ zYOCGW7(G^?B9l!9`}UK8iYOV-X4Rc3x&>$BMX2H*lI%>2d=$vaN^pN!sRT<_xvgf{ zpeEf(SB2T8ouaUZk}heavk#J4d9Nt%r>ZLOlK-R}s-3Pq@ENd&EkS{LTIugMBNczi zX!7uy)UtHDc3gh-q9qgjTvOTz*`m%&V=9}a@0poNb{5cU`&w<$Z}zG#D#<*;Gt!)^ zwe#znYpmv|sOYmTrlxM(H)Y!_BovNZ$Il>L-73e?K#ii*m98p|q+$&iG; zHPvhfQ<}coRY|`!$pFrpf(3H38l&Ibtjd^NIt7WQzreI<>qxhX0im`@wb(la@~}#y zzdWW|I*~(5s&ToG5!xx1QzJymw55+R46pT@S+@vNtuMKnI@Qr^Qs3=3)zWNgM0|x# zYDi)iYJRpe7j==p*PS}mk*&Y%EZL@tYIJ=ghG#a})`6)I(MuS|s{NH$`mL>_V}IFO zI!^7SE+aXgk@ee>kazL+x7<2p<`(In3UB(upMq8ZgpC}zih15pDqfmE6MOWZygz($@M-f=K6rCeT(BX z?E`E@>Wo@$^yju?Vwtf+ff`M7ok8CQ>sM;^{SFAcT)44qB zPc5D7FKSJ8$zXa$ey*S9G)sS3S(OMfvcmRq0HdKYvQ)q$&Q)YN4|F%y0=-loz6{(=vUVol~b-EmKk6 zH*xzaLV4&aX?ibtBR6S1}A=^;BiwcK_7r)>f^+Kiijd_g9Sk^__0DS-+)l!{3U2 zm|z2oVKrU9#c*TfiuGWGd_^jX8Ssj!pQztbSq)fGIb2n|dddUkUZCNvo~!Ijtuik_~p7<(%Eo6fMZ;1>JZ0G+$_^!jKuJ&i?6>i z)4l@BU4|-wjls3Z{Fyw3Bf2%yqq7T|JOiC#=i?-AJmsk@1F$9^f3+G*GGKDY%r2CK z4pps7bA~A{W=MKZ@&%P?%it#xJF-z+Mlz2<$z)DPjc1+4NOfoRga=yjoVTTXowL;W zA2W&QCPzyB*=d?V(`!$OA4EKy6d)OyWo*@1##?x&dg`(uCphRm~-d^e@@wLbB@*>BYZCPteG5mYX3TN7(O@uDvsunF8pQ!Si z?a)Q?Q5jE$3`HJ7JMkWm8Qq+xq>EbLPcO;%~sp6Oyris7Es4N`1agN8Bu zS{g5xqhPA@jBH83Fh0edE5*&GG$9&|BvRQ4(hgmj#!M@R(h6M}4z(WY>(FeRz%g2J zY?)0YbcEv9*{R+|%-P7i**M%mk`E~ggIUc1sX8Z;(+X(NV$W zDS@g5DTnADCW_Sx!6oBHpDmX20{vzP?TZ(RX6sC4J5aW1nd*_5*Whubp-@((iZ-hj zcgL*ObaP9W^$Vb*{Bh(d#Yd4Cl@`ui7$$KINQG9U;dhfuCaVOQRd;BVjxbn1I3? z!X@TmA9>eyPj}%$q~sZm7=YV?c5?~^mZvr5Wtw}5tyV&5Kmrlzr{YMDm0l~>SrQgU zjp?@ugJrm$;IJ zeX91I(zgeG&&aQ4+*(PgE3ZX25+>P&?_Az}fy>ojO_ zas+WOCR=)l*C3JbdRBNwbU~aBjhr)Og2A~Q)>B<6!flm&_&O7!KG9qh3??Eg)UXH* zn#IOggk6kl;6!2pK^OSplq(2)F#PKxF(i(|noHUbtJ=!6wRN{U!^K+6LTKm2OVp*9 zr0S(p)?f%S!N7w{P^&QwB|QTL&zic4*f?_{s%XXDHKmbSrFqKQj6H-m8_Z`)Of0FW*j41Joo=nGppuFmB6b;~}r72=# zYd1=b#Km@P#TIgf(J??O(&s2iqv2FB)7DKYih!eeats43*RTMlvc1w5rO_afHIyga zEWHZ+mnMLSCQ~gH*!-C5Su@8@pF!s;U5?O0>le`t*b(s&j_4zuEVmYhnL|MhNC1j0 zqoqZ!;vtn#B(=&+$e_wwOeBNL!6+A-q8ptA>fQt-1%;GyPhdtJgM1gf4gKU`#8_DDg|e`3BPn5#9*`HBCj#{a~U_?F`yBmwb`8lICWl z<1U#gVIx7iL`ATq@T`k?L2Q?2>;^Y9Er~fxBKf#Z)Y=)r^VqYRd1H4cabaDid^WO@ zu7735#(g=>Bqn`w1$Kc9XJ+WDIiVHMS-Sj8CuWcgN@eDB8KX(dt4JHcZ>H%mm@yxX zRTfUQi@l6?S4qoFTly4?B2;c;va?gh9XgGwqC*7Uigczs8>@q13T}yYiGmRIK!4F7 z)-n-t5_gtbrN%_F^rJ_kle1-_qn9yMf{|<~q!Km=fIglWI_XzrATMU-GRE^*EXw}$ zHY$c{0yZ`2D2Hyx#utiRh+5IwPgKj&iCxl^2zBYkXojzhYSRE+?a1t$w=1ft0gX#k zUdpH%6Cj9TBW*5h;&ffaGge#4lNh!%7&&F?}Zjdf_OQ{tODOaV+0 z=qw4jakB1|Tuft2Ge8wInUN(ibqlI&Dq$GLC0QCNr;1yiSf!HL*wfMzqVv!3;mSQR#sQXsv*i=QVunZONyb`j1nzdzV{+emDISI{5LriPKK zNT1H&N+LizyJ50ODrL4~$(rO$C*vxM&_+}29TO0$e<@WoSqS%TbZJI{OV0)LMaeD5IE|PDGXxfghG#Hsb33A^x)1x17Xh@ zzmDTO;Sl8w(o8lbJ0jEILg+{@qWUDMz7v~6V6wY9h^&xaNOKk;WO4{E{WuCDR!L`( zpxMO1W38Ax7J_ID=OIerYie#W)TJS$v*{7*9lhKms!v1a`88I8E28TYT>MzF6DjXP z^NSKM^=HxSwlp(T{X@C3w#H>L(Q4xEjlB^lR{WmosF4_J$LAq zD0MR%s9le&D1mAH)G~~HM!=ysmI-l{Z79StUJ7dH*6D1=w6;>lKJM^1L25Os%nsB+s{mpJftYwiBrckM_ zBbO6W1T>kdq3kz+o>3@(V3ReFaSF)Sr^nXb?3O!v+bmlQbMf zm&wpT3>Y;>1AfS3mzt(AywkhtYKIs>auI6A4iBdXaAH>GN3J&fdSJ-J~KT;_p( z#{;IV$ZtN9N%@?UEUc)tgc;S4b-W%7U3D}nT~#zeTDm#oA1$GmjKRfA(B5NKVhDv9 zXyh0=hF4@tq}C3~LJEi8u-1%S@li5I63F!jCfvIWpyp|DT(SCM@TKKQK`o)%rcSYLL~}rlL?&$L3*XDVs@MHcH5z!^eav;tafko z%72aF#6W1I6URfZyeoO52sFU7v&pyXk+j&>o4|yIRM4-1>8L?lM;DSaPnL}(%33mQ zDdacVinMj=0nSY`r++hvRU=8Vrjvovyyhz2Ot3{(K=^ zctKrCxcYIRz$WbsU#Y5aVK~tyV$`5R64S-m@vu%HGM%EGlV-C#B?h=GFC?yXnT{b~ z7b}Q11w)Bt=~Z0LYPhKk;oJ~MlgVdV21*7hSf4?-a7tv=s7;1%(#~Q@ip5j5KmQz9 zW}0hFC>|5=lBekaq$Vi_Us8Fi3zON2^f9Q7u5NLfh*AlrC@g2{7{`@3LK#yG@#C`q zOJ;3ZCWJ#khecK~7-q68hMs{T!d{T9G|YQE10ZdPLS!ykJr zJGjnv+N%i5X^YUZE14z!F0ezXwI!o#KW83j0V2IM+-#Ho)RNjIwT04W0a&+;_ne`- zAsJLJT(Y2kXkP5MzkeRC_Z%2h(NBY<;GctWXPFwD+_xwqC$lB4Err zgiOH6(gjuXYx_tQg_veqP<-Yp8SPjEj?0w0;;GJDGHX`t;-z(S5059RNceV6)$cF@$P}Zoo z)n&De=|7oXE%oQRkQALEm+_HU+a!Q)kuDv9v^Ca@Op20|EW2eEk+qB3GNL@?id8}~ zOChTol|^iQL}x6mtFNl&Uq=Dg^0w?Kb=TCQ0UPO4Imt-hMmfZ%r8GmExw$)O3OdHagp^|EhN3ZlVa<|x zi1ZS5%JG=K;`-yZWUfkXC4yd~GFVb8ehev~8~ge!7ne>-de)$0wWXq9w1MfOq&niz zoUcjvK~R2OPg?^sup+vK+|obPeR{qsgrI;p%2bg`Dz1E13#i~_O)60VwwGc$p?>cC z+Qr4!TO5z-z*J(0MxYJV^{0jDy;{zgLqYV24r!az<0+#kv5{9K5h=ImSbA62>TX!# zhN;G?!>>BaDi7(h*{DE#&t{!*)H6Q;BgrsZyNHqXJ(iYKBid-qIujHX@lgh=?zG6N z>K`POqxV43oqYgk;-> zlP&|GY-zS-jU+4C2scDa!ezM>bI}LM>%bv0y%jD26XAhNtwv=^x+GsiB@V$l#ulP( zYBY<3NsKcy78&n`5z>@P>lRn%wW;eVog1Jyb%TiZ4u-P^rZ|4AECuy&!#cB}K`>^b zG^{JbZ7$LoZx%Oh6!k34mTY9bjl^EG_9#EQAyK|stD33_W@@8D5*c4*`x#~BOET-4 zs+bYi$F;<+Q4gq|p@S1^=IU{YjKFAElx>t3T&3xepi;<}(l~C6CcTb?e{>|w>O0cj?PLLPJD zJ~J{DjnR^9U8Zk~FF{TwE@@A*%Lh*rHj-&SLqwe|Q(*koG+t(xSytEUH!#Z4!a-#- z&KnE6s;e((&^#l*66qCbO;|j~9Z9js)NlFU>$Oij=* zu5VUt6EWOX1(|V2*oyFKuq}ge8*{}CH;`82UD5DM)4{~Nt*Uut%`20xGUaJJ@eAve zQ|y2_mREERx+N2xXmoiRUx%wh7G2&bR*rL@n3Q!PTP)$Q5_%6#5TQ2Z5l^@Jc7@i` z0C+ZO`yP!4Y)ug#YE9gnWL+U5ZK$1pE3p`UvRS4gOiI0KDzea$B-o6l5M60mX_!k4 zV?`+CB%64vwwf4UQ&)X6HpwIMr1K!I1tiQ)QgNDJh^DToXvrDyyTZhoK;E{(t7ZgT z?ucPnT}vS8M?y(#5d+yX0lcB!pI{uT>Q&Zgjg|Dm?P+W)(-bZTB{zLWb&REZE#@wn zo42bAN+x}#wJYF~c-3*x+a<|xGM*2a$8`n4pJ9x?bo+`-tIXA=WcpNeKM!>a zQOVIgZrPUMk@4nRsrE5mv~03Z3fz}(j!CUNT3*$P)<~_il9C!@?Td^TzwTUGO5Vt+ zDD>GY$Sn=%ZE6`O>ULd9jJCns5zF5w#I zNU(ZWmi*}`$xWIp%B)Ov66UWO1dm5%giImqw~YiItX z%EZJr@*c;X*!XX}MqM=!{<%^t4cm1xb`ZCvIPrN}+!ZpIggxOyEZj5kf0%vvei>3Po$OCFcM>MPdcdhc7OGx%IHZU3<8Q;n4wQME>Jq^re@v!Tx-oiYG2!8Ae%D_@QU#WbKhNZBR3 z=w0*)`)y#utVUDN5cUOAd|RhALKxEmfghG+NXrt9dq%N{aKa2attX`CJd3EPtizj9 zK51>E=$!7c3eho7ZjtTc3T!s~41qhLfG|sYnBG)%gdG872-0c9chQ<;%>|qyycAR^ zBr0iALes{kd858{9gnnRWG^XOa@;7^;Ssd2L~gon+K!;qHZp^ksMSX@kXTBxS_XOA z#?oHWeyLI#ZHYRITn<`x;Y&OI5+VnIw5zrMZcR6=QK8GG+aO5icq~~n!wRKnKCuJD zlY&4kP7#YE%%EB`cQR3}sjyk%(>v0BHi(6AXPAv>9mGH?5@jbXuNt%2NMwkb6U*@T z`%Uz)^_gd%`3(fxc7Y zMQuE;WDpri%Jg=sb(u3CWSS<+6ql^jNj8aNLe$v|2EWuv!pTi6)qet~?0up8WDZ|c6jm87 zp4>9phOp&Rqt=kebemc)>ZB#J-J7Tu2{MgrgD0)#=6*^`7De~g5tW_evx$g-ikIP7 zx6zMNHO^2Clue*;MZn6UUZo&P%wK4oD3T;);(x>Z!c#%iBmwP2N5jL+o6!ABPib8* zu~A1*kYE*>4ai1Y$3B$he4%iWlkuC9(5Wo6pp zrJ2rVw$;nMG>Wn)aRS#I)soIU+#*tpKg?O_tx!J7$xiMEt z-CKRw%i>h~bRAorE?rnx&mMzj;Y{FKP{*&v zgUnq}J#R@(ZOz=pIh=vqiwJ0EZ?*Wi*lgl>7Q)K-BiYJMo-Eih1C5l<>Au`Bcu|Kiu>p4ciUwRQDOcQ0O2E4pk})x5geNTuwsSS_*DdXu5cG97{im8G!E zYFP_f5;D3zsB{pri59@#jWM=Lh}a-v80xA^f3{>ZP;hRn4wb zV(FOA&(h_w_%I9}3gm&LX}8iym4u?Acy!$6+ESvMlAVmquo1;wVh1omx|B+jNtDdR zu|}suU(2F$I$Q2AAe9lPoz|j65+e{akL%JH%{X0U`rY`lszyTgjCKsQt`f{Gm(`_M zWUUiGq2$LILNn3)bzqsJHnAdXv`Du`&?Jrhv7c}`Z^{^22G_2aH-l5g2OadRS{5-w zq06vbcvmpTVju+mo;bF~*l)FL4BR$7a&hQW)i81X$dhrh!eEPsp3ha0LCk82H(2x8vQ_ zZOgeAj-bb(<>!ghYdpTJP8sSlUCo4kcb6_Vltxv`aO;u^QeoF@t*KU8_KZf|7Y4je*Eu`;7Iq7N$u!Ys9V+mXkv@*v?|!DA(>e zz_|V5x2zd(0B$^d3Ap}_VAuV#YI=1M2WS^z-wk`r1InboD(lLW2}!JW(KLb^#*orA zcqW+BlrW%d&|a>EUQ_;j?#33wD#}Mu%h(zfcA~-*2i~J8b*~4r z&@%s^ZnYie+67ZcWqcA>hj{_ZsBRA}Z96t%Y#oLKm?0s&RaaX-t~c}G@)IZXn(@8v zTMps@%R)R;Ra3LHZplncs@m%Mg^NEu&T)w_1K(1php}_`JS?kij!c8~M-rVfvP!--{7Oj8_>F(QS9i;%8k_7B-|CVU>)i zUax&&l~J1|cB3`Z%!U}o%9F`O2Kid%hyzHpJUroM8>pjQl%kVB>JxA?zS2Hc71?0k zu)`9UGPeWeq=RRj8WjzPw5c5(1o^soQ|XoMm^~9^5hmo&7 zqBr4_m>ps2qW-qnb;g(4SgwYm_w;KThH8Owj=5i~w_fuh;?EYpA+t)|>g*e9wqB7| zl`>0Dq05r37>ju5GIX~D$*g)+PxN-LNcb|JnH% zku3>DQ`$?m*h9wOd?fB@(Z+^_Wc`Zx%3Mzn%ReG@L6PNQse{ah zh7~YU4ryG%L{f-1F@siz5hJMvvg%%mnJvAl!YY)IWk}sb{72KvPg9kza1pF@gvw6F zK#DMEkY+CFozBTE5}m#&L@%b*hEyUF5z{Dhf6n4BnMFqzkI>g-15PNDNMTxPqHX6y zO<6(5H zLpVC1W1wy$64G}i%VMdvB;?~WIDCppRb?!~fWD(5vw#x&glM_`9VRAVAA^(*Lx;0$ z^`!nFvl>1O-ieeul3buYwWXsRCIbdB=W|GqBTl&ELoJe{W{I!M-F;mvri6~pszlu( zwzDDQy{wn9+Yk-I~=(=-IHYmdm5|hzg6u@T+QzWI&x5 zthmkOttXtE#C_j1!(WjhT81S9kvEpsnS{s5Jq8^!)hQ!QrR|`BaiaPouViyN>1v5@ z%6-NRrp#n8^|OwNuvUa6g$u!h4%>tqni^~Vnzop&;mXQrN!+kSxBxeY^tF*SCv7tK zp^D#iv$!qkm{Agu7o@Ii2RYH~Y~WbAa4%q+sM-c&l;{#b>Fg!eAg=2}pM(8eofuA% zpK@*37)UD43QC*EX@04`9r{4*XwBUlOnkG+O`=-<4eh4B-plDBol}`fYHcsrfq6Pi z1#z_)N2)D!&K4-@5w$}-Qy-?aWvN?WvV{>W=5t(p?n^uW=vG;!;-(Qg8EcKL``9Hz znkaPC2TD%N`uq(jt$}-|P}j7d$s*FaIeH@6v|4A;?zUj2?0kF>fs@S)tP?R-B|A_I zSys7Dg@Sfu@hi*uVuo#$lqxF9klJyIlU+Po*3Ol+A)1hLN7}p$os6hRZaPC}2M6X+ zT~UJYyOLt~ITmrs*oaMrl|X!eQA-~w7|j`cQbAHLsW)5v^jh-U$2%?*-GyFD#9UJk zsWDE(m9{)#Nmfxx;DoLga!5wKb@FtRBMV!CShYt(2{dW2Y8a3 z*+{|UskDMq$y+a%u{HX8mIHg11q*!^7u^4!cvATqo*3ko0}LgZzt=vwJ8L$NW07}K z_ROT`(!hIUO-7w=h!rI>=@2>)-|~qqUv#fA-3c`yo6E#Hp>+8kv;50~=um0EuyJKL zD~ne&G0O|aG3YE``v4R|OoRiXE2rr2wLv7&Ui@4e@^h>mkWGZdYzl1ZWcqiBZPX6P zb{f(cfkhI!9!vx}O)1-M$Vd%o#A8FE!CtU7Ra22@JL*cnaogYZT2?-Z%RP>m;XLbiq1C_EFYAtT1`Y=}3tw zkmhfMpvW9U3%|PdFupP5RDuY!evF9bbY(OfAYw!qhYE2f@*ns7%a+!q=x#@!?n_ylXM zE?c9;7n>BX0}ISWI@@G@w(u+R6^v_T-imt7!m6_(J)@)yi7zip(p8rE~cZT z|Ka}Sl)^O0YRN%bucDNrHBzsjtQEvs%6`KbmrzP}{KN_1oIl#^0lB0tg}SsF^|p11 zCtd2hqS(+1C)wgcw!u)EgtdosCPV4EQa4U-U`xE!lx;@2X{p@Q2}Y1oXt}5?Os(7I zP@$v?0gG(Tp^@}v+jgVEG^e1xZXA>BBGa<2whpNlBd7v36OImJ10;4)`di~Qc4dm{ zNYMkPNwv(9w*-0^#@G2UdTD74=;ZdSlgb5qMM^)W8!PMDVc`bEo>IV}!le)wXXVOd z4}}m%uWlHJt)U?;T2rHe^>(fR5zon&e&A%gb)VHjxv$y%7NwLTlhl|0)e~w6(I#7R z$QS|&JmNU53$+7mXQA>;!_E;E<0HgU*2ByMSgSH&%dHQh+rEa^kas_LuEm$GatMoO%` zA7!fhj71%8}9vHC$T3SSB|uzILv?nk?Zkn|+yc z=ok1L7(~l@f(UOh)doG#G;`6Ei`?Mew{#9(@Xq%t~;BK&T-ik%H`%~3=?xy)o0q^7j0(BJ`+C?%AO zs@X8Cf(NX(#4tYwa6J!&4qx*@0df1{3NcHEp`Qv_yy;v?l)5snDjRl+$kR6o5i~=y z3A^(JAeeg9>>8jG8>X8>QpDoZu?GDiePFn#$VB-F16#I=?jx}`I#>S}9j#H8pFCTkH3mExe0P5Z@G?IwWU{=t}*IbsY)&NY9P(Dk?^Hk5HJ0ts7xmhJ$%Mn?yr_a*ThT>hKE|( zQYmtkEGflFN=5Lz1jEXL$-1$nwu$-2$c!k|iis7Dx5K1_U^Yj|5Ql{N{j_vS%xH&e zdC`!^JgA**d+#9?oCiN)_@GA&8LYcO!u|;0Vf&XZ_5#f(qtegBWmM;C2tku(kWpt& znVgUYjA)F=W!++P>L&uQ6x}Wj!au5P&3ZMnsEuxaj@e{7$Rl6n53$<7G=Lil%qUrH zE@1cN?8cplrK%h;tJaSH`52mA^T#&)>aOT&(a)OrvukFS&8(Rpm@?7r7%-%CTYcG$ zAxubI33(EckFO#5=HqKKaH#PCoX$qGL!^9zZ(?&(1JsF4G?n7(C>h6%@s4h!U@yq1 z&>mtKMy0S)KJBI-4@@ZkL~UFrjjq*na|!Df&Cc*k4q0^|dnq$VvwyF$;QKMR@lE48 znU6F$sWfbA1PUGtENY{Zw8=<&tY4Zt9aXBX9_b&*^C> zulan}g{1;X-+on6j5xVIv#Qq8Cot(9Sy--M-2~LwiIC~Ub7jDE+v<^&DVFHqTnDr+ zNg_^Ux0?92I_5hYkjIAfNwM4u#&1w2-Z51P`7@TbhOyKWqO!!W7gZvQ4Rs#~3}CCF zOzqw5lJys;XgkJC26-FlqFd1WjQC9mO~kuly&AAAs-wF@e4<)FH-lu{*{%^KaKS6>LeH!Fwc13_OizMpzD?`ZB~@Wa*>9ozWz98o{iTYo_(9d=5WIj zY4B>x(KZv5=9qBjH%Ee zL%xtLptRJ1BCqbqrn;LlYkV?_j(cQ*1~V46+ZCNGZP#0!#Po#Ngr@T06 zM3x91i5?3DKAwrL#@8-HwxyT0E)y*R;pFR6x{0gN9JmZ+0!FqggD6s~Sg+w4RTlTl z$jY=}KzW&S)EA=(M;uT%e2vlV>J>|`S=Kg?Xj#{?t`2F$vc`_?3QXRV{FchLE#rLV z3OoEV!X5Sd3i`D`w$<+7lgL^}mQ?CK7r{=o1rvi-C9-8vFlo6uI-SMRabY<#%8kr$ z=uF-CuwhI$8uoYX_~v}MTx$;t%g7I` zV(!Zj8riUOD08x)lC9bg*K9qTdL&v!PtZ) zD=;_1+~lmF=~;qhwAkv9^~)f%S4+m#Q-)~pg)~qT6eXFLkrl%2N^G@&yZt;%Nm773REE*bDTrJ|NXJBOpi!wB@PuQd&mu_!h zl%d=&t@LGezx~voc~7Rfw96UC0cLOwD=ga@NWQYXqH;Vnl5Nt0L2M*1DF@a9K}Lv$ zkgRR$^yMsvFw?LmQxje&O%=8q#zbI@V!g?vtVuN@R6(1%w8MB}H;-h@O5-?|+-qho znavc1Dqj&)8HcXNwn@+t0Y({~TNBaaW>TF;Tr`pB8Qp?r zqBdw~_|C`eA_kYXrjR8XXyj}|y!hf5lwpzjeAbAvXMAElu_;mGw2suqv`DX_8CyPB zJ1&h3*9EC_jM@)}RlOILMaU^d?De@Od0p~%NtX6wH}}Qdy)5Lqes=)s({$Emw|283 zfg6hVV>9JH>{!6A|R2(D5Y zH*X}(QYlO1+&O*>)z`-Y$IOm@T0%C^4m;)d-0-fNzqDp<-NAI3TJ5sMR22IeE7<&F zjceO|sk=Mw++Hu6Tzp`~q?pGDH}>tuvA*ec)af6r$h00m932`+>D035AGO{^8O7{( z?BESE;KhjlAe!pAlBfNMX(dsgC90Z55}YQAjB->RO9vA6usXkoY~}VJVb2koyYr>@ zoXJK}+I1K)b-4uHOT06&rbjq{md<Sab- zC?*@x%!u2gc4H3S)-+2^tT*D&oGNA5GR7a|_Up0*bZD`>$+3QEYAkOmXMODPii(k0T`Gv)EtI9^iXhs1mGJG%aCtJ}` zZ=7Ts5S*>+A}RK3NLH+$Az86rhNL>YO}lS212Sj!ANhRY~YcfVyVB#?n+Q<{ECB~>_<4BDrVG*3fc&ec$L3y|% z#rooC0yFJh{{D?!ovjB>Y}9_Ac_TCYHVGUJJ@SZ0G!7PXqN)Udx716E8xysTyp zmEfu1`_*E*PD|@6sHCjMu|=51RCdg@Ti}W%xuk*c&ThYAk~os4PL{24iJeKY zsjutnUFeN14V$Jpm$i;>@_c@S*~IX}OvF;Eqe;d;VmWCa{3-dqkOUC&rFn{_vvPqI zoi9ag)pq>p!NUHC!5k)u5pihpO%d8-oC_(yMHl@_iP-6pPtP&qjvo{Q zjL-AU<-==c2S?*C!oii(B&OxZRkDSgabIKYV0=m;twAaKW69^N+hnc^4>5jL+lca& z3)x?nC(RN#M+W`Is?Y_Ro9~_TnKD|4W-DWBJ~7>E#YAL#S}HkDgL$wEXUZ>w26c(nzCAtqEw7*|w+OLLDYqMl%;8prA8C%W7F;3QhN7wns$;mPqL7c#Wy@(+ zQe}08zS1wwu>p^ofHC>ZG0Fx_!&oO=Zbjn+(ZTWe%?1(fWnl%w-`bYy!V>ApS2C5) zd^eQsO-j0PZglJ;TX?v|!SKm?|L#9No>=aQ@e{q>3 z4R$P_Y?8Gpwi#T)NnI;Rwi*`=UrE-bZpLx3oh{IsTXD$8HuB|+poh_iBNG=v7h`%P zLsv5+Vn)cs^Jx$b14ce3NXH|+TT{Wc!)W@{O}7?mzJ_7xW< zTR{;5iEFcg{i>ETxLYNg_|w(UI~Wzs?f6xHoPKjp9@8%uv)QWbecPO3&nVGKZr?Lz z*fkaVydI-8>yvH%0=`!XT^3Z;Rrv>HTH3QTZ5?wGDSuY02G@%^LzPrf`92(-Wvv45}@tr`=D)^=a@yNp&|n zNVIoJKp~~bWa%E{i*ANou9vimKZwaP%^@#TEoS2_f9jM;Id6!PDfO#zaz31)El?x7<)Ir@DkQQ-oNC#Px+>eOv7RWUwBKZ3kLA`IYk9MF?O_poyO>!P zT-h0@uoWY#mz&YT2}i8(2^J2>PQwJ~V(Ob6Ypk}W7l7_eM9KFDp?9!uIeghnPCzKr z{bT;9|I|!61xB`56(W$41^Gb|Zi{B8ees%FAJh`pOA&%4pBUiFf!uS)J@NJR%1*j! zm<9Z7&`czXkwe30E_L||mtHB80$37?iVNS0luWd1IPsO|RlbVV$hv$@hxO{JF3cpn z2%W7Oi-a=_*hJR}32Xy7iBhhYM2wQ^T|Dv-2hqFEL%mFVRi>YO2;A8?S=rb@)joM^ zWrCdEb!IkJs&GE~X~B1$ji%z-u4HgY$&eEJ?{KA_HB0I;%eq)GEg$loRX4uZH?i}4 ze@-_K9G}xm%{{O+MTna{99bzR?^T{8UE*!}`){?tFwYwVb^{*+ zK3E7AgQego&26TaMgR{YRz&YUO;3{wpxEA~x{1)5{)`Hu?1K>gM5co6rJ9r8_ z4PJZcsn;I4=cU_!|I+VoxaNi{F1g@;zxlr>ed+UGTJfb79lvk>?4e;(Y%#j!?7EA+ z>VtOlyzK`cebxo3tOONI^F#@wGW?1TgN8Kh4IZ|v%M93Q*t6`nQ6$L(}q zaD42s-!R7|K?>Ce4fA#$)$*_TQ^`Ye-Jzvn=_C47Qc@Thy(ekv)gZsInx82xbqubL z^E~p{_V5uNrK~<^oSey1_H3v*^R^y*^dD~a$XQBE&9*g1Glre8@Sx4SPk~Xv70Eof zI{4_D&Odkh7Q+SwuO2dN5UEN!lBzUjaLe;O$|m%#1NC4DI0PID4g;SChl9_6Bfw|D zkwADO2^v5nXaXs)3^aolkOoJCH$nn>-V4!_*qsm9$#}2aRLumJ2cW&SD5l<+*^@(?Gb|h$SQZ~?M^=L<- z&vM{oyq#l_bCK=u0w>>2t{>)_$nO*2Ng#48GW-wlPw*^w9lRDTe32(F7JTQ?f_I8c z`mSgKcScXv7I$)E^s(5<)zLeJQwyJ>bxLmD+#9rLr{gWfVpnQL*Lz+_%|X1lrP6-; zAFuL80_6dr>`1*VwB4&|=pYglh3maDbkHDAh#m5Zrl!1*%SEGvcFzDuzkhT526z*^ z1-#+(4`4g60~iO!gEVLd9pJm*hu}xx0q`LB8+d06`VY#U1*e0nz;oa&u*C?^+Y0Or zrhyrt7R&-Cg44it;6~7jJ#Zel0$d4RdG6_TPv7_ST{m5O*JT%;ch|Z0zwe%P##!Gu z>y$4ar~e(>#eW^gqWPqM@J5VkS=7B2%_skQTy?*vHl3q)<#%+8o;hvF@09JA=+ifR zjFyw@^b_(c`r8{3?H9b^fgUHX9ed`GnhNT6=J((^DB6QOR5y*fRe0@4RJpfX@NV@% zBfaRONxC}n)0F7(PPtQhyf^$$&=2h>{X!o-9(^Rej-gZ}b+nXS=>S!+X z{ttK?yaR;xLig>#NH7YF22noPm-AWRC?GshSc%6J|8t}s{1tifm*52s3g;8M^FZ{S z*h%5k?ufoq_#~zTqOYv?amh$;s}t9~J$me*xywY{Kg)^H48uoy!Bu-@8 zm>pgn?0GxNKRe&IjlCmx6}y;AQXcoWYwxFa>wRhReM7xLTMTaXlCKWNzT8}BeHIWM zF8W(^_v7HhO#jC=(cf@M5%d>YKLMTwFM@68vv&a>X8K?B;3oN3El~vhh1R=*J-|L- zHdqWk%=GVhXcPU5rN7X+4jc-S;EUj7@L{I^tcN$zzgYSUtxo~p0N(-kfS17A;9c`T z%x)CJX5;=9vj4XK^CtQiN&lfjXBnptW=y^ns0T~IyQcldC3W7^3ekVvCi)j`{|T+d zN7Dq_!Smov@L{I^#gA-~|03mobD_2P<2?LX;*+}y|Jn`UHt?=_;C<5n$2_`;{zcM% zsQ6QV1=fPw!5_fg;9l?;SO;co<$3#o{lNj?)8KIM8E^#nEI1Mz4VHse@Kx|Na1uBf zoC3ZMP6eldw_bngxhEfa@{T9(`1K{{UGmLeU$W|wwj-4QU76!v^hUX0r<19T{AYyy8t9)pFfV*W(41=?~`I_LE7t z(RgMDbe$ejXeT_Wo*%`XXrCoC0h};`%%AWf~ zPMSNr`MO|+a97DzXBx>*Jli^NXeJ-I5_wJ@a-QSRH!VJFnF-`qeBHZ=oIBbJy@fsx zfbm=7hX;3qm>y_|cEyKBPwJv4^ETil`buIqoR-79&FOKIXpE z|2O-wP4Zu){0|dZ{06uX{0v+KE(Vu^%fOZ3SKume7q}bT1MUU)f%}2*%Y)z{@G5u> zybk^i-U9ytP|zC&hJ!u9SnzSM7uXw&11~)F!d=(B@Us`bfBN^2JN^5oU-z@?xRSP4 z4wWlLD}3dzeQ5ZTGJ8k0OdtBCI4xjmw3R7kKQ&rEE#!@n zb{ARS2Ydp|26Mn%a1fXe7JvrO2%5kb!ExYta02)e_%aZE@fGk@@I&w;@MCZuxB&bV zTm~)&zW{##e*|}cJHbC5xb249e)hm^|G3R^zyo?EZLh!qhF(37_eC$$T5tVLpXsNy zOnS$eXM_GCu7o#){-z9@6;+1yqgZhqQ!M{^W2D{x1nvT&>+b>gf)~Jx;3e=fcn!P` zhBFnh1=tdN9P9=52IIhZun+hIm;fe%x!@phFqjACg9TtESOt2(^N-y6$hDVW`@Ki5 zz4hADpFjP$=TEm+(vMubm@6C7XFvZ$@$}D{XA96jza3#H{Ho!^ezG+42;@|Ie+jvIC^Ks6X5k|2Opabj@@}C`dI8v>?HPBktgpufmlAV)M6*G$6_b3 z$6_b3#|oc39&Me-@#bP85mj>K9$O?nW~`-4hxE3c;&zp{v&i3Sum+q7&H~>CX9MAh z?}Br{ufSE{YH$tsf8aOZLGTcG7`y^r1+RhE!N0*9K=|q{@E@=fytOlU z@H0>M#Q}!0k3O|wlr?RcG;bGZ%f7X0{vM-PzI^wiMpOUCjg<7=H;s{Y|0j4B{0lq> zUIZ_J67>I8U~4cQ>;palCV+{c6i7c&4l2NWumCIsi@*|a2v`Mrz%gJAI1`)&z75U> z-vQFsy!zB#*FE*Kr$Y1psaKy$+be4R|IE;4;XnGP{$0-$Lw%Fp67%f)K)_vDdu)M`U=-K^>&-lR^&t4=~ zj<#10Sz1sfSdnWJO|7*&%O^FU}$^0;pl#7+nauUQM)MK8YAugB_KB5iQp^X z2jGX`N8rccr{F^H7+44X0^S5~f&YMafCQrs0%9i)219@k_5fqRo?tJqH>d_RpcX6z zM}Z`G_Q7Y@-njOnXV*Ts)^UJdIoe)1ETI3i=lZArHUBD}{s)+6HzNHFU9UHMx>4y` zY(G*Q{iWR-K@&&;vGJQh3pf#c1$-5J4V(&21K$PbfbW4T!LPto;2Ll(_%)Dm!f(KJ z;9>A*@CbMm{0%$~hA@WM91I0Mc;(5vue)XQ&C_DyeN+kC>* ztw8;~G1Bhqz#HIA@D_L*yaPPO^)kla3=9Ul10U=G#(=%SI4~1bgBoxoSPG5;4WJP; z0r3+o1I^&e;6(5h@Kta!I0Zca#NE$7@qB~>o_PL=w&03zfT90cFBd~EQ~#aJvjysJ z()->^#iaLs(%;l&cT>&+b=eRe@y1BIUj?oP*MNJ#z2H9Z0C*5Q1jNVlXYdI4H+TcQ z3El$l01w~K-e4RU52`^8s0FjZ955G%pXgvP543!!OdyXmf*&VA%u;ed0^mA2qYp&mcq zb<>`MURT-{Xir1`6JOgf`WIzk*_rHw$)i9yHiWLla$n!{mv&zYjslIK37iB@2B&}@ zgY&>ozy;u^;6fli-iyG+;8t)OSPO0kcYr&=i{K^jGS~_~@YY}(upQVQj0EB*9u0N? z#ruC=`FHo1;odH23QS#4lV_kfy=?Kz*XR0a38oIyZ~MVFM(IUtKc;t^905E zf1ZA`f9kiIXZo(amCfhg=qtVVlGf`(&rVayernX0wD<18yfM=5{|0Y>(ah280CogB zfscXR!E7)G%mt0038X+XXaQ*;b3DsID>w<93{C-G2j_zez)!(V;J4s+;1=+Ea4RV2 z`@s_+o}Xu}iZ{~v$bb5xnBo7U%rpJ8mr3t$Z}pYld&vQ&tjkRP{gkyg{raMIQM|Q> zw7tyDtp&G(r@+(T8SoGAFYp}LZWnYm7zs*287K#pU=o-Nrhutn8mI&HUt* zFFg-8`S(-S_kf=38QcA{Q`{Nm3|#;yBqo(jQ$vM3%1)GKRwvp_q<<%ZTCR7 z!Qe6M5dj_opWPE5KlmCr4J;T-oFI7J%B}vqP~1su^7H+F=WoT8`r+tf_eD?s6g{~; zdJ?-6y@7KK{c84e7_u2hzx$tSbUCWMmZ0^=hPyw+-b`Tl7 z7+eA_1($)#f$+l>;FsV};4W}CxCcB49s)z*l>`_D#(+J+Sg;q^8;k?OQ~Q8VfZ1RU zmy;9_tqxDBiYw}U&upTNJsbKrTf1$tvk zFam4^wg%e((J9-3?LiqR2Nj?aOb7ddV*Nk+4=$em*KO86{b!nIKEU)hy!<=E_XTK~ zfArtC?c$A*cJBb61D)Vha2ogq_!c-FoB^aiSOd-kmx0T{FTfSx8gMOm3A_wm0bA2= zYy-9h+k=r{6p%h;2e2cU45omoU>Yda|5Lts@$~-%+Ou#3xsm^==9%@T|HhSZL*uIr zZx^6(-_*>{0e#ts-WX~31HggcE8wf(Yv2dqhu}xxJn$26J`j80r{F?xGq?r(9^4B4 z0R9M`1J8pOz?RqzBR~n*8f*i$1!7Zd4@QD=PyyZx|IhhD`=|dt=9%@Te{s6o(Dh=& zvm24F#d2TY^p|$81e3tNUCt!LDF8@G-DE@WCFSc>m8i!}_P{$ILV9O;tm$A0+z9VMF9_W6-NO zjx$(|7Hy|L4r%eWmwa z(t3U9xuYp%KQ-!0+Iw5Dg!|F%+kx#t87K!8pb|_6`+{cB0@C2i;6(5h@HKD}I2p)z z@ay1IZ~^!!xDfmdTm~)&>%d>YU%^}8Kj3ZPF@78b3i^OFA}AXF^W_nJQOt0_Q1eVb z?Pa9>qP@Tm6aD@@1uETqyM5)wID;bJ@!92SW``h)4>NO?yiYoE?(Y4rqq$v9P(*E~= zd%^wS0q`IYpU%VJ&){|NZ}0|q6L|P{27wu1Kd?VI1RM$u1BZjpfFpqTg^mPE!BJo( zSOp4=^_Lzt?=V?AI6AuWkwu!i>XDcsyIU$(lI)b%*ZN4q2cO%zFUdAkdU>m2`09P6 z(z_V{uQYWlAP3%VLJRTR9RtL7CqBDxd>nrOxE|aIo&bLbPl4CLSN6sZ1Xu4vtQU9` z++K?P4@Q?^=YbVqB{&;=7yJ&~48~P54xEGznan%__$nAX1swzS0##rp_#=28bWMf# zo_&1XgX`{Dch4Wz{bAkB>u&tRx@*_n$bVNne)0L|o_)sIXPo@Sbt~JO+p#J}wVXQt z4A$uCeu>*e&yojWeQg;SpW&@9)?LF@`B$&7i{ej?xgt0Y zuJdI0zI#$qc6sf+|JPhzY9x?0$cV>1Sj_)q{ z1BhT#aw~i(OPIdyaGWbava2LgByCV#@_qaMI7jbqlBCf5Qg9s*+TQ?f1ph%EgTI(V z_od)62hS8dSyk{(?49US@7eL^n5Sy`7h0i+9Rg)5Kf$p3%Dv65@Wu|meh+VGhwO|Q z{~P+f9pe|Ur+9_P7c+p+|B%^l(yWAHX?iwEM79K`-_48%B)|_1-wbX6qU#?3 zkAoN=oD?PTm!l`g6g-LE_<$Yfp>;m_Q2M|1(Wd|ALTl;YrEmW?I5kSE7^!0?(WgEF z$GtfsE8WDGx9u(bLnaT(vzKg6PcbYZJw^S{UQILfD&||`fA42c;SCm=zX9F`{$4q9 zA5;0UlXw+A0%yHBz*G4z*{(MWe3a-fG~WY^1qW=R|1vR(>>Rt&f6Ygn{zCHu!Ax-Y zCi?fH|1R5qwB=uD{u$5!&e}x(UiAOrN1Xmb^KXOy0~c(fe=quvANkRif1&wL!NuUl zP4w?Y|4TpO^cR}n1lEFkHqpNq{ilukXv@FQ{9f=NcxDs*d(r@mx9^gQ1C-=a@3!9d~qkyr#?)_y>-C~@%$dLLvOJkT&(B!_&lE9 z<2Rz`cOwyh+2ldq5TW;vz;z%wzG&Kim`L1bSqsqrp96&cgN5b|;EUiEaB{S@jxTr; zz44(w9^PxNT;=~uI}Qx_A1pNgJy-`86326Ll$ysEJc-`;P#+J^PyZcv8X)u+nlA!} zgRgC(Kfzln|CbCD`U}lZ0^bGeHqqbFzh>tFBL713zks(u<0m%he=GkF4HWtd&6_|Q z_}qj|^tbfy*kypoztFrBtN@R1qQBGsLw6k@^cR{x0bT&dOxz^@R{p;?Q0Ol-KNcJZ zzRdcKP2)ec|0{PJAo4FXKM|Y?Wc|)2`YZi^KTzl|H2)*GAH2GW{;vN&@?!%;{)OhR zfw#a}tk2sd|0@444;1@z-g&0r$rI5#>!K&II}aDU zb9eO4Z3R!FH$EiC!+Xt1c!~Iaf8LP6aO>6wj%IzTtn4&Lj-$=qfi{x(ZGGY3u<54gv>*&w?aq2N}=ODsU_~9();` z1AYW%%wT^R@FsX0Y`Gu#g30@{-w4;GR4IQl!=tqj{t?6-kU|NX}dH2HTn`{$wkdD!CvoBlTqIQk3Ce*&%mdoT_g z*z`YW&w(cYLh~`86jU?L9@zB%(}1JD&|G{ip8}T;c={hUcA&|>(EJzRH{cC?YlY=M z=E09UH9p{Hac__KO5<0=N#-3R{-4JN9Q}pn;!_=h4^{lCh3S9n2b{|5Q@ld-U-t2V zCjZWtUI*>#!4H7*t3S%|^FaLTF}^r1+SWy$tc|J}Ur)1Ca@RomJ*sI&f zPJUlt;whC!0a$oFp*ZApf@l$pC=kfm!5qduh zUIK|vGItI>iu518_a^%1qrcEQckXnrnS8$u)PjZJGa$wjOdN%O&EX+SNuwvRJF%0) zqmO;6;ECRdOY||rUV%}=*>Lk+y!h_M=31cHRsPT2ME^l~=s#TM%BO-)f*q@f{eaev z_CohzHGKC291X4m*Mm{D%oT$)I2!yK{6BE&EcOclcY}MtRPRAM63vg4@Brz>DA|@bEz#gTV*We?9x!-(P#=?%RHo z``_Px^Y`%DC9hrhqwlRgZS_|_FKm@>Hk@w@YAbNj)3zFgPbg86*8k~^Otxkj0z z?=&oZ#6~OFcY>G&_f)yi_y~{&*ML|!*D7f#_ZK^H7e92r!(*{Es!hHi_Q9la>)AiB zBRnf6x8XZRL)Z1{^}V4JdR==LmcZZEFE1 zz?6Sy+aCk%#l9b?^nZDP(%+5g?u7O-t{bTIKj9MtQ~upp{^QVI#`6P}{##8LnDlo( zoG(Iq@#73s`kymE>F<1ZcS3vd-wjmykDE9!<=^>i&$oWtflB{h4p90#U;RI=zkZ<7 ze`e{xlz%rzvxl9R8L0HXV}R1%&BZ-q=i>${{f{UcnDX!DV871XtIWd=RQf+XK8f+N$j22$x+eA4vn4+kImj|+;$?21=4ff8AJBI2zS9Sdt`*y%yVwP7f3!E@kwP&yB?fz{yW;PLs;V*&ekfc-!x*nc7MLtq&=8gzmzI2oJ= zo>@eUA=rvYuTtPIX3Y^e4D^6gz#HIA;MIBFPGBsk1Px#rXa+06=fU~lm4ChR#A8p~ zeXIQY*b~=Zed$jweN6xR-%GE)^!lr>Uw!>!r(J(Mx4XDavO%nk5Pyf3(#9=KWX(>| zT`^1yj*XQemPVq1T>Q=FM;s8}JA+u7(fgmnwHxML7d&MmZX}N|;>J8B*EFqQPZ4Fq zAR;HYpD!|L2bY&kx%wbq6Qhj5dqLDta3vnk6vPnOG_)`iMXsj-q5XkC=>Hk;FYszq z^kOH=3*L!67CVW)@?IZ*T|#=kwZ0;4Lw=vyp-{;0@~wLneCPw{r1;;v2=o~ghWzdv z58&Mx(Y|@K=TM=ull2!k7J07$4M60c?MlMGOnAtS5z&+8=*f}AokXA7pyNFC>D3#! zC{X1Hzj8g5{70Q5yoAs=4Ne1>g3G|J==gg;Eao@XcW=na29bEZU&_N1r-?GSbc0C$ z>%^j+L>c@VzRLLr9kI7!{LmUDW=!=Lc_$YCza*Mk zEP?0^?D=5NyAi~dpE!NUwkMwb_L2M^#cy+ym^J2^983Q+k^hG_(LZneztC3fZLzfv z21fv~xf_Al-CqDd25&@Z@nZDk>Ecd4Q`}>*)S|D%kCmpG$r~cmFK>C(&Jwl#@|N)= zIUD-ht$JUpADVmZUFh`Qk=*d|#$D5uM*|kLioD@6mbwGn3q~<$-WluzCV*5i~@IUyVNT`Xo{vdbesJ=k2`YBq~Y$!v*DfSJC__e zN#B(mrBrfHem|GFP2UJto9MtT812b@y+R42$H6Etcrv)clWt^NDzbei_!AHw5XZ?U zz^ksgvBemHQty&9b?I^5}E(ZM%@7+FC%z@rf3F(C*}o#mhv91BhbXMi`N#EIF3g->Gd#7>@#rWU&sJ1O$9 z$D^qgK8Zf{p*@c4Jzd)u%!J^S&>ikaA{(LP=+V|sdXPs3hPnx&g^TA#0t{@%WHBUybnAC#w1CPC2vGWP|^do1K zQ{ERlQLf6bTC=1+YSq6f$JAB#VU_OAczN*AQdx6l$*@5@DfcQJ?SyVZvvZ+OyFBUs zQtm*0V<$&M@BFuq4BZTUO;J6lWaEU~e~zDh^QdQ`!a_ksRJN&T79>zD1jiR!(n-h7|v&nMBJ zJzZ+x4vE^+FJMEz2*x7jv%#(4HqgufzWNW4)$V*u{Rh8t^mITH!dd~@E7n`@FI8#d>@z555Nz> zo#0R4;5Np5;ANQY6|fs2CJVq@ufO%e>(BoEFZ}n&vya?&*X=jme$C}~{p|ezJOBUA z`oHtPdD4j|eR0(nKX($P$>%A@-ygxmVn@BG*NTe0Vei+9<=U|KE*9*-_n$x@QSj4S-sicGCj8hr zGiPQtduC>5&Tclj*vz$DrcWH}A-%K6^zN+8YXymAvCrSUsv^&WO8=!Ovc{scxjje| zwe%pRU>%2Y(o>17zcPTBEDe1O_A@gT`=+lyvsAr=*jV!fEbY^`hFqkB7_K(xJ4@zg zFsu*_TQZ?4Mfx_ewLb_02Z4YiSp*P!6B}O#`(a;VYhq^}b~V_U*f;?YTM`?l!hW-i z>}TS)`FjO)^{iJ?R*<3|f16-ZfQfL=xPY6+!WCn|q@D}LDQCV-IAN^zd06l1)Q@BO zQBL1Hjl7>^4AeI-eQH)HD@XdcNc8j#Mz5C@(l?Ggq<^`9Yk(dEKMXhpO2OIN4QvBX zKnhU$VjKVkK_}n_e86IG0fhSDx86WFm;n;NB~V~6#ueZL0>NHTV+hXDzzal!51^nw z`aCECii1Ef56lO9!LFh38G%#a5qJ%fLGA$50SbcjYl3%PTuwL~|Cs!3Ivfwu-!C@3 zxU=HL2fSlm%$YIua>A&D!=n;#+zS{yIpiRthq^RX;wf!P{V;)k)~brV-nU{HA+ql1 zBx6F>J)e4y5AHP0x>jfOR5$d~k=<6Nk365)|_>apY|uChF^^z zX4Ien@m-=>BMSk^1&(o9mYTK&rF zi&=2i@15_Wu(tf?|lxok3eL;)k}sMeQHa{-oa%`?mq4 z4TOMDphb5t2&_OG&<=D4zF-W{l)*aS9%*WeA98HjuKz&7v-JPg8hAMgsKfoAA$ zErAc{hKWJpF!+2yGte9afMH-T2BTn*1m1&$QMf1d;q|wP7mn}Sv0=&aCFK9U4HpvU zO}qX!9Ph+2i6e&U--#mW>u>$i ztD5OUzTwg9b00Fa)BU<6&ESL03}^ayGjbAz+?F2MlmlNhi6!^>>GwG^Cy_Gl5X{_< zj5uRocIJMNG*XQ%>GQ@mC-!a&aJaKxCX+W40kg)emx+)S{a+C>9re@ik0sZW^@mYE z{xA3u`@f3Vn)GebpO=9UV{7^6C>SUFYr@&I0esv6y-U~m&XGU$-#-^L{Qe8EIT^#r z`2Fe!wg2`X*#5-k4Cn4yM(6L-2tUm@kDH7Qh|7BY837lZvR?hNf}h=gW|Cs8 zl~dTXm+Qy(FMI%*Bfq}?H>>-@_J5Jg&t3yH=4JVTC&1<2tQYS6$a>{0Wa<28L)lnA zf{gK3zR$+|dHthb!o{@~WVIhIe(|ZY{T6^u^SRz%@Bk>VGIvzuA&>s}$DaS8B=#N% z{6HuO1OJQm_o???ef)>9Ke6{nFcmBS55WJT{n`3I?f>Qdz?72Mo2<{t+ML2Vs3}>O z8xLYR5BVl3###Q8;he_*=%4n_<}P4LN$gGhG0g$-$@l`|lj#nofytO5O#!QcNxLw) zLCZvNH@1Jz9ED$uQ%njl5lqyKvlu-ONPqn%zw1HVqL_7cCv%RcKmS*3@U#DC)Bict2orFRCny6x z7@O(kw+SYBauyyLmzJ}Ta{=F&a?7}$OMgNz&hqz$vl-z&Ti@^*-}lyJ__qwQ+TicX zyxvLWA~sITuyb05t*61>xijot6x-&ox54f)2rmLl!8LFX%!K_ngFV2|CP+J&2Nr?F zfSrgn1~3EWpgw2_nu2D)1-OE?pdAPRfnYQk1IB{jN$@Fy2jCfa2P%c**`=Tsa06pN z9C!=N(DN-paqu>Yyr0~8l7#n_Cl~QfI(Z;|(--e2YYfrLH^ncHpJigaq6R-MSyt97 zqp0819KYzy;$C5v8stG#;WwUXUo73n3y-qtHxCS6*Q{@jXU1gb$<6LQUwD44a~ITq zr=XeF(G1@;Jiqvkfqk#NS+c=HjD0ZjaYM_duT7Q~RgKum7E}Q>ffHx|I)N_6pS|^8 z6^!$LUs(9^-qyurO?U8n$Mmk`sUT6@T=N2X%NC>9DDI2>U^(f_xG>e1ac1J@aewPd zPlwXej45#bi>QKMMp=CsWq+QfvN`h)8(hhrN4F$)?o4bAx&tpTgviDp@6XuYIR9S^ z3pv=|tKoN^(|_7uWIU-JZ}2a}{wiW?e=rmTfsr5*{2T0_r_oRQn~oCS-Tzg@)>FYO zK+f0XT+QKJ`){!So}c#r>@4y9_9wRHfdI(-jLgj%fPaJi`#JyY|9`dr6I+vcIGKZ! z`8Sz+4+H-O`+3k!eK^+ChIRH? zgiYE(d*g|GD`UYV#YAXgtX9WZ(1(RD=k{2YF*b@GHVWfsdVlu4Mg97(caxv}|1b7` zj@X#^Qyzl%zz%+sH^x>9G8RlyOax=Ce?d5q_z%=gzq9@5@Bf}7ma?YUIpPgZd<^dGE6P#m%GI&cUOpDFQ|mH>a*?*HdD{hkVQvVVbQKh}sqsfcf!*t-Mh4tjvT zz!P`@Zx9Zi0NrFf4`>RW0R!FxWh8vZpcZHdT7x!3o{Hy)gQ>tdilQ2WCZH*J3SNSc z8Tg$+;5HNYo`A_<3Rn*|fQ=ye$vwQUUp#gF$lmR1w=aDX^JMS5wM(DO*c-8T-rg~L z!}j{`9pImx-E-4?7}Nh)E1F_?Mf$zcc;;ztraw{6?Xkh7MurbO{Yj|BZ7S+L>d))T zS-x@j$~y%6WXbTPyE_)okTdVV{_H;StfzNm+>M=`4pm;iGXhqX1z>OOm6u! zNih)yW@Z2Ek;BFbUxdH1ZZO;xz$?<9gq?YBfHE_rKmV6*{)3JGBC)GE#_ZyNjOArP z1yB`K18=$Nm&aR0+EDCr`HNj*Z|J^^ zA6yi?8H+Kq{w1FnZ{WfQz z!MCXyYr&cL<;5;ZY8{ZoMx8~v*@Ss36elr%d0B)c!_+V`1 zf2WZAZ66`YSnYwaaQ)i^W36ute|gTNzOo`Rc)`eB&>7d(^AJD#esBN~o0kE^*5QEI z_yR}+g<$8Bz$wG#p4di!^cdy<(bM@}kGh~b34L(c)dp7S`wRryGyH_`pjp04>u8}3+Z8y3CVC?z-(%b&6 z_w$=x3&36bR)J6TUjFoJ0(uFt`Y$(`UK=pn;g2ox`jaaIM%NLtzt(~M{EfSmarJ=w zE?hNotldF>FbMb%j6SpJZ~y*#{XdbdzwsNhOlRgFyJ}FW)_N`Osw&+Wq7%c?d+(llb&a z(vvMoTlB%TOV`eeiik>jf{f%z4w+A9_#6E@*V@D53ZISso>Ta2k^>?QcXOha0ji5e z-We+WKGxU{Io!vZb*CuqW6j<>Wa<_A{GL{-3b7ZlRTPfnbU= zMGjQeN|HcqTNo4vB|u3) z`jP{11ST`~oCOodV9shLDVYZTTLb#m;?U`5Yx&aKlU-{eHa3izLlE}B&}SGsry{%v ztOEab|Ig8%Eh1b053%iLumkJ_hrm^E3)}}LJ=R2MXxwd0Qod0z&X2Huwb#A#cXr&L z{-12thB;jA&948GITEowvHKNp4cr8`!9C!(4D%^aWjW@E;5V=YECtKJDR2uUftTPF zXt@GwNH7WP1^0m2N<3E(bO$}a5U>I41iQcia1dMp!LgY0f!*L5xCtJET&r-+5HPFZ zvjn5T7_bp+0((IEcZSIKhR8RE5-uLc`{40|$9Jqfz9Qk^q6NoiPF=8wypJy+??o3E zP5i7K;yD;5-_H>&J^VNg`L+&bPx(E2Wz5eYV-`nJ$dxzChD8mtIMX>@p4=YOhxg6O zV|ZGaS^5kRr5IwepTB)RV>6x4LHbKqB&o`zj|;G`2+V;UZ~)an7huwt|8kc%Debf4 zuJ8X+m!JI~$0hA^{uXbKkj;1PiH*C0L0~8d0wI7R{n*$-Cbs`Gf^lKlg}>Z8eT&%g zvqk)a>wlKmSpjl`%7BdXHNaxEBt_3~< z6W`E3D42MfOzJUlJDH?BFm7enzfCaK`tJ@4*__dHetJ$e_y6h0oSE2@*f9+#*Wf+? zpaGU34=4r}g7`SB6~HlY3RGQ-c_OF|Jb@4J1z}($7zO5l)nE(Q3od|bAPKwx98U7N zfF*DNJ;6XQ6U+kCdbG30x31v*$LXV|_r;&ad&}C`CG%!XnJ{X?sNliDqk<=Rjq*bH zb6dfKOZRS?{w!YjR`Yoj!91M&H~a#dad=+tu9@*CY?^0=hq-2yfVp5AVcT0VJj*mRV4^37Xe`&6t-IEBYQpE0`GHkDc zjalGhd>}o(O)%E_PlmJU5fS8zMe*Nz8u=mo$CQ%Tn**fJ=K{IG|Dyd}yM5<0;s>!m zvA1EIuY&L*K*spTz%aIxah;6kChfxH9>8xD+>J+uZ_LxvI8P2?d=bRGw|-d8=369` zzW?9-Y5(l}zoOwhU3ddU{QpffH~A?SaXp%48yDA|x4G=&`YI+gP~#ZGy4Z z&v51uFg?e`xSYlio;B-R(eXW|apYQGddT#9Rq4GXpP|19WPVj1Q~?XYB0$>0IdC2% zg1f-bE()M6khVeEL}$<)xPdS*4on17z%&pA;=xX^3!DI_!5MHByaR1F;hD3bJ?H~M z!9*|##DXp0!;24(?_R%q@!Z7|hjy%Au{iTRZ^pS9Q)f&)H+5XFcW__t%&YX8a(w#y zE%UcE+KDD{b%-_XcNBa_0+Ig(Kv=3hi2^RM(doBpt7&c^f-=6+;Q-@i5*7*ugsQ)K%Z|DjJ5tV;cR+EB$@dIcK>U^e50Co(zxJp7vzhs2^nae%mz;CS`F14;F+TAA zISR%J|C(?%tq31?K<{QfzH5ZwroYJg{crNfnOxErhkzZP@AJ67=dm#vzXXf}Mwf~hL*#2aGy)VQ5&#?UnK7mS`aX&3^1PwtW;0$_# zzQ70gf>^K`tO0qqP?Qy@1S*3jpeb+xy?`GW0>*%`U=3Ic_JHHy1TfzUKNPS56@eWH z1j9iX7zx5bG?)h-fY*<1zJ8Q=^Tg{D`2YIR;hTHo*R5O^Gb=vhJ$2HoF|($Q89rwC z)G=g3dS>P*&2wdNcudnJF$6X*ziXj z{|EN`amRmRbJEXA-|q86*G27}KV_rFHYssA7QLG4d$PS)FGogD;zEc?&1evYr3knz7`-ygI86Ppv?3h|{p z{DJL%_Xo8n#D zc7UB=H`oLAf&JhhI0OoBr>LT!7_bJVK^b5R%7OC09ykC;Pz6*4)xk6{9n1hT!P^&) z-#$+NckA-`^!J(LXO8UJx@+r3{96{ib>obU=WqS9lMwh^_cq^+dwtDu$6Wd^iKWL> z#Em0({=(QY3M#LqN73@`6p0zwm{NLyA?Yc&e}m*EPn95BqCr_?QwsF@Q#15>Rokvf zuMKe|Ozr_m=+z1L;u!J~2{pqjP44_K^(h2QMur>ry1@Sg?s#vxEX=P@b3L^yA(_JfBr+pJngej?kbVfP@vmfgUzExyc&W5gGvG^0HfzkrPAd`ktX zyrbWxi38R9J?KP-)^Nj;5t{YgxqPhLLlAE3ES{}DZ+&nO`WeNN{DO?+R{nw9=o~~Te z?&{7r&)R)-zR>N4o15Etx3mJiBi-Cq=+fdZw4s<-bC$8r9c95W40qd_=4yYmG&&b_F;(Q&Y2O0WK&?me59DMCHJ^TeaS2lJdQbfsLB+tI=U zw!d8TdYQ$qD`s8VGQoO}Iey>JwZfdTM<2E5-i?d0nViz@nf0qz1vVW!Hf8$k(82dU zzB=&s@#?pUk2eqPb65G=cgUcjFWEg zq~XCk-i_EA6qNifP!NZEPvfse9#~WJ_&YJk|Km&P&gGqUH10X;uJr>#5K7`uT339e;EGi<)f>QUR*lw z{31AQ&~wX;SLc{{&R-W4(x>z8qvhwM#D<)mTO(@NA7|r(_vbrvsKVB$W0M1tlapT* z9y%%DrDE`>p7Q49J=S8*OuG23cT{Ej1T=>xQ+_`k6 zp0)f~<<+paHA6r6zO3`<*O~EG&o6)8Vd#j>kH?J|Q>e@J1qO$i%T1l;#X(L!CAvAZx~7Y9k>uYY>;oVY%{pGbLrp!|7F_Iol1=! zP^Pc-f|@&m@_!t#Ggs26>67m)X_xD0*xY7U13fzZk^D!eeYc}^h5M!4y!CLy)KPav zB=@i3b#F`^<^H4(fkTsC*?x3e5;@%N$){p>!#1ruyCoqi{`LNRA2lA`8aKbS@_bxy zzIRC}Z`|9MdGo#I4zjV1q%}3p9W2)U;qy?lptSq$jT`@dK2Ul5?Z?M=x;idimnXjT z)wX_qp5@{WUpUlK_Uw>)VCk*#-Rkb$9yC<3E}&KZ#&s8bD04SqZ+MG?BkfL=x9wc5 zWXqZ*-j12os8h}Dt6vm6SoX%a@hABP6RU*0>DyjY@}83iJ7#Qer`VfH#diMUg#nAJ3QKr@7RxQ~v&mi9@3c z#$JqyJx$mCtajgLW`v%;J=M?Y?tpDA z?%zMr>9t=IZ@+Wn4@UdM+ntG9-uRHv?D6Bi1%`IpqU|c*KelkAxOZy7)V8IqtRj;S zNUr8(mrT2Gu%b|T9t@EgP9tC#)stj?szmFXd9n9vjxLNt>>4aX%^-`Y1KDW5OdE9Nb zDYJd&F4+g@+X`kQv#fb!h}UOYNJu2Oi7u$aIduP%?e^m0Z0vmIJbyVI@F ztz$Hs5FN%T=~Kv+~qc_ZO+b zuUE%Kt&%UL1~x3SB&GAAyn8w*-mhML$?5PcNgQoq)6XexM~ea5g5J!SJlnm++2P6; zj_Nzl_a5oKTOAX{-`jk*dWbUWmJpEq=JKHi^}K>cdV4;WPTuh~UvTbr#lqJ)-$pa8 zm!6#Po;t9h=#E({@-(iloAdj+{iiF&`&@kD;_th!@0t)h6+AuQV23)=0J)&Ylbr+4N4F@pxM;*w)@<9;-SGuKIJeoH{9L`g^Z2OM zOVwpO=N@R>e_M+;qv)dh4|4(i?4JEzIB`qY1;502UpZoCUA^bb9i0j{c4XWi2PBPa zkmpTEx7o+<9etbjdgENHbvJq!={4b%%LjS#5BIq5YdT`oy?VvQdyKr&RZ85n@?(K%V|wnK>@n@dCARp3w+`n==Y75F z2K`dD5$!IU&FXTDyItw^f^kJ{XK7rH)GQNbTYXubnCZ)t+t5;>9#NxPd>XOtj{)7+ z?WFhAEcJ5e;l{T+6|{GjA*v}-Y;EJccgZk5{xcW)0U z;$+dHLCbZiT*9r^W&zK;yI|`J zVe%1|Hfh6i*DvpAQL$Z>qjgHir9O*?|pG~_J!5mYy*QD-RLLxX#V!)$z?~j?R1;F?PE%8iG?GF zcpa|R$gHD#_*;wpNp`V^=FWO>H;i6sV;eDcnO%)dOD^#KtJnHW(zV5%j z@5sny+T+Fh^z_)Uy`N+4o&C8|`;ra??|Qc3kLuD{huc*TUK~`m;)E7MuHD!(e0ccI z(8!d=ar3u@*WTt(tf}AXw3oK_4oN}%#+5Gg;AXj_YwzaK-Pv1vpY?AeEcbc54tsO^ z)sgeZi^$FU&imvkO-LHGrNO{o)})#FC7iD5eEIsgdCg;TMTXu?xp;C^e4)0LsM3`x zKRnX5N9v{}>Roz$pc!y@JGjJy8q zxMPF34Z_bR-p^h0g? z6SsrZPBo{i$~T$Ylth+ZLq5h=B$IDEtaV5{JkZub-EG9B}``lM~I>(I~x9#*% zi?GPqzPmQIY~eg}Mfa11n=UU`ol8sV-eX|jq?tZU?BsxHvlb1HsJp34a^P0mJVRQQ zI@|GazL2OV(L+jjT=?a(^OHe?T_?EyQK!JH0^H`^woijAOq~&HUh>J|+Ii+$>}=uL zx!n29<%41tZXY!KX4IhJ?JR@Kbvx0cXkgRif)>MlKOMMS=>hj@+pAKs)7R!JJE~x_ zfcTkK7PYC9c26oVwaUdt-afo~>DYY5^US{7zNO=w$h?I&Mp>vPffQb1&emc~4WRF$DyVY+p<4*amEmg}a)Q~u*?L(6nRy=Gw#q37>PVL#dd9e zvaHL-C)L*;pX53$_(+f9c4G3P6B9=i8qp|lic9p9w;$W~KlS8IKm!Xd`N+)!Pup0A zEjfOu;r>e1^9*V9VRWU-RW|hRbk=qF-mdDmLM>l*LE3MLZAx{#=daRDigY{?S8vTr zwRhs|x*N}^k}vI=Qj;yVxl@Oi&)%&s(PDI^2T{VoiR$8ug9G|MUst?W(^>-tlwP{k zBJO?hPFIg^e!t;S7r#2bt45fm%(}f#?8 zfB!|*sll3tvkML0TJ*sTs{wPjCf155TwiWxE|<8!@A5FWz7xobnRs&;K-S_azyjPd zr(dCyTbqbiKmsyQ0}apu9l)BN!UYk^0^|a@fhEWT$l5<2$PdWvPz8Y%C7aD>_z!@|KO+Zu73^WHVKuh2PTtO?)8nglMzESN!d(Z)N1f4)<&;@h_ zzkqI_J8%O%Ku^#M^ag!EU*HZrKtIqQ3;^Vb2?K!_@CJi`5AX$kU@#a0{J~HV0EU4; z5Cnz;IJ>D4AOwVhFfbB~0;9ngFcyph3-O5D#{MonRN(4fcS&U?12I4uFH;5I78ufZxGUa10y=C%{Q?3M7Ej;0!nm z&VfI`d2j(-1ed^NkO;1TtKb^A4sL*(;1;+I?tr`C9=H!4fQR4_cnqF^r{EcQ4wAqN z@DjWNuR$_+1Kxsn;63;NK7vmm1*C#BK%8m{Km!ISfeNsI13VCb2qYi_HP8Sp&;c`G z4lF<}kQ-QnJRmQ~2l9ggpdcVFxYFb)aEo^IpI)Jz)>w)^90SE>u&@s>ia&tiP zt)kKXKugFjz!kIttw9^m7PJHHK?l$gbON107tj^_0=j|jzzy^OJwY$f8}tEvfjjU3 z{Xl;(0C<9dzzcYTLBI$20zWVq3<3UNCB! z+9Olvdjld`uc3aj{g(Vrs6Su7^!@CBPw$J7w*j`jFnSKe2uzN{x4!bDegVpcefZXV zRRYrMcfsi2A9eOZovwOYcz$aUdOb_@U>!m-Q09U@S@x3o|*k6TA9QfAuN1A{0jEb0ydYhot^~Iii?~Bw=>gAE~TkB__YiKKE zOdu_hYzgGEq}%b!`5#GFBV7Zu8F|dGH3t@e9Mjx@=;g`SBKY(5Uwj167SjhJ*z3={ z6tFgffuDTD&-*@U7cKhr^7Z!f?mM_h1K%D)`+2$RdrFHoL^2NknYu}y(2Vis&*o3X z8G}`Pc?d`!y)ow3m+xIXbg@%;%C_W&OBE3pg9P%qNIIF{lAJMs^r=;V^eZy&B>jlY z4@qAl^FA^@kog?xr(_;R&KYFBL&_ra7;^3;^9c!CGEX4mIXVB6{zlI0q|cG_HR*Tb zu_a@EB(|jA&Bm7O#~oB&2wSobe!vh$P#-3F2734G;XByF+tYhspP`Tq4o!O=DClwfp5vw0{c6o0HpdMjP~%m1Y?{*q%)?Dnno6Z<5PoyJS`#mwXT z_NQvb_)qF4uk=#C{(lp8*o`ziyh33Io;uym!dXGuBvYh3IhME?3NJF2mteJ6tCNzI zdbx#f!`|A@dUg5=muRk_NII=w-OYzxI^tcB(V?{AI6w-$mGsAn6i-Sewj)O({b*zy z6NOAU_w)2@)5FWJNPTaw-hI6M`t*jK&9F*|Q`6`(3~9>g1?<_ghYAf1)h}p5^>O%6 z`T&G%BGRB4N)kwqBKvHv-)BbOGZ97kTNKif-Ye;k0SU=;A)UVk>EVSaCH^xCUf;hJ zH2DNXBYo0K(l`a9*HJ3e`YnqE7KtaVB)x>JddX2u9}%FSua}GxpY-*T4@dHm^$r;` zKG39|^pBh#uh6$S@(E=9Cs5!BkpoFqZ#GOAmCH=So0$dhg4qrJlg?Rqq+2DN(doo3 zIv;VS?zHHmD=#(HO_cKMZcF#I)#UZs2suD|O|GFWtNx%Fs@|m8tsbahG{rOxHRseL zHKWu!G!@h@HJ4-?ZK&KzTU-v(9+qOX9@1VdD_zwt7GGBN_ zpw6Dpr8~i~IuGu(R>?t+-K(w7#%S-Vg0vG=t+aM38*QTUrDmLRhsIGkQuBamsF}|& zn)b|YwHY&1oj{jWPouBNo#+VJnyw}%DQ-*q6%(boit^H6#c8pP!bhyC(1}G9s|1b0 zSx_i$@b9Sr{tczUb_u6YIB^=qdA5kchpnp6ux%8pRD%`GRdW^3mHQP@$|OY%r8Rwr z=|oRurqOkn1o{PS#w?@TGu`R=Oab} zDpWo}U6Mag71U)FqtrbW=hX8Q#Wa@`12qNcO`7iX2hB3NhV}&=psmBK*G^^bYws}m zbv2ZYbx}$m-E-wkU31kI-73`?orZm+^I<>f&a;A<6K7_&gd_Ghw5KIYmSnakTHhX% z&`QXd^=11Zt7jW#4!md~;u5N!SU@3&vlQoqy!0Yr0qrZ4W*Q1xnF2yH?-SE#`jd#GP5?obUZ zSVd`z(h9XjbHy|BL5h>+(-f=CHz_8XUr@N4zgN^VFF+SCccPQcy3@zaLg?SjV(1{V zJ#;Ix8*~Y?H2R~i5R;&*$t=-zVghykjEim>W35}myw@IKPHJy4ziB@*fm#b?D{UEN zX>DDlLfc-MsOhiVqzP8`*DO*N)*M#;p?;*Cq*klysmrTA$S$h&vX`pA9ImpKSE{Z` zhgCDB+bUNnO(jSL*!`jd8!Wo8j$%LdxiFGlF3e+l2pida!U^^?f0rH4r?RzqOD>tK zz^&vObKN;N&YT;@9b}`pq3mj|BzuTEue!;NQGMc?skFSgsu-WBbl{gL8}mNO&U`K9 zKwegc@QKVcK9>274`#OTF3j(IF(#3JLqFq>(Uh=|wh#j75`qg|O(;n>7t$2ng^LP5 zVZCCk5Uz+8`YPgtx{3orLB%EEE%i(|Ln*~IRDN+HWheHb8jE$Q?xGbnR4haVh($qh zDiEzdNGwkUiTScBA|#Ajwm98V~UBw2^^=Bijl%8#RzNzA^RiV z59x!T=M8-?k+>O>9NpT0sUpjw-ou8pq!;BZyCy6f%0Qf&l=RX9`$Yp z+ZA8m!vkVx=789Z*(dg7_KJO(U1C2bUL3$|6$dgKL@y>z^k!nQT?Y9##4kkp0_e?y zel+q$BY(8m9&&5MyCA(8^qN558TlF^e?yeh2<17W+$Jc$8R~ICeXUV%d(fH5eh*9N zkD(cLoo_;4<6Y^?d^`Fa--$lScczbEyC3o{#P3Aw~$0L3W(nmor4EmwS z7lQnu{9MR05kC#-Q=k_P{Yl6-0r@AOoCzpz63Pun`BPBOG}Jc}_0Cn0`m^6d$Be!* zlWRcFjDf4zn^+!1;ecamPgouwCZ7wGxiC4BM=I2vc^2*igY zJ%ZZ@c?aURB7F<=wnBdg^6jHZ{;$_ilD*87U~e$R*n5l>`-rh*A2T{^CCD7&S)_C9 zImjmwe-!DzL+>c`Pa@wrhUCw_21832#8y&zu~n4=*jmayY&~Unw!X3pww*vbwvMt5 z;#;vblrGR|$vT2cpaSHwh%b%w640}OzBTd{L;j*D#~S68K)Gd=r2Opnz+k5;>`uXf zJs?zKe;3NKCxjC0Nuda~`5{{(J~z@W*)5RQA$|?gS3z$L^w%NZ7J=l?z6L{otjji( z>ab0u+H4D{7V9e2VB1Jl+4hn>+fk~>c9P1nouyLP+CVOf_(Di80KI(B&x?F{kv}h6 z7qS!Lt0CPHdiKz-gnV|$UlHZlp}a~c*B<3NqMmA~&k6O`l}P>B@1em8y;N$srz)4+ zO_fjXsIrn@EjsDTKXL%b5{3h1Rt%~h$Aiz-EG z4LTy+4e>ppL(0#74-Chsqq4i)LD@@guXLB&DF?`{l>=oLg#}dyU3*eukT?oRW_* zmrA7m?Dx>nk{P9yOe?MBRHl^tjwvg@WXj1;u)PoYHe)T{WUR2YglvX*HPU71siAL% ze3mlF|MePbGCQT}%mJwi^SflnoRDmplTvYP3qvk|`20vOz-)oM4)JS{z6yG4puZ0J zwn!xZ*K2sCqSP-{ocg&+RzFnf)VEdU>MPh@fP5D5XOMmtbJh#0*YXwB3;DJxNq&g! zbI30dPx5D9gQ2AzWZmTh>;QQ`>n-nPedXQk5P1h1Aa7*@<&A8RycVni%ONj8{34|P z3cdNzpND+W$Ul$m3Ar2MyCA(I^x8qcE%LQS{?;g`HOgy?a@(Q&j;N;#>g$Gjd&;E# z?Dx=M$17|(bs}3?eSxj2KEu{jA7h==2eI7)c?aURBYg*30&-Er7esmi=oN&1QRFM3 zCi%0k!O-8UiG$>-q95>=9mQd?y%;3hi6i9lVu)-jhRUTtQG^R3J}-3gKtHe84{~qB zyCJR@|OR0>yl~hvQMzU77l?sFWz!I_r;&n(@Lr;djh2}a75B+k;XN&x{D90A%l|#AZQNA7Ou}6JXQEyF9Cx<=EItIKvMb^mS zaxQtSoL3H&^U1@o9SnI8;=N@aTN?5w9E0~b25)f;-s2d2!ZE+yrlnY1<02NuHa}!b#OFe~rKT$6%80Lk^zzWF0R76yS5+kWv#-H$l)Gz| zh}|_S#BQ3^Vpq*tv9o4_*j}?)Y@^vKx@fkE&44qg2e~%lYa+cG^r}MN5&0aE-%+y= z@_fY4LHbPSML~ZW@=ZnlNR%@bY0Q3=A+()V9Eby55u&Dq)=@!DMVXB z3f7j9g0$tN0BuESu+~l*q^%@*YAZ_~*!G6p1M%IE-UWJ{px+VsIv{^XZGOm>h_^tx z7J6#vOUNf8zld@~lqaEFHOkkb9t+fGiF)%(r2g!Wp}|U>HE*O&niQ#>hL&A5tlUJy z$@Q_V1-Uxnt0BF*CP}KLc_h`>+?SeY?n$oLwu9UW@g)D(YsjT_mMpX_B%QXkBx>7B zjJAW6qG>O^)3laeYg$OJG|t%8fm|K&j!1Wao+I?DBVQef*9iJek%W7ANB|$M@1vww$b0ggxdOGN9kWY>L8f^sR@rWOd^ib%H zfPN721tR}2loN>Zf>7=Vlpl(EMx(y*s5e3+^?!X2!!_;Xa7|}{ z%I9nzz z;$p>G@i#@RxJ0oO+l7$lA$|_hXF@Lu`csi_D)LVi$3hN6d@$07LC+uhgOSe{`F&81 zFUlK?a{W>MFw_%_`od7}SOuy7>wD;bp()3zG^JTiQ=AnwMOaBw zfR#0t*qT9BBVIr{3q1z+pwfu%_C%@*}%dfb$@^h}Ge2;4=U*u}ahq+4f7Ou3s0%iTm z6_um8BJw=05W@N8#hj(Qj5C*GIjtPW$?|%R)Nk--eviMsquxhT26wxi5iAr}gf!~D z@R&*xE>ItZ{gg^vOKHXVR6h7tt;GPUJp8Lw#I{sju^!b-w4>UIMc`}IQT=cM*-xaY z!6HxjLmnpPr-qBxRH#^%8U>&0SomDWBF_l16?EJvPtl9&B?eQS#R#gkIFD)~u0okR zsH);|s-k$6Dk(mt3X5q}9#N;zh{Y7FXs<{W$UbIo1y}v2C_xQjuBdx5Pt-0N38>0SL;ld*LJ20XuW7&JCc5_nML2!tfEh7_R-rk7wILMXLO`S#SGUJ zWZX3lOlwUG#!1tcDWwTv%r&!_6gAnW?Du+sey>|lPo$IFBPoHqE1l)8Nf)@Y(pB!T zbdTFAJ?F53wd7f;8~;S~=1+?u{1!2ipD!-tM~UnB z{^B0KwV1$H7q9U);uBsgzUMy)D&eu96RrsPg;PQ?;h<1T*d>$`wh0x5ErOk}U8pVW z5xOHjR5&6`5snHG(3>b+5XK0%gb_lLFhrol{(^2Tlh-S627Grh5ZiWM@fVD`H~yINovI(lj`v|BnSSbRGO#d z!n{t-%@>e0ytORwrDc{cBdhq5GR+s2KXG}`FC_G%H0cJHjAQdmI?a*eWoYZ)U8~3LdaqF$Tveuds_T-p)|&W5+2sutCaYtgmtb>#dAteZVj< z7R&@I!ESIKJOivMnzaIzKqJr|^a2Bb7wE5A!1h!vW80}Vu#Hvw*lMZ-ww&q;TU>RQ zEvk9|8gNBb8osFN5^xZTtEveVRP_ZXm8;M~3)r@FG`7)fPv8e8fJI;zxB@#4lL1u7YSin1iXP}z`=Q+DOIDhHt54dSyO5jN{v z=q1Wo?uxTORj$5#pRFU$WNXVlY)yGETS*RNOUR?xJaPmp$g|i_QVjb_TFNF#%h}7) zLiV6Ek6kOxWamoL*wNAy)=QcUFJlB-PYP$tVVf6m4AP#9GuT9NE_+0bVK<3O+26!9 z>~wK6J6hb$4iu$HT%0C! z7RL*{#8AOq3>JoqqlHLulCV^a6n2O+gwx_2;ej|`NEKs*+|nYUth89D4>}|4BgF{g zrTM}FX|}LQiV}`X;leFxwD3*}5;XE4!CLMmRF&HcP31;H7uiARFBcPr${Jy${EnX> z-{dFDNBAl7YCas^l(DiOA0)TohsX_iFS#n;M=r~Em5cDLF$y=9CEf`$6g$jJO2|o= zX*|FT<0i*oHuFw8$32x!ad)Jn+-2zymmuxq4obUlmfFUxkT!60rPbU-X(<;d#c=(k zIb26+8s{uc;;Krcxzf@IuAmgaX(c~SC3$fvVt+1K?87}1yK@i4j@&)bmAfrA=5C2~ zu&n~QJoiW}!6k`>xObu@M@t$`BXOLSq~OX+De!W?XWL5eSa%R4ePpLdY3yQ2$!(ED z?wDkTvuHjpNh-!E=AYYyMtYZ{|nf) zY&5$O>;Y%ML!jcKSsTy@cz}su6*va&gEU~q<2(Y20vmo2TbAF-R^u zc`q)UU&$@uA8%TvN}-b{GQTM2oE5;(7y798-unovckFEkYJ4Rygy z=p*aDER3!@&^X33`Bbpb>BcHozRD@)5#Aa1QJO%fM6+1bTy(pc=3N zI*`gm2v5Kja02WFo55NUr6Sv3GX=v;T>lu zyyi*?&$$A^Lrxa%a4GyXE{RX%?(>(qJNyN366^(Q!8|Y)c!74n3D^J)_`u%b9|Bm5 zKMNATDfR(>oPEh3VHLuD)?C=dS_|9QO2THgrm%^vBWz_G2)o(l!tZQH;SaX2aFZP( zJZ8g$m+S-~nT^0ULU;tOffHamSOTVi0N@6i0((#tm;n_?!Fl=vNX5CFXG3tk$p_b& z+;DBlRcOH07h1B_gx0Ks(1xunv}4N&9k5?r*gPnY6Z){pe1G;P@53JD1K4$ZC_9TE z&j#_4Y&U)mTbEymR%_%yt++{CQ!bEe$PMJ` za=p1aTo0}`woZ_%A>JP8<)K#+`bChB>_7P&?Zcc#-2qj^Ecu2p{zWE>yjRi%^f}=Bm4LOVp0s8nq?2Nu9!OQ$J(l)tFVPF{^}! zez6*}N;PJcYRoFtm{qDVt5jq50Ybo3upAr!w}DC%&6WgBzyL52ECstj0=NQhfZLiy z>|@PV_MPSuD`*+cO6$N?)_QTxv@5yZ+6UZlZ3%vcwkIE}oy+gm9_JIZZ~3d*yuw{= zIpKlUL3pCACcM$s7nC|z+&AYY*ywzOO1coCrfz~zM;9T~1~q^^umwdxE}#O*+6dt` zI1P4!4^DxdAQnV}a1aWH08h{d^Z;(4w`PLir3n#+YkZ*R zCd|{g3M)1Bg^ikO|Bt;dkEbGh-*%jtIs449FR2u=FCn2tLdY&l_I*o=ib^3%+4qno z${MmIRI*k=qC%DyEm9;QBB|cz^n3ZdfBfFQe*e9HynQ}bRY8W>~Hlt?VJZ6sEj9EqJKN#X>&cxha~ zAAuxDnjQ)EZzz^UIKnOr2 zKoUSEKmkBGz%77gfOdc$fL?$BfI)yKG#s&$#zVYElOZEroX2hE`C*lp-VPX~S zD6tygHb5&tH^2*kNq}Vl6g^7Z03Z#Z0-y(Q5Wo?@4d4)f2MX>&P$!~2YDTm`HHb#2 z3{eZ^A?`+T#BJy&f*9IO*o4*+xX~*FIvPzNq5cF2^&&8#&V)ZS2f}ZfGhvzLMOdWy z6TZ=+314Ve2xGKb!U(PVFMoy(h8~74hCYT)hF*qlhJHpnFxrFBE{yhJv=gJf812Sr zzm>bt|4GJ$`|lV(iYb7_4$sNbh`&MSh7QoZpzl~Cl#P+#{g@&A1HA~BqP?&kiXmL6 zCi0XPfW*-%5M9~`LZeX$J>cFTnQBisNR0qvn{vV!$Q)Eqz7tMTxQVJ1Wg?kkP3$8F z60^xyh;HOoq6~SIxJV+9nn>c{e%^?*pLB{uBV8qZA=Z%|5g(JT5l2a3AV*+FWG5>U zrN}HqP4Xv#1G$NCmVA+rPIf2MkarS#$rxdV{1%~8Zh-j*p@=c%0CIvNfTU4o;d)9l z{FV|26R1|OG*uKfr_Mvc)K=&^H4Yl2T0$^w3nWjQ#XHj)@F}!Nd^^nq|C45pU#3}u zT#XYRhkD^*)E7@g1Mn0y1W!Z5@F-e}pQQETAJKl|OK3t+1Wg}urJaH_X!(!;tp`kU zUV=ub!f*rC1kR!c!~WC?*n;{B-cF?;98@J_j^d6yqog4>C~ZgrWga<75h55+Ouz^- zj6ee;)-UAugf220v5dTz7)w3|?o6%{^+Dc58sswQWGT`tDT!1?S|E9oY{=52RxrL7 zrCcY*Q#^?C6k(zjb(GLTy+RP8*$|>=JOscL(L>{qGO)iW7!Gm6Zo|!(56n#$h7Z$U zLrq}TEXtw@S+M-X=dzUJ$5`y~!mM<>Gix(*7VA;wr(k9&6I%yPjLjEk$hHyZ&DQ?6 zkNo#np_L516e$K|aH7C??E=W)oFi$I{7J@OlxIac0>*QPNKPboFz)jJ<2z51A6OSm zI!1~Hf2EL4ld{0*FB^;oFN6HfB~l0}0r&_9{(?x!pns%+Ei-}kEby%?k}D~lWDV9C zk}iS~Wg-|^#)GU;42cncTyZYh7nesqf-4}~f?Tozu86FKD+bH!WIJ31SYHV~zX`Ux1#-%F!1o$JUb&fk z4&;`@KyEqwZ*I8_Ex8m|O)di*%5ml78j$0D0C@ESelG#f zK3qPquY&bgz~@{lKe+TOqz~?_` zy2wwOIL$u%IFcD=LiefLy-_x*1VK zHz6t@=dXya2R1KQ&jUW^K+DR(NR>9>Vt|>kE6WQ6DS+i7c5T$`z)$N4FKB&qpH*} zRE-)AYIISk7Bv>tp~j>7)CAO+nh5H2$pDv7bLtiJAoUt*L9GO}t2)$*+5qZ&jQ|a( z4X|y%dRy?hJ=o3>Z0`iV=M28@4E(rL<3J582GqkMQ6K6B^aM2&^`o9cPXP|6ss89W z>M1lH@VWx{6#||)fNwnD9t7%Or>Gw2NvaF#OLat#Q|(Z1P%HBSdObny%nj7gz)UU> z&j?^Ys6Fll@s$A&dB8^sKoani0+0uMl>zU)K!Xm@VgxjqgSKO|-@jWJ2Wo-Lpe6`o z=g9~bLMCBBWGZ$R)D`{7Y}hF>7j}}&jd_!KF$XdqW(?|!I^+#txe3^Um=9S9Y$FP4 zjgp|wD1!x%$1aeSuqaS>j01JYI8bklCu;*3VToi5P` zyaezKRN_CQY2^2yD*qBqArAobqZh$48Q95SeG>RQ0c;l!wvPkfiv{10{lC;vSI!cB z$Pau!G7qYYGx#B73jY#R5l28Z@g1ltj{WZ{<7eb0{tNOLKZP`cienvq1}x`*y@0#| zmB&#~dHjH9B7DR%6UOl{VG?9Szv9URFz<};9Zw@H;V}SqkR@FQAONb8;)LILIl>>j zB7q4~22dp6AUObWP%RZ8K+rk@0KlhUh1-%_y=CdW-NtuR*o-1;P#uA}r8z z1O?Sr3e*d#tH>Ixz)&LsLA9XzT7lr85`b$66IlKM8Q(wnTI4sr5m^SA-=Fx$ z$P%c`{s5KPANZB)Ah@)xK2PwUo_9(8dmYpU&tJ7NIkGJ?>9Q%{%pvn8)_ zFIm}{@3Lw!XRw|H&!3bto3M^BOS58l66-GfdlpZ814|k{m8Avm%`$=4W?_W{SQMe( zbZcmc9t7Q_Ux5E3tz(sa5?r1YQ|=ue(XK;8S8~0dMmVnUIr=AFF~gCbI@_R zJCsD%1JBUNK)rM}Xpa63jBb1JN-R})YnC{C5X&Ka9*YM4AJS2Bp=+BSJG0DyR;bO zAuSAfLJLF&Xs5t+&lg9LLk&1T&K<=yl5aIga#qfXfUFT zh9YWc7@~t-Kn&4v#00<;-~bwl=zX1Kx$7jH4fc6$-0H%-| zw4X>WjX=0aql1wpHzAa^9%LFe5CUoI2&ZW51aBId;1043wzOHq3}hLMXm1dPzLoa* zKgVJJssAyawG_n5;+~WBs6ycVhes(P)M`o+b%v5j6{BWTZK#>lXlfF*ni@tO1T&)+ zs0XPmG-awVjhm`So26*b9#ZsZ=@es{JAgdJfVNE50yErp(=LD+YFgxtG$NTydkF4u z!$^ZvRZ=~5nV3nvMLZ3%&?Z!Aq9my8L7CguoOnWP&V=bdwR}26+rlBe%i+AaUk9_`FTq0i0C+dv z8Mek7!h!fba6VoReu5W=nIK_U9>5C{hfAPs@Fb)L%fe>xS@;P22#$d_Amy+h(homH z@W@sID`H64j2tD%A+ZECq?B*~X(zZKqXb`si5QNoBVIxjh{cEz@ebk%@|I!5*T`k! zSEPoBBXkql2p@<-AV0dDz)sR8h?6V{s-(k&gQNh$5mG!MlyrrVPO2i5lUfP)NWFwX zkV~Bexm6q)B65;Bh+4GQIEWfXie53dV<=_DY6^!0@;_COb#PnAtw{BlXF3p zxr%rXRF}KS-NYeK>3vV0AWo4NK+Ogs;V5(xg~CT-rwEhQgBr^giV{hRqDoSrXpweP z^hlZ%BNDj#BAHQ4Nwxs4;BPOAA<37rpLCX@Mhc}!lj0~mqy$jIi2ya7)09q7^C>6l zP?CsJ6h9&g?rFb})rpVElEex!FENQsCi;_q6Wqz)3D)Fq1atB`f*Sc5L7Lo3SVz7A zYEf4Sv!q1AYf>}AX6YO zJV0zlnu(RjHR2T{9^_R|f*h+Y(HrDH?GbUJA;{40LB11YkQW4gq?tfR@(E0!MlcO~ z61rd!LMc3k#KQT=G1w8YfHxs(@LO00&V~757nltefr;=J2nW|dzo0;98PbM+LtGF9 zf5KDYdOSCrh!=)E@yf6k-T)TGyTdg6d3c_=0DjBd0Y77&h95HXBCX6?NHg;pR9o;4$(?m<>E{ph7W2JV50z3EVf|q5MYPQWOXX^(dH& zQbf?9z9x8rN>LIuMv_=T}UFK1IYln;3~px(rYD@;Qo0yE4g1%rwj01fk03zcS%Vl2zL!eg0?sJwh(%;B zVhK3=fcehE95Ru3kqpjr8vB>) zzZEf}OQ8ygGZ@#Hq7i@DtSHLN%v@!#Rz_p~nHo0KirLKkOq$bTyDgIE^0p%YtFAFi1^JU1hLVMU3eC(Tzwj>IPUG z`^#p;)c^~9gki5Rh>VO} zWw6#ZU_=i=zrlCV-NVoFC-*n)!$kb#iJAOWpo7Y2bsQh zkojZS|5lU=qUWQ7@GDdRR70gePkFz}ASftkmBCsSWuvd)>!8{)3UZ3i0Skt`qUh|| zv#b8rswf{F0R5*6oeX0qSs+gYyl<#77TlZ!LehaquQ2fP z@>*rERz-~H3up=~hrNY`01Jk_;?L95bJgEk6@5iB;a_M1tc<;YB>+c;{clCz(Nq`@ zvQK-k0l?xt%&=D&xVyWrGFYpkWi$~cW8ttS_7t#q1vBgwf3B{stNzxi2oK&7#DWFE z`dAm>I0(2#{Rc%P>^#hk`NO7I8({Ga^t|({44j;tRvD~S5hMBr>;!C$wEz~6|FT(8 zWN&Z3>Tj)z7~F)gqp%Zp7dFG%|8o8JK4L_dz&zkXSS@UWwf<$Z!ob$nc9p?@Qnd0k zDkHiu=JnU74CVs%yA!N{xxqWZ`h6f9X$;!f24o}MuzdIkRtEcERq#>l#^3lZ*qy)3 z?LlqT0;_}#z&7ew3akkBxioeL7Qv4FRrha2l0eN4%oaY0mHze0uvZjWSy`$ySI|Ua577TlZfv&FZDucBu@&VCZ!CKoO5#s>W z5HkD*GlP3EN0?!+_}ja8@2bDGDoO|3iZDF<5mZx#0Y`@YZ$*sgW!N8R3e$n#V&;F@ ztT0efQCVfMRz-~HHP|9Fk7)oFMt|9?_}jH>*Q&p@Dk=xu?qc7dWo!>T1yMMcF`e`{6L zhD}3#*eFB?l`%Zv$guyd=rJ|{y}({WTwrDoi7pQ_>=i}ZwryKwuvSHV*azqxHU#Qv zn_)U#3TD{WNfXoX!n1>=i|ll9H^|w|Y-y5nYs?4>{030Ty$A*{m=S5D-{puvSHk=rZ(d$c;VVYrktFds|?nvh!Ne5ejLiC z-vqN6TK=+G@yE{2zUptSiWuCEfcduh^a|(_IEEPZzZEf}`_kQ@Qu;M02OK2~dxZfD z3(G2lwJP!g(a+Ewz+8!3r~t5F*em`p3|sZLRz)WOw-CA&bc>$#mm|aew<3QKJ%Vlq z=A@)O z+nVTUfUD_$P!tcMU#6==eW35R(Gwtsy~2P1=4r3>{hllLU@0Ja9$f{@qX~q%=+O|v z{&$;Z(KVnFx)L-(KMiKUT!0w%3IiC1R~f9e4H(fY>2lCV`Y~u2%;sU(EB=_78Sgz` zc|-HR-&ne$h{3IvE&+X^9|j!#|8o7eq6)e!)Ii??=JL2gV}J$2USR-AZ>tQ}s%VLB z2i>P{T4lko8E>9vyakxiNB;Z)Q{%zE|BCTnfB#nxWW0xZMI~b?41RTDWyyH2HG|8) z|NY(Q|Nr;@SPKM${Tc!g3J?Zx9^e8%H~`~!1|k8X0HOh60Ac~+0OA1{zdw)&kOYtn za1kH{AQd1DfbqKo=>Qo3nE+V;mjSW?asaLXTm{Gl$OFg+C;%t~C<3?!Pz+E4PzrDz zpbVfKpaP&0pbFpyKsCTkfEobCGu(9mw*YPf+ySTuxC_t#&VNECc)k_zm#)KnF9=zO#P1A9WOs!s#AUDQdSkpJJf@-1n2b#Gph{ z#`uz(#fy>B2b-qfiUe_NCyUv%j;D_^pYXf#1AlO&naivBcG{=vwEXl29yQM1eNOdA z=h=>J?jIHdMSk(BKi%g-;9IcE_2AOXbrujPh?^V?+!xBqlii$Bccqo>)BS_WDcy%s zB9d$ZI8jfX3O}Fg&Xq;2;kq_6{D?0mN4u`(*?Sj~MqQn%H{J zi8??(Gw_CVfhVHj2+H+L#q-kie1fgA_`s~e3`t{bw4n5%z17sALnEIpjh!ZZBP~s&Yi=gwaHah)hzxlnp#zB? zXRDfdbU35)=j`6?=Mp!0W&ZZic)H2(IG*2^Jm3A0rEpHF#kKPk>izWg2MNQ2j}K^4 z_)P+ucg|*}i~kg_xV>@9Set58MWmGJuTAu&8+=ureYbsDeYS8}2uoYPzvg@8p+|p0 z?5jj&-_Pt{H5@d4pNw4?9xV96)4kDH;(O3fB&o}QI5}#abp#ff+ z9}bK0#cRcc$d@`4DA=%Dh95i-tjbx$e}CyDd1I<}OTySs{$iyDo*!Af)w_)yqEv3L zFH;bccDWg1<5E|6V8G|}V-~C0n&!0UC!PmKW!Z0e`|Je1KKl`lqpL#EN7vCorZ#wQ zqM>&+QAdh-(;=SlySq+EAI&ee$#?%G-1DuyKJoLASz`=KF-p|?jOl0Uv}>5M z{LqkUoLT?ftZH2+ul~SM^BgNK>(BiL_j6))nW7`&BlZyfbE3hUhl;8XK6_X3y^qLs zxqX0p{>gFeM@;(;yfqGsxx4{g1xoH}b#6Ycxvzh1*M9{RnpJd2hEd zU!or@H`ut#Lh-^xjY6Zeq(E83SGC%>aNhXL9k%@Owq{(q7DOAWhFYnYOnFdBWn6R< z%kL|Htc>c}^9H?#-mv^xFx|V$4(fE4q^a}T6kpjDs^@bc;_CeV-jNLayFx*a>xZ7G zW;-MnVJZjKv&esY5Ja;W9prXM>1t^d?wxV}_)bJQYe4+4#`ykq!kb^SYdC(L(Chu; zi%zt)SY-w3Tg)=&^L4e1*FCG4dCq~yMLWDdLQC&y3mW$_PA$ot8ZYj%WGDH zT%*s2yqtpga_~>X_NGeWcVt~)ITm}ms?nY0zSD2-YiI#A!|sNj|H0?`TMA|0n0m#> zA5y*^C(<$#TKby9d`iW8LyNhx93*}BxQ%AL;zHx$>{5$~Lt>pvw{B2vh)SOW+k!)I z-(rjTh$&NvF8bjS_v5y~)pZ|B)9HA3Wo2G{qMgj>;ltLCqij#wxd(p#s6c=G;wSy> zTs%{Bt*q8-PfAR<;r;Sc`&xX~Kli(tUPPi#{yz5U&qVly;4(L{t@Qet`9sfeN;^~E z375w9S=?^R-uld^ppR?4hwVM7FPf9R+}ww*9&))AET}Cqpd&iweOM%;a=A< z)pIr7-`LGh+)j`0pA)~u?s`Y1;mF`(^~(q2RT0TIp10+Nxwam3qi#S0N1g99E#YCc z#RnteI=L2yb`Xai$`b1K%fQFNn&l z_mokq3Cn9blvmdmbEw3hE*i6`uhM}se^Ib=V=a>~%b8BRc{*V~({Wp$F7-5yTY^Pf zcZP@val}Ywb~>ho1jw+jBhsaPC+@aP(Ipp$zbZ=7EY! z3IT`CADic4O5oSKDfGVc{gXf=5xWM#y*}stZc1hLh|4++<&N)HsQo#ZTP?WflFdf{ zvX*4gyw^OW3Fi*^WQQI#!f52?+)3E##w&zzCb~opL3s`cxO&b`)#g(1CaVkJW&@%oD z{|qJF{>Qnqj|!hgX~$xBl^b;^g)ODy=i=?HFYq7lf0W>{`D0GyE_F$Q(I=0ue%bY; zj6+>SYL+4CS>KQNjSUeF&kgUM4!Za&vaC6;G~Rt-hBnRI9=2qZ;ebhogxfXkM|qWo z&I{NUrA+y!D4pK_wCH#Kqq-kgPRp_}RLrE2@IK|M&9A#%*>n$%o|xdJ$y;5#2Tt`~mYs`j zI<)5@r%6E)UW`X59+&C}Z<|@d7A?kk$I};sp1r)vt1y@FORnxdqt*dofb#G|l(yi8Bez62Ew3#b-O1Xk0@* z;n@*B>aN7lSL+Vw8k}K+TOSZfU3_$*@rZDJ8_L%d*XEM~_r3>b1X&Dfrzjb3uZVeN z@lJW^voGRmrziA_;(KNcInd~|F(>&@SlphIR}Fe#tGj42JmKuh4TkrRrj--#EUDe!oWAtbm@2j-&P;rR zYxZw>5topYftQ|Io(UlGjFcQIYB`~3aiF>N=S@Y6py{o#1v3s7Mn|Orv@G4oz7reS zpKzo$3oX5@k$>~pL{0?v>hK}4@LS{IA4s0z8;;k^e5j9out)a0XzQb!YM<^O4wg-< zdVIJ|O=iBdQhMt|Q@_N4A?nus%I}-mcOUWFlIEz_lUH@N>O#Xc@Pfxf`PSz&TP88GCk$7&t#G&QjEDc+5oe}X!d2gYo@)tf)KJXS(^`J*=lt|zt9)^wmMry) zc3eaFr-Fm`Z+uVjYO{6RLwloP1C5w+i^cnT^24~t!IMR{0uOR}DtJGWysDl@j|x2+ zE({ot{qW~$y3!WbxJcXKj{N?QK5E;OZ)n!-kk?E&&7$Wu8`hfG)ZVs5@v(aG3-&wm z&s!{=s)a1`GvBpL6}~np-0mv6SL0W=ayQnD2ra$&Yyb?@wVsx{Zm+&d|LHhTlZA_PwA7oCR-fOjjhjYPW>W7i%MoM;^B>h z=I{4(32k3ITbR2+;Co0zBnZmj-H*$}A=E(hgpPbEgLo}@bvFWlSi%0E$f6m7f zwZFGLmVTCF%T_)bHn(R-^bplI=w!)5ujl=``DT|!MBm)nw6k46ZAjqIoqa>Yf6jI! zM5f+OwL0y>apKtXZ+yQi@9(%fqT>JJiQ}Q%%-*W+(p!_iucx1yW)uCvTz_7HtA25-THmL#!t^EJS-556;fe#>v&}o#ivg{hBlpJ(Y}_%S-8RG zjPnb*n-;%u;O$(Kid#;1s0BY^QHtGu>KY+%@=-7$T%?= zgiIN}k5XqYC;K@sRh`frt$jd0#mRnLPN4PHwt$YPKAn<}>&=`c zW%a~(w(l>_eRuq^uZ{jzi5E+2FeE1l{GSH|+; z(DD0kXW}a3xO(qI^FJ9l{_xnhcb}JH6ANNwT^}Kp3M~dM$-b8&0-mSCGW_IW_k#fm z=kG51I45nXeDk$ctzQOTeC^6tb2U|YtGJfTUh=CV+YYvb;cAHoDrX~~2FP|1Mm2ud ze>fQ%EPuz_M!}`f-C^fpS5I%Rahuk~$;RwJTF-fw%#usblK@N}M@I z-HJ8nPu`g3jvv{>w&2w6QJK0cT_T`&OIw*_%Hn5w6L+&!mwRbVY2@a8#4pnB%^!a~ z6xp6^*fM`izubqzP~`q&vO?atvfs_O%i_=9mWNy)ZBn8;PKs8IMiK^x8X7c=U4Gfd_Q>f0HtECsp z%g-mIYFB7-evm856R`cQemUW0uYB*vdjsF;zvP!nT%_-C)|@;;O1uZ@yfWAky*orN zsfsu8Oz5LxlJ1wNKpEOds=kLs+sAzg`+fXq0#dTQzfN2fED`G3CoU`EL49{+8-K@( z<34vE*TF&Y$@Uk#JF-qDPnflxFPj+*-S%O|u7kH)^Z9F4TcNv%-*LY@twqcE80~TH9T*h60%nz_qc%Z`%Tx=uI6!6 zowZst+R4?Q4Yx)VY`a(xnCf`wv$_f#^X1i;YFtL1xpuYQhd>{W^`3fCx66lpXNiw< z3A25lQfB!MYI#pIITi)-sP|W7OmK4dl|TBl)390P>n8m52q`s=WAmwUy`0$*4f%Jw zCuIYQzGUEM+CrSWD=>=Zgt6*|Xw6pR6iS3yZD_Snv1?U2L?8qZLjmewW-Sv_rw)PX^HK7_U_)xySNsQ3p$py zNu1(4&u^D_){_2kST-E@~z#-KjGl`pU~T zK_q9+ggVWeOGuezSKZhTY1XZ8up?!Ejw@{~z4E@e?_#CynGm+<_{yppN50+8E#!m7 z!mss0s`HY?b$uNRi%K-==_VBg0*=3sNB9QA*;%(;?=kx&g+@d$@_NHwiNu#xwesH@ z;cyNWOjVcTk&&NwoH&9%LMi8FrSi$LglV&0dVPcQhZ51D(ZeuMSrvYD=vS)CwkgxR zrTP!K5?}HX51t~V9kV>Lo4OeBB>9;&)0`v6)8`fb7o+mRKOodN?IE{nr^XJ!^>%ID z<(bKPJG?1`_@tdsiFn9_ll7QWoVvQsR+hcoZf^s$;>IDd$e0s1zu#To@FTh= z_W5qFx#kkh+E1Hm+}KCoF*kp?VSZ}ZRaWD$=CkaJPVY1aqZ8-8Sx-&HpG@j+fS6(h z#~Ne(1iZ2vr8kP+N-Nx(`X`{(fAixnaXveLv+Uhg{=(LxAYxu4Ktsf8%UPlZd3c$U z(0_82Nvd5hEKpKBOe;J`Zg^NxMm9D-iPZH#<8E|i5R09t*uihN+VrQsMHlVfr5$E9 zjrkh3d zhB@H^d}GHt(R)rMXk>wu_+34PGm8fcZYq3omHhdM<9eq5wa?pUivr79H{O5evzzZ` z;>eb}X$`+y<6`UQlU)l3hw=P|p9@WpIJKHf+Gpq@!V!w4o69mb^92fDs4b@K6KUT5 z@a5ZD4m~aYO4(Kwze}G)4OrYDMNgw`rf+~T?wOY#R5&{Nj?X{3 zjH^34ET-tLs8;)}hbT82hgYAeYjxJQ6k&UV%taB|(>D4wKKdq4?7Z20qT$JEKlcXMnu$@smS_7r;UX<`O z;2`GDzcLOyRHOYyZ}PK-xDAiXt>`{WiSb9naqHYV)HSElj7xbBKECn^MvTAl#acO5 z-8`x+bI9B&bnF>cR4HS`Q=-yCkI-ekfB*U=wJo)UO{rdgzD+3^c=Z;Vn@cp9B)r-h zpGAu^E#5P|^Nbxq(j~Gp2=A)dRL_wl&dRyVtfPMDn7qQLw>Rr=9lo0EvUf95+0$IR z{@Hrotf|if*?vALUGwLOM0J~i!s@ViUSmLKVG?uXlJ*X_`K#c z4&CqTTYvL2XWQ=Typ1@M7)Z~$s(1(A<_%H9{n~H4|J<*6=#(bl;A|v&aCy?bu{XiANIrCIplH3J#mlL^Ka)nd z{I%}=DGsUmsXcaaN)akJYS7P8Hqbx115uqXs7^Uxe%hcdh4>aZQ`~8Mt&+MResuqY z{JO>5JIWsZJvJm>g##aMM#F!0Z;X`aQr$Km9@qI>^o@sLxaoH56N~UxjwfM9K5`Pi z3aMX7O%uu(aL~@xWi*=F zYJ4g_%69N~UPIP}bKD;_zE7O1yOSU&x3Bo?+dl#V=`#6;Wp0;&k;R zG)A3Z9H95%$Y<^0UOQ-U?t6~&>FA9$59W_z&%ED`hKTR8LCVRr#Rr zRdlmxRG1_l_xozK{EKyLe#ghBCRuCh(;Eq|9WC}(y{wAQ<{RaFYjWs=-!F}*Cbsnt zY%AX7)SPM_Vfp!f;pPEPvArFSiqE~cA_u=aIBS=z>b^)6u({p4Z_06e|Cz1(vz)a! zp}OIqtdFh>y;=<|13ms5B+3%XnoNt3z{2q8tI3Z$UWb@|@7TVBmXa0H#CxlD2i~V| z-_ZVH1!b+T)$82)WY0Dy7G$Nqm%lB|UiwZv-9qS3SnE4~+ml~h6<-Y-+E%KWC9!3_ zPY{WetCX$hW}{GNmpIB*ryIeW9Hy+JTHK!4rrv%wXhn*fm=YILZf?`iNo}ec9Cj2X z82|LJR&bB}tQ|Mto$oycZ8a6z3Ehhl=AAXyJLbBxKze#B%n~`f_o<;S^Vu?0+mqx9 zvS1Fy$>9js?R;M5-o6+K(RVU#(pK{QOyV441&OBP6pL(si*tv&5*|#vz#y`Xzu8#sMA&_c=iac|wYf0A>+g;Ehz%z#I&7O996k*>jQkpuE#Y~6 z#=^|oi*P;Z=k~oyGD%(awcVEq>$pAn<~PnnJpFPdf9W8_BF+9>H7@hKpcR_N-@oPO z5PO9E#fMpmmlIAn>}x)OOJR%47xJDKvEqL-sv5rAvOra;7$0(%>)t`mJ_pOwd2^ zJ2=HJK2cxdMOk;|U0cyxUmqOxAkICo+K`!2XZPfp%7HM0Z`G%9IiD5IGfM_XhN^6Q zT>qu;efePY2F*{O@Z;QemL<6DnbJn-%7Yu3&DwO|jQW*4Y#!--DLU6du$!AAS&c|K__HH+1)uSLDc@Jod_`FZ~pLYeg!K?-O|(V(6i_ z{#x8a2UX!-`vHjy^V&m1&)ZwYE^~Pp{n`;7Qm0s3FV}dOU6N1c&cK!!T-~GVrZRq6 zRd}fi{m##u67DHVj9U)G&*~&iynR1;UwZ69+Qs>jUEU7f#U_TfVh_j7;>N`8D;mfo z+I^TS))!r~K4Mf4)*{#riIVx`kHvEG|5B4r?phGI7i|`@Gjh3+eD5 z1zzXgY?S4UoNov_nN4P&OA6Wc=1%0{Qs!)yM@F7(1H)&HN8d;AGjH9$O>5tPT#)qi zIW_ZR$5@g|J5G;2dct;Q!ry!w?r?Bqz_8kzQyQ>TMv$#}92Z2A()LsG+_g7A#60et z;I?BW;uaUKbESdn^g)UK%XVF!xdr&FWrxKRjgCcLR>BWo6wAh*N4RCuQ`tLw9q;}6 zvir@=>G!Gi$&@$a>_?l=Zn?23X}iz#>EhgR2@?(ZyN@q!m}Z;G7gw60e2D*VA8fPWESns`Fbk-47>Zg2uDX5+LF0O1Y_VCQL!H_y&A zo#xfchStW~-ibo1&Q55JXK-eP;_ix`i% zFHZF)&0fqOUi3W-io1_+>JxvsUikF&?3dKAJPF?$&b4Q|JH5h&@B8J_cT)N0I@rR^ zMlLN#-@0C20wtZ=UVoi;F&dNX6JT3x_3CZ2>-%D=c<{uGv4kSC$&nJb!;$STtmI1Z zHd$79Zvjl^+XQO`dN2IcVhiSU)Rpbks+{?@;XX z2VY$cuI3o9+|%@R|4g`iNX?}OH7TyoWp zpUrCc{H`~rr8WM%%#g(Eu|$-7_7}GpYiwBhE=K%z>p&f;aHJ%wv}`}ps5$~Ocq7~T&4l{e3JZ=qMUbJB`q$xe99 zpX(TA1>Q*K|HIx03t=4Bp0RK{ zNlyxX>hiaD`r5qb;@&1Y%d1U$7A3R-2e(R1Y)c9gEDVz2zL6p=WF{TgrK=-D+%)=1 zWA`~*gDjl}Qi-EqBKrp)rHwV04huf-3dm8fHT_!r^PU1hqm^o;kWb+VGDzd%r>QIO zXVWKaBdRuTB+nTLxLsAziQ@QpVd34^8_s87%^0Ic3$JCLr+g*fOG~NVaZ5&Oc)>(^ z&_P&5`@+v~y{;*=_-btUf=yFw+NBT+QB@7I>TqA(^fNtXrDf6`szr$A&r29KBV5}P^4}0&`OR{#J_IHP>R!#i+dptU~G<3KSZ$kmc$uVtJosphQqptx)toS&~)Pa@@TY{Hd z4j$L_f!)l@Gqj3!M_(jGKTgSXFJhhajz2*Ny>@GKr1IgdeaA|+e0L3=N5wZ(=H3do zvuxBP#kK8GA$)!N?vj3a?fQaCv41LSzZvk5mm)cJqExmW64on}qTi%dD;VV$_eRbkY$hlk3mG&)cTJAr7Gaztn(wyIAd>6wMS`;Lc}&}h(D~}E8d16 zqPDaDWZRKVl4@cY#vAxFrXc7EE>r7RSZKJT4qxh*-&RcxS$ku->)(<$eKEIuU7vKS z3|DI`M%z_dSUR}#f=P|B`P~5m`SX^V<9VqsVqaWVA?cjZVf~oCbuWHS*Y#}6KB4bX zpX>F%gnXReZc0?y2j5>%>$X4Keh1Z25{TV($j%P2y}8V?>5|QZ6drELCi`ptzLduB z$jA_pCehFX`HDGlGpS7jm3}#PS0B4v?n%rE9f{y1x$ED=lsGG`jj!*l_TU_EvutwK z?;FFV-AGs>bNMrEy%z2?=eSrZokH|`iR*3A@4VUno^~WGYM$F@Ht6lL$Vjl#nAX;i zjZfX=kF96NQt5ZvOO!NwHdt;kcx?N6?wMiu=4I!*+cqzIY>hcqxTm`E+(EBzGp~&j zj;luqcUrkj+*g7iM-j$Br3S3cvKTj6mlS0PwfTJ#;a1is3dk=W`t4YxS*;oUd~3R=iaD zlG<(O*vItFq4Gf|O^^GDmxI0h5h##fno}&NW6-4X$H!mxEY24%WyJ36)K5+*=hIjy z?S2@2UL%cOD4Kd|4-)$kww+RACs~%q=Y6m!EA~3@TiEvX>tHAD!`B1K+M9hH{jM#& zcyO3ET&?C64#hvS42=5Wj{jn@zQMrM2w#`#$ zeKl*5AgScYmOlGK-gH~zo36xj?XORqxxk!q)kZUz@rc zldGv$1(^?*IsWR~u#PyPHR zQrea^qZv_tX4-ZR_#U%UJ>DClH`E>!0>-!|#vV68H z{>S;lQ5v-80x8a077H}=W&RfcH9*S0lTy>zKa5qC3b>&S@@eb-ji$aHbHtj86k80X zt-4Ycm8cM8n8z(!vvEndM4@S<7Vc)V$HheTKMtqbXo>MfNt?=x(ly7@Nh`4?$_a5r z@mV#gDC`ZgUaei)0pULm$PGZjTWIql{F)8p ze}xk5_%HZN5oJ!QwHkj2!%PO;Tie@}H0dgFs#bSZQF^gDZvSbru`a^Ggsy(5Mn;R@ zc~dtJfC`4=T`F-eXp8fR8zx{g{$TGFwlk22GD(9#j0Fn)G^D`O=L>|2){w#*zeK%{%j~p6)vBVejmFUjFE8s z2dRXTxXay=;q=m=!dpy9$Lmm}QdF#ZfKy$=w_hjUk1lGmWZub>$tUgEbb#p8l!UX-*J}bSUcO0tfTw+s;B)3-oPuMDT z?-J#wp~FhCV3m~h=NhsCz2tQ;G(<9IEArnbK>K4TC@B&6g-}Zbog@~4>AV+1BVt&1@01bfN=0LcItLTPo;iBZGoNUUA=Yo7OfFqRZc}{!m+w_`Tm5U-gTdcJ?u`k&o@Mn4k)9I)H-~1S z*?2)1AsEc`z^H)50ke4u39zx6Q7cLSQjp(59GuRa-$Ii>v9wW81HbL%wHkKRuK7rC zgrm1fH1p(okaz{f0SZNMBR-qrcRMCh+_NE35e)OyX>6f)dTu${&zl(_z9A4Kt-`5% z=L(RJ-M@O!XFo7s_a8lS_S~XUY*ObD1>0_va}5CLHasIZUTe;PvGmjV*=8)5X{HP#R^N(5;fXvI=2<$;8G~uPWU()=l=3wc`sDjciVC%o%U&v_UJq z4i!~tf!=`5RfJHU5!ZF8YV!wq^{z7cHV4GGyB}LuVxX%3os@9__HQ{6X3^a)FmAmL z41S3t{q^WEZr@0)p9CIJ!X1OHHcV5FT7mq$8Q@LO4;`~{xk9<-yo(05##!vhy)R!( zy0qH>BJ{>Ru7zs`B-UQ*5aOFSv}o=UHjuUrc8vIB}qHazt)r| zz46;rKe?ELT}a5qs?k8W@w_NWD(y1Y3Fk2;P6}gz|LpURHp*yeVv3rm zhaeE9$)76pc+zGnqUg`Rp{k#tI! ztP;-AA9uZOEU!IJhW)AuAHu-jG;2!n`fLZujMfd`ed;vM!BcbAZ zUf7N<^IyexU&VOe#lqjkfQ|kQ(GMBBZ=K%n4P;&L?h3_!e5x)Jhy#@dZjRpG-g{no zpVP*q)vHUOpk6$iu^LxGl5d=P=N>PnjFR<(w7>Cha`~-3|g$+}i}liK>88 zqz7)1{_acvoYHIue6Ou5zqdY?isfCuw|AXYoU~XG#wa;kXv|5P9QeZXXup782~7UL z_SQbFMm@5(Cacq#FZ$Sprb!fC7{R^4k@wDHoT}?^0JyU`QK#T_QOl0~;|ZRfTUF>& z_TL8am1|kV*OI+8B1@d3ddX?zr&4-NcJ&adFRNyStfWn3-cF34yPuO!Iv~;SWKF_K zKk=(s7sR?yWl)n<(hSVkIHy$-^XHzyTS0!@QkRyQ2d(^y_}gw6$1P6M4Cfgi+$pI% zuTR{ke`Qi-qmsanv0F)~u1$oUX<6ZvZLLBth1)D;u2nQ80g&i>XOLOG7j4vdvvtx9 zTvXCU6wLUD3RI#5W75pE-%SU!5qIBw#e4}l36!$-8k$93g&2jOyq?zq${9-CmqcT` zUk{CtKDsu2dJoGp`|zmw!tYam6772~|A4J}Ej?O+yPzWLVKks5MWjRdg%8Ae@vF&t zG4DT+7nND4Dza5Qr@%G*(JN~B?KzYdPm0o&M>C5<>P`c*OZDC9{~_$1f^-3vHr=*u zTdQr`wr$(C&DFN8uWj45jny{J-t*7InTT_7ZYr{}GV;y3$*j715QC=6H{+RxjpW*A z9B$^|X4cT{2l1&%*>ASt!Hzf@ItUGJn643pWS}qKb(VzwzUWy>Dc^K(LI@gE<&@=q z8?mIk5^8Tg2X)MUG~}`(I4E8eZV)!*ozWt+LRou3yJvBM^*UfyIQ-3Gd_@j2X~{`O zlR=otKm0f?`VLd)I(ps$h`gSufLH_sLz>3Y_l=aZ-#8bJq;LlDhc+&fm(#NJ(0gbK z?s@mzapKUnIvmMQSNqe>1mLj-@e^|J2J3HZ95@rj;3-?0Ik%*_LBCBn(ELV?pq@{u zLuG2_@hL_6jvXgEgtS)0y`gBVRAeAq7bs|_U9rul|3qq_IUrX+d~A=YOT(V0Kx|ue zg_JEF>Smb-I5Mo^hX0itx}=Qp`ohTXgn^RBc?h93_++8ifF!(`&o8Z3!1vgz)GpGi88()&j4z=n8$sIxOqZEj|!svEaG(zfCf*a*Hqo_48KsVm1ow zeX^(;$RUll!&EviK$>ajf<0f#x2(ju7C~7dgxRE@9YU{!3O-?-FZWSCA%(I6_4{cJ zvj+BC+)PgG+HAIwVOGqCvs8__SK7Sg;5)N_3Z^STwm-JQ*)R2$%l0Z;cQH})c4vAz ztK6AsRW5AiL|CGC84?fBE$lsMmgk{3>ojI#07Mu3Z7mSsk0l%TTOjfuAlX=XY%`Qs zt=CT$@gF8_X!nenF#SkNZbKkRzJ4mK_+LW8SiO3_>CO@C!|p{5)4>R zTS1$v_}W>>FB#@Dh-?&hw@?toiik*`=dW8X@U!YP-Q7ks=p`r?A>WWOl;;vYLG0*2 z$hPL5@89$Ok5&782bI9*XBEt_=Z##p)DGdk2L3S0_3NN#rPBqbx6uy*Npex^HrrK5bOH`#GG(ERaB^Ve>Ast^B{PyMr3w%<1K_No&3 z={4N;`-4azKh#h}^GvS%=gy#eG%Ss|x52i9=5OApK?Z{~wh|(L(x}zi$bF_T?7Ux< zLPv9+_}zdE54F&iQsVia+bIGk>?rpXQGJaBO9;}U?QS>XzeXOY?%rWl`Q(aT$KW8G zsG>>cqEJpXzH?OZ%&ev)`ym=6pfWN;g`bn(T(nXG855H*6A)UL7GSLcpg4&ojJQF? z>RhZO0d`T!HFvbU7RpLT3Hl^4d za=$}_rh5;Xu_%AfA5^)Iw486E#aLXavvtZb_Fohhsq8PfF}fiKgAyKTR>FwE@n9Jw z!jfHUp}_3kRS0XLg^m!qM)0W7zaBWeOR6yjPN*-`+=`-bPuij5uu3ziuoiZ0q{Glv zl6Y3)l4ks(Jpvb>gopjv!jkvDS|Z@rXP+?n6oGMZ7*_?fe9I$-k9Ir&5BX>Ao#89X zo*hN#Vb@vLT@e!*s#rm$s8mQITTBOi6Z@QmfzFRq2@L@-C&8O`6v(~qYfmE#-*%|a z*1*%RcCbD}QquY@9{wtB$&ZBfKiI-h<^@;JmpOy@WpYSTFW{zK2CDvIysi9XV zE&!u5FTu@fG>lC=zsq--6gkO#x4W7e;0V>twFEDv*G7!i&|W_$2^d7B(rhbNKBV`e z=Ib0q+Dt0;Ji!GMr{@ZfqN|8jDZ9l?5JB{MneD{{Sy_C&6`4ZhtZx~~BJL!q^#3h1 zQLcxLin^m@WjL?uR2+|l(SfPW|G4{;3`S(lmh*LoAcc4bDTnc?vX&u=QBcq}YfX|R zD_sf(6V=)*z_~sVE(8iSNyo$R&my2eYgpx*$t(%?Ne1*p6{TT`h_roVC+zrSkZ*{0ZHK zAef@^I>If%l36HdIWvSYvZC1Ek^CY7-Dq!%aB}ZAH1y1D52ebnI{|EIs;zocu;jqe zM!4hKBj5p?60Z`waC(c+o2X0^M(D%)RVqLOg@;u#F3zHaK}q4nWm6WqpL(4S8Zw?9 z-Lm~l){m++*E>PES8kdX_)aps3L&lV361l&sG=&iE&~!yE`zygK-zu%k^UM(&1m&l z?7pl(rzM%@rgCP1@9KrqC()Xa-#_&wD~}hvX^_9qBU2sGAU>kj&U%LS`XWPaH9D%h zbK^{_HGJI+Mkw@{6G?sth3Aw%wqRi7(;H3{%yY2v<|JqSSP|VaV;~6g_!1Sq9-)Bd z4a6OLO=!Y5QkeOvb~RZR~GhfhU_GDo$X#+ zHL?Da&#ybMj?M95hLW=!GwL~mS)WG0I|x))247scdh7zn{5!o1?)ysBBs=Itt`eJek0?3i z5gEnbaI?%aqWLxodCQ=@1RvU<>6HP-{j7qrH$Iv8QrDFBvl<(?fAr~0{DP}@iy@iS zQpHSH`YJVhA=n*8AaANnNj>$la9`~>n*i;edtfLjWbwOK*Zy?D=seSoq?ckDVRee8 zK)16C_y|!_(~B4Maas9UKlPPRDGthC1kfjskq18(Iwiv6+$6}wV}^~+bmTDEMvNJ! z@!o90rmO2Wmn;BFn#+c<1__i$Ovc!`Sbgh90h*fU!Pcv_bcM1@w`(jXv?hCgS}Pp% zhlSxK9(7ou&y-S`vJVuHVgG?jU(u9bMNgv*g?Y6*Nv8vV?!PeNQ1^Ve7{x@SZP(=E zSlK{)pW1TG-9nP-GMNTV%^l)$0KMU@`nb;ioU<)Lf3KEPpNW|H=rm7IEzD$KZ&yf? zrh|Wx8EV@wrxOk1z8b<=gQMEgB$YmmTx#Xh%9>I`ZJ?)Qr&PahyD=#Qc)X|~kAFbzGUQ7EOako_Qf|^$KA$d`%E@e6k-3Df--`SF|C^y>c5xv_I<|Sw9Ab(q-qB74X0(rAv{!ewS~9b8@M(ze0l*f+2sT& z>f3@IS|Pe6=0-V*$#`Uw>VU?JB?1VnwzX z;Q-vQ&aL)&H!Mf~hvKIGIm~z!HUapD)9u)xdR5kcTTjbhv;O^2Th98K2hq--@&=dw zDoEx>RnGfSq<$|z0rW06?ut9|xDG55s)N6#?Hv+nq1<{qVM|_%X$K02V^DsPfLroX zq_|6qe~481s;;`H=n#Vyi{ofB>c}qwU&zKFCx%(U_Z>X?5NSk?t}`zj6ZSOC zxv=qydMzl`blWTy2!?Tp()|#*_=u-I`d~Mv-#ok-7VDnoa+2id3woKr#T})HVzG+& zn81BrM4`NNQkh64LcyeB!<>&DOuInG7bfk7?&o|{3J5KvetoyoCoy+XgdX6w!`#b= zTj`paLv&!MkLa`cyijKSIm^;y1a!11C4A|V-iI5UO z5mC*oBP+9F*0#4Jkv$RJi1V8ef}Nbx0H!iJ<$Y0T0hzeg;S!_f@Rfu^Gh@_iK8t=Q zpvgG(oVJ32D`DYFN(wp*vwBve0hFP_&Af|F!c_A$p@F7(V(ta-9Y_rR%=!I^7~`+Q z3I!u;LG1Yi_arjLT>GL1#FhAXQo{(dn532w=4U3T4cII0Fii89`Xc&kj|HOZ(BBwP z%n`vhUx75>Y=Tn1M3!g4BIW(3lAwq*!kb40(Q(Y@5x(f_aNBH`oeITxn{{)9r}~gy$VZ2L!}|2B zn9j!vIkQe!zc1}`8`x~~hh@FWBnqVWbyf1ro~#rCnzu!iXj@~|I5*m?uo5R?dy%I} zJ{>#x+w#&RY1W6$(F3CDj@PBFBjL>7KC&_(3XwZtypQ&g@*~3gab}POOHwDyspUcN zB)?g8x~N0N=Zku5!;S9_B&|{~gVilF5R!3fH`OwtO;+pW&#TZ5Yx3>%%5Nrb=Lsd? zZELKg7^HYM)vmo?Fw?^=u#) zm=+lsIqv7Nd>Wrk%mbF3ZB<$>10WS5S6B#8#r)8D*%}5Wi>+++x$Iop5z02l=h~z- zi}`U~h*t{RUfN;m8byJh@J7FE1|s8>zgJydYQ)UTP)AJmy}K2r!SHx@{bs#Qu3sAE z`J=69EQycQ*~o3+zU%|t@_M3Gud^DYc(GX zB{`H{Eek18Fvw-4+!U2Y8V-ePPQ^aG$3rIq<3=(Ak#LtzCw0>@7)N*5zdWH6S z!NC{e1GBMZZ4E^biOBf6z;Li$?a`kd+HzQ&Tsy>XFkR=2y12U}(|D_<-JteqbfJR+ zbiZ2lWJR0+9c`A{$o(tFrIcC)=uAQVDsjge>$Mmb4cApi5u^SMnGOn;fuXHKii)Hs z;euCya;ZM<&UxyTVjB7<8y^2;5$G8>2nZ!@6!=64>(>o3gOI>w^2*(v9LtKH!P>Rlgrmps#Rui5(p)a3?RS{~JP-BM8Wm%%v6F%i=i)~l z6>&eHy$JCP^jsQl6AI*q81|Wm*04Ta?klu8v-#sf+ct`bP123x z*i73xw*9k=L0WAFwPs!CHqPJ;;6usgk#^Wx>{th#hMw#t+#s*P-RDsXx#nKU!v@YH zQ|Nu5!SmwUdD+ckZxI<{`-No2#$0970KgOt-lFm_jU6<>dWb>=S}i!*M6{1sHHyg~ zq=Jq&u9F2QcU)^i*fzyY>h9^A?$$d6cE^THz(gYw`n~}L#1j!EXh0^@K??(sO!f!f zW+{nER%Xm}eTw;_;RqFaYzA|T2I-XUjWYjb^F9f6UH9;xGoC1CDwdK$6vl`}8e+)+ zD4V=ZvMMa2!XHw$ywluLGk@2|qcyccH~6v6a0)wm$r(4c6Q5Amx=txvBZ6UH%UN)3 z-jzq&oSSLUaS&eQJ=GR1LV(LMSAr=-wR@hq{{)+WUbW_!4@0Y~7)Dn{@W<;PM2T-Z zCTipe*yKS4AZS~tp+xv$@*{!g$a7g`+TaptSIOv0ojKLbSk4g*l@c~h20Ci7tjc&- z$a>;Mgdq)jVa&7?y|8eVvO8BLuZ2ySCkoMM2INl8@(aW>G{lI#hlI532EB&G;$FF| zB<35OZ%4Q}c+M+;OaNy;h4x2LDs~eOGyz06vq_`>nrOSWUzer~Jx|XH z7DAe|2LtzeTR(7UvK_91?;(c>u2Y#{f<3^#eBV@%9z#*XJ2rs9>%XiJnouWq@XUc8 zu5Q~p7?x`JQEbykaETkQ)owD+mgjGIB{#C64{$!?Z^g1yrgZ*?KmIc3X#cD&}tUGJLpldNW0zFEYd%wC3L zxAKT^X4b!`m#!$~?KDScKs6tlp+!=bS4-R^Mud{Ol1%_`nl5rb63d;@^xaHH;7}pR z_L=EsiIrr%6%j5kZ?D%a$OJG_T?V=5!V5*E zT^V;_@T>efF_yTUifHpng!P7P@CNus8UQ?t#tzy6kA{u7=|3M0_(!XSrn6&Tk#tYHVOVfhrtIaz(N!s^MU44WD} zS=Gw!7OOFH50RyR7&U~krSeYD98-=lbZW%I`Q!$l!9adC35hmfqs^ZA(6i?g|n&3Vj z#ccDwk!KVd0w(SJITSn37M#YcxI%Z+|DfTJPFYgij;W+{R9V24+R7#-8p%UGT_s@v zh%6GRV^Ge?^B_cgtS2-)Z7p;+r|8myj<%I^#B@!u9{9MzPo(4sV>=P$*QvLt{+V4( zr5-?u=|^qX+FmiU-`%N`wr7lnZrAeI#$nk3X}TYkt9`Q~ zKPlo<0^7_;-qAjwb90P(UidbXKZn1#s0My>nHFDlGT)REG}Xjr?KRdK(~}U5l;c`e z_G9{~fzPR<{`4{jstY1V^uBI5p!Q`bnI#+??2o2$wK;7Ih6qv<)~_c+YYri5cBh zD?sj!Pb_LljNW!+)V~Rqb7Mh0HgV&1Mmp_4@_mm4EudK8eO5f$1C z<^3xZdayz$qxjR`n&tst==t7gKVJ3yit<`EWS~Wsn5kqx30(wwdFbmnRn6E6=ZqcDLRC%qZzt-wmr`Dw* zdAV3HSbQ{zWWwf{kxbmiV=1hgylIk{YN(a3ne^4Li#A-&U}bp`+cE6Rorl zV&xYy+@-T2Z>87PSRc%E;x5wS_pR0m&s)6coH@M3WMgHGorq$k*YpXtHm&a_XB7NC z%GUM7*w{_U&?b#=3twl|6$;`A^G9J(d$U5p5{%AXalsTFkkMcOxNZi}KQ;R6Gwc z9Y%OM4D?q$^WoRWuj=q$)`H9+jd8M%**xwx*3Rh`or{dFP%I&UVhezU=wxh) zC>m0p*@4mQ)}F=pqti*@Sm~{vS4O++J3RYe7Ocb(OIG-IZJjB_h-eGkgqlx`ahu$y z&nF5`tvt-KzG+#$sR=gCGhQ+Be?!waG82`4mG5R5jHGt*bW?#p#bFLiDl*=Plcmpl zf%a|fbB}ZF8#mI$hcCk48h)5uPKCkxVUev-+J=@QU%aF=;X__%PH21xqc!uZns=u) zQ>v*J7!T2uEX>ZcxM7bKX=>fXR4TD z-KKMg!f)eyi{L>nD;=q~qM)joAtfJ@yp7x|8)Sn8v)dMDUY^f$qD1DgHO_m9Ap83>nrXYrH1|Oj3O(l?I#`QwKThKVo&0VkkS?KSs$2M&bpNf_c2=m8tD(){A^{Ux~n1aHW=Cv;cd{6MoZr z-^=$Ajn;`ea8m6Pd}qHBeK?u%@I+u@kwlAuE|7WU@vOtT+J-oOHI3UopI=2&0G4Iq z{?{apaiX4nW?_UGJ$#HX*Q+6G7QN?!OGncrASc1s@cPdGTV1U{6IMc}^wX|V*TSPn z57K8%Mo@j%HGqfdEV-#P?~XTAykBxcrKth}&A%|zY3mKi1D>=LI6>+0o;|DIy@3Pw zV$EPPN{{WEyAl7k(wp{E-RL~`xO{roLGP_Lz97VPj6Yjek-z2ykjWH|c@4%I3@ar< z_bI#@rH@6X;xv%%!XDk9PYqzv9Q{6Wgl4jbLR;fj0}RG{X(teKE}LiUy1JiDVGo0x z{(D@FX)+#gD5S#PHwuA+ zW?WC2XkM)?L339M_p%iLC^Mc+rI^iqbHpLRPcodof0mj3#e^Vg46%HpUC+Cdd8 z5pLYD>bhM7c|Gj z^zg_Iq0HsF$-s{n?8HbeeI#Vun+Q#lc&PkOXfiia)UKxEtrq zQ|{+N!((S$(VlvFBaR|?MSJlyijY}yo)n`9 zTEjFG7DnzzYOgq>`PbcLJ4o;uC!uvnin|mgR#lw3Fd}7MH!1BOQz!@hQib^UZ|z`; zaOs@+#vq2H(gJ~}Z$*1PB?FTMyH*?nN!puA$(*AGwecMSO zQf8&c6eBpph~3Mb(=v_+W1T7vgH zKE(dMO@Mrs!%$d4`-u-g4ST2VXXd~D!HeytpSWV%IN%!5pM)>v!OcTP--E&5-(!r5 z6U@31`$LE65+_xpo+CZa`{Of##wtso1`B0g6RTpMdKk`q-L>g8s**PBl>%c_X|@!Hy1hssmI8BhIMjM zA4B4TgQj6395<5olXU7bW-XK){`KD+MZ>)w5OLSD6jQ5dbEiNdF)`GfQ&f#PNwg{0 z3US$`A74N4jORFr<{m^==rU)N^}%)S4T%(((6|pK9ZlGCq^i}pv)_}O(36DU{Zg`T z63ao`FlruBGKC{h^ICE_3?fQ3CEK)4d?r_l)BZNgbg#j|?Y_~0@Vo-;U`ZG$-)OWvQeo@Dl%2l_seO$Gze#2)xU)*jI9c{9x$`jHU` zw4-z;+b?F&X#XT}nk1TB2|*?Z2nH{3H1FZtrhCyVL^XM&d4I@;w_S3f@2va}m$XGJ zAkQ`mfI1hffujRYb+;nCRnK1VXq0OqQ<&%@Ki6?Ulbon|Kgzmlx2YB0gC$zP>ir`( zrTgCdT9jL)M#KBbxla=f`jG3H?_t1+dD2wYvUo$~{0r_LP$N`Qx`64co{vhTdw_)wX1_@r zehQ_*3+I%$R?3fz5D3*m#DuhTgh(9HseubjU0@%!Fp`D82fb#)|Afg@s#`&!wOmAw9Q3c zb={9(&1ofqL%@Lr4v=;eVRL(*TKtCL3H6M&7@{Tiq1svdT!L)IY}Q)!mU-`N+gX;Kqxq+EclTE5;f8`FmquA$i; zleZ(QhWzZ;{wxeZrm!{lU%1OH3h@SEBu{iOszUW3*6%`MRubtd-2f4HC!Kg~`hxV1 z|>Y)9I;lFZ061J7I>xsX*23y8~GvtZ|cYA zS?6gEOrR^ED!*(<*x+12S^FgcOFW&y!2m}bJzF%u5x<+`X8!%15olH?8s9GB?Meen zNtLUoWD>RzbRk3wL^+P3YR^KR)VLx+g9sv96NT5_;Kj`-BqzPwVX6aR^`at-d0{6A z&50sl{6^9yR=2h!T_GS8(bUYR<-VoFtw_BNi|tMaET(TUJ`7jg;1~h;9@c>B>sU1- zy1|v-3$|7*77*&ydKFrijnAm5U5rm^ikYC^RkmYiLWpGB@vovwoSqB#kLBz2G^Jr< zpEsIoIa{RBKHkqK6Q21w2XU^jzV}F1KS;E-$dFB3wZaR?Oh_9@ty!A;a0?d%X-G1b zA_ZQV5FTk=+Y2PB(M@smIzH%-OvK9W?YET0| zA#L+wtl!^gih?CluuGB0LstP6sV?*22D$UtOUaG2bN@e&GiZEly3MX@lU9tKwCjNtRN3 z5NPvXAvH~0@)4MIX~6FZXuW!<=7`zZ02lszzdmVPQT7L~2~|)8@yr=Nks$8wlLnXZ;~gd{?ETR_Ze+1@~~9yk|nG z5|#slx_%%rPrEA)x_^T$Jhlq#n*R(ZN0(0BO=CS6Xf$#Xj1g`5O;f|MpT(8HU1P`M z7|G8EjjxKk>)&(!bV5xqpR9}pJUVv(wYhOvqgKVoA2MUJC<8O|wGzxDJi6aAsBu$3 z3n`hJ5-Ay$8Ei12nERGLk1*t^KBpedO?uF=ibCR&A}U-yx1M3T-i7&z1E)MV9+aVe z;jos?usy?Zz&B#Ix-f%b4&>6$XFVaXkvT>5HzBsy7C zQ^x1jl+tc*`_;0sc!?fK_>dc?m4@k}0^&!rS{w9yOYBKcO|kD2?~nSLq6ao?79riZ z_fI=>-fcm4gv@1e!g z_sY7Lfn%LpJ1|=fU800Pnn+yuD1Od*I5@4tNP7mweN;2yrw7nvCo|7eP2%__^Y;k? zC)(d9&L8!(#wER!v`cuowU~iYcl(Lw0S+QOCH+AkH-xZLB#{m?5w+MF>1qUW=@=ju z=*Ek}6tnlNF%-z~O|5j;5Cj^_S#`=CIsjVj+Y$oHQw!(zWu$jB6$Qui+ElykW z>gMI9Eagho=XbEAqVW(D)nw@qud0t)(w8X}+ z5Hh93B5aw2p_}NS-@93r1xd6S75;EhbjfzWWE;@n&N^iZDS*yC8^r6g#^kR}I7&$+ zbDF~@o7CY}b#n?uy$J_1TYhzhz-qNwiucvrt>42PdkL)EtYN8(Rs z%M^b(p%Bf4-Sp#p_d_G{qpcJd=>h~q*QwR8-|2W6NzYOJ)$(wFYb3W@nhU*UmXB=s z9^TQzqsvBSX+QM(^tRR+ZFd5}`Pla}i37#i*Ym!CIxB?^G(6004En1dMWGoQT3U&D z{j0rJbHHuDgO*2ndAc^;Hq(U_MSl2#)jkj>c$tX*QnuQ{Zk+ay)E(oYE9ZwM=8ey2 zY&g(s&VKFZ9#%$h8;=ouamol6X4bZM=^Q8ga4VXTQv=^^+5o|e9@=S!+Nt)-oU|ZQ z3gsU7pU;V8r5UK074quW1dUjyVs@{uXh8Um*G=2CK$!;vm0=!QK3V{GK=)NLMRL`M-Uj~W_qZI;t$c1C1;k7)z!$F-~``Q;>q98I?Eu#Da5n(EhBY{u!C%a6<< z{xCN-GqBe3YvyrY9eiWz24Z89ClqkEQ(oPE#!6AHX$5)mwH`PQ({+OYGwi-{U6a$B zShcTiL@*bgQ{b0-l1%~U7oFK46mBy*Iwa$AmasNnVq2xZot$EvSyMSEiOEIw zi%SNx(sCRwbs{1_KnoWLgoOmW0ort-sN?2C!X@lCR8%qeL>iQ;CLZQy?`umyY#|H6 zkRcnW==3F{%RfCWIdThdTZJyx?l~m9Or4~>C0~3)Aaa(u^ep0t!A`%65pEoSgiZl5 zGUwMBQ725~S`UTorco+VC9sH7`n9^oE=T?-9)FzmrL`zolIVP{p{lE|^u!e{T_Lh} zZc~|Wo`CPyfcX`wPUJuwWjCnBltk&eX5c-2Q1hW+&K3EbY!;kkXJ-+Ci1#Z7a!;!c ztpw0`cEDFkKMN#&s!+uXYvy0*yE2=AVlqMVP`hhHGJ#~906oO(CTE#J zvlIJ0suc9MB&KVmhF=)^QD3^hPauK?h!J@BjWS@X>4|Ab$9#h$tidreO&DA1?PIx6 zB7)eSVE(j~V2MnitURZ9bfc`58D=D@woQ-?GGcmOi~Caz=4t8JkX}s^F$+-9wc1Ei zQVBuAX)a}o8=xBMVF)#`#iXWsi>)O5qV2`~Kh;m(7+W@Cix=r6lK&Z zjFwQ|3;Vc?^U1+-1*q}o8pQI-@+lPS@@wm2>nB~Bqwt(ZYy z_(IYMVhW5tfW&CE=VWiJ$f(jgKM#?T&?3&!!;Cn8@SncFHOvX& zB@d*6SIO)5lj9h=RBczsgn{a;WQXNFL3oVzFf65(K%a}2n$7j zWhyS?Cr%=P_o7t&b(3=6?@2#<$l1x$Si{%%fbjV5^exBG_~~^$BXmY>VpsIxP=4U4 zcJNN37ISW7ulC{num&D;drY2$I%bC1TA+lsdDmII=HFzOr~K3SOxbo5_ufGsZ8eo+ zJ0H*U(w8MeV0|R6dk+NJj z%yiPzPB=SZHqsOmEF^#KHPo57Lz!G63})k=qFsY-OeZZJ2tX%lbLrW;X=`a9t((ksC%w$y=Nzy0hw-McByJLAB`!hP0$+H!C_ZlT3h$`tHf+B2Bt7@mXbDjGw z_aY=0dpl`m5xVOI=+0gvV#|zjSLVYW8DnKa%B~7_s?}Z8SIVajiQEhq8!259+5Tng7N9L9JtHl}W_{!k9h;!+x5=Vil@WE0pLu-q*y& z2qdA}Twyl#|Cy6|eJ|periEAoRYKM*|wRw!cQLevEZS-ckKdQ#~GgfGa)=i^OIs54TH9;7mWtH-QQn>@p59 z%0S~n!$KyJ0_HvD6Y!fxoInm9;w&4EIqf#x3p3z^6k?KA=_|j#LKBf`b7F*71RRJ% z0j}FD0aw??LCZ-;bvZ+zQs%a;+EY^_V-W2`18Dz#P8S;GIxR%;_m&=SHTe>avs`~BTXeE zc2F{x0{GrO#Z*TXl#8V-LnE;UD?1rLaKZ;#-J66Y&$xZ@}yO0l%3>0dzIu zwK1?{GBEevKFK*Pd;vSep zmc*!jKUlU+F39&<8X~1hozy*jbhN)ks9E*_+yHMtkiS;W`M-vOp@_}mb{lyuumf`s zs~h)U11a6chjLxEj$Q)SBbQLv%Tnb2=ppCo_dT1m;ul!f>Wd90)0=5eNk-Hk+#Pq9 z4PKuTEof=cgN#bq8uU6xbw;R3`<2YA0zcPAr0WPt65x0kJvWrTJ#s7c8vJxbjh@Oo zX)5$8hzPEHg>a^;tB(;{nJs$kPe&%mU;#l=QYK|cCq>zJv0sdt)mKx0qNLyG8RQ|Y zAk-fc1oWVro2SEabo7X*G0AOq;=NfRuCw4&daNYTFrY78+eWV40D^<^#J_-M(H zV4w~x>;PlLjGZ5+h_5gMM82Yc85oVyUQ{?A^{%+$(A z*uj%Xhw(oSHV$@rP9{bcB32F#dJbk5Ry`Pg{{N%M{(mVdIy;!Cn7I<^{Kpg(C(`?G zVp|7i6-OfzGot?nh`2Bjar`d{etx3=HwWkc7n98OKZVHur(_19|DuxZja>h84^cCB zD-$zi3E}^Lf^zO(4^@>7jEK1&j-GiG5+d>^9B*i%MIK3XFr_G|Kt+)7PzrZZaB(!` zKkBBc{lF3tBqm~Lupz<5YtRo!ilYNcqGBgIu{O~EYS|ulv%bf)_BPJi);28u`K@&V zDSicm4Z3Oq2eKAwqTOB%=%S!b4Znh5Aps+30{0)7n}bQbiGnPD_3&k8R!ELEzueLX zns#l`_9;@hto{Zhk#LBRK>)#st+4a@Q(&Heq^dNJU^D-MO+KalVGd_v#wdg?sv$WV zuD5+DKc(rK$VjI+F2vEA#qMU!i|ta}%_2W2js+{!%^=^mDE5Uk>rs`;0y=r6T3UL` zkp*Hz%QToiqbRhEVirTgzKwbS0fI^$=IVAvhL(8$!coG;TwmL|0O#A#)0}gB<_9}W_Jwo3W=`FHs`Hd#3Ivf#p|hBYos^ZA$%sx* z!y%;4nSQ?_{T}smSfmiOF@o1@BxXCf|A(_c!T&|=^!z|jQ4h1)+W`vBrtpboP7|&>PFii z$O@6DoW8&%m^zae(P9_xh1w2)pd>=N7QnCu(KCY38p7iRvN(e75&?w0jU(rN<=8Z?TC|1aykZuh$uA5z`_{CK8nza zJup@`S~ZqtT*)xWP?yC#Wj9A+33?AMHC|~f)1<5saEE3`&W@uSRyRyA)M-d>1YI|} z=D|Z4>&HICbM$Y=(q*=1s{?C8T#M}ryc&W(pt$$!rrt&S7mPUIa%b#I+zS(c7eKI= zKsee*nFy^7W)qA^{FjK#mP{212kH#!I}~}4RVk=K!IdN&$!l2G_)lZ}x=^h5fQ-RYqs7wnC4npR^x?L<&p#WBSoVZAx{LP1;qu54l3>TDnKN z0ewED0dauzPuW*Hh|+-IfJ#ttgLiLSG#>S3c*FH&N|A5on@ajk#&-F#ySSD)P`*V(>~EYYtd&+%eJ)v?f22dv5S1&HEEP8)r?S4ht7_Oe z2bhDiIkluQD{9!*(y9?(E#MmB9rrEv%6_MT<%`jb$;H^gFrdAmRiV40CDi(( z1+HlaxNP_s+8oZZ(KGQI3%5QpX`U_HIc=$}q}y}vyYb`6(rehk=#uZ6dqH?1`K0({ zg5-I(H+LB2XaXrH~0J%Xh4p=?}|D&Nc1n*B2iKU)k7hk1v&Oo!#X z;B?TA=bS`uN*`sYYoM< zSG$_0zo!S-|5Mvn07!9kTaUI>yU#4Uxa-2=9$;~IcXti$4vSlG3kmKT+#x_9I0Ohz zumFMJ@}FksdoOQ?FuVKyH{W--TUGZ~ojTRsb$g_frD=4D;s>^uo^a&!ky2yFndQu$ zC6AUm7=5l(h3LM~Gos7QsGYgahTA1$>c%Ahp^%v@iP1Opw_TULI(@a=$XkzYl3Raf zjjBI=!=uYxH{Drw?Bwc+jrP{*k}+wLWD&p1pGIr@mfb18`bDE{J@0rfOxZs2-Q;_R zGTj^ZtikIR?h^;8KRc` zy6i-oVH;m>JX0)9lQC;EHHa#dZfCarITuG3|LNy8=l-mrEh_r!r1I&z)oHo?yYU~( z|6MvJ_3Si5>u?*|uD{l*REzmPS2?cSeQ|r%?T*JHjy^y7Za}VoDBi`@L z^=CVA)$sGH>;JZ`V$TM9f4cGau7?vkB=1oA($ixlkBw`QiwUd*Phw5PQy#5R$p(h>dx`M7X7tld#y*iYBs6YrLojz zLh}h5b1YrIv+SC-rOy5M;QI%I!zRqSyYoTcEsy73KK$E--M@Djc*Z%-eUL7kR1e=V z@W`vm?N)u$;b4<1H&*UH`Eb#LpLVwz*l1vh$EBZ5I$3IXsU?T^P3Up1z}X9Vmgbq7 zd*8Upht}Qda=6on>wg#TtF5?SIco8?*Pgs7@;$qG_;s=;^Z0_7dXMS9{C>I*^IvX0 zRd-C?h3BuFAHDhe+->@n@B91xL1*Sh{1TC+$m~!3Uc|hdIcvkut;(I8^oucPcE0&N z2mDp+(C}wtM_VKF*XmyQr;WEy&t1KC^|fPzXRK-XY+Ki5zwLbYzQ&9dtybr2P@w7NsMVGR|9GWYvdruP?M*w)4fK z1s58h+%T%ugb`bdXZtkm&6-O4y(gEQ%v5q?$p@uYl{y*oCgy6NbuSJ+Jr*@2`eEe;1r%=L;mJIdW&u@t?Xp zfjT6)Wr`Os)}&jD=E?JZ&Q=@z$0h2ES$Mb5d9|G|_duSWJ$bfrZJKvOBAp}9^M5DH z*&~B`FW#hkllGlj{b!h{K!*Ka5!nL~=_@p8mb_B6!0rcdUen6Uoro=lSp48e~!rPIkM-7%$*}LDl%uDx{;CT@c;kz{GT@f&3iOMR{nWN z`^Exlc5lW2chRZ&Kg<73v{%;_ElFhZ>`^50zh236=gJk8D|yT0v2{^7 zBXc6`b4$nn)J5jal`C#tRNlzAb$I3YLTpsdpt^jy^9A*nCr@PDI;>ruV82{Jeo=Yz z>t|uBwdn)Ba4%G~QzslAk+DLS>DaPU@_^E1O5kWI z*rG*LjwX4V=gZrodA=4ob42CI8I?Up(`L8f0VsIfdH2zas284ng3D#6nJ_5tLC;(PHMy9C>ZFYcwpTB%YM@Z z=IeC)&sUm%%wPM*-*I`=3v)PH^RYa_UBNsCefDY1*9zl>vSBNQ++pR!u&{gL-~J)e zala+c^skf~`wJ+^{YRBczN+e2-vu?Fua5S+bzU26Rn#M_efoMcyHVVnWt=h`W-X(k zd0F3T*3miZtXA79tIe}^sn@J5s^y!dl=ZolZ+&g$nZ6U!CSNw`m~Vo3!S_(O>? zX}#Hv?Vf#lEl)-LmHWIl-(5#5@4ldZa8*^ex{fNnTm_WEu9Y(9vg8}iA<_=#J#m4v zoEYO=DGYM*LSJWVevtDJ7voIJEpUz`JDd;M8_udM=i1H`cBNx_xn|H?T`c{z ze&?Oi)-{m&*7cqWcMYJAI^9e^XAG0u>1SU! zma{t?g~@2g8Pd?vkt^UJd@{!}o^_NFK7M*Ay!$jk{P-!G#5zt$$sBFv0uHy*&@oFH z?Z~3;aO_fFILd0dooBUv&N}*0=Vd+IRm=F+b;>yFDsJX?uQwOFBP`W3*c#^f-TLUs z=j-bo>wD+Dl zb$6wa3b-$d#4}#J?kO$q^fKZC>WDCs9xHTZDhkb5Rj5HO@MXB!d{MqWpI3;l#cKLPsfWIfzFYFg@ z#w20hlS%4$9w*7^5yFWlGW?3WR`@da!0_(wAHxf|e+~Dz--RD_rHUBuDi=}1)iolC zYevK^=az^y&hrudoKGVvIH{y5oi`)uI(I~jcTSEt;A|D~)|n?Fhszt$(sd?$j%#lC zudbHiUU!!8{O)H-I=Z(cS?una6rUIXdY0ICXNAd&cC444&AAgy;#>Y_a_`;MWJon}lmU$}+O}!n2B;L`&InNSd zl4qY#$#YE*J@15*ZofFuom;Hxt|sd4&f-Pa1aYowmDtR6LQL;^BtCKS(q?BCslT&= zRKnRw;+>PEvyM&DY{x~Zx#PW**^xrd>PRW)0P;D~$VDCL>L+-VU8(2`+V;@CN6g!71z2BiJM&e z#GhO{#a*s#;$GK!aldP&c);}o>;jZ$p?(_LC&F(6{Kp|K2Jz#>c_@E}`pIY?2fs1! zABni(h#!W2hNHic=yweIABS-!W4!M$?mU-0{=aE3%o)2ckA*FpNDb!VpS0euYcN+% z>zylS_Rf-XcxTG_yi?^u-U)J1?^wCGcc>ig?Jt+|_Jr+>a(mRbLVHvAHG+Rb#5F{G zLpeFhVW>CIF2Rq7KZ`gT@f7-@(I1O`dGs$~90TKpVcg_id;EXXU=t=a0(Lv>xI}8O z4hh;|cdQ2Wzo0>^&tUf&A;!H-nBra_%ydr|X1mA14o7(a>ieO6fY1}=j;L>o_SW!g z3;&LY>*U*~;9G&~2zq@F!uI?om{t7o;C&GS9%Y?P;= zehS*BVfUIXx={b#y;^+d-U7P^<%6h?%X>J8w1pi5+c}ZE8$j>gf%9(87kDTC?9ArzOT~k8!)X;?BDvCQ<~pIc#(y=e-Fx z553)Azou^Ddb>Aq1Kb<9A@23uNcSo(#=V@I;9kN_b}s~Gb5q=tV8@_-D0~LNe<;@( zJaCWgJ13b z#BFiE<@UIrafjT0a7Wx%Vb7s_67?sz)v({AJR9}X&^`rz)8IcFao-1>O9cXai^8@@ zB=7QQxE_LcdH%Y)9RJW=l7H?l#J_Pz@$cLjU{j!+1oeKjC*d!k{0r)jqWuW`j>7*J z#9avDT|B_Ibl{vy4DZW0rlLb!11@vXo(o(>&uOlv=O|a-vxjTs*#x@^Z^!lD8gv#@n3z6@F*ne+h9ny>WTJ24({vfQ5{vrjkb5!;`-$Bv+`u`$#+c06?w_Be2m9Zl^+{cd(JwF5re**-uwpcBe% zQQs2nP2krM{`C=85Ak)-Pkr>)1pT(9;?BzhqRU`e*foiq*9^?dC4GH8X0R@4D$7d~ zSX~;yhDrU|aH%_NTa=rlz8Tt^v#-Ur>=Us&`#|i^-V;Z_PC$7o>f`c$3ygEd5}M*n z9Pb~%yOHwsz2pbBk+Otsp)6+GDT~<7%3QX)GL!ACOlJEjF>HTj1Upa}1ltGY9;ok( z_V(~=1OHZtYlZk$Y;BaQqP{%ZOTn)M{J%k5QN$NUKSj~sH|Vzn`Y(lX%458$7`L_( zci!)SA%h9hFpDL#5VMQ0cTEsLa{|Dw{To%C1eJa%kgVN1{9g^#jn}8-Cxy zzdPc(BfdMuqwGb!6YcNRA=GPiB=xsCj(V<6p`NL;U>BhL1L{|xeGUB9!GAsC;?8>| z@CK9FU=wvEZr+VC@3$e2U-}>*o7$1MEw-BPln$V_|HV#!l2`H0q_K5?01I#P9*OS*mHd$cz^Kt)VH2g>Pt^X z^^qr1z2(WFUWWY@|r$ zKLvE07k|V06M24gB@Rc@5Z8sSB&pVgq}Do-Oj>)AO>0APYRySrtsyC>)h30ssz7-l z8s%?LUl8qi;g=KsQHaZq_$XqcETbOhIica_g1-}SAJwWrZJ;5_%~9V5?d{>$3I1IW z7kAz=Ch`uj>}!1@=RFNGrWBX{~pKZHIDm)HgwUa}tem zA=KwadrtV}hJPW%MF*{yVZXQHihchlc_MiqMlO+A`}+QLSjwy&l(GZ4w0%;3ZMRfN z`$;OMZI+5_>!fIHC9nv8&qDoF_)LcXR4E0@VW`*8uEI})zlJyy@nPsEDf&wRqzzh+ z`5^kiKJNinBIjk_yVCmC=hZ-<_4)#@*A-;Fj$r831)p9;h|tRm$@S8}H$nm$eGUS*?a~T&rj7)#@8tVb`L(9QDi4zFfLAbxe#m~lyjgy3)(ZlFD?92BQ7=KQ|nz&Zio7oXm1R^2Jo+oxY~%Xg??(Izq;tR z0s3!@aav-$b{MydY>)qM_uTe+Z48`eKPB>--VBYYm9MW|GcC2!RLiC`&~hu)wL(f+ zt*}xQHZRIKP#=l*99j~T71Rr8=in#6UqM`wpuOMDa}I-y*A<(~CWdz-tX(bT>uc9Y zucb878z>F*W=dVXwNguOuT;^yDCPC;N=f}&r6`aW$boVe)Mr3@YWSsue=@`+Lwqv5 z3d-eBUjpq#;a33u`4N{J@ww4YZuFNQ{T4v~MKMkZj8_ihR#EKnzqWSAFtKE?r~emg z7ZW0nXr{%eO|@xi18tsKUHe`wtNoxBh0Tj{4%A1YJ%=^~<=&|8j`l9_>kj|kh#L}= zN7!rkD6n?V63P2dTq}MKaliPd@w4>UI3wLNev_^mH>9)1E$JBSew25j{wK8WG2S0TalOcDwwAM+9p%hscR7RETTW~C zmy?@AB*)T`S62JmZl;0ae$ht|7mmtS_4f`u7~;>Xs-;v^6)Q< zxH5<@g?`GQzq07JJo>MUacW?^dKkBfY>)qM$DBR)^_W;?*lmf_;IZX!qzrMd@z_eK zJhCz<53Fp;Ju8=T+sd!}ZWUH8Sw)pI);G!ttGIF)b}!01P`?H38{oGV{;LtU67j38 zaFk8dD`@B7$H3o(w;G^*!2Zs+6$WDMhSqN^YySlF90$q=XGaSx3E!cHOFlaz)ga zLVHR0m4bgo#MKJYyA}AJ0GST|i))(--X87iyj9DiDVCrS%g~%w6798_RC{73(e9Xr z_PZ%)*Gv!W8}*L)OnqWLR9~A9RHyY&CDt=lvEBsf-4uLZJ7f8OOeF8I;9XY!`uQ=| zDl3n+s>&m+dh$@Ki9E<^E%&k7%U!Kba$Bpb+!Uw>R71G}>Pw-$82pOBzaZlBBfg+j z9OVM2&xQ7E@XG}MbcjoX_|)hp4f;!melwx}Y#1jO#w&nvi_3B6-QE@Zd2n~wEs30W zH=G|X?d#XZZl+7?W)iKlDQg`}pVk`d)znO-)iu*<)yxc9IWv=19JV0Jxlo@C?U~@0 z9{#BjmkRNzv7YI%o|&+o*~~j?F7vut(7dV^H!rK@fNDTpl$)ZyHQGDCuQU9+A!`nG51%PSS{F3iPYc>?zd7>Utjw(Bqep4WS~xx?9_3Rk2*{WQF}=-YC9=KZ6IZ- z6~OnvER?6B9`{+)X!wnQ|4_sYMf^|_hO&x!9_V>3~sarKmkxjMnNLb(y@>!H0S{HnsgBH}6{zM@BvM9zCE3uoi&^Pb8MGA6U5j7jVy zBZi$}jAG{+gV_Z}Uv`Pno&CXR&n`8Z!`4T+Ch9Ary&U{X!9N;tB@iFY_CmQc>f55d zIs6*IzdqvXAig&Gse}INqu)m8zd6Qfi}5;R++IQVO|O7_uGk3`OYHj!*axq0U!V7M z^$Isjy}>O~pK_~I7r$K%ZySkIxs&3&nt6RAZ_+n@E|RT_njlNczh$Q9A3GFKu(Im1aA3NrN3Hq!x~=QaQ&XDZAsnJa&bqLT)~l7t_-wrWRm;CXR1S%mpNSW9>)vmlH(8QspGQ5 zI!{O`ox7#{&J9ux=Mt%db0)aNNQ<2VrQOc1(r?a|LHV=&nu@vQfL)i!>thYC!_hEs zzO4O%HfcWlG&J&hdm2f+la2SDRmN4%VPlWyma)+D!5HT8n=L$1W+_i)Grgz1Nj#&> zhwksq8bJcnB19HRJGEy_ECwJ87DhvJ*5EMHF*_{yrr7f~blEI1!bH6Q<0DZ^h?>hrsl z&iou@1m9Dc%~w@6@|l!lyj!`=|0aLr*U6SJTFx#sk;@7B!tpD|C>r2{Yto?BW_vuF`;GF-I!0)?N zpdFvTsQvkR_=WF%E{OFJD$p@}1$sAEfqq9S(2GfFdLGG7PbBH-0Ys%+llN2=@_;H# zu27NW0+pFu2JQjx0FBN}asbtUZ-Lps9^f|MVKS3cKtZ4~P#qJxPR4W^EmmFX&$W@5zp%p$Qp zvrg>FY=PZ^@)ofekP>)9ZxMe1766@rB7h9sp|*%Sfw{mCpc~KuXicpa>rgYqXsWB2 zjw&X4DOUX5dqmjk9VSfh77|pZj%D*NL;-i^R3=81ZL!SMip+j`+qMjhNh`i19_wB0==D z=0#6-PV_7$jAtHs@198Ry9bc7?$%_7y9!zEE==aRBgqVRX4uSR6>u2156GU(qyW$c zmFhr*H73>DNK$Mngct!F&UDR3fkEf8iQdGmr=La|a*y7eD*d zY4r`eTcycT)g)8Yv}B+fMY^bkNPD#?DXZop8PzO= zh5tPzDLJV4$@hwn3{gzdSTRTu*kq{tC?_Sq%PGlTIU`vtN0AXS;^i`=np}hAmz$B4 zayP=s!^m@KI=Ln-Cr6|`WTSL}ES8>tsx%jtE1iWMN?+l)GE%sx%n)uU zON4vMX5qea81{^CTe&7&Q|=4rmFL0<<%6(Kp~TIKC@xnFah4J;#waPpzDjzry^=|+ zr(_k&E7`?@Kqep@V3bJlFFC7tQO+dpkkgCv<&@%JIb3Xl>+&};Cnl3W3J&?H@VoT8 zutz!}ES9zjBc%mGCuxMxRoW}`#dUnBbVM8>xuqECqc~f7A+D2di^rtX;%#ZS_*Pmg z((+g`pd861#-XTts4~XmJpT%?XDe;wjP7G5niiMR+ViRCE{$8q_6OSvW z#6OiIqN45n3hrH&Q1t3Acv)Mnx#Co)vg#YIfcl)vs6OUQ^$zz*xxztz?xb>r+pO&7<|rGv zA<8nYl`@a3tW4qZDPy=a%3w}WdUH;t3-`C&j=L{6=dQ_hx$|-*?zCK-J0a)cj>#Ee zBT$yOi?WNmA-^P#4 ziBfNp%IcpuC*G40D#OiJecUEBEq7GS!Ch7hbAPDigYw+j&e-qr*zeCyOl+Qp``E03 z+$6at_`J5ids2gB<=c~++#oWGn@VbOOGpxK19?Dpk^STVSxF9)#bh6uM>dg(WDyxa zVn}P!lT;ziNnuixM3Sl`GpP-<14aPLfpdVD%S`eC9f3u_1%T$U_W`wlZoqJ0EHIJJ zL+0>x$Xb3ZImRC+_jy0Z30=5I;TNu!kd^NzjN=yz5BP&ZQQ@{QUic`S5@gXWCKXfR zf04*;a*KJzXtAPLM{Ff_6$gqj;xuuQ_`SGJTp?}|mjR1`?|?BtZ=e-W8OQ@90X_*^ z#OuHwU;!`ys0-u;OyD`cMf??53rqyM05yR8Knj2WuedGZUEm^c0yqpD0*-U*#NW6@ z;u9_geqF_sd>t__A1#*RbBh)ENU=PhK`hCKi-mbc%*8(yvhbIL)R=8Dev6Ql-yrw_ z4tT|F5Uv8dfH^=nD2(b{HF)>=o8SVc|b2)H(S4ddoS%}Ah#IlOnh#!OAmbw z+NEdZ&+9k22l_1Tqh6Dfj3iuy@qnZ=_LD5eN|N1JOfnnuNK#`W;f(?0rQVuc*Q=0U z^ulD19!a+AnaN(@EbtW2jLf7k&=FV+TmX18Gbsvm24(|$fGfZg;BVlKnTJqT9TH}Z zB{{9*q?+aDdRSe!S=KMyUJKe<<9OcpfY0hHDpc@|7h3sF34MKTag;BW7~_i+C;M`X zi+s`I7GE9ll&`CJ-xni(^eqxa|2k3kZxJiNa} z`ZwYcy_9%buO{BqTZ%9Az9MZ*7ENP`n8H{mrZsSl1q{FiJkW7X1(pM&fEGYeASv)( z+amrB90E1~KLU$@W!gG%tF}n|MT-&t(7K9Fy^d(;(PC;nx0q3n6f^5t#B6#hF$Z|% z)t%_?zED~}Aym>=3w8CeLJPgQ&_ypO4A2!}jDDN{PT#_RuaDu^>$rEv@w*o|1pESA z0&W4%fKPyAWaT4(%s^fs8mI)+1nL6~fGS3HzO>PsFJ#Q+a~eD0dx1}DJmOOsZ}=3( zM?N)>1t4md>6gw7w-K>fA-1hZ5X!4d%$0g%I-f&E%KG8!+g8x@2o6L5^FlM*nGugHLJ6` zjpb}L;{*FpFGq&!(@1LlGC80n89*se^h$0SCuTRq5jTPQYSNG z)Dp}Q^(F1qexOTgwdm0rO`p)VP^#XFs;8UO68)g}sovdN#7OBKZ=~~1FtT|k8~MF6 zj56N2Mh)*Gqp9}?qm6f&(ZRdISmy0%-1U|)Qd5f2g1VxAPc7B&P(AbvbWyz>&Fib_ z3)*vfv6heNtPNlaY6lrsd!qEn>TCN<@CwFAQkk76{CcIdzF3u90iW9`n;wa?1gT;R0 z0OZAkkpB)v%P8c<aKEfC09kcjH{Yl!c|-T##LV~>}o0(aJ7;1yV}axTpeW7)k*&3 z>@2@Kc!@$#O~847r?ZmR!X(SFYi*KOb8FER!3!Hp-1$ zd*#Ni6LK@xCE$kK!gU+CA-6=iHR{`-y*>Oox|YhF5!VHMbaTy-d%I@J{aw@KA?SZ3 z#u@7xC699rl_!G3WLIB#j;p7<$<x{jlX7i95c_vN%QppC>f_!n#%Y?9<06$96L+u^o)6Y#XB{+uW$fHZmHq z^^KN+&(Aur6^zboZlgP!%;>@DMo-wjC=X&Q8iV08imhjiXB!%m*(SyewxuzPZEMVB zI~fbu9>yZJudxJJ#r8M00SDPZ#%Xr2ag`lv+-8Rv_ki2%2$V;leiYir8e7=$#tL?V zv6!8N_({fmb_V*JYs_R97*p9L#w2!`5yP%BMzCwaVVyC6-2pyl!0QqCy#miiMkkcp zqP`8@3WCno$topZ{oDEZ49J1=hJp5F6M2nF^^flj{M#DZpZljZ->d1( zmuhD7nVQXftmZWTQ1hF2)FS3hHQKzcmNd_+Wz1b_1@lL>qB&Qs3|kZBy5kITYlWX6aX|--2cEx@++Q?qV zM6O|a%i$<4e|-(pTgBxJRslJym0Qkc<&bk)S>$|Hdbx;|MlNBcl*?Kv>MFOjzLlF>y)k|txuG>&u4B!St6Q7oYStdP3Ty?GOIt(bQt&Bi^^^-*-Q_%1 z7dgsmk9oG1Gg-|r?}l=EjFSfAMF6T*L#C{%@*A_V{KTvz-ve%&6=2JwTpsmh(OwFE zCE;HJam8g@zkgf9W>~i$p?e?L-HE*49!(sMaO&%8IGTi0V~IhHClWP@aMW}{QL~7X znomA@mju3hvWh(Mt|b?}>&YJP2C~_^8Fo9$yUA1UUicg)AG{}sgE~dr)Hy;^mkCc@ zB?@(&Skw&?LEQ!(kz~{>z|EzkWG)pI&ZVJJb7`q`Kx!^M%IQ&`0qvRL7YYCDh>Jpe z6#B_W{YHwQ-(u*$6vin>{Y)xShe%awH>pPLA`PkSqzAQ`jHfn`nbdmN)hI6~^{J)s zSwt#Rb4dkiCMiozCDGJG@(mS33R0s<9%>ZE8G-To16@g0sujsh)gu|G$|OBi28bqU zVbh?T2KA}Xo}B8Ac?`syMnF4Tzkgdp6`Fqso530T*?4?&o&UVzyUuJ<_&Q_Px!@Pp zx%6kBG|mSR1D!`AE;<)RM7nxKjC7TYxZ+9@kJar>si_G4JoOTH|O<#RE~e3$7Az8!Rw zZxvn1H;eA%8%|I1wWqiEs?yhe*=g3V&^i5&sAm4d)D-_*>VUs9^~zs@${40n4a07D zr-rTc{v7tL*O8=%H*XTk+d0Wm&ksq)d9Ea>>`}v2Pf5(HZ}*2&LM;vk$ zi5To^7g4}9BjTlVcf@+Q%@qy(kfkNRr%0NpctlDQ+;Nit!2A z&`V@S&)8PRQ?@nG5$I(+M|SXnort!D#v69M@t)le-?N63+%`PqZ-XW-lOdAH5z7=v z1dtR+V#-9u{gKm5Ngf(G$Qh#q*<#cpvy2X;FYcY{8{d(_#!8aP*h7eMn!M1jlRNrj za#?>t&g(D9Y5f^Fs^0_e3uLXnpDfhZlWF>5GESdP;%cAT75jOI{r$bv|A+So+wjlJ z!1sTzf8qVe>`vR~r5dHA)|M!xHBoJ%byPcQhtzJGu65MvX-%}5S~=~smRWP@w3bo7 zq?XseS6k|B)joPUb)nV?StN+@IWKjne?RJpUBSFWpHl#1#-q-44xz1NnDr?q0@ z678bUUF#$i)jR^F&E|hrv-4xsqg)xaIhRt+$h}pb;V$?mvRoNL1}Wu8O~oWxl^Kj@&h?yTHhC5?XFa``cb+Ot25%J8 z&>O~l=cSk{-Zykw>N(vLI7z*sv(PLvg-*(Rq6;!zm?q3aW&+cWJ-|F?9qd3-iq*J= zY;mq9+l`yVF65T8r?`FWd+r*Wo`1zw<2BNc&q99SOOaE26Y`qxPm&5VNwlzmv=vU0 zNy0<2QJ}a>LQ3v~P?$?D*5-dbaSy~d94BdfCMgSFRw~K2 zlN#}3rQZBbyid3&pBMg+9|$ky_kvfEL`_L9rcknq*^~le0j0E9N~tDRSL%vQl_p|G zrG?mAX(bK^CgblpN+WTZQd8WZ;J#YPES^+|cv`tF98$ImYm|w?c%_BVTFEaIP$YpU zclitQUVe!@kMAiD=F7^h`80A3o|Vgha|!;5l#xFrDg1ir4L3!)&UKd#an+<%TrO!U zr%U~~7h)6cj97--Am-pEi+--N_=!{!?~*Ly3Brk+$X#I$*(VGo^M!V#uTYiL6!MX5 zLUKX`hTP_#usiwl>@Yfa2aZg*epl2PM*W(~XJyl6X9GfjXEH}c_ zkz4IKz+Lc!^B!+EKDYNM-`1N{SnTaCT=O2m@ts6$M0F4sQ@h1SlqBV*>q|rE71Bxi zrId{MM()ClmG?8JWs|j(c5FRmFFQx^k>8Y##IGJCHPj^Bc(ogM0O#o&H7TD_>&DmC z4)epcB*H4Ky>M3BA-vK!k=C<|e!ZcXS)U*l)ennRb+^<)|3>;&A1aO14@=W^QT|@9 zA+OQr$y@Y0@=iUAvPSrms=k=-1WKx}+u5^Jsr+b+pY| zH?6leQj63kYd6#>+9)+fOQZJFwkeIYVoF|Zuj~!_-Qx+M3y=ZVSMq=O?7aTi*M1Cq zm*n^t_O{HQeSYM6kxg7Da*1n92w#ar^M%PEK9a2G(~$Fga&nW8z;ULNdpuA6;2H9O zr|`Fn+~D7`XZdIBLH;(op1;U0;E%Io_#JFFel^>WU&NN?r?NTu(QGPy5UcUMSQ^LW zC$1~|5!aIU+z9q1HwVY*M)nWx1bc(K#a`l`v1hqg>>2JI`zyzjV_b4_kSjoTa#g{v z6)|QNb6yD^82J?h`qw!kRI|cq_@0V_6ox1_g7tlDL>;=$XEDm@_xRk zyo|3bPvINOL-=-bKfaUP8@3DIP;S9jkZbe#1AU&o5}PN!!(1qmI!>0-~N4=kjV8t1|ADT@UZo|X-s5unV+DW7;JqBJXCG; z@Q7%!v?yzq(54KbNVZfO5-&P`+c8&hur(z=Q;a1&w0)rl`?INx=5Kh-@CXqD)E{DKDSj$Q90DRUH%{D z9|T^Hyb|#Q{gZdsj>>{Z^mc_G`(9hEDXLFUSJt(1y**sC$;wr<=Lhtwyh~Wv{gz%4 zG+3s-bknSPr0np&!%M+4t35oIMwM<0u$V7s>a;0(ibG<~mHLP4+9Air zR4zyRTh0-itPbR_b;fVkYC2ls6YSz%+!pXz>_^*c^EE{eB(=44t;~X*%Qjh=>3ql8 zTlypvZ*602scinGH!@JwOkdM_XSx5q|2m0x*5tbG5#Rn$N(s5o7E2tZ1~z+=wZ;#S z;>eYivZwN`>_;3tusv}b{m&{+=S9@TCVMY!u~=HNn=P+UB^?dFr9ZjpXt-|f1$%y< zs0B^0cEQT$PF+v+_|_~~<5a~o{k?9hWTA2vj=2@gI=Q4f;13SGHmp6XYc)#$z4rPi z9g+|>M@Ij_=}oP1U2!s8t#J)+L!RE&ymn?G`-WA{oWxYe=B1ktmH!=X=Q`RL*7c3c zfA-*kxku{UC3XDWw&Mc$4~O`BO(vVK|9EY?zA>A#D1F_B<`(BCd-I94w#nWRH3jy; z&JT5xwqbMhLU}QpTCKa{WVu?c?YATp-YL5=ck7*9NKsqBJ$kWQKH4n`9sR6JI;=}c z&_B>2=yFnA=MVXY0}28G_}9rhT8_qylP&UZaq{dsmA}5rAgt@ihgA1pq|3ja-uR&b z!z=>uerwuy!YHD1c@TX|<*bGqy#kjw?Ay;{AGL7r*{k#sY{Q{Hh0$~Qdu%Rpdwi_S z9zQnWx9xWIu|EZM?`vM1yD`V<6;bo)m!yQo<>clG1&+Ac!SB0u<6d#MYU{aOy21D| zaya+k=5yOxT9EYwZgREnigAGTC`p=IE1`Pvix0@35t=qzc!kq~QQZO`dPXCD=KZ}e9Xslu;oSBTLA!Xz~PLEu}v{1v!bw>Au?-wfV+ zrO*CGXSYWIErth@-fNY8qF4!HMUNk%IL5W3ryb?R;|7GZs}>;xig2 zRp)Yh_|_(?8)eq48FFtRrP^2&}=l;vbaO-%9G}bE`KKEdf;-~`CS+53}`1L<_2mKIT7_5Zg{45 zTgCGte|00W7OsUiJxuO(RLVur9EKauJ7+0s1iIB{v`y}wyg<%IJ-5DBcTXEQ?^OQm zk$>aaC^5;xt9|p*MMn9SV$ycMTHX(z-q;^}n*C4hwP8-LharA%`6vD`)=FT%XL}E~ ztZ&?}UUX)|2i0QL`(JMG*`{AWr-Hhs1WZ1_bvCr$b=9APv*x9U;P=9snw0f3Ier?IxPHXPT*R(fcz~g^4 zF~RnAajJ$f_9s3R=pzoL`Bi`I$>GC)<{UOz1fWa#+vQmr)>9R=wX#6G$cGms{`TMI z;GZ`Vubw;a3+lYoIsV`WQ{i*Z@f=t0iE9$ziY+c?iB9LwD(C+!5v~06t7c??NaI5c zC)@T@C>YM>qC++$hPdU$-1Kvu6r9GzZEj_IYi9EHDeL{C{d4H!{txQ;KjS`$zim;> z$lg(_?yT+Ec4XqF%Tl&kaslJZkuTW=a|bteDRZIAlLVPL4PU&hPJW!KGgz==m#E0?VHNo; ztS6dK*>)Yg3 zrOIu~JF4cV&T~j?miEhjz4J-gc8csYpMx4TQc7a(mmi1EH7R^#uKn4U=9n0Ju@B8K z(etYZ_4lJ6erQcrVkzk_KM9}nQm&w+2C@6(?hT)D>(g`VTyI1Z{p(D&MnfF^O@c z)w5yvmUptku=B^>P*!~SDe~i=Tkj7*Gw!3k52bR-Zw*5f!H1+9zY_D}!(QqayS5~k zlVPimzvYa(c@z~LChd3hwM3)js|YU{?A7#yT+2-Y0qCV|KBrlPr5VH;#Mt9+4ZqrC z#eC!PEplA2v&AAjb3MyryfJ%i$GKqlAIXeMLI?@eje%i<5~Q7{xBi(+8;?%D6SclK z8r1Lj{VnSoBaclCZnD}-bv)8hNR;TUse4O{UEh5~t->3}GU3bQaJhR~;a#7ki(WRU zl({Nvwh-?QuD{U(uIUZdW;Yk&EL_!&w22|A?nAxcUxMaS{y{u^FRYCCllnYC`17;w zEX#j)p4gIV>CffL4{UL9z*nnncYm-xgK9l?cZ1wLXTjU8p`H*dyX& zAQcv#Yril(09nD+&F`hSTHlb?dTpip`4>_?WKTHiTIsJXI>Xm%IoTI?*!35e`>Uv~ zr_x0&b9Jd2^Cug$m#n|VKfBT3+Vx>_&&XSyq}V63H$ormy3_To_VBH-zG36!Y5Mw3 zD@3VB){V@ta*$$=J`l!^O-J`}wepkxnK8i%ES8Kbcm)_$BMvppwtQo6!2NI8LPv%q zk<82wyL*u|F6tGqz0yv+N?WkY{SZgoi4!N}PUU}CHwK1bgEjVloGVBF=*wTyxe;Ly zkFCR6#C1nSMnbq=ziv$M_AuAAlFHT?#vcuaWqXm;ZmyzweptqmYWe4d(K?BI+>Jj4 zq&SsfZB%DH58~oD!Nnyq;!t&Ou6!X#)jgIfa$lEYh>IE=C2e@yPv!4C!{rVlr9b%L z@FBqf)q48rK`@I8K+^~BSGk7*8-$GX=UW3?4k5wsCyxf2C5*!7&kdyguG7x`XS}fC z`{1&CN_!62Amg==4@1ZgXOuq!LG)C9$U22>w}*AHdlwI5U5_M&pZb8rIU42WJ{q7UL_O*l5)gSbpz;M_38=jx`0B`NxzY z{O6GNy=vab@{Ku;Og?ONoD^QR9DP?d<2#_PI|C|7u6Sh1RPLf=-}@BLkCLUP*0#nSI*>CbQb{RsH^ z02TdweZzjp0@pXz4p#@BM*@Ux(C*G=>Ri5yE@l7P>e1KQ+*8?=*LL0F0ZI1`45}~+ z&9V5cC9&oDECpTfnWgrD3u468O7an+KT@;d9sw`vt>> zcP{QXe=L34{$m>qAjLgRe=1eCA$XXM1nPZDXj8-GwSySOS6wS1?xGytUWLiNm&5+I zi%y0N&m!C(UNAPzqN@+8GfW{@)V!iR@=|Av@MQKC?}|5Z8q_{@W7;7VKO@A-1LJKh zcsz*nPU(9LAmQAYvs=&Y)yA?T3%({i%U=cyAUkUv|KKh&5~nk^1)D>V1rzsl(-gk# z?0K!Ny8PCW--XvMf(FA%oFi?ll}6V|XdIjPv#u<3(ZWQCzB8~Q`QW{30b#u6NC`4Y zonI2zcUgtE-nyK!l-A?SokK5~GPBBag)mLo^&KONI$E2sId@{X+;?oqsX6AhV+eb) zZibR7(S0QF8+tA1xyI5{WwABtdY4;#kNWN3@WJlr%;GQYTmB(|qmQX#5T+$tDqJ@7 za!xi!rVnyC9^$le2<Hlgf`af}7TBbfjK$qFMKS02euT(uoS@vZ9i7utRT+t^O zn5J_~R5)L$ZrK!b2Qtw)`o`#7$NpLWt*Jlvx$W2n8>?1pyuepp4dddE5{S`-#lF7C zxuAn9E*W8Vd8{dNS=-7XUDOuG7;!a}+o-{D!xcd}X4~s_5|a7*gy|! z(Thl1o;^EO62Tf<{DzUd$>tI5T)%Qj$mral@6EbA2iBgTvEQ{}?K# zUVIRK;d0P5(nX>2qBkzvu7%&%yPdN1M4|XUA;3}X`T}9_R<9H1z06$gy?kvwuA)q? zxq7*p+1a{X4fg)G9EDoghdHim?q@wh@4V4-y1dX);|~7^j<*-ip*X$P@jugZTesu3 z?|$6?{twa}@%gHMHVNJiJ{&x|h;Ag7e|;zWF#B?|J8HM$bnQ{+OE(N3S0T$cIP(&TwwgUe(MqqWMNOnuB zQ2C)H3mKBMej{sul}58D^ol)oV{aU!JDz^xn>>;RS}Wz7*dei}WpGJ&N%0 ze;+>irh`#*{<_P<5W2p|6e11yvf;{_oh9eijdhwZ&;FfLxWOafW}cO{tp1|i!Cual zp%psYgSS6Atd`qGs8Qp3_J8?=-d|`Dc1u(By+GpMky?2_mW}ww z?5_SDb!U~srOyIK{s+yE9!ou!^NNihjF?^dJMM59u=XN5SD%2At$`eC{I3$-OA z4;S9AJ}<)NoXr&_Q7yhY3TK&n&`45HRYYAN(-SYT?AYoQNS~j7(jP83z~)jg2QcaW zGtzrQpJ8u`9iA4TJku(l)3T|2xTz=QEt?{@)C}d}p4zdDyk8=-s)ghFjIl_D+QatG z+QyR!2k85kiR{I@qFO`fH?)6H9JrbUHKUdb!>Tbyt-IazEV~UvJl`J-T@^)eI=Sy% z&uM3eAI?vBm*wsy-(2QzEPp=57IZ@-?Ri=Li0awWpssO+Z<5g`sy1s=i}BLct17Qk zP*T%VeU0g6`_|&VW?~uBlRmIhfs?Y(U9-8RI#62A>yEfK1355bIvV^sF~6huNo@)%0=nk$F1a_fp?j%TV1qbKk%EE zW{UM~VcfvCFrpcjjSuDzSD)QzsvR%N)_s%gF$tPNEIRP)QT=X1h0e0MVUjq0`O*t| z%~7_|gm31&Vx@IdK_*GGPr04L3Ze7`>u_yS%!G43 ze%kfrVLh!C{dgFmlvmmssPQSm+_W=oo++VVhJ8~MrxV$hiPx)R%R~550tc?BlJ@(} zkE(#o?76T3dq?8$XtZc5Ghmp)CTov%G;J`?!1SiK!!Xrex>!Zr4#IRw3-qFUELmfxlo=5S$&gX zB!6cz2d}d4S`Ur|O4`NekIV5rE#F(sHiWK}(vDd@4|9U75pflZ6nFQ9<)US8r_*pT znSD{Wv+O0)x~Qo@Hump8=`lPS)5rGE*K`hdQFrsmU`#F9QrKr-K}=m>yMq@o99Tj> z+tsG*R*ZxEi4%S>V$o-*>_BAf2o29{e|2$%$2IE=y&`q`e%#-4YcVD8JF z< z!?xpv1@6CbjFK}a2E^Fi%{M?jzHA|dr3HWA{31B;ZqhJ%KLs`}NX-MEO2L|G#?ONsJ&`CF{XomCqdY5dz_G}&X&>3%augg zI?dHJP55BV%+OUy>1>Mxo?KuPm+t^Wn;)&N{zMfS`fhb-#dVQMIgBcspY~q>k(a8g zvnpz6x8ez(!elY3>}BoA$N=`Tied;~H?py`Jl{z_^I!)-w)yeuVtamh1bDMF$?Fus z{4asmkjI?ak6k`csIBmL82{y8J;0jH>JtZnXBXJ|A?S!CD`JExA?%y`&nB-%)Q#HV zqsK;>^gXlXhE92Yt3g9hj{8H?YiY+3pD+$3(y8x!V~2$x%?j(@Ct?=P3^Znz;&YfY zOicT z#k*39D5@fxh>dLP6q)P%IeS1oa(Q?-s0*(+;e3caYUln!qL4!DfxvQMlz>Cq;X`f7 zJGmKS9`wSnWMaAIz5}bwj=9vavHj_r#+xEzVUs}}#?1F=d)X5FNxoWcrWcxOzVyj+ z*U5qTExbK9OK3q>kExbRaR=EGoQ=GaxmmBVresoUjCMxLePhg6Hhq5T+gRQBDN%M5 zgFoH%^@ys?sqjczn(~NqHd|%3yJOslFCYIB;!LXPrL41Ptr;l#Q8)+Np@`5Rfy!DLZ$(u34zpm^Mug+S?}wsGuW8A zhdMdEjkz#1IJNM0FR3W+0v78Z1SzH`N!`36L z9aFI>a`6WHsgs4^zWKMAMv)K5g2QKg6ZmuyJoWbYrRwT<^r>cc{w{nrAvQsDZ|Y*3 zB=@-|rX3~Hq@#qO(@r^T5r6X{HW^0?ni_dK{4R~uTBz)C%`3i%+h4NAfbZ`Z;Ya59 z`i~h$JLxl*{PFed>;Dv`lAO??ha7&Jm5enmF%7js&$_S~=BALD+ZKU-S&;xr6dm2( zUR|A=KQj=sYF)w!hC^Au<`4y^%k1d?V!8M?MspYZ=#bT4?>I&lGVji|e{nZ|riRTF z-d!i9Lt>ovpH!uN$~ZUqW30Z>S2fm@t!yEdNL0F`G60NVZ04VhxTs%gr!{NU;KjyS zw{rfWs7$K5LuJO<&Z{)0mX?6kRXKe&)|*&+8knHlw5OpYqh@SLO#8;_&93&6{6pXE z?x<8p&QJUT6BB-7MiJp-hqL*|Maypt(OKzmx43WaYv7DNJA~jOl=M}Bs=4UvUGklQ zGd-#m#Ntr)-Gm$7G!1o~Q=a>|FTAbFVZvde9rRU*7Wc4q?>w zcskL>)YHHJ9bow?_hCE$yBxy*aq>6aU{*%s(V5Y{$(9-@*Fc_juG zm|l)T3K1yOgLkk=ycZCjagxVTs~D~I=wnJUn>_KlpYzCE>G!+)r|lPLvk z!zDF!ma1tUIyHUGS9tBMh5Pc3`&$L>4|tccg^pGi!+N4gk!xz(hsJ2OU1v0_ooiO( z7tX1GbmjqXBd%>W+CGK5^X%mz#_gx8S~_no@1XtiS3;D4_l4^WEv;(Wc+&LWfTH!b z!&;7q+fhqhOwtMA!1?QATPgILY`nD0d({4W=W$5utu)E+-1lu)*bd7yq3?;PQ0hYO zb=ju&`!SY^81x zY;k$yRMZ9_pB8N&-1@jZ%hJk)y2_jPZxBlaOp3F$CSu15T$p3y`hQaq3ncFSqZ?24lcSRlRR-pRUbcLfcPpqThzh2vuXPKD1gW}wN2xE~(1RVW8TpWE@*q_HEI?(1 z=T95@^Qo*>5}12OBaaU@b(30A1N-_$aI1`Q>w2^J@|mAFCr*F8!vLEAPGYkK9|y18 zz|RFXtrb^iRcXA~iUyCw#PM+vmR2Fp{wLgys%l6~EXUJ)9oXR`xMnCT9O@yA&3uaQ z)im(ML8lmWkt6Iievp+Jxhs|%%!Vc?Q`dp4KWIGX?4U;tcVg_;f zqRR1AG_F}$Jvgem^OWaC8z;NYxT;mAM#T>Wl{XfRF6ygPyzPD`p@(&1^E=9rZ(U=@ zL4OW)NGtg9VW#-x`Y%)!7XH`H`);@OKOWQn=-b9UA54gCw8MO?8={9=$^z3emHj!= zU}qu8R0te5U1FrOszN%S5E*gk#$7y#PLYN3PNB6O-H25M3O-4uLFq05M+ z@OB1HOA_$;B=)8uYDj?|FR>}L7#xPdHhi)vzEF#8HBm<#&c_(k{aO2H1QO;R>dT(- z_;FWJ7D6ifPTp?vld4mCE@V6$mK6n}@awx(U_FX!*)P4}IbYHqyj z`Ca=fNB=74xQQkU@c|xfI0GcW%tZUG z3=RG$GSz%iA$PR|SzGBrFR%Qwx7niOexbMmAeX8=v|2#iFo*11{R|4AG&vW& zT9gbvmR5BpvxTK2tF_A%lgvD`mxXk)$I^5B%xXzd&>n)Al9z$^K=$gBDd%B@P7d1=SYrUPEph9w2DXcNL~g34g;&)=sDPHH~>_>%3X3; zttnOn^DZcF_8H710UR5|KvY2IpPW9q*Q%zxJ zs#ef;H_1R`_C4psDnzm@-$JW7+;2!Q z_W=aFGZ+DKb(x)@Sdzp}1nJ<$%BO0BA^tGK9fLm2JLYBzr7S6s@8`QU^32F$OvenG zFa6w2r|x$o6_2oZFId^^^!7jT#ZnAcV&&Tv& zk)rsfZ*J)06Ew#3mjQxSlZX3HdU<^#i+&|4NchDrWf3pUwk~V|uWV4^af(KFVk$%e^&Yb`oYt^d4&D#Z}%) zlhc&G^YqGM8qdcnD8wfslT$9_FnwWXMZ;r|34&dfU;>pJX%U83GZ>|EgGD}J@&QFF ze8!n|^c)P_bcP_y*C}4P32-N-nuVkJs?V~-5UgDJ^B|%j>5lwXdHRj7M-_r{m}-VB z!#>k|>7*~SKR8|%BU+*k2Pp*RC}E~-E)2Z^GAcS&4Ap<7xa^3PBYfP0k9@N4!{u_? zKa*5IsUcxr@k%XG*0G~MCBQg_F-}aCMv#VygWccn=(JPBYy4MD?JlfaC~8>3Q$EGx zr-#uun6^G{eU8WNM;tCd!HCk${(gTwRP1 zHPtt#GG9GD-1kGWFdL5Zp4?Hw5>nmcHqyQjALVxbc8&Rm>q-24>1mF~dE338r~ltRh*X*5>H9#7EC?P;TN;uF45JF}=2 zpgcH3aWz9c>R+h7sq7wmh|Wy#2~!q}lBjsXuSdtzp5bq1E;Ui*9PjziE10y29}(>e zzz6ZVuyYtfsPmbQ-B{C`qXO7N53)j03Hum6UJgxE@lZ3pvach9BlHY+D)9&CfIuZr zXi>Gr;-|ZSSem+fG7cjrl>ATk{=i^jQuX3M{?MgG>uFcoydP;i_e@XCb#QANmHL;u z)18%_DEtH-`CFo|mKyjvbsAh%Ua6@@TA2WQp_xyoS+1(8-yy{$2d*(iuCzbtqk1 zR<*C-t=xu69>2)+@+s@#Z}bgEmw8!axxWKlRFNZf#xKT5VF)A_7x1^e<$8pE(*&{@ zz9#rR@0@8)_jVPU^+pa<$~Ht_>zyB%GWjuaSioVg@JQO52y~G*v5Wal+ZohgsFG)@ ziDwO{fxD+5&yp!~J0{LKOnK{g5DniK>`A^_nmleR8A2cHoHjBo){FvwtaG>HumvIY zdz_3#_rK<@?vEK!`CEQ(q&WO!YKrsRTXM}vHY4;~;uiw39-OG)5-)0rap1ZbS&VD^ zb2Y!@#llmjMk0zS(~SKAL^84M>#J+vd_~>esD)5{JCaj8Mb^ZOzV#fpiJQcsm(*&0 zIhUojlGA7wkldhwVTy(bSr43Zx~1?#R2j@{%O!iY`ZJ-$0VEa1_iN+RrKx5f@{l?{ zDNw8EBLom+1AkeObxWJd^$8dDoHTYAR2HH<53~|x{+?8NA3%HZICa{8kr0n~zlsrI zaGs0r)rYHsXUYu;ZJ#X{9}Nti4tQRcx>v)>hdDV8iVD$WJiAE@uuvJ7)~-KkM30xv zBqt#ZE2Eo2dNkJ1uWP5fqU`db7- zkIl*MAYA6*If86KM+aFXI1^8l%@k8gNTaCp(+aRyNiF^Ap3et{W$RRtXk2?Igieqx za~bP6rcZbPbq?Iv;Fg6kXLM#u_jr7(E`%y8Uz?rubZbIt%gb9IbRpJTE>_0O;_ff2 zwQJGO|C=g0O!_hRoEZUa0fKVBvP+X8C|**%7vi3YkCz?HPe`MNw>q?!9w*6q=iWL@ z$Aa@r*@G~>#A%a^`4Dv%h)LM5=bT(E_Wdp&+B@HOWwL>1#l^gskOJ+21LE2F^v<8_ z2&wO~?&cjMgkJN7lUVP^jL6D?Hnl9TykhNTMq{}JrqQ9e11J*w4B^75>_X+wuuOci z?BM%^G;I3V!3F#h`t`zodCaGR=@JMZY4xI?3%OZYF;Te6PfK4Xa> zNV)q<8`7!oAz-_z-dA=oWuC+|HmDoo*HJ!|Ewvk(-X}Xls%&y^3}vubR|=)yb7HxD z5J1B6XA%qi9zmp=^d9P;P*(0RY&;r%F`kv434TOLVVpACDt|_0;xl9&N4odZ#q6p# z=7ufNxDXeTIz*ZIbn&lAfFHqi;gyf#AuZ z+|P;9@#&P?Zsz(!4io24;CYTDTbKW=zA@Ui&&@apI|5NI4oRTjAk1)jxwc9S6XywL zjGeJ=9qy&18`YRI0O3gVxF66I)#*PUf$T5v+gY=o zM9OLzklaf}6j_}cswiP>bdtYM*8p1&_?PzWFfw3g+KX4YujQT$5PjO2MWzLKEYL8#E zEBErM{|buvUuBq;%q`iy4!HgN$1{TL3GiPu&*E72LTk@^>1^}KQuXB|hDIrqF%fW@ znUppcJ^*4j*3UP7{6Ey`k>^m-stPlQ2nQ!Z>Bye_viP|lH+Ab^}W8?$43js zlR=qul)6W5&4~G72vt$JQVHYh4;iM#wq>;rKWXvc88lRb*kEp)vOAW+UG`)`~&ji$N zS&=N{wtd>&lqzPIm^Xd!fsn&i|7AFacJ!S;+K_0;^jeRz)0}owbH)dDO4?0cJzbaO z*8w_ocSwPc7^I9gdMcePO6DkQ>M3hhGl~?>Onxql@q8sVJT4Ft_}*xBBZJ9a>t46JF&W zjG%}ElFvFKEaa|y&N!!##}pqxHW&tVHUb&{$aw4miXQybE6wrIXthG@L&(6+o(v zZH)4WWM8H+b01e^riK}{j~1IdZ@M0)-oyFO!{Kv=k9(-zF!9I05^Ud69oxlxZ7#d3 zqQ@6hyjf+NwaUHn&@*sh6Y;r`Cgb9LTea8nn79(Z+_5(`im&?Ss((kQ)Hk-8lkK2@ zv?oRy3kSX5!ygM&Dv2Y@FD4`k6jxdCUDi=+SMwUvqtp=WHn*pV&W-+iqTlSfZQNyWKb=pQC$l{*WF2uGsV-oo4Z}zI~~qE zY=zQT?>IC%WQMoyOc8fq@9i)!90&(uU}}ONSZt84k1WRFw3-5>qL!iNUroImQb0(> z6<<+)B=<|Q>VTpt#iBqA@lY(Oh1EliaX~y&`fHczOK4d*aEKPxDwD!HiHjV#I<)Ze zkf(+qsKPzYMX&nX-3k`1PRpgIpI+8+$C`sI;IG=9 zu%KscF}dw`ro}&2afe066l7U@?ywZ{lXK^X{F&*iIsd#OzR-ej`f zF6g5ANe~!oWi8o{)lS6;a?|-8*8b5_n6CsS$**>`uDh#|9hMY-qr5LNq-5!FMzV%y z_`*;Q?{8$Pw<6Qejy{kqXe2SCV6LAFQt6=Bzdcnu@)K@)`XI&+tkJfh%WpQh4UVEG z;3MS!=@b~d;djM*P{1$>`Q8zl@_(5j`5+xgt->0Gr`utB!RB2n)O)`SP^|uw==`}b zU2bp(X$qNsrZSl@(^p@DOl14nVvKiTqCjoB4-xf(GVuikX<;n&MnPhH0ytd;TbnaQ;e$^C~GG{CYycbop2Ea80gymZubQ9bJ>$XoCuOG$tG zdD7#JI=lB{Xa=#+N(1bHL!;fvxpBT=9?~rHkbKbE8GVp$wNJgRAu+bkV+pdo3ptXD z7CTb7Jj>TUX@unLt|H4u)#}74{?B$O6rwSrrG99xM|L^bLoL<+Yk-k&OU?Uw|8&jH zzPYmM7}==rNRfFP&z=v6`dc+Gdql#9c0;#RsR!sqf{P2!*K4fCO<}jJ@-9)H=+JUi~UA#WFWFah7 zIDa{+eP5jh-V90#QY=p;x=@DibYgtd{6;fjHh+%+pBgm z!D!Gln~*x)zT=k=#{yYM^*hBZHc37Kq@=qdB@%QMV6@5&)}OI$fR3MP#ucHV z?Tj-XyymjFXB?8F>*8LprbsYlrhnSR3vFF?(;}Q-yQ~+c!S}NG>lworYBtm-Z+nV6 z5Ywmx>GqNZztryP#QujpP?R)isp7}V!Xbdk%vt1I;U!0JW0`}Y zw*J|3HM4rmi(mxdHY_7h%tnmN)0sJjJn;~D;-8w?az^u-&zWy2yA1{mb|F)*xUk;` z4juk7a52YbgVLV>tPI9K-gd*3{Nzhpf9(5YmU0CbBJ6d4XHaM(C0Tjt$IayzG?~|1m z?OVCA)&n`rY;UdE=jzcYgX>hL52*Ejh*#FrIxSPLc1DvYV_koGX*7dcUG4g--SiZp z%Bht}=1K22eAw4lgi!Srp{iot_b;=DCHvt+HOFg}FfViGm-tV^U(t;XvfgJrx%M3J zN@s;v-|yFiW+a8#@uJ88+fP&uR5`oi|s9Y-o`R z%@HQzl1YycT3FU3S-rtYh~^&^l9E|n4j&Vg5G(L~n8f=u=!{caclZskh}DUwo=ok( zeC>pohpcrFsq@PjG+P%VmWXX?n9M%RM6?X^L?@KH4-=N5c zyCJ*wgw+2rmdKrk5D2A~{Pj79ka`;Sn+I|m;)caTT@{tVx zg^Z*OD&KrkQFM?MqbYDk4yq0>_f!<|E-Zwj!@(kyR~(JWVav?tq6fe%&^?h?XBDOFi+gPui;Zs%YT4?@zj|>qBYGtG?Q^!WKg} zGn70n!ET>yTTvblzFAR@-pv-Rf9e~VM4XEOf#igrzqlb%hW`Hh`2~+HP&$odWpaAO z-5zf;2SzhF7NA46zLA)!9F9KD(Q`_3K*f4xeLI#THhJeVZ>Wur=GzkyFlg8~Nj_^7 z?4FwBDJoBFhW)}%_e~ZEbAEPPw^KDkg!Y*EqUr6`1A|a3KS!9cS}x-XCHj*b6Rgfb zp~N0>Zz5CAa7aVzH0?+56gll&Skam=+2-@_h1RT$?0)A6lB`{oq$~6+%;Pkf**F`m z?gi+GBh0+J#I)EVY(Nu{nZ3SrjGd$#CVajji8NhOBk)!Wpq{IP_D zx(%Pg2h4|x(|<=?+zW17`N~R&k%WNKJ3XHjya4+tex6(9p5Aaq;5mlo`*g6^*aD}% z6*w!s!r28invIwVabRgsY*wzIiNus&$NM2h+i3DCoQ>F|uh>QZRp@ikB5H4ZVG+4F zuzV>dRed{tI@lIB&~oVrX%(w+#B)M03MyH;l9Bv9Gx(kGtXy;aKfIxrKTB$3wbr15pRVj_pCqdV2YxNf zyX7MSBOce7e^L~W7A;4P)H5J~uO$eaLADY7&^L?G$}r>LdQM6e4KKH?ps7o!`jj$u zBZD5V4wC2RPfKcb<@Bq0fp)Afey@e2?zNb293%_ng8H&o%q=pv8@fq96ifl6>RurZ zWg~Zj{A@>~$!Oqj$b6kvW4UYf`v)lTVaF!y^)X3ikeZpX=~FUwPZthyfT`j%+o{9g zhxe^UDA#K7JDh433A0X3M04vUMy{aS1H0UjwCQjPr0_axS6Q7a_Op>Pxz1+Y$v}); z-_)WT2|DYhZl;Y72t#6GUWr7UnDx^_#E*>Y=Q)KhBsfC1h!!L2XW3G`492XtvDuB3 zOInvb9dS_*bRu>ooqh4i!J!!y`Q-(AuW>0Ocaz(`>i?>~Qsv-Pyl??ygn>hl5hqK0 zL#0ot4548|4W(np&mCc+^$-2E2A9ahEMQRhitaYaDD*t>PvY!lHPs(F446LOh816P zW@|1bbKoJVoiWkp1W|A2ic9y#l;xm$?VE@yCnpcDRf8V3M4Z-O0Bj5C#*odu2wgGU zOVF=E)ueD3T!xWXkdf9_49!`qM%one2ICq4P5>@|wE)}zJOJwe)&pz+*a*N2zz4t& zAONrl0NKlK0oV#42(S%cJAe>?Fn|bvD1aCMQWM<)AORo=AO#=|uoFNAKo&p_U>Cq{ zfIR?v0rmmN1MCMl0H6SX22cc00yqeu41knDRRInG90pJWPzN{ypaF0cKobB=06qvB z6azpP;23}&08(Q;0f4mT=mVSrzyKHk7y_IIFakIOU<_aa@DG3~fEj=}z*&HE02Tn} z0W1NKtrwC|Spi%Eum->a*Z|l9Tn4ZMxB_q$z#hN>;2MA#e~Q>_&;AdcS>?8b8B1;zHKUFiM4=YQ zXTQP38&(2a(_o*RGDp9Cahd~Y1&SXy%(J8jg2(aj`lhOZVEB(FDp^RgO9Rawz7pKk3g*hZuxlQ6#L3kE}ucspMExYgd>} z!ZaRTV-1b&4=LLc;{p(BJy)^lQg!%aIDMnIY$*AQ4)SU&jCh=nWTCpN3rr*#ju}p0 z&nq5GChNGRJ(Y&WT(I300qwn|oPpYN7HKS|>O;qoA8AeEd_t^$(x101u0|+0ekk^GnnXnBXvsLXrCe3WVwQCq{(;;)6nB*p zLwQo7tV<%nTP%{nah00hmz=O);{z^!KbWgabsWDA$IU4#saoXK0#Xnza)&PpUSZL> z@t}BTRO;knG2^?o*s}wj1FvVMk6{P$fuj?Wtfa<)7mkIdCg=X)e~dE8Dmv;qRAAg# zbQ6!sdOwECP!nV7Gao{Z9_PSHS$IbiIQ9A8t})41Q&yW@-0k=tSO4sU(y@#rfg=hQ z@D@7CnzbEvQ+hORb?gUVFxqh#8&`6PITGSC-~D5O>;PSgNV^+^(PU|O4c8%h9$sk< z-d;JJri6`CxK`(@^{~Ji_Zte!T`LLgKxwGjClI)f{Nr{*y$F?mLe(!c23o?Icf$a5 zNYRbq@TO}mi49Sbu@lAASkfn?lOi#!)%#8>V9i}{jFVkiR?x1qwG}YTN;t7Miby%~_9O9Qy*vqdoqqz!9S6F$SHp%}LQ=Vhmk(6z z!l8cW>?TOKEV*alCFwIq=Vs47xC^*p5o^$T?-7}YZoc-JC&jz-Npeu)Bd;Kn(xSV^ zhw^eM5v`YCUE>w}u$Ewt(TURVdQ@}fw!kL<-(@wL_`2jRPz?j$q40~YD(zK)Z zLlQEpKMSf?Y(R}e`tzmL2vc2Xr9DI0^P(Er6;9?vPd|m^Tn#!xVe_$-_KBh?sPlCK}-FC$dt6{+|Q&6+j3LzTg&4_;1ytXwUgwQgaiMyV@v zY%)e3bP0F8xD1CY+dtraG47&C#MrD9UCrVp{kH?`PTaP$bj6i&+4CW8e=o9lazyLb zCg&Haxgi(8(B5|Eqk&mJS+-GrAWdRksh6{20FGXxbDv)A*rFeIvHo)!cYT%if$Aeb zkSmh&YjwPn=4T)|X!NZu@ZL&AE1XHmV)f+$e*u%2`)@CJ9AY@a?v8GZSQNas1?Ml= za<$-prtV21(p7^7hcn<`I@AFJ90^RFdnE_=jtF@SAFbe9PHXf?S&MqmlZ_jk;a#Xr z1V%ZwGMhmDq!n!$R?Xm~gI230x&+$-Y7FU(N^h0Z%Pr6V$~|uFyO!L|Z;hcNutuj4Ua(zONs51Xh=E z=#h*!90H-suzbhz%?M=y)AH8hK4fJ$ZO4#u4Ez&makZdD(TLMop^3FATfP~t%#XCv zj(a^&FWP|0P@Xwe-B-5Dv*-G9Pk1tDaK$y2$nilXo6BA6FS&7ViAY5$Aqi!zP_|Oa5+YRANTMPn+hp{v>>;}>Q`wRvW#7Auohe&o8;xZ` z(b&c?%=f&8x_y4XKj$&e?d<1yp68s`1%M~%)ugYOV7>R+{%cDzAI_YCIQ1n==<7%3 z(sO4lqm*2dz7>-;0`y4gG|O3#3qn0wv_!mkSHyQ1J?*cNCAW^OxIpY|Ss!9^)=*gi ze4)nW@>6zhDO;4?lw}Z8(C>PB2MYd1EFrv6bPim!Af}7v`-Oy{&olJ?E+(QX73F2; z7A3Npea?hk2NbjtY98$dL z<4Q~d>|4DO+o4(#tM)^n!39QFimffHy*>P6r>!XgAJ=EWTsWF3dvW$)>*)R8iOa7Y z+uj=^3%hZWY2ko|NO$|8qB+`B5~+C-P!Z)?jiMsX4k)#f;z(c)wRh7NB&YO5gCW;f zb(%{egn(1LZB;(PVz~wtWmpm7kSeXco_|{0*h8macF4rSMGG7ZzXMEqsZ|w6+Xy6` zS@ylu7(vW{xPN#!qj`m~$#3eLRBMuNa?B+{gnpL5mc^G91n^kZRaNuFJ^bnAB#zMT z)AR#qg>Z79XdCOZQ$oxLpo^}o8g<(3xa$6@rR4m0p{lbK zpKxMTl?GCC;kDpEMV+=cCN~e9Gf@LhtIEZ4PqYZ7ff+IQFde89oarl=bG5;_qa%W- z!Zx|YFhbhqrl($}k)Iw~vBVmi8xoDn0Hl^x7W9_Akm0-ipgm0JWsTp>4j7PYH9Wds zt8b=1=8G!fhYXArW^%#GZBppExbn01)i;gCb<>J3tw+c~%>j@CBheV4e-X2fUXC9v zWN4vKtg7^mz<11wUgA9tT8{Q6+GAP4K}=RvwqY}^TtkbbJJUII-hz?E79o5ybv2GcOs8jebU+1fhyH@-FRZ)N=538KFln z9o6tnRNXx-0=;qCzRo?4lP0^|tKnPyFQPr5ORlDPg+Lfw%GKSi;AQ>W)6{XiL8n@kIub1XRBKM2`V2Z%02dE8WE=oqiw-cQm3Gl<{}WugDq6~ z;i9o5av0D7`c;g%N9cIq3ulK6os!}Gy#>5j5E?AlD;&LK910k39;NEY^v7erF!Wgl z(U}airNR|0{pm+G$q%0f^RnD9>s@k3@TlsYk<$biX`WMyTmI{1%wm~X0dJ^yCGQjOz5;XVK+kqN*tcnI-y{v+PXi-r z_axF8qgpq4ae0>yz?;~#%cna_AtUo|8UKKUL$pv@%b#vCA~;>vry%&^?6`Asr}luU zT zZ3CC8%FXKOWLy#zDHK(=< zmJ6n-??+*XQ6BbK&7`Q>X1yEr2v<_HZVu~sa^%pd*&XC%S-4Sy0@}+zZFV@0H8rHQ zLMLF|yUVu?%Ya8&I7Hfx>Z^74w33eiz~U&t>Mx9Eb|l^jXf|ezma4==uN>Rg)ejL6 zwT**IB%LJ6iuBxt>jfi=&lqFC+K2vK#bqny)wyuvr?*wDUUZpHCJNCEJ0~DY^V$G7 zEWiHV5iPl}LdP%--_BhP<>QR4h@IAQf8@9`QH>Q{RcNgKV)l;;Dh%$q(h#>-!#8{M z=&;&|%f{$^PArj&Pz7X}q_Rl^*jP}|2uPF{>sEl02yWF{a)E`8lN!Fm-!V`39;REw zv^9QcFc3)ff*5MBpoJZ%1v|b*w716kLJ@S*gY4WtFF>DK=1TD}HFT3BR z*cjXz+!BAud_{3i0Xk#Eb&<$nL2A z33(H>#GP3yq&qyfUN8JF-7Hdhdl6vZzmWqG#I5X)hU7jY8n=#AUOFfh#7Ukmnkn&g z9&b7a1OHh=K$j3BOL0cLEp5GGT=R+S5svUA$=4Cl-ns=}29{u;U-+6_b_dWi`_u## z;|M&C1&WC~+CJW8ab!%&b~#dJ(2ZF+E45H?{ONH&RJi=26jRS1ByT&MRCAYNwLMn^ zhG5n>jepwchrs#umAtmm^4eXFvbFyz^=)UA6bnQ46oQuLtu8~5`^GA0_F9k!tB`hN zda*$X($0p5vhaORK(7p*Sv`MK1jC)8`hMj8y|~bGj%9Zlx_(3MRJ^`QN{{60Yuu*p zfat-$e~rar*zWGRZ5s_;7y8TXhtK!toVhc#Tjyq>0tvj5B=mfoO@&PnSZ}tw*WzTs zUE6i&gsX6ou$P1;J$oe+Hm*Lm%40D?3_9oi6?j6?T6geg$?+U=!CPb<0H8SK2` zeO6bL6JzdYYviLvfgOyK_b%c65>|HZDd=$Z`JyH=c->`vYUj`ke7Pw)A!=1m$_;ZR z92ay1W4kY9#?VY@C(fugPL*UhomFpm-3xV)F;L=&YE-%5@Q*7$-Q2k@ztF%O7h5)m zs+2DaNj6Y^jS(p5hTIayNf@pe@_YD2jzy|JSG=r9W#?90!q*EmrbRIi{nG7)tt*%SDikbh^C)s^&!kSAa|7Ay%5+K9{^K}FO&Noe?L{ot(P zvRD0gmgI%@0a2DtFPwQ&D@&5l$g0=Bjz?W`zk91X8%8JKeYV)&et(F>)8JAT(&={2 zQE6(El4iM;mWuDC<}OJ%w5AQf$9~<+u0gsY(`U?Tu1ePW%nF;fV1Zhn(>m2HQ~DTg ziAq0OE+Ys=%P6kOq+RV3eU}K&yb_lLTRwFUH4Kg=Ej;+s&IMiiu1CG=(s!#J+&V?T zi~*$9Cpk%LGU8Qet|lO5H&HE{PONblWR-cD$JY`6N8s`PWA3r=@|gV5qyR7cu1`H@i#WLNBT=aI z-Y){?EHX_>7O;=RCo~zP7Wd^r=dH{FbH)Vj_)kj@_b3Qh>FMCNivW${<9{(|k%d5X zxO_9outdhgrSJuHuHCDIsDKM%ff$*CxCq3l)%S5OtRfJjQglopEllUfS{5YE|ULex=;^odYfRd86{0n;RmlsB^gew zuK7zpKyjZSTgT+UV%%~n`?SoUP7QS5!0fGT*q+PCsy};-_8h$%-uXRz#+BbUV|!{O zi`5RPxK6SNrN^n3C};`M6r`bL)e7)WA3o{w8Uw)@HQ-=pTV?CYx~yZiRXgW*{Y}0tyBG4L0_qJHW%rF8qxH6&Hm40UIIZ@8 zu6nxp_aPj51P7e)LkB18zaKDAk{0(o2p2Gigsjsk0aQ zs7r6L+x~r5+;w76wnLAy0w?iXr{u?UWca6zy$M5=&C`Vb8Baz8-9l%F0(E(xXk{O_ z)$|#at80+T{9@Bj%08v!l^?eKUzXTbG`rqv}ckX zl1WxIgq3^Djs*)%Z*AEP_={Dtp~cY6PjfPaaQc$kHXgzztG_@H_9y*fsO%U{_6aT# zhLs4zFC}29w}zlN_bx74o{AUCS^C#_T((0~6D}Ek3BPO(M!aWE1d2Nu)LVic8rVzb z5^BDxvIzfV`gBN@-A@zDvx9S<4x;FpszX=pq6Cz*>-LK-;RxTbyO*x-YUH%Yt2|;5 zRAy@yCoC=34`!FjkKq_ob&Qrw2F>3)YtsBkQnXX8Gi|Dhxqoaa>ys=l@5oL)+1U>% z3l*8Wxu7&AtmKB`6y8?2a`3TlOMV1%By<^DLp<7!%w#%+o5A2T%?BnyQz(A_byUtI z61t>_2}SFa79Jkt0s_vcDlStq)jaqRXp)3zlaYhuLJlC8=dii$=>Dpk?3Ym zdH$G$ktap9F9uGbs~Ny`b5*m!tQ0g2%+$>jUg1PxyDPO25qtr$t5uT-h0;|vwN}tJ zA$Rlx1jd)k>UAWUObyShYg#OFZ>yw;syHPc`iE8c{My{`&&}mXQ9R*6o;T8V%OA{# zIJVk9aQK(Df2@$c{Iz}Tr%A6!rF0SecfR$Pv_s8|h9;(+6gfRsue;3LddF|O3FSs9 z+_*y`l}vcy5%U+43>*0=T99MK6CQU&4)sM2{Z`RXZFN{g)d5Pc{`(UeGN4xnFm75B zdCAM(;%6cJ8P2n4MtE;0xyrI!eCo)Y=jx_Vw)0_|04A&x=aRxy$+U|sq-Nkxg2*OXO z>yk!?xW6VQlH|e^cGw72Yaf(X0|l17anS+_5FP=Z**kJj6LUtE#B?dvo~kk(mi)Rs zA##MCOWbMzOG&sBZp_^B8}m_QWz41}{9T-(ntpN|YvWDSS&7apzR8P8>n9vVWf=9Q zp;ClC!!H!j96{Vi5JIcBuu$XCU&T}7!yK}<6t(t?uFD6pxp!TZwH+NwN%IE&+NvGX z#`T!@V0!&LRwD^ZB)=E344+@ao|JOK6Wa!kDR(OaJvCoPLe4(e`OIn%=yL77kBaI~ z7WpS8ApC-!@Q|-d>|snDiU`!*MuWCVd^2X10wW$koJLeOiuuK9!6?ZP)z#FS8eoD* zwd;42Ab1Ewgv?B6kBD)A?o7&edK%EBs^gev!wU2tm!-C<9a+QbCfw3jx6p;>r?YXU zp+HN4+C&mWtQf)avn0QfUI=Q}M7Zj?{6j2a%#b#Xb-)L-tNq{NXB6k&8$NmI$srdu zIrw?9pI{CuM>=23cPgtMs{4-SLR=6V^DrD`)3`NUR9bn6-!-)z zzK&A!s;K|Cr^t48?q2>0Le{Y;HD5hh;hof(Z*AikMYYfvx#l~6x$NtiB0oFsGgq*U78^ZRDNtOCQ+8A%{th^y;tL> z`J|05IVtOBE?RzKUT??x%(Zbt=om+uLWjF%Vk4S0?j~Db(4U1KbDrh?5x$6X!~5Hg30>d%x!2U8?gKS zX%%`un)%_Ck5NAu^Qi!u5<rEpslkp zp1A=`Q6+E94bLL#TnG4>VmcH&WaV_dK^$cf-F>RBl&vJxmiL{V8Kd#gHJ6J>dA=>| z2Vq+#kEvC8hDR;-=SQz?yjZ&MTrKHkm+cFnfM3w6OpZ~9a*sw##p|+6-=yRVWs|N=nOGP6 z;2O(F>y#@vQY>SCVfkj;zhn%`E^OSaITXwK0w4Mw9^%QW?}94sfmnhEoB8ieb#rz- zm{~h5!Aq^y164oJ&d&S>HKW~b#@$l(NY|~gWjDgV*aWVHHSThC&)q&oG`sl=y_3tH z0`m9WP{vTy;dtGD{M(T!>dU-wsS33suG0RI$N>JEzgglf-Z=Eq0#Di+c5iO4KjO4# zdP*@IC2bUbxg0tO8}YJs3JjEUsnqf*kFP#_jf6MUHyl;_5ha zRjc&vL+3-sj3!>|xg^q^cS!ugF4osk`4-td2i0kY8%sh}HBc+}Gt0B)nrC}?&#v7? zMuF1Bx-LHdzzn*IF|hnhXT?CL+u^-yU^+?-*zXkNM?D2UE_df`{R~StCl5tyM~li=Iq2m(i`Z;dLj}}t(_+Iw|EEN!;^S)d5jMX#mS9#M z+x634>=C5)Qv1G!f-RD*i+nldm-@R$E9($$%TKqQu)=1thv^}^r?78J0i?yz{7eHBb zrDM|qn`nWBGCQf{X95rB(VfcUU#DI}pgmWo+#mlww{xm=cnzW_*NGLSf|ztXx0+r& zrF zT7C(?bG@sN@pqpSYhX6*XQNkXo_c%DrFN=PW{Ady9FiK?jFuoM=t5uWUk4_}dSWk- zh`X4xa2-+7jHN?)SXck(|4|QBBM!27}B+*!DwndBLV_rJtdq z)jm<$>}55FJuW1O&b+T(IhB=m8O0cr+j_T63F`16Or6Lub|H)=u4K*?bS*C4is*YG zttH*N%hK6g6=#TQtsT7Vo`%lRd%F^T?M!g>Nmy=v$`pA-p}{GkCRqs*eLMABM5B6Z;&`7O zIvBQ4sS6~@DdQc7a(iggZU1ZLjG+KsPere;jfp7dUO`Q&EHkUi4JRVn74>dPJQ?Kq zsjL*_==~-L!Ayzs&?=TnCJh%mQjYJi;!qgZdE)Fci9X+58WI48zIZy@FvD z0JC`I&F_1H(=vYvH%3*ytLrHUY1W94+RA*JT|_Y9xzu}UhjCK#g8<2g#kW=E(JRZf zKnOZPZ>@vb(+6rEOr$t@o z@=ww9-%O=+O5lp%&>ek%y0bk(u;|5$<$*SW{X|(&Wm>M>fDsN%N-41yl7sOqn?)+q z2)~6>sf%yQ7??5Zkq{PJ{Nz*!Bsp_c+2U@Bo}v_0t4w9Zpa{e$$G`ooYVr;_e8?K0gy7NZ6#hja5C=XEIm1%fws`x(ncUX$TfTznGqGGR@N$ zr4y%3+Q6QynE3z&hSf;OZtteSbK#RE$tx;4M&PwBgb5AQ1IrmDYpkruSi3w?G%MOU zpPVP%nll+m!*Ypbs!Kw`N6sg>I6``(h;OpWqbbV0Bf+fRF1UtkXDF9xV_2s?=hsWb z?d;VgY}I}1f^Ajy>tL;HL6rJ?ZS3W)6qk&V} z8lWvg7iMyIPB;seDTR)S`bMY-{JrG-ZA#PEo=Q0O%ar1t)%tl&9zP4L^3tJ!%D3B! z>NT26kZT{tZ~aSfHx8>1@X7ny#Sjr+figC@v2kO=+=Mury9o!s_Rk9*yH_gg1s;65&Hu|g3H{o6uN!DPsybZ1G{Tcx*Y%Q|9f6OF9(ou0Za#fT zuCKr12el7(!js!ND83y z!3VIHBqR8#>6wz7?$j%DP=CgFrsU5p=244SkZW<=RehxDFv^Ns|CdG0WuD*M%HNU4 zt_s}h0Pj~xkH~}b60b7N}nFh7qt}zu;d>hExi>+J{%J9 zb-X15K(h{o$YWMEcCS`734PIL^(Ow<-id&x1Yf^iOhKd7I6Y(k2& z#ru1>F&&cy4-1e)AYah={v0sZ_<(ffO5%A#mkh}y(k(UyHtt*14OUF_W4-z z?u_mV{j+MPueaR1kN9QqQ<@tR+c6xALw3Kla!oI_5mhY}`WS|XICiOqZ=;6xBYNAg zb6)>f55e$zo(F1e|F!0_0}~B8(S##jHJa>1M$Cmc7HfVRk*MZoYBO^gHC@KdrmoB8 zbE4M!wuP50d|$k+wnBbJT&h)?pDmm4jZ>)ej=wjri7|yjhaFdI3Ap?3?Vw#kae(h4 zHDhRoFE@ZSzsW+GO(-st$_7jF!u6DxZtf*u_%>61(e_4gz2od5zWTV&M&S;d`d6xO zv=06`%92cHO?kl`=+5TEf*fi!NPuK#!f}D&Z=8zhz5z$~u|JvkTJp3HZ@bx5-Y;K# zfRMH#b(Yv>8{w$DY2{qfrWNHyH37?+vLw%+=jjJhe5LfQ4uqtzEjp!n#Bjb~DoWWA zfl$X>&zT>r^X0YoMB{qZau>`rc9EW59``tK)>xU1#dZJJcO94eX8HeD2i^G?kGl0$ zHuXsREZg~gI_qxi7gw{?o6;7E{nC6~H5eM`K&6Pj$!$~ko<3B-FjnG_QQo(xS$r^av# zY3vwgCo%D(1e(iTWkh&pD?j{c)j7Fm?z)Ml3K}f2G)k+dq#}^2j3D8pvxDd39(TA& z-M@${Zn>-@_@WZ5^QuS6H5_T%5U%6A#KD66aB!=orm!Q`e@6+4TDCjF1@CW`BdmjL8GG|q)-vIbGh{3t=-Sm%`JGX;4ms%X ztrB)NqzpHIq zikygV_NB6bFL_G)EmngO?5_MC4MZ!*@S`#k5x?%*CBN9P{?h-6L!&+aIB|JWkyIUh z!Ng^e^6{!a-P=>;9Nb~lrEE9Rn&)c1E{h-^GWZINrnntZPxt4)#r9#}?E04v?0S%D z+kyp$`1dYDZe8fJw>~>^sk1w9Y6HaYb8pAlX;-+ke}Et%<fC;os+{wM9(n9zyo8{fJdHD%-$~sGlf59(+$}j!nA;I&bzfI=?DX@ZsBV zIKUD!xS|@-T%rM=KRD@lOvq$LKV!LvnU8Tu57x zYIby0QZT#BgILuT{{NP(=cEl#5#(78H+E`U8iL@0-qm(EryV-)!hgWNTPDp!wNvTo zZ+4)0HxPFX^s*qe31bHzEex=-AQ<6FO1!T~`q$}rS^W1gie z1eQQ{REEI}v}az6^RSkbFZXpN-y03KK-BH?O0aX5&qhg5E?vDHas}!Y^mF>0#Z6su zb%;`SI|{;Re;~hENR88SDHK5-cqTO<7|q`XgJdt@H%sK@-r zcIi8(sc`*sXFwrSzLX}tSX+PmozA0@x&27>V;gI|if8S&X#V0Qok#uzi9(Zn9ms}k z28!KH;D!jp!MnZk`chf?mWQFA^e=9Ju3lz2MVh)rYIGlnq8OUj?O(3b)_{k&=%=w< z{(p`$(h>1ZIx~7w4Ds7io0xg0l9G^#rnNX|_#VcnANs`ukX&Sb>1c_Bst+2M(c`^; zVZ1fQUqWj8$XN-ygrz@_2o-Djhe+_9t>vm6h+nGGPAr`xEZVWnwvueTCUWqIafzch ziy(G*l#dgsPPpXV5ua(ni1L?fb#I{xy;)Ol5M9ekAIfv-f~a{LWHs+2T00b@?NTx~ zjXW9pKU*3FN~TIdQaDa$T+->VcNdC&#e{d1`c|3hq?X^j>{S7ev31+T&KJm&rqECr z@#_sb#cY*4Ty8sNHvQ6Q@HnIER?b5z!N+YSHNj&7=03XG{%Z5qk(%^1p}r33LNc+6 zA2VaP)xs3eV0>lcmxUqn^tqNV0(Jk<8VU((&`vt`5j!9>y@Wjs8;(D4m&psLlA9;rFiA&y4l zzc4b>120<~LX%v?Hv7K*ua05xYwv(=2GP^u1!iN+j+j3b0W9F*F0xWJY#-JWjI~GE zh0j2TdbR1Xkl&M-->g>-7XXCFZJ$wZH)@1aaFl#K?+ES&-vy5&zB`@wyA?pAHnp2C zjI{m_Fpve)_N5J#1}G5aJD)`@dCeqqY0Pv{?QeAl#QoS#>0SVfBNNH@#K`&IL%IVk z?U6iA9hZNLCW3bM?=Zqik6*_Yk3+0qBuJ++lNjg_KR>zYlp87K+8DX!&~HTqV2Qg5 zZb^7KvPi_c`gAc5@bK}KzCOWVlM(u$BP{%BKLkZ#c;1*j&l;!cuNxkPf7h zUviR;a;`gMPLcOF8Tmh4F(~PB)mswo1ryM}bKQ@=TycHQ6^)c%+M8S;fFKLHp$jh8 zTRX`?J+9^J5o=)=TB^ywmCZoLBu^JJ@{G9CC)~#`=mEmCc6HotbuEaT>CU- zPP+(*g^__jp>@0*ZB(~rB=P0Xf%E@|KFVWZ*Yhb#?j^oxJZKmiob4k%b$D@SS$~J; zb?A2f2Z>H3@pUzA)f@T@nRE%Y6^{&^+kr~o|0Tnll5}}mikiliKWODL(rOZxxnj;3 zV|0NOLw1H6=3`5@PBF# z9>HEKRz@r)8JM{=`xUzb`T5=B-sx3c?vQ~sldgvTc~-w81+H@EF{44Yb&!hPZLvXO zIpb{2Fwgm0rO*CQz>s9elX@rVS;`{Dz>H!CFIF4SuUiuH9bQ1$K2%F>fArhGfmgfJ zN!LC!1q#+*hR5*-&Ew%X=e&QZ9RK%_{_t2-Pe5u07IRzX1F(<}v)<+6G6l*EmvBdJ zy%t)5*Tyvi3@@@(CSi$nU2J{Zc#)^-QrT+0)iRY!EIt1r-LDi4v=P=7Y{lIq1?QlR zO6=z9r7QQdaELh>KlXmT>pxcz>Slw7(sPm)c&*T$A_nMsX#c|wHhXoone*pbLN1$d2J`m+IWo6}4FUf+8K7FK+ zsnknVbFk*fv>g9~IsLqEn;y(zC_0$m+=Ftb`d0{ML^*#uWIh?rH8ehH=0O*o`g3Uw z0m(BJ9{dNm^}3o?~P|3`U_9t;!9ckMk_uK`b1qtWj!xLZyt ztnW~~(?We;@Y`0*xQ}mL8SP!U1)&z?>fXtR(Y|h(LaZ5E1plon#U=mt!w_VKS8O2v zmKuFQ;b`OEh_yc{F@8+JbB6@`0`$(g%eUtDcqK!p2ijOzP`4VXzKf0Y03OM&zKB^; z8)>or+Y57K)W@=W)pG|;U`dKsAFsH36YpXLqrRin4QEsQZ=!ivJ=LA6|3`(y2Pn!{ z#6&#-XqglU=!uHa`4Ilh+N(4*InYH2y&W&@p#HJ z8LsAAcVd6DjoU=YMSkX!AqA$6+- zFdzp^siA&5*vG{netijc=6usnSzk)V4nG$!6(hI-fHz}hZlgNqTTw{5a}WNPn$t9> z*+wO;vo>dj=0S;j;fs^Kb1ls#1K@V#Q-B9cW`6(0XD{b_w2AmS!%eAX#=tw71)fXT5W3 zH<7y4(h5+`l|U`7M(VJ8fk%u!f;PYj*RIg&j8J;PB?H;2uH?h;s$EymXQ^5_1sREI zmPY-{Kc$)eL+jY2P>k=p7hf;Y8NEwYo0|)j^}laiYV7P-uSQV(nD}F-yPV9$BQ)!2 z)xY%%XCt=H-d=WnmLZc8AoSNZzO!G_@&tFxK1HI$cun8#lQB2b;1vFAyMmnQ9m7MD zJcY(eg^uyh>RUfPdY3Q5UisxSBXSWnY$wB{_6s>_*&~O*UU}Qp_~ezOUF7d- z6Gh$5$+*L(1^iUShnqj2gD;-=t<;X+Uiu39<$>Y+;~mFbl32dsPE>~OdI*=2Z>PU+ z!IiQT4$jxGBTt_X%Ibc%TQ9@$=`jDX4M6V?6&IeRlrq{R(Z2^{dFG>@oalSN%Ap}- zRTp*wkb7IKr@0r1=qH@+B#^#@$Z$NwtWAA{$IrB?6r!ZtZ*W&Wsq$X56Kk~$@3h_b z{lEj&UsbJqlgo*1%&qr~U7_vsVioVN^HZ(9g^npkn}J{c4s4`O2_q2qISHpv@O@zC z3qy~NmRo-gN0)wjuI_s`#SP=zE#QJIW<*Hao<_g)bjMx|pesI=XB&SKzR=6J=r-?gtL0{FA5pF#pB<-tWGX9Z4(a}i9xab?esX?c_!#@evf(? z<&k@YS}XcJ0NYb;11xoXeBb|f%=7(DnUmo&O{Gs>0jw2S_VpP~n&}hq&o;^&_{A{M zdwZJW0N8h<#-Jhed8Y$HE|#tWief@teA{+H_BxO8O2y3Dli(%rJvgy)3mBX)_7^j2 z-+GIASHft$t45#uNN&zeG=&mF*8R4GmkuX|04*D6a(8&)!!Zs06k6|a#VyN=#=F3n zSR2^&-Ov{SerIBpx!G$QH9Aj9$+qU~@q%?o^&onhgt9*dgxQ2jnq*~8-gDCqO@tBG zV8q5h{&%v$Ep%2mTV9-a^$$|L@Lc8mqQ7w|=N}{V!U)n))CwiLJi2Fov1d1mJHE%l z^|x4nfG%q%Jip!pZ+t)sg$F{|Y%z;met3uXdkslv!GLyB`k9qsL5TNzb zIycNGg>W<<)>{=&w>y}XBVM>fqj8f(0uv!yo;S#vBYd&flU7y0=rtG0mr=`k39s-( zBhulz>+4|^iObmRERc*}O2pd9#(goIV9GUl)2*38bC?MR{ruce;cdG?1~ z^{Uw2`;vFz(9wChsV(BcpucomDYT2z1BWwDX5RaTirKs9(neTJodL`gMYevNw*`+` zg3c#0g~eiz4n8%czEZ+pxddxTyQfMn|K;b~b&B5Cd!i}HDEDte=vQtnAU0)r6S__~ zrwdy20PoDVE0njNM!xCup2lJ-y>Cr!O}NB61GlUiz|!=}q0CNd&nn*K<4VWSt<}c6 zBLt(!mX95-+WB!Ke#birI;KHB?d3L-;HbWhDy1+-Y4b%#3cNFcJ)fG+&D+vEq&l=g z&mKs3@=eE~irM|~QF3sL2nyz`NO13%&xfSv9b3U8*CGC;Bgpd9O!PZtzg_JHVFW4V z`7xps|5G6OOFn!CX3zDkotMYNLPG3Y&#@00*u9c^9QiyRk{+G`jcsVMUR4Q3Hiin| zvrD_nA6On9?#~{5!Fnsu8&^MDVsfQTb`NlL<#=P;1Uog}>y#wu;ti3N;<2jFBe-rA zmj>dN2BV{suHD~&AZ7bgV^#uMXP%lYg4ev)-S)sTNaCQ3?6obDGKS;}kCV`i)pzDS zvgOa2B_7G;L)R)*iuHxH-c;=;#mT6Px+deNn}S84+mAac-_9)+W?yxIsoNlt&DOWvR%X5IT!AewDF5BvTL~%w+cZyEOU1Mc?gX5X^;q^Lz;>;XH zC%W0iSYMLRU)CNjle)=9r<$4;K_1F!P`Pg)j56p`nX$yHW2km03xcNOWTVG&sc>ck z3Fe>bqWMElv_VY(hTfcg_3xQvol{L=TeZOh1nSQ~ZgDN^(`X`6VaD<=K$x{MrZ2@tz5l0nK7{Rp11(iZv@V z?sOUxlO5Xe^tP;LdZ2W>2fAfO+V1GK@Qo1j7)L^Py3SoD=TcYh|OFbz_OQ z#>9~HqpDT9Dcet_G4{hp12}Y;&{>b|bQzQE31tzLcovh^(76Q%cb>(qL#mg?z%fof z(;upX4f?@>X!A(kGa_qn^Q(U3hfl5e){f88&Bk)wp-Gb8vy(et%|0rbeS9s4%^z&aydTjDM~z!YkBmDa-}$5SIkPG(lp`~!jeL#KHyET zA3uHpreyN9G zj2X&nevK~#PZ%mpwwsdTS%)>bt*%U7G~J@if_T1o5Eh%aD-ACO4!2O=C*$!^i$$I9 zscaEj`YldQ2id41)sIR+TMXYd(hCX#D!#nba{ANr z&SgW@i(hOYlR4u6W4R(DCcbe~#C^V>jaX})w3gaC{P3}o;8T2AK50pBFIYOHgP&w% zdLrbFgI&LXmmkfrc6*~5C;@c`n~hEQY1`?6{kT^ORIfs)J@LC3c)Vx!QN?VGr_5jR z+1|K@KK7!Mdu`IUAqK(Ty>H6JBGch0TUIaKyA0u8>ny$Q>`xFPYQ{S^R70P z6+{}0`pD658bk{>-h$T;MBeQ!CaU~>+zL;W7&3Zh`}S2WGW=pd?#A5UfLQLU>^!iT z*8Vo`KsKvI?fk6u@jFjp9=E@H$yUaKxNcsm&7AU@ZnU9Yc4J)iISpb~(Aio!n_%oV z%rg3HKw8dSb<5+oZ&8DBHD^HTy9P;BEcY85peP~m_?OPJRkPcFINU2SsNMd!48`PV z)_|oPRrZZ>*Ilrk4JZGRf1J6E%eY#g(?|2kcTr)kEm7b>kCGPX2fXy7jBF%NZ-hU$~fG2wmCip|J4++##VNhziGh7Z&?@P{0k$_ii^lb;y<#;O}4Tp9TN2{;I&9AJ_w z7ZXM$yoixT&uhToN0fM0YpHBLQ+3f?`TEK_q~qMbesO`f1wlBhH;m&Yve~H;UUn80 zPyqIHGfiz+S9)Ih{#f8YXF;j7VkJy@Nrq%e?#D+i9#A_^HbVSlYh%^2e4>*`zEB3U zftPDt7W-dg(k8Fp->xO+&E8F!SQhC(ClqE;9S%buSq`zIyJO#|Tu^=oe%N}6%iYtn zZ-MAC8Q;RVagC81X`kxVPo{;SQmB!Iv+L%XJngD|*Lkj-scu}Jr{5mGe0=fI-RaBb zvV5*8-;5lEs#Mv=+@b>;Rxa+m#fErqiDKK{oL#GO#!^XDE!z^D0fRUD_h;_rOCx?3 z6Rb1hqW9%n9mtEo`Uu|-JVQl^Sn4r7*)^(a>poQ}QuHeO6c}w}D?aI~Ee^v+Snk@H zzIEDGSYzeBm9U&|cbD}sM18yV=N+zjbOV)K0E7PYLF|=|5I7S@Jvoz0HC%M-^puCl zX6~_LrJGrhfIz)SQRSN2cM>3stfDQBDK_~@4=<|}ieb(@#B3=#dF25L?oyynU|-pp zy1na%KuK1oj;qwQbMdxYwG{e)?ffy^!K$9lJ8i2I-Z`MYx>y;DoQE4h#3=XIr)eBS?y&^pT4y#o-N- z6RF_)jcx@+eB&}<*u`e_@T|0n5=84iHC9Ae6{YG{-GND{l~&GpkRxatS(3L0WJ|1f zgGIZ3OSQi*-u}Scm$KxfjkG*?Bs?4v7@FWMeS!5ebXaqtyb4^uukZr!=DZDlR54Ft z)1uM#ypAOjQSbFbdSR~B$t$5K)X#Q@H!YQw)3=2~&``tjyh=zTHVBh+kwU;f86W&x0hMT{34aVHeK%p_#7x?3`n2Jrf$# zJN%oQaw4jl_p)(6ro0KB<*?ql4~nl`n`wXw$&blHdGYcnan3lXZR6{@!- z=XdGe?cS|(=OKM0V0eO;JHZJw^Hbiu6DoJrBJ^!+N{r!wMLp9d~{h7%)1g=ZcaUq>R|#plOi$#2{b=RxTFsoPviQx-cg0^94axAF+C97$=a zw)&!RCw$ApIw!VpCm6x?y+5f7o}<3^9KIPAq_yEFJbxn~zOa<}zLL{HT#b5SMYZ>zz(8G< zeM;-9%e#6NCI@71!X=Gh3*+w_Y~CSlf_v}Fd9y>2e8M;1sResW_oVhCShz+1fT7}* z=X2(u>@P;ZDLC}cT}wJyrev)!ClNkt|MKSOrH1h1BIN7bjVkB>0ym|Q zW8CKiz}UzH#~Ua4UU*!&WvQO!$L)e0cf%gi_d6a0y_S3W+XrwKXyk-SypqZsNne^CwRZ9|eOa6AO|vekrL^lN>qsv9ZjQY5(Kn<1LbX;~xw0 z)C(3%1|PZ0!Poi>!r!s!SSTFUG`Xu=5kdU)7jUisY8IA5y2jL0tyGFR$y=lT0w03^qb0U4o`ti(d*n2B zOGt)!LvC3rn9M-sm}2|&$RanGxYt!mqJ@f`{M=yQw*Hu_Z#AF);a_$En9c) zT{jh7Kk0cQH*#C@=>3?V$~NC277(8kACu($0r2{IgO|ZuzVljG)zaoG8)@MF2_HKJ zlq;33b^H7|h@2Du3g{+dmZx@M{N8E*pye<7zZj5l;@hT|CQs}Uj=a9DS#paIi?#m8 zguDmqcjZ~YXy~G#er^2OY5%5|G#&MeHg+c$lq`7;fenV3%8#|g*3U?GB$4m zqrC#?9DxJc3~NMiY|Wk)KdlmY==;D=Bk|#5pMnE#CwGmO+Dw@tp1R8%kxLSE_qn4m zh-gW@=NX3Zak~%8#O}^Hfqr`i6SeejNWl*m7?Z*yU*5rWUhWF7U_z?6-e1#b`cb%rc(Gxr*Q^)H;=TFhibU*ytv`BQV+k7s@EXru9BB;!@6@j?pZ z*dj;mj8|?y{~=)Xw%D`M%c{-xX`?krrpzhe*#){BO(4o>TXT4q{9YKl>zxGlC}psj zwPcITK|8`Dmr>6!hATRA11(^w3#S9kBZNfK-a8VE2_*ud>%k&N@t=dEq$a+1>opstp8BnkwtVe5{ZjZ&#U`6D0=HGW$5AX{8JKmU30Jv}-*kX6KoXHS(jN2sWT#26+UwL)GK3B9tmL0^{ z_VCU$Z^bU5F#{hFDjH2kZpO@f&mSmn>p(-nNW|fT^W=!R(W%*TTFALzLz775ZA@?; zp^<08W}36cRn#P@-^>4u)95z#ac?rH^9|EyJ_L9MGx5p$taHBKO^2S`V5*X}j}f!? zCWKm`k8>Rp;$Uw1FFH;`Dw&;2qdpM?Eshg-qGN0il8ak_99Y2(-o!+`n~P6`knz@OmsLZ`VwdC6%WK$6 z6?YEK)IVab^ej3r$lIoz$qdRuy9H7ofp{5Sse1L2dY-o=^|OloN0-42Yi#$c4Ic|^ z9GUBTh1loH?K_ium5~Iu+G=F{j=Kp@^X4GZO2Es(9gkW$sly~(%UpDd>=r_X zi$8M7%v_nMtQ!l-2Z7OitahN4EaoKWbN81P`glUbZ0O)#A(zBQ?p-|D#6+bo0b))c zZD>MXTsSl3DERkHlxKvligj?{Fz@}VF#jN2CKG+;!2Doe>^lGh)Ftz%eGrnI7BT`? znhC_AlhexI1kF)l$iFdtEa!SO`iB8Kw3Ec6bfFQ z8yIY%jT^d8gS}RS*E^sZo@&v19rsgs7x zg)b)`Al{h7!%If%OmnF>WOKmzz18U1wf~Q&Cl7>r`+ksmNvSA$iIOd{Rfu9#B(i(R zI-(*BNp`dJ)Uy>8O16a5J>)xK&@$i6&H1YYkm(qC6Z$`)=N^!t5%#!2W-L1cO`7i z+4jrVwe7C2e)UTh(n^sx=p3oX%st&D{)#qHBUPnX!BG_redot}1yY0WS{+%kocOHC z)RM4pfzDcnxNnK$m#cr@y0APX0t_0=%gT_e4vj^J><%mJ8}vZvNSCV zOCk39Z8dReel1t(s#i)aYHjsF(DpBWLLgr!{6aPVQa++4JJr{3G#x zmbC5~DJQa}V>5WiS*E90lL||=e?K;0as@G^SrA@#udf9NX7>_@{138H-9~Ob1yxpv zMHkH+XXWl%hY78~J)O2H&dlDd(Wu8_NIwM=A!Nos%oVCyzbOQ{lSuNpG4KNTp!xT8 z3$gsH7wUr%bFv<>HKgh`<=>51j6GAskXbhh*-PxJe!*U#T)uDJwOXV@^h%48K%XgS zaD|=PV;*@nC-m=x1oXbm>i!l6t2-2uiUhf6LXMGcTXyJ-k)DXvJP-vglUAbTrbtMO zWg`YTCj6wjiuq+iNA414ts|cR@&n)t3q5zuJ?5ggRTpjZlpLjZujMa_p1YN2fm0X2 zF|wgLxXA>oDpilWR5giX%+|BfZ6@%9nb#VXl=Mv5IUBv9>He9Z*DA`V9q;t>KQQ*A z(62q}X@^c6RP-9j4Mx@)>7Ko}fOXX)Cp`QTbxo6xnMB9RYK2liOccYM`dL9dO; zIzNzinmmQ$f=qxwm&_;(bWAx^kF;ZZg zh846<&74PFo`$4m@AS}JU^=mTH6BrCQxBK)hHqS4I=TUuWNV*eH#=Jw-dNEnAg$30 zbu9qpoxLYm_*8Oz;sFd;W?dNWSu=92R@8T2v%sjo4RHCW$k)A6 zEr}d-X@u;%pSh_MDy6=pQ^mhkWfC$e>xJIIZ_pPz70hp}ebhp&sOQJfedh7Dr_v;5 z;w!%}(*ra}a)5Eldsd9hzCT$Axs6o-iAb1;PT}7sTB$QhvVWZSQE|4Yp2pZ0joFNg zOZ)e*3gxaIuh4WL?ks9)UELE`?D3mETwhlF%@n-se2~5{e0eZvyvv^dq+>O?B!(fL zpFOs3HE8Z{=3RgO$shu$5ss`n4+)xc{+u3Hj#qc!G{}d-u(x%Is}JvWV)Cu=7FDu_ zB*pc?#qE+9=3Rbmy<&u4VR1<`wL{(b^H_kO>xY=FxayNu5D<@ia)gU!R#CniNRq=u zbRCv!|oidpG(tG+3{J z#pd-T{VDjjC9Oz9+Nr?p3;?vd_kE(DHYltMe|t2#ig_b)R?ZX@_=cn)D~vr8sTi2^ zOsZMZ-W3!WVEl4?Pwr|35%C9--pm$0pgX(=g4&ccQB%958$f$|sT&kmNV%QzAh^Un z?kgu-3gmAA1#jQO|HG1B%n8>GX)KXzqu1GsX>N4bVlc)S^e@Hy3dcNHT zQXTw@kZ+?@Tf0`6=40JI4_p)M=TV>DRKJNz?kS0l={|xWsJrzc*Gpb?6E$Ww89%N< zaQ+b%$eLbowSi-S%){ymE^QTwU-l#?iO5G8K!J}ks9LjCwwjV%GkGD8;$sRYvgpsL z=t0Z}fmNDO<=;T{()6wpoDm$;n$hyC&*pFD?sMahw5GscsfC}*tX+Y*cVLA>pg>(;T z+$&``kARB1|!6wu`2W2=v|5)3zC2A$00yqbLb-t5xWW`kqawJ|@+Z|_$<4P)e0M^cSa~nZ< z5kr@=z+E74QA)nxd1EXJ{L9G9R*z9ROa=d3j$9?oVt!r+Yh!k)sqmg z5i6(T%$@j|v&>Z?(7q4Df){XBf>5H^*<#{$WuaQIxO$0g%4P7wr=lNf+tOQry2@Al z53yZWAFH+Y>4lXqfcM7jqLAxZkd}fOS!ne-akgs+EpgKoVuz89(8|paGsM}F%OAl1 zb+YQ!w#DP1`kj*&^k=jCdW<9_w2_42>mbKb5e(t4Z0_Gt-xrQdHwV4;Fsz+Wg+Cd* zjg8v*|EliIEq4W6NI=(lc_gT+!;&J(2s5aBX$A1EPCMWN_~hlxWkDp=;UETnlP)fd z2+#w16((E$95g)j17JSNsn&V&u^m`1-ElSptUwOC6XdP4TJzWY z)*hz!aH#qAOi3hutbT^vSpZ>HrhBEX5bS7&GftTqMI5GV$(KE6fdmDIz|xr+j=%Up zG7c#|dgJ_T; z3Ec0o%YvTJ34oQG!P|1hg4T>2n+FZS57=|fx&a*Qov(A)dD7JXIJ0AF&9`_5?O}Nz z)5{zTzCQ><*9IR|bla!Jd7|2VolW(z)(3q*s`>yX?A*cg>m7vC zJ3ud=06E|E(3>IO208rT=P2Fo~|2mhVQKo=vlf;KuedTuL8D}i5h z{)3!8hgyb9;!u9Z3-prbkZ)vb$r048DAcm6UdUXHI;l{r7upw`v#%svh&YJw+{RKt zoKqhqcTIw0mdOA@}1>|tkdmP;_;Ecd?P z2WojRod{?r`-Za>Bg?n+asA`W^Bg((-;bu3OWu3}Td=zYD#@|X=7ePLQQuURIO%c( z@aQqTpz>ODH0IIcB{rhX6*_Ssy&_-@*nUT|m+(cm8%Imu{TEbvSCB@a_Z*O`Xfg)2= zz)h@o3-%FPeudKd9sD)LT?)?7`ns7%`y5Du$Qow>9$9)`S%PeEYqUbbl>N<{V_gE~ zLec}lc>-m5bMO%C6=!3v2t<~i0!-N$Si}DF_vijh4|EY{RPQ_@mIH0;cy12stL{sn zUSmJ$M_vs8yhT`-K<9kuDq!3;lpV|M* z9t=*I1eF<&wX@qQ!D(HW3OpdI0dvnAkznb!@WVoc<-05f-<7(+PQbn$vL9*oSns21 zQ2OZOp{(72b|-*#)WOf8e0m47R5Fk6hw;m&Yq^G|^!aPhz(a7)Sco=1qk;IX`-I3- z20DFq!`AZ@$6KE?QX4#dSy6P{&{gmVZ0IF;hTkJRsPz$z7h&ftPE z*w8=mwbIW|$WK98f#=WNy8Ec=l%YM)eh*l99D?sYQmDPlng93vuTQ|61guz_S+D9n zCcVRCo=?*gA;v26&KmIffHiTe4YY2IO>V#7{1lHN}U137r z0;as*Qgk-X>ItmLd*WF64{jFt^Adz?hM<)2%48)^lhE1MHtnAMLAI*+W3Zps!6(I- z16^>oenP-QdEXlwILf#V(=i-1a6?hH zZLd$fC2+9+89r29Ji@gH`8QWmao(ejsQ#z0rfby75b8L=_A1b;pqHKlG6BMk2qiO5 z99Q%#Sb&YE10PYkPs44fxxt_w4Q*5gY}B=h*V(<)CC@|a&w@9vZTjWhcrB`;9-ziFm; zm6iQ459*U2txM#G-Gp7BDG?^}w?yOTJ`?dA#KVp%Xek^=nDM) zojqT|T3X`Ft8FpMJsjjyB^tl%`uY4KE})XlWZC{! z{*v{J@-{+4o88(U{WSheB0sL*cVW>3Gn$L&5X6&2zy5VMx z((VaMO5$Ha6fW7(&G_@J&rBe5q%5Zg{HAeb>eyuOsElgY3SXH6F$Wy1oIhPdvwz=l zGB#>L`Apx2^g>mu>mWi}Un zS~qCUFO4q=lhE70w@TnoH}U!_u-zZ#D&}d^{$faG3mxMDNF0>oJIEav+BKdv>P=C!Cb7Xv~-qFLLX zlltmJ$($0*mYZV(Iv)CBxw8u->}3Lk61d%XDtH5FoiQ)dJ#WL zGT2Hian=%o9mk4c56?*5dWS2R1$PyRxuDXcqc~x^oEMc`BU2R>O?QNV{XO?MX8js! zZ&czQ7)|fp!#EQu^K75fcFW=@s^hAgksKn7{+rAm6IaFiFLtvT-KHs7x+W7^xDbJC zmliRYUoMvYxfzm*q;q%@9AJ7bfXl%Ij$+Men@c3w%Tpn)l# z^&;h+bz`$0DZ*yr7BGPUU+T!&J?z;QOea|;@>QYV{@Ue-~}BE zo1s=|JWHk*KFH{6`NS&v^#>$oBJY1XilawRQf{pT6T*0#f`pdmJ*(Uh5ViK|F=Qv? z)vn|Lv9%MHr+<&}v8yZ=Fn5TP2u1KR#hDBAQNB&09outI(?{jhX=-4DIL2*m@kVBf z!M4_6mCt)bZlYqN7hS%imY&lc?V%{L=~=T8qbz0<2i4F=MfYb2sU#i8F^g$<_ys`x ziJ;@9-RKH3AOfmv%N9vnDq$@umHdLsB#K$2)K76iLV)nW=ZEk&!9|BJ*%D^M77?xYB9@X3|R{Wj;tJ1iwNcxj? z(&}xYKfVi*`jYIgc;|FE0IX2-)=nt0)U-|UUumS>- z&K@k<$eKp4k{6Oe&7yX<3d;PBF>}9VkMFz7)a(!I^xJQAFQLi1GHzNf)L!r!=+_|B z9QhBR_Zt6{65mT#3WjtgV7OX)gAjL=nTNBy+schLrLWjWUE1Scx86sh+?LhX`kXb- z{WkVQ)4$sq@J@LZUn?%iLf`X>EwHFFGICM=#1-7(D>V?~lb;##AD8QRH{ZOmdWkPe z=i3Yvl=ppGydhsa*cteu9ApWsCMYDwM+>lxm+j4+;TAZ!e=Fby)>ghDQoLn1kLZhB zS=Nu+Z2GnGYhaWM3%=!vS^kaKQfFJQk-Vz?^)Q2ZGB#R1tY{+x;?+h)^{q?V@KHul zgl6^io3p($h}}V{+-TJPfoaGmJ(m$Ft{2uK(bnm(!&m$2HXqkzZq}&mh_N|w;zl92 zq^bW)uhhk)38ves)C-Hb2GVGu7xdv>Sj`8bQSNTocLPzLlS)0wTGU{rGnW>EafeCA z;itFCBTO7W^;(C@5st39PHP9}T}m~2cjIV$SUnz_%#FUYSaTG>c$gVk(gxFrK5#s* zJ2Y==uFe!ghqKGyU&fEJH`wd6T+1eWO68Gzf-hP0%g?;|g7YZHb1U_t6fS0XQKvG0 z$@mNirWgf5-uyFN6-ljwW+pEEyIJ<51rTBuo_L;@jV#R5py~z$29;MO&UMH_nJ^IV`Xu0qTzmSn%g`YqL zSK4r~8}UKgF&wqZK0bNRikWuINeE22jgK&I!&TRsspTdX%TqMk0EN>+EGElmJ^)a# zVYB8qU9Pt8ylulm_BsMDPi(Xx*zuS#2F8^B70$}_zXGRHo}VCQ@%y~Fs=a0v=xwL9 znbLKtHb5ucrS52a4?O83Q9d+2K_~r%V2`^!OYx`Daxnfk zC;Ld_-kBml>MNK;&Rw=BZDmWo&6igGq5xIwvojNe=2Ki(A5DLtq0)UKUY*#txl*~J z)sFMOgg_03_%LM|;;0qmHu+g%t$S`x0B%AgH+!w;6zY6Av9*#};H;~55 z=fxbSvyN+BzqzPgiL4WgznfGA&R0Lv&rsDsroYB@DT-FSnCM)aiN&=Jh(%;8j;AC* zhvF&V*JI)keAxMqz;n|$mYO89&us_>*0Qla&lN#3UL(>r9=Ql+ER zeW`yd`jP7e#gb=MYPui!H`1hyo&zBW@~%DtffULf6VTK$Gcy_B(`Yi8W3FelsYX>5 z*A>Q6vauNWrHYj}Qn}o0F1kx3Pv)WRV`5I9uZf<`ll%Gm?gdJp)tZ)pv!_S#o{CYf z2V1#COdW7XmM6o6h}>t!Iq|#8-TNLH8HKus5L|nP5JDkyUD97Ex%jVW>WY6uNjfUn z)>z0rYa6A8$E=c{9g=@gcj)OqeJjR#FCW>tSWKRFOs+x|D>bq^bF-8hQOl_E_L-3* zf|=+L)_eq6D(#YU5cP?Hsa8D^{JF>fXS%mZENJ*cEJ<9QJAhFTg2&YBsCh=Nl z);7v&$TLe07BG4$!&t3#sy60||Fg_LY$$yyich`UbD_8pcl1krVgmzLIC2%I@cu`daV z%d{(0HfE*1TeYIca#?k-Pg$>PpKH&MyE=d@EI;M-7^f(rwRl!Llye zHs0S|NHqQslD+8nU1;BCVA)o~1kJOceDK#Q36=dIw{o$Va5TdB!*SEphy!VTHCqmP z^etq5x9=Q1qU%8XyQ`U%tgl1SJR3H`%dQhPzXg9}Vc7%FCxT%QvLg|9Q9=c-T;GIv zs;KDgxatZtv+>LsPcVs{djv2ap%ZQz$>e(i*6A-iSM)8LlYDk<+G?9lzrp5Z)cK;Zxo5^n;FQkK0D}m-urbP`S}pr0%rdYX$J);O za;x%-e>B~c5`Q9kX~lnq+Kv+pu0e@2JVV8=75Ly@Yu?Knat#wHRRzK2Ra8#r(W6!! z+lo~`ZsZJKcYVW+_7@A9OD*#p@%-Y*x2c|2J*oUJQX?*5VVFt?ViBF9H`h)eDSnat_V$TK-&>AmF=S?OW3MKtE1^G_7 z;05}R8AipTpM!DR?}ri=Yg<0$&%afscjw4ce1<;M?LRZ#suk`BS=D8oikGJQr4!yH z{=H9GAE%Al-WF#L`(W5~_9JFsENdFWrbu=94Bvh8w?jn>djYd5Ub(%!nY=lihwo#Unur1znS%{VVl~bZhy(OnY^M8r)x8r$hFlnyMOUFx$p!-*AL#(J&r9* z8L51kR|3EG-kGqiF$E~Vez{;r_#)fvN?~o+8*pf$->YILNw=S(ju+8BlVqq))zSX9 zfvFmenG_GL%#Edq0K;9Rw;{VpVGM@_+oIkFny2xok=`(Znctp>e}9L?q$Mu80>Ic- zy?6SD@Ud5fPTH7P#7I2sBGa|_0;(4q1XxQwhL`%{jVxNp=z-3_pHGu+Sm5?qw1$j$ zX=8c}*=PC#gpq_1AM}7CIXp?%Y_T0~!o~J>N#PMhwt|#<;4TT zg3@nB6&HAAukdHam5OheZA}nO+4C4S-1EC1ky*rE5EpM0U};BP4QPj46ufh-O1##G ztc=FaEPF&f8e#nX{(J=T!uH&kQjE}6TMSrYqMSK!hf^x56A?8PP) z2ME^MRm?V)*gYrROY|9xaz)I&Rzy;+2(1bTQ%Y+_*MI{-^%E_iVQyW)yK=#;H*Dxj zrX^U6`buDopXv{=17jg5gM=M;Pq6miY;N4#{TH@O@12rn{Ey&|Oe(zySyP?IxBazx zK+$g+N&NEgciO%KhiK|lvL?zaH(i+IrO?I34C0yVY(^Glgps?LKfpks-mqxzQ$l!^ zendfMw1)TuQmYx2wUr(r8Sg*}_VD3x6_7aW&+wZ|)o7`&XRPT?bC4DYG_=<*i=rfsgcNFG>2bIMDZmi|QJpwaX+BDg5{he*3 z^%tD}6}~^GWh@J{*=Ig%z_BjaKg4go_kUbs_w+b@oU*KSdNHk`IQpd24LmCX+=_}cv7t(~^`yb5_87p1tb)<8wox43I%q}+7k;->&e30#V?y8O1V zOY>ss>LF}EF|8N(U9RpmeVlFf49{kQFvW_7Z0`QB@vD)2e%om2Y3(*zl1ZTGt7NAE zSAaOBk{X)4_acTO?#2Fr=qLl+kjL$pzQV-@sT}~mX)N=PtVl$zx3PzmV3Rgvx2de< z!GseVpGydnKK91!mTG(2c%#~vF+#!IEwU`%iQj_^WiK1?Zibz$x}Z0~h)|D(4-#`zrIyfxA0MbKk(~u-ei!74}XB%AFR*41JPZVSZ#C;q)G3G8mO75wRD-NR4b^IIq2{b%+ZC7t57ITS18XbKX+~_(? zH#lk|3$|V`W(qIXim2Qk^A~3vAiB49dlI|qJpP3nUBRRo|C=$Ee2V%fMLPQWh?Q{f z>Rj3SHfml$@k@9&z^EGKlr{OySpRapAK|6I|;L zbEkzE0p)sG*g`FiHGhKknNo0(Hj&~X<#QZmBpq~tnokTybQ6v~b-DUSO=LVo~$~tA9`NvCaED%Q~{7bIWV0#8->F54p(MnrGc39V~(A6Ufip=-r;v)4M=T3-9YPg(l64!_fR zR2J4-@A+Mb=2s1uNuiCq=EoicpVbg5cjdw-e=P4N&&K#v2T(s~XZbDN`*?FgOQ^** zC>lh9x_c5nA)v!H`&XgJ4I%yL=YS~h<@pk;H+nIJFW~O;+sI&Mqrb|-pIux~gMgAc zC7}#73{3j@(t_&iy~b?s!?oDdb?amwG;VWYj3T+5V4|&_f~hu^dHz__-RN{x{z*Nc z%Xbuq)3L}JgUVG?d0lXCw0{ufjMOQ@jF8bi>=z3kYd^^unXIV(kfIv03bN*3Gc|;5 zGh==VIwqo5*AQxy{EAyq+EIx!p+d_AQGYm^hJkd#JjD#9ovX%`St4up5cqrE`AGLL zs3d^ZZsGg8uSxf9sgiaRKXV#0PhoAYm#{|**q_-Ga3^E5Dm}L4d%KBYlG~itwof#D zE&Y=)Z+4YlWl3Y`s+KUD=uV&U86zRBzmNv#WS6z_>Pmt*HEI8`w0tuVxL!Q!YXsJT zg;lO{awT_@~!_T@=DLE<7vg<@+8 z3k!*}c;m+O+*P1tE?sR7J-5|>x)aUI2o3g{k0tKby5}mXeLBJ5{|WcG`TJTQOfRpL z@W)9waPWG9XL_n8vt-PFFqYt3@urx6OIR*zcqVn7b^~W?T>DX+XdrsdV7f)!%6>C< zeN2r-rRPhb?Mqj+_~x>V?+r5=iGVxzLjNvy?Z`U^oUiBH5ZRPJh$N*yGF>K+Q3`(6ratxnd+2mMWvm*H{v3Zu?acAV4^hu&Zg z^lzCj<0dF9-GLMu)oQIVz|=v4mq9m&GEuPW=cfB3T_txbaLHN~y}(qnzCe-;MYkxO5`_{?`pbw;M597{y$yY+6)BT6Ou(lc(K|bb$}mr@DVbX#MPtmm7Of4 zp71h-TtLa6^tE5eVSi;iRkz~{Wq8h9cnITVMC=Hqw7m7o&{vwbOQj@?|8^-u{nenv z%bKYIN`TyW1iO>O09k4}@Mb;y(L&33Z8lY0yn!)~CocGuw5Uf!(af}he}Mk(9chd| z8m?)5XT-FkPu-bMhwY*?zg~Ic&Ngt^WoSVp>1cM#LInGf8ZF%lB5bb$FXPdU8n*pt zO8MIST?RIr(*EdNYyIX-FLa)+0MneA7FIE3%Cg_OXLaN-5TuRj+)%#F-#ZJIn+q&u z@6j+cF8qfZd+O7Hj?`6Pq~UZr{S!QgFsT*2p5jGsOcH&;2=u!F7;4)qjX3m@B|Dxg z7(eJ=2NCh!>D`Ad!$t49S?x!2>5%67H~AFKG3)C`YOw4}czQuZ!Gb#6ji|ldPwT{x z81C`xcXIFLM9(E8oje?`=U}sRonyq4(%k>O|AKs*e-)-IRIqY)E;!is$Uva^k%{Vs zVEm$6*8>v6s=wzqXi2JV{pVCaFQcQGUbgVxHiYD1Sq*L;O<7aTd`Ch3u3_bF{%|Q) zT%Jl4TBZPQBvVWZHagj>a?A!-a;-7C0pFmu_3RoK`~+_p*o5-{|7Lb(jyCLT-lfUx zVtt9pX)4{rlwOrNB&I;4c|V1GMSt{%2_FN2=uTR$X+f`}yRS+A zx5_L}(+h{VyM|zOHk8i%3S7wYtz$&6I4CzojHtsms!NDdb?`fe6HF0G=Q_P=WM>n$ zAGeiGC{VdX2rFA`nPB6?$If*tX*2h+=aiBkZUvY(#l7AH898UW#T49Tv{wa*}$kn%(|6iaMM0Odro;(P1-CWs%qaFZc&O`N}I`))l@~dD4 z!eXGsWs+11>9q8L?1hy&-4w<>Oeihvhi?A~P$OPJD{2+Y4ME~@M{2iHZ}_RZ`ZrOq zZ?9?(e63nkTM=W{jby{i9D=h!?d@wxlvRg{O8FQGT$I}z9&Fx(IlJTe zesj_3ZQT6rUcv{y$oyvl^lER-s5I$`(ahN~y#F9jPXC=`K4+hnM-ah4m$n4*FrA37 zLarJ&NeZj;hQ$|&?}(|au24ZQkK_(6R>Hm(gR(ClS^~Y$CyhJX5^BfAF5TfKZ>bV% zvNUraw)D(Yj6-!hykN=RxJ(j!!)1h#)MY4dv|ui)fHBIhF#-SP%_rPwtnrRV zP<#YxESoTLI~#bn5W~JTU>(Y(ytnkQ2CC?AyHr7btHp zXp->fm*r8uTh;P%gxl{(JSNLHY!0Qs;SKCkRKN;oGn&$g>5Gaw08_Tg^L*2mIyn}j z5k=0ct$X|b*bjlO4%>$x_2!yaxUhM44wr8_;dN(3dEqk|isN|j`D%Z?;2nX5g+@0V zx8zZLnC7plvj=8*g!k3Ds?nXss0mpkE29i(R!?JKPV5fxxiWQ-)VAKJqi?}gO6h5X zSo1cw=uG7zEPKZ;z%&nrpUwL$oL7De?G-Box<5w;G*AkHZ#|(hVg1+JVdhC23+w-T z_^^DZC6Dq$K^}A1kH=RV@4Us#BfQ7{RZdSbTLnWJzS43TFJ{dS+Cu>`?B`=J-*D>W zvynScuI(tyD8(xCm1}G_`{CMwh}$h2uGDNdUPkVYEd303KZg7B*~=7>1a4FV+-Zhow-0is)XCZ%OnT#e#AYkK*3OMqP-En`HNBNG{J=BZWPlN(@oPpyUvOc`bF zVBiRzPaRU^-absDS4j@P_V3U6vC9n-3NH6Nl61k0J6F@?*{ahT($)so1~aifE^Adg zN1A^Q%xF}(ahfLBauAjzI2hEfVt(U^qV5&VF;nvllZL^m9b*6sFR-6G{)uo@!GS9& zt5zqmu`23^D&Llcj?}85Kn2n_ERZFh8LacP$3hUTWx{!a3@h6Sh9?@eQ^8V*~GloBiwKr=T%W4G565J^)nu zr#QC8Z}g35`7IXvh}6ELg2;I$<;XHIn^g$96UCqh3!^Qku!ZINSS zx9Dx&Ps8l7HKUZBRewaj-d==O)d15YUzOcLkJOV*k0_nDq+lo-?;QvFgGo>B0C3o2 zrTR-8c$dN0p2LG0FByUqU`R%_M#HQycyOLcHXv~ZRfe5kyXdrvz2ZQvF>4c!%4Att z3EkVCsL5H9oEXk=bn%Ruz50%$!jx~8`nZRT>x+H!2!pNOR=WR^2#nGjPNSd9le~{? zX0h$tR48k#9B4O3ISQE3W-w|Q~SEMQ7dXyOjR?zG9(kGeJ;#cF)u+n_jE@si1=>rXKD()7XG&fRw4XSPGr1Q^FUW=UN!Jdhlxb656J~~xcQ)S;S zcP?z8zrp2EeMZAYr*wmW9TTB5Gp8lf8-DFoEZ2G1Hz8j7C-fi^GzZ?~EwJ&~ciaQoU)=(&?mq%~)R^bQk3{UgE+PXMq>y+vZ-PIdm-(00a?&~oxcK64> z`qipu0R~^*0xQ5|Z}4a5?1`Bw)up?@h6YDb3t7%SaQByoS65ei5to^IiJNQ+!^c-F z@+z`RzNlc(?eAYEQIk1422wWsew_^AIFHV8b@~ual{Zu&ThFkgqk|I_Z9gK4vsU1! zTR-q7h1T8E=yGoyJ7BFgl^$T=pfs@!?NH~PiJ`M`5Gax2dAqX^7d_%#-W53 z7G0GrLO{i>s1dUh0jWnZe=51z_Qm;SF4hH@Qfbzlm{``nVzJ`fJ(@dmuUVCcI2{aE zcV^GPH<@Ji8hmr|PKwu|GwQ}5gFOld_ea?Q)+uXUwpJ%`Wwofr#j63vm7U*bwjr5> zS+^}D`m1trV;NSwbO5Q^|M9fb?Kvv_y^u`-;SMI)pPqb5LTaXfQgw8>q$OB#>wJ|= z^mcCi8OArJ@2ECH=GExo6T)M1oVfbIX+FWkCcb;_JstHO{bpMtBt;VB- zMlyHl#uokF-4sO#j+n4~z%QPgtADvT3t@vJtuhDcL#3C)J#q3q>1x=ep-< zrY5sB3SE2P+rzZqxL#A27TR5Zv4v;=NJd&~=Kw8di(ox_6mK2={qUp^*8B2ED|#sQ zyu!wp0T0BT5eDeX3eyZ(FU_eEd|Egs2zI`Lknh3mVVML43Vm;F2NRq#sZ05=X$>GV{L zPl~Ctg7q)`n~bSJ?bn^;OVO*ymKx`yf`OUg21c>9jt>U3*)Md-;Q{fI5X|ud@*W#; zTpHM=mR;qw&fIO`o z)km3Fd`+xl*nq<*1j~6(DLyo0+@Ok6rIUbN+Ft+Nn*!gGVK4aTznll%3yicZB^HfM z_Bi4`7nX9ff*|}B1TV!~eOl{%EGop2x+BYhj?+pScdU%BL(UpD+&!)a<8pWxjHpL@ z6#~RJ#X*coW2KSsh(BW34!WVi09EOi>>2htn-Df37U;%ibh4kbN3N@$(&xh0>+U($ z4JDaik21%|=d=z=5zD+|C18V@s0SPcw}M(g;C;S33Ro35Q!uF5w>Jxzvj>(z&s{GY z*vhpD(wJu63<1v2$0J$z+|e_Pn;KDyj=qZ=>`Zh^rK}uY21Icm(P__gFQsU2Ai{_V z4ZrdO`l4PB4B!1;w1EfFnQ1r1k$Hgq9EZlS{(LFAx{dPh($MYK%j)B1%{ZJ8{5T=< ztvNEYYIoFu^F6+xAsfsnIl^O_$93lZ8{m%3+~A&4=nCwS`=mI8Kz2P&^J@Q<-w?L9 zC@;6qgB{~jK$=G9VzU6hej$`zSq8YLVHC9G;}&xex`)&B^4F}!T3sCx0!rGR#jhaP zKi}QbcqNwf3K|-xrhoXPIE_{s=jS*lI&}B2UIx8_fbRih0P);*Pj@4x44d~tNpEU; zIu|odV%T@qq3bs5S%Y|%KrdXL=Jj^{#c#<%tNy1ukrdXcU*Ux%&tJc!OKInu97ac5 zwfQzCodg><1Loy!6>a!D8t`C)qJSNkF~~r_boiAi|IISL`_A6cYZ57gHH)H0$~47% zpFiVx!mxG4X!X1+a`(kUZ*%+kmd7z|Ek7dQ7junIDK!q;{Z&j*^{hnX#kObzI&W6l z_2ZG#Y*af=>Kx5W+p}lIb+G%Z>xAg*Mb>hPpO4W8kF4aO7u(1DZhA=x4uW};peOiQ z|7L{LZYu1(^hRk3M@y%YFAcY%XLVy}NQe^o{j8W;e{_mf1+4|oR$>%974YG za)%8!Xkn=}t20=QoXb9OhMGT491fbL$j_gNmH6}|QT z3}E3ew)Vy~{Q_o+=r0dU#K0EKN+dp%22GN>Ds3K&udYo3A{K?srfD&TG1heT`#m1` z=W{`NpUa-OO22BuvlhkGaQ__G2q1;MCIoy=nh;x6x$Tk5%}SMFHTzScX}xk#kOvby z7^?k#cln)a_qx6O1~Q2$^*=rE-+_4ssl0wRvzG+=x(4d!z(}ZDM-GukciU&j>z-nd zbF&&M9DAJ73Ic4mNHzgUSmine?j`9BJbq-P74BJF48c}DMD<`$8@LpPReQ$%baw9| z1zOxGV9K6DQ%9ZTSJ+eC=mIcdK%!xBv2m;31Pzo8ez*!Nj!=&>*h9Z-WqeQV5TvZJ z?PY)BQ=mXqU)DD9^By>MYICj9bXgZ%!H1S@a1-m^4o&OQ+Ug%D%n*L*b~HcnyD(Nuf}pC zZ91x~PV6gK)%&OWjZG1}+p%g3AAdsnNOMhQHOaLQ+)%JGha6v+bc+Y07z}unZ3@af ze`8zJ%8O7zh$}HbQSKb(EiY;GbabyP@i@eqwt7oE5cxxLW!SUVF{?Lm83=s!mca0l zW%2i8@^DR##&7xnp$5%}Gv^f=tc`3UaM8G&B6smDK@4^dea`-@2;d>aJ{bll~>`?Z1<8%8qU-mEuRn(=l6}@VG%1jrAGFgsZX1!G2F6*}*=( z^_=8bIKuT_Qre?sS61Iveqa62mm~+=fu(@*fbogD#W|&In?+F3;*~ho(MBCH#+yQ7$4sb zhzfcrTBxmmjqZZl-bQ3H`y1Pu%fGU=`X$qa;{tyTzzhEtXEL5dg5}TCMGd?kWziLV)y+@kZRmh*;OJfD!P5iqf+VI z)cl&T$|X@djUk_!tY#3wHIx2x^CypfIgCa z7tI-S_5CcaqP47~zlv%Xw*v{H`yeZr-bt=lY~1igZ&4VY?CJsX+c^hXf8cM7dTYhm zafGM87Z@XjtmK@@e*x#zzy-n1m%K?;7ZG~)<9#)SKbs8)k(vP2>HhJewLr-8I^T8x zNT#I&7khfzg#2&P#Y3cchHadiqcD}!;89%9LGxArrlZ@as4aHuqBi_yYWH_z#Ew3` z0y4b0x{r(E2e#_21I7g3iD0f#V*D&r&*Ua_uXJ<_jPid;=Vkn5-A^6JhT5oMcBOzN z&0|R*E-v6TUZ`!4iM3nwL7NDTy9&@9^?ZxuPWq2(Vg|jO!U1|~ZKf=Oc$gj3${BVJ zw;{mp@j0@LGc&fBo3B4Q`oJY71q}P2kpq|Y!IZP+?=SksUoE^z65&#|=>eT{k~v*I zPw!Ez=@C_3IOouLWYGqj>cdvvLP?y{2{>y3{2j?@?Y(Y>0L9D??5)-Lxj#9e5=E2^ z_e;04O4(8`!f#2r`?HJ*KzhWP&%fG}1A7~5@Rxf$5T_7#p44x?PkvC*9Zasu57MHp zbr%ndrWgn>TSm1%T6qRpdL4)r+OV2PtuWU_=Q#%(7bh>DN_;_kMHfjmu7ZGB8DyPg zQYC(&0?tC0{?uH~Suhr+@EUIxg1n?bMl^}qv$8b}P3rQqf&gZSSWgDxWP`Y-KppsO zaF_fAB%q+>k>{EItRFFVY4(fkr}*udsllilt;4DCjWZUlZdIMMmO;sC{e>vSCz##x2Z-gjX%WUM{xoZop2t)scK9y+pZtpVsPUwP+8KokHLjjInFVi z%5J{;<6zIyVc9DUsvX;(HI%DCqtPM)^FdbmuGPg5IVD!wIz~x?e%DXT!`_QjcY-xT zisTMF?rTygt)7GK`Z=6xLu8EsRcIMSuKT3jnho9Zg58s|_R8LknOcS=NEAzz9#-~O zO!aeevM#tpJR0FmU-V(uZ?S(#Tfqch-gom;j8+sz>VgKas>!Cc4n;cIhV2AC#P;e0 z-)5+(caq-(0g|&OqZ2rU^d8jIN0AFWhC=l9_gztbhC+DYG*j~j>G|BKg=-C48btK< zif^%6)A9I-$hMA-G|k7&PP8*()I3CFPP~F^zX{l zrWKMH3ji*~@9$UKENxqL8+XqB!62;*DnCydZ4X(>cTwgK_ev!R-vg0;7R0@JRz3CIp!oT$1_Ov3YhZ~4CF2%3%3_4Hon^@PxKkCthQ~hwj+861`0-g8Wn5gypnpG2qslDa*Pg@4iRZeciwMuTZ zL=_#1f0N!p(sI~Xr2Tx33mY+N`Beqz+0t8tq-7nS6nN5;66YquYFS=4K^! zWLoJ}rvlWW;L%27l+_=&xm~!<;Eh}|-W%PUYn8UED$Vl9vH-~Lk*w`UAd)FxE7d%w zwS0Q?PQU1Vn0Jh~)HSd9)&9VueK%<>w8eg)<^ZuQ?ge-qfu|h!Kla`Op3AO(9KSwx zMu^Z5$toGi&df-Xk!T`2nOTvYhEYVCgi`S7If>bdXR z{ro)N|Ks|+-kbG z8SI50`VMw5beoXoWU#!PV+AVKYR(Oe@y(8M^^Y3GTNA`u-?14qzj)F9rr{hA>EKpf zyuG1NDX~VChG?^Rz+(|C3ayluv{>OH14^#0k6jk!*ZaI2{Z)kIgxR^Q-ClAZ<{(8h z$r)@qzdP-NAU_O$>~hq_OS}VMgTB0+BCLCn4L`0%fRe5>pVL{ubB&<^D_{uZdy`hj zT*N1seW%Q$@9==k4#Nb>p_HaLZ?9Vfdrx77EGa`R+H0%0lq}}d1?;R;bmOZRFAk7; zMw}}i9B)jSxMzD=&X40F>i;zpRqWi8*Id;d>llpA9?zHCZ*UMMM+M|LzCqi-o@D?s z`y}Q)KUEQP+G!c|U1-~@rbxvdw6AW3oQ4d$>*ubiBxJXP3!`nJ)}poUs9F8{D@} ziyl=o2))Qf`BhUp*G@3=7Gs02>7B7p8K^SGFoq;Kh1)VDsNrgwioO(o^vKMXO|j)` z*>opv_oItO+F7~@8{`c)}#&);Inf+LZ>`N8f9Je68K9>D9vms{<{HCJn9~g{jb&;g}h( zI@$s=$AwK*o-MnbUzKE01>p58`B1dMq@OZ6@#7U7@ZoF=2zR%QD0YmM4QNDxGI-eP zXp?tuQ&4z#aceJ3-pY=2to-QQy*Ib1&mymSJL}FbQpp|dyOF9b?`y2voWzu0=7@dL zv);AHoiy%M1{ch5sSK=$Qwp^T*BdRBF@nvKCftYj1TcoeYA(t?o9(SPw!<8ZOS{GR!(QNgX^$!UmGhU3n^Pcgq@?lQV`}wKmbKcjPht;_z4K&xt>G{KA z>ovnN9KuZxz2vNMlU}Lv{CVbU>46SraYG7Av1?c*CO=Ls!X3Du#_*dBfL zv|yN~%TD?xcY4o0$L3bM4b{gscSTQDwQZHr#X;aIegbWAHPjqSkVG3X30t0tey^!Acwu#OnQn{po;_is9| zZ}UhH9OonvTv8I&`XTI#v3tV!RB?L*S|KCwR26KYMfV;zq+{N8X%q1K#3t? zQrv3;>L+pJm#(G2zGiTaPzWElT-|}3{J^nF{JBN385;&yaP$=|v}u2O4Go}!VEtK? zwI|xUMiSppiIi8alBwbJB=`ATsc-q*;4)0linsSp+I?!W;y}gzpqwqs#>06JT=%-~ zFRgB^f6!y%dZ^u7Ky=FC@C?8eI7 zPighpBhUsiC6{7dE>x5-ht}`XWjJN4dFj@MfUix(#y}6F{O*IPPxWwU!d&th#;VF| z_@b$axc{V?)WXvp7{)Xf|2%cGNOWX zOfl;mDpq;p-p$7;K`kH^v1v*vF9|FgVTqfN3Ejq!&=WgUpWUo{UO(;9qvrbOH=twX zA1q1P-4&NDM;Jbnw}2&uVSZY|>X`>LspTKE4^)~RN(@+>U0} z4hA|KQ#9`jola%AEbvN-Z|qq~K#9#rlbQvrw7YjXWT3Ao`mEK8S~@)09 zsg&y*C}i~}S>;qWbN#J*S&nSX4!^L|v#Hu5(T16xbgbd7+jwaJ`*!8A;&q7==LpQ| zD>qs6Ha}hAy(2Y;SbV%%_If1mAg6th;@DQtq`JAyrGH#Z)2SYrop$8PiB#%QaKA?# z=j#W}edR6KS!(8E9zJfj24i2vMQnW(|JALp{W!y|<4ULE=0Hjor=;jVph=TqA6(VGN@?(aQKa6&QC3Hu6=tzw!*$nbNbs$5K6Ams)Cp&a^#96fC{q_;jfR~beP28)wm*sb;=487O zrX=|63RFm{@Hu~yb+m;z{JrV$4XK{E6mm^7{j}2P^$e6S3jR)ly!2gc$E%f3q2Te> zdk91%fB5Z|XTfI`u@C-7To@;}Rr_rRzMH^N|K_3=uOv4dLU6NW>yDyo$p%8LJ?%S8 z^YZMO{ST<+ccC@n)kiz>+G`@Y593Me9(OX__CBs{gB5{7U+DSt%7~4Gz4VF=7x;wb zHCE8p?*fIf{3G9&E9+0UTv$#uyfU!mR`mw2b{mze?kMY+=_(l(Zk^4Hju@{d<2B>7 z5oZT}ErebY)p&tF z&d;5AJ=v4PQDd{QnMXT|6JZz~3%q){OL~zv4_2t%p2;KJlNfR6kmN|`m&N)Uj19dI z4&FeQ`+Wh6Rk0TCWSd)7QH7BVgVkKHPmH>;D(e}~MFpRc*)R@?0rE!M{LF=m^Ta5y z(`R_gt|z-ee7BB`(VcNb9HhBS?DIIGk75KBVV6U%`i)D@{o=$vdtrJBXYwJAK8?0B zg3VseIbB(LxaUuyZNc9&thv=_`5<=^+A z6|9*3?F#H#%aVK#A8FX}ovq>C3m6P(3MzC3SrdJi3SH_G?g2*;2+7?k@r=wtVZDsq z@pygwu0!H_;Oq|d`eNBZi@Fa%FV~_#*kvtt-t~dQSoyXd#}s=(XlR!-MbL*_U#1td z0ScJDoYy6Q8)(tCgwT)_k7ue?brBqZ;@|^O00j<8ZDM zOhW9k6XYP~;ikmr$7v1aid(qNp#|I0VzY-5-Nj1z+7JoHpAki%7He=Q~rgF3=AR2A11}jw?fA+j3Y}$fvx7FZO~Xk zafV6%+r1nd!h|{uJKSu%LB^##aO#MxeUd<3^np;p%RJmi@=Wt42fpM~s#9+EzN{J@ zFo^FZ!Kc>*8aIVzpGtp~9vAv9)x{29HeVAA^3N@eVQdrAE$w;l z*7u6|M)yS2K;S@`w+mlmT%I%ceYee%9-+32T9xt08?Te`Dvzi!5}SyooV6BWh4!uc z`JO=CCi;r|e8Sro3O2@7Ff4u)ay?|{DI_mr)SP;|Z;-E19@)y4zwE80c+%&R#J%T2 z%QQdBat*B8@%p>~L#rkpwL*p8o3_Vlp+?)7o$ocC=+0|xGe7I8UbF3G_`19C+#x4L z-S`4i4km4$wB_hpbS4@F!pIo96liQ;IF&KFH$FPhcqLaS{{B$0!9e9vmV{0-;aerG zI+w1Q9n0>F)^#qy*EFG$MNP(iIUI`_;mimEH;0ty-qeV==hrJzvd>3LWO2<~L)BZpr8+WEAVGDjtJ@Wo*j?fOG$z7u9Z21Pt$;0Uen+=)UOt{924;*$k45}FQE+9EK zlz3Z?ufH|Ay)H%(Uw4GawTIMboB|7-lY_?2M=1FYeLZn?-FSw6WR9h?_uaroPR`Ic zhUl|HoxHmTR=wIfP!YYwm=u;0Y&FH_)LcbDz2$b^f$EO;Uy1{JBaV1q+pewj&~v#h z^9MGjkBjq^1~l~(?=_A0UX|bLEPZo#@17*N%XwmpB05eM;d}Mmy~+pqWw13I;p&ld2HsV+g=o!r0&kYBL5Bs|( z?_6i#tRocaP@*JG$=8E2H%jr4j96yk7CO+M}A*@M^>j6w+ zO{5&`Kg!g=i=y;-lBXueZ>S8uL(UCf%QFq;H85lzijBE^c(Ntj^;GE^IRnRsUYGHn zF)`!Y5~4TPKpON_UU&@bNNdf}Z3!7Hdq_E+&^~yoDQiuQV3V~$dEduMJYi37f8ey0 zCNt3AzcBk&y`R;^5~25=E|)WF40-gjs+A`@oV3SMsQScj?Wm}h9Dg_X8V=Eg>n*mf zFg`yULcP01b!j)8lZGx<|Er4e>?a4aH5O@_z0l431n>JI1V2r@3iB4PV7Q>O^3K{1sy$o zk+@z1AxZ{|91nPxnSQ^!D1qL@**LxzQXyQD7e9LU0Muo4<*v=A%!l1YnRUVYNRSJm@xf+_FPULo2}9SH614B$ zy%%^X1>3K<&QM7yvp6&Je#Ph;7<vz_gFqJ(Qs+~ex1s$y--qpwHvx%Qj}detpCv&XHRCBbIXLr zE4?EmA_hYY#E4f{Xc2wrL54k7mPhBvfK^a!`n!lWuiD~JIJxO&Vh`g~hGNz%hjV3| zQ*Hz9aZbv?9h<<+y$KD&!qO@H)g4e(d}q=j^Aq?OwMdi9F<9XVvz+UykW~*Z7h~sa z|3af%^)1n?aN{r~|M2s08faP_EVUwF zQMulb?H_)zqjJD5={|uH`z{%i9$>s*Mk+`j>Q-=oKncv;5_F-v-q}a8{a;G*xz`ga z;b~@4Px_0RSCuDDWGcf3yv}fLCAxg9SAPmBtk}lfl}3<9!GuaV!Xd2E&D0ewZox^2 z{B1Dr&HRb-TUR5X4Qk&bMDIg<`Jub>y`2VJR1VObluHTu!VWXKZ{MV#Q4gak7o2tO zc_-}0_pdPfkEmDg7V4j^folZ_C^K8|+X5xayZ2AOYpK+k*he8S;O z`QeCDK_!Zf!kog&>^c5Um5BZk-XLA{Kq zaIdinm`XV{hhE1f-)%;Q&x`xpNA{nXyuV9-GI97QA$sg&r;CxC-l{mNXb#6M@jKyY zuxbL;v6rfqfv_$%erQ+Eot*3)?29j|w2KW@k5=(jP5B@V&>iiU9Ss~6-fK(QUmQPD z?0#FI3TDHsCp0K*=yBKCQRh7qyuEQ$sT{ZR+&{hwJbdghA!?s)UDz6d7xsoEov8HV zNN$Pj_v07`p*JmiiUt=h@xE_l9PSVscfKO0OMULvhs;XPczHW6LQBNtk0(=&YcJ0> z>h)-WT`q8}7L;pg`;FXZQ57Ku;PN9i8+c7Y%d(O^_SHAk#WWom0_PzBZO$Myq zm+SL~3cD)51b!i;C|4mkc!E#dSYuH?^6|c z-ildbCYS?ehdBb6V@?=5rU`d*yt^5^>A;f(W{VlYH)rsP+|&;ZOw@c(`VOX2xw0gCHbfe`%XkmE2M=8lPA>#&WOC?*d7VweKP4{2SG z34tp=d=tl1;Ef-?31Pzcuae**iT9&`_oWE$$hRlpbcd(!f3QvM)bICC)4rzf2%7?C z4Y{?2d@4eYO)(pw49Yhw?}aaj8vF5d(wU;zA@EJ0i!y|=n4*mtxCvsLfPN}~haYk( z0XabwFq*@XMbk70DZs5qfx^5MY9dsSd;l8A(YY9uOn z&k7UDZ3C$?kLV;OF%EEtLcr=CqyGpNd6}iXOTq0&pF?P;ps5Q7UVY(tK$HusyR-=V zgd&=7#dYm0v8vd_=$#d?DwoKb zo|mFR8EHSe0nvn-z{(S9g5$(QT~|&Vkx3iiSV7rvc#X2D<+=co+v6VQIf57U<3 zChL?u$Q8Hd=6dpTELo2@)AnSpAQ!v(I&DkWi`IE$~jc5Vq}z7{c(l3yUnG>557$$50{N;d~Aqm zY#Y(qb4c;#DbJJZpR*h~>(h9dqOLOtCnHZ2(-*t?;64iCjC>(FEIfPN=(C4j-VFzb z)m2);uC*{YWr>#e4Ue(yrMq{#%Z;7bE9vXWanTM>Ofjmzg*1Sn#YtzPYwQ;L)4SKS+*{OVrNDc(`ZV(ag*F!TCEYwgYCF7LAk?fIY8O;l%Z zo9tWrNwX1Gx3#R-ND zUhY6|rX-us*W0sN>ac8M&4$k%*-r24vYl44QD>RN-EQ3z{89em#o*`6;;fs;B;PYt z?PvS6tb4^$HJWI~7C*ffzh_&{6Vql}pCkRW_=8ukOLz3G9Bs1#FaD}KCX;zK1(Bau zrc}v<_8hUb>?~)Cw<^efE+Ol8(52JL(6Y1d;gZ3V2eq`jt0(<#PPWFprmB(jwR^(v z<0eP;I^^Mcr*q@ndAW|KG;+Dq>*)HPD?I$<>41x}IbnCEu$%dFS)97TwadEl*uIFg zBLjEz7igWZQ|Eh4!p>!qeMIKoYU;I%NG>Xq(S%fw53j7l^?FE%FL-uow=-{RR2bH! zik*y5kRLu9xGXuzWo>oHf|D1ChaBomvU2V6C)x@~dRcR2dS6=0apzX!1iv&(zy=Us zmS1(k?3|Q>p9YQZKXs``>{*x5kOa*ss$Lt)6^(qGVk&VdJ1K3> z;g`d-g$&Xb&uh$WI_wi)J(jJE6=-rjtF2j(aI(MS;g)4WP24_=WHl4ZJhV${|0&M< z9(vJf&P(zO&WoJ?Gn{uP#QrnRyBuOXTA&2~#|n^fdYbbp0B79@+z4@CCHP02R{@^U zlL+wG^}v1k!9@b^$`5`Jrxt-X^e=+vV-n!&pXa=4!0{Y`)7k@vWye&3lbT>w@a_hw z|2w>Q8{|w1q!k_bA3D0}!%cHcOTw8x%i;T;ow(IS{ zB*s3)d$$)sVNCH}7I6E~=h$y}@5g`f-eS$Yx{Pwf{5tg)rMO-nc%Gn0wR&qj*A1eB zI!C?e@=TYz`2Kgqkp zXQIBoRMnDmiFeM1p4`jKR<~D6aLe?%4@NrXyn58yEJNX6C=s(A>r1BGpEVfprg7yW znSo~qLw(j(`#&TfH@Bj$J+pm#;2SD`X{s6#k2SpG?&3vyysPvII?lapbN6XY^s?sJ zRX8g1$ZnVAQCSkLCSq!w+Jxh$-Th(JEBD{sq(>TISXmd@T@bL<^;4tQC?#pPfSHw{ zY_#`*=nUVog5BezUnkUhwq8$bG|Xr%m~4;@H!>oPA6TwG zah;K{VvXQ^{A;oIz)A?c-4>2iXJE0%aa6s)VJIsJ0{ zarUXe9PiYgB{ffb0+_M7xGw^|G`WZ07%uO)anNf_P2&`?=A|2{HC(Nnt72V)msK{) zsPjMB{_Kgl&x=FOQ8clkJs~fT*Ld5Tj@rk2o{Qe0a)|%4e%OfRz2%c1YU{JIycW{t z40Jpw`mik6l(_m$??o6XiA%{0KOyw#+3=F{g)-?3Vf+{JXcU~qStW(UnwhvlYfi4x zr3*fs)V_MqsPny`c#ui)SlJz!%Da3WHGOw4h!2*vOLr}EIK{tRa4M!^pCyteqxN+652mN%nUtJ-#bQMvbNUB-84>mtV@@ zmPbKH5-uy=`YdztVt4lssp^Hwo1c?9Wu^6PIrhZv4c)zmqeenhZb8)Q;~AfT^+xx7 zRX)Y=-obJ4=uq4dk*0&xb@%UYJg{ysCV6Qgzs;UYR-uK`w@ubCHdL*Vdt-HZZ0&0i zS0RICBOf38NdXjIA}>CE22ZgCsFiPp^flgzi{x+X^rB|kotOv!gr4DVy< z7?kT#DX5#+!OBx@1T46#Z#4Rlg10c)e(}xaDfH6KM-Gpi@vdKvMUgY%MhrisJkFt( zZmY|E#8#cnAUnG7tgolg;}*-{kLb{Bi~(`<<!o>4_pkc0FiJb)=!4vxxcfzST+83S)I70iQ4iaS)m45cH#k#TOca(b z<)!Mg`SSThFsE0veUQ7;jaOzPB{9gc!p`$v-Ge!+S=rCDjK%! zwHbydJUidWxizdi)WgM4p-!|Gm z$=*Im<unBkJ38bPv|yMeWM4@8#=V0~=P7UA$9HTtl*BnVLc^O-@;k<>tp(`n}z5 zOZ+^RczT48;KFzIMR97r_NqE?zi!8e&mPtHh>Nk&t5_EYM=qs8s6KtJYid+^a>zYD zlGv>YCO2Dak7JEHi1tmKBwmxUW5V7p%_M0;ec!@yx5wfSXdP%?X?k<}2x3vbhs;OU z<1$vbhRem39$LPBQ)trahY7J|R6Ps*B1D?(UN)J05j(u;v-*3URVP|VvT;%$bQ9}> zqRkT(48N!!9f@qc{!+G`m*JsBdtrw(YwVpT=cHH*?wn-PkLVEAbE2;2S+c4AjscB) zAl5QTq;~AJrT;&q^P(LNr#Ua_FE}rB!~Y@9YyJz)y8>c7ir0US6`;|_Y0fJK{74e` zs1Rs_N_hQN0(dLZdJ*SU0=_E-Pa831a6wOqPa{4o3E$A2z?~)j1Dsa}v{0mV+QN^Z z^*iBpS_{11YXaO?2RO18xY>b5>fxn;YzmDI< zB>?eKs*lYN-%r`##>NOP23_kp$&*h8Z^VIdD z4*ZP|m)e~HKHN|vbtOMlqT;qDm9^BO@ci5=@sDEUk3&Tojx(^drMg5I9VmbI;KJ!z zB@g!Owc0W6y9U@l=gaL2knKILNhJ7;oS`G?hT5)Yec8m>#aw~-CI*+ag_XWIu*fggqK zV7PZNw&O@~ij|E^87JulgM{Zy1;8sfup zhz}q5N`(0EQFFd_w)3mnJcsH>PAYPj+KS7?tdg%B0To!cm2E8kKB&O2azO>w{y3hX zaCdQQtA4_XM!6{F@eR1sFNYuJBxQO}wlwMVp2*=bAo&#iyyS=-PON#%_=5Pc@#d74 z3d!DUl52wWh1XcRkvFZ5J$x_ZmNLupEG=^Tk!G3JBl}xU#P;C^*dl8rWot!C5F?hH z@C+M~ymv3>VE0H=a}G&?;bfPFLs$H&B~51Ht^;AC}cQ9Bih~G5FS8eyNZ@ z)sagnk`8Y@s`%A7N)uQ0(;a@K*B?%9l=Y<}?P}5zL)-c$3ByZx75LbW>Ho4G=~l$mUfU;wb%ze!q#X03;wIlYD!2_(9)8T~MOy6b>GiUjH+LwCbbB^c z6sg1du^=OZkFqA?Sq8Gb*D{Q4BYH$qy*4%$h_7XPyLf1j@uDP~)v}@q4_A(fqIUtt zGOAg3zkDlKxoAkgjXGup*hIf0Q$*c5gD`!n8)jbzSPoAi&%Se$5F4-4(d9-fF#ZhSj zAJzjttRON$yHAJ+_^{m*j@(Q((nc~@3zoH`Tm3gSF8E3;wzA?l_m$=HN^zf)b56*e z?7E%z; zW!n^#r8(#y@^xLWS)c9la*35Pt7{bL=rXKsTbxNn@aLG|)VhSrN!60ptZvIf`hwSO zio&U`^cgd>6DYm(0%PLDF>~TJBUXmt&OO6cx?m*xajRS~TqE%+7aUO-$to8jVwT0L zT!=|jNTu|sFrstT7(*4(rzS~IsNdZ2U*S8tGY$~H;$Rs7O-i(i6vGiW62l!wL>xu} zcOqhl0`9~l#44nMRa6);n)rps4{yXIcpi>ogEt%r(d5)6QbmU0&^Mz2n3Xl3nfa2L zuVz!NWWLSJ_h!>w=+ExphOYUp84=-sxXmCdF0v8N=Aw9A)b2K%`HKGJ5iB0ta*GPh zp+LjXXkND=wjI<%6TInI82>Md9}Go`@&9JzXf5EJ<$O*fN0X!GEa!6?x%gb>d`=^m zn9H2cY2=b~ne#b}ToOOnHb?Dzjw4?;cV#XKw&XeMUL|32)BkGZXbI7r)%H1!d=6ze zNf0IHknD3PMoEJBJcl`-LorGcM#bhZ=W{4VNy6CR9Oiru#VAP__ngC=$SXOWA6 z1cwa#bHdf;Jn}gcqfpN0H1au<;ZV-!H1atUqfpN0H1atUqfpN0FmkcEY-)2H`5ZPi zvAJyLVsqKl<~Z^>ZEABG`JAasVxX_gY2Sb%E) z*8y$-!~xs{xCIaokN_|NQ~Z+QP5~1J(erJ1z5|d7a2MbnKn}otfCm8S0BC38On@wa zhX9WNvH?)|T)005cmnVgAP*oP;2A&xKp{X8z;l2X051WG0bT)=0K5h$1tx#^j>e zb1B2mapZF-!=v?=bJoM54T1hwBcH<|543m19FlzwWjM5gcn)(uho(@8xfCEJ=2DEB zS$ z=K_L?suE+7oYu zc7uN+;^%b#0A~S<^!J>_bIK^~hVHP*;Bz`WhnY{*pQTjL&x&tKBzQ}QM1r;dM8OeL zul&B?-qI07g0+MKb8|XO(T~k11{mTzWu`m8`8xAc%LQz-I!~E-%KVf9zp~uS*O__B z{E7mAM4b|*B-AOq84k<| z_i6BT%FRiMX*)KbG-T%giB#}^m1?p7jdjhUiX09s`dFs0$<67umGFOat@HUA{r*$7 zBWRd^G>*)tz#5yU!8{GnsA|A(S|cM~8cSrF=9%Q-pRw5t@aFzt&1IaD#S)qD{Bk}i z_|EFTmntEDsjf`?C+iBq@;{%T8H(u-^@c#9-|5OHX9&i03#S|TEE@P9MvqSZAQ;mv z{I|;1e4_Bm);y)AhI9UGor?Qe-!ye(-5I=5h#a^X5wR~RI`@>C@eyO%_sEN_R&8S_B=(=v5Nm>mpo6=d5Zq7d-~lh%Zqq{A>?1n zLuXMhiFsFjKeOZFl&BEGg6}KmlYyV?IZq8_zWJeU{7$C5NsWxXXbKV$F$MWQz~qTf zbADe@Z&DMCz4!??z~m{&|E)|rpD4UIG)1ZSpGj(@gsFe$Ksv(_C4;<1L>!El)B;FW zxsZ^G{v&pKd{GiCg6EKE2FDC1BasbCF?dQ;3qZ#XlaLaN5={8>X$4{J_Xj$IWq+Qo z|1I@3A4+Ss$97^rJGPS<5YqveV@{Yo#t!=qGkM-~DfP6pn@2H0-^w!3hDP{xjcJQ;t9HEbQgePar0S<09gTCAjo-E)=0JDXE zSo(+k*#FD_132gT!8|{xLW0C!oxA+k+t)nr0y6)e&hzsAf02GV-!=Z9?iznLH*n63 zMs7|qnx(&;KsKK=upIqh|07WC-%m*J_}5kmvz<+Y=Wah4|Mwtlm*D0!L{EmzC+MH0 z(Cj9){0EBce=$M7TkuQRki>e~f5P-Xz0HF4vZ?WW)WYTyGh;iBdCL6Q#OLeG)I^>? z2x|ZRltH@C|G>2Z@<=k3&mW(u!Ck}7!N$m1z|_vk21DQ30d$-k%q+~-vgJe*lo)1sXPPdw7}XRNe!OqRTlJJMBe38ZVLEtwp99$Q{_M3B!(nj5 z82+O9MIfPLWm%{kW6qW1?=!urU^}r~>={;oRbbn&V(bN`3}Z>E*k-H@tHN}#m)KKm zH`a(f!CqrB@cZ!+#&Edl_!s{8aq9hd@o$D4n}MD4?_QL!@hXa+77(EOpTUFLRo#?F zEwG~6fz8zn?oOB`+#UZ6ihucG!ifGw|34c)8q3o~wt2Xu<)Fs0yO=pRTH4vlaI6y$ z;$SzkHL)|bw6&1o(A}=WFTug?=wxJTYGiF^3oXFbjzbP=m$a#)l&O)Ek)xBHgV|;$ zGaGhru!Q?&B^eHPNflu+afx-J{9;NXBK#ua3X1#^;==3sg_R^lHVUs76IYhl=sDex zOdbDj^*3>b=xuh|SaZmt^bp$NHZya_?_W{UoEwm?Hhu^TZ@Ev{h7gWDC%td>FI`{H4MUw{QI>>M+?Q#rdHRSJZF0f{YuBY+bCIAhXK zjGy5!SZRzJ#DW{#LEuJ)Y2Zh9Z9pQlhIdqijCc%2YAhJSGL69i!^z{|y8%A*SA{t6 zNe$AQ8H6+iX~q^th|zqZwJ^4fPE}*Za2OdUj*=UrQlZ8euJvM!0P@@z#(;@Z_-;{M zj%lh9VcGyjYLIMMj7Xjy@XKN}D0PSL{S?129zW7HsKGBKHx40}=Z2QN8zaW2Z#O>t z1NEmr4Zj{A9-RQjj1d#kNA!LAh%j1|zVFheg^@sRh%haD-c@8WA^d_rlAH7!R+M1Usq`{IdVx7Afy98YDg723 zI_`-Pd{T0geUFWd1XG0iqzbYI!lL?HEa((@M(|0=P5wO=a&k-z(GZkOEucTb^!pM) zCpt2MPfBiz?=ex(L3)^G5R3_Orm*kJ|ZAz!yU3bb&=!outVuuf);_|CW01$E(wf59#KXDLpmC2<@Q9R zkOECi5n@LzlM-q;!!=iEkFM|xwQ>W6FKU7k7#j+SlfYw|?jNRGIMP}$z)6SEJfpy1 z>UHi)91*k&6w(-*&_r<>&j?A0DFA(twquL$A6%zmUxv~Dt6v}jT+j|~yb&ingH{W$jZlY7F*l&mcA%K+REaW9(N`Ux_iZ?6%Mdf6 zWPV0p)C19Ai=n0Z=`@1^`_Zd&mk%1WG@O z!x7&Tp(kX$LaE11t&j|2Hx3mHN2p^F^=xuO0Eg^&lB#)HymsI^(iP*r`i#ulA_ zrC$NuTOdAJ@QCnGVXXMO#MC=D;oqnA#g*_rySZ6{2<3OWCyI9wwh$kW=r7`30)GD5 z{N10&qXRuAick0#@hpOG-{;Q+EHXxz71VkGyd+`)vxonf{%O2||1jQZ{g~?)c)=Ne zAzdEXoD89T+5tBffuAt`Ulczx8r2Du?`eE&v&4ru=}de}W{D5+`I-0_W{D3S<~bAJ zpRs@Zj((`;nu(8mmgz%1^h|un{(;`nh3?bs4V>}UzbjwFRc7KFoq9)s{|-LHhiBqL z6F$*9y8aG6p{Z~p(EFqCJyY*+`y2SgVaEP+`Uv>iW{K}x`yk+Jo+Z9-?Sp`?VV3y5 zwGRTm>RICZ);LBQuXOMKtj$0B_Bdd>=;5Y&_D{+@vE&@AzN zqaOj^!CB(_Mn3{Rt6Advk$z^g#5di)h-1s}CBEtYWg4HtEb&dZk7;}xW{GdQeN5wx_wOJgQ*^~!uPFx5XMVa%?h8yjP^mm$2v=V-`WQOAM-5neQO^C zeDt%#_pN;p@F82q-!ESYY`VUQPmK?w`ZgPUsC~>||J@Xr8g0Q2V3)AFmN?(Sk#{`fVM`-4d!ATykN&6TqrIT zcN`z?n%zfm0Vq~92bdkqlPjDg_H3`^RHQ6B@WcV=+JD}FI)qgoy>c3h2F~|`k zgd&1F%~YtFqYQ`}QG%tD_Glr*RtRqb*y7*#N8FGSEU>gkPvZ;#5LIJ)w< zGDKB3{D^|XR34EONR39nHm)JE2Xpi!#IsudDuyExz*ChlQb&a!wL$Aw(ddga*c*+f z@`d7I!cab-)FD>ne`Y>VuSSWjgmk?oG5|oeg#|`OQ8+Zd`KxfKccp}Kp*@;QYydDb z9LsOQp#5f^b45|O1>sJU0o}=F zhFkWVa7a3(#JC}x54i!rw{Rk0y@mEp1hr|3o@mO(w^6D^7!QQnkE1_&VZs3J`{0f& z>M*wtJ3>Slc_Ne=*}p=u5+u_h zMIhwWUxq|wzX)3cA!A4hA!A4hA*GDX z_kS`xqQL@aQ~3Ci$N_m%g79C6HqK~YGt;k#@6plhMq8i)(yA6hjX))iMjKIyL#|=o zC)7z|l^Hl_XVBnB90WQn1gfL*C*XnMJiwy@cozKyJcu3(p)W?Yfq(};#|1`4aTo_N z@F@6BC=)u!>5n6F>@ZUmjb)+{O;oZAp=RoykcsxkLZ~$7P_Q(#r6{Y^$TorzB zQ-E}#5i03Ngcp=aZo%vu7Jv1s!7pU)!07#lad6fDE2CXf` zBxtq;>Izn3ZH=@!lkl`0>M{e|_bA%gI>FR&!|iVNW{&y-Fk3e<^o7P#Av)zj)iJ*h z{A!V@@)TTcM+$-qu6pDaUgTsds!5I09UW9J+rIH8JCpU=+Vz7`8=4&+v5}`ey$~6v zmhxpIA7{t1P5RfH#5HS^^a6aBvPc_Ur@insGy5U0_z9oQ0hhL2cmHT_p`I!eeA_D% z;Rxf&h7M-dj)DT{|7b|bfu};$Cwh)O@+vC_rsmR(o9FLZVht$(fN!)?hMO-qaD%G8wWMT|MU<3bM_Rj zk;KmvAHR*O=@|^92f_4BqyfxGHX#e^P_jFB=?B%TFnS7pm7{pHVIpkoPTn%>+E@2$ zw{Gmb)^gA~B&jG^L}h*BsRh1a(oB@sE!z}{Jv$UFm#M}Gwx!gHUEjLW`^q7e`_d*M zSrJ^vuA9;XiAW8;y6B$rigok(ls6$a9gi|-?0jP%be=NVuX*LNP}eehyTPoCOC9#U z@9D3ueMWOAIK$m+@F}f8EGzwciVgeN`dBOM6<6NaFf7gXMCkqb8pZ;9o0nk}3naF3 z4{IL@er%`IcYWiPun@WceI6D1^hfJfoLT8IQg%Hn%c=2-{Zc9c^5Y_Ho2zSXYt@t* zX>$xkl8YP+rn5;GD)DC>{OtKoit!+hd8w_!c*bzU3%7fBg{~S0C7D<2dQ)W`d;ID4 zwU6rDe%9Mc`W~sR?@Ph9Tfdj8)VQuwG`1RBy3pwQYUYNxruYYS6GREVWr{&PE@}D# zOI?e--TWNO&&v^~$lvm|BW~&_G)s0QL?gnX$u4D$j+dRyO4f#dt4Jvc_v{W~H zr27gCoprdq*M@A#`b>*s)t)JP`1vDKw6th;ITx*dww9^>0RP6pon@pxB-=PuJN<_l zLrUr5CFH}Y7rpO1vzg+UxbnJYp}o9|Gmi<6otM*Oz2zUndQ!xyi0VS`sg*?q@17o2 zSAIIq@-TC0OYsY~riUKgkCz+v@5%foO*!X@!xIf1 zJchNO_ZCb}lw0JCk6dS^;L|_$wz9fp!u4}!rFit@@KXk=hZkdf7xtW?aBP*5b+Nre z!E|HeKH&ntmaerUD>*Wi*GJhiu96JO_uh1rY-D7)w&~-v+e;pASfF~6#?{%Sg#8WG znTza9A=OU`u@yopd)D4jd3Pyt3zefclV;}`p7pGUsIIK4e}fA=HRfWj^IFf?ammq| z7`HQ5cg8FTzGL4a>f(RL%=yrQb?*<$A79XHy*4r{&vKH9lIhL&SkjU*Plc#+zFF+QyKr!w=o8n)#Uz2&0;9ZF59bbsQrK|1_nF>omf9yW%F!Q=jH z8v{66xf#TUaO->M+!ngYf39+BT3Mqy*ml5vS-5W8y)|@hX6JS~xGi2E>*ek!rLuD~ z4MonCR{8+V#e<@|1}FFIB46p*-=*^+ULZb3oWb}}>_C;N$1+>}hs5Vj7UoxXi(SeW zU-w2Jf~ND4Q_gwYL2to^`tH_4f;D`n$cE4D$#+Uf7V9pp@*KUORmb2MIG9nF>G(-K zR)AVL$~^p6E-eXD;NiWVMY}wL9eNjwx{|EChtx#>5lPC5c zWv*PksbpibjibKd^@fyw$XU6FuTaT_Z~fMxes6I=1O)BBA$g@+E35EC@GUS zxxO-R&mEE@_C`gO3VH%dB~>#ono6%|zVf;}`Bb55TwF}=Exny7Yx?^9u5(2wWV*lm zRI}vuE(a=wfZ@uk)NlRmT}O4)VW(Lg-Z<9T-ov0vbG_MLL-F1x-pmVe z_FNy9usWa1m*21_aS2iUG1F2Ca)#P{{V_`$L^_tPK9Qt9=(K8yA{X+VD*EPJTt|OE(S;ZO^RcdXQa_ndZ5%ii`d2uCcZHgVZz%vG*^%jNx8l z_xyH6Xa3FF4d1Hxdq*$q=68iia4p%;T?V6FYJyfqr=Bp-y zwLNWKERCSA#diC%YD2xJ*=y+fE222h(xfYQ2jwT>HoaQAl4elhvE5;XB3g%Imzs*) z%u-G#3>P~jw~c-`zn0@s^M1%ZaY`#cXS@deN`PwL?%mOERS){zJRM^|MwxjvUCUUpTh=(dcXE zV8$A&bHpiSw?3@NXD@U+d*qs7LTkLit%|Sl#k&ivWcON|?E7%bW34gno$f=I$)B=q zn$pwJ_krUrgReY4a6W>pg6D-ZnD>n=Dfuurl?Y=~Y9N9+xS!mQV-gU+5YpCfP{ z`J9i8>D()^CFis*P2L@sSQ=m<$i}2Up{?LpdyJI#>a&+`S4G6DlRV#(nVHuF86!w6 zI3j)!bAKhwg0~shPefa-E#D*fQM&sUS_tSlL)QB-;E&SMw}4APjQoT6F@yX+V){{Z z`G%?LXPEGU%#S#JtOVb1yaok+W@>&@CA7AXqN#{5ONkWIhupuw>+XMf{hphdBVhrb zk(7zG!&W2vspYIje`a}{se{oWSQuzyO<2ilV`OQ|!ES7^PKLwUX&ncRryNGeH z@3*$JwSpX>8wb0&owX{#Vfu+f5KW!O&ZXj8r7M&qegz(KLn9uD&tW|wkcSUG^}Do6_$ z2l?e8&08=mP6y)BhZ(abXw^0-39b+?XbfDZU{>upu#QJznBNTy%T0pxLcSlQ!D^>; zpg|_Y4^Bn^)&NLbh2Z!Zyhy8e1VDLq25WX290o(yR0MKj$F92@$Z@KTDcb9X|z3;yB-uy4T40Go&s{;GL`(QO3 z0c$`!W~J==;GYns!Y+m1!2Yz40GtnRz=_ONy#|j`M^92Wk5bMZhw{StVTSP?_zk=Q zs}47eBAAnn7zjDeQu3kqy^BCE+o+^S@k24Ja2I9h>jwh=dnGtXr z#$B+#%P=m1MQ-v9_rP8rw&8BLu#$Yj?p3^P3@2B!4+naABfr)#{tUf!--SI9#623 zl2pQ}(2TNN11||E%>YVsI=lciD9=qO&C%ymA21FV!=eu}p8`{G7Cd$kUpV7t!)U#YHQWuS(T=W%{{!1M3?mFT zg7Tm%${K~WeKgFz7(6oK-%rx=XO;FEAUdFIR0!3p`EXG%XqA_lPufeTA@fZ|~L2(!qgF*HUvTb}5?uKu{ zx8WYR7w&`m;Q@FMz5@@z!|(`v7aoQ0!S~?@@HjjHKZGaYDflt`1fGVU!O!6t_yznD zo`vV(*YH2^8~82!4t@_Wz#rg`@F(~`_%pl+o8d3;S9l5j27iZtz(3&?coklQf5GeU z25bQ)ars^W_8R1SunS-zh-dR+*adcl-9Vm|$nz&2BpL;<2P_Bi(%uvHg1uoSh$r}d zAfwC!;6M;>^Hp##90G^JVQ@Gc2}i-vPzcAsS`bfq8Ch9Dy!CBh2YEw4X4uN00@lH? zAj<)85Innp;|nR7Bpd~WPz#gr3AhY+p~d(V+zCI2mqGfESKu|+e;32> zKoWI!?(R)ZT(f*^#T2hM@d!0m7sd=tI}zk~%#(Fr&d4ud10 z3P#`~a4~!gE`eL&S$GZJfGsd*cjAK!PK0gJsbze!-;S{Tn*R4b#Mbb1}_250LF4y0ee9S#NYzB2tEoQ zgInMy@K^XdybS+@mCH#RgdhUF&<7ueYvDn77#@K~;g7Il1$7O@V1p89fsesWa5LNj zx5AUKXiwTB91cgoQQ(F1;cB=Ru7exkF?bPn+Y9}IWv~ZWVFW$`7sJQk61Wxq1_gVQ zF4z7fuG{*8ZZcQ zudrg>o?G@hYsJz%x2$OY#FiC@?YZUB2QU5Jd)x1o!`sn;OD`0S;%~dsuC4w?X$-?K z1}DQQ@GDqx@TK!t9Q=tbmu|vbZr;cdMiZM?@ple=*gV#AlSo%>-ri^&_!rD2_q_aJ zWU^_~CKcyc{?BR}>2sFhTk>peHj zT<_U=5Y5fhd-nBGbtLsJdCk6_u3KI2xz{t-dv^X(G9};AI`YZX^`5_OrL-kI`Qqt% z&mT|M`%HB!^`2WUIuB*4ZnMiJyWY*$Grz|xHIyAMTPL#fkf~eI3A0Qq<&?4$q7yUe zQW+t+<(bh5spIT2GwVcd9hr3^`+BMR(>jsAJVhtumzuJ#XV!`A{H0`Soyad!>%>fU zLTqdP>uH_HA5ZHiQF)=PGsjV+fHO(FI8q*C-S!=trNM|GwVcl{!%ivPUM#qK_BWb1^vZgX`)%haBH(!)wimbd6^pyTBWlM#os zv3y|_Ir?JOv)sIA^hNZ{oX%W5%dVqLJkhhsfaGQZluk<(H}TEWa*EdC9jM^4U7AXZho4J)23Fq(90n7qgyamy21?vipEs zJt|CQSOH?DEWniB9CUTeD8&hM9FDJAc_ak$t^X{b`-Z-)^-| zqK_BWb1^vZgX`a zTV}RSWT!Jzx1tkfnb~$?W_=Nz$Zcb0oyZL{>qK_`%sMes{b`-Z-^R2~@uv6Y*wuD=S#dv*0nbBlSz2a(7gWJ=;t9z>B|kh(1gFu;qJR z;!!=uzI+KS$Wto$7Fw8d#cz9*trPLemo!9pnkDCXc!Dh6-{UGp6Ksp+&38@7@62JP z%yPKsIbFPY;^FDE_Srs>Jm~LPFUdM8??Xwh#LIqO^?EnTM6My}nli`Es6k*DoRUF;XV6CEb!^^F0{+|qc;>pzjW=_-WX~w%%G_4DnCm_F zdgeUj%A8pzX4Y%zTW8jZZIz4kpfl-NS=MMIJDt+I&Kz&1wj$}Axy;J4?#gnnH*>kj z{Lf5jN!dqs+2rwX*Xd^Mo^}b6eM&xy)o{T}`{o)ce~+JSfB) zY)3H7lfZL#AocIVvuFqLQCutj9XyQO9mSt`=(3}@3^$Ust9bejS3&o|cm*YSg!Or= zw~x>vJl#E1^IO(u9gdd<{3D0Y9KlogHJTr=7Is5T4|Zt2$NJbx9xr+Ew5Z|9c_W?) zO?X7`#Q4w;;#qMLPr1ACmI`UEWc~LZJRNvoH#BG%pBvKD^WaW6ah&>0@Fe~WP3&yS z4sJM?=U3<95pe<6y%>)q9+;hb39>H3v*Ocut$Y?w$Isy@aRuHXS8C3_8V{;#$m6wm zGTeX{)s1+V@Pt~HIWQOG3E+HK01E-<77n zSpjEmJShMt0rlNh9_I741NCs8uLs}-0H~AtQmS|Xt%8GLHBb$_e~y<4Q1r_G{YchF z!O>6%#{k97`^0!rfCa2j3^uSs36w$^P(935;3)&g!g@FkHo)<)5vVpsl6a_q8$3WY z8dXpYRHs388nsXdKB$KVpo$GY1c0h$)QQIdv_c!SLkD!i`{4tCDku-y6Iq`GUC<3d zKqVNf&g{)MKp3jR=s4qbJHqxT!~wN=Q=Ye*IRA7w1I~oA;A}VtP&2dl?Zyk(zYsn` zv0VfoWgGSTw|fs>$2D$%>)}SY3BCefg`43P_!`^_x53xp8*n?^0e8Y(@J+ZIz6IZg zd*EKU555cc!vpXjd`;)Oeqb{h4L;wp^8zk|n-yQ6rWK5R$vMU3FuRkV4y3K9pSk4c_oy*+){r&i-3 zeMqJc+kEKEeb|FXVDHvwHnSFv!AKtKz$-Dy2*z&>Mz0N{cOM4sWenREj9Mjz>sKdH zj@_9)?1>OIJ%UY(;;A^u`4}c)7(*m{Y@9ZmpuL`fR~?3B8HVLq49jWfVRJAj8!#Z! zf9-b(?Ge_0lC;x@J^op2+2`=Ex`OqUnp>~NgYFva)wT3L7=nL5st^0YT-qP}0-l9} z`N)L3;2zj#0qKNwa6B|Y2YeB}1b4u_a36dZ7Etz!VG2G31BYU7VX~0x!u!9hvUHw)!>CX@IfQA zKs($Dx5H~C=mxaY;eG(Nz``>6Mrei8;XHT+_)!3ZPo)?Op%gZPm(IBfx*!Za5QRP% zgcyv%7)-+x@N+nj4*d{Vvz~lF=W+C(a1(q3R?@*A40X@~6?FC+;8X{F8(az3z!oQI za*;o1fmY~*5jSNGQy$71UV_))Um$~nLMVg2D$)tVwe-7?fDgeYI2W#g8{vL<82$u* zftTSmD5zt+1pC23a3~xF--jn)iH~r2z8>9&s~gB8{1fIhk{>t+z7BW69t=kI1~>R% z5JurlxDXaM;Ux}xHZv}RRd5*m44#EKwDU!9ENp}y!B1hAR@xj4zz94BkHZu2Bs>K_ zfzmd{QSdbU0)7e4!SnDNsBEXc;gk-_2dWtq`C#k=lr{YDgUEp|oq$&>{0&}#q7%_m z=z|!X3Fm>lZE_WS3+@L4`?L`Dgq3g@91V@o0du>^9~=Tl!q?$0_ys%<{mQ)vy+Ex30r$Ye@LhNeehhnFjPAg)kI`4c z;*V2r(02)G1=i06YW_ z!}p-+GxSyPO?VIv`W$TtiogzQKTo@bDyV^4kT<`YpdC8k15o@0&WBPchiAWteTF~5 zi||i)4PFO%HEJ>J2Is>?a4Xyi^S(qFjKMVg9$tja@G`s(bFao$!5TOP&VVg2|I659 zSOJ&97a)8seG&W|ehIr?hrNeW;dD3yE`&8V&=#TdM(P}J|1G($Ul1TKSn-~o6I=H0>=6D$yfKDY!v33tLb;coag+ynQ) z{qP`s2Yvz1!kVvPSD_J_;1eL@zeUU{yvKWG@SYC5rvv|eI`;SBgA{23m)h~6K53D3dH@Cq#aD0dXF9QK0T z(L`$0@T-p#5B6tda5OyeS$YC^;EUWPK&rRR?Pb4u6{8~fI=$qB&`wX-2?g|Q2f_CA zIuFs~JPPaRVKzXfx3N*~??ke-L^LLqO06X?pecU@d9zKpbG2sgBN)fRM3UEv>9=8( zO=Gt+)&ZFt5S~f$l7rfZKUQm&dKqhgyeW4T$XjwRLF#$OX~Sp;+(D^I4M^Xr&FGQl4kbH{L#TX&>{GZAaECj05=H?63Xw;<7Eva{n{+WYz`7IV*3oTps)M^O<9*tpa0RS4HuS z=P$Wfz8x%exxiS6PA*o@lYTV0wBoL_UjF?`Q|fh0EJx?Qu9F&`J~AaKvo0`hJ3JQs zk%g-oH9m%WYfjbt>f`*zoeExKf5j&Dt+ZLcd8mt67F&6>)H%c6RDTEue&h^SuvrpsdGUTG0GuRz4gy|&88 zY-RDnK4}q~_C~}D`)nm*wz9ZFeG)oTsaL2^L%%7#FsWAgd{XfiR7-yhJENUXsE=a5 zsZ{7MaVrtMb4Z2$B6l7Ux}{_{v!$w$-OR_l8?}PpEFx~^quz~gpxEd3%IW9P!$=De z_&ZOnOn;WHoI^|9$alT(eO;wvqcpUQWaZx1vxG>@wTMxI7SEZtz$8RAb!wzcELxCi zu~H_MY(WxH1g*ukrBbzEQMRrE zk-l{0B7{p5I!Oyxc2SzpN!h|B&P>AB(j8@AV2|__mabgP1^D##Sx>y8Qg2yE>MaXT zVm~YO5@lN#SWAy57ulyEE!&VUn9H)4QvO++pt%twyNZjo0Qs9OY$mIc?kdc}lAXqk z!iE>8t(@vKh8O2pIkT{&$(&Kx#@*7wRQIuQH!Un}`^~~;%VxpuX<@1(DcD^LdrR4T zt{^Q;bt%skyp3$$ydo`3buKrrcpKT=w0ByV>Si|W{Wh}MxNllmOy{A$GBACa=*#>9U-hb<6 zJ%3YLnNkI4?5b2DzxB#Ukj_?&Ek%FEOftl1)ooEWJ8iV;wwPtePtK^=Go~ZItuo7) zmy|JcUhk>7R{O$F+a(?q|Hxu zUKXeFqH8Cu8?vDrYW}X0wk|F4C>3qy3VBbtQYESz+y9@+m3JJbx-_j^@*7RF_t->8 zEopP8glHu@fuZT_J@t%2^tkJUv$kivHKP!1!?+E4i{mVn9c{!Iw!g*kl@g-IS0|kH zR>xIJh&E%~8otHxloF!t7`HcXaU7+D=yBAn~UFGq&V3}xqK_Ri8YHMDXsWaz0Ob2?`4EKPGmFYJR1 zJvU^QF?(lu$A0O&+_4`r?$|FkFR9KluRZ&>-B-%o%UqZT^I-ujghlWM^V!0C%YSbP z$TWC*swHa*I-}p|$>@tyU1aVg#e4G#dd}TkX0uJ7(^D!Q@;$_u6XiOg}8iH*rS3X&Kpy zyj2=ZGG=^=k*uVw)a0f`by7Ml+k9}5s&KO~B}?pW@*$9#dX@VQ%j>f~t4PT+X{gSl znB1g1HKLPS5X`vJGozGRrdZyj%<~RllqfU0me=3b6A5*P^JeaZ^K|n2Dk1sr zgip{9tTTpqo1+CK=*`>>=Sj_8O32&18`fFMe>eOVvh+^4Bi32Ue@FZlvb3Fd#bU^I z?k&rELsru>^x4L8S~1n+d3wTGhWTkX5p%=+|8~fln)1{0sQI6OWD3eOmtz|CX3NMw z9b}e~n#-BF@!Xy961rRFgYHgx3FWQ3r#B~u6zPsHJ3%IYq4dPiZH zvSrLZF_fOv`S?sSWMU{esgs@dYu(_KBhNq|S_ak%^&X zUeXgo*?IZTOzOO6A>Xr*xl=T6@}_=In!ot7rmYDZ;-_lf7ync9zW9Ke_r+h-yf412 znf>8A#Md;l&%0DP*AqWnbGZ2In)k)O*Sw#5J@FAWhl{VNd0+fX&HLgPYu*>1UGu*9 z)SCCj_t?BIey-+yf_Lz;!YqE9+gr9|pSxWBzTrN`F7vmQq~(OqfqAfC#%=jJj6QE) z*89UU*m`?8Uy{jpJo|htYui`cW&U#GchSb5ZGDY=vSv@e)lr`FizQZA-__z(0F*yg+{^1LgT&z7a6;+S!@*B z7aMzYE-~VZb~nynxw}!dqQJPiXb)p;`<}+K4SO4hwXHM`+3S7AzP+oA%j~O-S63Ap zhaGA$ZtgEOzH)-i@R!+*g$2hNXYA%SrW$LExuF{4`@Fb*MN6aM-n*G!G-@%P2zD5I zbiLpB>|P%*p6d-78}|+y2d|A7&m7ZlwC_1++_GfY*lQhMahy2AxU={yBM?2;SlD-- zalq(##<=r*$Us}=C#I!tFJfC zIN^HZ@}`@N^5(A??;E_?`115^#&?dt%Q&^^F5|wsdyISbz1R56q4ycL*F9hyM7?9oTF_vP5!lueNz z6e^#?7ne2?b&Cut7xAf~AwHivg!gxXzl$iYURTI>;ONF+S$WtMqHt)puJsf37U* z>aILjckuC}C|8m=WjfBX1rlK%apoG&ZMo6dm`tegh2(}yogd{|5|>x!k5kuLG;f!= za~I5=KjXFJ1GVESj(kuwm0LcSu)E43lCqYqa@fYzhWJpbILOI5&go@VeeL6#M36xNe_AX(G?4B-PF?3u$CoH-xc1Nt1Sg-@J zM)E1)Fs(GqXXjS2FCQBgi#EiOReTC=Eq{;XGjUCP5yr)5>Ey>>ys;93Luqlgo0|*<{9)+Y^0nP8!{w6Swo6%+<5UvWlQUxFc0+exI5@U?RZGBo-0DNp*-swcu-+YwgyUmxC0(gBX$h@e1LNTh!LcEa z!&>II6c;AEfl}-ASb0ZLTWP@UYdLOxk@?K^Md`fkh-@|V^hATFDDIi6ioJzgjgLmxhR5PjrKJ{Yg~fJ=C}TL(I2s!ckB&vd@l17X z6|!M{^Jv#lyeBp~7&mRdO$9A73*E6QVI3&9w^tR_wlWln)v*jI{ z__t=v6B;N9wswwnc8%28YZBhlp{}Np@kFA`zRf0Fq%~C=QQ21JSzCp0M}@DhGgesM z*->eD5CWgksZu?MtD%j;1?r&}xts8DBY3(2P6?Y_hM_P(n1Cx%1vZAnOq`79e zuC=qFX4)0@1}B_#OLujS)HeEh8#}BOiJ^gsvi_Es%U0c7=o|D`hN^6h)0G{O`tG5g zo~aRstudGwZ7D0W+uPiY)1%(DNHFN`3wfHRg9F3k{T=qDyM_jvS{lm7LnWc=p}05R z)Z9{6TshY42@lmZbom4A9gS5DBX!l5#;CPwu%;?r*Wf5?E44M&*VQ-JBG%&4P)XHb z>tI8q%+|PcS5Khd((em*l#TTU8_O#_l{F*%_Ljm#w7qP|H#kw`YVPWrtf?p(D{r25 zPg|=>>{IoKFuiowK*yxF+FLZy-&r*7_Xa)9wJjZ8 z_QBG&M5tppQW@@#`&vi+$DwaI1-`yEJf&-*y~I-C?i%abuwJ%YVqP$mU1Q-5KCjo^ zKkafkhQ=d~gxBeacxz(~gRaturDNRMQ`Io-sCP#CM|%6CRTT+~)8TKabhsT6U%;NI zc67K~{eHJ+ven&PY#j@=l?-q^}XGLB?EPXiSeK8t_+@^ahJP z}8MKNEid%|nC2Pc|(>K(p#oxe2UaF<3}+uK7ey~FiGt^TNgs%EsjCf4i>_moA- zB9TZPXLUbFJ4`)!8)Q zZ+DcH*0$Ix9PN{hm1EYYD0HGzDyt@OVXKeNB0>-5ZZZEbWt% zj^KDuU{rZ3C4}W7B0V9nB6$OLt8uFjgL@Yih14_r$t~ ze3e74;p%p4dvv7QQr|XFUtHK2A8(DusvAe#CB=<>mHxiQ(RiY$y}Kdg9Cf=Uykqvs zz(_-Fz1QB?S~lGnb5-|O*0@KVt?{1LhB|wo#8%kssf~4%SVme#YW!Ze!|!m$?A5hC zZ*{fL>8o;BTS7H{zt880Rk>X8D$yBd!sqh2EGo<$@eev(ep{fq*BR&=s0z5O9)EL3 zab0suiEr97=I@Kx>Zhz#^&W4D-_l~MZ}Ak@Tl|RzKl&E1^f}$$gwN|}?XIp*bQf2| zeQwWq_h6u}ZZM-4u|U{W*)};Htg4vkb~`2s>+hH<8Sg-!>IOp-p*}~%8L4lr4tPCP z&5rg+Z)-egb53*@ClbDg5><9jXVBI<-O2X9_M`OM2;@ZhBKh|lw$lf^_9Ed}XG3f2NKvcB?rsm;+rxF`31>&Z-aXzB2u%g2!_AZJfrhct3134^w7JRFZL2CR z^S9L$m)3fVYfJiS0(H)!+8Vnp&|1?N7@jEX?P{kPjKpk?!eD=5(Aw^v?kx_*5)%WS z=>g}szt$0`?U;5BPDGj}D!hFyHP-&<)Of4EtgUOH+7fSTA1=3z4bvw$r~H+J(LhgG zTcCNoW_rvv9`N^i2LjO{TZ4bR#?cljF0AgeR$6Q=wTTIPVW)j$++N=t4vtTh2U_E{ zX?I0{YWBnfj*_X8iormqyK%reIovj4!)%Y*rUv|D?&_{CA12&W=j$K!#cicUu~2`p zf2bQAH9R~Z29;ZdqF8V&Jhmo2 zHX804+~EU`VY;)Xa!=iOb*wyE(q1_|T@-0AtnO?W^={vQL+8cX+|@l0{?BBgd1^3T zQ5x--wz+~GlMNHCBWw58aVmfDUbR7RNpnRZxfZ7b=Y><>3K7InvmqQwJo ztZ~pgQWHtMnR;xCjfUK@;P@cM{6CYC$*#W0V4^%47@g?s?Q*r0bUE5wJ??7D)V6Q7 zGJREg-9QWkU7&$Y3bWj2|8}8)g2z|iViT>v+Zg~%a-QW zYR#GOOcnlMG&mZI$9l%r24jOoF*O^OE_O8%{2DRX8jqZrhr2tIe{; z?k+1`=!dQ?_Z z(bhXM!?DyceO{h`^*&~L$6}-L4O}a|y}p`>-f2d7T?2t|JT@>cL%R)DTWRU~qP#)t zxzL!*7@JNnD=lANl;`+*S8O0Q>JAT&^=_~guP-v~W=akvnuvzNqu$VllbOU;%NqHc z^GAnREK*mgHf4&twZN9q0dwJ}&Q*uEl8{u-4HbE$r@}Iqkg@OvGL#mh4w&|}_U2q( zraPzd9Lv}8Hmsivt@DpF_ti5M9g1XHTGA*@GP~b9Ha5JjsA%gM)}jgPTHD%U9s+E; zv2h8>fq5?0WID}o|aQYWQEvTvTMk;AgDgvy4V%G}XY zn(@hzK(wl=d$KJw?y~k)jD)TIHZGNk!!;+f4n%xR;yqhA>l1lX3A>g{aBQMjblH4PQ8f zWlKpk2b!X$g2OTit*1lH`jH9FJ(^F+xmwysk7;QvXUAD&IwJeE zUQQbhcpMIwv$DCRgJT{?jgy15F*&tL{^TyLkrp}R=6_VK^aweRu-iY7f ziV*0`Il&W`1Cr9@qGX0;XX}e1->Xg=%7o{+ro%BH;UtVj!ks?Z>XbjGrAUgVTFN79 zA%!k=!0UJC6rRh`m~|v~KTFP5J2fhoDFH4=tvW;Pt5T_vO{Wx+sgxRvic~r|Xo|1S zXQGcnG8LWd=dE9kbDEOu@;GvH9C2qK$=w&RGcGPwU#fiNoQSGqhu)W@xq@<76v|Y~ z?nHT`IzqT9zMSt-h0vc2O|INZUwcwTmkvzpL$4zxFBRr>Wb1hDe(JpZYm@$Pg4dxM zK}Me(dG)WnF|9AA`0sZ8qpp%=^q&6ZD$6@d|F9G(o&PV=zyC`6N2ZdkYF7Ivrc~QM zk22s&2em1ZzD@V1?+E+1UHZr4AQmx-jta?-O21p>M{lbBtX{%*cK_QV>8VyJQc0=k z$>^S>M=dq!zFC)iwa?M%cMdtK%30IJR<}61R2EVZ-s0NbYwNOlW9^-Nz4cY0NN;ms zD5W#Oq0YiK(%Mqv4>=r}PI0`}VRzIvHCOwck#bvoaq7zc;@;liKx-mc)jHLhaE0q5 zPDjk$;i#<+lshY2L-lm{{gW0FUsV%|ScARQ-92sgKyguxFU0tQe7f2?N_vY21{*p; zqmlk-q9ZjzN?js2;Iueu+r~RW869=B4!4j#>B^m+fq=!~$|;vX4dIndE!BQ^ap`a< zm0msgLY_L`)6`n+chty*nw_{rPjv;L}~iVDxQw`x$+tIk)M*7`1+T5HtbwkdzTf1qW+-BPE* zb&x8r^ms}{q!wvkdQmOM;fpvX9Bz-J-Y;vf47w&A)GLchs+PBneN|Ty?yQqYDy2Hp zJUCaS$KOoS)RqLK7mn!hc=`w%Tvk`1sXeI!I=&hYX3nom=#%A$-|O-Y_#9!sbJ{_r z)2_zkaHzK}Qph;CJd#R*yS%EXzdF*`$JjXHXsa$OtC&dleZ+7_(%}@C$Z$9^9tChS9f9S%>eqnO+UdLoI4YdYw# zHF#~IvbeLh(h_g!ZSjpdJW7Y_Bj{I6i`$Vv4eF<(^|p}9?he_M=z4c!gSkC%4bIPL zPcHi;?J>7KmBk|=heOioj!e-$<+e?0{C0=fOQt_31Ewx(Y z<+dkN{QT`n6`g5(oL7}i?M1?8xIas&d$O;rRQjsYW|hA?v42qdV!A)mtwbdy^T#wk zR^j>Y&(fJn>SfYasm6z_oq2yI`eVL7%h4y5GxPXF!e_WYOXn(~EL@w4D}UTcQ@GRa z&y>EsP5smMP~CT{{Oa5^>GBb?s%+LfLjUs559HN9)qeE+fS!7gY&kRfM?dlo(LXop zlxKXLqkn3Ap!K&$veKmNgPJ-}^p{m(93Lxtrp6CJ)pyFiJ0k5v(r8}#b>GS% z-LG}{ol}mgeg|tcDP}(RZElaY&_!_$Gzo~gEKKh2|KpxE6yj5`>2H|Bc#&St4`DV(!O+iQ~Sz@RH}o@NUEtbt6QtdsHK6CmdmZ?9`<42Bh|Cz5ns&G?( zP^+>c?a!^sR;Ayi+M}9!ofi3wQ(1Omdz3_(=j+tI9CMi3q-i{&GNH;xCEApJHR|@r z_{%XYf7H~g&n}x2@@FUZ2dchJ;}NwlX>jE44^+5mJfhO?6V<6v?LmzPRsFdo>&|fz zrSxSdjz^R}Rf>KvQl%QyexphEBvEQX(^J)`*4!^twKzHx&Iwt29Zsv*(H*kX$^EBu zWTG%I(9mmf`ik5wBayDsarO)AyGIyrv)|z;izj?)_E+t94@&ryyVUAZ=XbP9T2y$w z*hhytKR12#H60;Ie6+ozzTF!rwpqtLp}r>0clJwu)&2LdvY+KU&|#)H;>ED;=tg_q$taT5J4PSFOlb`tN9v^HqD14f7)HE4g&Z z@k*Z~B=@UT9!GbCcBA#LSvs9y#5v%o3d+2YDt}de`u<9#SMMu5Rr@NFx_-3PR>h?L z==gFy^}I}c>uCJf3rR&p?lq88Clhbyhy;S9CvX^@NBZ2Fl_Qgs5V z{?wW7aS`Q~T<=VKsjjC|rBy-pXB~goC8??bo6>KSgYEg`=}thYjvAk+{5nXKVrNt3UIC~vcc4P0p{jB(tW9 zUZ+B(O6{xmY|46-Tt~MOl@z_NlA`KQjh}QPRf?26-4s;&QBl>F3Qqk=x0lobS#vIl zWiiQvlo2n$OZ|Z(P)tAc2yI9|J`jx(Q&!}(Alo6)%O`ji?^6i#C`SmR#AvN-M zHhn9Rlbn4HPY3#iNu=hn(~KMZV#oW$Zqo&O#EyrQ{Z2T#6O2cyxPS3u-*vc8!nsfD zceu(Ofdu-CJbwba#(W2z$CS)4YAdK}QRPBUEvkL3WJ(`R`l}Q&qm^2#)cGcTS4~~( zyNa*+4<%pE2WH~uUf&e1R9&|hC11;vLe!=~%afwg_e<}J_M%F%UefGTlLxB3sGRAW zj(3NBR`sFnxnxDzUj_xK_Mr3AC_z2)Cx3fTnxQ%^-5!*_naU#|F?&Q+l+i+e880(_ zR^u0pJCB0A%)>iM#k66Utqz`Zq3?v-Wjw<=;i!w~dHT#a2UAEm=c(}!;p({<_sS;y zH|e|5FSSo=q1IHYRez@Tb$e0!T0fO)oAgzkul7yntD@8GMTF`>k=EzT`AVPl^;G9OGzm{qn1M*k5Z!wiKJdYCl@s9Twe9vEtnpF3x?{t4bxdRftWBD)AKQg8I z*{u5^bw6dgpVqmSzwZuzRWg<5d6bMtO!MD5Q!@VeFY?#Y^HIt)>Oqvcbx=b~H9k`{ ztH(P#aXv>~RgKK*mH&vI6DVkl8b=}BcHUFW;Yf2y0Nz5~_bR{RlWLp+B zf1!n_^VL4%Z9SOP=gjc8))Q4CQ^A$4KxDvQ>xndY6XAMqW_X`Gp~lk`Yptn_C3l0h zZoi_&%{MZ9O}&+)eU&ZN=9*S(#N%>0yl$t1wLcc9o$7S*rc|>}<(M)32%ml^ZS;mm z+%A7*r@f{*WU1>fs`j-uHdXQAgUYDKUNtq`T4Sjls_v_=;DWjadGIq`Sk_e9)6-qn zGvu<2S$n&xExo?M@~*me?|5^0MAFU$;{%N)<-uBuv&$L}pFO2Zww`#Mc&k2ZDpPqYN% zq_;!Lv)NneuGi~jw_tZ=^wD5@oz6?-UG*Kog zN`xB2twXLFJ~+Z1lq{|ZE3b@|7masMkC(a<<0HQDP?K%EtduWP*d$77sVnK}`V%!jqz+cA`4E*5FFL00|Mc_EoqhkW ztfJ|8mfCM@r^=FjNxFo%Gfx$rTL0UgXW2u=V@{MGu!KeVH`MEC=K6oCgeiYdXN&lw zZsU1Y#ve8Jd6vmvRLS#7d2IDOD-%Ee^DL!`WQau!hZ+xT>v@(*e^no#=4VXv$x5Dj zo>iw5q)#MkeNQX7R&~?!EN!#Y`AVK@FA~wbnC!OdIX(R{|6Z(~XE~h1GA~LMGM|&0 zAM)@}(8+v|%*%@)WutQEXS5AbHd9Ge`+7dobiN8#X38`ls)VYdQ~nFOi&1B)_*y$u z)>WI)Tjm^bB&|Z3vZp&l0eLsg;aT*>&$*X-)+v=`O zIK{tI{DN!zu2x6F$F!6?XzvTz{NoN=C?TTV{%M>uGS8Q(6Xi#&3L#yXQ?#5-yVZ<{fs|rZhJKOn<{zEY2@X$M^pU#?NQ~y)W0PAI3+Rt z$JE|bxT$|hpQHLCs!tZ39;Lr(^PS^Amq~8ce2?hYR`)A%uIYK4*2^|6AvwO=ss1`j z)lJWz)xJ(n=CA2~S;A+SuhG@SU;10x?7Q86SlL5;znm!){r;@B{nA`_;`3)^uT1`8 zYG2in$!Euo3V{j#!WruQ+_zTGsoR;4a~a^G*luZ8D3j05m*NuRWXHl%#?qU^ICABfFy zdi_?rdXh)yS2XBPsPxuV1sggCdmZenSju13I}ouB@~#C-f0g*BN_@AYeWazksUcF| z*s zZ|YZ{wLYu#Dt%UCp3M78UN!%s{o_^rsf+4?QKmhp($xM-YLKTcsxM`_zDl6UzN=WK z{y;@lC*^OC5^m}bw({Rp=~w<^CjZST5x5iEqv}{q;}Ny5GG%I$rtydhH;qR!>DT@t zYW!;Qzikj%b<#|BVt=6O+teTE`j?dC?+;YCX*`ngKXoa62&nWc{h1ai-5J%~$^OI6 zCb_=$=NJ8QCrr90L2AkM=jVPw`TyZRqWqcgFH!ZDI{&S&T^4ztvTL-czq2_Oax^z4 zthKSK@liew+|$=q8gZ+AKAP;~3r<`{@0Un;Fj6??pHSi2wLpaj#s5>EpOY%L_@82) zv;6rxEcyKT$7_os*br?rrLJVDl=!*+{H}(yKWVQ2sEVZhMf=2`HNQW<>Q6KNtj=72 z{*1q>lIOBZdUO5xP4V;k^DF%{Ih834^CjD)fgGy;k;~yo@`?`NtSygqc zP|$tK4?Wyrb{<QSQ1$!e@yAG5c^-L(w`$w4;oa^9_0pG~)yW;7sFbPa zKYDy1S2HhS)AdrJMB{&&>-U7eApYLGq$Kk|_)C#4m9^aYFTF46*Ws#FXj7spSvLw* zKS4Q3W&PhW-(|8tYEJ9z>YGZb*0*j+xvnpjlXtPcsq`y-!_Si?ufF+|Z5GwgHEEYv z+FwiAw_JTwn&Fbav*}x*I<+I=tP=fVzLht$z2bM;FMiP+=j99f2M7AbyB+wU#^rkx zK?m>0%Y0-+hc`<&_i6a=O*nW@3H_~dczj~ltnx6E?**WdsuieOG<9uypOnfdhsC77 z>U^cI`u<)Ol|EmovP!zvZ>8@lzV0v7scPR8Kll2XaF<+Jw-+s6$x|26`%0d=p4xv` zv=>#9>d8~mUsJ}j+VgNq<@a4-pW7sGq%+ zjkX^uzD26KTFOHkE%cXphoF8RKtG3w$~=5S1WSfLYVLbC_?yNZF1wzmH@!E&?-Jmz z$~=a=UqHBePmFeC(tne_EB#XYTHjTw^(aB5Qr+6BeUrbcNnh3ZYG21!=j-;NR9XGW zYyVwJekQ)|)$+D4b$vabsUlHkS^hRI*;nI5Ekt(p(|Wyc@=48nrE|mE{;{zgEI@wN zGsX|&tuj3P44(Wz-qf4A!rsP$IjP@2+m)CLchNr=d9RjIX%=?HNw3~)?fv1L+BtHf z4solWq3klB_NKOXHRh(TFX`Bx$j5R0eWN;^ZRCEGpYL?D4)TM5@?(Kg4%@rz$Mxms zQ}=-Fy}rmUo7C6Wzq%LZ+G9qestftq)9qjOHs;KcpW2k44V2#v&bQn<_wjF9DEG}B zPpP%}oH_hD>0Fox{Oq%_02aa`cq3V{yRy9-EPW zey~5h4-S9>;UHKA2g7PO1P+D6;BYtsj)bG&XefkZU=6H=BCvoJiophUD1lNagL0^V zb#N@KhvQ%aNZ!2Y!RxGZN##44{r~FK>8Rlua3-7uXTv#gE}RGF!-wGlxDY-97r{s2 zV)z(*94>)Rz@=~*d=f5)Pr;|*Gw@mX9DE+W09U{l;Yzp)z64jpm*E=D4?lp%L4GdxhwvkK5}tw|!%yI+@HG4keh$yTFW{H(D|i;3gXiJb@IUYy z_$~Yneh)9eAK;JhzwjscKln4e2%F(A@K<;V{sw=Cm*F4q3W)N)%KA0<7rYK{06(Nm zqvxkoS;o%dU)T@!hxfq& za3CB6tKeW*4Tr#?a2Om8N5GMA6dVnOa15-0wNL~WutG7|zz!u)3T03Z6|fGDh4pY8 zY=GloBRIebE^vbfDxnIh!3#A|3w7XwdT4+~@IwHapcz`A722R3I-nEY4y=!XFqgdvE*FpR(`#9<7^ApuhFldPv;8cv1}!6|SmoCcfV zbZp=ma3-7uXTv#gE}RGF!-wGlxDY-97r{qCe&+gP@Nu{VJ^`1)W$;P396kk~hR?uf z;dAhLke{W#0=@`W!d37kxEj6;*TA)K9b6ALz>RPdd8R z4XlMCuz(ec!3K6Hfl?@ga;SiHa4f6`vHKfX9}gSB0Zwp%8%}}LctFZgmO73}yc;R6 zo1mWk251C71fU6;p#@r@4cegtI^q5B0r()C04Ksp&;{KPgb;+G2O`i5QRsty7=S?- zf*1_L2#i7;#$X&KAOVvw1=DacNFHQ4mF?4D6a1%t|M^5?k}>xHKg1p7hq;Fg`BD0D z^)uaZ^DuSB?E}ey&Q<0I!E;Ye-FKwc=5VV~W>grZhRuBNO>Fa%-*5WII-3GPs&!AWs9g2IPIK|yv+ETQI;uK1YQ{3M4y07=R zpZEBlFaPA+-Pw`f&dfQp37xvMEDHxKFDBj2?&k$eASVYO7l<9?YTEX<~C?_zE4 zVgJ_J3dF&t4C3Qw=jG*PQv<=Mc-Uk>eB68jTx_Z!PEIy05Fej_0G|MxJjf8l4dcPh z&2KC!ifQd)^_Lguzn{M{_&NS7L)zNX)yi7k+{4)uCQ-`O$=lh*6U5D??qO|ZZ|UXg z0pj2k6=jpPck;6KV3Tz+_p<)a7B&TGLt$x7UYKAmPId`yPA-0KNq$Z~8EJk#*hor- zmxF^>R9IS?M@CA9gM*WUi;st!n^%&bn^T65mxqg6T2e-WTSC;BO~J*=+RyMG(>Xc+ z4sBfjn#c)L62hiz?PBX?2jXS_tC7z?X7aPML0nzE{?c&&L!$|U2sRSnVbk(=vu4wS zSlh7a8ghU*K^!m;JiR=u&7CoUb{iHJRyby67G@_%c!~HD(xj2zffjmWLeJG7crUv1SAr;ujFW`m_Qhk|1$a)Q%^5*4=+CtYa2`;J0_5h zPDV`@6ZkLAe?b=btJ}W^DFxyZ;Qn7R1aWil{a+iocsSWKL7e-wGQ zQ}#|mHteFHQVA1XfIl>PjBQWAEO_KHx-~&baeQ&HHPcI*{y=B_dKitE^86AU7>X0l z^O1s=NNEofE1|Bd_)H#Z8*JS(crs$FdKVb~;}~IG&8nbXn?P1tRG1pY#(n+m=ZWvQ z520bDh^QpYB(x;dIV>bdLOCosDuN_A%z`8&Jc6%C1WASkNoZf?aKFkFew8Eq3WIryWH`rzte`e2+n7Pt)rAK_gB$|1^n%VFW91LH|2oowKl;=WV=|+TpBh|x3;rT2K zXZ4oD%~lj?o*DzA%iD~u4z!JgeDdBEBuGLD2Rq%8P`{i1<#hk`t$)u?!qUT4*44uq z=4AZ;x}~{`Eu*yyi?$}1O~u^9@vqau;^*%pELy!hyscqDqhjr4Ze{Le4*JIzAZ+U9 zw$`41-S%(%LD)25WR_l99@f_Xy0gGP)BpIe6l|N5tL=Y77`BV&e>jw@iSxFf8}V{*g7^erp(N+w>h1P7tToxBt$pk*ts!!fY?^FZ9_B8dZss1= zE|&iP37LNg|IygW-u(Z=29_OQ!v3o`#M;x<+r!fOZ^n@E^ODo_f@KBRvz#X1UxfZ< zFbHhG|99|Dg#Jw+FpXg(vaqP+;Qx=xvYfDIfxikv*krl>KL4{5My&4PYN=`MWyl6g zk8E1jeqL+}&M@pG|MMmFpDzVtHa#^92W!i}eE(U8nGJ*KKPdjiUf{2+fB1{SKCq;Do@y0%iO~AFD!qP$KNyhe^BRz>G!W2{4YsR*51R@3&g3Rw%F}ajibxs2oKV^f^Uz0W4pRFlR2?5IJA4!H!{~cY)B@sK zk3vH5VE&<#K|?qEBR0-KIc{;545E8pqg7=2<1gQ=Z&xbXMYG2D1#3Y3(n)NgAh^8q z4EMMD7v4b(S)-)^{gd{pa$IJiuALR@wk847=U|V=$F{p>JEz^-Y0j<*elo5u zIhyfKlddvzcj~)ay1tLgA8F8|_H3^Yhpi7SN6KioG!N_$>me~1bDBQjEEi2El zP)4J28y5jI9*>_}x4U1V&^4^H`F);AVqx_AosAu}WlENBTkD>-pNtlK$V_2bb(v$s?tA+-ggTp3hV>waX(_Ib03n4Amn3F zq+u+`V*vrQ?v z*5O~9zw1dL-kNVGuO?tPpQSYw7UR}CwZ1y4It#iIurI&XEjpRinTwl4l!%d%AS1*E zuwbDH#&eJLmY9!=&sla3+_~dng@;9&e^edb=D_3Si2D^nNs#eXF{WRd>GhF@ogYsu zyrrS&)K?|9_dkO#Pgy*B4fpjrv~?!51-><2G&qB~T3IYN+FAN64aXnX+C|l-14Wp7 z1?GFaPK|%ro#H*MZ(OmQS2`Z|%ZN1wbYEauOH{Z7QI&XJ?;IAQj7fZ2@LzHRfJdpW zG$aKtDi^Q&z(XCn<}vCqu|0NTi1TR3O<{C>)^h!3rv#4FHzEq{4w%Uh$Fg377gTn* z;vyOG|2@Q1j+5ZzIV52;|>~-*PsojU`wMA z3R@=@!X`;Un|~$bS4S8!ppD68(_pW^)umNf(;#SUJm%Lt!c6AS)M6`g9uqJ=aCA5x<H??P_-klKs|!)x)jSWA#|1cKKqkY0=jK*);6>R@c5 zcGMV~a2uS>_u+Jn{_m2FE;2o08aox}!7EcD@dNwtX4>IM#Rw4bE@c6f0r4R0!67rZ zE!Hk%+TahIUDBs14Jz;wuW^Rwd4Fp$xKc6Curd+z6nti9*X?YwmFcyK`Gr6_R`}3;!j}bz z6J(aOQ!m4Dh=7JIQ)$GVuu(g-Cd@i1F)9-l``&S!ElHS+N)giOW+zSKOn2Amk~cd}&+6 zKcpyHQ{MwvrXMwLZ=I*G%d}~GerumVUx0k6`Uuu`=J>9iZ^Bg75}{HkCJmDie$zaH>_I5 zBtdH)?Xovab8v`=w@t>i)_DA+)>2$CN%L{cXo&3BD~VTfEoB5>((+ebPN~`7H7|eZ zN3##fr>kae7xu%6N4P{scJGQp?T@Nm7yVJjq5ckaF70hd{23+nRFB7mFhEr|Gkm-l zN$!Xg8U308J=w@+8eU-ndgkqGvRXui|2@0%|2Mlz+IxAbTYE^kI=i{L{4MGD z|8{(?9-40Eme&84h;kn0{{LI6B5!SPYv%>x;p2pLXs}+;&Gm0D2(mGE^0fZH#Sg3@ zZ&$ND2=<7!~wld-C z`W68V4F~V-sWH?ywKDXTbUY+b0+&DoR{}{xLOPRPUQS#Z_rn~N4*-o2drK^d1}`bE zcGCB-frQXCb+pdg!qpQX`f@9rF63$B)8C`{sbIt%PCRRVv!l!z0d8($;004i9v;rY z*#igy3|>SgE8rldBA9vKF3S}n$isgS9^3y0fQQ2AQEYDL{_{|z=tu!uVJCkcN~3$D zRi(|4uShs8O*Ct(X>4*f=_dgPhC?3OC(~+{X}lTGZ$CUcMCY@_$1Ccc$iUliF%b!Q zY!o936#WwwJ%$iOSUtRa8!83cBRe<%=_%cO^5@l0oruT?`4l|hc&zRp6%&$w^6Z(4 zFbE0^s}XsB)LXPAj{R1Rc7pQ7UTcDLsCNPwXxhCudnE;ZqT4;RZ z{=oj_jpEb0v;zhZAe8Q6>2(tw$IXKQ-KWIembbdsGlmLt0q(J4C}6lcGxQVT8z(`F zREO=MxLmgAfF5m4S8R_B00izU2)Y)pH_JImZ@(s|c4xJM&nsg^iUolq0huPqbZ9ZB z{m6J5EL%HUPgi{KIsOSv9==31P2Zzr-9pJ zBa4kAs(6@wd$*{+liE=7<#^F?8ky@3*EU}hr(iL|^aYK#c;Ex4K`v68WgF={$OH*_ z!GGZ8;mr~tw^+H2L0Vrt^M=U%bbsBSTfmCefZs@Us7{c{nzp$CHSC1aQh%>zrOv0t+E-MLg%QB5lSFTqv&${`hw}&ikU@hT_v>(u(U*9Q zka1>!sV~bs6(WqwzV@-ATd?%J_!`#(&L&GLLMUlt-)e;$S3zBpL_`D3lzHxvt(Y53 zccu~BeNh`2>N&Z!#%PCXX?zRIZXFNIe|4c7Kp3#&c-DTaEk_u3+I@Ejli&Miu>r|E zUbX$5N%rnrTzU9G-~e6(LHBR#`j>nT7;YG89j#15`ubu4OeeD@956KMyuLIbQH|)z zMIesT!$czlCP)A~yxMYHJu#thW-($Z62NS4-tJKwn4bBZU=paCj%#hiz7=e5uh)co z&~f*PO+eBlOi8`FR}pxTUil|Jmm=vf1Z8`9cT>Y#XaNfkqY(sffqN4fC0$IIYo;!; zZe`ari z83dGC73+9#bEA^V5F8z)17k$E=plD~Ds;Kmt19qtEKZ|zfNc}YRcClO%*QAdprjYY zY7#u$m04!ETMO6mGF+&Go1%n#F0Mq62wX`z3x5R&Rd-{ez!DzL3t^$@(f_f-az)d=+#2T~>nEfYOBDT*IDn8euizb2_{k@?7bUS52_IntK?3CO-fAq1R>+v zcqoRvm0=iL|w5r7SL$>{l@MY9~a>ss1Hv|rycWXO~-RdxAF=U~A zUJImlX!Q#oj8(H`HRv-x-6&@;GU|VOCAlB+@~y}Es?1d^c(-DoFx=?_VqH$WAN9iQYzeOGv}Q3Y_a^ z29r!tjEe7|u6|fC5$UE;s+KxM)ctgU9)9i^<9T_5ujR#%diSy)Z#eYJVZ0J_QxMDXOamJOe*7vr_-j(cZKT6<#3g&6_li6U|{^) zj)N}>`|v@$HBA?2gi_jsar~m2 zRc?Y^=q|-)80wC5l623kfRKr+j>ofPN>7bltTEeioJfLB+}0$#$PhXCewV&!-~4vA z-1gFNPg@=YsY&kEl=7!gtB7<-cOun~r}cJpCk@0}O{WD5Xo=r(*p61?N?!@c4cDYEAs4H^g@!^+% zRW&(EJFr%n&usM8$?$lf+ZtL=?)B+CSwDIi(w35$6kaPqC!77+582fpLbGc8zEZPp z8pGHN!Gaz*X_B`*tI?#%GNSj%Y&04>ypsl)6lT+2;A+AAqHI68DFJ(2V9f)_z4N{upoAPZOoo?cOu0M7N$w& zw1`y-W3r27Vdsw1O>ug#|0Rc5Zm{x(EV;203r_DdE%>51n)I7?jZMvo89}idUB0H(|tlN(GTiBh{a5To<)-n2+(6bQKEh=srS7J zN(#Fx(}Y)pY!#KCBC=#JYC68h`lXKe1V|0@{l;qgm{qw1JW$VCGK^q%wjUB3F^^b5 zXxb4`3?rLtZIL26{1OvPeicX<;(Gk0+o{x;s9?dT$ODx(P56tU=7B{T0x^}(+arCT z$?KNBBrl8amrKJ<#iK-lp)n|U^>Z%<%cqxK!D_YAPG&x*p^!I23C*qlVXQ< z-D8$G5=%UiG}!M#^hp@tvqBPIx$eby`8wZ$Fg`63uEr%0xzA3nH8zP1EybrVxjPYAVsRuEczS6F zD{$_4Z`6PVrzmwuL*kajaOMdq;cW!;> z8c3|jHZkD7%sT{P!6@~8Eaf_^@voW!cJ)WG+oGgQv+zO?aazV~HbAoL zn3tf*fd%Ky(H(J?{~<2NFfBW6RH$WFf-VSB>MsLy*!ZI)RSez_VabhkC)llErDft49MH&{%l-FfiDy^n|R&0Xpa&#nAlf*a?l4;c&TG3_S#=dXx48 z9pD7B<1k4Owt4ED8M;5EbU&jf#6&hg;enYW0S(R=%ppK{nbPkyfKhxoS4JM~l%OZV zozKP{6OyjsLrYW$bIiE3Y%~Ej@Qlb4A=0wZrIWIV+qBZ!2H>^j1D2s%ZGv*=1~Bme z8emto6=%U&Q^E=%DNkZzje57UQp!QT#X^jey)!2J|+yFSfAYGtUoWUp6O(0+9 z(K1*-(Aii-(5MY0KUg@k9p{Ah#g!&ps7r2O*dxYus~`qIPzNqL{f;4S8rw>h*E)@< zs4G9c<#pCAQMH^Yzh)rtZMmQ8!4xoerL>(CIFu4j^04i%t1(QkTIFVE1QeHl8?#JD zm;m^E8&)2L)=n-Syz068g~jGwyQ!2|!G`Q3eii~}%~SU5I@Q7;l%R9+xBl2} zcDUoU_76vvuy5{Xa4)5eOdDU2p7u~B#K zq4m5s^I82VJ*q83H3YY_k#V#YTf+~zfNX9aQ=YFQx4c<(oC4&&g*Fk|V7Dv$SfwEu zy9odvBfqr~b7&U@o03k~tLqe6GaX@Jt1}2V(VQMX0w@MBZP{bg*IBf; z*Zh8S(O@W1ZIV*Jl+tm0#O-_3U3g`|(>F*Mci#}9SwoAV6!yDNy44Q}UQLC+{Ijw> ztxk`l;*ZVT*fv4W;bvGG!DFFJQoAHw;kk+vZnqGz{!OD{NS#~4wI6N`c59m=Vw3G} z2&q!RW6d8`FChAyQFSa-kd;eVSs{+uKi^p!N&H1m3a{|SNS7QbC=Fg-0%>3)1fOuk zFR@)Gm7mTiw2Ac+0fIBuxIh%H^pk=_EhNUT;Y~Gpe~mJR3OH3^DiZhf6AF)a3PZy- zI)bI)Zdc8>El(8FQoSPSxh=` z<~kdR43J#cWPU^rQ|Lo3@o5t!>K!${AjHm1;BrM4_9khT)MP7-8?s(^OIa#F8`Mtu zR!SYE`?`Mug9h-)_RTYh6g+nRb>DYdljZR9ZuJ;~dTRKoT#CzAGC5$urn1UYBy~9l z<$^(gFq%=qH?r@eKiQ(T=)QgaBo5gM3|UyzU_9GnY^}f0lC$t;&eB6zuTb~6+3mOa8!I-enB~+`{D!||NQsI58v|YWR7VOLjwi=@toYrEtQMuL{^T&ff`WW92 z`OufT@bFC!vL$Qo^Vu+Yq{>aL^n%M|P$NovP8%rtx)Wf>okMW(q^4>5!yF&0T=58{$y#g^G2Hl;F$6zS6cXtI`57qmxe=2g z3gmy7X6->WU=tx6L~x=#I%mODnnBRJDeENjN)_1KTkwJN3u_cL$4-S%^l(}@CoBwJ z_^OhyMijz+hkI_<83XY}GW!8ODFkH+1VC4Dmpf85;I_Z5|F191Q8m6}=mXlMN)h#u zl#nVfk|)Pqg|M~i>YnccxK$sCo>9)53lYuULJ26KXNh{P0u>NOU1=G_b503O-!4ya zOW7(LN{HQ)!^naOlY|j);|YH(xLylL!Dqke`DIcmuY0DDV%0(h`3R5g9uFy63(Fqt zr-m~?*Qf^^rd~DtvBd42Ei_=yRZ-kIBXi&4XW+?W*33L>w_~NW)>Q=lqB4g2a680afgU`uCmEqJ2qRr^BZ~yXK!0J zz{!%tR||%(fr6|Oq1`+?F&suFVl2_zcxv$;J;;^g1{mS6gU36#TXBGbpdkvEN3olg z)dL>sU$i19s9s{T*YFJ;>j45_zZ8|M+qO60PMcxwwh#K6AwOsL!tqG;B_ofx5mR5|8EN|FzTn`^NRYkl+U6@ zNt=z=-wR%(y>5O=a?~ZYkwj;Og9;o^?dkT$e7|RNo-5S^2j6vr{Lk&uSfH$q}t;zZ-Shh(WMg}qnm5XzHqb> z7bikq1A_^pR2e^rd68o)Fh{Q zl1NN|lD{BNoL(Ji9<}K+_THD};u`O7as+eo9Yhk@01~lJdhhkqG4oA-@q1r|P_?Jz zZ4kOD)yI-TL8vPzNce|^Mt>%jE^eD^euXF;c{ts(_hPou?x%)t39n`Z(offX^?_tp z8*Ik15%fphnyzxh5g3ubRk1Xp0!ucnn|UtkYKF`OH(e}$Ne(sx&e8ye{7;_O}?LC^=|xp;x8_5Pva!N9VmC&5`8qAjE^*OXXAMMkr}xIb;O0v2{}r zFPDMvfy}fgM0ZzfO_{lQweNis-*R4#3NSp?-A7sGd#!x`H`2h5s@k4N>Ja8%$`FG6 zb_1eIg&~=XeRw^Q&LFuhWi27yv1^UsCZ>X92{(Nd{L0L5N3_BZmDuf_rB}YY%9;Vj zV-*OE{?tTY#UgHrI@zlUIOEpYq1@5AkWuc$Au3~P?KI}p*VJW52MFuyiysr>U~jhI zKfisVxUbaqZ1pZ1(T0%;ZQ%+tq=64vXBzPp>>UI~UoAUQ97r2JWo_2(=$4`MzKLUM z{GOO+0bcQmsd69+9sL8Dq_$aE(TIQ24H9e|7vz~9eU64O@v|BoZLH!>mWARw$`3^? zP`21h-mJ=4v2sbR1qM(YSlrx#EI<7sO*@fRe4DXQ{1Z6Tx?_Y9rKlkE1sr zXNfG7hTd>4;seX)_kr6xZR*l#d_@o=qAj!pg>BsAe7R*7lFM<=q+0228LSKNa>>Mj zBOCrLxfQOV=J{n)5)sF~3(c4{JY`cQL9>Ed`~Y#l&ewevF;@L%tEW$zP1wTF`vv9Z z3&!L}M`~oc*6?zkSv^DGJ*Ux~yIzl*Fs&8*iLF%(k7*01Y38O2|vhO_doFs8U0i;t2mJ>#x3 zSJ(icCFo*NZ-P04#mW*ql*7K^;&Sg>{HFVqlHPOqE-gH$)B{_;vFqovr)tz(l@%zv zbiq|QezdWkI_gi{v~hKxsN8E`p-KrmElHf&wb`4*%SXoqc`EA<@m)`-X+KR{w)4e- z;jr%J{V406=;$j*>9C^6hTb$QLFCNEi4p0HMxa5h7> zE?6$Mw(a4;Ux{nb_V2?dMdDu9U8>7c!=igyE|o2m;c}e6THd=DH5mG3hEPjE z4_NS-@eevH{-x6PMy&&@E?-Xy^K6&&e(l^Dl26`;-RRZ;x9L(ai?Fl2*2bGUU3DgV zShd0UrPi!6d$`B|XqY3zmG+P?roWTFW%$%rKh@l~SIB`bNFYwU_u|t#_>O?T;lw`8 zG~Wn#ZmAVjUPa?kXb^>+v3*v}yyM4L1)QnT7oT?5|vF(clifF z-PADwm4Sp`+OQkPs}7XHCa#(T{yuQmeOhHs2Eu_5d7B?^BLRdcTjy)LT&742^XI#^ zsn0og$hDcOi5?jrx}VEwP}UMsHW`i-!gk9~_Mh7HE4IF`$^LMj;bfQteB!(zZK?l) zOs+v#U?^zY@F||TN$lAaLosaEp?LbzF+*|NkF9MbnW<#gTj*n9K|y1$5%Ya9g!B3a z>%@<0;ssXt8+|$MdLM3+8NT}{zC`tVdOyg}DxKrgVwi^1cxj4;mdDsf>nIhl+ugz5 zeH&VZ+cV~szvoQ3t=x5!O|tX$)sX*tUj(=(^^VBKe#mD6`m;@K&y7mz0Duw>j`z@ z7R|{*n9%+xKrzl3rF3lkaS0RA5zTTPAn`BBau5&&rFThanjlalXU2AHRIjVVRGrZFG^WyqQ*P?{j+DK^g71lO@~I$Y{iJ1zJFLg8 zkLjV~hvEngj$jW9CU3q~(?lGL(-(sRiyYhQ=Wg&-wMQX>8E3}Ul(hnuzCncAZD#7% zROPS~^sX=Veko(VA^gRPXaeLcSpI4q7PS#&)S zc=(P?IMZbD>1DE_ipdbKxi1gBGPVM5@BDOAi@NnOU@6qwfP-u~MWk~pQFXVZ*UK6< zsnWcA-ARvUDvzvi&=I^;j%z>+MA$t> z$jLiiFh6gN{LF!7r$tOD*K%=JKBFmKa^^#JM<5?mI~V6D|FQjf5`>!U&#$vv2f^)A z+KTq{r1Q6a+PV{XB?;>`o&=)A+%hENyYoja?;gSg4*pS#IR4 ztS)KcsmS5d%r$XOZfiM`H`?X9nmx~z zX_IyMH{CFu_P)g4m>jRyt1Q&u0xnQ)aYT-;D3ZRDCec;y2l=KerB8|gu8j!3LB{U0p^ z=Xett>!Exp*I5uf`b~W=%cVVt8)eWmlBz>#ZJJ`|_ndZfX)trTF)PXhop18R{8qcX z`To0bOP`#Ewsa~dp=K$yyxZ7sQ7Z^jRNmdKdEvj~9r+60V>RZ15<6U`gEM7)D`@K+Duy~E`q30$!Jmfww~2yrlO8_1dx92 zvE%@JD1K~EH~7^-m_oX$*JjNoc6EFnO|A}5S1`})Aa>VOT#ynPT=KMoxTck<_=%xl z@j}1O@0%cmQA2X&7wXWBTsH+>zeBh)N6PKv8=ivsRfn1q$i`{7euWt@P*j$(&e&0P zjeV!}UE<|M%Xo)Gmhf*tDnid~V2oEgzhPm!`RMs7m?!U~THf$Lb?p0tJP2TeW|(v| zaV%p`CR>D+PFB6ps)k#;x0;6t{-8LuUS;CNtW9CF#DD9Q^-6h)A4}Vzt5_(4fTUtt zL5pFPAy3#}l1POXWkH$w0a?u$wn@#<>RlVO-)2*AIx_puM^*K#5e~K_k6>bPAhX49 z!jxabWQBHQmFU{EB9N7xw=}I&xGIRyLC{8dYCzok*#Ym&v22Lc)HhN?!7bC^z&cEbS+e9ndG}`lQp<99x$DmpP_)G#7Pc+*L7jRYtIgk9QjN0Q@WFWkfox($cipO(K zIts=G)wL;4?nzC#dnHGa!G6`|JWFb%F80S?jn)tsOnj6j+Q5cQ{z;O$TKP2JdR!Lz z`r@RBOfTqs5di{{7$jKaqzZcX-H5ZYEYgehV`;1NER1z%teCp!R2r=_8D=U%jML5nP=5)N^wR*Xs6y55`HR%n3}R+mmub z3D|c<;Jq7cik$R0& z5n6`N_(NQKl71+`2aQK;E#h_mIKX>^_{=Qj+R!J97C~`fr(O6guKyr`Jwcl~Vq5wC zCq9^^Frg^L5>>HP*HJc;9Q8@>=3_nwN5|^YO()K%6GtJr=L=eH8#Ck3i6n{xZHBHNF{L;8m-Pd%dGb$?)51@wRUlunHO-UJZ!y|p@}4=+`C3Q@ zVcBv*fLlT0>qI0Cp|+xvcbI% z0S=T{lT8lb)vv`v+Rm$3iSDOSN0G12s1F)EipBuXmOInvvdQ+q7G+UZk4xl6fs1=T zuhBom+#``f^pw}e=d;}yC2)4i>jYU`LVFw9CoWKCT_#h94W{X3$w$kPB;+Zb6!^$C zeerM#(?rL*v%OMVvo~_TDXk2LUUg<}<&mW{ZzY1PNPm&=v}bFJrCGG5i#m%+Er}d{T!~W=Cyz-G7?z8PMyL}*<|{ee6|z}s z6ap&8zX)f)W^^v*EEpgv`AXgg{)6~t?#sH%J0mUy9B`jyF(jtQzmVs3{SWIHYa^Fi z*-6Vb=i3a%T=*C1snXpe`H$VQ9Zl#%W2KPAS5T&YDUFQs#VK|HNl(qUKQSt;4gIZN znI9LF-WD#TOqy!U)YTT+uZ=OwLFGOXC{_}tndb|Z<>v%5q=g`78GmeQLUJDYDl^{j zBq*3r_el0ZX^X>mRl`0#_%=~?%vGL3%9AhE+eR@ZzeS6DwJ+O}SR55?ME0`y&J}0KeH~ z9mHF&uSrQfjLRRR|MPJVrF5RrdKOsfO!9C`nL)|PfLfm~vpKz_?rDtR#JPU_QYKcq zN{ShS=AlO=VnLbO1xF^Rv-g_%c}!$~?5lC6{EVG>z&?3d+VvIAt~k-We?FiTB`*H% z?)ThFs;S@sBJVScQki`wDoINBV8KPh5Ap@=dB}Ju6|O|i>z~pwwKoiJOH%V+9PsVP zC~96J4A@@RsI9S%sDot2{ir^mY@SgHdPX?oZIA&WMtoCU87pv^rxxQ*3oJ2{+fONf z+@=PLpvy>=;v!2j*l4=-KDFo?X zSI+qKohaC-U)h-2;`(|S2{TzrdNAX-7Cs*2R!~Fdv;?V$f*~7YYl7=jH#`n~1-Goy zQrfb(i@D0I-}xr#A%> z4BM1;GoMhn3Cs`Tk?xL$9q_u1kgrh)RLs2_50i9p=@^=q4YG^+v$<{>(QZ6m8CBqx zXzL!CUX#bws(}SYV%eNVsKvn7?tq&|=P^%glN{cea4p6F^NY=!XlQgqAhz1R0Y$t| zRXc*-?F!)@Sd&6hYL(EbP!$5#6q-5DH{Pz;5@)$@|5oZTB<>LVTN!ODfVFX%3 zEBEL>czwDfw)=p&TQ7S?cpn@+4KMGgbp1g9p4;1X#B34?KyZ9& zjdSlzLz^Ad2y`XDApOk7c zn@R(a(5o7Ur*WdFVN4CDp01bh-l^ZfK_}z`Sl1T-%p)#@sCd3`^os+5XJq6tKP4a7 z_JI!LsGlci;X9SKf4DbpQ0q5{123xkadTsPi``u}n-Y(ia*2^y+qIgNYgymYpg=*y z1HP%YXajlR_Sc$7#c2!xD*MQzG0#$ks{9TRKxXl4w4hSwm)C3FZw4ufIh%ui_eXALE@Ol%%)kf_f0U;83_#9u5}jg zi^UTIi?4BVX%glR3fnV&K4&wgV}|{+F|UN9inP{Kj$$=BH}86qmahr>@(*F5nqWLw zo{BAyX|Hs3y@UNd9HPhYjgmCxTmokEOUb&#tfknwZ^zLdC`vf;qxe3SiD7QLdF6Nr zr^iq)gWMTXvFLja*5XsuH=_X|IlJVqpsDDmMY`$~z7;4(CF!((Y%}r5Yk}P_OM{m= zobh5gy5JV^=Qf5LSP^}qr57itrDO^f-N6Dya0Y1XE(r*zG0P8Z2yq0Go_r2CGTz)j zzfw(=R7HrUYNRVTLK3Qyu8w)cW5ARPiVOPvxvN?QbA|rhG;VLbO}h}k{5D$PrAXCh z*WpO@)pxlC4f5GXkwq3?kVgXQH2Mnn_^;n~2H02JgcEq+3KHg$d8E9XEC}UpH=oSU zU&-^o*KoTTBhGx?BfvIWm91+!R7(MhBKNxyr`-Aeb}gpenx5f|49awcHg$AL)fQ9V zpGOV2`9&Ynh0{HDLD@0BtH8G3O-q6P9;w74VHsD7T*`N9i=bb#w`Id@N zL{F1yM#}YX0anQJ+f;Y5)C+UQKe3vc&@}H|wI+mg!FomK!Bk5q@id zvNQ6%zL)a@hD6DS8Z>%4Yc2s-qOc3p`X>(P$d}CU`2hg820rQUNe(q_Ewj_DNzN>X zrP`Gp0b-V4OSRh7%2pp{`^5T>jZ+bbyKua_kG`)E_^2yf&QfIJ&5ON1=V-XXj8e=U z4q^9TIK2+|U__r(&*ou}cTZm!5tK0Tut!GYSyR!-t~_qEyCXtQ8cSV@5|{*5_j}`U zx&1xij5~H$471CdU?INUTxWDZY+mB|85-Ei(gGL8l$z}Q<;srCM&hvg(gp%*0X86a*GUxl@e4 z!x8;-zjeuTF`Tr^6232Vw1QmYRIi)Smumaeek=HdME(WT|UJzMG%b*0|9%cBvs~H|7sv)z3n^MH;swd-w-m!TBR12%38dQs0&krL4>5IysW9 zgWzyScZ}9>-!kkpfPwW_lQNP!i*ARn5pRFKg3Yfdw_>&caW&IeQ?FUn7TRYmyi~QOi!jtwT6foh@Dciu+-v9IKsXL3k;eOZ$QhhKU*E>?tZ;)!z$=Ih)PdE=6 zu1->On~^B%b}$0Y6wk1tYS}d+6(npqHoOK*Ey7Hqxlm{Ri{H$&zVDrLQ4oBDIsUYU z9V~1#7D)R9?^t~mU!rK-{`n1ejnWU%vw>6Wy>pU5ufY*)arHDy|0FPDxV*d!XdeMn z0PVC;z*)pmS&XOu(PJ-2<>34P#M=JshbddBw2ErCSIEH%cdbw z3b86mBX(*&vE==PGE-QB8()X0b3i7(Fvg)T!}nsB_+#^tA#6D&36hChT-y&11U5>+6%`cJ>$Z5`{hwb{)<>mH)ZpnhF=Hmr+AvN?IP1>4oS+Qto%3amXCy1I=2!( z30pi#AI_8Me{lPCm7WM(Ea{dlWSNkW$glAx4Bx;6=+z(KqxqfB5WNZ35tds`lAikW zg;~RfUhrb8?=zv5Fu=_s0P{&clHxv!cpDw_uGm=qPI}D7Ze@bS~e>8Fe6cCnCi)gT~XDK;Mv)iaBSemns9ea&@SEXY-8W1R;LnI>pCDAJ49q%L*xX2UsQ7c$F3~a`86W5R&H2r>C~>qw5XQxqvJ-A%fc8kB2 zRh6EVBlYT~8M>o8uXz$IivWpIKhXeIv_;*Xwlv3xBE9TuF3%Ef_u#wRV#@#UAWfPcl)$5V-vUI@!P)lCi&U@h@VUHNyQpURO#U? zB3*DvBN*aLvOAXUb*vWN@Ldyfc4((`>8!S8eoZ~CKUzn4IPL!Kc6RDceteq4{yvlP z3b6?FQNapnqh6`mV2##`7M_-Pb;h7?qDz#DZVz^+{x#duXanM2`5vdy_F1+uf%CZv zeNA@p+=P+yF};Y+pm9_7PSLHt=>1HNYz#kOyDV^GX!6uU;PpwhikI+e(YN^i*LIs| z9L6Mr0mAp^sHCTO!NR3Md~rwRAb~mY`Jz`1l}FizeWt~={sxp{ywZmG!e)+tgjR9a z+>Zbu7HtR@q;J|Y1o9t^Df)+F1iPMp>E?Q`d<$3p=>_dtmW@;YjgnT_ z%;YNWMnkj}@DvhYOG&JK1#sK=0G_T)eI(FLAN-D!<&k0}RvBAizu%D71;Azf!PcQQ z2xwb0nr8XP?XLDz&6u83M#Rd9@FtGzXUQb>?Cb+()fDHAv**G3L(b)sX3=S(&}qTL zNuRA$m)^)z;|zc9ZIO3kdwyMur8q=tgWj&r6b70hxClU|0&2Bue zj>dR}ig%MR8#Ekr2Of}q3ThX@wZrs9aUWl0nKR|oAH=UmXml6eGl1I<6|Ed{7}d~M zjf_RV+s-`30kR%c>U(6I^BcdDCS$y?>DEZ2OD4VF!MFgZnLO>d&K|xwt zV3(Ao8|m&`8bm<4JA|dX8&tYwN$Kv8ZnzKc_x-#-?)|y@oH=u9W=_l;^|LkK)Jt32 z!EtMcUhYamGB)ucUJom>6)zlv=ZA&;RrZDR3}jP!EBrdgBphRJZs`K)RT$1muKo%2 zTQsL$GBrqlDG^+!v}km~PwQAf%ZV`mbxbcql!(taXVltKHbh{6)r9$Zi*2%^vNW-v zoN@fzjwbB=!NYVFR`I5FXON%fg3^nY+~DGlAA~FKiny>_a9!y({~+%E&i;EWKNsyt zTXq$3x5hu&VcK*^K2E^49F_buZ@HEY$CNB2CXECc{PnG5Pmq+Ev_H}8>^;isOEv$e zF_{};GU`-jz5jNe#QX)!x#}(wOTp47XeQKx1N&<%JK?Wz2~F|HK0luMLM?Xi=J@zF zD(b_U;El+>G>2gFh1pkf@%J955ibbKNKG4e=?3+vFe$l7Oe-gsQA@G#Z>21B(u=#q&E26G||LioIlvX|1#BF?xZ0=x< zEeDnkV47Vu{BFL)=Fc(gSC-Fp1Dc%p?dU93Xfx4Y|nyaM(#WdG>44)&9qA?wI zQyEqE8sxuIE-mupT!aZ~;DBT70|_>S1RjMP?nf=Z-Ul|SA6iQCh!m~A6YER4zzbT? zRVmNvd1Wir8Opx(r*JkLW!$;qv%0ti2Ex^MY(#85|F8E5a@Xrq=NeucCoF?s_<_BP z$JA_TUrJMlWr*88Bb@Avk{&Vs{Y{WmPp)=#mOT!|WM9gmZT=wAfGUxVj|*HxVasVG zDJvegJP!V`>fz`J@r6+KpfZkf-m=bu^(hQ!i*s?6r#|ae^Zc>bl(hah$ai(#VjD}4 zm@E|*^R03;YFB?UyhB1ok;EK22Z@B{JZ03MsutNK{)!HA?>wJ)=D3qSG9-@M>& z*u11?BWGC1+xH3j$GCDUc3$?T;){y>^ba-LAhdg$-AFC3F^0IM@%vd?c>@&5D8tRO zVmmp429wjWLVXn{xZpwA>tWJ{!H~uRW&i01vRo?@jjOk_G!tayIpSN#V0M@E z%)vbv|Ni%s%9xM2BzLCi;6S-3%nbDuDY$z(f53`n$v!{&!Hp7&v{OhPwvOh#&jf>$BaG> ztFfbpWGRefVpAGeSsAIQmH?8$aplH$+wXc9Ey4^j4EEP8OW*Qh#Q$yerHB+iZ`h`J zou8fP6JRW|`O%S+Y4)5rzF8T=7Gi$im(ZY6`N4X0?Ojk9luG}0Pa7=Z-dvPIut|{p z{F{|Wl@dBv>M8c?e0xzujcP>FkCNSuvU8N+)PU{YnDf|zkdbH?C8D8ERa(E}*aU4P z1$U^*;U7?l-^rD!;GBohvt>}Hu2w!r5AK;nHv03;-VWk@MazgWvZ17gj95j_VIWrK zBVsI5w5lLIJ+C&5%m!k`khv_B?BwbR07UvAzbCx0P!V3LAABW`h( zzg6f687BPBeSLTKc7Cn==HY#0v+Qvv4Tp57^Kvn3l7x%V#{{E5+qmiOrO{6O1g*q^ zsP!$@q41>sq$qxp=*@9&L6ADM!x ztCZ|{W?DR**>9fdu0Cf#bPyU~4WTPwC(Ekv$llg-MNziDZKA=^JK?uhx-3}1=E;8j z&Hhj*s~rMn?U{7@Grw)+c!(ZO?VHs>VCaU#o<26I_nn{pk-XmZOT2O* zED%@K4AYN3plRuZp&BE%c!|zk_jPf``@E0IXks%7{#vBz75v)9N08jgRHq8R?GcS< zv$9zdaHTxIlujY!N5zp3pXNl25&G8Kt7t6QcrU1*^JaeYdTEl-!=gZm-6N%RW}vR= zOY_rsXw7GmjKib5D$8cTk5)N*_~Z06`rY6_0lQfr%3%Hg8{RmbJS9<22)m1g;5*d3 z8ow>JidcR6>2sMm{=Kocqqa!D3T1jobt~5SJ72so;ZFUW9OJN_iBpc57fCosm^qy` z9Ur2h*PF1R;SO0`iKz>@Gw`e8dvn@4N8Ur6kQlPStHDgxA9c7g0=(gXQcGMdT4OQw zCo2rh33Z5`zAvJ}jt)P!XrFFQPq*iua#-*EBS%(rB`GTK8vBL*yU=WBHLBx-9gFot z-iZd==gdFvx^4|`35fo@l#Oub_aMZ9Sj)gseTBnuHPLNMKPHO#R>icn;=9ih_M1N> zv6yKT(yP93*?z`w#VV8GM-Pz1FYbvY=smt>!f8=q>p$OBJDFvevh>n0}^+ z0`5*Lpfu_6Y+S{ZWN~N57x%r@CFSX$OCg#H&0p`fu9n_o>!S$O|4MJ!+V6|~P)(jpc+0ODFoZT^uz zjH=D=4sd)9IH)Bj_Ai#GPkDg6mE$d!G+RSJDS9C(MZ`w6KBI10mD8Q3;t_mk*8 zoI)Q-)F-+((|yj2T2^0-Bc(hmmq!l>_$wn_Cmo_z`-W|^Lj!g31GWCdeo%)}EC|sK@PQ}uC)cc}-9UbMx738;u z->4^N07%Yv?dTQx58)0bx8~o-ZO~vCVlaHx}Ws25~}_hw{W_rIL@W{ZuYWze(UIWqzKuJl^)*i%FC0EAN78P$@My>WALU zCSODk>8EV7eCBnsl(#-cUfWDrpF5Oq)T(D_&7Q{<7N=`x#dPJ2>r6Z#;fpu6X!OZ7QUb7oBqDO9vS0CO~c)d_aXjPQo zN8vp(dLJZKICo3G3l;vc&xidp;Gg`aI3folu;9ygQ32|sBLvw;%Y>IJ-SpK7p9i~& zfFn(|55>*@nugZZrUKjIOH);mh@muU=4Q}kwqDRRjg*-18#Y$7sSMM5e-5RUREnKr zP&J*D*u()u*6Nj2)Qa|z(SZrMA`I+z7lMd3zEOx#xyT?%@9(id?Y3qRVioo2DguAh z?Z&n7etX~(GKckDQygXt0Lxtqh{@0SF;hzL zuC`eThNHdc8}+Eta?GXE^k*YS{iMtI!GSBYp+6Fz+CQ8Ak+U!`-g7QlDHytSq zI_CBfl>8cfC#rdgi~w(x<81Tj>|ZiP}Sp|-qi0HwK_rhzaG*(iJL`u z?v~$b?)DcXz;CmacI6^|6WQSTqLGfVw~ z{3X$8)OtuxEzyGhSHxc&lEuOT)(%GcFStL$!juj;xOYkx zojP;*Rrl)2PHdbV%g=T@M%mdd^#wK>2P&U4y>&?}-zE@cPj-n_JwkEw$yzmI@Xqbm zP__8u;x+MWP*ZC1o=q-&NBzqsw62%EDrTvmdo3lp=N#jC8a8@`TnFd3RZldRJC?BYxoxkqzqG z@8*ZEza8?HZPcGZ{4mDioPT(mIoBq6z;K1yZ+MPqXQJp=LM{Qtbzs=gdT^7qM!#E8Cn=LG^z8 zuixPxdPQ8C)3~T+3tHPCy+kmF)yAIYwA7g8kknp)*y+zTeMDOPQ^TJ3;CD=h z70K5KucL!}mwiYWCdlwg#6h0c;Q!v#nZ`sf@?vK4gan*$B!!%*&ZEqNAf1Gkq^pjLamy9~2G^rJQ(llxO)pA1;g8L<|XChJZjIL0t*X`~0&~jSd_T z$Pdq+lheILB?^515d|Ft5^a{Pu2d%@F}{CPiUxin@-R6s8YdJixM#7RzSAes37KgA zWrzs#ZJ@&-0D-`zavkxm79`EpWd98iH!)sTE4r(aRl#Q!m0)s%y zWC~JHe#j-nRJ1xb^)S|1(T==9tMO5OI{G0-MJ&Da9JRJ@VP;Gk?&?@z`AO^^L#wP1b5T~p2~x^!Mfv!Q@}!46ee6LL;?$bQ~oT_89;$nhL zR%$+H(e2V7N;TCPZ!omcPy3eWvBW#yc5 zbo1|H2!PhF&RIz@s`QRNf^oDFhtt+y=UzTvFV0Ys!DzJg==crz37_d}Cf0$WmPH*R z8S6W~IVnKbKSia?^f`Qrro)FYQJaJb=|P}p8{3E=*`>d3plS(5z<{39B_yeZe$-~y>1RL@=8ATK*E3bvPby60 ze_BMNvsAsIiceGhAt=z!UyAARxDDhx{*RQ@q{En?(S6*duA~13L#IRHFXyOQAfW%? z!{_7Uac8L-A@81k+DlwZ7QL<)v5foqM2LZzt>CKb13URW7!&V4mAS*&VIy zQvaQ8$}L!?Le^qBZ^(z*sm0{jO7lS}Nw|IH$H@kE|4K-rSu`}Zv&9fxH!2i<6d|rJ+fQh6&L4aRVn44@2XKJ;~M`VusBn) z(5Vy=MT@SB12!KisxjL&XOEBJMFGTRE4Ris@|xF7Fx-p0C(bqPhL?OZFVatph^1(A^c{e zT85(6i7RMtG8!nCDERp^DnDGumQrF2PS`$~%XQQCFs z0mtoFE(f)0C1AwGG?VRTh>`1R1{j0^9o4I6F2G9rn{LIS>@18kU?}qm; z1#jj9lCqMDlCblglmQALQ@Y=Kbhn1hE&?k@`79-v86++TPA-29zkEVYFbEl(_dQ^V zPL>3zI`06Dm0!^)7<|LK5Z7 zYdOb%wOQ6v!s?aJJIEm8`bi!2-;NJ2z!r7Nx5LQMo!kMc8`db}fyjaNutgE-Z-AYF zvz>*76^V*6#!~pvr@0Hc`#aMX0D1a7C-V^{BROb^U|?!{OE7jG*;;oT-+)Mi3Q7W8 zW}6hHm+m)k@MOYaDu@^@mN~ab=h419TMOrlK7ywiEl?j!^sPTa)^fsyErn9QsFwC2 z8V<4;;7?q1Lv|d-Tj$(k2eM+>wQ$Wt_;m${I!@4@))+Y>Yxh=D?Mn`gC{w~l3ddcd zqJ~Cu0^n0LW1j9scTe2JD8y$9_92%}q#~-_#^(##(|r6;{*EakEMXRryIH^Lk%O=Z1`D0&{jcYKQaY|G#2xdl6#wC)fsq4blr#q0^=sgoV;LLoAD3mVJ#BsT zUF(BSpHv=dDTin5;btyjXs1uRdFV3u+RwY{n7O1wGs>*h7}fX-#}h|9QOG%z4z_zeHHEhGq&uG9!r+Um>y3D9uW<5q3$%X}c8 z*UGk`X5ILc1w7-M9(flEJL7qz*;9(B@Sih2pa&+wb5c-K!<}s)vm0-*6)LToy2NE- z)#`Ww0^P+Qwtc9gS4eSRglVh|<1^UYlYv10lzkT4N8K|wsLobIFS99%wdSE%F1YGM$m*5tKVxIMe35#lJVW(tOL_KZE|3Q`7z5a*_st|aGvKZEFK9Y3h!#C zZYp|UYIE81M+Je#V!j5f=liI=)km0gB7s1*<_}!A7X%t=xI4{?3L~&Tz>vo7EB5*W zsLgMx4@i!^Nu9d&5?=f+-i>1#8jBI1~Y(aRI zZP-N_)gqSBh48$932yi(E0^yujod*k;NWy~w;`}WFA9Enp51j^(*%B^Wg~(+i&YGy zbZq|Vv56WK>HCKqJ8*k(j0$o#SjYF-iOWYo#bV=Gy{#ToJG1Iua-LT&9&N(!Zo-j4 zvnzcQEY9?fYqe_81g(Tn@}i8ypf-ft%gYud(PVgBhd`(I{#U ziyb8T3VvFB6?8x5|CJy3`kR1jepc=veyEi}$mFe~^d~LoUlwSzoKoCw`)(F;NTFO- z>7AjkIrR_u5|n-+fzpgh-@juK+8jykNh_Y3qD=PWd++#|`p;x+WnhVUcDkrX@qh!g z56Ou843jVwiN97f*&!c35!SrEJ}RY*9iU2`3{<~A%{w|1(VHpptv}0`YiBiz>i@HV z@C{=Ri=nvJr!pmaLG3lKSa=)CBf=hSpFbI}u5~s4VA4xn7sq*?y1vEl3>%24o%8Lf zOK&7HxuWq7SsW5<9&Z*QnvMkaqhFr7Lir86&DfSF9%aTsL_1^-zU^93M4+)23k}g& z>l7Xg1h9v52=WwV#B^7fEb}NZ)-jgRO>x7gz0mBEstRgR*nF5uI(85lb;>{5CA+smDo55f(Y1e-7Zy4|kwQOD@u!jTyaxK9I#;dz zBCdrT&H^6_S~!kS50eRrUE)DkHYeRz=}B)h3fclD+-mMw6vcP9&hm>FVXcX&a(n1G zi>c+<+_(Pmmkg^DpMy28C8ZwNQjqp8aYE{VQ;aLscM$?c=!rS{o^TzAG+u7E#^Y|! zySJS)1*E4N2cPlJ8Yx;VY2WJ}Ew7nrkrzGWxe0SBVgHNrbY4@isZP1Th~?uvt-lXb z)Uqr%Q#&@~e#U|f$3WCD=SJ;fvOf;&ODnnsj^A`;&BM<5^_i`EZ?|U4A;q`Gs@=s@tXdU1n))uRmy-#QL<>g2&vam9nyT5;D!E8-& z&q*lRoMMpGhb={q0|yJl(@0_QpnMy}gU*>jLOYWM^rjJFMc**S zOUyrPvWHvcUev$$yd4C|m*f1k4@8y^-q@l*&SJl+v#8&yM+07z@W}J}8Pg4tHo2(= z_NLIXtgqy4ZxSXf*c8-m>|%o2@LNXR_R;tJkyk?k2-zvibPn9a9HBQEa?;;CATF=LyyjtSzXnF|kAy5c-+I@7 zD3Cnk^(8sTcN?-Tmo_(nSZh`)bxciZ#0D*r`}Y7sQ{{?!em)))3ke^!EJe$9PdpJs zW8oHhM*81HB1)l2d-=8!$|_2HYF9?^mqZFguTbrKzHh)%%v^qV9U$B@;l)7XV|*bY z5WCA1Z2kj2i@vu4dXk%C=Vb#IUp)$hAGY+KtHCIx2SxYO*osyfkW!)1aw2~sl4i@; z*hGIY&`3X;hfh=2Uhrc_b*MV9hW9#Rs~0=P4c3>wXhH~{Kv$-c5%ieA9V`=S%Cm4c+S7b%1S1Nxkg^HRww@MUoT9E#A6OUODK3cSvg zX#GAnx4?mC3_F;PHjd?4=Es22ufH`pFlLc1uOxzFE2vH1mfb1He^;D}ly&Qe^N{!n=A2-?zxKCt1SU}rz1+%8X;N;ETFxrz;X^Ki&z31kUSZGl!l$#ZMvR162 zwaP-Yz`-xnuk|Q0yg7|6V$gQ{gg7U!fBb5U8JvcYB=z_-fVK~GT-7sOBxd-_LdQ>9 zM9KBaqalH)WQrX3$!raw@@&ln-2f2@Nk2T{txG;=bY(yY@ZAcyIa0U7i!IgeDpS2S zrH%6h?Kp4un|$#Z@j`$zLnH&P3Do8J(}!0-QB3Yadkf1#LT6V)x?KO*~-J$P~MP1EP!!0(uhV z4E}vce55C&-vCcXhYR&1+e;*!RIEB{9#Kl2IQiq8{|lTV$LbFs>!fm$5x46sPe12(%Babhw&!%y?FW@MQZlEyTvJ zAJhk3F@}=UpS6UHJIH&5<2bZC7W`RQ(cV|qjl+sD{CpX~RWVt&w})&PP%Z?DuJyQ$ z%p_gu;DNdtu1xXVO$LtIBbyl3{=W2l2kI4IU<}F?dStILpt9*eBmkYwivpScf{ZF_ zRQUu3a-UQlNoa`_EKvGY08gx9DPniWB90U>pxX2KDjJDJNiMF(u2Bv&Wv0L~yX4kT zZt zj!q9kVKPlG6-EsUSpP8}A1+dc$@EUKsBL0Y#%J+H7fYsCn`7ceATxnZz#GSJi4lA} z?prdUsNE4Vl4HJJ~;k1MfbGd;uKyX0WB%_z?}c6-P!zN*v{$1JBNE8nAg88FZWp^XahZ)dPtqx^>MyfLhtOe#wiiSmT z>i3LbKVF2ut<|v=P#2?`DJWZ_el(H3&*;~OEdV&^f&7@B%wB37re{i@w+(Se$m0k2 zk6W+TKW8m=$m#(M5JoVn#tPfT>z%Se#N`E5+&}n9Fx<0ri6m?I;KBjqa-lR&{uYm! z5H6Z$ylqR`+EMksc5)+O`K3 zGJGtml5eFN;OXeCa4315=v;BWiPSG4h9TU;>9Gj68bNzV`=QRUc%pHJ?Invf7i1`6;BCZ0c*v zW&LW`g(DdZXe_@)ikFxfYnpFBfa1NJ993LQV#57H_zZs=ALh^JDE%Cyq~6YZMNNco zxa{Br%SBf9va$%rHOk(vOEE=FG7@jns-}h6LZoB>?XUj+Gwr$ZLOHR3xvVYW`bRvJ ztOp>Iwun|kb;GGvryQGByU0WRixHeTh_$0LPvN5kjb0ugG`W_(9aZ{C>d^J#ndIH)^NUy_lV_r>ZD|lLd9^%QY8(+7!7zMpg_elX&N{XF)jhmWP7F?KM zDWG2AWME+tne$D3Hh4$5hkqG=p-q)Tuozv-<^1R1Nt(Fxu{bq{V(Gq=!$Tp5m&!(|iz9=MM=U z>usgVy78bi#r}$dQuMMZlw7gD9Vmq882!V!eF77rR%kf4_oUH{AD~){in_HL{IXz8 z{hASMvsbp4`*PNO0|4&q2Wn#XX3T!2loP7I4Gqqej?jP@)L6QV7whNa=V&0s^UwQW zDO+Cb_qj~PoNxX!@J9@2^UP*cE(M~Iy7N-o?v)?Q=V-0Om{1adR8?634n`iDTuc!a z@Zll+l8)<<)U6z8MO@4>^mfqUVO+s(KaY9^27}TfssAv}Z3eMQazVw?q5Pnk)E)9pI)CZHT@ENW{!`dHcxDfHJaI6!Jjbpy zb;^1mz|1M&Fc^u#%89k!MFY8XZ#l&XCiWzIDV2`DF_Qdp;X}%|t zY+oy54-;k~w~C1sDX?K!{9MA$<<&3RLz2O+nkj7*15ZNufw8plv6a4_2jF7eNJ*3V zzWuE(n!}zDH@UPgqS+2?#(PS((-SO|xZQ{booQ6@hybASmcucMKO<)j4C%?umZDnu z7#mZ|>TCDdf5IKuppEOOeS_Rs!xaW6fu2|%9fC$Z+mpJj^`PL3wOb)u(uHznmh z4yL*gzt#j&TX7ru^N~s#^_1&Vd8d>j@-q}@mtiELeM-^gt9>(TP?5bO7F-W8t)<2( zDQV949n=4fP*ijM2@BEYJ*n({iJvQoj|q<7CWbdfoppPrrCbKMZ>(^D(^7o2kF2Dk zO&1#;jjxk-v!>SOnh&A3in{Zh0_TjYR-wq~_zMAq3!n0+x!L>XZKtBKCeE}kZVP-< z9w%U4+Uv%~D_k7X*|7K`X;EXK9i*ZP2EsJ4V~a`YSBl59&*K@#nxb};UD&syOUKg% z{ny^S+I9qf`APs}Ee0T-(Z$T_^Afpl?xSM65feEf3**%nNoI59R^}hA+8`h;F)<9` z7#6VYl)}J2iPg$av7?57d=vm5=lqIi7&3_9)w2~=JVl}foKdeF4M220&qiArb}09f z$n{~LFV0*~KAY^cY?oGS^v%4~TWqR_eI{8&#bYCcFTWfMs7*QHAea67X#-5cq#&hs z@%Jc8*yK(G5W@#I+{=F{999hQO5-O&q@M_32isZ}@KU~tsq$H6#jBD<57VJnw1Y9O>XTWg)m}3 z|Aoqn%?_Oi6C?fe8~O7v;~eK z+sV3i!DMqv%_c8{L0WmOBG0&{pqiR@vo-SNl#?d$pig8dOjlhM)HeArIR?9$8CgLn zr3ivnh13%Pb5DEs5N>vPK0OLKYCgXJZNGYgtpi{kHSFfT7(!)H?HZQYyk!nPJy&46 zSjs8ui92w4%v?b$Z9wxQd7@(xpu-5#zd_|P{e2)pw%+k2l;5yJ`zAict+e-2s(MYY zy!_pHwE_b&9`chsZUdb8fvop3MQqMn8xGw+y+~b8D=Z>~_cZV;A z>VcapfLI_3zzX2|l!)8+$2<10ZV`B~y#Z9_?{RkY0dJmim4e@b>EOiLXdx$!UCWLD z1Qcik6mu{T8!9-!awi{G(%`j|VCJYfnmdYk$O8h6mG&0jf3~Cfl&TNW`^f;${{ZLt zioS;0rbozp#JlvdSEbs{b@0s7L)n9m>k?8pX#WLbSMR$O<*S+r$4+D*nl3|>c6WFoKP)YsCis2;Lp&@A9+0HY|NKsH<$ zdx1q);<)K1@i3vEL@4c;;A9(;&{8JtB^Y_AmFcX~V3?pctsDSa1wwQ$M(}Xgy+`|9 zuG~k4?qXwF&r9d0&<`d*S<8(+zeD%yQ^1nfB-8M3|zcj9N zq^J^ppY%YvRZya;0{V; zTXh^j0rj{b?})fx-mY}o<~)SR~o^5}7PW)ed z^d#|P_;1#AWgvG2`=m%X|O6_1biJ5PyA65cnS@Vm(5fYL63xw5N}gbCFV1(}SXIE=;WEZT)99 z69sSiEOZ|PL<*=SJq~mx&XVr5{Dm;;01EhzQF?-%q1F;iqi;%D`r2FMGmX?hRoD&_WHrVHcA|njmQnWJyJ8!d zkOPF8?{2w_NixKb=D0wCc+0FoV7}+w=tnd>IB@747kIsjtPK|`-)p|Q0lXLb??C?U z_%Y<`3I2txAerxMpgwQXtP&$RwVxkwsBUbhGFUNqc>!J+LDR%&-yflsj5w~7N?uHH zg*MAmRuK@*C$U+mkD8kA=^o&ugKMGutlg>Sw#{uwQHg`>ZA1uFOi;zPUHU{1KO%fF z2xfA&Zl6l^Lj4D|O@S4dxZ|IJOy@Zu{lcz=$0Xm0;HeOkhf zbSX$XnF)*E$~U+l!i7T}4~>Kho3geO^v|$F&$m@Ih2W1~JKEm!h_gA)0EVfJcJ$MV0Hnbbj?ndeb}bO*=nxO&r)I%{(?cYyEr< z#%nOBu#=P4c@Ufa#mIV#h_5zEO5{v?thn^`C;@hq?Uw$u0zKPr0iVP(^X%x=s~0)k z*6Zmm)or%41y1$AM}x@qi81qVVH((q)BVO_FMagewTr4;e70+%gYK% z3@8J7HFZ;SL0;=pn!17*?GO0_c)2tF$;h(LtA(Y(47*ZcS@wBt3~NUO%(DC5x_p1! zN^eu2P(9y4&+LPIJ6t()R*yE<>eHrh(=Pohl%lxjI?+11fz?-eXb~9zd9N-@ERL=E zM>UTkd1G1ncaJEo_lE@MYreez6B+-*5jvX~o%5C5e|<^B?p?6w5BJoX5oLG-Tyf#P zw|d}tqOYC0f3x<0SFmkDR*d$G?0F%U$SZ#of|i0d3+Z%0@tM3c=CXbH>&@3X<=O1Ye65 z%$1C4dI~>N#p~bL4%KPkad!;P|1v*)WGm_8GlzZ9Vo|UJq;M4s)uMT}YY+Am(0ND! zG!kSa=Ti%rlja}YhRW<&MBG~YNsMXt~yR#}t^V$KrY@^TtN^d?dX5?Hy+P*g)v&_98!SxV40;_xg-_ zgmXSHGrdPfVQdhiBCiJb4 z+r)8e?ktn8AI^)UTFPgZi$X2Tdc(*+d!!pwO>1)crj# z6J;w7&hSI5#EP@Vnly%4e{C7VE3=Q5PjK-yL_`Rf9&^@G(oTHcjy2u-17&fodMgBi z(Z7nh>U10rb+F_RJPF7~Z1%(5&-(FtBh6?vAKR_>dI~a%yx0q6nC0aU3YwN|hxTRr zNueb0%EHm=aQ{P#qSuGc8uJ}L0MGl)&&iWh=*|@rf9QWiwNi)DbvKvVaN7u)0#^>? z6g%GREGpLzyd1n|m{-xOb-`=Z>tufX@qkjIb71njDVM=5!(V>dx zxhJd zL$x-7z3-lhpK-QEW;d8`X{)zDr-4V~QE#9_*lFl#g6QpE0_JgmNWg(B-!*mghqc%(Cr=2nat88s zgjO{7;nrumE%4ffA-!)j(W@vy2C3kish^URO7fg!M>jT};?uM#h~32m`0G?N{Sx4j z;(kt_Vw&Xlsmfwbb!&eVOo|tslcC~~|2=g`p&ggNO@b({&><1Y2#45uWzx%(Q82Uw z9O|5Ld?E;4x@>CU)=MKgBAN-ivQ0~moFzFelDNz(5W%6GsYv^R&}Dw&KuPpFi?HQV ztxXFWe7SmNYG_JBlh z>d-KyPF8khBl*;kEi`rh%R*yT)eOkFx`QNz!!BNL_3SeJVsoEV=J!87Xxt;4M|Z#LWTi?sPdfHQPX0;@c31r*&7<_{twUTbI&vHOk6$QkW&jC|ow_UJqEELcYLC}P>!%hhR_?L@7J!Y^&lrqGulL#+$CNPe zOP5>GvDROSb{8ZJlR!xeoW+{XubBFK;(9lhCQaNu&m{r7|K?{LFYyd&&hN|ePXjxA zl{qgl%_Qow#|qs0iLa7bzbjmvcBL*}yR5kc-Cq4)Ia+LnBp{F%V5uD(Fom{9u7>(s z+jErSMr57uGMiu${lVtJD|8A!Zhmi_zjO;pt=n&zU*`aWoe~Bk>Hb$BUC2;lI+7Q^ zf8xLDn*-|iG|efzb-$(wN=pr^N#~l>GE8bnf5h@i|1V3l)O8#`?ka~Pg)18a{0U>{ zEXC$IlPIIULk%p-Igw>DFXpsJl4~PEs&qEI93W+b|2s}WgcsClzE1U~r9bt`mL{8v`5-Kb8_xWG(zrRe@ZIl*X`aQVM@wLHk z4b?r1+KvdXG__Bh>H(`Kdq&^~v;k0YiL@3VxJ)~gnG{0Wj@rzAyR%AkU;mHH5kzpsAJqe;`d zb?C%5Lk?$tlgDgR0yx2b`O0gP79B&9Jfp04YDq?e-$(hq3HXu(JGJZ7t#2PFy?la0kK;#6#Z8^c+hIgM)^NL&bYt< zg=pQi`FarM)K8yhapOMzdowcEN|X0;4EiA?+yBGvt6@pit&=XAlvCfe{qR&j3{CNI zj~T87lE#bfln#R*24H>3KK%b??%m049?Zj8jAT>srsSV5_IwuI8X$IuqHu{4*+4z? zjMo1w@qdWi?^cy6YXDO;t$Jy|#CsIV{ld+DpY2Bu$4?hGXPGhyH*YbVzW~1ggLqbL z@(qf$6??SZxrwmU7O?$Pc2KId-!UKp2CJ>2HWA1F1GY)EI0_%|(Y`etC{td*2B8Oa z4mUQdW>qw2y&W&~TK%C-_#ZzrehMZG{fCuP?%Yk^Ro$M8M&6kMS@!^%;#&*hi~?N> zz9vj0bR_hjtH2w}l(z|y0zAs+DDW>bJTvKs31y+FV9biVbm-*&q3Npws(OO951^nT z@Dn7YC8d#WQ0b0KcT0DtL6>xcba%IOgLHH0xODfu@9}-V@9(qc?986o*=L^JozYeO zG<64=O8-B7N=GzB<-kEN5TJf=U%eszbL{!57okIIUwSkIBh4FL%lp0){B$#ypM>^bghs7hJ{1#m{-d z+=cPCL8JJcn!vzM&A%uWuQIrOVqDNC4| z2;NB)f;L7NmtoN7Qg+0pcZ!Mk&HovYd-lioL3zQcr9jF>0+{UnNg^(4m6q3>X%9T3 z0#2i1(qmSfNw7qaOlZ>aNs{b!hhqdSkC2gGlBZh8XRuAb=iV=bS;P5(V&Euo8e z(j-5Q!UmU$n~8vZ^D)x83AwbMKYaflD}o74q$EhREAJRhqN`t;=}c2teT*L0`u8lX zkDq2>`dhedezB9}mpsY=!WsM|2PO2f9z#7XO`^D zmPay>8yw6)P(o@)E0aX}1|}-3>reiNl)Tz3owIBTF2d^u|K1iM-d~?lme6@p-C~4* z_J`YLHQHD><0tk18YDC6?SEKIzOTYt8JJ3V5g$p;z$-vwqoVCq1S;1FO30Qp#lpY; zp*H353&agYghah)IyD+Wa)Es9g6>dM-j38FjM*c=qm_Y z+N@1GDM3?idWxsj#yVp|r9pdP~?h)rh2z@^CO-&65U@>k3XPf4)( z&lnoRSoW1&?_Wr24t7qxj+02APHB|ud-l?wXH;stV4!UKB)2*?*co(vl?2ant#g&` zMBB|Fq%O+ilH5x2A+UxwBAf-8gyvEt!$&d$_?@T}fS`!T&}Vow4U?{{l~uYz6Vi+w zwLjk~o@Iv|jNGy{LC3VX1<62l=XtIaI4B=CY(G|i@@f5;`#jN5p3a0CEj}`l-jLRp zoAo($HPXG2mPoOXf{XgM4-Ju@8D`LkDA^|+&jVCD$^e?liz3(NX=6?Y><0w)zRc}gZ6BMc*u$5mt*oxa>Zb3lZ zCrL_Od{LxVqQo~0X>v%4+PLYL@lcRdZLAx|U!7upWCNV`Us5H>JvQit*}P2yA?F0K zvv@0_rnDPH;4E4BQim^tdxcS!-DRjzhWhI#h#=@K8km$?z=U$3x;Q#kkEVBl+F~p72s&VK; zqo|Ll(&{3f;WGB2D9ajJ4_nmCcNvd80^s$8V~v!0$xu;oOA5)Qw&xd@~0gFau7xfzdo%}$SqA2PF%d8ol6ZAjT9O*;y zF)2s?t%z>pC~hMEF;F#6bxz+NI&>HsE>_@J`phj$H_EJO0O~IqdVLg!WyQ%SK&cG3!UuL(JaWWay+`o3PjO(OJ zOF+%Vjy+DYX(!IA((7PeHr^aNYntmry!Mw-r$S>Z7}VtKz_#@7Gf8%HqyV)PXOH6K z{N{$_0TqSy8CXqFgw|-l{1oxq3HN!4d~wa%SlUQfQaNCNj8?a5IT=voBD7<{j?$3l zgqFL*YGPxRB!^jHn29Vx(X;aPC{G!x?NFIB^2R?ImY?dZ8d}<)Kbh-gjP8hWr*gLw zury*NH)rh1kkmiNT<0a}%${g6_{qT?aEg!MJ}HLqKwRu*CJXPqg(lveCN8(G#GEG? z9?bG(;%lPh#wUEiEsz@RkF?E=F;?1nA@Z$N?Sff~g4CoYd!p)l!#UC*9lu%>o?T~N zt2|h|d^vvFI~MX3k>DXP{vQx$?|zHfTYC_lP*(R<0OPG*x7~MdkyoVA_c!4~Q_WqB%MsHVSGx%nnR68|AZ1hJ&e!Y?;OcYQirDrP@o9*9e z&(3{K@N?H#A#uso_2vIU34r{SEa!<4#32Q?nj-I{{IvZ5MN0OE@Vuptnw%6BKaXNN zrVL`-L05S=D)Pg<8SQ6Q2B$~xU{uo0Kt326n5g0sMhq$N?vY6Hl6#~!dY7LwMi<#Y zAsYS=3+7j{(J4_(-#zzv;=UkN{~Iw!j}lDz`ZKV%7AL<_5FDvaA6^Vt6VklS`hOS5lm7EK z9t}^loqUc(`+cG<;UK_6$Hb3M@A3MZ>+Kt6yYcE*GKW0ouhCj!OI-s?amysr6S}bG zAeb4=ls<^S!lnjvN1tn%(u>qHZADlik;lFzF;A)1sfl$y~buo|IEGz7V^#+RZx^$RrL+_nIwtzEE|=Je}F3C zMXL;Po3aJfNU8;NSM4&2%)T-Fv$e3e^5*kR;jy>E@(fsw4QvP7hj?=Y%;ox$OK>~+ zxR`%~MFRd5?Y|eW7B|ZF`5f_zjvtXY(4e$|Y6Lh4K;*rf|8Paf&)9P%Vm&dqQd%`Y zp8A|7wJn=zbrD}huLL&M-^c)h3BxB)eMRwt7>8=kNSL{iu@GQ@$z8{!{NFFpFzerw zXY>U&{63J6$z2EGhi}0+0Q;EUvQ-@B%F>t?D!$NiE({QeO@XC7Mpf#MAL{z7JYM&E z2Yi`|dHv=WFtU?7xtVK59HPek!*K}W_6#WP)ErQNsfy*GXglMu6tUZAEG>POo69d@ z0d+JRD$Cm8RqnU8r^Chk7Y$XucH>lUP$P}NwBA6iJeM6Rlb_4h3QFZpEbWM)zD(wrnA{NhhM2H-qEG)30!T_ zZ}xw0j$+`k;C)1dBD6Wqgm>b8m3;T3>G*Mw36b3(q+x0}U&$K;c?o1mh83A_bgey< zS57jtC)8B(Bmm%msbC%U5jX4}!(t z`wJIH@&G@03k_Ju-^<<=9?lOLk9mA5PsRc&qr`h9&Tu|#55AZAM;m-g^DS-@wS@jx zPQey$&Wr>&PwBi(q6a~IqmE^fWIf140>*m~fk1PDd~eoJ75(ASEsLITN`NQ0dsya= z$z*h+RS93%$y)JPbn}nlVo)yfaa}14{TMzUv00~hDv5Gf2H@Y@h%)UMHXR^T{Y|>h z*I_p=+V4dLi3+K3DHNO?CSQ3WLZ2+v{DW2H=K5Y0ApyiA_#0rcX!X0l^g~gke9T9T zTb$(eg;}|kAbpW5nbXQ;nasdx|5i_~x8FWM1MvR=vMRmC!)%GS^}RX{Row05nVoUF z|FNgK3m>rTMs(ra8G^yZTb|a|_r?%gqTlxngSd(ytgIxbeJ)>6xEy!5L*$WLXqPfZ zeXosg2H&!A;3iD^Jm%i38!;rm=LcYbAs{ayF6MS~1zS+@t;?B2WhfbdS>W{#g#WF* zU1=VU(Rj_^TfHY~*)rOf*Yxl;`bsB$Ox4#ularosW&H33C_qosP@!$$GCf>=)nY=k z6lBf}q7gI98~G#lx@ zGxD;LiN$(D6zX#N@7v**X3*=UmoQ0WCThG+7}I;Rqf$FhEh+B~LNC{lh`vC#!gLyeukB6%tnxha}Pq?mHhkY|!w(Fjo zQb)(>D$5szV8|~*CYoE6_Rlx!l+5;D1J1_m4fmP%a?U8x!tEjwRyMLn`p%VcW)9 z>ko)mxx=j5=d;umISTX0({RTyPxVC`>cI*o!x3im6?-%~@V0DCDP~#2Kz|i<4s~ms z5~5+rR)53>iGjbP_!}>MV`8g%lRL8>y`KZKJLNE!Gswn%;k`h6K@CR)WrW@zi@&O4 zGJTE*jUL+WC~?O$@QyRYiteZ|jjzUI=&hKlm9NjIS7qWN$OdD`?NZV2DDY@Yc2aLy z`{{jwJtBR-ZM;%3{-VdXGb;mMDT-Ay%J0R14|%*r?%{`n(vP0|RY~C(z|%!koKG-| z?RJkQdfx36W`Xm77NG}`2d4i>m#PDqI)A#OwCc@spj2U#J~9Sd!lEG3EvXrrMZuEs%i%*y82IBoytNrY-1O6Odz>gaxrd_r9LZ z*YsqL)>A(|AXoPv1t6l&u?j16s6XUdh?wh?K<$zK)QtSku#zQj z&M@a<#;3o_6n*8$egjYqsme2P59jCX@NQj}9KQriNNMrmF;L1Dm;m!A67cKyvL!PS zLvkcx1&tt>2m>JB4904A6y z_~!;Y_e5P$(_c98Eq0}r8WOz$SOb4ZN3L_;#_Z-T?zht5gGm77i`z6@1tn`^$;J&Q zDFFhJO>;x0i`>kj71{PmSUcb^xUct*W>RG)vB{08`qvepPB)&D;Jr+yC1y(dtGle3 z9WYR6jv_Q0Ud<8X`sGJ8`34x6babaNaj#o`S~MfYc8f1MehthgOpUutnoLc2(i3F= z^F?m*Lb0_>F@&SX^PfkZ2Js;)_&_DQIvp5^iSW@Am;Y;HrB%v!ty&!>+GSOE$uoH> zivdtImK6F_S@XTB5EFX?{MumrU0jn_66UOYb@z`+dIwbUDx_P}X-#}Cp~KpL0VwA+ z6`Bw~Pn1dz23fzUh%K8>F5r9HHe3d=oZ%!$A~23~G541pCKl0uUokU%UyK6CSt{bm zra&9ujGN2@awf) zlpJ@nm}_%14Ppq&AM^HsPcv)3i&LJI=7+Gma!H#H(N=?GfkPmHtX2sk`$H4H6hWawT zuub#|{dw45_rii}Ha$}skBks?Zbt(U>*l74i{*rSRI72v63fr5R0%T$xgEcdt#>|h zFgHZhNKhPjWWMlE!!G92c8y;2*Z2evRgsc#U;Y_7IFxgb!QrHe)dkDtfI#v zy~8dr>Q-k+VTamyHV*nJ+NG@^CqjVnrKbG&=DUzA)#?KLGneAF7Yr0ge+1yseYrUa z9vWg4y_&MP1!pxsx}i(?2ZOp<_g7aG6%mX0H>W8-h6jb8;at_E{+RNO(vQluYcKCM zvjhx^A2Cr-+t7MKk#-EsCm|k$g*#ooLcs&g8iR5&LhaLn)4u)fa|>1RgykEFumRPl zYLWM}xR`nM0jP}1R&DX;Xyk-Q{zb1)72V5_K)N?(S))H4Ib8GqLvwP+~(T=|mqLg!(ucXJIu9*nUlT6c)jue|j1!_FB!=)rPqPFUaj>A`ioqQ*v z%fB^9jCm%ZuB0y$k?Kg_p_I9NIik-w#b=LRv{Qew6v2&fJSc=qqhv?l@~IkSY66O# zOV)qVq)3_P2g1r2U8?FiBIeHH6t;d%RheFKBknUvTF9QRwAY=;W>8n+N0!<{ipN|$ zLpeqXPg)Bc{Nz&mtRNkPik-SroKvrpMhDodSUQDjfZu^Fq2Fb~CBYpn6XG%B5Jxm{ zt$tN;?28hW{xmfQeHveF^Ad)8-vpktVe_16zihv_|Lax2bazCS;pehg8wR&R7)^m5xeu{F4_=sA6O;q}X;$7e>Yt01z7N42H=5HSe(A>U>V2 zR)=T?HGX)IP`XI-Ww2M1yPds1X}=uYZ4o`Z>-WmkZQZaq*?YjeOHMPq32)gsD}e7J zuAPronpzG9cUSq1`i#fk-<;NzZbXFIX2Z}G z!@B@2W`)dSz2*;2nYcP#R-{bY`{+RRx5gE#_Q53QX>Ur459d(+GquF@U)FbtJM5&s zYatycct~GQR`K-^U(ZK7oP!@J;Zwg`#PB>1qfVU9{1zTAWysQ;yKy+S){0iLRCUmG zXEw*~hi^K-%4WlCX}-Q&ZjvGx%sE|#?i^|Kv?pg1^#lG>lI|qq{Z7AWxIl2^Rb*KI zalg<8DUstRX;Vqjd1>6PF%K$KaBG812!7b%dUT8}wO`cn_z?cQ!}D^^?r6SFLNsR= zUVk(apwJWuUAm}ndgH%u84A>{p7&bKo5V+miTbnf=Fi2y*l5Gf!sJYj&F+;Z3K`e( z6+Rg7EEY<1428J81gbN-#p)6XV4A@r}hS^X*FEu*YSK{0S__| zRQhJ-?Bm91|9B$+R03$KnRc>#*y?`zqAqTXG6j8_fvw}Jw8D)$S&2f>&K&V7G+TlF zuiZHn)9Lp|J>{R$1?UE9rAV61{oY!%=$@e-j3F2EaW{=_h{bIja9(~E&FL$_AmGHF z2*xksEIP&lMAG{B^@lT;H+CB)!M(8lMQ0W}>p52bZ5Kh)em@_$4@>LK1m>Gip-1Q4 z?-lKTIkvMrZUk<|vD}lFT9)cT>%Qx%(w8}G77jvFmR&1fL_Ehq6w;@}4vF`_lBMow zc&-qb{6`84bIW22Em|sXl$6L0-w}Q8sNaAD(2y9^KoRfVlv_@+YKFn*f0l#~^{EVx zhIF(YPu%Es+$}V~Pn_QTgx464-v{Xn*|!#+Z=tCRT~3-WdC2acocOxl!Jr3iqoRD3 zA!%x!-iyMV`X-1D4Q}=}gqodWi9%ZY*_m*M*HDDQ-#;eOw#Oa8cH83&ST2B(=w6wi zwWF71na@jHvH(sJzB`}GHFB0C+@cW!=C*n>SP{hXJeEB+X~%YR;i&xBa9stS$H z^lpEE_v=^iAH6?1EqVOYq9u5Ab5xLJR>V9Skj8GJ0v!}wU?nuu8_z(HMD&*K~g;=+X( zWz2JE3r?}j;!SI5KdZwui)bF2DKZe+X{RkRs?3RK^8y^LmlF?)@CYz)$$2wHU- zk`wkjuCpQYZDw~K5^RMBPu2vL4$!V3nAO#|BYxcE;^>dL`volvn!+nqAHD`jMs+;- zA@KPw3<;C|&MmRux9>A#_^#L4Q2d7PHQ4pGpN6?V+#W7Es&7(Q=ou4@GkafRl0Cw|*{a)kKy%}tE?7CsKYthn{_+2Xdl>t7x3EH%^8az&K3 zxg&&`90Pclaa##sl@3kKQdm!q<0qkdb`REb;i?@48QI2e41Cw$h>jmmI@&IhZ#~}d z_+1yc@iRYmwj&5vM$m<8wy;m=^Zr1Lj|(V>3Sr*x9{_;2#mJE#zT`je`2q1_=4p^8 zMZR3*VsE(K=3%c0e^qe5Ig>YNHMXl@Q*fglJ>gMY2ijsZzQZMW@AzZ^EfTovZ1KH? znJ>Ayxg7bx!SRyVe*Lf!Q=BH_*60UbK3wD>!f^ASL1h3!!`qY$9F%r?2CCq+WKJ*f*<&HqNgQuE%hupv(I-Yh1_JtP_;w}wqZ1jBJ=V;C7 zqX86^dw2F&UUlp2=HW`x|A11N8^x)se;AB@T(l{MV}heBuWm&XJFnR3LoMI-c;W3l z+RnzE!X{B5L$ zU(9^-?wrqm|5TLm zPcSkbuH2mHhS}oQcW=Id8@r(pw&SxM(Ar)i%{892%!i`alrg@Ix9O*%V>5LVFi4lR zC=;UK;5&k3G8cE<(PJ|nX__xy7f zDkJc&SMyJv@auP+8$N*D+GnW+PJML1`h$J*N9rh1bmq~7mjnqEMk0eemdU9GXYXwO z>i%GUghwGxugh0-v!5;(`~)ATQ_p;);14rcw9A(!SWywp+Fv=hB<|R9`+*g6wt#w;U@y7$0d{4Now}X^&!cE!rJy8W*RWuH8%M;WbI> z+#v3wqG(rdpV`^+pO#OslRgZx3w+Ve{Z5XLPFRiI}02iLIk9T;A znrb|CyjY%Y?^|4JiAsIahx*-TwzQzlT_3l3Ke79?5j~L+5)~T7Jk@8+wduTJXdFqp z__A~a;oyrcFhdfdIdicu{WX`TW^D1~&oAtlB(eIsfLezA` zO^6dnrj-fQ>2c}*@V_0%rf+w~9zd+aQk!67?5%DD`0KdFva=r3{dyIm;9h-%ky-Qf0u zuYaYrn^))g&XOOmQnW(>C*)Z9^AJZe--A#Vj-9(w&-i3Yd)iLVIdzSQuExQDm4Q(R zYWl^@jqt+VXeNU4W`L?Ioa=D422b$n0bh786oc?-|0;^Pag+OO5Ej|#rqFbih`9g7 zZF9FGbK*v6W^AYJcAa~dipx1act8-bJ7i;C@Wb#E*r;P5;C6${4>F%Nk? zzQEWwwVg|TOB$i`8gtUSE28y__RIlu`VBBCK7v?(<+`(=We578Ggzh1eTeR4V3j;v zI3c@cO~6*{J1GKII`dr(fbH$_XPcoM_HX z=%LSxIHLY!@nX|_HQ9b;legP*gH7}@k^RO%PMjrdgm9wqbNxs@c70ot)a^e_q zr{$TW6vfmS4$F`Ad&|Ol(u9w>`ZDk7y4!D#b7PpH<6;B!6#T9(qYvj!V?T@){0{`- z+ecXS{b7XQeTvj>mWSwB^Q%La)lhy3UHB%xF(ss;^=ZG6<%uIi%!Y!CL$6z9um5abA#hjt8_fF?f^~-5^VxHGLuTu69zGTRnN&Dcjg=XYP`n+K1{Q28PM{z;u4# z(&;1YQFc`-;k6uF9;L=}ZH4uCc$MDL;(EMTvj^{R_bMUAUFliEnA881*B@OFomr$= zd>G}<-n6wzZ+slzV-E3p*+g$&@eFW{pX=*A2yb=|NO1Z@R4Ev7A%2IjI}ut-Eo~O| zhtf*L9=F|)N=bjKhCF+h?SCsFqW9mgtm~-8^v;Si5lKv7>>yj&% z&u4!_l~T)5VQiS5LH6hj<5LK_&TOnUTar@QJw3SVt(hf}->)rSw5(wo)^ zr>?n&DE;jsC5I5h@o1T-$fwD=5pN~sT^BS3ops*HiJGRXd+X+I^z&Q_hi5i-mxCtE zzL>0X&O~wqVSCI=mUIYos%r~+quLT>CjgLX6dTq|8l@~nk3GGckO~l@5Ew54%h5UM z>0RNFuxMM)pAGBV=*`2lR+Y6RhvOOQ)3@|p&nykoj~lK>wvyl5^!Y_TZ^&W)1i?&t z`*G8`iY86$D%!@JqJzm{T(N>(q7_W*iL2yMmHW{#Qgo2T*kLqT%o!&G1`(DhPQ5rh z6qG}=HLGJ-YGRqu5kaRKcbH? zkkp6+Yu2~4?Ry1V#6Kz#t*UG@JJEcOUMC2Mr_ZNyZI=9qcrF$xL|JS?YB9|u zEv%l=k~^OL<+9az&k+?Eqx;=7Vq-%=>hzfPj6R-2%Nx@;;_rCY8{t~Pi(*sj)ol(H z3hdF-9<1mZM@B<}73!U}SPM`Uhp5D(&0M-YQLPqU3Zzm|{x9BalrpDLsC1hapBW2r znFQ#j#}bwpbd&9TKvC+Ae|-I9^CJD{h6(p8;5TC)w+tb}fjv8!&HMDs&y>3#IgBW; zIAP(ixVYnK8*-0QYb=?}-i@G1*|%mOfx9mz{QkneTR7y$)YQ)bkI<^q(+>4ZjQG^a z*ho#OcPvXx*_t_7Nu0?3Dc}8?;~Fj{`Dff;Q}ggEq~Df`_em1JzYiReAdw{@n9Lt? zb-HxYTqa*^jnbq93g2_ASEtuqDm-g=XBGJMH0Brrr3k(U^dLf%;R@AH4hO;ZdeZfX~)EVW5i)W?chVS$3d9#kRi z8~{KRtML^rIn4S>vv9Qh6Gij?ecn3%{Ed%7iF{UmHu+)`3zQl1M2t6;+0@IcX)i9%=-5E-S` zG{m-Z>ORB#Zew_F&UN@9_wfS@`(Jt z>rXw0;f4yK2W4a3o|hJ>)M%?!RpYLSe8gmaWo4x7b`bbC0LlZ#@;tfjOQnd-BHYZ$ z0iu^*lHE|Lsa!v=i;uR&>cx1J&>^M>muKJK93TN2QR+;fK<+>5@qG*poaASzC*KO- zN~L~&&PzHdi#<0cL(=n^G(S_cFIML^FE88}iRr@$m~XfGEnx{`xkbT8eBp^XRIXhU zT?#vNA3U3j*FHa+#1~KPF+!Tes|xj|?M3>m){B(R8Adujsx&UaJ_7)8uqZX!EP=El zcqsA1G{kc&UfydYRy<6>*!n+#7D?j4@1zDWMTUd}N%}>;H#emtB^CnMfghoP;dEtJ zu_yo!UxPbLh3ernE46oe9(gl2&K3fmM;t;sp#r#z~D0UVHBWnLAQNHy=g@AmYl^w^?fMI4Qh>+qr&WjR!ApChHsHU4Ixg z%WeHEA^&1r_K=>fS~qp8avnZXkde2&%>0e96h|hV>OvtYLkuHbAZAZN5C9-!9Yv}_ zR|h);sl(qWm09ui6W1U+bN=);MyQq3b9-_W#;TQ00T6y|s84skuDQ(XyePSO3va}@ zQFPQ4@7E#vc)^k+bHa3Inv=LUSVyw=9vthlp2GmZ^DZ7sCfzz-iPDudrI6>vbBqm` z!D1ija-f)SZ;Uwi{=--_`<$LuHMDNsXnj9OS3=zNbC4UJ-{Zm6qtTD7%Z3XN7cZMf zC_-*LJ95J?YH}+TvhSJDl}?|BBQeks3*k?v$tl&Mehzv5ucwzcKB-AW*scTNcGqGoBwdXP1zW;M@A3OgWXdI{T#dI*V zaLNx?AhT``EUH59ot~Shar#9T$H6N*`(>6Ifko^VVo-%vxv%6L?@|Z_u-7;aQ7anV z=@jNvhkLxU7N1nyX7!te%k6Ik-{Na5PV=j)n74wLtbOO!WdbKBp@<>7vk_Y5BkT2$ z(88qJ^L}+T;@4lR&NKC2S~fY3Orj)4@NV^%1mGkf_U60;G%NBmhp_{}W23SppGzzz ze6|tnN$viwZ_fM6>~WuVKnY~e#kZC)Vn@hZtEZ4J=1Se z(qJ=xicWI1Q{6RnaoVbQ+GI&O&3;Y20Z!>;1s|)Uft}1?&a7;fiojnVEGEr0Wl#DDSg|V!rwBFz`ph zvp*rC%Hj%xL-&H_m>0ZTD+_-@e{Nu-Ak5*TF?rgN{jTo)=lBYHxANms&}SUlwi5@Z z&J1Qi-7T28TIR!w<~e~C#)q@LAaoE+Bs2^cn%I!WVbMw z@J2?l@PGw&I(c1_h%Sw=+KnDA(w&t_Fv)ng@E)r)qjkqz<$S^7^4hXJ(v{CfAtz(C zuoD%i)DUrE!2AG@5Yx}VaX2fG#)Y?1w5Z%E!bC52pWj;)fi%x z)^AmLa%{vsB35oX^gjNrmA0_`bOy7brPS)M=ygjx z%7Jf;U#D}A5yktSKiy@aw+p+%Q4u#K+@Un(LVH$b`x9mB6YdL1V!~4V_5oyd*CS98|*iaiErWNdVgy_1Fa!)l+cT%eUFbHlZx zuyLZ%%)6ha5JcWv7d#;@-~IrG00ELk-?gp>Xj+?+BvIol+XU~Ysonzf<7?aY$vev? zl*QIw7W=s@nX*7zRkIz|A>70$y=ug`6~~3sPQ{~8tZVa1UC)U6riWR_yB2xRHRDZpLG^)n9;+WlI zFu=h0F1cnr&zCcC36jj~;^}jGwt9gm<4N3_m7{8`JJc|9iGF#^Sf{do!u+ zE4XYt^`Yo( z#>L~oa9lF4O_1%1(`7YXiB8An%?K@*>h9A1u97y8K~5(q+QE+mq{$C-s}ZwYYW4-T zk>dme;w?I}k$5CT>$W@u`t(-Fz{u2c(T-~ zGMG+T57#GPOd^}&DDKQrkP^DXFz4+WW6tjp(EA17dwfV2cW9t|X7g#^?#XdWC&OZL z^KqtY;Q*7{-6)6RB4IFlWR(ajt#PPhZEs?PJ}+szCA~PIzkih;H~B;C`d5ivJQ#Yx*qavz-w)(b{Z5b|@40`#n@UZrn$Q3HydKCpG(j_pSN{GY@WFFE5+z&DJd`=ru~$ z;D9mQgMtnT8=__Y+A2>PJxXppCi!Bk)~;d;?;W^ehu`W*ni=6oN0a=ubeRpLn7rq!jMp@4%VL$ z_*7QP&$qY3Dwnhu=IjbHz`JSHQIYZ;Rr7Yab+mYA&Wt+(wcjdlCrgRNU%_j(CGzF- zsGFG5F3kvUdQU2&(70_$n`f$LzkG|S$C$->$~ zOO*ca44LO*fz+u{{Vp2j$9B7Z1jcCWP;uFP>U$=1zySKToN*iXAo2~}W->N)&TN6= z)SIJb%^5%CcMDlqrN{h7sU*VsBORLO3a-wVI(pUxZcMz1Jsk_LZt@dIlGpv$r=0KB z7QAH3BAB=FMz!2Nl#UWk*<7~YL?q%p*{|}j+&uI?eqwj?TCKT^1jV|I&{Js_bP$S? z?_^-qyWY23WIo8_Q}tsOh@O?tiLlf2WNbqM;>H`=XCy)!cSZG0M&EzD`3ZyA&W&1J zk0fkorrmaH?8)G=nLA4C9D3~qlu3+lpCbg^&$ZH5i2@3UBe91(c?J9Ye5QHidfKYC zMWuJ$5KpF6M^L@T2?zLd5JsFt>e=2M7T_L}l{OTPZ>6L8<}}}6f7yS4W|U1G{3yPX zrstll**g>ifJO|&X%g!QY*S3bd}2IG;C#Q>R=_|(hP(75-ntn<_N|}h$B~IfTl@u*m^N@@-C{wPHO2wo5GYh zp#upRTF=lp_Q+?G5Mc+!LXqNNSNwF;2H{_7xC_mwIJ$idLT`HBn_n|of6Naxew>3~ zT~y?8sJ4lXk1u&0q1tq6HC>tfeJc66``(qHcqEMmh1<_z?X$znI<7_6wa=SyGP;A5 zc!gpj#$z7XMW%u-dtAc#gMimc)|y($EsHBbozKa{Fg0rTC`ESx^l8F+%`Bd}EoMj@ zW}@{=)icyL2N{^p3nr~6;BTE2(>Isf#umkGGR+8xYbsp$JsKu_KU4cLZFWpvpRC5j zZ!+g()j>IXJ(i60WBI!$=X=i|v|NK+A?weg&pdNzxoqbh`kZBMo;>re{+5Lno3kB9 zKnbqz-SQoe*%M#6lC_(7b{?U@t*;Jgt4YiX(&cRgTvoz24`{Zu8N*Q9QJL zIz_hkyEZ$M;GTrIjj$)p-1N^Na9FK{R!!E-<^ol}D(%f#_b%xx26Zn#ZhWh`DP%fW z-z3f|j1_b^%0f1ldw_4MBQDO>3DKK{&TC<3bWpsvPZghiuOIq#Mhl@_47KbU?&kTJ zZ=W)r0hM;XZVO-kQ@R5?CX_ciK4bJ4d5nsLGICiX&WtKT_{JHZLO5(wxl@CG5i*)3T)wQRsf6RCavk$o@hx2c zu~R1_xp+Q2vfcsz8*CF4A;<4w#&5H-{&!YYcs>$}*rQFR(YbuU0{(m|{8H3ZjuD7; z^qR&(RG%s7Lz04S0-sa@Ez$iN40N^e1kx2-xPpRK4aKV+2}_eT8jt^3@{`kPm?&ts zE)X+;FlqMa3=Z;Kwr>+o5BK_G=R9SX9kjntRd^+0q_o@|<{@X$q_@OD{dR1l`gTTD z_IIo2KlN?SQ%%?j06_nnOaBOQq$3DTk(fSH+&cDv5!%p&J-bsN)2&d&uUBSxwgUO| z+A(qGAlu9~1BG&|s!hd5;#lZH!2?ktM13u8=Uow?&$2i!ubll*dzE^z%5MoC-Kj~Aour%JhP6DADm zOX^m*tZxHD$@cv#n zPns>UaE^TUb-C94V2_c``ra1@`<^j@=essgM?kL`N=;ekjigzH#ej{13M_<`wj zmiBg*LerTP=^_}DCAas|x7g{AbPd1V*U=;dWnIo6cW9&XRI;d5pO1sw+i_1vkz7CK zp;3)?OyIRo>Vy**d2)c4ZI}@)r`-OG&@Q1b{OMw@=C%%yjVml@Goy{=0!x_X&FofP z$1-bqbb5y}kLMZIDju8_n%Ll*kkMoWqnp^L(yGCr9JFa{ z(;|lZly!Ls9MY8D{@YR^p+GQN(4x2AQ2?m~#<1kkgK3meW;l^n=uy|D9ZW-rS zV=}Z9)U{L|ePsSu-n`Q$dGbqn16UMMZa3QcV1f$dXRJ`2Bu6@4VzlfCsHl9bl!(#n z{ex7mJ6Y#?YUQTD`jB6Ia=_*}9YfZ&B^!}nT^ZSs*oguP<=$+xi9~%*H!=6x%qc9( zXmd!tXOe~u;Z^dt?R{J zLiA=>UPN+ui#SC5=d-OSmcf_6RzC7&Bzt<1shJPMHLX;}1eR;Ls_c6c)30{7w7*lC z+r3^35;;y2u?fARJG{ZJMR($1LA!qkx0-scTd@*1>U9?jEw-vBvM z=&wk+i?~gX@{3$l%{rh2PnLV+g}qb3)_V)~s!PvOoLvOByNNrv)AFvs_{yRjo#%58bF08lBqOm5gMz4+F6 z+_2Elose80FPht%&9sHLJR0&lzJ2Ya<}(%kf*x4Ds#w&z$@(kW#2gkE{$Cw$X-d0B z+93}=NX7^!AsQbF@FIarb88?wy_3T*+YV_yv@62HQghh}B<|jQ;U*dl27t6*r|e&h zQI{R}czKAPJDnM~V_1}^!>AJU_Vt(~Uc=wy6#KA&YQkTV>AT-T8Sa_=m#L_k1fDmT zzWmb5u~@B1)iLsRULV|{aQ+#^QWuVHGyQ-`Oso*9gZ#DnLot@>8b8!TsVSOO_R|I(Zjgh%Z=%%iwueSnaU*Ku&!R;)ZNx25haOYcf4O(MmjwnKYbU*cZo5tP{UxR-ge|+l2`iQ_hdd+8!RN%B2 z8Jco;JIy)vHsW_R1(ldt;E?)d4LAoFURbdB2Gem*?$+$J*V+)5iYl|sz1W!x7IV(Q zF~7X%5q1tjU$F)k24S$mUnMdWbweUqn!<+u!mf)-eWGEIR}uo<&KN+}Ryt4SddVr4 z@IP#QQ*>rcu=e}L&cwED+qRR*#GcrGW81cEXW~q3I}>AKWBz>q#aZX#tbMal-FvUy zUDef9wVp@vwkrMjtH@um7De7-r^xgbO!xj~o<#=Lw+TPNbkl1&KE$=ObeVr|Xgwnu zMJQOd6#(dak!EZ*(|Z;+QM|s{;sYmIy%JVsaizYi9S$TiZU~|wL;c*PjktfIH{*}G z=pX3fJ#fLyBnASw8-D-ThsI?S%Ns_OV)^$LeVNEyV7lp8>Qcl*n%C)at#ctf&gIfH zBvipCIGPMg-wl5!Z7%EnCxzPblF2CDm*c2&P-D{Q3zOt)Zgl&w4##n5AYQU#&INf| zSIoDUs(8)Lx%#;;+)KPW(?4*Ox@Q-E`IENEchY8&PBvL7&A93On(s4KisDZqsYrm` zN%UNo=JM;kQrv=>!h7Owy1RM4p!NkZriYMo6w9x z94?v?!uR(K3tHPv_;c~JB>vE&aeT|Aik~OP4aI4edov8FtUa_ls2F$hCM+M+BlrOW}mjw68V(>gmrgdUI*I;LqW7QLCklB-SRqA4KMts(Hp_T^OTCAGA z8qi#8`maUIeCvIU{x8qC`cnUGam80`e>U(jYE7(+@-teLu-4G`+n186Y_jc35!pZ} zy*DpVe}v=o4e-t%L~HSKaP1D(jwi|BR(dDIB(6iiRA(^p$o{d(kUnmY2Z6no0I}q%hS~;0wylr`(*Qr20~K zRzey@4$~bLkNqLEl!G*#eFs^jqC8U-0i6>vbdjg8jTyfO=b_qFDop#;)xTlq+}X$b z;XVCRuGXKza54Y0D<#$B))X0t+9Ad!49Ciy2NMea?mYCw}+{}qZfgJgGJ6i|b) zf$(R$UL^gR*Od=Dv9VuVe;jeeg-*D8e^^Bg(`jq}K>+TvPADIyxPU$-6bR;bry7<{@VwfVjb!J-Vi#mP=`Y&+zanH%@CR;jm-)NUOHGdGLgee~>Ip;mqE4eer62KL zJ?T9Wa?nSTNYD1er)R!8Z7nD!OkBs=PXdZFs2QAREDo^jvm9-N$HIyoTYNoNVc&D1 z4!XY29|^U?jPlP_{QWS^yo~;zq0UjBD|kF1w`z(GS5)wggybwrGNM2v;QIQBfJd3b zu|Qpwxc+;{{U#U-xDS3_k(APib+)T@m%o)@Hve^vB(XOFrq^IPNvVU$KNIaA5F#-C z{@1uR;k`A|ul7s8kfj9gu4ZOGOnHT1Z!Gj9%#KqoOT3M)o2`Y)39(EeP&)EU>dOe^ z$I28Cob;*f$%N~N2u5{sjNJd{3MuK+x@cL73o(32)icP9ZGNTiqYiT{aCijJwW-~CFHcr=Y5vwZ5jMktdl$Qx80`I@rY_eqPPzpw0$ zGRD6Lo^*am15ERa8G&|llTVDYoL>oAcAuRLptuUv{Ds@b%6HrKaG$#pJ{?rC0i>BmZZ* z;%JiyvI;a0c>~P3oL-6DkLIRrxtY!Vbjs)opL*W^250jhc!Hhy)c;93&dvP4NXJF( zJ@o#&=HTLF?~X?zqrHMx!9Q$j9i?ozFIP}u(ES=ezpHP z7+E-&xjFtj)Bhi0aY=h8TPAf+2QwyZC1YzdlP|hfXBQ_kBU?l`kL;gch(7Ez_FMl@ z?vQ%ig6R_Zy5lb;9^UM0iul%=GG1=kAw@yoL{VpE{(au%-Av9@3bok2Up*oEK%PJ> zzF6sjZcZ=DQa`QKK#x2hWr7%xIMjJte&e2kRe+OYpWGWY%ny4wW|iFJU0LGL;W_u zebPtMu?1E^rTe|(rIIHucnt5B|IthJn85k{gv>AATMZ;_=GQV!NWyO`D`hZuuXoCO zd7nP(Mx^UBdAfeO|B}ZPnicw#w(?rjFIoxjyIPfKHm5jGM~CETNd#;^e0aIRGg4UoUj8J>otdstFFa4qJ7zme)}=#SetEH1 z{sI55eBLq!(Q=-f<-rvp`bDF%P3ae{_2GhrUDRr;WMSy<&t!2s9<(9xu<=q6x{3)i zSH?a0f=;3PGDE!r6;ChYp9TFCr4YyPA4#EXBc+SeL5D?J;kN7|#y%54ze;c%EM--+ zj00zrg@#VkMcHk<@vIVSUMd)r#9nWT?MB3NVl01H(Z)R#R9Lb3s>kQ702|tlQ$*#< zt!P@rC~S0pvRA3}X_*v3ZOELbNLI&o7t*=bmr*GF+`?AFf`f2Lc4#o77y-wW#AxzU zvP>exQ*EGIiQ{`G0i~1`rq*v0RiAsj6vE}7Z`QUWd0Az|-hzUpiai-0V zN=b!?$uyr6+JsW&r3AiByeFH9no}x^XElFs{HJQ6awYOKm6EXGq?(^&L*4G|;Iiio z`~3cI&hyqh*hx{@Ljft1rg9nK1p6Y#GSvqY!+_#`S!=hf))H{ubyMXbJY_pVs)^hP z(6On9iVZk|$w-6?UyPttXOzIB?8t^ou@xzk{dE#PK6+9qJ8Kv^u6>vyy}Mf+d9vFA z>qvx%b|?6w6J;peI4>NyVoP2cY{$-G!bv%?;;ppFu#f|EP>b96w4kC9Mx>g0|<*m9=NP27Rp!+0QAN6^z$}*&k z{9+=sD7qR4l#vvOm%eFN9~{?c*|7I9(&L6L=o6&S z3g!&;;k1itv2-|x@KHw1)_xWt8I2HXkjo4$BolTzBI+uom@^|by&Hd9A>NCiXAq$~ zpM4sNJiY>_2@j#*FupZ87 zyqPC)331X51Q%uztx(0?P}KjqeU@JvziBtmWz2EKCKd8K{T3}VsdKxciM@$;3<0Io zP^$ln4}*Gy`BlqeNlu%0md;$eMTB?^{nnuwGD0shK_r?~2lLkP8yyi2XGV6A^;OWQ z#?c+|lD#6K=b@)n`b=@?Su{a&-rUa(JiJIaS{V7vU5y!H_58;0B^>|ap>@jA)6wGN z7PC!|^j0Auy@2aaJB;X*tI!wepD9WR&L$*Vt_s(!TO%(BB!Qn27e9-u83dB=km%4c$(<-}cuzRR}RwqI`-`j=I_ z1JZdJaHr%{Q3}BMz3NG1gpDup^*QsQz2Rdz>yhU}JK=arWXTjN;c9MJc8yL|t*)Aq zkjB29Wayvn_8>^r8-t}orIf;awrRxiq(i41^(R~fwrFdqjcGzB$h$IPLIA>_zO@wt zTm>L*rq!+9LvAB$m2T<+0YXENz7fn~(+A8knJLrnvZ(W5kl0W$Dt^E$KC0veMir z6r|n7*Izi1pyViADv<5N<`J{4>YeADmN5y2RTbX|T9=mtFM$mf+7AppN`1%y(J zK%Zi`;JO5ITAgAv7!|>0&a?KCQz2Uyr;48k~_;yb7883c8dM9ye z7rPh_w34DmhhkYUTB6a~TB0UJit4Qwou@x$$Ov-;LDd)-vmxmyw3;U7MZ2g{Nl&We)a|5fw-ou08H}@77KtJvA+SK0K9J}yu#gHZ*g#j z`j2cVvif;bMF8h)Qv zcwWrBFWgtBlZRY-9xW*?*mOEJGTH15o9n5e%=)dhh*dWaF4i{0QdiRr2R*Ge1sIc& zWrgW>49Mg>l@KR>T&v~Egn}Z>;In!!E#uu8AK(CDj@asHL7}1jcDfkXwL)Jb8}eiP zpfDd&{t&x~sF5=UXb&*S2hnWZM+VXzd3J$GnMFX4YQY9ehFex}3W#XQu*P04E@A!K^uX)z{Y@ExojDUVXt0fVqR9za7Qh zO3ACd{K{+7hP#fg^|z-Im&U~>#)skojtA&x8VH>A#gZ`XW3#BU#*(#z$O_AFZqJ#& z^RHT1b1Fdh zRRHW6JHS${IwFo0f>XKkGAcnGj9dZsXxj1+AdbM_-$C99*0Xlj@FPU)yAITtNsm`} z&u}0#+m;{>kVYf>a4ApIHTmwCCPcbgTDb3)-BPbCh!9S)%{Ra6G~CP$D%Te{C96%q z3av_~k%`DlJ8mvp1#@#Emoi1+r6=(hTBun34m@#r?qa-O*HJ8J4p?>fJDGD~yoO0Z zp>SDezR2cC@)N3SU+)>`7twMd2XoCZc99<%&0uCH3HTL33ys=~A*h7YW8~oK>OsHQ zR+XB$gs{m2U`RHmaz_sGgH3>&${vo^y*N!D9;vncLZ7&SGE9dXQ(r60kVCgw)}=9? zL>hp@0~OM#=BMY(R1zB+#LQ+WJhG7m0nW3&d8Mp!5$90!>7uw5Yj$!}Rc1D_qa4Yv z@KvsqukIRo(BUCM>y_K@(gEyI2bts!B0&I~^LkXJF!>(hph697>vHFqStp zeYhKAK5;R#!bLlxAHGGT+oATH98d>P z#vx)OR&NjiS|X{V^sl#TbBLL9Wx~E(#c=IB3*dn{!E1D)v0Fx%SLs$UlZCa+x(eb! z3Mxw$V$BMQL$1r&^oIb>`!5k-!gjdw2Zy2l+F1a>&Wxj;8c>LCxAYzGKbIFm<@dgW z&Sg1VH1}1}x|>;1bdA%O?KI@KENc*(V6ail#T;mhKyHIJvwpg0Zkt$Snpr+q*Kbh0 zaOj*BXG_$Vw^ED)#SDOUO^}&F?;2*f{a*MFJPF`ytrlYayS^=b11B_wX5ofw<rq$6zFbUU||<=ua~3Q%jDLJKwsZ`5eM;bQPeH$CMt zi(#QX4a=}e5(|>kM(<{-6vC%!1qyg)Z6uTAMgp7vT^!|FI%0{b?+v9dU5j9fakV<- zuM0emK*F%gI&h26$=$g;We~^c*!_619sBeFuPTN#Z=7H->Q$!W{Xezay*q#s#(rHk z&*uT@$$P|Iuzyv#B4V{+ebB1Z!g5y8UFfjGT@#+{P7cR*1WFi#mEZLJRL^JU&N$u+4@TZL;&8Sy1Rd> zlD!;d1qEic=X5RPHN#k49-}U;H}gh%P)VTq5M@VDGq;+t60P1iOA+F4s46}1Y47!A zYGG`prE!97+)Io+^Iwv>a2Kp&^wizKe-mKKd;4i3ASP4zRHAZM ztFr)#=Hg(%8mCmFnJt>ZTZ-w3=+hx5*Wd)Z|9@OZygBO-wd6TSnxAxaTX zi#uWH`knle}^uJM{6``JYy_gQ~Db zR+T0?O@DAx#lsN37pjMHK1hsid!09h&irdvMo*#i_do2i|J2M=#wV>fdVF40&pmKx zQ2|joSB%=x!D54zbBX}84dQYMnKLZR^4A|IuJnO@41XW=EouV~05?n=q5!uRV(`WT z(q{T}UNtQk(D#^WRKV%gW<6MKqb|mg)o#qsmFk3FFLl|?C4}rt^Q?VSe+I={5o7YAS3T(OL)g$H|DE_SX{EYrK>5D~Z~6oH#DwW4O>sLggW*Kn2&EN&|P zQ#I!XR{K?V)t~KaxyDOxvdmz+L+LcpVCw^u&g3kKH(hC~~zSb5dX0ikNLwP3G5?1Fkw&=B9Btf4htcs{hK@;HT~ z~17n|RS;813&FlF^HC04atrvM#`o6VhqQ|&-GseaM@*bgx_ z25>FV`0w;-ff|#3ob}B!sOGE#!jWJNTbdC7?8)`Ma9=J8R6t+K6LY?MsZzo)7API+ zoyuW|kE{g@z#D=Fl|QwJ#pJkoXmHN0nBHv6=}tEIU_!wEcc4|jiw#iJ?@8bD)|9$wvTX=_xX@`YHJnK0gaZ%2YYw{f(6oHUCQ6qMZT(*mr+Qf=m@0x@>tqVqaw z`!X))!uj2Va@tLBpk|He(hM&tml{^bNH`j`ov2uwA(q%JYJ*&$Q^4lox*OdTT)xe^ z8o`uQ1iMgF&h~ndjg$#3!ogENp%%TdB&~E` zP4v`p8OWvJC<^>7Fr-EN^Hi`>8J?r0*q zwjwWrIAUQbdg(=$7{%3cZ?2uY0m@n9DBn|fj?dn&Wu6(y^~p$A7VfQpex97IV_-<{1%O>2OG1Gg7FSn{%gEa1K*Xc@YIO?Bn~HTTAY7d z=C3uQv)3ceBCw3%x!~zLV$n3o_>Qy$E4lz^YF7@BZ`#RGkGZRhnnZOqg;pABkRE-nbNJ*C*NF3clOhn}-UTck}&K5Aa>6UqG z*MR=uQn2|XbqS6lw~5AbtzOWOigs+}e@b`npIySS30dm=xlAo}CL`ukATz?4iUHWS zE=6JMfXKsCBM9jsQzes_M}xr86y1XAhKpjqlMMCh=f)8;>qI-FXr}rR;@V<>M1P^M zp;I3vwu9)yBy1uETOKCy?-3Or>$;o*nsAEGJ_}&TM2LwX3h<|?(0_a^dV;<%^Y!Ig z+hDt%{4U0kGI)kHC8VNk8i#-jZ;)8>KDfXJ;qxl!>?}OP7QtO_OSXl$#ZXmCwNI|Umy~rq^*Gnb}r|Z!m-`P=< z_3NwbHLigOBL)UQbNc~!?Yh@&2KH+?mAn#)ceEGT&~yxGS0*hQMjG46Y7L)SD*(31 zwbC#$JC0J@$AT0pPKs2GiKK`Ozb>JRSKJlG+!EHA=aF}kW=&7!vVV-(b`VzJY`{j~ zCSLdQ)I*&bmkE`4vJ;@;S&d}o!CokaYI>5-lfzp%heGg_=H8+(sJq1U2<1{(`E5tg z`9ZVcWfDuTO_Fq(a)l;tW^?4RQoZmCic(!AL#_fvr#=FKVQ+6rQ)-1z!@h*dXvpRM zo5lHSmm9hDY^^Td2s!NNu-(7wnqfpA4C*nS`~`OYeZhS2*_R=FLg;YV%fjDQ*FuXi zo+*Y@h2No}9ga0uwbM>#QA^W22)1q^wdve?u3QjucqJ{-XKTeV*4NT*O%}tSUa#oONT4et~6v=I_pz0Vp#Tcl$#r+Q(G zxY!Sc4v*CbIE&g^_Rw)YFY9D+DjXT8Fm0W`W&Pq%0{^@2*7&dK-y2L?D5JZrl|ILq zP6#|2#yURiw?~awjBiqKDGVte*ZcF3H0rl`SWgrh%u}U$`b8>oO%)$WGtr7>hushr zc(esYMd50K8EBdVE3Hd=atpW(Emi7YrB4}(5P~b4NyaF_n{)HFT$+O9!a3=zfFF{O zW-1T2nD=U_3{_s3E! z#SLDmK*Wg=4~b4gp&870%?G#Zk)O*9-`Snb+*x^gB8r+>@GJ*G!RWv>PTklMN`o6# zqpLyWOV2LN3Xczu$(^y>ndzW@xX>r-?_&szV4%d789;^xH%nsZ8#@-EEI+g2;JTs* z%OX`Rri?gRRx}}HpLcnY=}O3%@`Gvb!;=gO*hkMU_n@4@sU9V7t}P2#s<(@P%%@fT zN>IN%jIe9|7Sf``lUYX_8VTsQpZEXyrdjxdQO@QSFW; zCu%eQLpzPyan-SxQH;)c0ZvhP=O3dEEU1S$2er@7}Uu*1iG_?KPrxOd8SNm}#E*Gv~2oVx)=l zP;ht#o*{6!)XJlBf)ECms?11*2;J09Ye(+WNQ#31t_wWNm?=Zz2cre5`P@NVT|d- zU%S%4Ehk;+he4|!lMm>^!&;pYmu9M@?vx0I$vY z>hGyI=H-V|Y=hW_zPCx=5HIZLeh0ozr#0=hDEQ!P%BB1w=Z=@MINdMwt+Q)*(xb*i z47^tG7eNRVN^@={t?UgpBDkqY2b=gkBm=CSwOMDf#2tX@qOZtMAPcwJf)OHcYdPd% zh#3|#k71O?7s8#XN~Ci3C}te<|BGKqR7V4cI+zrH%A3{oYevGjVuPpNqKSdz+eYkz+0hyrb9c!d z;+;|s;yPE1mu>;-&esg&z;DJ>O-O>l%@6f2UaRUPwe=J_&Q6Yn%+gM-R({;sY|Usp z{v1WCLxQ(okrFUNtR|4z^uzC+!Cyo`^-VU0gg4csj#7b2CaVGWhUr_BjqJ1QoGGCM z#m%xULRTx!-_g=uHX34(~Dc%+RaC(fVK47all90XP~rh-rQ>kp#@w>%t&mk-U!jM(y$+8V=ep{HTSv zb*;(t+t<6vy(R%b6oNS3)3&&4wgmaf8*SF5_Cd=cu3_;aA9JKj(?$*GNE zN)j8U;8tU$AU>3;8RQLjQxOEWASsdZv{o5a`ESdWc&L<79s3iyWARw_=HHKShjY$H z9K3oMV{%nq%%)^Bz0#Qojc3fGl|LY~iKehN4&Ss<%~ntOs2T-YnIq0LU5Dxud4OG8 z+N7eGp3j+efc6*LAFktB{dPqyoH*$BiDYPEUs?W#RmxHt0Y`NnDFyWcV+qgUeA8ozNz+SsEee!z7K zq#8-%{ANKL5&9mM@V$Yogoux}FpD*E4`U~9^J0|Qh;U!a4+ie=7tMhdsbkl1zm`&fW~7}tsv z5Q%Frwf2}S;#%HwYFMo|)eKGh`)AdVp`SiQ_0qglIv7#97s34GBVPb_~u|A$K~(KHBK4PR$BkH4r$m`)24$#PK_5aap}0_F{D zwVi&#)q(T<9c^{1wqulP3L#z?cLq|JVp`5#L}apt-tU|Ocn#I9TTrx+aSWyT%MUE< zDg~Q!uSOuSzya%^#R}gbo0UJ*l*C3=At>}cl7E`Bdc6hPLkZ!h+8`h;4yql3qtC1w z$QV+Ck+$HmvA-r0&$Ky{OMbRT5-x@5!)DkvnAr;d_)=#j7T`}2OWk`&J!7IKOHu0h zt?US*PmTZI5DYw^qVU!)`pCK#+(_pIjgCi9srCawFlG4ZXg9n$M$l&?9q7h22I7ZJ z0;p^=?rK028P~=dV2?*}j;VkZ}`;#6Ip{V<1pI6#x7^ z$ITy1L?QVkeMb?;i?3D2jh}Kk*_tFg;eys6c&%nO@e-*y`r4#_m9Z_QH{H!XXszRa znJvh}gLIsHVB+=p8M@`psV`qIX`j3J8L_zE)mflDxpG=VIMw*qLX896KI>q1lFvea zr8%!M?8^MKes5#M7JX&VLWT@lz$ZNNY)7J*ehQ2?@_pckMjuW|Yw}u-^FiEZ!gK_~ z`D2sjadSJdoRVtTs4dqyb}UoI1tpa~KLYtqBAy`JBAKafOtaQh)!29)E%3x|d%?=? z#Q>Q~16lKT&-Z#!))r&ca}LU1rT}1JX@Kf#dVT6~`r(Pwq!&jsKfW4L1^N+`gE5ED z$GB^MqmQDszc!CDvYempwhuPB`C*fMF!aD?ToklGYgA1iVN?bA&I?xD;q%ZyHO3<}E*}V@aU(*3vA$CjKJ?aGQ9v8UA z?`vgO+#Hkesw0iHS^gBJGMk~e)=y2@vN-StPdhB?&UP$3bDEHqC5P~glFRm&euH9n zG5g&liYrFy8zLbs*!JGXCpu|mEQFWgX{QA49hW`tlEdML99E-f_YbG=&lz(YsVfvQ z90NkuSBO)RPJBvelQ4%%u9IvmcAW9O@RLBEz5sogG|F3i}XU(tnE5XMlSSqYIB zMLNswZ!xdJZ_(4>zM&xF#6Q>Fqj~PLo+TgV>4qFT%8=zh$^gvme4eM~{-AlO7i^}p zgf3dy8K2RE*g}Un`rpIZLK~f(_Q|Hh@*jWOp@}UKuX!0yUE^^Z@k<$^yG+Cr$%*^W zlv3S*+s7L}RwH$dk@r(MDsu>Q4}R*mWUf>Nt1g`-X!&I9HB@usWEV?1acdp=O0V1; z_^_>ZE*4phgIRsb=e-gJA7WNA)78=bp*)V6_(U9@tR43BzN|kAo7;4vdwPBJLF~Gl zx=1Ja1MMA%L_{T4ar>T(#J!!0!iNlANc@V%lTH@&E9Iq<`SCC-a+@>b?`(ceuy=$V z@h1%OQH3tOd>;C#{gFOfHyMq2ONWq-x2KO|{p0-4eh$wML`_RQMee?6qkgv(19i9< z82EU(XYl-#53b7eGjzim>x`cjVt&RZ>_>WPHE9)A*m;(|qy=538H@ z{5@abero-4l!AseX8A(Kovtlfu7PG(n|qR|O_rIQ+dK+V^HGO?gL@zRRP06mAQB3! z?{0go9*jP>+jGS#jVn^vI8+;U*HzldEl^-Jzgg)dUPvD^L3vs0c-ASW?tMkIy}Z&L zfcqAS2h~+^rQyewL`*tn*z#3}aRCO_UijxmTp!q&faBs7xFsfzNqXvlF;pc78PyBs zruuKwn6A>NDYk!o;?iPn6EP_>E@xWlkOZ3LdUH&F#QX38Eh#e)7B|HE&s4fVA05%O z)t#FF0}iuYA4WZ-9l9rYZ6-k43Rj=h4MH^*!R7D%Mc`(k{*DCFD2_5;3MKUw>(%md z5@6zPWU%5!Q-%Pf!ZVv2BHt|<|)B1^&GpILO9Etz7&1ZWy(vEU(;jAbcYdMC>wdda;mOKm(SMjy(I8KghicQ^ z7mi)EZnFt=U7N3t`_XQsPSgQ2LG$ZR5@PF5sdT3N9g5sH%3ws;m4{CLh%{gc8^~zg z>aKUWOWZRhJ^PB(S5C4TqTY-gJTZUvY&Z@O4NB#7&9 zykW-y;wm|gI03(2xKUvaa1Nv;XhVC>YdIhewUa8sZUgTHFqEMNidmbLD&P0);R8ko zDVYM95UNiq3*oolx4yxrM4b2!Rv@Vs>g*5w{*AxqkjX1gNpVxR_x78(XOE}Q_6lfN zxeV##R76*v%cg^nAgRB!Y5#(+EHk&fOiGHzY-!e)&Y5Wf~hg-aBvgB$8<% z?DN^;ysCnndLjU|KUo<5`rEe`_X72o@0wyw`p>Ih1)$~4cZ!+_36RRVT~|(l=I2DZ zYK(`-1wQtchmR63RcEdQsdz^etC@Ku#A&knqh8bGQKr=Y_cytN=?j-XxstokFln7l(UIQTt?@L*}s?|6v&r!^49+dYG>7Z^8)9{lYg>dsCqSQ>D<|BM)Y z_X@j#OQ@tUe#LE~rYRBg2eZK}T^U8sqUsdT=xH3m;$6%>hh&-d8RM&vD+qz}UyZWzPQ=46f85x!vs|#;>el`m|5loJx1rhL z*RdguuHNC`hB}-;_aHJ&S&??7ace>Fp=0I0vhUsSsWauj{H90zo`CIdI!;t^C&k!9 zzCyJ2$TWWy=i?)zth6~ohJF->mmlci5&2?ygv?JrY;um=Iv7v1jLZ)o!q8tsTHp|JTAi+&a5TRK0QzMXtyvwNOhX&kr}$&ocj zzJD=2Mg@@JfqmOVF)$oEREJHCb_9ymu7StP)d6ICe8s#I$b`X$TnIs?relC#M(Kcv z_9@|iljq(&@b$5YfU&KF0Qa1pRsC)=nLToRqr2H=8lyYm`G`b$!c1XOc|vLE{t0i- z&=|_NexY1H%OCLYG@gbt&QVfdVIxv{LV_9D9MhWmanqinN&Q7k4KAJiMSqM7 zs0ga$1e<5aI}gO*duo_|Ak?lt49Bg7oUN=RI@i*K`Btp-RK(>N@VP%UUK!(7ntyyt zOPEy#e(&^3Ywt$jPqW)z=}2+^=GZaMlL17S)=L6Wx@!WH-|i8ic7y^e}Sg#}#aJ-S=pq#p(eP==r*>9y=kD;Tqp9UkCyQB~6m& zZ!N=W1cM1{J+^~fvx0A64z012ndVGsbkUfnUJZqRDb(4n=&6z^JW@!Qt>EmDMi z!&rNP&n%G9>9;U%fbaLdP6Zg^Kdj%%<>RhYfBd30u2%wGpuuWip=LAD1DjvIvet=J zWWbNsc}vuKgzzUhu+;Kp9PPR*7S>D)h4*d{%csYqx!})8p*- ziSJwrv9xJ(b`X6yaHJzs5IvThh%IEGqS^18v$Ij(r`l=2j#=foxikU08=oH$SBXCf z0L)}XAOw@jfIO^e+i)tS!aydKz;SCvn2qCUZ7r#t^Mf7Dd2f;}o0}`^kEYyz)z3n# zdvS};WLlrnxk8Pnarff`mkh7lfj1OfJ8R0J?VHB_Mce;+fv>|JtKM0@eWsZ=@Os(& z3dm*5$8C8>pNmc>L3A-(Y8aoHU4%rt5|{8$oKU7r z^$}57MJBaf*g~yX2w1`UDHj2Rt6}v=yR&|`p?n{EISec~D9{b!W`wzdmWmCN84aVG zb|=zidxNAcq{AXu=ds79r*YzDjLugWSjEeemk~X4q?O=yE!x9N0%Hvz%r31grc+F_ z6{NH4fSMIwVn!VEi`Vcvrv1vQA6V^0I5f=!tz>ReEk@8;&j%ITDBS zucGkB*Qy|~;TIL%&ygb7sD*;^K}glU*yJn852a@X_FsPp5_=^BB0oJkani%w6}@Zx zSj_})hilF8!Lz3>A75jBpskxATa(EvZRNU^&8F~C4;>Dv^}|d@uOPqJw%ns1>^F&3 ze74@3hOi3#?WEAUxNkGe>OrbRwv2otH7>ZnWVxvje@^~^%n{2hfi1q|&i7IX|MLAJ zL(WeFqRlR|FM3fjAU$SPj^{2L6LzEvT9sD%DxY(?NiRu(G|k9Ln23fl2rjoLt*!aIm_9{?2rj z`cL^iyPWhQxk`h8E)^+kQ0<3ywlj!qjz0x2nj-f$An!*i{)&{sCUP4|U8mn+VZ*VO zq+{SvL8+CjP1n8MMiQY6K4-Sep|^~rv-^aw4c#GXSm>bAdpZ+qm)R_frS`T9y|wAa zZS;G#?L{$t3$qhxt*dS>xi2#P z7n}UPszUS=DC?xHlqV3#+ui;yo6xoOyvM*4N$CB^atKbu&s1zmO}a?HJ9E9@2N=L{ zPx_9X<8nRz07AJ^{1)-R`Z<7?rpi}-d#nphu>L1ER*8I6!|E~icnGjQb5PXFEO&8@ zGy&{aoqdkNoh+kCudUdY66SGZ&YA-q9%6aC6rtfuibDo|#|lk;(Ck#d0by zeYv5GSFyDp!dT*_UUlj!;>#qbKMLnO^|xuhs*&l{x%CHfPFfV9 z7B_ZO`@I0M!A@W>mvx*_i+6ai`Q%hpA;3mIkFvl^Dh32VcFWSAKyCB>aD#4u+TRE# z9z$X0ExNwoGO#9RM5Tjmh7Q;n1{-#IGCtKY!9OXot+iEUnLjz5CcGMTCVHyI%+D=8 z{LNOJD0rgD7%Yj_1O4{%8Z8+q{?%o{KnSWI_O1!QrBDQ*OD7PM8m9-CHftw2?h-O4^*;EY@RlC>^Z1lTk&_|ZRGBcLMA;Qommn(j?f3wG&+&dB{kBldwLB>mBS zdG<4ym38GZpd@>0sqq?O!;H}?*y<>;R#M29@6&N>6t4=m#)z7?^@9S-!N;uC>bHMhPFI|0nloLwUR=+a|FB8s;~CMYj77W07rW_*T*ge8jTRb(xG;U(6R9YiD4& z3|_Ln{G%SqR%9v23ZEQA@Lb`Ec9GSD&d11Ug&gV6`X;+*75W1S9AY%Yc%T!CFY%{v zF8iI2J?A;v+g0I+sxOk<0kENCn0T zb(1u@&`u;cr^{H=zBX>>M4LEDMW<>>HmZ*KTq;E;iosZ4rqjlpP7MS|ygl7GX;`?K zm_}r20Z)~`$B-1uN{GKmOjQWu@&FhC2Jle9*Dp~@&-hQ=gpPCe?)!QsJcrw%8*Z%b@k!j<{G|&~jNU$GT=a4QV$6QC|6%v!{g|N2X>5b_zhX8&I!`f`@ z7?WYIw%atIEMBi-5TVgkrIZ9)T_n;KLIFNKa^+u3d)1xE&uOl{5-tZsaRZ76Pn67X+hgw3K zOBj#rd>yeFHC`J3s)0St!p+0w#$zTv1=v*86dQ8ClbFkK(g@JIpw8*5l3*Xwq5MU0E)du%4kO+;g6Qyb5J6qv{ zX~!;G7~sm^Jl06UX>iAG(ufoWuJ{l?I*>{zrZHu#WK`d7R3Dhx@X}|#VxF?5Uf-1q zm?Ai2=IOzzz>NIA&m@qs`58j>1VFb5kSyk%1jb=w97dCv)m)2Eh2MW>Qp8y;3}28} z{YF2&>-^k%5LExIPV0p0X{U7~%Th0n&Qa`iFA}08!cZ&TV?SVCAW|yk%D5t`SIKiU zHd1TGyin9@pMuh(zbem>lEb}IJoDW_7~#(Yc*flVgWdll>>YqSX_|fEv2EM7ZQHi( z9oycqZF|R_|5!WNv2D-n;Lh{B=fpiXz7z3fbVOBkS65|cWo33%SN+|61*z~`H$=AWS)8z)`nHwKM^@M9dgsxE}&V?nG}|q_#<;yt^FN((~6>F zkAc{_Lnl{QzC&L$3h~C7E)ew}+O(Yug4IPY4NVl7pRf^$l|Y;IF_3kl`dY5n3o^JW zQgUYMqVfAm>}n%Z+KY2zdV%{)tS{?l`Xi7Z<{k&LO#_DQ({N9nJ%r!0q@dw%Dagtn z3za0eb)+==n9t`J&$p3C1`h*6tYM!7e9K6Lj?2GI)86SVPgLwVM`{&^W(h?@VGiXg zx;CpuEWBnZ2t$tEv4%@?TKof8Nk_T0J9@n zh2g0!O-=?H+Ci${67Uw*Xr#RqqqaFaF+TTsu#vKX{F$?-qC1baOPrD63Hh6EkY3#U zQ?0N!p3I_xaq8ST(gF=s*E@($2I^Q?zX1KD7~CL2QNM>^`L9j_@L9HrXyQa-;kgv{*kNCPAKjJk_-j#?lAyJXmcR`# zC$Bkv<^9Rc9rxX1sZMg*Gx-F6(f1ZHC|ta`S~N|thrDnB6}vY^x||OJ;~iByunxkR zse-Y;)^NZ{d6M|qS;yn1do4E1YSHu!7Ai;YKXCnrfl#P@!yaQjgOr2?AUYxNVSb1> zryI=P-x$f20ca<|M}c%RQ;5$D9ISk$Uh}Z~d1y*Kcn}ln_II~(EF>YLdQ#{S2_!&Q zsVrytW--9V%CFmm^TX|q4?DbBZkfQc-!wCp+z{Dpl*#2{MhXv3GdLb`+&7sW##-5X z?b8KQwmRGwYtJ~ns)ST44YjFNUe@JM>q2gE-QB%A$RQu|wMp@RSBq(@X2D=70mJm* zh;&c{7kMDi{632+#G`#swk`ozEq)v$y8@i6P2oa9+;zsDnQPl!$V5clKIcTglTFM{1Q+}&!e=`?`R9)zwO39z zM4!mIKnAXiO{rKIIRU);4;At8NXOMhY2YdfO0%4CCqW4kxUxMu(^hHd2

Qmt)qM#HI}IC<~$?Cnyu0LGVl*57sD1;o(CX?ZJXK@ z0kdC2zjIsX0AppVvC8yy!v^+d@V200htPT|s=^7vcJCNRX3*rk38K!s6i!V7PD@n2 zRy1y!Maj8JRAlqU&6BJr4E}JdVh`sDD1+uoJ-BzKB9hJD+Ks>7EInS$8z)-?NP&wX z)>q;Q8XgcuFVNXa{FU#k;MNm93mXH@+ci(!^qm^pfIi0v{yfTv8rEp$o)xY$2@;=N zLeL)%;*icIaA}1DBChTa(#En;ayGsnK2Om!dyoNE&PSmcXWUju`#cUZDa11(Vq?2P zdDK&!Xz)3#nexp) zhuD>kQQ+q7n4)zZ$)##=6V|TU6WAPee`^;)m@^rzv@UXU@L@TKA7owM%u$-Q{_?IL zpjFT>-J(r1CYWp51r1*L(dI@3*fixX+y}>iHuDoy$}#!UA(FboHB{-TJidlmOQV2J zw&PVsclMZq(o||8mt>Wmr3Py|55;vCm;k9Iu(5A~fGm9Y2zvs{3FvadLSt`1#UtfA zLYg>5BIjP_wK#>mGx~fy}u0R}mP`t9vD$9Cfrvqv79Oy1X;NO6g)1+f*%}u>ak~lYE^!)UE3TkS13^1Q3%Ute~(qye+Yi zAHO$N5{m?^un1-^6YOd308?s_1*ipi)vj1SufI7~;&NtlX+OS9mdt*Sg&rrs9|C+4 zNqShp`!n5GX?zhE3djX$H$Kd1DeaMAJ7f{A*+h1$3cpZdyx88cf_W__^~?5=8akmH znQ`>F+*3BZRD@d$+tC46TmO4|{e;rqbvhOT<1ABM!WIq%$W|w$V;_P0mwU3zmRF*1E2bw?^qku zKx<^BJ2e5C#}htju6SdLJ*g%B@Yy{a%Kot9{PbNtCecZbyk#M4CrfnO4`VZY)d6&q zt}*o&$7FdQpjXx!+WIUn1!$e;wM^9QcqmWptFmQanzF(D5h6}d@OHRV6|OlbpA^_* z+lB!Y_QoQ9%hJ<6M?Gz52UyHnRy2+9IvhKPJtT3ovkz{o$G5Xk$=dN`?I^Ia``ETa|u zVswy;(4axEAa2{k&4ocQ!2Es|o*2Yl);$G1c7(nbRFaXa!tdMgz;x$Jl^VYKIx z;w3NzJo<}+Yzgd3bt=8*6;saEDrJ5nu`+`g!oVa%=kr!8MadlSGBD-(55&ePZ3N;K1sLZ*jVVZ& z^mIis(=m)0DmZAN)xK&%C!#MB;3kSCc91PMpeM$mVhdGnnZ(RN{{{^e4@1Oj_c`1W ztK7l}j-hrUDzPy0mmWfChfp;6m*mY;xe}E|%8XJ%`G|4MM}J!nt^(?I9`#|o5$ie5 z(7*_5;6x)uyt>NBYOE5pZltAo&EHq#JUi5f7_dLWzXTSdeEWtKiM*d4Ph z2D2Oza1A@|H?L$~ST~cS<)MK(2_nDA#_1QNxJxZX!7cU^5G+ zhVW%>SWl2XQ5i|})At@3_isKNDp5mlqt@a$p*Kg+Loger8jceuxcd{$gjKX_&Coy^ z4U_t1V6AGFzGH*fN&%?*Yk-FHQmqtW^gE*LwzP8s~aChjq#ucqe!FK~57Oc-j zgN1ucVnh@`C(BrIGIzFlPG{rkxc0{;%%tp5kCB?PL39PQC_pY3SU4iHz<6USJiET+ zA^f>C4HA!tV29`f{k0u6%W@$ol)-^7R>tM?ZctN9e&E5f0Ph77qO1n&6b8Sn(FBbj zvi%ehw-<-w?R8A#I`{M^G98LKZI{m501o<^kqhEQ_dMx}<6cE)?jg6JJZ zw=uNH#ZpNl-vlcI+h}T~tDr!3)u=kQ(Wz%*7$<aqjP|j%wuOsVwEw*#POAVn%#A zHvt{&Yep>1SbYjjS!luKeP*AqC6G9+K3VN5C=m#z`r!3#AzB@?;F<6x6J>{*uiTli zWducAsI(kW#HyLnKeBadx%B$+2ybhwAFYTvK!8V{$YfcpVE665KOH=g*9u6*DKtr& z*@klLDwtV<6?E$U#nki8)cGe)TiE2#7&%*)Wh-?F>htn2y=M}0Fmwnsb9U6YlfwcW zvYYrsa;UE_&L&ZOF3vmxdG}=3WHxj*5T`LGqNW}k+!9zixW%G_70y}DM-@lffTrR}vU_6_H}&-yk7uC^2BlK!gGckz!HMI#xsfoPiAXC5Z9; z{zgFzL6Wq_1WFBo=Jg~<{$NpN`9|h4a1b<*d&*t{(z&?6NQ~hD=^OAJTMf9;{i~6e znY^*1WWmw@U9{3RW$TcE{6L|61uaxIXjkBs9EM>^z^C02h;B zNDhjBQ9*fe5u}etIB8vTdZ(0;*6_}^{I5sO8EYDpx6yF!pLjXXWTvgP0ppN0?QpK> z4yU2miguDlhyL-bB+6f>c=9#xF61ORc_D4%$%J^F8AKz5FjjJgy1Vo7ci6&}-R;m& zq&p9KlF+Lj1ewUfDpDGzMHofq(B81XiXna469&t?`ZLo5ip0zhL5a^1PMdm+kl6Hr zhc6#fnz7;{HkAC#q}JGDN-tUzys6gSc)b`@aJ>>vf!0mqfFQ;A-O_9`(l!|5yn!I7y&@;6IoN8388k0eS9 z?7{$5uOLdX7^1n=40bL%C2li0)?~*p%;?l_BbskiT=5q7aG z4$ijW#L9hGkE*}}Pwj#UutRu}KY#gu%$-{T=9_%QF6H+=v5?dWC)SIe!T~VhOKz*1 z;T;&!qRwZxgoha~QxkdGyq(gsucSL~Y4;`FV1pdF+~?l;B1f4|py`uc~M74Teh3HKhvw+^(j9LoWwtH4Zt9=Gv8d zO0&6^MV4PXRblHW24AhF>P~M3eNkM@M_*)5Hd~@3eqFD3dW5_H2&O!LaOOU40Z9PZbv8o@AfwYowCx%EQUHE6zaiBE)!tZE?#8y2J7g; z+fH3qqtSyL3V5RGQ78m35RAtQZNNQ}7&y}7mQ-o59V)gPAQ^aF2$I&J&&YE>fWB{= zR&F(TS*V0@mp<`~+{%vtJ)Kg;PIcnMJfKA~A9(_qgPt>WS%QRl>Pl|XsGP=R6Ib1| zKZ!r1$yR_02Wkh@<_!tA*%30hP+G+6h^@nCor{W`{+6V)haFSWHR|fWYC-e)MNQ{Q>NC(+c~~#4xu1Cf58n@r(WU;{Ph)+5dOunEyUW`8`YGY75s=DnVqf8?~li=mW`*gzZDfzPv$*sZ9HAAKeZt_-kLQ$)h;F` zLvIl$LvI}=vNAgL`BWY4t}kb2$SO+jykCOKDw=3fmg6dDH{GVS__XQ!=htTm<*ofT zRd3G&3uHYs;YU3YE$ExuIixb`AaCXnk^ zt#=>H*Qj|07P`C%(a|TOeR*lp)GmJlXOgU&HL_28aQt6FQRg&!M?Q=Ie>&ShaR8bE zL_7*@VNZQwnuTs{B(-U-pD&KYJ6`JzX}I*C_SfRehQI-OHi-NsLqOaFq(YBMNDR_z z^OQOaWGvLRiWBacygT zH}58e{E#0K|AluOeW>vp4PVgVQ>)48ahF%>tF2lXP@;pKsZLfQaGm{Kr&=iitrNsxH5&zvW5Pz=iGsc&DPHUkEbT z5B);2v7K3e*1=s=q-&c!V^?M|k_V~5Wufm9_x9EMEO^}9!dNGi!kiWD@pZ%Wf_3xK z4nkcgcdfsUo$e3OiuNPP9l|VVg z3O62rWa}CDj=`*-MkFOXXh#h#>6bxX)J4k-tISSq;>rpOR7wy$*X(K<+HL|rz zB*|B|2)*TI(PE~AjCkhh5Rp(E`g;m=-#d9xU)h;}mUW>^TU}M02(ewVekDCjf1Wh^ zAG?VW8PMg9a+3Ls`D+Oe@;m;TiZaQx4Dlz;3=^*FFan7837E)_<9u%c9RAqJyR2{w zDlez}V)%E}G?pc*z9Ouy5R6bH9eDt3x8xUYUC*L)1)$5xK8z1C)JBBJ0H47&5;hQ@ z#a1vfQgx`ot2D&B2A0YdBkc?ZBc0{~M@rztGmdNUwYUxztaxtG$ZL(r$iH)ri(0{A z;NqKRd>GKXOG_DnIf~Rw;03-0ff_oq{rIHuM*BD+b0KS1{9Sx3(@<|<171f&jB38f zMOW>?`+Rwu>Xb*ro^^eJ=Ag9VWkDi(pCzj?q25!jf@Pv&6>rWRj6*k@?5DIE7K>K( zh6`pAcWP4#IB8zX(Og(lm*98RM^wvT=4}2)Fe91|E*2PzJwVtm>b`D3gGoE*`RCM` zqL8)P5Zq^uu}i){{3J})Wy2hHd|%ylbGy=9IVM#t+3~2zRi8;ZM~ga5-nuYhI{dY^ zWhumU)`sF36&}USa-aTDKVv_h)!|r^7}x1c_srhh=cO>njekx_rtY2+SvG zmT@mvj-P5LhEstXY9xBbAmyyU)l|CkPSpEuB>N&mpb4x{Zhz-7wxE^WAfQ!NB?J4h z3t2XBfw>?-{vZp~EWWv;ZR2veyxdz10Ny?_AOo}x)(27$qOn!=CZmNwP2KX#lGzyw zu;9y=B*|=of@&?OF2WD7shfObgr;ev$k{z~{94Cw!-$r#NG`;x`n<>h1tEs86b>9c zt65rFA>w)mOpFwayJiW2AU@_w6z^uB0rQ{$h9at~Vt!Tafdt~xz_ecQBD#ul$>QUSF3k1y#p)WPr0RBvsT!T+hk?f#aGk68j;^ZFR-Ne~0B`>H1q4 z`8&xa>%rYknD)=kUn5_}E#G2eXflNw;~S=}m?k_Z<9&rer4#LG6ewi_BHWPJd5v0S zN-Ct%e~~TE8$qRwv^DAxjmYD3>U90KbasTfc{BM|67#bb9C{?H&XB69%qXQR%*^N4 zpBtT;9sxmkzpUQdnDyMPrPzFT!}*sc267Fi2_VWc`69=GA=DLX_hOl}R^a%>+(GmU z(fNFJH&`MJ!9tTD%pmcfIPN(&f%!rNF*fkQ0~`e~CM4mE=`O^W9hT4b)xp<|vu0f% zt&0Dwtui2`qgHM!SxM%NWJDC6a7L3?{M+Ip4>V>IR2kZiZJlZ@l((+3h-@uF zdc``BR!o;*A0VP&#XW2f86A5UjbCW=F{E~m9kd+wAyMI*)0jSD*6lZzu(n)wvk{(g z*e)N5eN+L7e^7xFU)Mkso7OOjUA>O)Wvng*7waGdPp}haPxYgk7deEr$WwSG(w8N6 zU32obVAoumYA5uQ{LThln^zo%#1)UB_xlAw*{nmG?YSDT)8Jr!{Lx>w;Eqwh2qZL~ zTGt)F!;!2WUJ6Rp%;e%qjGrEPRT~kwSvSnQs7vGoq*@O--Emj_^11o9aIRWsL!!;S z!x5u;pm|b{Wh)P#S&`^=A~EAI-82&GSPc^IQ2o2yHYBm>Hsk+T?qHS!^F1CP`7$)f zyCXp8Nf64z&@r(3*wdt%==I$JAf~=bCjq6&Q}`RwvtMN_F89eTw>uufoPz+2Jo|+5 zq-rp{;Zt1E382yGR6zJtXIk5WkX;<65dF5ZF`$aG)*1^Ds9N^lUa%`ts9L~FNpf$? zW((DwPcRK3a`rC;xiLE@56K8dRW(&g>uS3)N7)FFOKNAYCienxtDN1B0vYNo&wtg~PUDp@rn?=gzplf3Y8{N_#iPnNSlL zPK|DcMr6ZFsWn23b!bbb2D;@S~*H?4pwjpi|WAvq? z#QQ|FpemI&peszQt)5`u^ZUeR5DgxgJ_9QSRF7rb#CBQwrqEt2P|kOtRW|=cEWY?b zm~Ao!5HVDl27y5AO!bUy)Uq=tX)%@_Qney<&?3WHd}lZ`mNwf0q5>!`YGa4* z@GNJ*aVy*t887smOJ}@v{>%M}JLMX?;9km(Y=y%^edx+-_|Xzo4MUPX`3tGsdHMq1 znY+;R2l9={W?Xg4xJqd;;y7&?q*+Bdj*KK_EtW5lAP2o>ywxnCtQOR~;+^TEwYthj z6L4G3Uq))e65r&yBbrA^0aEe3`E9(n<>q_T8;Fe)?8Y4s_hg-rb=EhhmG{mp!U1Yp zK-*ruzbVHqX~NG6Ds{*|?%n9q%G^&NzQyJ&-KycLe6xV1`gc$=2n4Y4bB9bKdE5OHp(^c8@f&lz=c+n&`MR{W&uvmxClT z6E#^j7Mm+L?1)@DE*#)(4)t(Ao42I$0C50o`id9+n)J9L%GDaWIO`L>N-AOm`yfG# zTOh)Sp?63idT+w%#*TVpp6of#%}BZdIb{|i97t|NmMs)Yi$suLb*ZnB=JgS8!PMOn zRZ32zFHFh)&qbKzh8~QSTE8O2c{mof0gz~w;w{d5!H1F z6Hx+Nn0&2Samf~AL+eD9O2%clWo^nX5!rL8LEm%soS&MGU>8Jxvfq$g?{o^1q@6tR z7K@DZ#?G3eI<)NxY3qj%>~CsuA?T28j7mX2B{k}|1yp+SFDVx%2b}aD~33UUd|l9c`n=ZYzE>8B;Jsn_rcvC zi%boubA9VGH8CHo8LA)GCgB>TH>h2mo=$S->svhU%LtN+$ICbfxR^tYGjS)!dAcLi zT(`Co!Am7=H^X-UkN7tUxJ0u4BnEZJ7DvN?Ks^kJKeRBgx|X8}!~65fAZG)!0HeYp z{W_fCxt95&Fl}^90QP`NXh{=M2;)I{1d*@}fjzs(f@xfWvrt{Ig1~>!qm1M+voI>e zz*5gnL?ZF{7F|Bs|3FV`eGubeJ1IgU@{|J4W`fY%OjEMM9myKT`IxmN zZ6Ljk6zw}IF~o4Ct`g~c|0Wo=Ip9N)!oMK~T^Q8+L%-3IHBu1;Y|us=P;US!|A+05 zlB=kW2-6*3dVMhJNdSr-A-_@}Is_^6+_2vt`U_Ad#x~|S-NCB@QU5Q()lc%PQJFM4 zt7nShX z3n$>u6hs=``x7jSO_vVpb)l;ep%>)o)$<`E8j45vYg1F1zb$!MNT(xF9%MU3ueJmG zFIwww`P$n7QJ6|#^ogsP4p4z7Dq~%7)UcuyYFRVXu~kJTzdge_FS1DjCWy|OP#p39 z;9zUS+nRolLWvIck=!9Q*532_%oMk8Y5)T-&JX8h;xnDV9b&=Qx*1H zESeJWQ*m;fM|F=head*G+X@6#YF|^^D6HoIShup2OAZW#bCkZOmoD zg-PJ(o5*FO1Fw-q?uKPwVk}ZcUkFF(n0@Za;e-c~)*IwR^}%A8oR&gu7E9cs*M-9KOp1UFzRUwvmEG@d;} z`z6t)yCPaYV9Rq8016}QZGj18fHh|ss$0MN{x&Dn>6ArAVek=&BR)ssM(Lfjfxo&} z?SRW}=(Ut!Y2vfi&!Cm%+3e4|JQ6N?w>^A=uFW6oT{nid+nlZZ?0UZ80fWGk-@+4R zzN^7G0nq(ZRA5jBj*K;T@G&hl%^IIoJ}UrQA--gvknh!e4A&&U*G@oEK{v>J298Q_ z-m1Qdjzsx?adFIBf1MGnVqHuCb0#sf4Jyxn3n6yU9k^Qw`!_lnU%C*QgsR?|;zN!v ziZ2CbUne_5b?V~TpmmsSk8Y^PGwE9&SbagM_#NI6x>NKIwGhWL0`F)k;HfN$kl8RM z4y)#2tA#+L^7pXeH%YnM_BM}_k!b0+L@NWH)!%- zZR%#51*Ch@G)P-pwo$jHcEN_xwukf8i#VA#jo@;V9y#;OJ)Kf^b~+c=BNuh!jM3uz zzW#DuF`)){p)Mor2ATY;`BC27s&*c`6BIoOC|;#z4;8{@wrzC&cuL_^Cq02%HZwm* zFxUFMwph*MP5xZbv9o6%95~$Q!WN3Rd5~4u@@?^S#KMjR+Id)YmvJud`lX7bxd?pA zeo#BTS<)x8q7!zV>J6{&-m~bxu2uCiv_;C!+sy2|HNp@;kgONl@@zjzAUNi$kZ<<{ zy9X;V^lbb@&t9SWTf^Eq-B|(P|Bq$5$=JxnCu?5_>Bjp3Gc&XeQNDbWR-Ep7rL}FKU$78^F}C|bc0G5J z4i4P9y#pLH)%^;$@|xFN27KAD*jv8K9IPj+IG|;k2Zh?Nkclef@sHN0wbe-H@}o5& zJhqrD_=@Uf{nrqvRacKnuqIaY177OyR{o!88_fSf{rumL-2V@4gZaP0I{()Q_WZxo zHvUr$I@dnm+__2xp^VcVJS{3%E=G4O) z_xF1L-?K||ZOZ))c3I;qomcg~`m0Zv?|PVRWL15KApDyX#P6GZM7KXnXy{Fi1HknI zR;DCzKiuedmMhB-4f@Y^)6kz`CJiSJv?i=#-4c~gy??9Y>o)4UQS1!%*J!Eh^-0`BUR8)JXY&zwQcwF$lJ ziO*$5^~P2qgD?BZ#5o`YOmF#1l}ez>eLmOC%t)ep2@ZE?w6f`qG}snQ?VT$hn?ir7#m^j}XM}zMbX= zka_3S9)O(N!4v#Y#T6laLKS26eu;q>EaC)T?X^nM+xAv}Ou zhR+t3DMqiV>tiz2@MC}Fz4yZXR+Hq;>tc7LU?k}>Q!0D%PZVx@e6c!~2zvu&Ft9a{ z^)c+s(CtV=NtDV3yeuf3+XGz%`CoGNm!mB7qGHv9cz5gNRLFcAHvCCnUiET zoAV()EkRp_P}*AEqdtGI<@Ncx{t|HBf-eeGspX-VkCA;MGgfXJh}~qD86{%B943%( zAv9)9Jr+(JWJE7*rzs6<56&9_+;+DKH(Z?D#B0B&#=xXvFJ zD99JUM4@d)OheUDXYLcB8v1vMsjnsfTy{qQdcoM@?q6QPqtF%I16kC3FN_M0aM zI{rg4dDyKP;m}gfBDqd%IK(1v z57e>xB-Ay%>d~QW;_cN{J^_-4nQs@8sH`)1Cb|{)Kavm$%GfN==)H3POlm7uN_S^{G+6r#wb45 zBIERfMNn@ECM3y}Hd!f;NcP^MEJA)1N_bW&0)R_|(ZjCXp?H4${Bi5j$5>sM@^VsoLRdXiV~pbfd?`Qx&B&NM#`5yeSKEqOWK9mD%l z9<+;Vn!y70m6lPC^L6+GtKLj_ZGI@$joQS-xg*1_jEhLebGs{F096blD8|28D#cU? zTFwPi93}}?*6ptA<-nlcOw2}U&NM_zvtW|pDs2_>C^O^m!?df(Ev@}5xL@z6@pXVc zrh=W7HgrIlWJ2;+<|A6L*Y^nJaKipJz1f5;aB8OV;w1#z`LRVp>bl4mb9nDvs%6Sj z>s*fdEfzjXQ)bJhSyd zGPDWH@?khKLV>)}owyS-H9q>yP+7#8ioJ}cD%;16;rPqjbt?o}5)}t**t{&Fmt8!+ z{IzEo&ra7w8SX9xC0>OYQ6dAfKm>^%cG*Ru|HfX|@5Y6UiW!GI3S>FuXJiwd%hQBU zvtorlSqL<&SLm{IDV2LiUN>4T$%`$Xqxju8IYKsb#h{^loC}dGkx?R^2bj=Ua7e|C zz$+q+-EDCd8tzh)WVt32BA2SZp^%Lmi0T7vgX}ZJ6B@C*XpnwU`fsTN*x#ofwe{Rn zi)H+3+@cknyPT(9z$}pl$+kX-M4CTr=;u+)Aqpc-_u5M|BuH;RdPVWvhqyt>v?suf z{xQ9qKum}9lE|h5Y{qaQvU@mM?aR}RO;7XG-1W-=T;e8;t}5n6?S*tioK+N|s?C^K zOnoMlk|=M|LDEZ8>)hyaWF^fOI zLZ`4@ z9!FUp3Z+;X91!{8Z6PZy6my23GaEpZ>}KK!X!p(wYZgHAx)5@2`~z^~;(YX<<=jRv z4){VZ82$rA)^QNY3BM@Ij5*J@l9oxy;fI?0z+scCu!GmhAwWJ0J<(l8I!V&TY|09< zz_U5&_mLy{TqR;r-}(bau*C3l2)TbM1$-h7LgtK{#6BxgoGJ(j)>vkmG@C)p@5Or81K$at(tRie*b1` zQG~-=)=IAl@#eHh*>YTF?pTkhQ;ikbDrQU^*|J)ZQy^DZRGzyL>!3H+djWNy_+x5Y z)8Evn%DUiefIiFMP51*Ha(~i>w+aky_u87(@;sCyzm8IN?oZTBr~1P!7%*#Q#;EXdPZR0vm#{He6{+VnJg9YAJ&L195@e^t7O2FpN%bU7>1Xpmy%{a2G05j z6voduI!(^(7Lk!dBE;kNVNPw^F*;SMiX*n$i4KHgo<#))dPs5vdP&tXQF<7K03(h8A$`I9`Sbu)BK?8fwz5 zj;a3+00q;AlOcPIg8chjr8|~MPiaOypW4f^fM6;u>4CdIWRCmwr-p_SlC`uUJ<2s# zcsV+rX`z7X%DJqyXCOf>+H%ww%XutGJp0K>KUz5xE&?!u_tuR&wTWX>dUZTsYHRTf zSnJ}-C!NyBJ@G8|7Tb;0Pp)`zg)PMS*u^Kio^l37;OxZ%bWP0dMnxGm|L$sw zg8yEsD2rFRIBHZ>mC_QWR`7e9jz$hl`G0T*6|drK_voK3IDa$8JLbv#_;LPBh)@OH z0SQZzijnS06K0dA`L>AB%QLi3;iR`he~z%@VJ~a3&Fx{TLHANg`drOQ;pXoB%!paK z{AZ)^f7X$~{9ln%|9>2X|EF8~82?8T^8cg43>HRKy8nJcKKd=pz+tWbj|us=FhkE6 zu_-;Jn+6E58OfyKwmNIH5ATmQPGnIX*QnaO1d++Z4g7yC%rK__oW{dg7GoSL*RMOL zLK{2A>1pM@(%gCv!-osAtM`_u#t&Kxyk0`^d1WDzRcL)8abI!lP~i*k1DThrT({;oJGCurDC{~ z)iiXp^NXWpJ`tZ(LaM;pWNf!?`Do>dHldu~Ua~ z59$R`w|f&0QpFdXw|4c$64~oxE>B!VgOlta{)$v3Tu=W@l(};Uk3x?+*i9T&J$nHD z%?fB|XB!|MpA&Qx9Qhv9svm}B*kMnVTT?ry<%;Om`9r$XEuw|W-{neeFM#_FU%H8C#_{_rhXdA9U}nVSl413vC24 z#>>r%P18q)^Qz+FLU6Ycm={%x!tG!4yE>z`3LSt^jb|NY+WW7+Z__%5_hTd{yn;W) zHyv0*9&sZd$fJ|<$8D%>#0Sx#K4pY!@hzm+aOh5hZh1$h=cl;Tzt#$hRB{(##A;zB zm-h}W%ITlDx}TCPH3s6ilhTMcudBIWL;{2q1rwP?dhLH>>>Z>gM;m*5y?e4F;zqR-JQTM2EkMUGp_2W4TSJipM!^)TB=0KLo(xwiuj=57! zT7%lpSVf=xIgtVNmRIx!4D9U+F6a&IbH_&rzCmq_f&!`|!;Gt`mYx-|oII-;R6F&4 zrWV(uF!NTo5deeg)rS5sabG{!lR~pb-E@&O?5-p-#1FXjbN-4x2(!6^6{+_(e?mj0 z?qV}>l}`Z2LJgRJ`f~#?2Io#mRz$nSW%7`EgP&Zj517O6$%|73CSnjsjRS;Gwf$J3 zUwR~Y94e(iK))h5Axa5mcjpH>b?0Q@ z|BLglsFKiDN^K5hp=#qo=&#c?05p991iM1&>?zixbCD`T*Wvw7F3Ih5qBHJ*b^(NM zDpmGLrGF3eD6!hfiEHhPBl) z>`5qpapPW%C6bEry@dUG1LBfz69+&q0SeIsh^2Py{U*-v{E*uEWgn#~&s{{on?jDA z103iqoc_y_@UAWTeShy9iJg6H3o7=faCr_xX-|&VxthQvT6$~D1g#IzcCiSg<=;49 z*y*S>HeH+;ISx3x={Egj=O$4Q9}DHa5H>;l(tOHlOTt8O7B3i9r`S2tHuP6M?(U+= zo}mXUG8|uk-C0-Vs-O5qfER8S{`A1c4?9J~xC;BUst}ROz{p8#%gr*24^6keTIlMc zOo9(^7C~Zq28LQ)#Y_^<_-{q7FQ+i8Gql>?R}i)m3(KAl)wHv0jPg7i(%gZmO!0$;5E@ z_sFH#KI{1|`du%kzD_Dbm((FDaI$89v+629 z7^rWjlPSP&$KG)@VyU?6<&r6#Tcg-&OF_epv_h_4VYT+x(#KMZOJ|~*Izw1E?{udB zQuVCP%iv!sICu&_V{rU;ITsZo0p@y(wz}>P*A|#wM^WXTO=lU_Hsujb`78JL+U%uR z`TOyXocb|ht7=l}KO^x{wYQD4+^l*_0Isn7A=co^PQQ7iFZDB!w5$E#-G&;6DIA!Q z)LG4Ph;EG=aE!XdD0?d4&cZ4V@Q^HE=1oZYoHpVT%sJAATiM%v)+ngD|u2yhl zQff>lSo#f5C+wwMm6@(QfknI52*kGp(SbMFf9bjo8{7-YGU_L*lVL3L%E$nN@#`Ae z;5Y1WvwWbX2U|`fPtm2)bn%(ER8jLIgLO$KvvXm1^ca9D@mcK!?5i;;JdxM=Ws0_e5ghECyi=jsvV7v^4AM5F^VYQaqD&Y#1Egf}1nzQLkUXdc!$yuvxSGL`Th7;c%$!q&300zB|6xzwccC z8PrzTyd))kf`!Ew?&8sCMUdV2<$O()U8j=TW>)XF>bgraoe8=n)mJ+Wk6D8UQ&W`A z=^*5Q?)vo`$v|#<=E7&5x|uv`j8QO{&~G=@-f>{6xDp=G!v2o8!a99m6v zUGe!^b~6bV9r9!qoSCR_q4Ql5h*kPjmc*z>rfrTM&dNTf{zDm;b~Y-wU0zu@`d?QMKYt;V)M?r}OF<(Y4aS5$bEs620d z=V0gQ%*IQ>y8q$sb_0*MQLdF@`c8zL^FwfD1rJMhzprf4m~Xs1*bA#F-V1Iu&W&{y z&y9Qo6I+3z0Cqd$9rr0jfiq$3!scQ@M8arAaxo@BrvWMY=$TNOYjV^uo7j`hp`=KC zcA$Pw2;{@Y7D*aCGPrbW4K^Zs>@kT#m*OgiZp`toso1)V#@6 zy$ybnCdprar1LVQ=CZ8nBk+(mbh1rNZ3Kn_*c^fp5L67#6^UmE8ZnV1$*#^^0_BBW zX<}1Tn^_fQ*EgetfkO{yViD7E;ft~`;&V8plTq2@ss4DgIj^WYrA1a{(C2q>628%O za1J0-S9m!O+H+Yu4_XVHY7Sqh^N`9(zqB{#eR#-o``&f+73FUWDs(OrS~sUJWYxxq zDDS546j&<7?3)e=Y4scmzTZY%4cW$bk#xz46xENt$8uwiINop0y0>TD;{0y(CdFtY zcQ7x?+s#Z+1s_97=9RmWabR4M6s4Y;y~0qA>t*wHah_Fii1a&l&U6KU|EPu?IhBXW z6ed5(P&(;P;0_|%ABV!jvXYDQ;-L@uiM%iN-bEzgI!4az4lbtpGpx((G(WLq`@y1o zA~3g2EOzoMO_iBv5uDtjLGgC>F~gX*Q1Ki>9yw2TSu4YDJ(+I>^3wc?goh)8A5_9T zxWqhYmD%SSj$uN~`lr#}gq4@aFrVSeeARIh!P3m`;g|()+(rz&j546)8__)}W{n5J?4C)GHb&5%Nro-O!Ol$(4J>F59j}wW> zPqc7|PJ1&@`Mr6{+zC=KBcQSg6Y0u5M%AXzENI#(?pFSZW$mhOFCOsD3K)xMYH2}F zR)9HNG1*Y#*qi4x;z5tC-C9h`s`PMFl)F!x^8m40x<8@LYWz`u@KN;YfIka4csC90 zCaxr)Mq(uwk|b*rLS{o$#la)Vip|=r=HpU8#jDw10RVo*SBvdUAp3i@lvnf=H|a?Y zE{Jkv;mDW(3hq8fFHIsyxOgVpIJb#q2UZ%+|0IBV}*oneF$j@6xMnvv|@zMmh~* ze?EJkP4wfZ8?t%2xYU}w4s2;W?GT@u614#!@6z0RwQe`kyGEriH`%lMSw5yX$0N%w zzXoy)I*56+YbwUToxnT}Mwlt-;C_vBG)9;tH|{uOaYJnWX@75bLc9bbXaY zGIBImkhRT}QY`sU&PzL4TJYuNz`_*4cKHargENJLSbMUkj%Es*JThqa>YOUI@rfiD z&#f)zC1^LN(d_2F;ReA++GH(vM)IiB;b)#Wl+tsh32{(2XEE=3@s!DX2%HhtG{jL`d+tJq)c~D9eHMD6gfUHBzbQ3IU`1BzZ*cHDyU2of&>XN!rAK)K|%!?!F2IY}aBa3((_iKcri?_HD+HK-hXdW-Q_p{?4qR%w5 zdbBws7Po&7Epe5SIRI~kVoE$-b z5@fj3u~j@)Nx$ob!(>hGWtG1z;y-_cstVim0Z;LSQBP^+*hc^%X9v9|j8n_mpCKEI zO^I1~XX^2iUa}$sg>QHxu$@yOa5NJTHEB#i@QpSUs+0ygXn(8)XV;0T!ggqCs@r^O z2f6v_Y}L=6z7+y*glFtnIwUvx_tO3lbn_jt57v6V2~(%tkm|6k*N9VLpb7E5Ui7+v zvw{$eLQtOFR1rv`OhL$DvM^*(mH^}wRWy=G7h*~S2x`v#(@DnzAqm@P0!aqcRK=rQ zI!3||=8wy!n3xb0L6?rtYMPPRgKX1ABOc3^iF2A%8egV+JP>D9o+bBU{+i((o>GxZ zd9#7#>2U0gw%}MV4(QK&qBL{fj|_@>Y=jI&5Y}XXW6YqUXgJ=q70XZB?=vwY{o1lW zQ)1{;oz~6Tzju#6KO9q0@l)&@xNh{y0~Y7^6)p6i2zTe^QN7%n_8u>O1rP{J5-``H zWl+ao_exuF6ztj}t2e&lz{!RoIT`Dmh+(~*{#rvxcYELov~l1JYyl&kS*Svf8go-xth(vBKV^?IO}1JGayU8GL8u{YeKo{lQfl(!AOF{8>VPg zg{8qXanC45fMgq@GTZ3Wlu0RX`X;7UKMh>Ww8|xGNTLb#PE#Sn%Qd_#jgeM)?tr@n zwVqLqCI2(yWk~n1fXV7e!Wc0d%Jdtn+)w7jq}>X-!$B4+LVTer_1VZmuSXyeo0_}Z zBkExzc4uzWzOO>0q4dhiK3ERqRq6N*41a$z22T#GyQ}g6dg_pz0I#&TSIOv)1^5t0 z4Y>*nWM(~i#Biak24#D@?EO7~dLqX!OjzI@SaZc7_!UWH3(h!$he)SYH)lbS zQ39aY^k9iGCjuaKw7u-hyv6DsXjcQEo5LtoiMnUHv?U^65{T%afz&y9q69em5uoyg zBppLAtyM;?q$cSFCZ#`u7MR<=*=y)W-6s)F&O!!&6>T-ef7>wmun%u5LQeB~q+l2Q zynD|giMQh9!vm8q!a7DCZDrC9Q$-3HgCorlYbDE!zH(4r)p+luV*OSw&|=DEp%Sek zQM{?d8Df=KV5y=_p-{M~F&0-pb6EL{MvCxrd5{}Yoaqao*^Sn&EjIJHQa4n+-4}l< zYZe(rhxtJS{S;Ek%`z_{rDaU^j&3AYTcl4qmxCEEOT*Xc(#|fI)_;gpp`G<_BP%D` zo^DW7snRqPwxsIdl-aP@u4UJ&niL*LT;u#J@l5=3{SY^yIk(Qfy8N&Nm3+A z#_vPYk8>1@zb48Am~_cN$sl5Jq#1I7EjgJ$*;I0YPq~!R$_6`pqEI?z!E%9#P?j}% zRN+bnBokY&3GgC0C0q7?kh+oUmr}vM0NNQk|S?`Yt%T!Z>=Exs%#cF?8NiB+k4f7+!qi z+E9Jv4`_)pN3}5c^wRRDv{U5SZQ~A^-KiuDPBa59yGSs0A1j~Xw-b`1sy-uxY$uhY z$)3`y(rPW~6D-x6iPMMV=*y|s5jghXFO{T9P;n$>k0VN)DM7@7OOzgk0#XC_2_uvk z0P9^+pOMdJplBt1U7@lD5Qe>ghH`?P4a%r!V2w5BGBOE*nH#gDRFmcCvXZ0kWT9yvgUZ3yqd5+3z zf;2NT$y1#rOC}^%T(U~9vl7X+Ib@1!rJ77k-~JA1%ZkDJ;zzzMt0s<}K$FJ)y@g#qXHRI%O=216lu{sttt&`ujB^dMNcbB&%+xsU% ztWPGN$a?QVH{F<4JfPIx;Pmk_KhZ7(&gs<%BMYLB4Zfm5Wl#D_ffxZtA9Q|f1Vxne zau!SHmX&b2;2U=@ZFPT2>L}l>{>&aM$|;6LnaY|`Kr!YPFd?q0{lrIhVgclS!a}7K z9ss_=&nnziD9Y;(agWQtqOM1Rw9NN6Nrybgz^uUCuq@7jnM<<}Wl}6K`EL?# ztSnGFxr6-sMSpL$#Q*QQQ2%0L5&Flc&Pc~V@Xx};!bHcw#!SGO?PQ^J6a;F*UX~F{PI=wKI3IAmC)?_}@(H|EW_~VbuTG6w^Ox7XL`r|1U%OKQeS> zS0k5ybmwCBPPYF;e6AsHWMyjX^1s?L5|KHovi8{Q2tBv;8QP2en-9(%ECs>P*n;$8 zShd;42^CQnLTQE@k_jJgz3fA(y5!@83AB7k@yzyo5<9M}&kO4JNy_;`dErB4-j70m za?#h~H+tc=W+z%)+;cCTt4K$P;_?rtV?5P8XiU+SE1P=HZw&Hf=v~ixLYC3#oFVso zhueoLPTr`X*WNKnG~Hp1y6_>yeq(~Jvot7MciADD{5DKAWFx=cIASdX5DFiJ_XoLZygeB1C&_nfh?zn9C3z=w*Pp~^TlnYhg z5zLCQF=S70Nwx}Jj}&wsR!lVyTjyy(ANcS6rZ zy%~B~Zz^G|#vC~z9>1E3GgWy3vq%68*9ZZm#)$?KKjOU>FZ$_iA{(IUz7Ed2@+O?t z{>n@-(1ak4Cu0S=DIiE>&}PgQ#@#qxIWAZg@Ud+t#w>c+YgxsXInKrObVSAm%!u?!-l3suX>3r zS+CedtR+Up_~t;f`LxL?I>$n->THM2N{!cH%Mmi#q-i8{_0yUN#0E0QIU8J^lIYOG zg*CpsMWazV199Gv(tFa@?-;PfIvMw4C>D@Au|y6cYLy_=P?4`qs_bMBnk- z6X231?Cevf{>wN}Sp6`#V25*!Rgqu`T5d+O4ExUG%F4yn!-J4t=2zxk>p9NU(&dl$ zQKviO#9-c^wNfu-H5@rE z7ck55Q|f)+o_2Vkapg8ig=gmKjfN@I{jKnMl^JVdDP ze|I?lVsZHYKAisqGy8v0x|otI0qcLH@cefxrvK+BBKH5TsDDW-`mawBY^;pT?EjPY z@(!kUDnHo&SIFC>!7HG=ppN}}uJdb+xDN{Q7*h&@8*s@A15d4VAap+C=E6@fxu{jpBR z3}J|#?}3l1mXfxUZ=4lB3vY&yJ)@|ksOS24E4)QGk#g}h^;C^(xElW>xU*OKKDEQg z+3=tur|=SvNEE9l`e&Q9{#N|;KK0EnPaQskY~HuiU*o0R%lG%F_Ud$G=QpJgS+=|# z%>E-Pm*3molkY11JBspvrPho686Ez-&~Nbaga8M$^4l%M)q2Rca6!rlCEh5sWgkBg zRCZNQC<4`r&=&&O3uwQPuLZ#u0N!Zd5ORg{3#QJbT~Kw!zeR-4_{mVv-$vk zWABX;s{o}+Wmb+=p8tH7Dm_!Cqk^d_N?U3&DQ&q-RTX+spjXtY)K%fTYGs4Mp!^M!g{czI5+Bht30 z>%!iXds7TQFMbC2hT@yWC;y%J74((WE4Ei)zaaeN8^$mp!<9TCW0q&)l)+<0r#ww# zM3rftc`So_XihYZRhGLk-aYulwu6tBHhA-6f&8tDePCWTvK4TOluZqI%dGpdnxn`nk!`~|&H$LrQIurE9R2$f?kWbLA zoLXb`CfX~m)@gzoA{D@b!1HWXhr8%(4t8nPwShS^NyT3_kZa6L*D2 zZtLJls*%bSOTW@y2{-XUsYLBn_9)}E0>VI*Tl#42#2lRb$3xi~SeSVt1=4~5f->XzeG2SRj1 zN02L{a#hv7Cv3RjSTBg5J zfV@WLmq&18D}q!&0doZXgtr4xSTQ8O+JPq?u?b<7T3!`{9G6bPVKph}egVLVz+iJD zQXoX)Ns#nPfpl83F=cq>R-WauyeVIanUi~^FS zCBU1ZWdJeAF@zdK^`itk1~Q5zf$T%}BL|QJ$OGg7bZZ0y-TmtX51_gQ*Azbg$Ov2nRqX6X7xNUdv&(BH+)ss0ZO|cl z_i<7oLX)Tykg%QqkbZ8Urcw8H)vns(i9Qk#piA~`!TVdDIFd+e)gd3d>w#)js$Q*h z>EqObQyI7oRj+lVN-b2SxTtC1F!-j67lj(`iea>HQ4Ael1(KS86{X64!0IU3_$-{M z1U})EqFBwYjh;JF%o1V>`fJ8Z;Tv9@T+vm;*Ch$e7^%2#kjTG8aRmTFAy|(V1(%#g zoJfISUv)=MRo_}MD^ZzbyqKBN@tU$xQH9p-e$T9>J(I{$GEv-oQOrC_{>xt~LiC-I zt(VrQSNe~&VX2_v@q%cpHXMe~A<{FRBzxZB#!Z=l9oyXFD0QYT>;|eTe|>>&D|jlG zZY8VvR#E-eIAd@=0a7JS72=sid8Sko8cy+E z0{HcnE5kqD%1!6DkjhA%$jV6M$U959)g|CoI69SV(}Vz$jN zPluj_o-jQMKE9vCPovM|XZEqeYekIMO|%?oo@i*%;--D3wb9&a&}qPy{10er{YJah z5`-1W)cWa`u$6ZBDN_92Zl1M>~No4X{lYRVIf)ggyd?@jn<7f@u(^ z_r$rlxK1BGbG#LYPPGT}pKaY|8bS)L5Sdmpat(b)fmR^sj)&FFX1jsj#?q3eLHM3O z_MQK3ASs49Mh!Y9P5&m%qG(DP-pqmTrofl7{j0U^?4BEI;M{ZBx|vt~9!0)M5>aoj zJ!w_lcA`i$94D0ipjkCtK*Gq|$B-@znKiKUCO4FhGqP-g%P}c+dBVMwU(r>7Ub~!l z9HfpSk7kl9l}mnU;&kqlgJ^tjKw7;<`<Jrt$?H6Y6?5thnF3}*2J_>rMW6KwsJhb$g-s5D*k-aQ_I<8 z4zdrSWFD-6YSj4q#vwq&G9-|q8$=N!r;H&-s97OS*b*xzCS?N4P5>?G9WN=kOf+do zsA%B{cB~4V;A=;PBFL;n^~R`vOs3O&cYj0Md~aI28I}QaLIn^jv%T9PRIm!c3o<7v z>QG8+Fr9$f`!icfPh4DCY1h}7#nkL5x&tFytX%Rz$SO)s9X$Spu7u)pkj@sYlGjN8 z&h*qohS`P`;R25cfFg(qWh8+{M|eFY@t$txef`E(j0Py>Syr!q@cPO;7U@d@ z?5oN;kRQA^Tb~PxGpO@+6k;#ATgf$=cDu{3gRB>{6t<0HGHG>0Q)<%C`k@gk;E;@6 zdXvbYS8%-GdSd!fkw&C668kaQ^%4l6;Vmm6KP-rsc@s2BWxaj>-dqIF=%4S`Cw^YY zP0(S-2v)U+1f>_P2sr{_22G+=9>mYhg9w^8;w0fC1vq%I`&4KTfX}cRb{wF)ssQ}u z;TVjZ|7|>Wp2)2}YV`EAFoc+kH&M=}Y+M=gnEyJ^ms}D!846Z1^nt<5&-J79qx=|wAfY1pqZ)zuxqgnrV}x_dJrayduEVC61mwNdVB)8n7@A# z0^Dlh09!gEC7sfI0`q1MV&o+gd`Q8zwRNY~l>e9N5(N8oo`1PfGtrCxD+QLR0T%D` z13Y~Y3)|3%wI|@JhW>*L?>f`WYSu+vExmj2b$;KeJIPBew>oyzOjZOGR4fuO(uPcB zdq#BikQm23O)5;fMxPBQo20>)RajP^FaTQ?Odf>iv zHg>yo9o$i`1h`70wfGxyGTU(1qx3H=Ombw?{(elyOrb-BW(X`+->0MqmPt5FCCzj^ z^1VIu_-+Q*mpLid^Xg2=WZ1o;G3i%G7V+evui0Nd`0OdIed~2uM$-u!3^xv> z*U6$-!U%?Q?(atmDL!fehlWsm=A5-*SB=K;01tkF|EH|=9ryKYD0pP(JFi&W4T&A@ z%i+$X32pvseu+i}&-CZM8+Zf7hCp;i)>!^7S8v|d4lUO+^EU>Pq;YX+G${xPo-T&S z!W%tNEKy zCIEkBZ6CgbMg0yd`%?F3{Ok5zQ&$OA?u2))n^a4}Z*Aa(Aeg7@4A!Uv zc(1+ZUY?a~M_2Kyyw<6Jf_9d&YQ$?n>ZjwbFBG5q$ z=|vB!%!rUVykgDI-H+R9+Q+D70xN-M2QWR@6J$s%dQbyCDG=0zhz*jQqVNN8<>CW@ zqnHq#$PAg%syXS08k&iQUFhd6Ykb=tcr@(n>#`-Ly2@vqvum#k zw1j6nuZ}Tm{vG)4TCtbxekb?7P!7?}RI-ObAOt=Pog^>QS_zXh&7)+dcIr@962|N2<9dxoJ|%sFqTEbGjN^^l5LwtPV)WbDm9%yS z%~bgurQV#K0h2zIk#Oj@BvlO4a3=dafutyK0MT)5>J8xj4xQF)R9Qo{4QbvO2@?iC z5`P3AcoAM+f#0OD3=w+zgw!I!)ZZknUugWL%k?p;%Cw~pOpioQe4aR&Kpskj zC~CASEZF%LevRr(s62&^comymq`t$aqlplCa5w@c;89MHn;E6}o5jRSF38A;5w0?e z^=bk79%JBWd1Ur-X3?J&)l#cA+gLxRl6vFdYSB=Q$2P zc6IIPw5#Q;?J!+piCW{R{mY-=cMKl$6X5>o^1X61AY^&`C{7df9e&SGk|h2$g>^^P z3u3pWkHlWVtWf627anZ>6CcB)D3g-Rbt>UDOQnfg4ai!o>_GNT8eWS)iFGQ5$S+Gm z!4r9>18(C{Rc$c4v{vidcfq{um8~%3!QkZsa2#BLZ(fxIx_kf8^u9P~zxHgmhuU*+ z^t%ed1s-}xMk{VUV%&@=;r2wXS52GJA}RUTypoPdQinyB0Z_7daD9vfz^NxqyftKa zwg;4NBtEKGzojfMM?R0qwZIpLvN7x0 zXg4qqdYqtm@%Q%wPMM+&6j=Y(0tERn(V)&0Q3FEdG85C-qPp$x7OS)>P}~f>2|3IX ztYkp$vu0AqEO81hth|_m?HaXCHJ2+lQB~9Vbe;j8DR4}GE+Ub?$!{W@I?^+a^Z43f ziXD%wkf}qKyEmP`q6pnz8pCaja(@s{T=L9zG$`G@hq?;NFUD(Y#a`7NC>8kA;1eG_m<4U z7i<>EqgXUaX?kGibm*j7$F|!uUptWC+jKm%B%E1r(HFLtnVHPy+~U-=+EBo$alF!5mrXiy zVm(yp@H&HlhfUmn7Ag=jDnaA`nTZoWarq`!di_ynQoD1SZJf!GE)3*-Q>jizj3fq5 z3gQqvPjpQa!_{Il(YD)n?s+{=4}@B3bd&r~<|N9VoH zp5e|Z&XKjtmmUB1&HejiYQqy1!!Fp(V?0~*(gd{A15I|w76p`?XEla6Xnyyww}dY@ zP%Q}o7={Q|LGXz3$ieWqDtN22>dq5Rp6V9PlA5?o02L}1Y%+w2a2_t@SBXrs3y|Enl?)np6s>j| zI_<6HS~H0?W2=c|TFtSfR}&h2BhJ*r4T+l+R`~opiWUZ$Ng1F`6v;CopfhXFLsAa1CC4>kscg%Q*@-kV){dj_=K$DB0hXLhp@mc z;U3b;qqammt8VeYzAH@GZgh!JU)*eb84xB4#bZ8-i9g1-!@~~Fm?L1^baY}9?Z}em z+x@AT_FkPDenUW)&oe!ZhH27F?Aw<%m*upOndme933D7I%wVW|P^m{F#qu0v(N&8G zWg8zN2|t1?_{1CfiP#Nn^7GtWXfRKi&@+9`E&1h3@4~n32j^nWuzJinUiFx2J>Qkl z8M9q%&rYrF?xyV}17&WEqT#0e#qbrWQ~BRiKwF`Xi>Z2cZgAvog?#h~u&BOcdNzga ztEh%*pI};j2qs)%uFf^HE0vWaNi=gN6Wohurcbq1TP(AK6Bm9v(x1%Tn;gv;)6WHt z+xTt2qiZLY#N2~k{KT=5!mf%XqQQZxM4y{v~E-i?&*owH>y_PM#7p%xX9r##XqN#8xFGkq+uu2 z-CEmkCg@g@L0qZZ@?6^XH?eHzTuSoW<4+wEHqE2Za{kuOdBWSjd0owx(k15$t=1}1 zW)62W(o9A8CN-44!+B@9SU3#n6Qqq?SBtN+qNvs4Q&E$?SPbdVLONo68bQ_n)!7ezt&+agAV&0OfQdy`n zt($*G5={9nH!$E3GXTT`{<6%&_rRtF>Vtucq}r=0Te@uhYX% zh;JF$N{VjkopoAiJ(z?WRc0?C8*c=u?$YDiswf1sUcrj z%~Os>z1Ec+OQ9xNuFX_a7|eqkF7|_S7vg6hJjEZG(s5K7X-hiejGJ9Z#US2*`vVku z;Vq}cabo{FgO(qXMK))q68$Ne&qZA2c8tp13Mc`0&3VT0E;+gz%X zB>O_*=Y!a8Ite|bmS(GFAxR=8VzITJX0FbJesKv0#4Xb;QuR<@nsrkNDRY^>H}MWk z3e=?cbOjvz`Vuu3qgt?ZxgQO}w?(yH>0n(?x>red*xuCvnHe1vhxha?)?7F2yBkA+&pg zX<_SiQz*Cm>A3wWN4ylpyipu=mzjmrhSfnA^L0DEp)cO*u_|nQj0q3(Pb7wO7$}Xx zN=nB?Zyo*$8TvBoW6Z&{h#al2QVn(aq25|`+4RSJ>eC!iiJwIF7Tvw68jjH*&B{n( zE`YAiygn;RZ{kKCI~h)&PksYmt+id=j%a-{8mauX93fnZ!0=YDzDSTyXBaJxY>}Xv zB{lw#Xk}l-;s_C4oTG6X0YsvIce2H#7yC6WG(sX#eq*~ymC{@yw)mMmYU17= zYlHgI!uj+tiX1yOOPLW26N%+tv$7Gx6}-LCbtad58!e8m)8zU4+=GrSJ2T2mITFkF zjMJKF3x;K=UDY_v(n*b{8$&Nn9xm2(EQ8P)-S;P+L*F9-JCoHc3z#OD5VA+>@5gW- zCXrPs%QA2YyAqlYb(26a8YOfB% zAIr3SqX3ISW$+HWit6gwmwF z5If=#Z;if&*&v=J&2KNEoodTS>BPal!JrETD?ehiHfd+&Fe82+517rXTz!u0876A4G7HCHg z7z2EQ3b+%TK?8ij^``^Qn@9I6Lv(@%ngdt>3IK%AdZPfK0r&tY0IUN*0PX`20M7eD zI1my52*3!i0}ui5TEHX(2kdwkW&;8Mfg13)J|_mKM{_&igS&yuf?UISJqYsqq4vVi zk9MVr&|qpjSXg@B-Rvh5a`VaPqy4(to3gK|AhglPY;N)-?R*e7!gahs?Gz0`7Yk#x~~8n9r|!lI4Gi@=MTNN! zRyGnjxEPj=)QpUcED{kuFhC-e%+blNk$J7n+EVek zs9FwMu3BzYQLLhV_PU6^Hr>i@i*`3FyOyDrLN47{qPu>xSaUzWKc6_SXR0&dnS+^_ zo)BTq)x>U=YBp=eGw&h$EkP}zSVE%2SDCvk%_ZF_>($9^IJbGVYNOW5vUT6cPfjeJ zdN|#Y@kqqZ!Oq7{te(J~_3o;ts3)suo=0^nvs?O6<|Fmx@pb)S|Az@W4y^&|2=o-n zPoF`3pB9FGTT7$qHrUttkLi^q+v8Te{vWKjPG$%37Il+y>w;_GipEz?=bSg9I8}*Ok1OHTfHM@%GN*K+-%<=iP zr)&+_y>=nltL)a=NLp^caBOVTW;If!Li4?2fHWx>(A4vM7K#q zd0lvY^pqvn^>+Enmo~_dcTt&-k38UU{>h_Sp2T1FyK#s2)W zZJfSh>aOcF)7guyeG})7-i5s*_QLw|a+r7+dgz;%PZmT@M0W7gZh9Lo4JSAEp*JU} ziOtn?acY!j(ti>Q@_uz=UC6#s^g1x}qf~=K142P_j_f`H?HVdH*L@T!p`fj{eM_j~J z1ywiTn2E!tgGfS&JCjbjY4}ak4F<7&9 zuqB4lQF7ue&*GoL2}?Yg2#CHXwB`<3;drHX0rv!9pPpuSJQ&gy?kgSX0-6l23lAlrtvi8h6(noy_KVCxh#w*YE6+{|7=qy}zJL@E!wQ_%1wQ zWF_iD=M#vX5{f^LkI`S9;+TXkWocy=rF83-pNq0ZLbjZtW?98%fkk{?3tz!ai7>3? z9boJf)iY#p9j;bZr=+RqaylQAiYk_dW5g7vvk1M3n-aqpaiUtRSA(|t6C@2rzFCM# zF1b;uZ+Xu=rv?OA;OLW5R^-WvH5E5SZi|qr!wm z%3aD)j4Ndpwb{Fwfz9FR8`X4e>;O%9#v7wQ2T$Urg#$E)LTm3furzd4wF=W)G^K4s zY!OA8?!eYSOiB`Fb5Vb>zm90{!BU)%P~vFm{^0)BNX6uk7lK0&))bvGANij>)D{1o ze)sO%g~CT+&AXp5+>hiB^2hMQ=if6_2X-$1LV<_S2z-I_4Ma{qLrUfHIP7M+Fu#S% zI6+34LJG?3?qW0fH2zUx4OS&3VkLXC22BH6buckA04Q_ zOC9A~gjBdA(8`liG^~ZtQedE~I|kThbgm9f&{6Ez1=M6JCgG_-r3aqEO)AYQgGSe{ zKHX~+xM4!Ajc4sPcMP{(RoZ2PM!W8U){Ip^?Xk_tE@19u29tD9Y15c>Mu*hH*L54X z8nzzsNMLL$iG@AQG_;S=6bq5f12P-z-|1gV92_J#;hcD))Fg8q%rBH}0 zhYEyDDiMvXq;>`1%stQwX7;+S@kO;|X!0933o7Ua8m^_qMnx6cawW6qD@qw7VQMjB zf(wyTI7RurIDvWsK4v1|O91DE5vU45dx)nbxLGEzn=92NVEudEMUprZnz`_bcQT5H zW_{i$7WDYMERN3oXPcgmg7m5z38U7HVcmsomUIQM9a)GFdQqtGWL0i(7s7J659I zZ{0q8(Y4&S?L8(-QR; zD0h9Xv9JR2_o$bvJDWb^qvK~fm=oEu35)1eH)^A%aYu~S@HtU+tK_i!9pMxZyn z@V}$gn&$LcpE?v>S)=)PX+y5%&A1jWqENBhI1K_0)^oo5R4z=PfS7{U1AHLVMshg`Vw4@T}JB{gbh+!hS9vmRyN)O!w|3Oj4#x=xRVl zGti2H4k^4A+B=g)fHP%2mmddDJJ{pV@fg9p%#1^>O`+~fr@S)}l)~p{r~E{MrWMLe zfr{NMXo@Np^lJ0<-s zd&MDZxD&kTT(*8--Er~lLI>O*bA;WX`=ld*u{apFPb9&pog&y_34<$BvFkbD^fqM! zCL+jf>I9f@TrzPtNGityR2acS6tGX#$U)eD-ii`@cvcO|M8-^+7WB}G1>~^|e zu(tc=TK((RS6xUdObJ2!oAd-5b`NAncub)y$+!mnw&Tc_|JW zNV&7>)l&HyT%LzdST|Pse)Z^d|D(@X4_q`2p0a8*>lmc z)a5L=VvmS;hJk6R6gFZF9(3%xxoWrzGeedCtYDK^ETxV?C<*pU>$$W|1MtHb!!dhPJi zR^Qc4Yh%0LdJmG%z4p>3!Xw$yBnrE7hiEKJvtcGCpk=<&c)MY6z<>bxXK{u_A{Z48 zQz^f19+{awg}Ng@OkIJx#)SlAjWFVRW?w57?`}!5#xGV4PB66s{LmuIl!_!3_w#qs zWw^7f{$GyEEx3)V4&(BeT@?+O84FE$z%Zro0K=sZOxrXaN+3*tmLz4`BrPsZoLIKw zi(>1t(%!VvO1n}U-F8=dze%>`ORS4;xrelnX~Hx>W=IO5eSiQDzzh^9T@iH(X(mj3ix0kOP zTZ+OjtFqnHWKI($PBS$lulB0OSEcsdzOL(Ql!GN;k1f~kpgrOMgY+r8HINzq32<*JWWH#U`nyi zTzS*^wDZW?*05)FW%~`ml8nkP^E>Iv{8rHXz6#WeuzRNiK_;{iTU|WhshiiW7D$C! zSejf zXLSd^>TNr7&YyfM6vij9Vc<1trDW8 zWLlC{p&@POE7@~NGcMsQkT@C$oSF=$B4~0hgwhmFBrqDHh*>fdF2>3jm}PJKp3wr| zNC|MU(!EM};@jigDEMp>jVqWah73iu{@ zodhDy=~;odQ=(l~7MB+4s>W5#ZHQ~+H=%}`v1yHx1C>)otN`F82MriXq!#JAeh+@% z^X5(GA!M-WnfEyGPS^EJFWa90?i6tLv^zeK=0$>uBk5zoZzoSihcnUObD2OI%b=jW z;##7@Ue13|Q%*zP=Hbr1OfWaYA!U$3@r4p}88jm64!Cr@aQ)xobr-mctU zxg%)yilCK1RoxDpbv6%yUivQOG6$?Ov?m)%qU^p3!r6w z*cpNSd1%>puaFW(O|4B27TFGMEJ<+oJauG8+og=wYXNf zxj-r=P$~_LxC=+iV;pKuFNRi89c;Ohv&+i`OG;Vq>+R=mpW907q@#ywDeFKi2QO*KYU>)spgynJTFQ;y*$FN`R3Z zv=2t|SP{f3!ht`;$t)s7G#oNuiB|Z!*o!I#x&ZPD+JH4Sfq@G}qEnghq0f;g4tM&< zQ6fyw5c8y;O3IiadkoAB~_@Ds(A}gIO%+}SDO?=E!#C&;*7Gc z)$>-S3U%Ch-xj=-;qlW%8tC*E4eoS4KqTS_Lb6)cV!$!yTcQOP?mX1_i?6o+)-`?{ z+T~6KsVIS-U;t=g93}A^rVb6{?Mu!C>FEoCS)c6LpYu5C=?9Vh4`0sWOugQ`EGvqj z*w-vQp^z0ZXQ#}#hKbmNCYFvRzIPC#QnTR*gU-I3ie)0XXc6UbEpF3*)9ivF$m&vA zmukyu8QSk=QFfe3uwjOz31*hY0CkRIB*4@W_!aT+0;ZETC9@LLbjv$A6Qw~&0zzP; zpnOElNez)x8Y`13WhC#;$T^F(N;l7!G)aIiIQ@K6c0MNl23mBp3n4j9A!DJ57mrNM zBXlqW^6i}SNwMqtPj6_R14DD;cE9t9_M<-0V1|+!+GDkFnu!1(!!*ibpr<>m&kx6` z+`JG|5|x6kD@M|S23CibfWHg@OFZa&r2X(~L*DO>d0uxuTXV#pCstlV27lK6lvi$l zr=9Q-5?IuG<7G6;l4vv;Nd*vaXivR35go(gu~bAssu?p?Vf9!e^v8V)YsSx~?VKc0 z3iu8cp56K4I|xUqva+&p#(w{GD+R*SyJD0Yl~qu{{0|&^#B*_T^+5+1Tz5Wrxc%|= zBR=n~QMU7?ap*A^6JkX)O_8~XMuNGxCo~nP4tw9*6q|}&YN@Y^Q0Gc#pYNaI2Dh$k zN}DEU#soAogMA@(lnvydqcBbb6XbA-f(8-}5*+Hf{sz$1gSJ24{on6;hq)gdMawBV zv%Y%S%3VsELK*Nh$s@&(fXUNm0E)kK9aT@BOKDkiY9R`Y_r^SvL1;o}^!VcVTl>Y( z)k9^h^BI5VE5q4&gSN8w?7H<^4b1hxE;;hwCz}7Kxa@zMxbHY_U>9qr$`YL1iE5{9 zv=k`6z*;Djt~^6otCrF-TBPuh1m`(%{BRGp&pw~ePm$w0Kb_Baw$F|elSjvP90+tg ztSjxr)GjOGsZ*zJ)h4Y|(KM;OSeE8}^9Ou&-}`(&?}rzF9wVsYCG;w?q>lexPljy% z!$UR?i}9pHDLzq9ifLYoU9UjDQ19#AB-nFn&^ltxUy6HWGUG|}^r$24&IHmvl%GkJ zl-cO`)ZEy@sB-JeY-t2Muq|^T)aHkfulHjeRF}o+aFfGC7#D1EESch!w3tq3rEK(3 z7PPnw%UT$s^L>V(06i^PdMSzpCm0-bd#S+`>d#N9XPTO)Xw67dvk^Q^dR%>NUOis( z-uYV*`76EB6VjLHjF6N+Q*}~RtN})i&p>5uv;d-medL+7SEw3BE}2QYI#O?ohzB;BUAAh7&^g>JLA5&fQa59;V+3_y6? zh2-vqm-B|Xwj5jThsIi>c$EPzITikdO3HaQ7o1DXNwO%WbHHo3d~5HC-d-ANyxsEa zg}!m)jCECWie2{QTvPUMp|7-=2jj~#_o~aWT((k}nJ7+=&MAfB{oE|Odhd)&8Cg0x z-jyIzZG3A2gBqK(-ZuO-s>j}MYd7^nLoL+pRUo|rAz#svO1vUh#XDRT8r5QgDL^JY z1*p5FPX=~MGCnggIMh0@-(_=Na=qs?_$-h`%e6*{v7sCJ)wz6nXKFl?FBG7+wcPp4 zNvN^yTm7XWm+Y@_N^+hXEBp?aLS{@XW~Wy_SC}5Z49sbg$QeB-d*0pA|N6E~knSAJ z!pIlu7xkU`%_vga4kL?4VWj#d;Jn3GVciz^9J&)m{?m!-UPaUJx|PwNqq>L9HNZ^H zqY6Al&8vGEU=2T_H3ZshKA|;E6zuKtsz!Fv8Y_Go*|PG#m1p$s7#^_kZ6Q~%afXOz zlZ%1`I1Skz$tyK36ORN60lBs_X>1TZbKy(3^_0kk2> zee6XFc*SYDJ&29q5kjyhsTgSIPRfs6>zBL}BeT9-s2o+FmL2a>2F4L0Y%khFM8Fg} z7bJzDFzFe#h6yO+&JE|n3ZDs7czKv5t||* z5Tk%19)eHuzKzKy60fsY4{x&Ill=;=AMOhThStMrMVWPH8yy|0t3&XadqwI+;4}Q zn)R#mf1lP&BL7lj6c%-vR;!F)iBwg@HA5}OUA1C?+sdL=o3 z>-+3)jPmw~B}K`R@O&WSmE9u75dqTEi@WWEgRRG$b{9e6&WnTR zAga^V0d%_$^adVFcLBqQ=rC;X;0pt6gd$0-xD!s z))93`Oqx}gj7#>R&Y563k}ecL{)$|7Y%#1PB&k$Vbsia7($bT@lC{F*u(Um6le!{( zwjQjzk8}<6nLCZW0o>S28-k7ml?170fvZ+{`nr0G0Ruk(BUgK21n)+XxtCC#3tguk z8PF@wqi$HHB@)tYLv;%&tiEFqR-2Q^-4$>BS^W+eDZYs!!YLTJ`%6^k3}H2_z7^k~ zuAf7UE2H%jdM1Ejr?#8BT&6vZpLHDWI^=Q;oOU|A1mpCV0l&J`JnI64r>#%GpEqOyh+fn7aV&(1y=LuV}eWXusBL9kmPtnUvF1z7)xY$39lqMk2HK z%YS~XKJ%se)54S_LY!8q4TC*a4=UJ72v<+w#cz6dG0Wq&S~D?L^>5A!@IO_4&nqWmE~AI--X z`0K%}FB4ArMxDvN1mtr0NgmIecr1u{F%QW&qn@D6d>}xO2FhUTvi5rWoit;k=s*T! z3i6r8x4O-~8l+y*(kWZa5_U1(&hE3Oeul8yPrkwex^&?-O8jqX8LDWJZ!{@&4OG+e z^HQ0U{34`#2|iNahp+j;4W9b`3$X4TG_-PaGpsw>*jTD(u60}m^9q7m0JN=k)fv56 zaCj*PL-*nqC}((xM}$u5AABv34?Xhh94%IO+ZhjB`1n3eN+F99`mub zc(>RQwh2_60YUm!=r4@pq%9~(U$3uFQ%-?&e_+amMm59NMiE; z9G6>c+twY%Edv{fy_3VRp`Y#mSxEq1}OrmNc~K(eLFLxW^lohD5)yYW4?;)_i2 zB2knmiIQPSq)AZ}Nl}tzS@K1RWIK*?YkJ96G+B@|O>b+v1p_t&849#mFe>FR@3>Eg zFC_jr{Qlqf`wBh{jMh9gvc{&&yjE0{c{1mIj3^)%{qh{j;F2`mC zBcaC);w|7jXnp7MgXb>}p7(Fc?$V}T?SxEKZ91CwT^Uu-BRZMc1OVmL0Bl{IP=D2N z5p=hWrG_;+1@n;*Mil~FhpcJ-f(kt2ww?;M6FW~@PZKZ12EqjBZ|h2euC}feWPfig zNQj;sotMCwwvSnGr)^e{rC1?3qx}g6@~!4$QeD(0A0#b7c29n?CK?5nM@`1w5r#X#-jN!c*h>k2elJ27N?><_E0a&`AIV1 z^L6aov} zaQ@E!&LOC-r%>e1eE_ ze$P+n!Cfr;(}7TsmOKivme!?oe3?ICwZ=ST7u&^>teYVt-GQEyySO+dhN$>xY78jU zY*aH+1;JRj$wMg!#q6B8R{bKqqJAcyG8R^aM*5VHh?Qrj;=s8RO(d}r_P__-d)J$# zRiwY!_MwYn@CZeEBAhm*!bH%gbgMy4$YiBLYSyT)-GEBIXFi&fW@?q{Vp+)+ z)8W43))PTbl%%$UZT1pjgpHIgS1PKU&hZ5>ZFlZ->_sOGY^(Xm!Vns95SNgfUz^Xk zR_vKul3`qxjYI{Og%JmGv(w?U_C7e`Z4t*Dt-Br0b~NiiI=7)n;kORw<7)Hd#{ZsR zY_bEXzX(xsl;*S0K~JwM(`@Gf>o7ge3?ze0 z020c0*ayPy&2kaJWlUxByj*};%o}P$J}YTTUCDq(^HG-`;jj=vQv>ed2?nSAdkzI) zw)Bq0atR$EpQmeyTw0atQZA!Pnz$wwipz>#uFR_Ggc42@;feWf;G9BRx1-K}^u`Qw z?`a2e?;z?-p)I8|<|7)~x&v+@-<&w;Ky0Jr3uKP0ibK>rCrcP0i(v25Dfu zVUHCYTsP>pi&T**3-ZNGef9R4_s?F>m$HR&_44J?5}hRDgTb&r;3q>2?(>oKSPvNK z3sEs2O&;BekFZf-e&3#40k`e^DokT7T%>1!^S*{P=QeCxV5OtcZ(WaRn8?~Gi2aA5 zWq;DV-mJQ)q@NAp;fWAVun8u{oY;TtB?jZ*r3@YJ*^Lc`8uaJD++r8Ayp}Y))qq5B z-f)nZ?&CZG=vjAPu^!s}RJ@XG0OXVOiuf;~nphAtS>yG%%4)t`B<7!@SdL0{u_$sE zw|-2u$NCdvp(6sW2J~Q7%E&X7QcYf}p8KQOlJI8RlRW^rEgg|Nr~ML}jTwA4BN*|r zSjyz3rSc_NN#!JcX1;dASe&V*)Y`g`14>RP0q0&v_`fYf=tk={#^yzl|Fk=hZ+-*M z%IyTi!am3Eo4?*8%#5}o#onqtx!z;jc2)%@Hk5Y$dH``5EzY6y!DXur- zg;dP-_;&^a%)m$j#Nl()A?k(nl<9OR%jxla@@($!)9^Cn zY%D)}#W)R$3u;D_K*=61&?+u33UC`{>_IK8O;^B|c77S0vrm6EXYPTtB2ph^v)k;!GRWg6@E$EzggivW+E z^9))4C%j5y+c=LX4RuMBbzM|jq9|a(?h&MDjM!mt2avDT$&^+lnh6DdHAQZNYA1BPiUzE!zAj(xs{Z>cV zZ}`n{=FNNCn6Aq|0GAPdinaSr^WJdZz!A@@Ooy+t=hYC}_gV;bpAv|`AnoB@60QU_ zF$I`y?jMk{0G_jb^U+Rd`?gJJAeVTIZG}8Gh01ZpP@)>G#`WRpk;&prd3a*1Tr7wh4vd%oAbpVd zv7ew@Xbc!Fj`X~QcQCx43Sm)n%G>Y8ePA4DB7nqDqb=DT>wubUVmH)b3%3Q@xi+d5 zZ>9ZYptsbz>{|2ZL&Fei4d5}X@U}$VJ2Ww<3DB@LmmC|7=}H+~d1YFA0)&qEp`ZdH z;}_k|%zK68+H^LqCBX+|5|0rx;k>#qG?rT#DuFJ%QTs;i!Zvf)+U%sg!TkHi`wmVf zVnmqqpF9}Cy#3(U@i5TOo_#_KbjFtOW;7a~2>+3m@0cIVhH;BUp-5BbuZr;2tOwlSA3uL(uJI z8@%S94m!g+I}7PHN8d7mGFc5IB#ZZp4n?a@08 zwT6xVIPf8oLVbb{B|Wab{sEu{c#L7Yo6%>1f5IcKDRwMIu0m_JxS=fR)xvZ}jvEg@ zm>N?Payn6j%&(nx5J?CJLb8+kWfw)BJ>q(UX%{-7F5tRU3JB4nH7h1E{m?#hHvBj92hIZs@FVx;_G*8ZLSz79haTIXOJbd3Q*M8)HpBmBi ze~yiVU4!rEZ$gi4LY14NXT9UJNU{PD0=Y{mZ~jd%=V33n#B3{%dt5=Bp(!Lla9nS5 zl7cp$D>!6U4`mXHJUl5E<3?^Wo`Ys=(dEz*ZZ>#l@Ce5R2#HZ$sm@p%)M5*^a_u1m z98ZE}NFNqtJm7Cqax5~7G=8wSWkEO#?}Yc8s`;7&k75DP`xq(G(e`kg&@S-7%YGCE zY7EY?4U_kF9r_ze(w;A#W9UC0)>>SsgjgStD_|`pHWv$o4goP;(Fruz^VaA!4S`fJ0+*K1P_zmA9$Pf;Wn4~CFSz1>|*ptHZJh2#hU>ar3cf(MfMqOC$eC9Ce& ze53t;-uHBGE>fT*gVD~^=B3nT+9-KK4`p~u7a zL{ObmvvNMG>B(Ys(zttLT9;%+(xYib6)PgNG;EFMg#z@+2{YqhGn7PKMQDLkT$-=w zR=7fU@sfn+n2AfYzp3f)v2NtWJwV!>J_gK|H)k_O<#ehb=hT#(NhwnH!#`B>mFl=L zqe9Epw5nu6SwZn8&?J#|jr30t%D@6v31*=kP4+wLuTjAcKjh5yjTaoxIN?Rhb9Q*i z^12;f;NAlI@w(-J-BUZX*WP3o?B@A2y#86_0tj3Ian*X*wF7oDR6F}^5VkN}Pr1G* z6yb+!pQk-sPkXqYcJ0%&hXDXK|5dfa*LSx&!B=|#^hy0Kk3Yj)2ar{OxK;BPpBGSvtkfY@OC7QTAm+2R zUpe48?l1tD+sps=IWF_&4?k^-YsK7|`GUkC=cC%GgU%M9#LY>>K<EHK_arqpRURwF^q|OGC4#sw;D^lTZSWEYQa{=KmL0wFOg-%O z-xAr3GB5oJh-xTrjr7F5;qyZ%V3!aoHZ?l|3}p4aat3sWdvODEY_{9F_ycUNnlOy% z?6gr%6jEBk06XwoveG$!88P3T9h};-d<4kHZZ@EeTb6&<3G)>|m}|{<%N{2jEo|WC zyN;%GOZ~esKK_{$j0jS+d55tx|_y6fl}C%kue%aLX$L*Y#K>sPOGH0=-KEHl{Ib&PZ| zbXQow{LTdF?F}Nm-L7-ZPKxHeI2H8Ln27R##nJ_Xo|%c~^>RYbX2);++@99X+0~4w zXB1ISrDf^L6)kZ`K4*WNVt(Q~1i{Z2eBVn`I++S2IE95kaYhWR&Z01zfL5)gOe|H- zNNFuOnUds5RVmOC%CvDF3J-Z{PXOgQcu*63ywDQ`Vt^Ezo$eg3hVyRFre<*wC^k`t zR%}DXm@cYn3^I3Gr{X{-7}k6&FN_8OBW7Z`;BW-`A#)WnyeU4m^ubAZd@>{s4kpr|9ZPXGbp)Rw0 z9C?jSd;dJji4x245OV+WTxyPwvk8$KiV}g7N9vFNy1B#J=7R7li{BC=S&BF1$bz!~ z-L4KUg%>k7xhXK@#-;JK>+b*!qJW@xE4oH>3;H8eMwsPN=^wOatn>tsKSp@tjgh&x z<>%()&5Ov&c63I5HV~frG{`a`C?Ikf{`&cl-Z5nJU^cDCMEAM%L<6zU((Gt;w>vEm zLfOwaTdW->KhBY$emi6KcOj|TDcba|W-aVDg>iw9DBhBALC8wpoN~?h<|BDN>CeY9 z>3BFhK01+~2ysF#o(=N;WavX^wwe)Lf=_@(74fT>CAd;aZ$gWsvS|l=^(9o^VX9bL zQC?=t=3)7ry0UcxsFNGlR^)fpN_nrm;v2HN7Wpy&+VU5mCf?gt_N#NFYb(fI)d9I* zY?SwxYueqNsQPnz4nUW2UGmml@Z+sF%ilf%!jQYBE0rG>D|*q$9LI%%li5Jf>pg+S zl7nGy!pV_NyoVVCec5i%^%=ViZ8&Z{)sOX`2MULd4v5fIphmOuQ$qL+zx?#bd*Ov- zZ^Sx?d5an|)Lcb4^=?C$n@!&giBdQjNP3~gs*Gg0+lfyINw?^ku z(U7a@1Y83Sgw2)Dx2!y^ruz2j2gfVq8*25fRE{Yh*5aa>$08yXaY)ukiOU+8JF zTAju|ow1(S=RCu-_}itUf;QbL5^p)7gm*GFnGqzBPmWJbNF%~k-{sJfXSzMq=kDt7 zwwXM=5nq0dzZ4v2av>-=_y!p_dd`~K$sTGy-b@~#TKb!ZFsDuzbxj8fTtVNfGc;&P zvz}@8K^``-6)mbr!^^LnQlRmOPVeip=cXi{O6+|)FwiS=r$Be zqirw-uYqnJfRS5U(f1!b)d)Jzoh$WkA5W01*T>r=l0SCUEp(1KKgmEf7+i4% zmS1Hnx1vhTgY9(yVm_lnOsbr`y%m*-_21VbcU4Ay1{isJ8}PX229bTHwu8N(e1N@> zJM#C}(`8oP+KFPY{H+{-1(@=u>;7GEaevW|$;;UKZc_y{UDEvN@zTnVimb}asT?2m zF_JURzlgF6JQwDJvEeioHw2+q&>Y(C8MN3>)vMj>t9Vu5$U1WbHKJE84_-k!Sro~B z7e+dN4nOR9*!A^{7|>G1R!|C&-eDNY_wKcva}z;}V2in8zLk+wa6T9dv5e#cvy>Q& z`Qn~&4!Twq8x|rV$r3PopqHwUyhrWy3v~eO{)-N7K@NnKQVCTLId@x)99d> z-q(w}524->E*GB-CH;$u)v5Q`0#s~z)ZvDaqubCl3bnz;l4g&3cu>f!(@H)M%bUtQ z6*&&V zR8dK5mXSMK;NtflnLtu*Jx&Thcz*5^6;P>=7u09n0N2Av^LJomb~F5eQnLeA4e~QA z(yUR9^k!J8Q=YE_W+`(qg?6i4ZCnMvrdBt@NK;b2DE|@6l}&!Y*v8~G;J21Sk!Jew zVmT_icYsa)P}2Ma+(zkRTEl}4%Lvl|LEa-zl*!z zaw{UwO5`YL_;g2Kw~f$u*$5lnrz7z}9~E^-7shmHilc?r;g0@Jy8}09O`R?ikdN8} z+WpK0{ILBuj(yOnYEQM>VsYSi`VdUaN7FqMLr zf{Wn-n=gF9MT0Tu;KL_s(<2fu39)HWkc4!0d`gt!IYEeX>{xm{lMP3GB=pN_pV5iY zZJkF*+^M%x9j{v{+DzfvUZdXVGCR(NDAvvoNKAwS`l|uHnNySf-+TH}W_E$gTTY=p z@voWxs#F{XZu<_R%8M6Y1N8bkt-)r|tQ;FJl|Wr8lr(=+=T>t!ym3_z%hw8}5|~~u zA%`^&_A7s>B}8-7%$)W9c%b+kp^f5$c)#Z;rNz$Mll}i;y;_5txUR4gaxG@lVOlo& z(M<0QZc933+5k?cG(!xYmXa5c1VY+kz+h}+%Qk+EMa3? ze#qE74QZGTh43h)WJ({D=`=GfowU=Lq*)me)GJ;?+9tm``$v1u(Ra@|d+s^k$pC!6 zhDv*eC}H1_g|qR7Ffq{JZn1SRc8k7?(06rqboUzxgQwTfYS&ZszUM)(F0zN$M~yM_ zaQk@o3=tgw=qTBqkOt`_Cq~bo8k~?~0RN6gY?7=|V#t*u6P{x(xj!9J{8=U=jSGMN zC6|?=k`z<86qEKSR!1KJ%nqBGB3nBF9;DjZH}29~^bS)$Nv}(_Oge`==>ZuXR1=a$ ze-p_?c`1^jF9iXthq{hPdvJ$->XlnBaawdg&hcQ4UMbdnb2P1n{gv)AbFp)E|~ zkWFw4&I!+yd(xj{rnxj=rX=Z!D zq7#K{C$1Y8=giGHR5%gJgK4d2${MqB=8(-}w)R@O^?Q1I+B>>i30JS#+TP3_7nGn99|6aF!`nKQGRCR>eMBH zOOB2Xr3V#(&R#f`h{ogKUG%P&yZ?b9jG zKqn?qA_)r1Z+R;*M{!h9J4uxEC(*T0nQY;enZ?d=b?v0OU2f$+cDK=wHpO^Tvi@EM22t<)ArxuWmhlS$8<;R}#{_C(XPkB)uRTffQj|@L zJTHh*)LE0K-{oaC8BaYL*1cSnG>zqfrg@6e+)dgipUrb|Vetd>neN>GO3UD<%kIFJ zpf6069!CRbuA>g4X3>m{mDjP4@;EpDWZ_>rdz@r@BSg$dm#JgL3vPgCiz|CTQw9F> zXU%*3wP7@i+b0ZZcUGK0S2}lsnTpPar=oJ;1mpdQqmMTAdt3yyv%dJH?$x!$m1qMp zGfr<;luSDWnUz5>f$pHp3X$&X(Bxea8A;Om8cXJESYrZ7%fG>OvS7Z zartCl-U(hUEGSphf4T1}|2DueSO;(>_LWVrD zJ6{DqPzNg!TrN|FD=%_=2y)3o$R%aSCCK#5k}8OcsWoafA|_%DA|^Z{CM@=sM>t5+ z7dy0Ceflmd;i(mn#Z*o1p8drK=3~fOLdF-X;E?)6)dSy4nqQ;Bh58Zv>_g;i8JT;4 zyjhiXrjXHZcRB5rW>d4*6fpVBwsyLgGmFlIKS|3hz$J~ypSu)Ka8g7B39Vmo%9c2y z=&oHl#qaCx>$TYp9s3NVdqCjwY)YAm#p4WE^dN(mlfxtUxrd>ZBSXiZtAeabqG>L@ z43Xt9F~6(>%Z;mZBlt#2<%`6<{a`pd5Rp^cvFz~cn8>Gc+0mnyrY;^=HNg~{qG#AV zz#A$05SY>WQY3@$x0C~XtsG#G>MTCZw9z|4q(riYv5Vp*?YS2EhZhp1#u}_@v zFzS`>KZ~h9Dy*->%EEI#h{X8OvJ}7es+zo;`lBo0o3L=1Uy9wFpRUB-gad_BORW-uJN7S#z@E6rD7rw4Dv~2p8v#E29&*+BX9m*EL%~J>HVJUYS;M)XFOml;CzfdMJ zIik1{f`hp^v*)7rQ~XHqv}lZk_IF_h{{T3K_Xv)!$@MBuHk zF#7OY?LU3XYW{pz|I<(Wk8f!4>#R9u6`deh;aal|+c3Xc=h|awSzCO{(CM`H87&S( zk?nT9#YtIhZU^I*dD9vbTK}#o4!`2Sggg^obd61`L`(D4_jvdAE<6htE`|vAHVv{%_ zAqfP=BZbm2T2;VUH>vAdwQP!}X`)rvb6tme$AL`kpXc|zj?Q=dQ4GJn!Q|VrYzsQCV1g?h9ntzz}pBoV;z_j+iBKd>T1c+F&r+ zdi!)1v)O9YwHsP`UO+T*+cBg??repGDnKIGk9U)Draz*&a}2>Y?T!Z#><3GNhoX{j zX%(4Fx>)J%rGSohr9U5&;XAuXi=Jw3$!1^nQKVDcHGz1oELg@_zJoBod#Du)!n(hD2o| zgfz-6`<$fiq}A#+sC&(%%V;%|2LC)YcOGmNBM}iP>%dRq*i1E^|NKF=2JgVZeFg%H z)i~G;&X=PQcw!bKUq@G=UxL3ED=;r-w9=mIpn)jJ_F8503O2pEhfaf@nL^=n*mGsL zRfgrjPb5w$Fo{$x8l$F@lPQ4~10I7H5|J;-8fU%J;0W7!Bi|GxTzZp1-PhmSV9{Gz z%_>*F!)Q4<*aI1h>9_u>Ai=f8z5I|EWa;?Gsq+hWQWL&tEgFgp#X@u-dKe9dg9$Oq zPABg2rw5}5mJ>(Kr`WNfs7DAz2gkCpKh1z=-WwcivK=+lc62#f)f$i1BC0eY-uxgI-2Tm8>wz_Y8!EbuHj{~wx_QSH`%R>oA<)i@xRR7 zT9oF7;9kj|x%|mt^!L{w8H#D85*GZ6Q25S*steTY8l}J_@o^R@pf(iLZIWc zv*u8~#4Mn*+yXTcv}+o0FY00fI0B>b2k@cL=^I^dv%0&*U~ALJ{mH?64D6cv0p3EEF$)%iTT{{4MvLXVGun3}kX8 zwM7esun4w7CW#e);?J!zOB7oM@8ql32A)6W9i}F?quBilJXjhIz{{;Uo*j2Lz}fZ4 z$)4Fl0er&=jB~33mnw4a)Wa8C-hwxwiu{%-@V!Ow(jxdF3x`V{eO_tOSzblpWbvU8 zm>-D4#qp?YCp=j9;va#3?}BE3q=7H8X8XovEWRZ5=RQ_847|~9HR!C}UG+8EcBD@p zBu2VNypgbJ#Ets|R_MlQ@ys=Wo|_fuDafRel`p@pSPQsR47l_t;8HQ*(q6nQU)Pz- ztV`qTpGN1Tk1EmP`3gLP{S1V_AEbOa#H87jB8|UU%-ns5z9vyHPs=b*_qRc53{T_O zb5Eo9rQTw4A}~3>tHSejIa&6hXONYSJPQ@`toF1Pq#&Igx5~`8qHzj5ezPDev&sY< zGhWL_i#Zq@_Zv?8nN%q0PZ11zV+NGc3)5f&J;!AcUTzl+A>E+fVKOmVL@OU89Q7`X zr_XI4(2@=2IveTk_vpLO0lD3MD$zq!NVVZoJ+grb2cj}%`<8hLpCGEGdY0GlRO=lMm!h3YP0H$DS9 zlyh?S4jqf#WMaNFg5Byxu^WwO^~xk%LNbq*ko>Q5b;LSKg%;Mituki)9#s17R~yS8 z;tGhXE@Df2(7b$QC$vg@(<;3x#~LsHLpjI~&oFhaR=E~ZFteshIGgWj)!#qPR@NX>=zhzA#>$=l;ed#|F9^E z0m>V8dJX1Ylhf9#wve3~q_@vtBjFqE2cJD^90=C%vz_)VX_^u)OWP%nwy9=2Z7YfX%zydR=%$!bq5bNYv6*RH}!Z(6G0g>o)mIc z9=VR3lQUu{5sotFgxUBsWC52FQ^|>BI+;nPy%{3d@6&ha^~d-3pY#%qKXq%7uKlXL zwie?r5bXIKa(~mLI%(`m_yGP1tP!G#SJ1kZJ1~m}9%Ye3|2+GD{U@cn#qn6d z=k$dKo8ebLv6&k9y1h@~B>1!vg@Rz=!G@v$Jjq~-MH%@N4u(LX936$<=eAXr;!%3F z2y4)%a7+SE02UVF7qAeeZAG1u*Q_#P9gD9o%E1<}zY;H^8?Ca{M#`g@Sd=UPb+J(2 zg@u}}!Ye9syB^w@@+BQ;yoEJ}Ja)CY&)yR6Px`2?+u^t z55^pPd&mscl;1>YX-(@sU009U!-9rdTo2O_VZMsCTiLs|mPAkWZeuNp{o=p#tF$Wb zz*eWY6H|WRa6?&sgRXO9$^$w~2}~9c9l{cg)jGJE8>aa~y6zPEMtMl7Z_-%}y89rN-Hrkem(4u`5$jT#$?M)Jfq~Nbb-1vtHSqF^&NyZ%dF|Z&keitt!%UFPn6UczpmERJ2?_WoV~ zWgYIr`*CSYn#{GmMW2sP^3m+j$VfUr4A3{Y_OVTGvvR)_&GKhXP3EH_sO(v6vbb}f z3$vUU%jU)hq+&)IlwE0xJJx6N;T~MS-)OYDD2jCGonXi1ChK#Sg8(JEJ828yvQdUk zlh@owgga$6>qzyL*xBG*WcK*&ge*vdnQT$=oe#)fFs9>rhhKr78$knES@`Gj-8_jk zR;yp!Bf}e|u4(;+YF&!18=XXE(SkxRoosSM2_H@QEWV>O=|1SP1Sq%BhckAF&}hlN zD`50kx+;&7Eo?VqV7pfn>#3v6s~#w|{H?6ja;U5Fbjq6bc(@i+`fOd7Hcfc$V zoC`>*G~_6b6XLmXIUgPnGRe}^2Ye|su^T~4P}Wa^X?1kYbdDD6gGA8i$GtWNsz)nD z5%6L-DHb=Hy{4BjLu;rYT>+As6ZIHch>85AmZR=QCyqQReZ-It>O!D zN=|u{L+>cZ%fTjxU`>ESDl_XO37oduwJhO#4IETQ+WioE{~GUx3=+4%^u>+QHgHVM z5VXlnnZ2Z~CqP6z0yRLFU`rM*0rX}d%_QL*hH$;=CgGGY9<$_iDW~WHmsH7tx6j7K z_-Q@H&I0sK3#L4xoLqy{yg?T$b(Nbhp8T!zpalMr>KN zymmZrt%bo%Pt`@aMYVXQGfw<5^TR_mT$QIv}tvC7o) z3ozr?@7)DwWQl1(&_AW2RR11)ZbvFY`R`BG{-;_H<@+4E2#2o2p~dY;WC_YNCzQS| zNUBD<{_-=*(@i!Opv4!zG%9XKP=94rc?gm)14-Eb1hoHrg=*n0&%&jC1g)NhyBsRJ z?vuvOa(Vne-AI%*YinMF8WrT-UgS)*`biB;pQ)*>k0HxlJBcnp>r2pjVLQ^i^gt7O zYZC@1L|PD0ynm(c@^wgci#suA#kHiVEq8eWA4g^7ZTrSq{^ZNRd!F>L+K0cZsx)v{SVrp(s6omMYS@ibdQM(s->^?JNZQJD` zos7dl5x5EOIeeg3Z*XX|luK3sHL-r*igNca?av?1Y6|deH8t3`kcp{k?06y!1$`1oLl)KiAfP_`&h+v=V zC$I-&mg{v`brnnyfql%O%6bH?Y{O7xWFaU4MZ1(-gWPALJhW02481%L4XV0LyiE4GZR<0-MI`p0LV@p463Ym?SI>VNZZMfFdad;oC5j$X_Csf(dq;NbS zb;UK1_LxrX&&;}>ZXKbq;a;=9GeL{CEWt#21}r0;(>^exlB1=}d?_0fCbQGYOk^q| zh3E7bb(tJ{y&#Ok+ngxz>GTQ6_!;T9{BIy1Qd1p5o3Ddx-r3#J+fLb?Z8i&QGWP~? zdt1O{?$AAE)%nftBS$OsJuM6l9Q!Gqs~y5YM3d4_G0Y73wK^onrTDNoH*hAA5f&7+ za!s1%GmxM%$N5odtTvbbLYud9>J5s!a1JQWeR%)eMJ)7UnSGYpd; zW*KZ_A<%+FjC5P4Mw$XGVAloO0CgQlO&X(iBHKk1Tb3Cnf5(WIJ-A+70T)iH)X5j<$b_AZUOhE$S3QhCkS$&|mvw<{K=&neTm{S4gbJ z!3LH~c$p~` z*0P1!xytl|4bTR^71)M)H==ulgBA4ol2%mjG!-wj2J&-SvDQ?K(TeN)@PDfvwl5GY z4d1FA))eE23-}oL7q%X%_@!vk&kGaf-pr3!@CNoq1oUE8!(arf+}&MYnJ&eJ)Mii$ z=KNjcqE7Usg|O((>lSq4)f8$8@h%;nq(h;oIrQY`e#8*bSL3fo zqK2e}cYq?c!gb@T8IZ?(Hn)~`p70I(906cZb5uFV=Q?pA*^U1;9k>8`)Qpzx%j;x! z7g-$@edP$M-b{Ts%Q9?=We(0{L{82K=(s#HFR!hn*rXJesr1NeBlaOvzeP{$C{NfE z^n?#iVS_$kz&cqsr`z=+&tmB{HM5ys`x^^B!QcTeAZBSUzU2~=rG$fbBnOz*9w*Z{ zTtu!$1;Nkq7`xVq^A$0%kywnP#w#u@$S7P+TNW)%#aUYMR#Q=?6)TombGG)hwS9&B zYg56~3N+cx|L#+~X8%^`9pXSo&0YJohB)wI*h3B3uh9b$Gp|P-Da5&DmP2TD;1`*E zp$MvKMwrYb1oWVh=Tz;>)~rh~GuEgr==6_S$Hz^2(_qj_yS)w&QWI_GZNsjSu+{h~ z;x?1p4jNBky%BE&5Rc!nViZb}ZM{iT!65_-iER-qVr2$Rt{i&4ao934p*I*@<5RTH z3W#TVm;J?v7zf0GUO62u#D$C~NJ2)4ixJV^ilng)(V2A$zRHjoT&7lBa&#*TrZM8B zj;vT_0io$AGuZ?>se>u8ythO<1}F#ZiMA@u9!tO&b)!|yd7Wg5IXHLD%{mLC^;|9~msm6?AEo68*v4`pImu^j345wP4jO9A9JD59-cFb0N?Zo5mhmw` zkm52w!xxrrF3if@^-R{AwI}Uy8?dR{YH!0UN_ZMxP{Gr6#}Qm2;YBz}9EI!k$6M0M zAZ0y!l&qtu266aDRqc4~t7CZWE;K4@omo}wg*x{%-gp4tRQ5rG%F=l7GKoC59qxPX z9xT+4Aa^YycisCwUfY6#59!*PJBp&*I8QRTb=M&@CrjTArUtNTHN_iVE4iSI+JGQvHYMhfc!V zD)^}O=@GKV!E)n#w=4fWE0XK`YESwRqdw{`b33!@_Ux5_`=8L)h%KChU2t7+He!08^h|NPY3-90Nvde;$Dl+Bxj&C8HmZ;p2 z*q7=HTZ2046G5u8m8lB%ZdByy`FHLCVqTkH*t-AwtXJo=MvZ`&E9#$hok5YKVBLx{o2?D@ zrMb_T>lvx^v6QTG%Z%kHcurk9D;uk$^Y&HOb`ade9xgA*d0xuqB+xdaTdN=3X-7Hf zG_qCYF=Vl+9t5(mR?}#Rd*#J$yu4K05Z32EjhDl+Kj-0HS$kCHAE0#h%le}oA-~h< zGqU>G5IdR42J#>-vE26NPKD#{uXf{NT4aP+$`&G%E&tM-XgPi2N3@jbCZ)Lu9!y7k@t0xtZQZANzuHA_X(2#j=ojMg@wdSG$@$I52y)f zbB23;PJj;GqY)hY{5@13#?ZO#2&(@nB0G$9BD=7+kYfnivlT%b&myw@NGEm*+l8QC zoW*3@G1-TnMe+7|F=viqXlnvNzv6OQELa0sDf(p%-n!3@LvL)I#AJJrA0lF8{ol7} zNn?Ezpe6j42My!wy5#8%!2A|15%Ei(-6k)h4_ik|9n3OVmIj1Gp)78dBjMSp48-_w zmTjc3OlH%$Of8z^G9WJ<;k#&Hl-iFeF!L`+9o(CdW4mBSA#D1C`;^%6BQLz5!1Sc+ z9zZ{5OKf_)8eEDr0s^Q@<9Wymk!I>WEkMrMn@zIyp)t}4LhS*gePjkTO^Z}W8H zFM(I3349JN`oVoUk`ur_sn;|~xJSGrqn6r9_mA zMA<@7j$B*y5~R&X8c%sJ;SSGn}hC?88Q z5MS%pyOGsjft1u5#RK^0;0e-3*|ny36$V<54W^@_ft7C3#IajDCtHvsuBrW4w3sz?dQM| zY2KUl@H0`k-^KEDa%1>RDV2wLEfuS*b|aD?g+FkdWxukGSzq?N4I7WU*KY)U z(!kj)ogK@t86n>cFHsp>tHg9_czVgPbf5|6VCz$t0s4T=Z8+gpm|ldNsk@1}Y}Hoo zpC+8}uzLr5HfqRdGN}DVqMNkLq=Y3`6EKc0!5$=m$23alk;frR}e44GN5M!+QILSfe67 z9pvkxG}MH0;hJ*fH~%2RK-Ma?3r1+Wf1xD{6hxY5Hjb4}d<`d1tx~B~nQ~kx251MCOVgK#45M5v~YD@}~`v)L{|6NPs+!8>?N|B6@4=zq!oDz~nEf(T4_lq|ojr2nFLZ%EO z%phmhkE!i?{Di&7Z>9#!2PhrTNl{ki)EIV8Xq-BK`>C{XVImQ|v?e|yzLA-)uZA8vx7eCCTv=#4L@NxKzC0N0Np|LF{&92 z+}mO{W1qKQaRc;J^<36h&E>NRK3QB5rSZRpu1u~>WIWk31!CHCju`Kudd*PGF!u<_@f~byuN8*7Xzf+RK(11jR zpmN%ViCzCX-0?aVUW`RUF*X&*QfU)=90M-Wu%o~IP09q|Yvha0KDWI}S*h9Ni;bLlj2wL(s?E<7&tP(Rf2bX zOP*Cvf{yn$O`)DJ!qlh_UgaX`NKW*xHh^wlLUW8_;#>`jRH`OWqUbe7-mP zeCM}RwS7LnoX>aXJKM2iCvg(Hsn>?CP1jA;wzdo?UCYpfG*&S*CQVG(#ebMzR`JjI z^pkaZ^!%RZ`~7?~lt2T~$`8T1{C22_0e9yy@=0blz1tl_(`1g5MK$^U9JpX?reQ5} z#&`teUFGn@tF(*Q>>nl$4-_ zRw|q`G#G#q?5D#RG-|(tAChfRcZrleDw_)f#hBx3*;+x0iQ=!!x_t8ksZzZlbf0AidJz*KW<7B--Xka1@UlSqZp*h0Wd5mthpaNsnUu}+OY@#NSHM0;vHI1+WKKGE||EO%N?WFwk1 zFXYa=Q#?;f0QqQxIz@XK+>g_^^#DuH5&+f^#5fX0CywNCfSNMXJfYw(o6D2SL7*A0 zXlnY>B`G;yjwdg_UR+E_^HnLC$Y*nmgQNXc;)Jgk^qZuSJg$1-7^HNnaO6*NrJEpahkhzq=$$`@~w3a{lGk%F3yY5KLanz;%`MdS0QQl}+w zl;}BZq6Rq|Ml@3gcY>2?P;1*QG> zD=7A9#Zz6!cD#4{r($=Dd-FKjM3#H+ThLMf5qv*+HB#Ec#l zHBFy`W{uqFEmRlFZ#MNf$QxrP!G2R1IzWvHQW2DTf<75UsloAI5-x^yI>yIFCx>V3 z_+b*@Mk^etfX2$6v=;}sDTS9E=a_Q%Ew!eIvEMChoGq;iN+z9@|CxJ)d@6$}bibY*v zjAPuuZkqmC5Ocj4aJgFN`;SjIfh?;2tmopnd(nyT57v(BEiXKTnif61L;+ zYS)0k^31Kv0HcPVZpesD$8b_xl7?Q;S^8WAuZes`!9fnK#7nX8{ z`eG;>qo6Cue(+)RR+#l<7a%O&T$ui(wkHlvN?Qo63x^-r$DJey7C zz+{l5QQGJ2pZM|M^V26;cwtag;<)NjSdBXqUV?#7SlR^abzvcySLe^f&qiVRxtf;! zSsq+7mZO;n*zUD#ZS5cL(H^q+%+TH-6}Ze>2FzO@w!oKvhVI+&eHys^um$-?>-+a| zpKsaiotAy()*o}OuHmbU!435?@c&pF#CEhFB+OmIZpLt@Yw$CM;}+y%`$&7K$2mMP zJZU8Ajg3xQo$i^@fujWJnBH^Hip{V-R&;27Ed_LAp`cW%dM2kx8MQp8 zq!$*-tEIx+qNtTBS3j7mDph?BJxD)CTbZGd3;5iAbk@b#X&ci|+P#E4P+`is%)6yq zN?lZvIVpSQZFPCQu`;(@(bGUr6nXIk9F73Sqrs;+yW&2VJ^655_*cD_&*w6-uCBeEswZ-Q&qKQAYp~J&?tkr#TcG5HKvxPC=IB6g3Y~xOjJTm+O z7&B=M?A&}_`CFop`aQJlHA!tDMxNn!M462FKdhW zjf^VJ=VYx~D5_OGk(jJ)pAID`D+s1Lm zai{2z#Xbmyw|dJ0PEquRjW$5t96;>`ZJoNc9mla`TeTF4qG*w##B;e^9?Rt&o6BQ) z?Y%rjNu)&5vgG)Pfmm_V#I=nCZUdwR+!r@!P}_Z48GcZQe%S>VGn{X}Z|3{|{y9SN zw#hCY0B(KJpjek(8-vTOl&Wl9t}a)*-7j-;_9C|i+WO)axTvQ$f)a4)rlM2isAbgT zcD;Mda>8!Pt>qM^DYjE;NrEn**p=ED=ycNcf|OHvUM%ulN(n8`=AE{%-Dh$fFdq%O zPQGJx%zI5y;MPqRoFYskIkmyKxBEA}-JPAUAs%7$b8X()c|z@4gqeK=WgBr3(8fK6 zOnPTSLHdFPK_~ZUkGKCl+{jhaRYplE7uK@ifliG9)Uc;Rcai{(s3!&4*8~T2Mg~ml zj0srenK&FUVT>4HyEqQt@ue9$YPW=eQFkr`oH{%|%%#Aoa2+^9 zl?y6d4WNhA`<%>B$KrU@0MMx)#_goNQF8M!C{dH&4xEeQw2Pi5|CF!+w7MrWA2X(> z1e>w|Hg&7QGA9+Kf&`QM(amDlae*YvHjCYCoAVldu-SSWU`-GIC4Y&j4&o}eStu3r;IEA0$Zxpo6h^aCS}kGgDFSr>kkGYm;iWl2OwN zqokEwKdr!O?WM+{JZwW>@N{4KJYGZod;K}p7SXdsXb*lgum^^Ohq8+%vCQ+3lBKM~ zNU@dbgXTYkV3FcuvqWuC1Po;8>b+?V#xa7GUf#4!$S1MZ{ilw~D<+FM4!PCj% zpC6oYSZyW;88Jfbu+o9FuS9YYA;*>4!mS%EmCtgrTo(CeIV~o|5M&MpdHPelitpAe z1q?mAeQ-NBhW!FTq;oWiD~;QkRh+X!794pJ zHPA%V9U`K5B=Bl+yf9`Xf=(N5aaw~mdNw^P1*`E)Jypq6i*mjNq{S6wMQEiOiIoWJ z37Fh(P%h6gdWtdy=kUX%$@XhkC}0t0YJnc4h}WKUSO7y*5?9k3#kTNazghX@b9J%O ztKFzSOjP}CzjQbcY&vt$74^`6JWJ3cN5Frs4zE^vs=}@@ow(=#Mt$%t$4TNGZg$xg z9QK6;4?(-VhrCm9cZ%*7tEphmN4^A?^zjZ@)}y9OGrFEttQa~v3pdch9o(~* zURPzEU(pr`rnfI!D+k(8zikZ)}qk#K_0f(@xkU^rgj8hWs5n<=@_j2ZTEDXc+cm2C+<*ukWiT$GQ7WBky+XhOTeK|lJP*=-Uzi=F8|N3Tg$ai^8Iw* zN>e98M4Y1hq&eg#!#+Df+U8RV$jNfIP;*EGiVq0)RjKFd{z5q91t zyC&s*<6*+RkMe?{X$*aRFNTht#8B}iY-pLhHt$|_Z=dRE$NIK=yH__VS2Xu!bU&qi zZ~Mo?*`>v6OpR|GMfi&qSTd12ij;*hq^t-+hm$A>Jr4Rhp6Lrmky43E zmtYI*Z1N@8VmkUz#5YG$lzqzl=CmsgCDRQxXg~Fvx`*)=p`tkwk)S^u#=YJNEadZ& zNg^1Sz|Q_5N}k3-GeKu)-f0PAaHViC@HT0ge*--GhMqAL4wu4`H%AY|@(iU=V~CRY zT!FDl{py{+m)3YbEw9`c?}1PCQIS}R31{Tl0`TZOi3w~f_|7=E%?$TMA+;P?nqz|* zA45Qn4^L3`m@68J*zvi9&ptnap*%%ePn`6{10he+AMvE{j3-a6M%EL3cv(0x-Oq@* zGRKV}tR(Vz>F!-H^h>0KpkHWrG{bN(XrD7X0Q%LDky$%VXQ0pg!iJz}$$vNpBaq)F{6 z)=BHSu4^fUv1tREK#Lk61Y7qaqPS}Py(ow z0%|F+wNR=_15KUO4WvocrgLR=*^~bD=>B+g&+~hJ-|z49?XKE9aKADQCe;oVt2(dX zTdF=l!_lvI zgcUd7BU;Ae3W)!J5Nu}Ytb|=SkkE(50uFM{bt~2m*T|S1a%gNjwPif04kslFQznHyW7ZOVMBVeGz|a!a=i%k zxq6}x-r8}NRh^UIZ-$EU^u0u7Vzqy0MOj-%YTbT?7_it3&grU8(xpd(kX?-f{JMU` z4Uy`!kj*tJiM;ZJ@`GG5+x8dSdC=M;VA_9322j9ppAtbc>GWeE(nm2~GDOBHXhDr! zuT=T8$jOQFTozQOFbl1!z2wMAhnbi}&k&v$T-V5TkWdPL}c0 z9+oy>W2nV$9ULSA)C?16Gl4wdiCC56=NB9GasfoVSl2ZOBM$}8<39rHKDf`@{afo2 z{vgw@z#nX>)T}D5<-alRt*r;FY7zOO`<$|SfC7?!d_;?U33ff+2h`FV?sku9S=a`A zYaj408mvhec@ZFcpQ4FiHB5P*Q^xTAxmD%(MTG9Y_MZU@vHzr=fI6DFR;Dqf1xQ~g z+^>DyxFgl`X?fl+QapsKt&^TnbTI65ljDX_xUG#wedy`l_dQ0+2qBwR4P_1EV9w>4 z0$U36f-Ei-?_7{dP+#}ktTc@&H#p@jyo&exR=0NSVpSF`-U48`sxkk zsR3`y?eltu%@zwbnP|5ZIJKGie&Eo5&KZ>L|QJx!%0< z>CWz~(mz0*W&Lja=xLgCPhnwyK9rv=q}rvs(p@f>5Nh{Qd3D zoC!SWf?OK(8K4Ql4^$#Y@?UbT+>$W65?TqAXXiolFJ{98b|9#qB5C)eJ88d&{x|q)ipnadrb!}V!`w2(|Fw)u&3TS^y+xHT@2R3QVTBP-BZQl#pUul((nN`P@ z>WS?Z{wJ{R?$DO%+3k<7Sykt4TzRwjHr_weQT7}K_7Y)LC$-3thuvK>0|@u9v7O4~ zNHf{u8`XTWv9Nrte0Aa9$@f#|{WT_sHY_nL>>ws4EN-WPv7!`ag$Q=i?KF98MMcA3 zTUMSFI*CqpNzTL;9kO$VuvvQF@*MIR{l=h+B_<504nobNr*OluAu~!dr%#NWBE2CQ z&>oE^apJRlYo1m};PsF^(7J(hIINd+ntXK6R9MvA1Kix05~P zAN4*D^&pMxT!=N~+aF2Q%O6xLx4x)0L=Nkz$=&wnD5GC*-^&^TXS{~cC_5H4iykPe z&UGT~^!-c|0{7ogejJf9l@yjHAmvZp?+%<_%X5pNxDnc~@g8Dyq|Q1BA*qM7n?etd z9&+N-Xe3bZosTWAetzZd;tD5af$|T)k9s%fmCAcY3?QJ6RRy*Gy42LJZ>h|zY8~k) z-|LbC^lv<;!wy=n>pgAz8KaBiymxhGsnn=eDrGU1PxF8NBn%SkJ01h6qh1afqfR-r z#8t`}K9_A(7iwZU?h3j5dwn{PXMV4Hlce{ZCIXNlcq(L0TV?kW6$?9a))HFq7Jbq* zbV1!ot?-)*wPLZ96qhaw?Wmk-aLq&;Qg&$^0v4vtzu0qpJaGj=?n$3z`B*8}%GVcf zOEO;)o4Krzo@$N@W0M{#Fu__pSP-Lh*qHvUBL^Xene^Jw-LHC5_1m$+tekx}wZ^x` zwfu7R^Kg>_C84I*a7;;9wEc~ZOXm?ndAa*wz!k&s2@`R~HH7Z*8%%J*R0zl+5Rc?o zvn(e>ZuA-33xN?Zx;d+i6(<4LEuX4;_m#rDUMC*3!d8z3L8EYDPD)DI_1Y7m4;A?SU0|4p2^)wv zf2I^W;I_U_Db^1Z0JrRu2=I;Fr@o;kzN*VV&`=T?_ETPu&V1s6WiGRsA8yL(-b10C z5rkE-NV6OxwVidxB8lN4QYx zuD6P0+(9r`y3uI@c9sd8Lg+_3*=Pn3T2JG#!mL&-D`I~eOy&N(oU67h^{R}#->{0#Hszmud zPd=u(a$)j&kh&=@VBtUlSwNQjWfFWQ%NA%x%--noIY2==rHkuh2J?4+@v_rlhG%dH zo!2GcG?vq^h2n9dgz;g9EXRb{Ffq)ol^%4;W$@QGo87JVo9|Y7nYE{Dpu6eb;zt1* z&HrTlwX3uEg0TJ{rpi48Kv?0LDX!jPi#dTW3Wc;3t3X5vEudkU~x?Wj^=Ark+Nc;-hTU`X z@BXId$$0a~JmeWcNt+dQL2e~S@+}^eo=Qo~3mG73VZIV!f{X*OFOEbJ#EiOh+OhEo zt;1*a8*l(wYzZEw*Ovc1s@nON*k8RRR>g``TyBl3b~n2;UrBXf9=bB(nHjr6;!dB_ zy|4hOw;a(K+TGM?$qw{D8QlU|&opw??6gm4U04t_OZha1?EMxM`at4eQ3@2C(z75- z9~^v6DFQ0_G^TxTL(T4eAitvVfr9(Pmo08T85I)ZB1oO(?xL8HI-jvC8L7IF=ff|f!HceKOZq(-2Z-5m-k&mARZUO z1BNR#YTLVwT5W}9p~Dww~ z$iLMr3vA{7gGM(atb9-$0A37~&K{aV5?666QNAmQ47=VGR(v%i?Th2asWHDE!uDU( zWJPf(v>BWW)-o&04GNTmIj`+FdKE?k4!6$%y8>1M+Ey0Uq(|i*bokm5vS+`3sM(ie zQ>tg=$MS7W{lm;!Qius?*IYrf5Ikat!O4p@yVvFP+5^r^ppq#|cW$?(ZbisJTO;*2 zL*z_RZA?d*JZEt7*PeaFv@h;MMdup1?Q)xe@>Tod z6h4hZCr@htk4#>ReiDw`q`>N;RL{M$I;gDG!7RB`NDVx)EeFu>cS=!Aw!u6dqZF`8 zHgC%Mmiibae=esqAro>GTKK{B5HTtqUdYGD&npP<%dWu=3c+{t+u z*OR7+{d1IkeiFpy*`TRn;X?us2}*EPHwr>&z|9ChfPVV)_X!W{JZm_g{d#BUs8N#zbgC+5e=sv&1*rJk9=(=4y>?+d8A# z21)^o8G{M`8W^MnR$v&`HYnP8DKM;Ck)|6Ow@Ft!jT65gvTVIciXuf(q-4qI^p+@* z5~-KuwLWlyYiRL`)g>Qg#f-@kV6Pe`=C89w|@UvWPm z$3=h26{mt$&T9pH(vM&C*nEV`Lb+)Gzz_T1CJ71vj9%nfNtX+Dr)-MXOLE9D$Qc~^ zB|C&fhpeZ7N^^}xbi>7YfR+6``)pOp9K8mM&V?42h+lLJ=u%oOKvYm5L%&!>2HpWskWu3NI zF3i7aB0RtAmr>&EduSRALR1lTIK5R)(&zTrO!dGnNSKe z?LsUobP+G)W2-_Xxh;K}NG0kC382oM#3J^9iFPt1fBO7+tqsFS!&Io!-8%nCxFQro zvLHu_@mwGmj%_6x!R`2J0BWe^P$Gqgq1V*yBLviwfd3&N51R+g$v&skyr8o{$m7$4 zb7q1IU51c{CK!4AA^f0q?^(F;>soW{`qRtlsE)C!-rNpSZyf=Ge=dlHr}Ls=Y5D0Rv2e%V-@h1!*Tr%gJYzMc!1!}i8tR!vKg}awzXBs)pGA94!|e|gw2UJC&%;kz#x6FK z0GmTEp>LthOLiRXbp8xfUls3N-)s6lLi$^wR=rQp0%ovHTV`q6g*$9^S~qGo*>y&% zVR*(oGji&ElEpcws)=uQecq;&7ixiO{sxsdd!6ItG&kv_mUJA+ql^y1H0{Adj#I(QVFb1s^EmTtHqX%1+;tH@V zf^zM%aH+T_Y(_S0yK_-uk>qA9E=uI`p@x)rcl>3L*7%!KQ)e$s)0hvst;yX`9u^h z+qKLzIYzUF1;Q}_EZos2Hs=Tj;c7x!toQ+~9yKoCD%60Z5`>0d22i&}y84Inm_gQH zI-}=UW{jF7ry){PGfQ>{V zF_sjeNUE_HlS4{ZR(mV+WzdxT_)_=m7?yX~ZA(~I$VhvsbTCf`2xtjk#8{il07XE$ zzv`e(;}8-sQXbk$k@E&}(ZSd_%*%_=Up1kv=w@PV^$U4Zu4Py9<D~szzXcM|GT4A-ZhqwdObb z7(dC=6zL#X%6{H}`P~^HN)cTsdox%_mZAkgl&XoOuvxsj^LchNn&HxP*0O}VS=+1@ z=k>dJ~Jr=`FKD?w9guL)Qajv;h!aFpBgQ`ZR|LM&N+M&u+QRdv~I2`Z?One0^o zN~#wb=L8R~(nUmQj%LP;zhovB&RE}alHNI^-evKco#rqmlj})E0zx~S_UFMK@5GCt zXh@99q0BIdaR82qDPqeOmUoP!m+uDM93~1*Yy{t+=l#?iOkwy_E z1|vU7$k0Czr=EqKp+oms7&c7oM*F{)n|F(*JCk^;O#HFlgos?S zccSh=pAuq6bq8E9I`?}-$u`l}Vjptw$o4)zO`M{&i&|p9ZR9YwVR4i^ku?DxPD@H6 zRk*P$N`>0~okFc%nP{J!cg`7Rti#&(fKgFGI?QUgFlpAiW@9=(E>a(#`3(n9zn)ei zxn;TbS@U>&D|cPo0j;WBNJXx02Nk=Zou9*@s75SQ2ab$b<6X5KMM2!d# zUd*^SVSCqVH4n~Ptp>C8gEJ7aet&*JhZzl&lXNYjflRy_+)myWHY)dng-A|NVs)hy z+F@kqU;lCUapV%lPMvK(k1tTV;fvi+Z7$5K6UY=+gBqG(RuSWwwNeA9b3kmrUCqfc z1=vwJTR9v#hqAD<{ngE$MOo(EBoO9G zEFr~|*bdY>)_P_L{{M~kG=HeS9R454Wg6Q=dd6{6^xEx6b)$?dm8~rGU<+GNxBH>$ z7Is-g7tsc2ps*}tIbxDHc1~YodwkntdmO+S-`Cil@fAD9j-C4e0;LHHETvrvsOlDo zM5TUdtF2UZjEt1N-hP-FX*46f@B4qA|MUB68}T|a{Csoszb)ms6N}vOD%#H-Y&b-C zO73xCeoV2)(XIQ1=A>H*&`-3nce2%Sh2=|Q#tCdV8 z?N!@!9^1$fi@~jt{c2zzgc1AC;ii08dU(nR7(VMuhiVh4NU_eQqiH{zTlUX5>xLr6 zVqTqd$e>bR!lRyRg=#o1g_+Z>wkyoIuIK#&DiYZE`lK@oZVO`5KA7cF)p#9Z2@_9D z{xOn*$s`#}Q!wR8(??Dplbq~7ba?NNaGSahkVy~|WLA8Y=v1N_glVroGFkc*2=`m( zINucaowdulc5;aeS0E1T;3A?gm^Hse?iuY8Up(A(v|D`YWS6+#JQA{`IuU0MJQjpz zJCOjBW3IE{b1onnhK!3lM@M^(Num2@l z56_41fdzp(Yn(DARrL83c-TB9`X$la(KoRU2_#)E)sx9`w7{mkRdX1RD9DSX76@1V zuNb$zxXJsn)o~rrE|<8sgCcJ-Li-se8BMZGshZElLP44ifBrHSOGFlb570lSE5QuJ zCQs6mCj6kAZ<7ShcrZeb4JhPht7cGdZ3>!g1EZ15__V(U?g|3StSgSddPpxfSZ%mUgJWGiatOqK^<*g~I&CZ~A=lsKMk|jdZ7lbA zwmm(4d7itvfIj_q<2NF2)LjEl1o31VdR0Bo1Q-h3Osy(W_em-@7UQ7?%xnmRGk-z^?ApGhe2f_j>eoW%NUQdlB>Rm@mcEo#9$pZgX) zomdDhOq@j)QY=H{wI-!$d$-hj+;ZL{q2!@%u_4)s7^g_M;vk$7we`7ceQH}@b6Q)6(}EhaMZsbi@g$}om|`s^Kw z)2A#(gUoe-k_KfF4G=cI7trRlU(IF*qT1wbYiV`R#+&434bbdQ*m$~j+v+Co-BvPe z?5}Z_GTOh<*h-0__nAK>zKG0qB9A%AcxF82i;c&&T@oZ_C!Q-)Fj2W6oY?!i#L)2e z!G`*wX=uz$n#auBdYfJ-9J2LviA{2%-!cTy;)dlsI47V-V4rVHQ=S~02Gne5 zCIT0UG+oEs=#j zlpppesUEi+x8v#oQftH9eQquJk^fvs#tam-tQ#U~jjB}&rIkBunJ&lIh;{IGLc|Kv z#H5;*!K(GBEEwK(@neNzM6I`K2zk^n>A32drDoVC$!fj;{=mPg2lVS*qIism8+_`q z!yzE&UmR=ld;tA;!(nwBTRRGy;$uk?%AOrx4J5}np%04oyuPY?5!ismHhJwW zwV~wCljuLflcH(oEyJ3H6X>Vx;3a>~m5e~p$BM%biA7VMENVXm1p)e+V1~GD&N?;c zDuKGdf8We1Ay?Y*`XgK^!k47ahC%69T#kP*NeT}8Ds164%CX#Fh&ReXpDJCL2oIfPqY z*}5GO-c6RdDoa#3&)mhO_J;i$I@kEwUC|*6XbSjU#IUbt9QT=vfp{mfynf?0gzxxd zE)0t?7Gr#cnQ(CY3gbyrGzq;9ef*gj5=xK-=-i3OZ~`3Uv)OcvDMg|S#abD@F?bfs;+1Lqfq9PTZ?!oXajY@GJmc@aIW}q@6K4unJs; zF0uTA&M+$L7ApxHJ1x;`K=U9U8`l{lvR1wwdrHH?NP85D&JN6AH+GBlHixcDJRrjc zOgJ<~N*6NIro64@%#PEptbf9}5C`0Lew+cqkC5XCdg1#BTKfSa`~cZ0HrVR2d5gC3 zdZzdK=H?5C>EglS=v4+OBQ9N4*M7MXLJzbxzPTcj+IvZGgpYdKbWX6FukdTb#+aiT zU{=?&IXaWgu*Gydmq|b*nl0o?;WU+ZR#Zi6^1%IbE8sRCb++AsLC4YdcX+q?o>KL3 z_&gR%w%!f+TgPPki8=^SdmBcA|1n+dv1wg*n5a73>Pqu6pD|6HuGVZ?)?}|pZPRo~ z95;#DY3=fAPXhKs@2?i#?CH(cIeV*>^ZPMp|D_eeS?Yu0pISGUTf zs#4W-+Lmdxc5%q&9UM*CKOn?C_ji8heBbx`J|+J=GPSO)+lCQ8P|bs0E9uszDAZrd zbgMIBs0c$Oqf_<_QYx8b&}cB}C4(KWs%3*xgUGIRYXXM6=CTfOkMZHRwkEudBFo4) zAKV&q{~^+tS38KN!|Qv=E&sA0F1^1KZ+Z@Y2EV`lBQoY|{_6-qQFx)UIe{O!-;Fhz zH%f5U5-ikK*S{k0551|m&;i64)qUiUOl34`Oq4-ul+&*(`t3}@nV5M86i}WC=ACol zT;xWmI`uZ`0}4J(ovHu8juK#jY8%(kO1so7vJF{eYKNB5p(9o2M=GW?Sir{OzWc~j zhVn8Z`zK9MLu>oTH?lZR1|MI@7HqjEcvV2*U2fed4u;7 z8Xoutub1Xk#3gwSuC)G7nzA&~rWqa*r)+COoeI2tc)g`V04ux>9Q|VOyFVrFlg$)? zUa+x3^RB^v*4}xNfDazp>H+~=Lr*n3%nK_IR3^)1HzA!C$g z1Mc)lH1u)g!{q9(M*)ZP%j08O%`yERvW@Q1KN~cKN5dZXP0xIp+m3qom9p=#PO!xP zg(o!Wa)O7BTLSn2>hLy$ge{508lA%D8@v|e0IS^NLBT-+z(4w`!GI^oM4U-eRLz_q z@`ql3e@E-TI_2ldLvjkk-MV!R#WR`3; z5u0( zSwtRm->r@FZ^JF<#kJ>m;`P6Y1h9tovC7~Ldi`#UKm+7iDs+7pF;@&l64n~mLc3=OzX_U|=`<^2ch-vLK3r!pl^PM|2m0JxHkr*pAl;G(DODmvy- z%5lW3F;K>eSHSLivmi9joRZ*{pCJ6ollM9 zrRG?L`^J2F0j{k-wcaAIB&dMa`*c#{0A2hR(-CBRABridPOjA`EdApmAi+XXE8$Vd zCyw@*^(uuyJ=kW}o28>epcR`u?iZ!|!>0T&DDjc=g=@u7A~T(Jr-E_sl&9z_fzOZ) z7>(MOsO5=_F=JR9&4WDVt)$bliDK;S#6`~~7kG=Gx0Ou=6eiaqZt$?Zo)IJ*ek#~M zDMAjK5t)uqCsk)Dxl}HtC0@x@`wE(rlVx8iH0O;h-$|xp9?&##fiTrxuD^E z$IxdI`53N6iPv^e_?A~M|D*J2@iFcY_a#BETB3aUgq0K$;(n{fOetTmllF$`c4*xC zfIeYOOe7qoa5iymY4MYpPXj4u*>?jO7~93+Y3a1uqjDg}9kfJ!g>X4txOO)`SG`fb z9muP*;Ca5@CL}cD+s{*~AQ>~|r)JqQTlFLyZnEcRXO6z~eH$vP7^EatF|vLUQCd|p zA#)IyIY=bWrhW1~l*Bfq?^lb3gu&2Boazyql_6`9Nyv!QpP5QDaT<@XZZ?rSjc2n* z@!Qv&sQDIL`twDVmiwZ@`IUHc^iujV$K)VY+g-B>oWHSE=>>IB!zvsq*N}-ECCvbu zj-OE~H44oD)o1ORP+w31NO?sDYFI)^hP&)qngj|Ar79_AR{=FPsbX{)NujaVN;Jc! zGJZCbxq72?Gss>@1S76QARE3KbFr*D+B*`cIMSfKQ{YeyjC9$+Sw6gW-m61FL>!!$ za!1|eC>xncPt7LZO2;QboFB8ZqEI(Di0O`lx@5ngYDJ!<;{1Jpmi8Zz9NSUnH{z3$ zv}kQq#83oxFyG4JT094u>YW3%K|bC>);EFsZ7RnG14Vd1b2d?nClRty&UsC z1+$Jct+JcT<<$sX)e^E8hd~ zx-S+eF0DnTKvSvySrE1GZiB=sys*LBiqwxgzz`c7|E76Wc(1l=Q9vRWIG|Cn^t9tc zM5P(7nW=&ZmR*hhm+3N(ZQHuzID_^{n6PO>H~|F){j(O`x*i;I-oG3?nzsr`oHSjw8G-njsTFVA4>-mh_cE%8d zhirsR5Ky;lzNF`RIY6Cw!b+kn=G$CgIb)i0RRSyFLOT9- z5jc}7uf(j-;ka34S5A*~crhz0s&9;cG4o-pPBWovOH4IdpIIWBrWDYnq(v1yn!`et z9Na^;a{IGX#lN7)4M$&~`k>SNG_fXcfAchnL)pl$S#!V?N6PkpCL4a8CMuJW`jXtB*yp4-!N;PV-~GTW9+qRrj@2~y9{uE+a~gspche< z+LZtUk@WQS!dxl02-{0m9_y!i-2E<%w%a)=KZwJ(Rr3D9NiE@kd1~2q9tf9IOKUGJ zw%h+95vXI!v7`om--jK1y2)K!J0S95&LNmh;6=(ecNqz+57XO-!@URlB?L5aL)lde zd<@W&I$2v`-|p`*EMTS?h60~Z%nOF9C%$nWYD=_>bPl~lC^+kmq+d! zj?3~&#@=*P=yKxHslQ!fo0-|fe7qU^5}fDL)sumo8(ihR8_GxRENE@y4TWW1nbU~@ zVQ6eoIqQUf?B66}5~x|ok3S$0odDg$on4cPGQMl>iigULWmOQCX7;+3fgMbL5i5;F z)VjH`v^}J|F;TH@k?ifBlB-7XQN<3|5toMAkr-x&L1`jpC=wvc%ek6ffNrYMy@Ff^ zS(CBFY`v6V$&6Gpq!`u>nI)bPKNgYCYUfQ2PlG;2Rbus2H8V%23ng&poidvZ0ipS? zCn)F{?~%wjJRk`%dVRYXZD_^9)exkxXGsJT*99lr$og*uhdfRq$1Xvn?%2yJ`hdH+ zwo~NJfgE2ArE#~Lfzb~$NhEsHfj5XrlMItMG^EVbJ+mc*XJrL_!3xgs7UQ-ldq2@N z(fWx);+FUimYm)!IL8k!r9Us+rI#W#W+59%q%WVob-Q+)DaUFQYt9(b`uIo!9N}TE zK}>Jb%JhTUF6@ukFS`h-Z9Id|I*-zyR6k;x0DZt_B5Wp|t)!Anv=Lgyvz^Ux-)}uG znmBN9=iz}Dw`J}|3gLzP)nux`RN_r%#sY*-w%pjm6rRD?-(4~arXWTClSCS`P;>iX zzG!ei=7J*E3b@DjWMCT&GQovV7L@pCLspQhKx;c6EhSn{*hhLc9eHiw*JJz1DI=kJ z6_b&pb^1mp4;4P(p1$~5Iu;xb?t%#xT?mbYc2k4Fi4YF`zM#lhiUNkrni}B=>e!pLAoCUXY`m0+9lsQhfm9^I zCc~v-%AW{k{IFSR0o<^DuX)rmq?5UDi&4`0k;UZ1Y(}Ti551y?WNeHZph+^80G~d* z|6T3KPVtgtr!)}t9*Ne^!Ak#+?J5m!;ylALW+jlR3tl86X*caOftjA9%_LBc2?3HY z!vvd26Jr{}VT=_U+p?`&@@i$>#@4yoORHPHZP}JBY)HaUf&&dhG6PMTkTTGA!Z4Y% z%#d_Nm5KX_68fkA_M3UWXPr#Qp&kEx6MhtX2Fg;KaG5U&4GxXO}96@b7~#ht}a zofwd-aI_?aT@-9CHLovl0aFr$gS+!U(kPIW1Cp)+N$(Xz-@oJW^&E~C)}H|VZt)f< zQH7C*1!_@n78i_G4KE51FzjspU{P=t7v#Fc5kQ=NSb@*tr}^uWNGrqXFZ7PP5=6Q$ z5u75y?ldqxIWd|Vi=R*ZZD2CE;K}#TId5trmQg)4pi1E5zmI{5Kh)rC?QiZ?DvN^F z-}PvAtXFsGdyJUD+SP|ox#xUy!5L~E@+A}Rhodv|Z77!N^lDu0(#Z6>s?FH0YVT-m zZ$I9FX?E@Fn;g2wOb|2l)Fu9@c-%W|ibA@+7F$ue(PTEaq@1Iv>-h<~V=vZhL#;+b zZR>`%wGeE<4R7@}F-<93c6K}-PK{?q#xk+!(0o2RY=7CQ_0&KhO8=oyd$x6^HyV!7 zpL`sjNGDF+p68MNTed5mm)^Lj8C7M}^s57Vk_Y?revJoe@c-0UTydyT_u8@A9XOcO zOnU19&vu_K+yYgOpl~g}v`{Sxa>SG|c{l)8txi#+xR@-6@08sn%Xzd=O`zb|a;J>n z0M4xiJvcv6nB%X3p5Xxh)PXw0aDpcud?jfBW;lnpbnUP<+CX1(Yf@%r%nwRjB8pZP zTOK^8tLj2^V))#rg}oB^Ry}wMii_>T=pcW2ak1`uvR(YiM`X4Ck8D>Ig%gkMatKFt z@q#O@M zF2kE)2h6}(_z&>?)hWqKl2;@LBu>c(k`JYI(xXzH)GZyA&P&fo7o=CDf0o{r-k0*# z71h<%XtlQ5SN-?ue^&ErUR+bNM!9BY&A-=tC##mBvbC~ZvKpCJc2#y=_L=OS>|e6) zZ=#2mfafZ1U)yEJw~!ycQ_V#lyT2sycA4zQ96gxN zOqm#aB*;+Xk%hCv2{ypQVl>AN(mu|^S!t-U&{SY0E>b^%Q9WGeU|R~KarTI>$*#2a z7}d=>rBer~Ma?fazu@UKzG8i~XB+gU$lpjP!&a|xOwT#uu5^Edm}LDF7p9oeVJ;qs zuoM#w#ln%PIe&ztpkR!mLoA&oW}u2d9{Q`OIN*@@lZinp6HDeJP(m29jcBrO1Wo-W z!sOFKFNwSwn-)K+tm!t|y3ANpy&1#xn6X)<>C!m$JuM-Ov@#CPxiQjQNHjuaJ!S4Y}gaxUKBwbn&;GmFh~=QU(bZzy z+xD!j+u>0Eqmf_Vz;CdA0!@o5;Li)S_ayL@+MePP)AP>F9)b;WVB4kh`M0kyh&x##4(7|x&m`gjE{0Q3 z#XSF`5NZ}zfVC}is!*@vS4~x2KOY$lFMK%<=lR)LNrt53F&5+w!`y(fyZ%9$Rr_?V;KCAlxZpL<_2H8~! z6=KO!=t}h;q5@qCo6jz=^FZ^sl zcomU`=Y_47P{>H>d?8b=S5{jaYd3Q9nQY^#MaEfY_;eHn!^kWu91w;e%cI0@%BT_{wBZ*3)D2wZxIRW%Nd_R+4TujNS<(JgGChO=B=A&>I4elbb zJg3BpOcodHG1AV$mV&oCJOX-8sV^P7elkx8(U?TZgmmKCY{p!r6|_FV5)sgcCvZQ3 zN2ZFg919Ex^M>`s6W!-f)1L1I+_(=XrpyM*Fo7it+Dt<$gFhhLXP{T}pY6eIxfDv z6un;&v$7yU$Mw&x^TqR$0^N>yE{!J!2acUQJT&GtgkY^btcN26QbOy*GQA8QBFPK< z+S~(iDV^mNxpwu=&GYbgE2Zfa#@eHMQoy1bVL`V?6`(?R$}0urSy+xz>|$1qK-vU- zP}@8a)I^bQoS<-wMEx!X7*sO}Dnl!gBDjTQKPq3(RpWVH2E9X1o|paT0_^*rwV&C@ zWsTUec9{N3_qlra$0aluIGYtWBXhxmr%7epefzXsG;C76^d64mVY>*R=AM&9jL0meU4V9@D5D{i0SYk4vi*(MNbkE|{O80BL zA?i$`kr0mxM^nbhw+9cu(ADVnfhj~FWwMq|l(<5!U8n=i?#&N2KQ1q1(onV*wxj)I z#*+r8Rn8EFp)Q}-3n^k&4+as|5QftFh?@fA2EY%|h^}iFq;45)g(mgksr4&E7t&;fnwm5~`v}r@Dpf}q{ZdA3G zxYhYj6Gg71w1Ul%bCi|VQ^U|X80>qTujsThdkIUx;CL%Mqtn85@w4MmOmsEbMm@h& zX-L(4Wl)`0R^C@&r882sIoBFg*IN(%&3I>RIxRjJG7@99?*zxZmf0~#8$YmXG4=ML z3%eeyJncE|>lso%?Rj~}NUdy z1A20V847ry7=-MUe~i~_Cvx^0S$BUJU6(%`P-hmof|wgrHx_vjXufRa?=+hN=;*uq z`-5hk*7G`Q)ob_egAuiV>?jq8HakBVP?ta9l=xg+PRVRhYA34$YO&c4u8=xy#XhK3 z##vX|%{k6tpmna_zfP^Xi-FwLk;FV&b#s#igZxUV^7py)orUa?^UQ870*;+K8Y!$8n zZu{H)Sw5ElMU~)7kiZK+K$#eyYuY`*cqpICflrZvlLz2Bj+vp8(+(OZNh%nJo=fI( ziDv2dwLhln@7_;B2C0_hrjRL%U{Cjp{%TF|@nnpMkf*vY5aZZ{bDD9(B)x>+>!L_M z5ylg=L_Gp6Bqk|hT9A0LJXhShQmTQzVhR#-o?ogdTxDVHj@%YA$+q$_e=WTlEfwyy zJI_}t={j9-^Mpj^CJVr%GSOH7qx5>i>Hl+FrZG;OXB^)ZdTnV}TD6QU<;zBqsG6pz zP1~FV8fYO^NZLR)2UiHzt{2;Ddwr}uV~=O-8Q)8H#~vT!@pvwu>pi@u4Fo7D1y*fB z)Xm+6PB_aX}}3AvAOAmCg{qqBQutcn$gvB^Y8cf}-OnHAWaw z8yO6uKJwrzHusc+pnT!T1{9L?#(Za6E}s#SVj+_*NL;R%P)XjK3z9^@Zy~X;JxoOH zlqYO!#G?FiA9y!-GJY5%nFrEgC^jblfgtvWx$Bm)BARA*WBxuO||LrY&q3dZnk)-sw_4? zy$_Hb)WYZW50feoEniwXw3d;$50af`?B({DlrdDCv%Jy{;(i zjU3cNV?ZcuYrLn{-%RX3Pk60gI1F_{Gq*%w^DhrZcaL9PS}G zfas`E))*U20KMj&Nb}=!H)``jLCVfomdoG^jS_BJif;h;%cr#oKN$LD@2IY4&>BN~ zg3>x$DmBGsX^B;HMYaS(bcNbCfSjW&0|-W$hvD(r;lXTBV9`Z%tN$X^=Ns6*x$ytY z@eX&6yCBYnsJ^qv?#`8xE~(TvnNq$vf0Kbs-j!3t^R>S->f~@jj*8*DlZEo_kD4%> zGaT?oOqMY2c9Mks6hWDe`lu+5O$uw=`m6|DE?wn6;oHd)n`0|tmCX4W?{w@0EK1?@ zDD8{eBY0dNMg97zJ^1?+k@7*23CRhrATOrn|8{;rhK9))nQ{Z$)Go6 zI6myy8_)x*Hf~KDirx(>Q}Jda%W$z1J~}kORrm{;k^p(Go@L9MoyU_UUWHcXSQsmK zIDO_I>wr!Dptxp9AIxA2Kr;HI$9FPnijBISK0d7PeaEpksE>}O zz4a-8Jfp92VJS90tB5ztf2wb`IzK*BO39C^rB(jxl)RJxXEn%9z06f}V5obb`=l zTVZ0pTMr&h5b{lz=-$;4=74eP<E}yQX{rz1|o=GyID5f&gxyZCX;2GtoIX+7Hag%2v zY_mK+SjgnXv=n0S>F6wTKHbW$Z*~qUpQqb|fMs!yH)ye9RIk6MwK!=v832P%Fz7tm z&0#fc`+wS@Ma0zE(VfvDyqm?sVKOtpxM7ZEUWBfZnTTOQ!r~USUd1}F5k2b&`waByaD=@NS8?Z=xGj%IkN>#yCZL(FmLC#k{To12(w$6)*0TW=ZO0QKKlEnst9{t+usO zyKLH|O*o?!J9yPpjyOm6p8Gw{cfRwT-;c!|&0dAG$M+Ki5iEl5jK72_=db_;{>{%S7M?0Ynk-Uj_OiXwXjtu)_+L_S^MaIp0Q zQVK>T@b5A*bWwjw*=ttnFPPf#PFsg(KrrX0)}{*S{BdbBQ!qz zx`ps){evM|@R#@q0_%L7i${g=eCV7s?Ok*h^wX-;m}C0Pl`dX4wpVvSd%B&t=B_1caee)(1X8~rsee%3lFhg&&@JIBqQLO@ zP*k5VN4)_-8@HBhi_T^6dkMFY$_L_}R3<$&Jsr&nkxAOiMhxSC68E&w=8p3Q6Und! zokFD;7*Y??3`+wzRLQmB)#{%a%#MbCqC2O&pj+=-g(liU7z~#Nv=xo|9XkIx2fgIf|VWy>h12SUf#L2Zwg zH2vV!x5`IBxp9xI$c(Fy6|dTKq@(gB0R1cBW&Un-CHyX*Pn10Kq|lBMv!5MupSAti z=rqCev;v7SD_wmDl3&9r(zsTVx`-E#{xith^cG{4oHD z6j3nZkc$Q*fv6`r9#7v+t?>m<+<_YdS~q34^;mk(A-JJuai+)E?bPXBvvwQ5qi+fl z5mV9?2}f1{%sdEZ-BbLWCmGDdu5ru4WnaQ1Af|Y9;F5Mw+uCAO@S2z-kw=^&ofT%| zfRvbCw9=+7D?LKg+-^i}SFv5F7e*7T?%|H5h7E>M#hzm@*d^V*55^pGJMk?oTL_&1&U&ilRCUgXV4vK_0f&Fr($PTkTQ=NUtiaUmchm zxjD@XxqRUl0G7()!17#qb6}A#fQZBz)%&SYnl&1OIux=|f<0?DJ1;q`BRcZDsntR{ zG|1uVA2*E3QGbHdPY%x+3iO(zD*+omU$7IcxUnDAqU>T{Ni~ZE40 zc)y$UQ4u!ihU<=XT9)~nEera@R;`6P_TrF6G5pMFogJvf#<(qwRt8yWpn{qE3(SfNpajaIdS!BBy{6OE-e(@2>`hyVt3bO?*(eLH#nXdnm7^ zH35@N(|y^YB~!wMm>[A=cVa|NzNr0_^Ux6TSE#||^t-6{qctWKKjv@Q!8_vex2bTvmN0)pd(_o0g@d>kCMWaNsY^?s5$WAM#k+|;sJyj9fFd|qMpP(v*Nx( zOTyk#NmAmt?BqywXmZ;TE4Ct(+DGRdmv(BMv-djdoPW;Dn)R;d_rA~b%=3JI-_QGd zw3cr`9?WnCPTmYt>|aU<#32} znh6pI1Ysu~;Skb5a(PlwERYe#WrcB!C|dju&=j`iFo--QcpwMMBHOy4hPa2j9ZV#B zkxHU`6iQ@!lXHu9QvVQ6yP;3@$0Bsm1wK(aS&?Tc$(J#%+^s~b?iQO*7fj~lRP9pT zbYbk+Z7b`_C=2eoQ`?3tZ=TL*%eB|2tZ6RH@*H^oH~?dB?uzOppHpgaDb;J98cf}a zwsJ|1{p)Y;17ic?X}u+R`99L8emQ@;o}Y5hZ?ON0es}YE=YXfpYJ2L+tg(-+w2H`? zriagr-I7>q>tMG^qMD(ueaorKA!)3rqZNHsp~It@P@J@PE^ebYJ0V>u-W>^KCN8kDI0n3!_1Z3LK&sLMnaNbtE^E(DrRzQI##b!tZBk* zk5A1O(i9nSUnBA(F1gRKUM06b%k5jrTS2%J4leo9eZ0)ioUq#tRs?uq1B;jTWN^3) zb_7JBMKWLoATJC{;H4a**#5MLXl7U#V_6SLM2}!v43`0G05xGi3a_vjfG7+$ml?>U z)3{7l1iS`lEb2#Cx-Ik)XW2?iwk0D@HT&JR!X|myw*M1W@KIV{+Le!z6+z;XXkkWO zYWu0=emhhlnUGPI7WMk7>tz33+4>+_U2%Z=)7rT<^5sJy!z=NKAhg#aU$(w;Ja#JP zLL$qi{&)rMX7F^_iMBd7;$^1|GuIw_`>LS}-kXMMmb@)Kb3wHQJ$P`d+jAMe@lEQ9 zHMl<8=Bxc_b-wW-u!-nt9{!>u^Z@4IJc;eGX5?J?)ABWa!KS4zo;MsmVt6leZCYSm zvX>_-s@|qlH_f|kwW3YIp_d+aB_r&830zHU+rFU;NkUSIB2=38Jdlzm6{U#?wfEY4 zCsXr;iUu@@2D3;qQ&K1;V~GYKgeYl1AyY+$|Fw2F$2mFg`+nc|e!uVgf9LE|yS>+1 z&wAD~+|PAi_jNy%nsyvK%N*jZep03%>$%^eqPXGbk0t75J4mc|j7y>)E{NP-Gw4I< zbmgtnb6PfB+vOGiymQB$^qAZi4bN^g3}t(HteLl5%1~nXX04+cmU+&3Cel4?{l2cf zyz#4vw6?6d?!u&g$DQkoCb~*$OO;7k9IAEkBB-+sY=%WY>}A?IK<-08KcgtMubw?e zPZMoE*kfPAC;37vwSGoJ%A)%XExYOxCh?fT^nJN+c6j*2or44JYh>(lS+hK~;N;mi z$7h=u-btxCuSs6%7a7Ch#4(NDqBqs-_cKc>2`l#iva#S|o0p%?TMTYrlO-e2y$)fh6)(g`XZ?N$=W_zvZdDiX8;k#5kT$Wnye73PXG}!ym!Nq5H zY~Q}=k+buJTH=hX%3a+LP9NOe3YJ}5sN;8RcIW4c_mvqdtJ~C%W!4*M>OT%xe0(ow zUh$?2>v@^RJd^mszOKP%dYbe)-)k;c;!RxV=E5}#ZL3}7cPL)(w8fG`Mw@~ zk_sQ5{J`Lhi!FLQMX+#1Qm8_r%u+Y{CHIz`O|Gk2V1iea6~@&&RYV)iUV1(&b$#g(xAWNY@z;m7wEI80y=iua zg1rMb*xK#z)Xz>E-?V0P8gI8VjmH?DZ9eR1km_OmV7jy*ZjLC<=Ihxdi`w3=iGFlY z`9$=ZkNbD$-k-2|L%T-l7R576H^ZVOiq}#n?SDW?4BZuQlx|slC&^jYr_ENq!CJN{ zw-?K+>eMQqaP51KmoDDCIUw+2u!Ff*e?!Bb3nVvwmKZ`+jh9$8~Z>(zjGas&+-`J%?CDYMYH-kz>U?solKr>Djonjpo+ZiaH&quabGZ zW1MniW|)&!kX+fEb^XnUh_4=v}i=AM(n0@b$VG`T8ewUK=pOyVUwC@_4fCQ_6O~b z9wut4t5*|wnbZ5-&7$gG>@)nv=c)Q`iQZ*-dFR>&v{?3ilX9o6hpE@`y$BCfcJKM+l^-0 z9$KABaiewTvYod}mIylP?Dl@GlQrCt7jS1s#JDYi^XyLzd^AaDGb8iOw6+(@%v}=_ zS9rgky}Vy-%wXB0WqQ0BUOCfmY9f zET>kWG<=9unNd<)RMZ?z#-xNkqn%duToR_7B!4vh?WWtBM|%`aeXXahHLXVhewIx#Sbd2Mcv61pc(t=F2tqiASqaVg^AJA+av+AI>Oz$s^yQ^mh zISrjNB*S`Y{W|3#%OX5Y*ObUa8298#hlQnjUmG`C)kL^z75fr%i0oh^1-To8Wyja8 zzF3#pd*VTjOR6c}L1o8Nr8Ooz51Y92fkh9xR`bW2kgQjoXC`f0{&~UeBhOtvOWhul zV>8RI-+HMFZ4Xy_F-jF%`lWJi*eZ+WIcdxo={PLVaLYCPsfkk~W0o+JSv|jUhZ;QSF`4^9 zZ={>gv$_qt7FZXJGswP>IDE~Xk3kz7GlNg8xg_K0VR=K{YK1|ubnya%JC*L~&zJgU zJ&F6YztCu0iA>AnoVO;m1@q26YPNnfyjgJAx+KjZa6&dkS3#-cMdIVwHwo1f@AZ*4 zp7Z(Snf$krlKxGnGEy>2&6Syxwx##&e3UD>Ksey_Sjl^lqgz-;vW+DJCT=t2UEMjh zazXJ-dEWZ8p!hk1*XMa|-*fpyY3zqRtS=EqwBI{TaOmGpD*RlpNY|J*i8d3qHivl{ zaz^_kwSE%0D;@G&m-?~E&Xcu0+?+63=cI7$L-lD?X7w1 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

w>qiuTV7FM5rM3_TH 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 From 7214d38e1e46d59d2a084fed5d576504a12fbab6 Mon Sep 17 00:00:00 2001 From: astrogeco <59618057+astrogeco@users.noreply.github.com> Date: Fri, 18 Dec 2020 12:17:59 -0500 Subject: [PATCH 038/111] Bump to v5.1.0-rc1+dev132 --- README.md | 14 ++++++++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd682fb32..86cd9bdee 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,20 @@ The autogenerated OSAL user's guide can be viewed at + ### Development Build: 5.1.0-rc1+dev109 - Add support for RTEMS 5.1 in the OSAL and provides defines and necessary ifdefs so RTEMS 4.11 can continue to be supported. diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index a8760a49c..b71137902 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 109 +#define OS_BUILD_NUMBER 132 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* From ce8e85cfd9544a76203dd58232269432a52e02ec Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 21 Dec 2020 13:48:18 -0500 Subject: [PATCH 039/111] Fix #702, use iterators instead of for loops Convert remaining operations using for loops to use iterators. This ensures locking is done consistently and correctly. --- src/os/shared/inc/os-shared-idmap.h | 22 +++- src/os/shared/src/osapi-file.c | 14 +- src/os/shared/src/osapi-filesys.c | 43 +++--- src/os/shared/src/osapi-idmap.c | 124 +++++++++++------- src/tests/osal-core-test/osal-core-test.c | 2 +- .../shared/src/coveragetest-filesys.c | 10 +- src/ut-stubs/osapi-utstub-idmap.c | 2 +- 7 files changed, 139 insertions(+), 78 deletions(-) diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index 2a3201932..fe13d282a 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -228,6 +228,26 @@ static inline void OS_ObjectIdCompose_Impl(osal_objtype_t idtype, uint32 idseria *result = OS_ObjectIdFromInteger((idtype << OS_OBJECT_TYPE_SHIFT) | idserial); } +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Check if an object ID represents a valid/active value. + * + * This tests that the ID value is within the range specifically used by + * valid OSAL IDs. This is smaller than the set of defined IDs. + * + * For example, the value of OS_OBJECT_ID_RESERVED is defined but not valid. + * So while OS_ObjectIdDefined() will match entries being actively created or + * deleted, OS_ObjectIdIsValid() will not. + * + * @param[in] object_id The object ID + * @returns true if table entry is valid + */ +static inline bool OS_ObjectIdIsValid(osal_id_t object_id) +{ + osal_objtype_t objtype = OS_ObjectIdToType_Impl(object_id); + return (objtype > OS_OBJECT_TYPE_UNDEFINED && objtype < OS_OBJECT_TYPE_USER); +} + /*---------------------------------------------------------------- Function: OS_GetMaxForObjectType @@ -488,7 +508,7 @@ static inline const OS_object_token_t *OS_ObjectIdIteratorRef(OS_object_iter_t * Returns: None ------------------------------------------------------------------*/ -int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t)); +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t,void*)); /* * Internal helper functions diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 8947398a6..1db28e3da 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -68,6 +68,16 @@ enum OS_stream_internal_record_t OS_stream_table[OS_MAX_NUM_OPEN_FILES]; +/*---------------------------------------------------------------- + * + * Helper function to close a file from an iterator + * + *-----------------------------------------------------------------*/ +int32 OS_FileIteratorClose(osal_id_t filedes, void *arg) +{ + return OS_close(filedes); +} + /**************************************************************************************** FILE API ***************************************************************************************/ @@ -669,7 +679,7 @@ int32 OS_CloseFileByName(const char *Filename) if (stream->socket_domain == OS_SocketDomain_INVALID && (strcmp(stream->stream_name, Filename) == 0)) { /* call OS_close() on the entry referred to by the iterator */ - close_code = OS_ObjectIdIteratorProcessEntry(&iter, OS_close); + close_code = OS_ObjectIdIteratorProcessEntry(&iter, OS_FileIteratorClose); if (return_code == OS_FS_ERR_PATH_INVALID || close_code != OS_SUCCESS) { @@ -705,7 +715,7 @@ int32 OS_CloseAllFiles(void) while (OS_ObjectIdIteratorGetNext(&iter)) { /* call OS_close() on the entry referred to by the iterator */ - close_code = OS_ObjectIdIteratorProcessEntry(&iter, OS_close); + close_code = OS_ObjectIdIteratorProcessEntry(&iter, OS_FileIteratorClose); if (close_code != OS_SUCCESS) { return_code = close_code; diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index bc8156307..3f331e87e 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -63,6 +63,21 @@ OS_filesys_internal_record_t OS_filesys_table[LOCAL_NUM_OBJECTS]; */ const char OS_FILESYS_RAMDISK_VOLNAME_PREFIX[] = "RAM"; +/*---------------------------------------------------------------- + * + * Function: OS_FileSysFilterFree + * + * Purpose: Local helper routine, not part of OSAL API. + * Iterator function to match only the free/open entries + * + * Returns: true if the entry is free, false if it is in use + * + *-----------------------------------------------------------------*/ +bool OS_FileSysFilterFree(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) +{ + return !OS_ObjectIdDefined(obj->active_id); +} + /*---------------------------------------------------------------- * * Function: OS_FileSys_FindVirtMountPoint @@ -688,7 +703,7 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) *-----------------------------------------------------------------*/ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) { - osal_index_t idx; + OS_object_iter_t iter; /* Check parameters */ OS_CHECK_POINTER(filesys_info); @@ -698,29 +713,19 @@ int32 OS_GetFsInfo(os_fsinfo_t *filesys_info) filesys_info->MaxFds = OS_MAX_NUM_OPEN_FILES; filesys_info->MaxVolumes = OS_MAX_FILE_SYSTEMS; - OS_Lock_Global(OS_OBJECT_TYPE_OS_STREAM); - - for (idx = 0; idx < OS_MAX_NUM_OPEN_FILES; idx++) + OS_ObjectIdIteratorInit(OS_FileSysFilterFree, NULL, OS_OBJECT_TYPE_OS_STREAM, &iter); + while (OS_ObjectIdIteratorGetNext(&iter)) { - if (!OS_ObjectIdDefined(OS_global_stream_table[idx].active_id)) - { - filesys_info->FreeFds++; - } + ++filesys_info->FreeFds; } + OS_ObjectIdIteratorDestroy(&iter); - OS_Unlock_Global(OS_OBJECT_TYPE_OS_STREAM); - - OS_Lock_Global(OS_OBJECT_TYPE_OS_FILESYS); - - for (idx = 0; idx < OS_MAX_FILE_SYSTEMS; idx++) + OS_ObjectIdIteratorInit(OS_FileSysFilterFree, NULL, OS_OBJECT_TYPE_OS_FILESYS, &iter); + while (OS_ObjectIdIteratorGetNext(&iter)) { - if (!OS_ObjectIdDefined(OS_global_filesys_table[idx].active_id)) - { - filesys_info->FreeVolumes++; - } + ++filesys_info->FreeVolumes; } - - OS_Unlock_Global(OS_OBJECT_TYPE_OS_FILESYS); + OS_ObjectIdIteratorDestroy(&iter); return (OS_SUCCESS); } /* end OS_GetFsInfo */ diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 27debe318..07f8e06be 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -73,6 +73,18 @@ typedef enum OS_MAX_TOTAL_RECORDS = OS_CONSOLE_BASE + OS_MAX_CONSOLES } OS_ObjectIndex_t; +/* + * A structure containing the user-specified + * details of a "foreach" iteration request + */ +typedef struct +{ + osal_id_t creator_id; + OS_ArgCallback_t user_callback; + void * user_arg; +} OS_creator_filter_t; + + /* * Global ID storage tables */ @@ -210,6 +222,44 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) * (not used outside of this unit) **************************************************************/ +/*---------------------------------------------------------------- + * + * Function: OS_ForEachFilterCreator + * + * Purpose: Local helper routine, not part of OSAL API. + * Determine if the object is a match for "foreach" operations + * + *-----------------------------------------------------------------*/ +bool OS_ForEachFilterCreator(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) +{ + OS_creator_filter_t *filter = ref; + + /* + * Check if the obj_id is both valid and matches + * the specified creator_id + */ + return (OS_ObjectIdIsValid(obj->active_id) && (OS_ObjectIdEqual(filter->creator_id, OS_OBJECT_CREATOR_ANY) || + OS_ObjectIdEqual(obj->creator, filter->creator_id))); +} + +/*---------------------------------------------------------------- + * + * Function: OS_ForEachDoCallback + * + * Purpose: Local helper routine, not part of OSAL API. + * Invoke the user-specified callback routine + * + *-----------------------------------------------------------------*/ +int32 OS_ForEachDoCallback(osal_id_t obj_id, void *ref) +{ + OS_creator_filter_t *filter = ref; + + /* Just invoke the user callback */ + filter->user_callback(obj_id, filter->user_arg); + return OS_SUCCESS; +} + + /*---------------------------------------------------------------- * * Function: OS_ObjectIdGlobalFromToken @@ -279,20 +329,24 @@ int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype return OS_ERR_INCORRECT_OBJ_STATE; } - if (idtype >= OS_OBJECT_TYPE_USER) + /* + * Transactions cannot be started on an object type for which + * there are no actual objects + */ + if (OS_GetMaxForObjectType(idtype) == 0) { return OS_ERR_INCORRECT_OBJ_TYPE; } + token->lock_mode = lock_mode; + token->obj_type = idtype; + token->obj_idx = OSAL_INDEX_C(-1); + if (lock_mode != OS_LOCK_MODE_NONE) { OS_Lock_Global(idtype); } - token->lock_mode = lock_mode; - token->obj_type = idtype; - token->obj_idx = OSAL_INDEX_C(-1); - return OS_SUCCESS; } /* end OS_ObjectIdTransactionInit */ @@ -1263,7 +1317,7 @@ void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter) Purpose: Call a handler function on an iterator object ID ------------------------------------------------------------------*/ -int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t)) +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t, void *)) { int32 status; @@ -1272,7 +1326,7 @@ int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal * call the handler function, then re-lock. */ OS_Unlock_Global(iter->token.obj_type); - status = func(iter->token.obj_id); + status = func(OS_ObjectIdFromToken(&iter->token), iter->arg); OS_Lock_Global(iter->token.obj_type); return status; @@ -1324,55 +1378,23 @@ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void * See description in API and header file for detail * *-----------------------------------------------------------------*/ -void OS_ForEachObjectOfType(osal_objtype_t idtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, - void *callback_arg) +void OS_ForEachObjectOfType(osal_objtype_t idtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg) { - osal_index_t obj_index; - uint32 obj_max; - osal_id_t obj_id; + OS_object_iter_t iter; + OS_creator_filter_t filter; - obj_max = OS_GetMaxForObjectType(idtype); - if (obj_max > 0) + filter.creator_id = creator_id; + filter.user_callback = callback_ptr; + filter.user_arg = callback_arg; + + if (OS_ObjectIdIteratorInit(OS_ForEachFilterCreator, &filter, idtype, &iter) == OS_SUCCESS) { - obj_index = OS_GetBaseForObjectType(idtype); - OS_Lock_Global(idtype); - while (obj_max > 0) + while (OS_ObjectIdIteratorGetNext(&iter)) { - /* - * Check if the obj_id is both valid and matches - * the specified creator_id - */ - obj_id = OS_common_table[obj_index].active_id; - if (OS_ObjectIdDefined(obj_id) && !OS_ObjectIdEqual(creator_id, OS_OBJECT_CREATOR_ANY) && - !OS_ObjectIdEqual(OS_common_table[obj_index].creator, creator_id)) - { - /* valid object but not a creator match - - * skip the callback for this object */ - obj_id = OS_OBJECT_ID_UNDEFINED; - } - - if (OS_ObjectIdDefined(obj_id)) - { - /* - * Invoke Callback for the object, which must be done - * while the global table is unlocked. - * - * Note this means by the time the callback is done, - * the object could have been deleted by another task. - * - * But this must not invoke a callback with a locked table, - * as the callback function might call other OSAL functions, - * which could deadlock. - */ - OS_Unlock_Global(idtype); - (*callback_ptr)(obj_id, callback_arg); - OS_Lock_Global(idtype); - } - - ++obj_index; - --obj_max; + OS_ObjectIdIteratorProcessEntry(&iter, OS_ForEachDoCallback); } - OS_Unlock_Global(idtype); + + OS_ObjectIdIteratorDestroy(&iter); } } /* end OS_ForEachObjectOfType */ diff --git a/src/tests/osal-core-test/osal-core-test.c b/src/tests/osal-core-test/osal-core-test.c index 70f4dbb50..bef1e07d4 100644 --- a/src/tests/osal-core-test/osal-core-test.c +++ b/src/tests/osal-core-test/osal-core-test.c @@ -714,7 +714,7 @@ void TestGenericQueries(void) UtAssert_StrCmp(ResourceName, "q 0", "Output value correct"); status = OS_GetResourceName(OS_OBJECT_ID_UNDEFINED, ResourceName, sizeof(ResourceName)); - UtAssert_True(status == OS_ERR_INVALID_ID, "OS_GetResourceName (%lx,%ld) == OS_ERR_INVALID_ID", + UtAssert_True(status == OS_ERR_INCORRECT_OBJ_TYPE, "OS_GetResourceName (%lx,%ld) == OS_ERR_INCORRECT_OBJ_TYPE", OS_ObjectIdToInteger(OS_OBJECT_ID_UNDEFINED), (long)status); status = OS_GetResourceName(bin_0, ResourceName, OSAL_SIZE_C(1)); diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index eb744b0f3..0d7110b62 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -404,6 +404,10 @@ void Test_OS_GetFsInfo(void) int32 actual = ~OS_SUCCESS; os_fsinfo_t filesys_info; + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdIteratorGetNext), 1); + UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdIteratorGetNext), 3, 0); + UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdIteratorGetNext), 4, 0); + actual = OS_GetFsInfo(&filesys_info); UtAssert_True(actual == expected, "OS_FileSysInfo() (%ld) == OS_SUCCESS", (long)actual); @@ -414,11 +418,11 @@ void Test_OS_GetFsInfo(void) "filesys_info.MaxVolumes (%lu) == OS_MAX_FILE_SYSTEMS", (unsigned long)filesys_info.MaxVolumes); /* since there are no open files, the free fd count should match the max */ - UtAssert_True(filesys_info.FreeFds == OS_MAX_NUM_OPEN_FILES, "filesys_info.FreeFds (%lu) == OS_MAX_NUM_OPEN_FILES", + UtAssert_True(filesys_info.FreeFds == 2, "filesys_info.FreeFds (%lu) == 2", (unsigned long)filesys_info.FreeFds); - UtAssert_True(filesys_info.FreeVolumes == OS_MAX_FILE_SYSTEMS, - "filesys_info.FreeVolumes (%lu) == OS_MAX_FILE_SYSTEMS", (unsigned long)filesys_info.FreeVolumes); + UtAssert_True(filesys_info.FreeVolumes == 3, "filesys_info.FreeVolumes (%lu) == 3", + (unsigned long)filesys_info.FreeVolumes); expected = OS_INVALID_POINTER; actual = OS_GetFsInfo(NULL); diff --git a/src/ut-stubs/osapi-utstub-idmap.c b/src/ut-stubs/osapi-utstub-idmap.c index 3c9972b9b..ac30659b6 100644 --- a/src/ut-stubs/osapi-utstub-idmap.c +++ b/src/ut-stubs/osapi-utstub-idmap.c @@ -573,7 +573,7 @@ void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter) UT_DEFAULT_IMPL(OS_ObjectIdIteratorDestroy); } -int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t)) +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t, void*)) { int32 Status; From 29e1fd52db85c2c4a71bd2fed3cb9223f8d28791 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 21 Dec 2020 13:13:56 -0500 Subject: [PATCH 040/111] Fix #645, implement separate lock/unlock key Implement an "unlock key" - based on task ID - which can be part of the local token, rather than relying on the task ID being the same between the lock and unlock ops. Notably, the task ID can change, in particular if the task is exiting. Also Fixes #701, other general cleanup Implement all global lock/unlock error checking in shared layer, not in impl layer, for consistency. Remove redundant checks. Make all functions return void (should never fail) and in the unlikely event that something does fail then report the error, but no other recourse possible. --- src/os/posix/inc/os-impl-idmap.h | 44 ++++ src/os/posix/src/os-impl-idmap.c | 195 +++++++---------- src/os/rtems/inc/os-impl-idmap.h | 43 ++++ src/os/rtems/src/os-impl-idmap.c | 139 +++++------- src/os/shared/inc/os-shared-common.h | 16 -- src/os/shared/inc/os-shared-idmap.h | 37 +++- src/os/shared/src/osapi-idmap.c | 198 +++++++++--------- src/os/shared/src/osapi-module.c | 9 +- src/os/shared/src/osapi-sockets.c | 8 +- src/os/vxworks/inc/os-impl-idmap.h | 44 ++++ src/os/vxworks/inc/os-vxworks.h | 8 - src/os/vxworks/src/os-impl-idmap.c | 175 ++++++++++------ .../shared/src/coveragetest-idmap.c | 48 ++++- .../ut-stubs/src/osapi-idmap-impl-stubs.c | 10 +- .../vxworks/adaptors/src/ut-adaptor-idmap.c | 3 +- .../vxworks/src/coveragetest-idmap.c | 23 +- src/ut-stubs/osapi-utstub-idmap.c | 34 ++- 17 files changed, 614 insertions(+), 420 deletions(-) create mode 100644 src/os/posix/inc/os-impl-idmap.h create mode 100644 src/os/rtems/inc/os-impl-idmap.h create mode 100644 src/os/vxworks/inc/os-impl-idmap.h diff --git a/src/os/posix/inc/os-impl-idmap.h b/src/os/posix/inc/os-impl-idmap.h new file mode 100644 index 000000000..fcedf13ef --- /dev/null +++ b/src/os/posix/inc/os-impl-idmap.h @@ -0,0 +1,44 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 os-impl-idmap.h + * \ingroup posix + * \author joseph.p.hickey@nasa.gov + * + */ + +#ifndef OS_IMPL_IDMAP_H +#define OS_IMPL_IDMAP_H + +#include "osconfig.h" +#include "osapi-idmap.h" +#include + +typedef struct +{ + pthread_mutex_t mutex; + pthread_cond_t cond; +} OS_impl_objtype_lock_t; + +/* Tables where the lock state information is stored */ +extern OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER]; + +#endif /* OS_IMPL_IDMAP_H */ diff --git a/src/os/posix/src/os-impl-idmap.c b/src/os/posix/src/os-impl-idmap.c index 348bb75ad..2ec48dda3 100644 --- a/src/os/posix/src/os-impl-idmap.c +++ b/src/os/posix/src/os-impl-idmap.c @@ -34,45 +34,36 @@ #include #include "os-shared-idmap.h" - -typedef struct +#include "os-impl-idmap.h" + +static OS_impl_objtype_lock_t OS_global_task_table_lock; +static OS_impl_objtype_lock_t OS_queue_table_lock; +static OS_impl_objtype_lock_t OS_bin_sem_table_lock; +static OS_impl_objtype_lock_t OS_mutex_table_lock; +static OS_impl_objtype_lock_t OS_count_sem_table_lock; +static OS_impl_objtype_lock_t OS_stream_table_lock; +static OS_impl_objtype_lock_t OS_dir_table_lock; +static OS_impl_objtype_lock_t OS_timebase_table_lock; +static OS_impl_objtype_lock_t OS_timecb_table_lock; +static OS_impl_objtype_lock_t OS_module_table_lock; +static OS_impl_objtype_lock_t OS_filesys_table_lock; +static OS_impl_objtype_lock_t OS_console_lock; + +OS_impl_objtype_lock_t * const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = { - pthread_mutex_t mutex; - pthread_cond_t cond; -} POSIX_GlobalLock_t; - -static POSIX_GlobalLock_t OS_global_task_table_mut; -static POSIX_GlobalLock_t OS_queue_table_mut; -static POSIX_GlobalLock_t OS_bin_sem_table_mut; -static POSIX_GlobalLock_t OS_mutex_table_mut; -static POSIX_GlobalLock_t OS_count_sem_table_mut; -static POSIX_GlobalLock_t OS_stream_table_mut; -static POSIX_GlobalLock_t OS_dir_table_mut; -static POSIX_GlobalLock_t OS_timebase_table_mut; -static POSIX_GlobalLock_t OS_timecb_table_mut; -static POSIX_GlobalLock_t OS_module_table_mut; -static POSIX_GlobalLock_t OS_filesys_table_mut; -static POSIX_GlobalLock_t OS_console_mut; - -static POSIX_GlobalLock_t *const MUTEX_TABLE[] = { [OS_OBJECT_TYPE_UNDEFINED] = NULL, - [OS_OBJECT_TYPE_OS_TASK] = &OS_global_task_table_mut, - [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_mut, - [OS_OBJECT_TYPE_OS_COUNTSEM] = &OS_count_sem_table_mut, - [OS_OBJECT_TYPE_OS_BINSEM] = &OS_bin_sem_table_mut, - [OS_OBJECT_TYPE_OS_MUTEX] = &OS_mutex_table_mut, - [OS_OBJECT_TYPE_OS_STREAM] = &OS_stream_table_mut, - [OS_OBJECT_TYPE_OS_DIR] = &OS_dir_table_mut, - [OS_OBJECT_TYPE_OS_TIMEBASE] = &OS_timebase_table_mut, - [OS_OBJECT_TYPE_OS_TIMECB] = &OS_timecb_table_mut, - [OS_OBJECT_TYPE_OS_MODULE] = &OS_module_table_mut, - [OS_OBJECT_TYPE_OS_FILESYS] = &OS_filesys_table_mut, - [OS_OBJECT_TYPE_OS_CONSOLE] = &OS_console_mut, -}; - -enum -{ - MUTEX_TABLE_SIZE = (sizeof(MUTEX_TABLE) / sizeof(MUTEX_TABLE[0])) + [OS_OBJECT_TYPE_OS_TASK] = &OS_global_task_table_lock, + [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_lock, + [OS_OBJECT_TYPE_OS_COUNTSEM] = &OS_count_sem_table_lock, + [OS_OBJECT_TYPE_OS_BINSEM] = &OS_bin_sem_table_lock, + [OS_OBJECT_TYPE_OS_MUTEX] = &OS_mutex_table_lock, + [OS_OBJECT_TYPE_OS_STREAM] = &OS_stream_table_lock, + [OS_OBJECT_TYPE_OS_DIR] = &OS_dir_table_lock, + [OS_OBJECT_TYPE_OS_TIMEBASE] = &OS_timebase_table_lock, + [OS_OBJECT_TYPE_OS_TIMECB] = &OS_timecb_table_lock, + [OS_OBJECT_TYPE_OS_MODULE] = &OS_module_table_lock, + [OS_OBJECT_TYPE_OS_FILESYS] = &OS_filesys_table_lock, + [OS_OBJECT_TYPE_OS_CONSOLE] = &OS_console_lock, }; /*--------------------------------------------------------------------------------------- @@ -92,31 +83,19 @@ void OS_Posix_ReleaseTableMutex(void *mut) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(osal_objtype_t idtype) +void OS_Lock_Global_Impl(osal_objtype_t idtype) { - POSIX_GlobalLock_t *mut; + OS_impl_objtype_lock_t *impl; int ret; - if (idtype < MUTEX_TABLE_SIZE) - { - mut = MUTEX_TABLE[idtype]; - } - else - { - mut = NULL; - } + impl = OS_impl_objtype_lock_table[idtype]; - if (mut != NULL) + ret = pthread_mutex_lock(&impl->mutex); + if (ret != 0) { - ret = pthread_mutex_lock(&mut->mutex); - if (ret != 0) - { - OS_DEBUG("pthread_mutex_lock(&mut->mutex): %s", strerror(ret)); - return OS_ERROR; - } + OS_DEBUG("pthread_mutex_lock(&impl->mutex): %s", strerror(ret)); } - return OS_SUCCESS; } /* end OS_Lock_Global_Impl */ /*---------------------------------------------------------------- @@ -127,39 +106,27 @@ int32 OS_Lock_Global_Impl(osal_objtype_t idtype) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) +void OS_Unlock_Global_Impl(osal_objtype_t idtype) { - POSIX_GlobalLock_t *mut; + OS_impl_objtype_lock_t *impl; int ret; - if (idtype < MUTEX_TABLE_SIZE) - { - mut = MUTEX_TABLE[idtype]; - } - else + impl = OS_impl_objtype_lock_table[idtype]; + + /* Notify any waiting threads that the state _may_ have changed */ + ret = pthread_cond_broadcast(&impl->cond); + if (ret != 0) { - mut = NULL; + OS_DEBUG("pthread_cond_broadcast(&impl->cond): %s", strerror(ret)); + /* unexpected but keep going (not critical) */ } - if (mut != NULL) + ret = pthread_mutex_unlock(&impl->mutex); + if (ret != 0) { - /* Notify any waiting threads that the state _may_ have changed */ - ret = pthread_cond_broadcast(&mut->cond); - if (ret != 0) - { - OS_DEBUG("pthread_cond_broadcast(&mut->cond): %s", strerror(ret)); - /* unexpected but keep going (not critical) */ - } - - ret = pthread_mutex_unlock(&mut->mutex); - if (ret != 0) - { - OS_DEBUG("pthread_mutex_unlock(&mut->mutex): %s", strerror(ret)); - return OS_ERROR; - } + OS_DEBUG("pthread_mutex_unlock(&impl->mutex): %s", strerror(ret)); } - return OS_SUCCESS; } /* end OS_Unlock_Global_Impl */ /*---------------------------------------------------------------- @@ -172,42 +139,39 @@ int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) *-----------------------------------------------------------------*/ void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) { - POSIX_GlobalLock_t *impl; + OS_impl_objtype_lock_t *impl; struct timespec ts; - impl = MUTEX_TABLE[idtype]; + impl = OS_impl_objtype_lock_table[idtype]; - if (impl != NULL) - { - /* - * because pthread_cond_timedwait() is also a cancellation point, - * this pushes a cleanup handler to ensure that if canceled during this call, - * the mutex will be released. - */ - pthread_cleanup_push(OS_Posix_ReleaseTableMutex, &impl->mutex); + /* + * because pthread_cond_timedwait() is also a cancellation point, + * this pushes a cleanup handler to ensure that if canceled during this call, + * the mutex will be released. + */ + pthread_cleanup_push(OS_Posix_ReleaseTableMutex, &impl->mutex); - clock_gettime(CLOCK_REALTIME, &ts); + clock_gettime(CLOCK_REALTIME, &ts); - if (attempts <= 10) - { - /* Wait an increasing amount of time, starting at 10ms */ - ts.tv_nsec += attempts * attempts * 10000000; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - } - else + if (attempts <= 10) + { + /* Wait an increasing amount of time, starting at 10ms */ + ts.tv_nsec += attempts * attempts * 10000000; + if (ts.tv_nsec >= 1000000000) { - /* wait 1 second (max for polling) */ + ts.tv_nsec -= 1000000000; ++ts.tv_sec; } + } + else + { + /* wait 1 second (max for polling) */ + ++ts.tv_sec; + } - pthread_cond_timedwait(&impl->cond, &impl->mutex, &ts); + pthread_cond_timedwait(&impl->cond, &impl->mutex, &ts); - pthread_cleanup_pop(false); - } + pthread_cleanup_pop(false); } /*--------------------------------------------------------------------------------------- @@ -222,23 +186,16 @@ int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) int ret; int32 return_code = OS_SUCCESS; pthread_mutexattr_t mutex_attr; - POSIX_GlobalLock_t *impl; + OS_impl_objtype_lock_t *impl; - do + impl = OS_impl_objtype_lock_table[idtype]; + if (impl == NULL) { - if (idtype >= MUTEX_TABLE_SIZE) - { - break; - } - - impl = MUTEX_TABLE[idtype]; - - /* Initialize the table mutex for the given idtype */ - if (impl == NULL) - { - break; - } + return OS_SUCCESS; + } + do + { /* * initialize the pthread mutex attribute structure with default values */ diff --git a/src/os/rtems/inc/os-impl-idmap.h b/src/os/rtems/inc/os-impl-idmap.h new file mode 100644 index 000000000..c953afbcf --- /dev/null +++ b/src/os/rtems/inc/os-impl-idmap.h @@ -0,0 +1,43 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 os-impl-idmap.h + * \ingroup rtems + * \author joseph.p.hickey@nasa.gov + * + */ + +#ifndef OS_IMPL_IDMAP_H +#define OS_IMPL_IDMAP_H + +#include "osconfig.h" +#include "osapi-idmap.h" +#include + +typedef struct +{ + rtems_id id; +} OS_impl_objtype_lock_t; + +/* Tables where the lock state information is stored */ +extern OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER]; + +#endif /* OS_IMPL_IDMAP_H */ diff --git a/src/os/rtems/src/os-impl-idmap.c b/src/os/rtems/src/os-impl-idmap.c index 5036e97b1..340cc9fc0 100644 --- a/src/os/rtems/src/os-impl-idmap.c +++ b/src/os/rtems/src/os-impl-idmap.c @@ -33,6 +33,7 @@ #include "os-rtems.h" #include "os-shared-idmap.h" +#include "os-impl-idmap.h" /**************************************************************************************** DEFINES @@ -44,38 +45,34 @@ GLOBALS ***************************************************************************************/ -rtems_id OS_task_table_sem; -rtems_id OS_queue_table_sem; -rtems_id OS_bin_sem_table_sem; -rtems_id OS_mutex_table_sem; -rtems_id OS_count_sem_table_sem; -rtems_id OS_stream_table_mut; -rtems_id OS_dir_table_mut; -rtems_id OS_timebase_table_mut; -rtems_id OS_timecb_table_mut; -rtems_id OS_module_table_mut; -rtems_id OS_filesys_table_mut; -rtems_id OS_console_mut; - -static rtems_id *const MUTEX_TABLE[] = { - [OS_OBJECT_TYPE_UNDEFINED] = NULL, - [OS_OBJECT_TYPE_OS_TASK] = &OS_task_table_sem, - [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_sem, - [OS_OBJECT_TYPE_OS_COUNTSEM] = &OS_count_sem_table_sem, - [OS_OBJECT_TYPE_OS_BINSEM] = &OS_bin_sem_table_sem, - [OS_OBJECT_TYPE_OS_MUTEX] = &OS_mutex_table_sem, - [OS_OBJECT_TYPE_OS_STREAM] = &OS_stream_table_mut, - [OS_OBJECT_TYPE_OS_DIR] = &OS_dir_table_mut, - [OS_OBJECT_TYPE_OS_TIMEBASE] = &OS_timebase_table_mut, - [OS_OBJECT_TYPE_OS_TIMECB] = &OS_timecb_table_mut, - [OS_OBJECT_TYPE_OS_MODULE] = &OS_module_table_mut, - [OS_OBJECT_TYPE_OS_FILESYS] = &OS_filesys_table_mut, - [OS_OBJECT_TYPE_OS_CONSOLE] = &OS_console_mut, -}; - -enum +static OS_impl_objtype_lock_t OS_task_table_lock; +static OS_impl_objtype_lock_t OS_queue_table_lock; +static OS_impl_objtype_lock_t OS_bin_sem_table_lock; +static OS_impl_objtype_lock_t OS_mutex_table_lock; +static OS_impl_objtype_lock_t OS_count_sem_table_lock; +static OS_impl_objtype_lock_t OS_stream_table_lock; +static OS_impl_objtype_lock_t OS_dir_table_lock; +static OS_impl_objtype_lock_t OS_timebase_table_lock; +static OS_impl_objtype_lock_t OS_timecb_table_lock; +static OS_impl_objtype_lock_t OS_module_table_lock; +static OS_impl_objtype_lock_t OS_filesys_table_lock; +static OS_impl_objtype_lock_t OS_console_lock; + +OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = { - MUTEX_TABLE_SIZE = (sizeof(MUTEX_TABLE) / sizeof(MUTEX_TABLE[0])) + [OS_OBJECT_TYPE_UNDEFINED] = NULL, + [OS_OBJECT_TYPE_OS_TASK] = &OS_task_table_lock, + [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_lock, + [OS_OBJECT_TYPE_OS_COUNTSEM] = &OS_count_sem_table_lock, + [OS_OBJECT_TYPE_OS_BINSEM] = &OS_bin_sem_table_lock, + [OS_OBJECT_TYPE_OS_MUTEX] = &OS_mutex_table_lock, + [OS_OBJECT_TYPE_OS_STREAM] = &OS_stream_table_lock, + [OS_OBJECT_TYPE_OS_DIR] = &OS_dir_table_lock, + [OS_OBJECT_TYPE_OS_TIMEBASE] = &OS_timebase_table_lock, + [OS_OBJECT_TYPE_OS_TIMECB] = &OS_timecb_table_lock, + [OS_OBJECT_TYPE_OS_MODULE] = &OS_module_table_lock, + [OS_OBJECT_TYPE_OS_FILESYS] = &OS_filesys_table_lock, + [OS_OBJECT_TYPE_OS_CONSOLE] = &OS_console_lock, }; /*---------------------------------------------------------------- @@ -86,30 +83,19 @@ enum * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(osal_objtype_t idtype) +void OS_Lock_Global_Impl(osal_objtype_t idtype) { - rtems_id *mut; - - if (idtype < MUTEX_TABLE_SIZE) - { - mut = MUTEX_TABLE[idtype]; - } - else - { - mut = NULL; - } + OS_impl_objtype_lock_t *impl; + rtems_status_code rtems_sc; - if (mut == NULL) - { - return OS_ERROR; - } + impl = OS_impl_objtype_lock_table[idtype]; - if (rtems_semaphore_obtain(*mut, RTEMS_WAIT, RTEMS_NO_TIMEOUT) != 0) + rtems_sc = rtems_semaphore_obtain(impl->id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + if (rtems_sc != RTEMS_SUCCESSFUL) { - return OS_ERROR; + OS_DEBUG("OS_Lock_Global_Impl: rtems_semaphore_obtain failed: %s\n", rtems_status_text(rtems_sc)); } - return OS_SUCCESS; } /* end OS_Lock_Global_Impl */ /*---------------------------------------------------------------- @@ -120,30 +106,19 @@ int32 OS_Lock_Global_Impl(osal_objtype_t idtype) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) +void OS_Unlock_Global_Impl(osal_objtype_t idtype) { - rtems_id *mut; - - if (idtype < MUTEX_TABLE_SIZE) - { - mut = MUTEX_TABLE[idtype]; - } - else - { - mut = NULL; - } + OS_impl_objtype_lock_t *impl; + rtems_status_code rtems_sc; - if (mut == NULL) - { - return OS_ERROR; - } + impl = OS_impl_objtype_lock_table[idtype]; - if (rtems_semaphore_release(*mut) != 0) + rtems_sc = rtems_semaphore_release(impl->id); + if (rtems_sc != RTEMS_SUCCESSFUL) { - return OS_ERROR; + OS_DEBUG("OS_Unlock_Global_Impl: rtems_semaphore_release failed: %s\n", rtems_status_text(rtems_sc)); } - return OS_SUCCESS; } /* end OS_Unlock_Global_Impl */ /*---------------------------------------------------------------- @@ -156,19 +131,19 @@ int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) *-----------------------------------------------------------------*/ void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) { - uint32 wait_ms; + rtems_interval wait_ticks; if (attempts <= 10) { - wait_ms = attempts * attempts * 10; + wait_ticks = attempts * attempts; } else { - wait_ms = 1000; + wait_ticks = 100; } OS_Unlock_Global_Impl(idtype); - OS_TaskDelay(wait_ms); + rtems_task_wake_after(wait_ticks); OS_Lock_Global_Impl(idtype); } @@ -186,20 +161,22 @@ void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) ---------------------------------------------------------------------------------------*/ int32 OS_Rtems_TableMutex_Init(osal_objtype_t idtype) { - int32 return_code = OS_SUCCESS; + OS_impl_objtype_lock_t *impl; rtems_status_code rtems_sc; - /* Initialize the table mutex for the given idtype */ - if (idtype < MUTEX_TABLE_SIZE && MUTEX_TABLE[idtype] != NULL) + impl = OS_impl_objtype_lock_table[idtype]; + if (impl == NULL) { - rtems_sc = rtems_semaphore_create(idtype, 1, OSAL_TABLE_MUTEX_ATTRIBS, 0, MUTEX_TABLE[idtype]); + return OS_SUCCESS; + } - if (rtems_sc != RTEMS_SUCCESSFUL) - { - OS_DEBUG("Error: rtems_semaphore_create failed: %s\n", rtems_status_text(rtems_sc)); - return_code = OS_ERROR; - } + /* Initialize the table mutex for the given idtype */ + rtems_sc = rtems_semaphore_create(idtype, 1, OSAL_TABLE_MUTEX_ATTRIBS, 0, &impl->id); + if (rtems_sc != RTEMS_SUCCESSFUL) + { + OS_DEBUG("Error: rtems_semaphore_create failed: %s\n", rtems_status_text(rtems_sc)); + return OS_ERROR; } - return (return_code); + return OS_SUCCESS; } /* end OS_Rtems_TableMutex_Init */ diff --git a/src/os/shared/inc/os-shared-common.h b/src/os/shared/inc/os-shared-common.h index b13d9fb49..c3ae45f76 100644 --- a/src/os/shared/inc/os-shared-common.h +++ b/src/os/shared/inc/os-shared-common.h @@ -128,20 +128,4 @@ void OS_IdleLoop_Impl(void); ------------------------------------------------------------------*/ void OS_ApplicationShutdown_Impl(void); -/*---------------------------------------------------------------- - - Function: OS_WaitForStateChange_Impl - - Purpose: Block the caller until some sort of change event - has occurred for the given object type, such as a record changing - state i.e. the acquisition or release of a lock/refcount from - another thread. - - It is not guaranteed what, if any, state change has actually - occured when this function returns. This may be implement as - a simple OS_TaskDelay(). - - ------------------------------------------------------------------*/ -void OS_WaitForStateChange_Impl(osal_objtype_t objtype, uint32 attempts); - #endif /* OS_SHARED_COMMON_H */ diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index fe13d282a..85327b7d2 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -58,12 +58,22 @@ typedef enum OS_LOCK_MODE_REFCOUNT, /**< If operation succeeds, increment refcount and unlock global table */ } OS_lock_mode_t; +/* + * A unique key value issued when obtaining a table lock, based on a + * the a combination of the requesting task ID and a transaction ID + */ +typedef struct +{ + uint32 key_value; +} osal_key_t; + /* * Actual (non-abstract) definition of "OS_object_token_t" */ struct OS_object_token { OS_lock_mode_t lock_mode; + osal_key_t lock_key; osal_objtype_t obj_type; osal_index_t obj_idx; osal_id_t obj_id; @@ -148,7 +158,7 @@ int32 OS_ObjectIdInit(void); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -void OS_Lock_Global(osal_objtype_t idtype); +void OS_Lock_Global(OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_Lock_Global @@ -157,7 +167,7 @@ void OS_Lock_Global(osal_objtype_t idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(osal_objtype_t idtype); +void OS_Lock_Global_Impl(osal_objtype_t idtype); /*---------------------------------------------------------------- Function: OS_Unlock_Global @@ -166,7 +176,7 @@ int32 OS_Lock_Global_Impl(osal_objtype_t idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -void OS_Unlock_Global(osal_objtype_t idtype); +void OS_Unlock_Global(OS_object_token_t *token); /*---------------------------------------------------------------- Function: OS_Unlock_Global @@ -175,7 +185,7 @@ void OS_Unlock_Global(osal_objtype_t idtype); Returns: OS_SUCCESS on success, or relevant error code ------------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(osal_objtype_t idtype); +void OS_Unlock_Global_Impl(osal_objtype_t idtype); /*---------------------------------------------------------------- @@ -188,7 +198,24 @@ int32 OS_Unlock_Global_Impl(osal_objtype_t idtype); before returning from this function. -----------------------------------------------------------------*/ -void OS_WaitForStateChange(osal_objtype_t idtype, uint32 attempts); +void OS_WaitForStateChange(OS_object_token_t *token, uint32 attempts); + +/*---------------------------------------------------------------- + + Function: OS_WaitForStateChange_Impl + + Purpose: Block the caller until some sort of change event + has occurred for the given object type, such as a record changing + state i.e. the acquisition or release of a lock/refcount from + another thread. + + It is not guaranteed what, if any, state change has actually + occured when this function returns. This may be implement as + a simple OS_TaskDelay(). + + ------------------------------------------------------------------*/ +void OS_WaitForStateChange_Impl(osal_objtype_t objtype, uint32 attempts); + /* Function prototypes for routines implemented in common layers but private to OSAL diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 07f8e06be..eb6425a53 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -56,6 +56,13 @@ #include "os-shared-idmap.h" #include "os-shared-task.h" +/* + * A fixed nonzero value to put into the upper 8 bits + * of lock keys. + */ +#define OS_LOCK_KEY_FIXED_VALUE 0x4D000000 +#define OS_LOCK_KEY_INVALID ((osal_key_t) {0}) + typedef enum { OS_TASK_BASE = 0, @@ -97,8 +104,12 @@ typedef struct /* Keep track of the last successfully-issued object ID of each type */ osal_id_t last_id_issued; - /* The last task to lock/own this global table */ - osal_id_t table_owner; + /* The number of individual transactions (lock/unlock cycles) on this type */ + uint32 transaction_count; + + /* The key required to unlock this table */ + osal_key_t owner_key; + } OS_objtype_state_t; OS_objtype_state_t OS_objtype_state[OS_OBJECT_TYPE_USER]; @@ -344,7 +355,7 @@ int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype if (lock_mode != OS_LOCK_MODE_NONE) { - OS_Lock_Global(idtype); + OS_Lock_Global(token); } return OS_SUCCESS; @@ -363,7 +374,7 @@ void OS_ObjectIdTransactionCancel(OS_object_token_t *token) { if (token->lock_mode != OS_LOCK_MODE_NONE) { - OS_Unlock_Global(token->obj_type); + OS_Unlock_Global(token); token->lock_mode = OS_LOCK_MODE_NONE; } } @@ -490,7 +501,7 @@ int32 OS_ObjectIdConvertToken(OS_object_token_t *token) /* * Call the impl layer to wait for some sort of change to occur. */ - OS_WaitForStateChange(token->obj_type, attempts); + OS_WaitForStateChange(token, attempts); } /* @@ -514,7 +525,7 @@ int32 OS_ObjectIdConvertToken(OS_object_token_t *token) */ if (return_code == OS_SUCCESS && token->lock_mode == OS_LOCK_MODE_REFCOUNT) { - OS_Unlock_Global(token->obj_type); + OS_Unlock_Global(token); } } @@ -671,59 +682,62 @@ int32 OS_ObjectIdFindNextFree(OS_object_token_t *token) Purpose: Locks the global table identified by "idtype" ------------------------------------------------------------------*/ -void OS_Lock_Global(osal_objtype_t idtype) +void OS_Lock_Global(OS_object_token_t *token) { - int32 return_code; osal_id_t self_task_id; OS_objtype_state_t *objtype; - if (idtype < OS_OBJECT_TYPE_USER) + if (token->obj_type < OS_OBJECT_TYPE_USER && token->lock_mode != OS_LOCK_MODE_NONE) { - objtype = &OS_objtype_state[idtype]; + objtype = &OS_objtype_state[token->obj_type]; self_task_id = OS_TaskGetId_Impl(); - return_code = OS_Lock_Global_Impl(idtype); - if (return_code == OS_SUCCESS) + OS_Lock_Global_Impl(token->obj_type); + + /* + * Track ownership of this table. It should only be owned by one + * task at a time, and this aids in recovery if the owning task is + * deleted or experiences an exception causing it to not be freed. + * + * This is done after successfully locking, so this has exclusive access + * to the state object. + */ + if (!OS_ObjectIdIsValid(self_task_id)) { /* - * Track ownership of this table. It should only be owned by one - * task at a time, and this aids in recovery if the owning task is - * deleted or experiences an exception causing it to not be freed. - * - * This is done after successfully locking, so this has exclusive access - * to the state object. + * This just means the calling context is not an OSAL-created task. + * This is not necessarily an error, but it should be tracked. + * Also note that the root/initial task also does not have an ID. */ - if (!OS_ObjectIdDefined(self_task_id)) - { - /* - * This just means the calling context is not an OSAL-created task. - * This is not necessarily an error, but it should be tracked. - * Also note that the root/initial task also does not have an ID. - */ - self_task_id = OS_OBJECT_ID_RESERVED; /* nonzero, but also won't alias a known task */ - } + self_task_id = OS_OBJECT_ID_RESERVED; /* nonzero, but also won't alias a known task */ + } - if (OS_ObjectIdDefined(objtype->table_owner)) - { - /* this is almost certainly a bug */ - OS_DEBUG("ERROR: global %u acquired by task 0x%lx when already owned by task 0x%lx\n", - (unsigned int)idtype, OS_ObjectIdToInteger(self_task_id), - OS_ObjectIdToInteger(objtype->table_owner)); - } - else - { - objtype->table_owner = self_task_id; - } + /* + * The key value is computed with fixed/nonzero flag bits combined + * with the lower 24 bits of the task ID xor'ed with transaction id. + * This makes it different for every operation, and different depending + * on what task is calling the function. + */ + token->lock_key.key_value = OS_LOCK_KEY_FIXED_VALUE | + ((OS_ObjectIdToInteger(self_task_id) ^ objtype->transaction_count) & 0xFFFFFF); + + ++objtype->transaction_count; + + if (objtype->owner_key.key_value != 0) + { + /* this is almost certainly a bug */ + OS_DEBUG("ERROR: global %u acquired by task 0x%lx when already assigned key 0x%lx\n", (unsigned int)token->obj_type, + OS_ObjectIdToInteger(self_task_id), (unsigned long)objtype->owner_key.key_value); + } + else + { + objtype->owner_key = token->lock_key; } } else { - return_code = OS_ERR_INCORRECT_OBJ_TYPE; - } - - if (return_code != OS_SUCCESS) - { - OS_DEBUG("ERROR: unable to lock global %u, error=%d\n", (unsigned int)idtype, (int)return_code); + OS_DEBUG("ERROR: cannot lock global %u for mode %u\n", + (unsigned int)token->obj_type, (unsigned int)token->lock_mode); } } @@ -732,16 +746,13 @@ void OS_Lock_Global(osal_objtype_t idtype) Purpose: Unlocks the global table identified by "idtype" ------------------------------------------------------------------*/ -void OS_Unlock_Global(osal_objtype_t idtype) +void OS_Unlock_Global(OS_object_token_t *token) { - int32 return_code; - osal_id_t self_task_id; OS_objtype_state_t *objtype; - if (idtype < OS_OBJECT_TYPE_USER) + if (token->obj_type < OS_OBJECT_TYPE_USER && token->lock_mode != OS_LOCK_MODE_NONE) { - objtype = &OS_objtype_state[idtype]; - self_task_id = OS_TaskGetId_Impl(); + objtype = &OS_objtype_state[token->obj_type]; /* * Un-track ownership of this table. It should only be owned by one @@ -751,37 +762,23 @@ void OS_Unlock_Global(osal_objtype_t idtype) * This is done before unlocking, while this has exclusive access * to the state object. */ - if (!OS_ObjectIdDefined(self_task_id)) - { - /* - * This just means the calling context is not an OSAL-created task. - * This is not necessarily an error, but it should be tracked. - * Also note that the root/initial task also does not have an ID. - */ - self_task_id = OS_OBJECT_ID_RESERVED; /* nonzero, but also won't alias a known task */ - } - - if (!OS_ObjectIdEqual(objtype->table_owner, self_task_id)) + if ((objtype->owner_key.key_value & 0xFF000000) != OS_LOCK_KEY_FIXED_VALUE || + objtype->owner_key.key_value != token->lock_key.key_value) { /* this is almost certainly a bug */ - OS_DEBUG("ERROR: global %u released by task 0x%lx when owned by task 0x%lx\n", (unsigned int)idtype, - OS_ObjectIdToInteger(self_task_id), OS_ObjectIdToInteger(objtype->table_owner)); - } - else - { - objtype->table_owner = OS_OBJECT_ID_UNDEFINED; + OS_DEBUG("ERROR: global %u released using mismatched key=0x%lx expected=0x%lx\n", (unsigned int)token->obj_type, + (unsigned long)token->lock_key.key_value, (unsigned long)objtype->owner_key.key_value); } - return_code = OS_Unlock_Global_Impl(idtype); + objtype->owner_key = OS_LOCK_KEY_INVALID; + token->lock_key = OS_LOCK_KEY_INVALID; + + OS_Unlock_Global_Impl(token->obj_type); } else { - return_code = OS_ERR_INCORRECT_OBJ_TYPE; - } - - if (return_code != OS_SUCCESS) - { - OS_DEBUG("ERROR: unable to unlock global %u, error=%d\n", (unsigned int)idtype, (int)return_code); + OS_DEBUG("ERROR: cannot unlock global %u for mode %u\n", + (unsigned int)token->obj_type, (unsigned int)token->lock_mode); } } @@ -792,32 +789,39 @@ void OS_Unlock_Global(osal_objtype_t idtype) * Purpose: Local helper routine, not part of OSAL API. * Waits for a change in the global table identified by "idtype" * + * NOTE: this must be called while the table is _LOCKED_ + * The "OS_WaitForStateChange_Impl" function should unlock + relock + * *-----------------------------------------------------------------*/ -void OS_WaitForStateChange(osal_objtype_t idtype, uint32 attempts) +void OS_WaitForStateChange(OS_object_token_t *token, uint32 attempts) { - osal_id_t saved_owner_id; + osal_key_t saved_unlock_key; OS_objtype_state_t *objtype; - if (idtype < OS_OBJECT_TYPE_USER) - { - objtype = &OS_objtype_state[idtype]; - saved_owner_id = objtype->table_owner; + /* + * This needs to release the lock, to allow other + * tasks to make a change to the table. But to avoid + * ownership warnings the key must also be temporarily + * cleared too, and restored after waiting. + */ - /* temporarily release the table */ - objtype->table_owner = OS_OBJECT_ID_UNDEFINED; + objtype = &OS_objtype_state[token->obj_type]; + saved_unlock_key = objtype->owner_key; - /* - * The implementation layer takes care of the actual unlock + wait. - * This permits use of condition variables where these two actions - * are done atomically. - */ - OS_WaitForStateChange_Impl(idtype, attempts); + /* temporarily release the table */ + objtype->owner_key = OS_LOCK_KEY_INVALID; - /* - * After return, this task owns the table again - */ - objtype->table_owner = saved_owner_id; - } + /* + * The implementation layer takes care of the actual unlock + wait. + * This permits use of condition variables where these two actions + * are done atomically. + */ + OS_WaitForStateChange_Impl(token->obj_type, attempts); + + /* + * After return, this task owns the table again + */ + objtype->owner_key = saved_unlock_key; } /*---------------------------------------------------------------- @@ -1084,7 +1088,7 @@ void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id) /* re-acquire global table lock to adjust refcount */ if (token->lock_mode == OS_LOCK_MODE_REFCOUNT) { - OS_Lock_Global(token->obj_type); + OS_Lock_Global(token); if (record->refcount > 0) { @@ -1106,7 +1110,7 @@ void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id) } /* always unlock (this also covers OS_LOCK_MODE_GLOBAL case) */ - OS_Unlock_Global(token->obj_type); + OS_Unlock_Global(token); /* * Setting to "NONE" indicates that this token has been @@ -1325,9 +1329,9 @@ int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal * This needs to temporarily unlock the global, * call the handler function, then re-lock. */ - OS_Unlock_Global(iter->token.obj_type); + OS_Unlock_Global(&iter->token); status = func(OS_ObjectIdFromToken(&iter->token), iter->arg); - OS_Lock_Global(iter->token.obj_type); + OS_Lock_Global(&iter->token); return status; } diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index e5673ab51..362334115 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -452,6 +452,7 @@ int32 OS_SymbolTableDump(const char *filename, size_t SizeLimit) { int32 return_code; char translated_path[OS_MAX_LOCAL_PATH_LEN]; + OS_object_token_t token; /* ** Check parameters @@ -476,11 +477,15 @@ int32 OS_SymbolTableDump(const char *filename, size_t SizeLimit) * underlying implementation may safely use globals for * state storage. */ - OS_Lock_Global(LOCAL_OBJID_TYPE); + return_code = OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, &token); + if (return_code != OS_SUCCESS) + { + return (return_code); + } return_code = OS_SymbolTableDump_Impl(translated_path, SizeLimit); - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_ObjectIdTransactionCancel(&token); return (return_code); diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 1aad07df0..6381e468f 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -295,7 +295,7 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * if (conn_record != NULL) { - OS_Lock_Global(LOCAL_OBJID_TYPE); + OS_Lock_Global(&conn_token); if (return_code == OS_SUCCESS) { @@ -312,7 +312,7 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * /* Decrement both ref counters that were increased earlier */ --conn_record->refcount; - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_Unlock_Global(&conn_token); } OS_ObjectIdRelease(&sock_token); @@ -365,13 +365,13 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo { return_code = OS_SocketConnect_Impl(&token, Addr, Timeout); - OS_Lock_Global(LOCAL_OBJID_TYPE); + OS_Lock_Global(&token); if (return_code == OS_SUCCESS) { stream->stream_state |= OS_STREAM_STATE_CONNECTED | OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; } --record->refcount; - OS_Unlock_Global(LOCAL_OBJID_TYPE); + OS_Unlock_Global(&token); } return return_code; diff --git a/src/os/vxworks/inc/os-impl-idmap.h b/src/os/vxworks/inc/os-impl-idmap.h new file mode 100644 index 000000000..a8e47a580 --- /dev/null +++ b/src/os/vxworks/inc/os-impl-idmap.h @@ -0,0 +1,44 @@ +/* + * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" + * + * Copyright (c) 2019 United States Government as represented by + * the Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * 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 os-impl-idmap.h + * \ingroup vxworks + * \author joseph.p.hickey@nasa.gov + * + */ + +#ifndef OS_IMPL_IDMAP_H +#define OS_IMPL_IDMAP_H + +#include "osconfig.h" +#include "osapi-idmap.h" +#include + +typedef struct +{ + void *const mem; + SEM_ID vxid; +} OS_impl_objtype_lock_t; + +/* Tables where the lock state information is stored */ +extern OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER]; + +#endif /* OS_IMPL_IDMAP_H */ diff --git a/src/os/vxworks/inc/os-vxworks.h b/src/os/vxworks/inc/os-vxworks.h index e497fee88..60a4d3771 100644 --- a/src/os/vxworks/inc/os-vxworks.h +++ b/src/os/vxworks/inc/os-vxworks.h @@ -51,12 +51,6 @@ TYPEDEFS ****************************************************************************************/ -typedef struct -{ - void *const mem; - SEM_ID vxid; -} VxWorks_GlobalMutex_t; - /* * Union to facilitate passing an osal_id_t through * a function/api designed to take an "int" @@ -73,8 +67,6 @@ typedef union GLOBAL DATA ****************************************************************************************/ -extern VxWorks_GlobalMutex_t VX_MUTEX_TABLE[]; - /**************************************************************************************** VXWORKS IMPLEMENTATION FUNCTION PROTOTYPES ****************************************************************************************/ diff --git a/src/os/vxworks/src/os-impl-idmap.c b/src/os/vxworks/src/os-impl-idmap.c index 4ec8d728d..503d8f7f5 100644 --- a/src/os/vxworks/src/os-impl-idmap.c +++ b/src/os/vxworks/src/os-impl-idmap.c @@ -29,12 +29,15 @@ ****************************************************************************************/ #include "os-vxworks.h" +#include "os-impl-idmap.h" #include "os-shared-idmap.h" +#include #include #include #include #include +#include /**************************************************************************************** DEFINES @@ -55,27 +58,72 @@ VX_MUTEX_SEMAPHORE(OS_timebase_table_mut_mem); VX_MUTEX_SEMAPHORE(OS_timecb_table_mut_mem); VX_MUTEX_SEMAPHORE(OS_module_table_mut_mem); VX_MUTEX_SEMAPHORE(OS_filesys_table_mut_mem); -VX_MUTEX_SEMAPHORE(OS_console_mut_mem); - -VxWorks_GlobalMutex_t VX_MUTEX_TABLE[] = { - [OS_OBJECT_TYPE_UNDEFINED] = {NULL}, - [OS_OBJECT_TYPE_OS_TASK] = {.mem = OS_task_table_mut_mem}, - [OS_OBJECT_TYPE_OS_QUEUE] = {.mem = OS_queue_table_mut_mem}, - [OS_OBJECT_TYPE_OS_COUNTSEM] = {.mem = OS_count_sem_table_mut_mem}, - [OS_OBJECT_TYPE_OS_BINSEM] = {.mem = OS_bin_sem_table_mut_mem}, - [OS_OBJECT_TYPE_OS_MUTEX] = {.mem = OS_mutex_table_mut_mem}, - [OS_OBJECT_TYPE_OS_STREAM] = {.mem = OS_stream_table_mut_mem}, - [OS_OBJECT_TYPE_OS_DIR] = {.mem = OS_dir_table_mut_mem}, - [OS_OBJECT_TYPE_OS_TIMEBASE] = {.mem = OS_timebase_table_mut_mem}, - [OS_OBJECT_TYPE_OS_TIMECB] = {.mem = OS_timecb_table_mut_mem}, - [OS_OBJECT_TYPE_OS_MODULE] = {.mem = OS_module_table_mut_mem}, - [OS_OBJECT_TYPE_OS_FILESYS] = {.mem = OS_filesys_table_mut_mem}, - [OS_OBJECT_TYPE_OS_CONSOLE] = {.mem = OS_console_mut_mem}, +VX_MUTEX_SEMAPHORE(OS_console_table_mut_mem); + +static OS_impl_objtype_lock_t OS_task_table_lock = +{ + .mem = OS_task_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_queue_table_lock = +{ + .mem = OS_queue_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_bin_sem_table_lock = +{ + .mem = OS_bin_sem_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_mutex_table_lock = +{ + .mem = OS_mutex_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_count_sem_table_lock = +{ + .mem = OS_count_sem_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_stream_table_lock = +{ + .mem = OS_stream_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_dir_table_lock = +{ + .mem = OS_dir_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_timebase_table_lock = +{ + .mem = OS_timebase_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_timecb_table_lock = +{ + .mem = OS_timecb_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_module_table_lock = +{ + .mem = OS_module_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_filesys_table_lock = +{ + .mem = OS_filesys_table_mut_mem +}; +static OS_impl_objtype_lock_t OS_console_table_lock = +{ + .mem = OS_console_table_mut_mem }; -enum +OS_impl_objtype_lock_t * const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = { - VX_MUTEX_TABLE_SIZE = (sizeof(VX_MUTEX_TABLE) / sizeof(VX_MUTEX_TABLE[0])) + [OS_OBJECT_TYPE_UNDEFINED] = NULL, + [OS_OBJECT_TYPE_OS_TASK] = &OS_task_table_lock, + [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_lock, + [OS_OBJECT_TYPE_OS_COUNTSEM] = &OS_count_sem_table_lock, + [OS_OBJECT_TYPE_OS_BINSEM] = &OS_bin_sem_table_lock, + [OS_OBJECT_TYPE_OS_MUTEX] = &OS_mutex_table_lock, + [OS_OBJECT_TYPE_OS_STREAM] = &OS_stream_table_lock, + [OS_OBJECT_TYPE_OS_DIR] = &OS_dir_table_lock, + [OS_OBJECT_TYPE_OS_TIMEBASE] = &OS_timebase_table_lock, + [OS_OBJECT_TYPE_OS_TIMECB] = &OS_timecb_table_lock, + [OS_OBJECT_TYPE_OS_MODULE] = &OS_module_table_lock, + [OS_OBJECT_TYPE_OS_FILESYS] = &OS_filesys_table_lock, + [OS_OBJECT_TYPE_OS_CONSOLE] = &OS_console_table_lock }; /*---------------------------------------------------------------- @@ -86,28 +134,17 @@ enum * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Lock_Global_Impl(osal_objtype_t idtype) +void OS_Lock_Global_Impl(osal_objtype_t idtype) { - VxWorks_GlobalMutex_t *mut; + OS_impl_objtype_lock_t *impl; - if (idtype >= VX_MUTEX_TABLE_SIZE) - { - return OS_ERROR; - } - - mut = &VX_MUTEX_TABLE[idtype]; - if (mut->vxid == (SEM_ID)0) - { - return OS_ERROR; - } + impl = OS_impl_objtype_lock_table[idtype]; - if (semTake(mut->vxid, WAIT_FOREVER) != OK) + if (semTake(impl->vxid, WAIT_FOREVER) != OK) { OS_DEBUG("semTake() - vxWorks errno %d\n", errno); - return OS_ERROR; } - return OS_SUCCESS; } /* end OS_Lock_Global_Impl */ /*---------------------------------------------------------------- @@ -118,29 +155,45 @@ int32 OS_Lock_Global_Impl(osal_objtype_t idtype) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) +void OS_Unlock_Global_Impl(osal_objtype_t idtype) { - VxWorks_GlobalMutex_t *mut; + OS_impl_objtype_lock_t *impl; - if (idtype >= VX_MUTEX_TABLE_SIZE) + impl = OS_impl_objtype_lock_table[idtype]; + + if (semGive(impl->vxid) != OK) { - return OS_ERROR; + OS_DEBUG("semGive() - vxWorks errno %d\n", errno); } - mut = &VX_MUTEX_TABLE[idtype]; - if (mut->vxid == (SEM_ID)0) +} /* end OS_Unlock_Global_Impl */ + +/*---------------------------------------------------------------- + * + * Function: OS_WaitForStateChange_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) +{ + int wait_ticks; + + if (attempts <= 10) { - return OS_ERROR; + wait_ticks = attempts * attempts; } - - if (semGive(mut->vxid) != OK) + else { - OS_DEBUG("semGive() - vxWorks errno %d\n", errno); - return OS_ERROR; + wait_ticks = 100; } - return OS_SUCCESS; -} /* end OS_Unlock_Global_Impl */ + OS_Unlock_Global_Impl(idtype); + taskDelay(wait_ticks); + OS_Lock_Global_Impl(idtype); +} + /**************************************************************************************** INITIALIZATION FUNCTION @@ -156,24 +209,26 @@ int32 OS_Unlock_Global_Impl(osal_objtype_t idtype) *-----------------------------------------------------------------*/ int32 OS_VxWorks_TableMutex_Init(osal_objtype_t idtype) { - int32 return_code = OS_SUCCESS; + OS_impl_objtype_lock_t *impl; SEM_ID semid; + impl = OS_impl_objtype_lock_table[idtype]; + if (impl == NULL) + { + return OS_SUCCESS; + } + /* Initialize the table mutex for the given idtype */ - if (idtype < VX_MUTEX_TABLE_SIZE && VX_MUTEX_TABLE[idtype].mem != NULL) + semid = semMInitialize(impl->mem, SEM_Q_PRIORITY | SEM_INVERSION_SAFE); + + if (semid == (SEM_ID)0) { - semid = semMInitialize(VX_MUTEX_TABLE[idtype].mem, SEM_Q_PRIORITY | SEM_INVERSION_SAFE); - - if (semid == (SEM_ID)0) - { - OS_DEBUG("Error: semMInitialize() failed - vxWorks errno %d\n", errno); - return_code = OS_ERROR; - } - else - { - VX_MUTEX_TABLE[idtype].vxid = semid; - } + OS_DEBUG("Error: semMInitialize() failed - vxWorks errno %d\n", errno); + return OS_ERROR; } - return (return_code); + impl->vxid = semid; + + return OS_SUCCESS; + } /* end OS_VxWorks_TableMutex_Init */ diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index ea06f17c4..ea4d93fb8 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -85,21 +85,53 @@ void Test_OS_LockUnlockGlobal(void) * void OS_Lock_Global(uint32 idtype) * void OS_Unlock_Global(uint32 idtype) */ + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); + + token.obj_type = OS_OBJECT_TYPE_OS_COUNTSEM; + token.lock_mode = OS_LOCK_MODE_GLOBAL; /* * As these have no return codes, these tests * exist to get coverage of the paths. */ - OS_Lock_Global(OS_OBJECT_TYPE_OS_COUNTSEM); - OS_Unlock_Global(OS_OBJECT_TYPE_OS_COUNTSEM); - OS_Lock_Global(0); - OS_Unlock_Global(0); - OS_Lock_Global(55555); - OS_Unlock_Global(55555); + OS_Lock_Global(&token); + OS_Unlock_Global(&token); + + token.obj_type = OS_OBJECT_TYPE_UNDEFINED; + + OS_Lock_Global(&token); + OS_Unlock_Global(&token); + + token.obj_type = 55555; + + OS_Lock_Global(&token); + OS_Unlock_Global(&token); UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId), 0); - OS_Lock_Global(OS_OBJECT_TYPE_OS_BINSEM); - OS_Unlock_Global(OS_OBJECT_TYPE_OS_BINSEM); + token.obj_type = OS_OBJECT_TYPE_OS_BINSEM; + + OS_Lock_Global(&token); + OS_Unlock_Global(&token); + + UT_ResetState(UT_KEY(OS_TaskGetId)); + + /* + * Execute paths where the incorrect patten is followed, + * such as unlocking from a different task than the lock. + * These trigger OS_DEBUG messages, if compiled in. + * + * Start by locking twice in a row + */ + OS_Lock_Global(&token); + OS_Lock_Global(&token); + + /* + * Next unlock with wrong/corrupt/bad key + */ + token.lock_key.key_value ^= 0x11111111; + OS_Unlock_Global(&token); } void Test_OS_ObjectIdConvertToken(void) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c index 93440c93d..7bff71d1e 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-idmap-impl-stubs.c @@ -38,5 +38,11 @@ * Table locking and unlocking for global objects can be done at the shared code * layer but the actual implementation is OS-specific */ -UT_DEFAULT_STUB(OS_Lock_Global_Impl, (osal_objtype_t idtype)) -UT_DEFAULT_STUB(OS_Unlock_Global_Impl, (osal_objtype_t idtype)) +void OS_Lock_Global_Impl(osal_objtype_t idtype) +{ + UT_DEFAULT_IMPL(OS_Lock_Global_Impl); +} +void OS_Unlock_Global_Impl(osal_objtype_t idtype) +{ + UT_DEFAULT_IMPL(OS_Unlock_Global_Impl); +} diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c index 272937652..f436f8146 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-idmap.c @@ -30,6 +30,7 @@ #include #include +#include "os-impl-idmap.h" #include "ut-adaptor-idmap.h" int32 UT_Call_OS_VxWorks_TableMutex_Init(osal_objtype_t idtype) @@ -39,5 +40,5 @@ int32 UT_Call_OS_VxWorks_TableMutex_Init(osal_objtype_t idtype) void UT_IdMapTest_SetImplTableMutex(osal_objtype_t idtype, OCS_SEM_ID vxid) { - VX_MUTEX_TABLE[idtype].vxid = vxid; + OS_impl_objtype_lock_table[idtype]->vxid = vxid; } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c index 89f140b4c..e97635900 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c @@ -41,22 +41,13 @@ void Test_OS_Lock_Global_Impl(void) * Test Case For: * int32 OS_Lock_Global_Impl(uint32 idtype) */ - OSAPI_TEST_FUNCTION_RC(OS_Lock_Global_Impl(10000), OS_ERROR); - - /* - * Confirm that if vxid is 0/NULL that the function returns error - * and does not call semTake. - */ - UT_IdMapTest_SetImplTableMutex(OS_OBJECT_TYPE_OS_TASK, (OCS_SEM_ID)0); - OSAPI_TEST_FUNCTION_RC(OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); - UtAssert_True(UT_GetStubCount(UT_KEY(OCS_semTake)) == 0, "semTake() NOT called"); UT_IdMapTest_SetImplTableMutex(OS_OBJECT_TYPE_OS_TASK, &TestGlobalSem); - OSAPI_TEST_FUNCTION_RC(OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); + OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_semTake)) == 1, "semTake() called"); UT_SetDefaultReturnValue(UT_KEY(OCS_semTake), -1); - OSAPI_TEST_FUNCTION_RC(OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); + OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK); /* for coverage of error path */ } void Test_OS_Unlock_Global_Impl(void) @@ -65,11 +56,13 @@ void Test_OS_Unlock_Global_Impl(void) * Test Case For: * int32 OS_Unlock_Global_Impl(uint32 idtype) */ - OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(10000), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(0), OS_ERROR); - OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); + + UT_IdMapTest_SetImplTableMutex(OS_OBJECT_TYPE_OS_TASK, &TestGlobalSem); + OS_Unlock_Global_Impl(OS_OBJECT_TYPE_OS_TASK); + UtAssert_True(UT_GetStubCount(UT_KEY(OCS_semGive)) == 1, "semTake() called"); + UT_SetDefaultReturnValue(UT_KEY(OCS_semGive), -1); - OSAPI_TEST_FUNCTION_RC(OS_Unlock_Global_Impl(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); + OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK); /* for coverage of error path */ } void Test_OS_API_Impl_Init(void) diff --git a/src/ut-stubs/osapi-utstub-idmap.c b/src/ut-stubs/osapi-utstub-idmap.c index ac30659b6..4b2bd3992 100644 --- a/src/ut-stubs/osapi-utstub-idmap.c +++ b/src/ut-stubs/osapi-utstub-idmap.c @@ -54,11 +54,11 @@ static void UT_TokenCompose(uint32 lock_mode, uint32 indx, UT_ObjType_t objtype, UT_DEFAULT_STUB(OS_ObjectIdInit, (void)) /* Lock/Unlock for global tables */ -void OS_Lock_Global(osal_objtype_t idtype) +void OS_Lock_Global(OS_object_token_t *token) { UT_DEFAULT_IMPL(OS_Lock_Global); } -void OS_Unlock_Global(osal_objtype_t idtype) +void OS_Unlock_Global(OS_object_token_t *token) { UT_DEFAULT_IMPL(OS_Unlock_Global); } @@ -212,6 +212,36 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS return Status; } +/***************************************************************************** + * + * Stub function for OS_ObjectIdTransactionInit() + * + *****************************************************************************/ +int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_object_token_t *token) +{ + int32 Status; + + Status = UT_DEFAULT_IMPL(OS_ObjectIdTransactionInit); + + if (Status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_ObjectIdTransactionInit), token, sizeof(*token)) < sizeof(*token)) + { + memset(&token, 0, sizeof(token)); + } + + return Status; +} + +/***************************************************************************** + * + * Stub function for OS_ObjectIdTransactionCancel() + * + *****************************************************************************/ +void OS_ObjectIdTransactionCancel(OS_object_token_t *token) +{ + UT_DEFAULT_IMPL(OS_ObjectIdTransactionCancel); +} + /***************************************************************************** * * Stub function for OS_ObjectIdFindByName() From a7529cf845cc6eacf9492ca5ca2bc69c4db7aa22 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 22 Dec 2020 10:05:04 -0500 Subject: [PATCH 041/111] Fix #703, implement exclusive/reserved lock Change the EXCLUSIVE lock type such that it sets the ID in the global table to RESERVED and unlocks the global before returning to the caller. This allows the potentially long-running operation to complete and not block other operations from happening in other tasks. Use the EXCLUSIVE lock for all create/delete ops as well as for bind and connect socket ops. Also implement a new "RESERVED" lock to handle a special case in the vxworks timebase implementation where the impl layer needs to acquire a token for an object as it is being created. This case is special because it needs to happen during OS_TimeBaseCreate, and cannot be completed after the fact like normal tasks, because it is a factor in determining the success/fail status of the overall operation. --- src/os/posix/src/os-impl-timebase.c | 2 +- src/os/shared/inc/os-shared-idmap.h | 12 +- src/os/shared/src/osapi-idmap.c | 180 +++++++++++------- src/os/shared/src/osapi-sockets.c | 74 ++----- src/os/vxworks/inc/os-vxworks.h | 12 -- src/os/vxworks/src/os-impl-timebase.c | 27 ++- .../shared/src/coveragetest-idmap.c | 66 ++++++- 7 files changed, 221 insertions(+), 152 deletions(-) diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index f20a7393f..87828730b 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -387,7 +387,7 @@ int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) */ for (idx = 0; idx < OS_MAX_TIMEBASES; ++idx) { - if (OS_ObjectIdDefined(OS_global_timebase_table[idx].active_id) && + if (OS_ObjectIdIsValid(OS_global_timebase_table[idx].active_id) && OS_impl_timebase_table[idx].assigned_signal != 0) { sigaddset(&local->sigset, OS_impl_timebase_table[idx].assigned_signal); diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index 85327b7d2..b7cd14eda 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -31,8 +31,6 @@ #include "osapi-idmap.h" #include -#define OS_OBJECT_EXCL_REQ_FLAG 0x0001 - #define OS_OBJECT_ID_RESERVED ((osal_id_t) {0xFFFFFFFF}) /* @@ -44,7 +42,6 @@ struct OS_common_record osal_id_t active_id; osal_id_t creator; uint16 refcount; - uint16 flags; }; /* @@ -52,10 +49,11 @@ struct OS_common_record */ typedef enum { - OS_LOCK_MODE_NONE, /**< Do not lock global table at all (use with caution) */ - OS_LOCK_MODE_GLOBAL, /**< Lock during operation, and if successful, leave global table locked */ - OS_LOCK_MODE_EXCLUSIVE, /**< Like OS_LOCK_MODE_GLOBAL but must be exclusive (refcount == zero) */ - OS_LOCK_MODE_REFCOUNT, /**< If operation succeeds, increment refcount and unlock global table */ + OS_LOCK_MODE_NONE, /**< Quick ID validity check, does not lock global table at all (use with caution) */ + OS_LOCK_MODE_GLOBAL, /**< Confirm ID match, and if successful, leave global table locked */ + OS_LOCK_MODE_REFCOUNT, /**< Confirm ID match, increment refcount, and unlock global table. ID is not changed. */ + OS_LOCK_MODE_EXCLUSIVE, /**< Confirm ID match AND refcount equal zero, then change ID to RESERVED value and unlock global. */ + OS_LOCK_MODE_RESERVED /**< Confirm ID is already set to RESERVED, otherwise like OS_LOCK_MODE_GLOBAL. */ } OS_lock_mode_t; /* diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index eb6425a53..7d4b0bdbf 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -419,74 +419,87 @@ void OS_ObjectIdTransactionCancel(OS_object_token_t *token) *-----------------------------------------------------------------*/ int32 OS_ObjectIdConvertToken(OS_object_token_t *token) { - int32 return_code = OS_ERROR; - uint32 exclusive_bits = 0; - uint32 attempts = 0; + int32 return_code = OS_ERROR; + uint32 attempts = 0; + OS_common_record_t *obj; + osal_id_t expected_id; - OS_common_record_t *obj = OS_ObjectIdGlobalFromToken(token); + obj = OS_ObjectIdGlobalFromToken(token); + expected_id = OS_ObjectIdFromToken(token); + + /* + * Upon entry the ID from the token must be valid + */ + if (!OS_ObjectIdIsValid(expected_id)) + { + return OS_ERR_INCORRECT_OBJ_STATE; + } + + /* + * If lock mode is RESERVED, then the ID in the record should + * already be set to OS_OBJECT_ID_RESERVED. This is for very + * specific use cases where a secondary task needs to access an + * object during its creation/deletion. + * + * For all typical modes the ID in the record should be equal + * to the token ID. + */ + if (token->lock_mode == OS_LOCK_MODE_RESERVED) + { + expected_id = OS_OBJECT_ID_RESERVED; + } while (true) { /* Validate the integrity of the ID. As the "active_id" is a single * integer, we can do this check regardless of whether global is locked or not. */ - if (!OS_ObjectIdEqual(obj->active_id, OS_ObjectIdFromToken(token))) - { - /* The ID does not match, so unlock and return error. - * This basically means the ID was stale or otherwise no longer invalid */ - return_code = OS_ERR_INVALID_ID; - break; - } - - /* - * The REFCOUNT and EXCLUSIVE lock modes require additional - * conditions on before they can be successful. - */ - if (token->lock_mode == OS_LOCK_MODE_REFCOUNT) - { - /* As long as no exclusive request is pending, we can increment the - * refcount and good to go. */ - if ((obj->flags & OS_OBJECT_EXCL_REQ_FLAG) == 0) - { - ++obj->refcount; - return_code = OS_SUCCESS; - break; - } - } - else if (token->lock_mode == OS_LOCK_MODE_EXCLUSIVE) + if (OS_ObjectIdEqual(obj->active_id, expected_id)) { /* - * Set the exclusive request flag -- this will prevent anyone else from - * incrementing the refcount while we are waiting. However we can only - * do this if there are no OTHER exclusive requests. + * Got an ID match... */ - if (exclusive_bits != 0 || (obj->flags & OS_OBJECT_EXCL_REQ_FLAG) == 0) + if (token->lock_mode == OS_LOCK_MODE_EXCLUSIVE) { /* - * As long as nothing is referencing this object, we are good to go. - * The global table will be left in a locked state in this case. + * For EXCLUSIVE mode, overwrite the ID to be RESERVED now -- this + * makes any future ID checks or lock attempts in other tasks fail to match. + */ + if (!OS_ObjectIdEqual(expected_id, OS_OBJECT_ID_RESERVED)) + { + expected_id = OS_OBJECT_ID_RESERVED; + obj->active_id = expected_id; + } + + /* + * Also confirm that reference count is zero + * If not zero, will need to wait for other tasks to release. */ if (obj->refcount == 0) { return_code = OS_SUCCESS; break; } - - exclusive_bits = OS_OBJECT_EXCL_REQ_FLAG; - obj->flags |= exclusive_bits; + } + else + { + /* + * Nothing else to test for this lock type + */ + return_code = OS_SUCCESS; + break; } } - else + else if (token->lock_mode == OS_LOCK_MODE_NONE || !OS_ObjectIdEqual(obj->active_id, OS_OBJECT_ID_RESERVED)) { - /* No fanciness required - move on. */ - return_code = OS_SUCCESS; + /* Not an ID match and not RESERVED - fail out */ + return_code = OS_ERR_INVALID_ID; break; } /* * If we get this far, it means there is contention for access to the object. - * a) we want to increment refcount but an exclusive is pending - * b) we want exclusive but refcount is nonzero - * c) we want exclusive but another exclusive is pending + * a) we want to some type of lock but the ID is currently RESERVED + * b) the refcount is too high - need to wait for release * * In this case we will UNLOCK the global object again so that the holder * can relinquish it. We'll try again a few times before giving up hope. @@ -512,20 +525,36 @@ int32 OS_ObjectIdConvertToken(OS_object_token_t *token) */ if (token->lock_mode != OS_LOCK_MODE_NONE) { - /* - * In case any exclusive bits were set locally, unset them now - * before the lock is (maybe) released. - */ - obj->flags &= ~exclusive_bits; + if (return_code == OS_SUCCESS) + { + /* always increment the refcount, which means a task is actively + * using or modifying this record. */ + ++obj->refcount; - /* - * On a successful operation, the global is unlocked if it is a REFCOUNT - * style lock. For other styles (GLOBAL or EXCLUSIVE) the global lock - * should be maintained and returned to the caller. - */ - if (return_code == OS_SUCCESS && token->lock_mode == OS_LOCK_MODE_REFCOUNT) + /* + * On a successful operation, the global is unlocked if it is + * a REFCOUNT or EXCLUSIVE lock. Note for EXCLUSIVE, because the ID + * was overwritten to OS_OBJECT_ID_RESERVED, other tasks will not be + * able to access the object because the ID will not match, so the + * table can be unlocked while the remainder of the create/delete process + * continues. + * + * For OS_LOCK_MODE_GLOBAL the global lock should be maintained and + * returned to the caller. + */ + if (token->lock_mode == OS_LOCK_MODE_REFCOUNT || token->lock_mode == OS_LOCK_MODE_EXCLUSIVE) + { + OS_Unlock_Global(token); + } + } + else if (token->lock_mode == OS_LOCK_MODE_EXCLUSIVE && OS_ObjectIdEqual(expected_id, OS_OBJECT_ID_RESERVED)) { - OS_Unlock_Global(token); + /* + * On failure, if the active_id was overwritten, then set + * it back to the original value which is in the token. + * (note it had to match initially before overwrite) + */ + obj->active_id = OS_ObjectIdFromToken(token); } } @@ -881,7 +910,7 @@ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, o } /* end OS_ObjectIdFinalizeNew(, &token, ) */ /*---------------------------------------------------------------- - Function: OS_ObjectIdFinalizeDelete(, &token) + Function: OS_ObjectIdFinalizeDelete Purpose: Helper routine, not part of OSAL public API. See description in prototype @@ -945,7 +974,7 @@ int32 OS_ObjectIdGetBySearch(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS */ return_code = OS_ObjectIdConvertToken(token); } - else if (lock_mode != OS_LOCK_MODE_NONE) + else { OS_ObjectIdTransactionCancel(token); } @@ -1086,14 +1115,14 @@ void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id) record = OS_ObjectIdGlobalFromToken(token); /* re-acquire global table lock to adjust refcount */ - if (token->lock_mode == OS_LOCK_MODE_REFCOUNT) + if (token->lock_mode == OS_LOCK_MODE_EXCLUSIVE || token->lock_mode == OS_LOCK_MODE_REFCOUNT) { OS_Lock_Global(token); + } - if (record->refcount > 0) - { - --record->refcount; - } + if (record->refcount > 0) + { + --record->refcount; } /* @@ -1108,6 +1137,15 @@ void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id) { record->active_id = *final_id; } + else if (token->lock_mode == OS_LOCK_MODE_EXCLUSIVE) + { + /* + * If the lock type was EXCLUSIVE, it means that the ID in the record + * was reset to OS_OBJECT_ID_RESERVED. This must restore the original + * object ID from the token. + */ + record->active_id = token->obj_id; + } /* always unlock (this also covers OS_LOCK_MODE_GLOBAL case) */ OS_Unlock_Global(token); @@ -1205,16 +1243,28 @@ int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, OS_object_ return_code = OS_ObjectIdFindNextFree(token); } + /* If allocation failed, abort the operation now - no ID was allocated. + * After this point, if a future step fails, the allocated ID must be + * released. */ + if (return_code != OS_SUCCESS) + { + OS_ObjectIdTransactionCancel(token); + return return_code; + } + if (return_code == OS_SUCCESS) { return_code = OS_NotifyEvent(OS_EVENT_RESOURCE_ALLOCATED, token->obj_id, NULL); } - /* If allocation failed for any reason, unlock the global. - * otherwise the global should stay locked so remaining initialization can be done */ + if (return_code == OS_SUCCESS) + { + return_code = OS_ObjectIdConvertToken(token); + } + if (return_code != OS_SUCCESS) { - OS_ObjectIdTransactionCancel(token); + return_code = OS_ObjectIdFinalizeNew(return_code, token, NULL); } return return_code; diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 6381e468f..1ac1ee5b2 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -174,7 +174,7 @@ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) /* Check Parameters */ OS_CHECK_POINTER(Addr); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) { record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); @@ -185,7 +185,7 @@ int32 OS_SocketBind(osal_id_t sock_id, const OS_SockAddr_t *Addr) /* Not a socket */ return_code = OS_ERR_INCORRECT_OBJ_TYPE; } - else if (record->refcount != 0 || (stream->stream_state & (OS_STREAM_STATE_BOUND | OS_STREAM_STATE_CONNECTED)) != 0) + else if ((stream->stream_state & (OS_STREAM_STATE_BOUND | OS_STREAM_STATE_CONNECTED)) != 0) { /* Socket must be neither bound nor connected */ return_code = OS_ERR_INCORRECT_OBJ_STATE; @@ -276,47 +276,25 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * conn->socket_domain = sock->socket_domain; conn->socket_type = sock->socket_type; - /* bumps up the refcount by 1 before finalizing, - * to avoid having to re-acquire (should be cleaned up) */ - ++conn_record->refcount; - - return_code = OS_ObjectIdFinalizeNew(return_code, &conn_token, connsock_id); - } - } - } - - if (return_code == OS_SUCCESS) - { - OS_SocketAddrInit_Impl(Addr, sock->socket_domain); + OS_SocketAddrInit_Impl(Addr, sock->socket_domain); - /* The actual accept impl is done without global table lock, only refcount lock */ - return_code = OS_SocketAccept_Impl(&sock_token, &conn_token, Addr, timeout); - } + return_code = OS_SocketAccept_Impl(&sock_token, &conn_token, Addr, timeout); - if (conn_record != NULL) - { - OS_Lock_Global(&conn_token); + if (return_code == OS_SUCCESS) + { + /* Generate an entry name based on the remote address */ + OS_CreateSocketName(&conn_token, Addr, sock_record->name_entry); + conn_record->name_entry = conn->stream_name; + conn->stream_state |= OS_STREAM_STATE_CONNECTED; + } - if (return_code == OS_SUCCESS) - { - /* Generate an entry name based on the remote address */ - OS_CreateSocketName(&conn_token, Addr, sock_record->name_entry); - conn_record->name_entry = conn->stream_name; - conn->stream_state |= OS_STREAM_STATE_CONNECTED; - } - else - { - /* Clear the connrecord */ - conn_record->active_id = OS_OBJECT_ID_UNDEFINED; + return_code = OS_ObjectIdFinalizeNew(return_code, &conn_token, connsock_id); + } } - /* Decrement both ref counters that were increased earlier */ - --conn_record->refcount; - OS_Unlock_Global(&conn_token); + OS_ObjectIdRelease(&sock_token); } - OS_ObjectIdRelease(&sock_token); - return return_code; } /* end OS_SocketAccept */ @@ -331,17 +309,15 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeout) { OS_stream_internal_record_t *stream; - OS_common_record_t * record; OS_object_token_t token; int32 return_code; /* Check Parameters */ OS_CHECK_POINTER(Addr); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) { - record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); stream = OS_OBJECT_TABLE_GET(OS_stream_table, token); if (stream->socket_domain == OS_SocketDomain_INVALID) @@ -355,25 +331,17 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 Timeo } else { - ++record->refcount; + return_code = OS_SocketConnect_Impl(&token, Addr, Timeout); + + if (return_code == OS_SUCCESS) + { + stream->stream_state |= OS_STREAM_STATE_CONNECTED | OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; + } } OS_ObjectIdRelease(&token); } - if (return_code == OS_SUCCESS) - { - return_code = OS_SocketConnect_Impl(&token, Addr, Timeout); - - OS_Lock_Global(&token); - if (return_code == OS_SUCCESS) - { - stream->stream_state |= OS_STREAM_STATE_CONNECTED | OS_STREAM_STATE_READABLE | OS_STREAM_STATE_WRITABLE; - } - --record->refcount; - OS_Unlock_Global(&token); - } - return return_code; } /* end OS_SocketConnect */ diff --git a/src/os/vxworks/inc/os-vxworks.h b/src/os/vxworks/inc/os-vxworks.h index 60a4d3771..4d9e1eefd 100644 --- a/src/os/vxworks/inc/os-vxworks.h +++ b/src/os/vxworks/inc/os-vxworks.h @@ -51,18 +51,6 @@ TYPEDEFS ****************************************************************************************/ -/* - * Union to facilitate passing an osal_id_t through - * a function/api designed to take an "int" - * - * This relies on sizeof(int) >= sizeof(osal_id_t) - */ -typedef union -{ - osal_id_t id; - int arg; -} VxWorks_ID_Buffer_t; - /**************************************************************************************** GLOBAL DATA ****************************************************************************************/ diff --git a/src/os/vxworks/src/os-impl-timebase.c b/src/os/vxworks/src/os-impl-timebase.c index bcaf5abce..887bf64b8 100644 --- a/src/os/vxworks/src/os-impl-timebase.c +++ b/src/os/vxworks/src/os-impl-timebase.c @@ -218,8 +218,10 @@ void OS_VxWorks_RegisterTimer(osal_id_t obj_id) OS_object_token_t token; struct sigevent evp; int status; + int32 retcode; - if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMEBASE, obj_id, &token) == OS_SUCCESS) + retcode = OS_ObjectIdGetById(OS_LOCK_MODE_RESERVED, OS_OBJECT_TYPE_OS_TIMEBASE, obj_id, &token); + if (retcode == OS_SUCCESS) { local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, token); @@ -248,7 +250,13 @@ void OS_VxWorks_RegisterTimer(osal_id_t obj_id) { local->timer_state = OS_TimerRegState_SUCCESS; } + + OS_ObjectIdRelease(&token); } + else + { + OS_DEBUG("OS_VxWorks_RegisterTimer() bad ID, code=%d\n", (int)retcode); + } } /* end OS_VxWorks_RegisterTimer */ /**************************************************************************************** @@ -264,11 +272,11 @@ void OS_VxWorks_RegisterTimer(osal_id_t obj_id) *-----------------------------------------------------------------*/ int OS_VxWorks_TimeBaseTask(int arg) { - VxWorks_ID_Buffer_t id; + osal_id_t obj_id; - id.arg = arg; - OS_VxWorks_RegisterTimer(id.id); - OS_TimeBase_CallbackThread(id.id); + obj_id = OS_ObjectIdFromInteger(arg); + OS_VxWorks_RegisterTimer(obj_id); + OS_TimeBase_CallbackThread(obj_id); return 0; } /* end OS_VxWorks_TimeBaseTask */ @@ -344,7 +352,6 @@ int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) sigset_t inuse; osal_index_t idx; uint32 i; - VxWorks_ID_Buffer_t idbuf; return_code = OS_SUCCESS; @@ -379,7 +386,7 @@ int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) for (idx = 0; idx < OS_MAX_TIMEBASES; ++idx) { - if (OS_ObjectIdDefined(OS_global_timebase_table[idx].active_id) && + if (OS_ObjectIdIsValid(OS_global_timebase_table[idx].active_id) && OS_impl_timebase_table[idx].assigned_signal > 0) { /* mark signal as in-use */ @@ -453,11 +460,11 @@ int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) */ if (return_code == OS_SUCCESS) { - idbuf.id = OS_ObjectIdFromToken(token); local->handler_task = taskSpawn(timebase->timebase_name, OSAL_TIMEBASE_TASK_PRIORITY, /* priority */ OSAL_TIMEBASE_TASK_OPTION_WORD, /* task option word */ - OSAL_TIMEBASE_TASK_STACK_SIZE, /* size (bytes) of stack needed */ - (FUNCPTR)OS_VxWorks_TimeBaseTask, idbuf.arg, /* 1st arg is ID */ + OSAL_TIMEBASE_TASK_STACK_SIZE, /* size (bytes) of stack needed */ + (FUNCPTR)OS_VxWorks_TimeBaseTask, /* Timebase helper task entry point */ + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), /* 1st arg is ID */ 0, 0, 0, 0, 0, 0, 0, 0, 0); /* check if taskSpawn failed */ diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index ea4d93fb8..3280d5a63 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -153,6 +153,9 @@ void Test_OS_ObjectIdConvertToken(void) OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "ut", &token); objid = token.obj_id; + /* The prep function should have unlocked once */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 1); + record = OS_OBJECT_TABLE_GET(OS_global_task_table, token); record->refcount = 5; record->active_id = objid; @@ -169,6 +172,9 @@ void Test_OS_ObjectIdConvertToken(void) UtAssert_True(actual == expected, "OS_ObjectIdConvertLock() (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, (long)expected); + /* Global should not be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 1); + /* * Use mode OS_LOCK_MODE_NONE with matching ID * This should return success. @@ -181,9 +187,12 @@ void Test_OS_ObjectIdConvertToken(void) UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(NONE) (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + /* Global should not be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 1); + /* * Use mode OS_LOCK_MODE_GLOBAL with matching ID - * This should return success, not change refcount + * This should return success and update refcount */ token.lock_mode = OS_LOCK_MODE_GLOBAL; token.obj_id = objid; @@ -192,7 +201,10 @@ void Test_OS_ObjectIdConvertToken(void) UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(GLOBAL) (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); - UtAssert_UINT32_EQ(record->refcount, 5); + UtAssert_UINT32_EQ(record->refcount, 6); + + /* Global should not be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 1); /* * Use mode OS_LOCK_MODE_REFCOUNT with matching ID @@ -205,8 +217,23 @@ void Test_OS_ObjectIdConvertToken(void) UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(REFCOUNT) (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); - UtAssert_UINT32_EQ(record->refcount, 6); + UtAssert_UINT32_EQ(record->refcount, 7); + + /* Global should be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 2); + + /* + * Use mode OS_LOCK_MODE_RESERVED with non-reserved ID. + */ + token.lock_mode = OS_LOCK_MODE_RESERVED; + token.obj_id = objid; + actual = OS_ObjectIdConvertToken(&token); + expected = OS_ERR_INVALID_ID; + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(RESERVED) (%ld) == OS_ERR_INVALID_ID (%ld)", + (long)actual, (long)expected); + /* Global should not be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 2); /* * Use mode OS_LOCK_MODE_EXCLUSIVE with matching ID and other refs. * This should return OS_ERR_OBJECT_IN_USE. @@ -221,18 +248,40 @@ void Test_OS_ObjectIdConvertToken(void) /* should have delayed 4 times, on the 5th try it returns error */ UtAssert_STUB_COUNT(OS_WaitForStateChange_Impl, 4); + /* Global should not be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 2); + /* It should also have preserved the original ID */ UtAssert_True(OS_ObjectIdEqual(record->active_id, objid), "OS_ObjectIdConvertLock(EXCLUSIVE) objid restored"); /* * Use mode OS_LOCK_MODE_EXCLUSIVE with matching ID and no other refs. - * This should return success. + * This should return success and set the active_id to OS_OBJECT_ID_RESERVED. */ record->refcount = 0; actual = OS_ObjectIdConvertToken(&token); expected = OS_SUCCESS; UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(EXCLUSIVE) (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + UtAssert_True(OS_ObjectIdEqual(record->active_id, OS_OBJECT_ID_RESERVED), + "OS_ObjectIdConvertLock(EXCLUSIVE) objid reserved"); + + /* Global should be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 3); + + /* + * Use mode OS_LOCK_MODE_RESERVED with reserved ID. + * This should return OS_SUCCESS. + */ + token.lock_mode = OS_LOCK_MODE_RESERVED; + token.obj_id = objid; + actual = OS_ObjectIdConvertToken(&token); + expected = OS_SUCCESS; + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(RESERVED) (%ld) == OS_SUCCESS (%ld)", + (long)actual, (long)expected); + + /* Global should not be released */ + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 3); } void Test_OS_ObjectIdGetBySearch(void) @@ -634,6 +683,15 @@ void Test_OS_ObjectIdAllocateNew(void) actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &token); UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_NAME_TAKEN", (long)actual); + /* + * Although an object with that name exists, it isn't fully created yet. + * OS_ObjectIdAllocateNew() should leave the object record in a state where + * attempts to get object ID by name should fail. + */ + expected = OS_ERR_INCORRECT_OBJ_STATE; + actual = OS_ObjectIdGetByName(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &token); + UtAssert_True(actual == expected, "OS_ObjectIdGetByName() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); + OS_SharedGlobalVars.ShutdownFlag = OS_SHUTDOWN_MAGIC_NUMBER; expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc", &token); From 7ba42a63fe6a7972582036dfd432ec3bf5edf8b1 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 21 Dec 2020 22:15:14 -0500 Subject: [PATCH 042/111] Fix #642, make OS_TaskDelete synchronous In the POSIX implementation, OS_TaskDelete was implemented in a deferred manner - the API call was a request, and the actual deletion occured sometime thereafter. This is a problem if the task is running code within a dynamically loaded module, and the intent is to delete the task so the module can be unloaded. In this case the app needs to be certain that the task has actually been deleted before unloading can be done safely. To do this requires use of pthread_join() on POSIX which confirms that the task has exited. However, this is a (potentially) blocking call, so to do this requires rework of the EXCLUSIVE lock mode such that the OSAL lock is _not_ held during the join operation. --- src/os/posix/src/os-impl-tasks.c | 86 +++++++++++++++++-- src/os/rtems/src/os-impl-tasks.c | 14 +++ src/os/shared/inc/os-shared-task.h | 10 +++ src/os/shared/src/osapi-task.c | 2 + src/os/vxworks/src/os-impl-tasks.c | 14 +++ .../ut-stubs/src/osapi-task-impl-stubs.c | 1 + 6 files changed, 120 insertions(+), 7 deletions(-) diff --git a/src/os/posix/src/os-impl-tasks.c b/src/os/posix/src/os-impl-tasks.c index b87197239..5fd06e8bf 100644 --- a/src/os/posix/src/os-impl-tasks.c +++ b/src/os/posix/src/os-impl-tasks.c @@ -484,6 +484,16 @@ int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority return (OS_ERROR); } + /* + ** Set the thread to be joinable by default + */ + return_code = pthread_attr_setdetachstate(&custom_attr, PTHREAD_CREATE_JOINABLE); + if (return_code != 0) + { + OS_DEBUG("pthread_attr_setdetachstate error in OS_TaskCreate: %s\n", strerror(return_code)); + return (OS_ERROR); + } + /* ** Test to see if the original main task scheduling priority worked. ** If so, then also set the attributes for this task. Otherwise attributes @@ -548,12 +558,6 @@ int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority ** Do not treat anything bad that happens after this point as fatal. ** The task is running, after all - better to leave well enough alone. */ - return_code = pthread_detach(*pthr); - if (return_code != 0) - { - OS_DEBUG("pthread_detach error in OS_TaskCreate: %s\n", strerror(return_code)); - } - return_code = pthread_attr_destroy(&custom_attr); if (return_code != 0) { @@ -590,6 +594,33 @@ int32 OS_TaskCreate_Impl(const OS_object_token_t *token, uint32 flags) return return_code; } /* end OS_TaskCreate_Impl */ +/*---------------------------------------------------------------- + * + * Function: OS_TaskDetach_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_TaskDetach_Impl(const OS_object_token_t *token) +{ + OS_impl_task_internal_record_t *impl; + int ret; + + impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); + + ret = pthread_detach(impl->id); + + if (ret != 0) + { + OS_DEBUG("pthread_detach: Failed on Task ID = %lu, err = %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(ret)); + return OS_ERROR; + } + + return OS_SUCCESS; +} + /*---------------------------------------------------------------- * * Function: OS_TaskMatch_Impl @@ -623,6 +654,8 @@ int32 OS_TaskMatch_Impl(const OS_object_token_t *token) int32 OS_TaskDelete_Impl(const OS_object_token_t *token) { OS_impl_task_internal_record_t *impl; + void * retval; + int ret; impl = OS_OBJECT_TABLE_GET(OS_impl_task_table, *token); @@ -632,7 +665,35 @@ int32 OS_TaskDelete_Impl(const OS_object_token_t *token) ** to cancel here is that the thread ID is invalid because it already exited itself, ** and if that is true there is nothing wrong - everything is OK to continue normally. */ - pthread_cancel(impl->id); + ret = pthread_cancel(impl->id); + if (ret != 0) + { + OS_DEBUG("pthread_cancel: Failed on Task ID = %lu, err = %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(ret)); + + /* fall through (will still return OS_SUCCESS) */ + } + else + { + /* + * Note that "pthread_cancel" is a request - and successful return above + * only means that the cancellation request is pending. + * + * pthread_join() will wait until the thread has actually exited. + * + * This is important for CFE, as task deletion often occurs in + * conjunction with an application reload - which means the next + * call is likely to be OS_ModuleUnload(). So is critical that all + * tasks potentially executing code within that module have actually + * been stopped - not just pending cancellation. + */ + ret = pthread_join(impl->id, &retval); + if (ret != 0) + { + OS_DEBUG("pthread_join: Failed on Task ID = %lu, err = %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(ret)); + } + } return OS_SUCCESS; } /* end OS_TaskDelete_Impl */ @@ -738,6 +799,17 @@ int32 OS_TaskRegister_Impl(osal_id_t global_task_id) { int32 return_code; OS_U32ValueWrapper_t arg; + int old_state; + int old_type; + + /* + * Set cancel state=ENABLED, type=DEFERRED + * This should be the default for new threads, but + * setting explicitly to be sure that a pthread_join() + * will work as expected in case this thread is deleted. + */ + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_state); + pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &old_type); arg.opaque_arg = 0; arg.id = global_task_id; diff --git a/src/os/rtems/src/os-impl-tasks.c b/src/os/rtems/src/os-impl-tasks.c index 606846648..5c107ef97 100644 --- a/src/os/rtems/src/os-impl-tasks.c +++ b/src/os/rtems/src/os-impl-tasks.c @@ -173,6 +173,20 @@ int32 OS_TaskDelete_Impl(const OS_object_token_t *token) return OS_SUCCESS; } /* end OS_TaskDelete_Impl */ +/*---------------------------------------------------------------- + * + * Function: OS_TaskDetach_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_TaskDetach_Impl(const OS_object_token_t *token) +{ + /* No-op on RTEMS */ + return OS_SUCCESS; +} + /*---------------------------------------------------------------- * * Function: OS_TaskExit_Impl diff --git a/src/os/shared/inc/os-shared-task.h b/src/os/shared/inc/os-shared-task.h index 4c7d74b22..f6826f05f 100644 --- a/src/os/shared/inc/os-shared-task.h +++ b/src/os/shared/inc/os-shared-task.h @@ -95,6 +95,16 @@ int32 OS_TaskMatch_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_TaskCreate_Impl(const OS_object_token_t *token, uint32 flags); +/*---------------------------------------------------------------- + Function: OS_TaskDetach_Impl + + Purpose: Sets the thread so that the OS resources associated with the task + will be released when the thread exits itself + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_TaskDetach_Impl(const OS_object_token_t *token); + /*---------------------------------------------------------------- Function: OS_TaskDelete_Impl diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index eff849d30..b46db2677 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -265,6 +265,8 @@ void OS_TaskExit() task_id = OS_TaskGetId_Impl(); if (OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, task_id, &token) == OS_SUCCESS) { + OS_TaskDetach_Impl(&token); + /* Complete the operation via the common routine */ OS_ObjectIdFinalizeDelete(OS_SUCCESS, &token); } diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index ecb50db59..412bec066 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -287,6 +287,20 @@ int32 OS_TaskDelete_Impl(const OS_object_token_t *token) } /* end OS_TaskDelete_Impl */ +/*---------------------------------------------------------------- + * + * Function: OS_TaskDetach_Impl + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_TaskDetach_Impl(const OS_object_token_t *token) +{ + /* No-op on VxWorks */ + return OS_SUCCESS; +} + /*---------------------------------------------------------------- * * Function: OS_TaskExit_Impl diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c index 963d79173..fd3dd43d2 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-task-impl-stubs.c @@ -39,6 +39,7 @@ ** Task API */ UT_DEFAULT_STUB(OS_TaskMatch_Impl, (const OS_object_token_t *token)) +UT_DEFAULT_STUB(OS_TaskDetach_Impl, (const OS_object_token_t *token)) UT_DEFAULT_STUB(OS_TaskCreate_Impl, (const OS_object_token_t *token, uint32 flags)) UT_DEFAULT_STUB(OS_TaskDelete_Impl, (const OS_object_token_t *token)) void OS_TaskExit_Impl(void) From c821c37c1cc794139b80e30c6bd57eed62df485a Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 22 Dec 2020 16:55:08 -0500 Subject: [PATCH 043/111] Fix #703, unit test updates Update unit tests for idmap functions, add test cases where coverage was incomplete. All OS_ObjectId* function coverage is back at 100%. --- src/os/shared/inc/os-shared-idmap.h | 1 + .../shared/src/coveragetest-idmap.c | 250 ++++++++++++++++++ 2 files changed, 251 insertions(+) diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index b7cd14eda..a08e16628 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -540,6 +540,7 @@ int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal * These are not normally called outside this unit, but need * to be exposed for unit testing. */ +bool OS_ObjectFilterActive(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_object_token_t *token); int32 OS_ObjectIdFindNextFree(OS_object_token_t *token); diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 3280d5a63..c791bd165 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -66,6 +66,13 @@ static void ObjTypeCounter(osal_id_t object_id, void *arg) } } +static int32 TestIterator(osal_id_t object_id, void *arg) +{ + uint32 *c = arg; + ++(*c); + return UT_DEFAULT_IMPL(TestIterator); +} + void Test_OS_ObjectIdInit(void) { /* @@ -701,6 +708,18 @@ void Test_OS_ObjectIdAllocateNew(void) expected = OS_ERR_INCORRECT_OBJ_TYPE; actual = OS_ObjectIdAllocateNew(0xFFFF, "UT_alloc", &token); UtAssert_True(actual == expected, "OS_ObjectIdAllocate() (%ld) == OS_ERR_INCORRECT_OBJ_TYPE", (long)actual); + + /* + * Test late-stage failure path - + * If object was allocated successfully to the point that a table index was assigned, + * but then failed later, it should call FinalizeNew with the error code so the table + * entry can be cleaned up (effect is the same as if the underlying impl failed). + */ + UT_SetDefaultReturnValue(UT_KEY(OS_NotifyEvent), OS_ERR_INVALID_SIZE); + expected = OS_ERR_INVALID_SIZE; + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc2", &token); + UtAssert_True(actual == expected, "OS_ObjectIdAllocateNew() (%ld) == OS_ERR_INVALID_SIZE", (long)actual); + } void Test_OS_ConvertToArrayIndex(void) @@ -728,6 +747,193 @@ void Test_OS_ConvertToArrayIndex(void) UtAssert_True(actual == expected, "OS_ConvertToArrayIndex() (%ld) == OS_ERR_INVALID_ID", (long)actual); } +void Test_OS_ObjectIdTransaction(void) +{ + /* + * Test Case For: + * int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_object_token_t *token); + * void OS_ObjectIdTransactionCancel(OS_object_token_t *token); + * void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id); + * void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t *token_to); + */ + + OS_object_token_t token; + OS_object_token_t token2; + osal_id_t objid; + OS_common_record_t *record; + + memset(&token, 0xAA, sizeof(token)); + memset(&OS_SharedGlobalVars, 0, sizeof(OS_SharedGlobalVars)); + + /* With OS_SharedGlobalVars uninitialized (0) it should prevent transactions */ + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_BINSEM, &token), OS_ERROR); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 0); + + /* shutdown will prevent transactions */ + OS_SharedGlobalVars.Initialized = true; + OS_SharedGlobalVars.ShutdownFlag = OS_SHUTDOWN_MAGIC_NUMBER; + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_BINSEM, &token), OS_ERR_INCORRECT_OBJ_STATE); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + UtAssert_UINT32_EQ(token.obj_type, OS_OBJECT_TYPE_UNDEFINED); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 0); + + /* except for exclusive (delete) transactions, which should succeed */ + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_BINSEM, &token), OS_SUCCESS); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_EXCLUSIVE); + UtAssert_UINT32_EQ(token.obj_idx, -1); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 1); + + /* cancel should unlock */ + OS_ObjectIdTransactionCancel(&token); + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 1); + + /* other cases for normal operating mode */ + OS_SharedGlobalVars.ShutdownFlag = 0; + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_COUNTSEM, &token), OS_SUCCESS); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_GLOBAL); + UtAssert_UINT32_EQ(token.obj_type, OS_OBJECT_TYPE_OS_COUNTSEM); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 2); + + /* bad object type */ + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_UNDEFINED, &token), OS_ERR_INCORRECT_OBJ_TYPE); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + UtAssert_UINT32_EQ(token.obj_type, OS_OBJECT_TYPE_UNDEFINED); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 2); + + /* normal finish (sets ID from passed in value) */ + objid = UT_OBJID_1; + token.obj_id = UT_OBJID_2; + token.obj_idx = UT_INDEX_2; + token.obj_type = OS_OBJECT_TYPE_OS_TASK; + token.lock_mode = OS_LOCK_MODE_GLOBAL; + record = OS_ObjectIdGlobalFromToken(&token); + record->refcount = 1; + + OS_ObjectIdTransactionFinish(&token, &objid); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 2); + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 2); + OSAPI_TEST_OBJID(record->active_id, ==, objid); + UtAssert_UINT32_EQ(record->refcount, 0); + + /* exclusive lock finish (restores ID from token) */ + record->refcount = 1; + record->active_id = OS_OBJECT_ID_RESERVED; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + OS_ObjectIdTransactionFinish(&token, NULL); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 3); + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 3); + OSAPI_TEST_OBJID(record->active_id, ==, token.obj_id); + UtAssert_UINT32_EQ(record->refcount, 0); + + /* refcount finish (no change to ID) */ + token.lock_mode = OS_LOCK_MODE_REFCOUNT; + record->refcount = 1; + record->active_id = UT_OBJID_1; + OS_ObjectIdTransactionFinish(&token, NULL); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 4); + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 4); + OSAPI_TEST_OBJID(record->active_id, ==, UT_OBJID_1); + UtAssert_UINT32_EQ(record->refcount, 0); + + /* other finish with refcount already 0 */ + token.lock_mode = OS_LOCK_MODE_GLOBAL; + OS_ObjectIdTransactionFinish(&token, NULL); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 4); + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 5); + OSAPI_TEST_OBJID(record->active_id, ==, UT_OBJID_1); + UtAssert_UINT32_EQ(record->refcount, 0); + + /* test transferring a refcount token */ + memset(&token2, 0xBB, sizeof(token2)); + token.obj_id = UT_OBJID_2; + token.obj_idx = UT_INDEX_2; + token.obj_type = OS_OBJECT_TYPE_OS_TASK; + token.lock_mode = OS_LOCK_MODE_GLOBAL; + + OS_ObjectIdTransferToken(&token, &token2); + + /* actual lock_mode should only be on token2 now */ + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + UtAssert_UINT32_EQ(token2.lock_mode, OS_LOCK_MODE_GLOBAL); + + /* other fields should stay the same */ + UtAssert_UINT32_EQ(token.obj_idx, token2.obj_idx); + UtAssert_UINT32_EQ(token.obj_type, token2.obj_type); + OSAPI_TEST_OBJID(token.obj_id, ==, token2.obj_id); +} + +void Test_OS_ObjectIdFinalize(void) +{ + /* + * Test Case For: + * int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, osal_id_t *outid); + * int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_object_token_t *token); + */ + int32 expected; + int32 actual; + OS_object_token_t token; + osal_id_t objid; + OS_common_record_t *record; + + memset(&token, 0, sizeof(token)); + + objid = UT_OBJID_1; + token.obj_id = UT_OBJID_2; + token.obj_idx = UT_INDEX_2; + token.obj_type = OS_OBJECT_TYPE_OS_TASK; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + + record = OS_ObjectIdGlobalFromToken(&token); + + /* if creation fails, RC should be passed through and ID set to UNDEFINED */ + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + record->active_id = OS_OBJECT_ID_RESERVED; + expected = OS_ERR_INVALID_ID; + actual = OS_ObjectIdFinalizeNew(OS_ERR_INVALID_ID, &token, &objid); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, (long)expected); + OSAPI_TEST_OBJID(objid, ==, OS_OBJECT_ID_UNDEFINED); + OSAPI_TEST_OBJID(record->active_id, ==, OS_OBJECT_ID_UNDEFINED); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + + /* if creation succeeds, RC should be passed through and ID set to token value */ + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + record->active_id = OS_OBJECT_ID_RESERVED; + expected = OS_SUCCESS; + actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token, &objid); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + OSAPI_TEST_OBJID(objid, ==, token.obj_id); + OSAPI_TEST_OBJID(record->active_id, ==, token.obj_id); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + + /* verify passing NULL for out ID for path coverage */ + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + record->active_id = OS_OBJECT_ID_RESERVED; + expected = OS_SUCCESS; + actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token, NULL); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + OSAPI_TEST_OBJID(record->active_id, ==, token.obj_id); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + + /* if delete succeeds, RC should be passed through and ID set to UNDEFINED */ + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + record->active_id = OS_OBJECT_ID_RESERVED; + expected = OS_SUCCESS; + actual = OS_ObjectIdFinalizeDelete(OS_SUCCESS, &token); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeDelete() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + OSAPI_TEST_OBJID(record->active_id, ==, OS_OBJECT_ID_UNDEFINED); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); + + /* if delete fails, RC should be passed through and ID set to the token value */ + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + record->active_id = OS_OBJECT_ID_RESERVED; + expected = OS_ERR_INVALID_ID; + actual = OS_ObjectIdFinalizeDelete(OS_ERR_INVALID_ID, &token); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeDelete() rc passthru (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, (long)expected); + OSAPI_TEST_OBJID(record->active_id, ==, token.obj_id); + UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); +} + void Test_OS_ForEachObject(void) { /* @@ -815,6 +1021,47 @@ void Test_OS_GetResourceName(void) UtAssert_True(actual == expected, "OS_GetResourceName() (%ld) == OS_INVALID_POINTER", (long)actual); } +void Test_OS_ObjectIdIterator(void) +{ + /* + * Test Case For: + * int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, osal_objtype_t objtype, + OS_object_iter_t *iter); + * bool OS_ObjectFilterActive(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); + * int32 OS_ObjectIdIterateActive(osal_objtype_t objtype, OS_object_iter_t *iter); + * bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter); + * void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter); + * int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t, void *)); + */ + OS_object_iter_t iter; + OS_common_record_t rec; + uint32 testarg; + + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdIteratorInit(NULL, NULL, OS_OBJECT_TYPE_UNDEFINED, &iter), OS_ERR_INCORRECT_OBJ_TYPE); + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdIterateActive(OS_OBJECT_TYPE_OS_TASK, &iter), OS_SUCCESS); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 1); + + memset(&rec, 0, sizeof(rec)); + UtAssert_True(!OS_ObjectFilterActive(NULL, NULL, &rec), "OS_ObjectFilterActive() empty record"); + + rec.active_id = UT_OBJID_1; + UtAssert_True(OS_ObjectFilterActive(NULL, NULL, &rec), "OS_ObjectFilterActive() non-empty record"); + + /* OS_ObjectIdIteratorProcessEntry unlocks and re-locks */ + testarg = 4; + iter.arg = &testarg; + OS_ObjectIdIteratorProcessEntry(&iter, TestIterator); + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 1); + UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 2); + + + /* OS_ObjectIdIteratorDestroy is just a passthrough to OS_ObjectIdTransactionCancel, + * but need to call for coverage */ + OS_ObjectIdIteratorDestroy(&iter); + UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 2); + +} + /* Osapi_Test_Setup * * Purpose: @@ -854,7 +1101,9 @@ void UtTest_Setup(void) ADD_TEST(OS_ObjectIdToArrayIndex); ADD_TEST(OS_ObjectIdFindByName); ADD_TEST(OS_ObjectIdGetById); + ADD_TEST(OS_ObjectIdTransaction); ADD_TEST(OS_ObjectIdAllocateNew); + ADD_TEST(OS_ObjectIdFinalize); ADD_TEST(OS_ObjectIdConvertToken); ADD_TEST(OS_ObjectIdGetBySearch); ADD_TEST(OS_ConvertToArrayIndex); @@ -862,4 +1111,5 @@ void UtTest_Setup(void) ADD_TEST(OS_GetMaxForObjectType); ADD_TEST(OS_GetBaseForObjectType); ADD_TEST(OS_GetResourceName); + ADD_TEST(OS_ObjectIdIterator); } From ed990e78362d4b6067e3c304a61d0387381b9051 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 28 Dec 2020 12:15:09 -0500 Subject: [PATCH 044/111] Fix #697, use POSIX dir implementation on VxWorks6 Instead of maintaining a one-off implementation for VxWorks 6, use the POSIX implementation for this module. The only incompatibility is the prototype for mkdir() which is missing the second argument. This can be worked around with a simple compatibility macro that is only enabled for VxWorks 6.x builds. --- src/os/vxworks/CMakeLists.txt | 15 +- src/os/vxworks/inc/os-impl-dirs.h | 12 ++ src/os/vxworks/src/os-impl-dirs.c | 172 ------------------ .../src/coveragetest-posix-dirs.c} | 44 +++-- .../ut-stubs/inc/OCS_errno.h | 1 + .../ut-stubs/inc/OCS_fcntl.h | 4 + .../ut-stubs/override_inc/errno.h | 1 + .../ut-stubs/override_inc/fcntl.h | 3 + src/unit-test-coverage/vxworks/CMakeLists.txt | 2 +- 9 files changed, 53 insertions(+), 201 deletions(-) delete mode 100644 src/os/vxworks/src/os-impl-dirs.c rename src/unit-test-coverage/{vxworks/src/coveragetest-dirs.c => portable/src/coveragetest-posix-dirs.c} (72%) diff --git a/src/os/vxworks/CMakeLists.txt b/src/os/vxworks/CMakeLists.txt index 9d1cc84d7..912f3e74c 100644 --- a/src/os/vxworks/CMakeLists.txt +++ b/src/os/vxworks/CMakeLists.txt @@ -33,6 +33,7 @@ set(VXWORKS_IMPL_SRCLIST ../portable/os-impl-bsd-select.c ../portable/os-impl-posix-io.c ../portable/os-impl-posix-files.c + ../portable/os-impl-posix-dirs.c ) if (OSAL_CONFIG_INCLUDE_SHELL) @@ -45,15 +46,6 @@ else () ) endif () -if (CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 7.0) - list(APPEND VXWORKS_IMPL_SRCLIST - ../portable/os-impl-posix-dirs.c - ) -else () - list(APPEND VXWORKS_IMPL_SRCLIST - src/os-impl-dirs.c - ) -endif () # If some form of module loading is configured, # then build the module loader if (OSAL_CONFIG_INCLUDE_DYNAMIC_LOADER) @@ -86,3 +78,8 @@ add_library(osal_vxworks_impl OBJECT ${VXWORKS_BASE_SRCLIST} ${VXWORKS_IMPL_SRCLIST} ) + +if (CMAKE_SYSTEM_VERSION VERSION_LESS 7.0) + target_compile_definitions(osal_vxworks_impl PRIVATE OSAL_VXWORKS6_COMPATIBILITY) +endif () + diff --git a/src/os/vxworks/inc/os-impl-dirs.h b/src/os/vxworks/inc/os-impl-dirs.h index 43029aaa1..9dc4447f7 100644 --- a/src/os/vxworks/inc/os-impl-dirs.h +++ b/src/os/vxworks/inc/os-impl-dirs.h @@ -31,8 +31,20 @@ #include "osconfig.h" #include #include +#include #include +/* + * In VxWorks 6.x the system mkdir() function only has a path argument + * In VxWorks 7 it is now POSIX compilant and adds a mode argument + * + * This macro simply discards the second argument, allowing code to use + * mkdir() in a consistent, POSIX compliant fashion. + */ +#ifdef OSAL_VXWORKS6_COMPATIBILITY +#define mkdir(path,mode) mkdir(path) +#endif + typedef struct { DIR *dp; diff --git a/src/os/vxworks/src/os-impl-dirs.c b/src/os/vxworks/src/os-impl-dirs.c deleted file mode 100644 index 4f774e216..000000000 --- a/src/os/vxworks/src/os-impl-dirs.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * NASA Docket No. GSC-18,370-1, and identified as "Operating System Abstraction Layer" - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * All Rights Reserved. - * - * 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 os-impl-dirs.c - * \ingroup vxworks - * \author joseph.p.hickey@nasa.gov - * - */ - -/**************************************************************************************** - INCLUDE FILES -****************************************************************************************/ - -#include "os-vxworks.h" -#include "os-impl-dirs.h" -#include "os-shared-dir.h" -#include "os-shared-idmap.h" - -/*---------------------------------------------------------------- - * - * Function: OS_DirCreate_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_DirCreate_Impl(const char *local_path, uint32 access) -{ - int32 return_code; - - if (mkdir(local_path) != OK) - { - return_code = OS_ERROR; - } - else - { - return_code = OS_SUCCESS; - } - - return return_code; -} /* end OS_DirCreate_Impl */ - -/*---------------------------------------------------------------- - * - * Function: OS_DirOpen_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_DirOpen_Impl(const OS_object_token_t *token, const char *local_path) -{ - OS_impl_dir_internal_record_t *impl; - - impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); - - impl->dp = opendir(local_path); - if (impl->dp == NULL) - { - return OS_ERROR; - } - return OS_SUCCESS; -} /* end OS_DirOpen_Impl */ - -/*---------------------------------------------------------------- - * - * Function: OS_DirClose_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_DirClose_Impl(const OS_object_token_t *token) -{ - OS_impl_dir_internal_record_t *impl; - - impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); - - closedir(impl->dp); - impl->dp = NULL; - return OS_SUCCESS; -} /* end OS_DirClose_Impl */ - -/*---------------------------------------------------------------- - * - * Function: OS_DirRead_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_DirRead_Impl(const OS_object_token_t *token, os_dirent_t *dirent) -{ - struct dirent * de; - OS_impl_dir_internal_record_t *impl; - - impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); - - /* NOTE - the readdir() call is non-reentrant .... - * However, this is performed while the global dir table lock is taken. - * Therefore this ensures that only one such call can occur at any given time. - * - * Static analysis tools may warn about this because they do not know - * this function is externally serialized via the global lock. - */ - /* cppcheck-suppress readdirCalled */ - /* cppcheck-suppress nonreentrantFunctionsreaddir */ - de = readdir(impl->dp); - if (de == NULL) - { - return OS_ERROR; - } - - strncpy(dirent->FileName, de->d_name, sizeof(dirent->FileName) - 1); - dirent->FileName[sizeof(dirent->FileName) - 1] = 0; - - return OS_SUCCESS; -} /* end OS_DirRead_Impl */ - -/*---------------------------------------------------------------- - * - * Function: OS_DirRewind_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_DirRewind_Impl(const OS_object_token_t *token) -{ - OS_impl_dir_internal_record_t *impl; - - impl = OS_OBJECT_TABLE_GET(OS_impl_dir_table, *token); - - rewinddir(impl->dp); - return OS_SUCCESS; -} /* end OS_DirRewind_Impl */ - -/*---------------------------------------------------------------- - * - * Function: OS_DirRemove_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_DirRemove_Impl(const char *local_path) -{ - if (rmdir(local_path) < 0) - { - return OS_ERROR; - } - - return OS_SUCCESS; -} /* end OS_DirRemove_Impl */ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c b/src/unit-test-coverage/portable/src/coveragetest-posix-dirs.c similarity index 72% rename from src/unit-test-coverage/vxworks/src/coveragetest-dirs.c rename to src/unit-test-coverage/portable/src/coveragetest-posix-dirs.c index 9fc7c3f4f..371e3b254 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-dirs.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-dirs.c @@ -19,19 +19,17 @@ */ /** - * \file coveragetest-dirs.c - * \ingroup vxworks + * \file coveragetest-posix-dirs.c * \author joseph.p.hickey@nasa.gov * */ -#include "os-vxworks-coveragetest.h" -#include "ut-adaptor-dirs.h" +#include "os-portable-coveragetest.h" #include "os-shared-dir.h" +#include "os-shared-idmap.h" #include -#include #include #include #include @@ -42,10 +40,10 @@ void Test_OS_DirCreate_Impl(void) * Test Case For: * int32 OS_DirCreate_Impl(const char *local_path, uint32 access) */ - OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl("dir", 0), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl, ("dir", 0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_mkdir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl("dir", 0), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl, ("dir", 0), OS_ERROR); } void Test_OS_DirOpen_Impl(void) @@ -54,11 +52,13 @@ void Test_OS_DirOpen_Impl(void) * Test Case For: * int32 OS_DirOpen_Impl(uint32 local_id, const char *local_path) */ - OS_object_token_t token = UT_TOKEN_0; + OS_object_token_t token; - OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(&token, "dir"), OS_SUCCESS); + memset(&token, 0, sizeof(token)); + + OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl, (&token, "dir"), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_opendir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl(&token, "dir"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirOpen_Impl, (&token, "dir"), OS_ERROR); } void Test_OS_DirClose_Impl(void) @@ -67,9 +67,11 @@ void Test_OS_DirClose_Impl(void) * Test Case For: * int32 OS_DirClose_Impl(uint32 local_id) */ - OS_object_token_t token = UT_TOKEN_0; + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); - OSAPI_TEST_FUNCTION_RC(OS_DirClose_Impl(&token), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirClose_Impl, (&token), OS_SUCCESS); } void Test_OS_DirRead_Impl(void) @@ -79,12 +81,14 @@ void Test_OS_DirRead_Impl(void) * int32 OS_DirRead_Impl(uint32 local_id, os_dirent_t *dirent) */ os_dirent_t dirent_buff; - OS_object_token_t token = UT_TOKEN_0; + OS_object_token_t token; - OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(&token, &dirent_buff), OS_SUCCESS); + memset(&token, 0, sizeof(token)); + + OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl, (&token, &dirent_buff), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_readdir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl(&token, &dirent_buff), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirRead_Impl, (&token, &dirent_buff), OS_ERROR); } void Test_OS_DirRewind_Impl(void) @@ -93,9 +97,11 @@ void Test_OS_DirRewind_Impl(void) * Test Case For: * int32 OS_DirRewind_Impl(uint32 local_id) */ - OS_object_token_t token = UT_TOKEN_0; + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); - OSAPI_TEST_FUNCTION_RC(OS_DirRewind_Impl(&token), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirRewind_Impl, (&token), OS_SUCCESS); } void Test_OS_DirRemove_Impl(void) @@ -104,10 +110,10 @@ void Test_OS_DirRemove_Impl(void) * Test Case For: * int32 OS_DirRemove_Impl(const char *local_path) */ - OSAPI_TEST_FUNCTION_RC(OS_DirRemove_Impl("dir"), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_DirRemove_Impl, ("dir"), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_rmdir), -1); - OSAPI_TEST_FUNCTION_RC(OS_DirRemove_Impl("dir"), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_DirRemove_Impl, ("dir"), OS_ERROR); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h index 8d7d89b93..1e0fbdbed 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h @@ -30,6 +30,7 @@ /* POSIX-specific errnos */ #define OCS_EINTR 0x1801 #define OCS_EAGAIN 0x1802 +#define OCS_EEXIST 0x180a #define OCS_EINVAL 0x1803 #define OCS_EMSGSIZE 0x1804 #define OCS_ETIMEDOUT 0x1805 diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h index 96bc3cdb1..48408b35c 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h @@ -38,6 +38,10 @@ * * These are exposed to apps through fcntl.h and sys/stat.h */ +#define OCS_S_IRWXO 0x1110 +#define OCS_S_IRWXG 0x2220 +#define OCS_S_IRWXU 0x4440 + #define OCS_S_IXOTH 0x1000 #define OCS_S_IXGRP 0x2000 #define OCS_S_IXUSR 0x4000 diff --git a/src/unit-test-coverage/ut-stubs/override_inc/errno.h b/src/unit-test-coverage/ut-stubs/override_inc/errno.h index 636ac2a34..b69c4cbfb 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/errno.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/errno.h @@ -30,6 +30,7 @@ #define EINTR OCS_EINTR #define EAGAIN OCS_EAGAIN #define EINVAL OCS_EINVAL +#define EEXIST OCS_EEXIST #define EMSGSIZE OCS_EMSGSIZE #define ETIMEDOUT OCS_ETIMEDOUT #define ESPIPE OCS_ESPIPE diff --git a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h index 8b0f2f289..50b359062 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h @@ -27,6 +27,9 @@ /* ----------------------------------------- */ /* mappings for declarations in fcntl.h */ /* ----------------------------------------- */ +#define S_IRWXU OCS_S_IRWXU +#define S_IRWXG OCS_S_IRWXG +#define S_IRWXO OCS_S_IRWXO #define S_IXOTH OCS_S_IXOTH #define S_IXGRP OCS_S_IXGRP #define S_IXUSR OCS_S_IXUSR diff --git a/src/unit-test-coverage/vxworks/CMakeLists.txt b/src/unit-test-coverage/vxworks/CMakeLists.txt index afcf47eb1..5bc877276 100644 --- a/src/unit-test-coverage/vxworks/CMakeLists.txt +++ b/src/unit-test-coverage/vxworks/CMakeLists.txt @@ -5,7 +5,6 @@ set(VXWORKS_MODULE_LIST common console countsem - dirs dirs-globals files filesys @@ -25,6 +24,7 @@ set(VXWORKS_PORTABLE_BLOCK_LIST posix-gettime posix-io posix-files + posix-dirs console-bsp bsd-select From e17553089eea728f4e7f0f75250694283f1c6bb7 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 28 Dec 2020 13:54:23 -0500 Subject: [PATCH 045/111] Fix #580, improve FS_BASED mounts on VxWorks The mount/unmount implementation was not really checking for and handling this mapping type. To be consistent with POSIX it should also create a directory if it does not already exist. --- src/os/inc/osapi-filesys.h | 10 +++ src/os/vxworks/src/os-impl-filesys.c | 83 +++++++++++++++---- .../vxworks/src/coveragetest-filesys.c | 34 ++++++++ 3 files changed, 110 insertions(+), 17 deletions(-) diff --git a/src/os/inc/osapi-filesys.h b/src/os/inc/osapi-filesys.h index 8b3d6797c..94c7ea035 100644 --- a/src/os/inc/osapi-filesys.h +++ b/src/os/inc/osapi-filesys.h @@ -56,6 +56,16 @@ typedef struct * This mimics the behavior of a "FS_BASED" entry in the VolumeTable but is registered * at runtime. It is intended to be called by the PSP/BSP prior to starting the application. * + * @note OSAL virtual mount points are required to be a single, non-empty top-level directory + * name. Virtual path names always follow the form ///. + * Only the relative path may be omitted/empty (i.e. //) but the + * virtual mount point must be present and not an empty string. In particular this means + * it is not possible to directly refer to files in the "root" of the native file system + * from OSAL. However it is possible to create a virtual map to the root, such as by calling: + * + * OS_FileSysAddFixedMap(&fs_id, "/", "/root"); + * + * * @param[out] filesys_id A non-zero OSAL ID reflecting the file system * @param[in] phys_path The native system directory (an existing mount point) * @param[in] virt_path The virtual mount point of this filesystem diff --git a/src/os/vxworks/src/os-impl-filesys.c b/src/os/vxworks/src/os-impl-filesys.c index 5a7080c6e..5352e8563 100644 --- a/src/os/vxworks/src/os-impl-filesys.c +++ b/src/os/vxworks/src/os-impl-filesys.c @@ -32,6 +32,7 @@ #include "os-vxworks.h" #include "os-impl-filesys.h" +#include "os-impl-dirs.h" #include "os-shared-filesys.h" #include "os-shared-idmap.h" @@ -295,22 +296,62 @@ int32 OS_FileSysMountVolume_Impl(const OS_object_token_t *token) OS_filesys_internal_record_t *local; int32 status; int fd; + struct stat stat_buf; local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); /* - * Calling open() on the physical device path - * mounts the device. + * For FS-based mounts, these are just a map to a some other + * directory in the filesystem. + * + * If it does exist then make sure it is actually a directory. + * If it does not exist then attempt to create it. */ - fd = open(local->system_mountpt, O_RDONLY, 0644); - if (fd < 0) + if (local->fstype == OS_FILESYS_TYPE_FS_BASED) { - status = OS_ERROR; + if (stat(local->system_mountpt, &stat_buf) == 0) + { + if (S_ISDIR(stat_buf.st_mode)) + { + /* mount point exists */ + status = OS_SUCCESS; + } + else + { + OS_DEBUG("%s is not a directory\n", local->system_mountpt); + status = OS_FS_ERR_PATH_INVALID; + } + } + else + { + if (mkdir(local->system_mountpt, 0775) == 0) + { + /* directory created OK */ + status = OS_SUCCESS; + } + else + { + OS_DEBUG("mkdir(%s): errno=%d\n", local->system_mountpt, errnoGet()); + status = OS_FS_ERR_DRIVE_NOT_CREATED; + } + } } else { - status = OS_SUCCESS; - close(fd); + /* + * For all other (non-FS_BASED) filesystem types, + * Calling open() on the physical device path mounts the device. + */ + fd = open(local->system_mountpt, O_RDONLY, 0644); + if (fd < 0) + { + status = OS_ERROR; + } + else + { + status = OS_SUCCESS; + close(fd); + } } return status; @@ -333,26 +374,34 @@ int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token) local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); - /* - ** vxWorks uses an ioctl to unmount - */ - fd = open(local->system_mountpt, O_RDONLY, 0644); - if (fd < 0) + if (local->fstype == OS_FILESYS_TYPE_FS_BASED) { - status = OS_ERROR; + /* unmount is a no-op on FS-based mounts - it is just a directory map */ + status = OS_SUCCESS; } else { - if (ioctl(fd, FIOUNMOUNT, 0) < 0) + /* + ** vxWorks uses an ioctl to unmount + */ + fd = open(local->system_mountpt, O_RDONLY, 0644); + if (fd < 0) { status = OS_ERROR; } else { - status = OS_SUCCESS; - } + if (ioctl(fd, FIOUNMOUNT, 0) < 0) + { + status = OS_ERROR; + } + else + { + status = OS_SUCCESS; + } - close(fd); + close(fd); + } } return status; diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c index 52c2c69cf..de2998415 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c @@ -130,12 +130,38 @@ void Test_OS_FileSysMountVolume_Impl(void) * int32 OS_FileSysMountVolume_Impl (uint32 filesys_id) */ OS_object_token_t token = UT_TOKEN_0; + struct OCS_stat statbuf; + + memset(&OS_filesys_table[0], 0, sizeof(OS_filesys_table[0])); + OS_filesys_table[0].fstype = OS_FILESYS_TYPE_NORMAL_DISK; + strcpy(OS_filesys_table[0].system_mountpt, "/ut"); OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_open)); + + /* Additional cases for the FS_BASED handling */ + OS_filesys_table[0].fstype = OS_FILESYS_TYPE_FS_BASED; + + /* Mount dir does not exist but can be created */ + UT_SetDefaultReturnValue(UT_KEY(OCS_stat), -1); + OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_SUCCESS); + + /* Mount dir does not exist and cannot be created */ + UT_SetDeferredRetcode(UT_KEY(OCS_mkdir), 1, -1); + OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_FS_ERR_DRIVE_NOT_CREATED); + + /* Mount dir does exist but not a directory */ + UT_ClearForceFail(UT_KEY(OCS_stat)); + OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_FS_ERR_PATH_INVALID); + + /* Mount dir does exist and is a directory */ + memset(&statbuf, 0, sizeof(statbuf)); + statbuf.st_mode = OCS_S_IFDIR; + UT_SetDataBuffer(UT_KEY(OCS_stat), &statbuf, sizeof(statbuf), false); + OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_SUCCESS); } void Test_OS_FileSysUnmountVolume_Impl(void) @@ -145,6 +171,10 @@ void Test_OS_FileSysUnmountVolume_Impl(void) */ OS_object_token_t token = UT_TOKEN_0; + memset(&OS_filesys_table[0], 0, sizeof(OS_filesys_table[0])); + OS_filesys_table[0].fstype = OS_FILESYS_TYPE_NORMAL_DISK; + strcpy(OS_filesys_table[0].system_mountpt, "/ut"); + OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); @@ -154,6 +184,10 @@ void Test_OS_FileSysUnmountVolume_Impl(void) UT_SetDefaultReturnValue(UT_KEY(OCS_ioctl), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_ERROR); UT_ClearForceFail(UT_KEY(OCS_ioctl)); + + /* Additional cases for the FS_BASED handling (no op on unmount) */ + OS_filesys_table[0].fstype = OS_FILESYS_TYPE_FS_BASED; + OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_SUCCESS); } void Test_OS_FileSysStatVolume_Impl(void) From fcfba4841ed57d837d1bcfe929f4b936141b1fa2 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 28 Dec 2020 15:54:55 -0500 Subject: [PATCH 046/111] Fix #708, chmod error handling Better error translations in the OS_FileChmod_Impl() function. Also corrects a file handle leak. This makes it return OS_ERR_NOT_IMPLEMENTED when run on a file system that does not have permissions, which in turn causes the unit test to be skipped rather than fail. --- src/os/portable/os-impl-posix-files.c | 116 +++++++++++------- .../portable/src/coveragetest-posix-files.c | 5 + .../ut-stubs/inc/OCS_errno.h | 3 + .../ut-stubs/override_inc/errno.h | 3 + 4 files changed, 84 insertions(+), 43 deletions(-) diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index cb8d7df96..000a14cd2 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -203,6 +203,7 @@ int32 OS_FileChmod_Impl(const char *local_path, uint32 access) mode_t writebits; struct stat st; int fd; + int32 status; /* Open file to avoid filename race potential */ fd = open(local_path, O_RDONLY, 0); @@ -211,10 +212,16 @@ int32 OS_FileChmod_Impl(const char *local_path, uint32 access) fd = open(local_path, O_WRONLY, 0); if (fd < 0) { + OS_DEBUG("open(%s): %s (%d)\n", local_path, strerror(errno), errno); return OS_ERROR; - } + } } + /* + * NOTE: After this point, execution must proceed to the end of this routine + * so that the "fd" opened above can be properly closed. + */ + /* * In order to preserve any OTHER mode bits, * first stat() the file and then modify the st_mode @@ -226,58 +233,81 @@ int32 OS_FileChmod_Impl(const char *local_path, uint32 access) */ if (fstat(fd, &st) < 0) { - return OS_ERROR; + OS_DEBUG("fstat(%s): %s (%d)\n", local_path, strerror(errno), errno); + status = OS_ERROR; } - - /* always check world bits */ - readbits = S_IROTH; - writebits = S_IWOTH; - - if (OS_IMPL_SELF_EUID == st.st_uid) + else { - /* we own the file so use user bits */ - readbits |= S_IRUSR; - writebits |= S_IWUSR; - } + /* always check world bits */ + readbits = S_IROTH; + writebits = S_IWOTH; - if (OS_IMPL_SELF_EGID == st.st_gid) - { - /* our group owns the file so use group bits */ - readbits |= S_IRGRP; - writebits |= S_IWGRP; - } + if (OS_IMPL_SELF_EUID == st.st_uid) + { + /* we own the file so use user bits */ + readbits |= S_IRUSR; + writebits |= S_IWUSR; + } - if (access == OS_WRITE_ONLY || access == OS_READ_WRITE) - { - /* set all "write" mode bits */ - st.st_mode |= writebits; - } - else - { - /* clear all "write" mode bits */ - st.st_mode &= ~writebits; - } + if (OS_IMPL_SELF_EGID == st.st_gid) + { + /* our group owns the file so use group bits */ + readbits |= S_IRGRP; + writebits |= S_IWGRP; + } - if (access == OS_READ_ONLY || access == OS_READ_WRITE) - { - /* set all "read" mode bits */ - st.st_mode |= readbits; - } - else - { - /* clear all "read" mode bits */ - st.st_mode &= ~readbits; - } + if (access == OS_WRITE_ONLY || access == OS_READ_WRITE) + { + /* set all "write" mode bits */ + st.st_mode |= writebits; + } + else + { + /* clear all "write" mode bits */ + st.st_mode &= ~writebits; + } - /* finally, write the modified mode back to the file */ - if (fchmod(fd, st.st_mode) < 0) - { - return OS_ERROR; + if (access == OS_READ_ONLY || access == OS_READ_WRITE) + { + /* set all "read" mode bits */ + st.st_mode |= readbits; + } + else + { + /* clear all "read" mode bits */ + st.st_mode &= ~readbits; + } + + /* finally, write the modified mode back to the file */ + if (fchmod(fd, st.st_mode) < 0) + { + /* + * These particular errnos generally indicate that the + * underlying filesystem does not support chmod() + * + * This is often the case for FAT / DOSFS filesystems + * which do not have UNIX-style permissions, or (in the + * case of EROFS) if the filesystem is mounted read-only. + */ + if (errno == ENOTSUP || errno == ENOSYS || errno == EROFS) + { + status = OS_ERR_NOT_IMPLEMENTED; + } + else + { + OS_DEBUG("fchmod(%s): %s (%d)\n", local_path, strerror(errno), errno); + status = OS_ERROR; + } + } + else + { + status = OS_SUCCESS; + } } close(fd); - return OS_SUCCESS; + return status; } /* end OS_FileChmod_Impl */ diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index f6bb0788e..256e5bc53 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -35,6 +35,7 @@ #include #include #include +#include void Test_OS_FileOpen_Impl(void) { @@ -114,6 +115,10 @@ void Test_OS_FileChmod_Impl(void) /* failure mode 2 (fchmod) */ UT_SetDefaultReturnValue(UT_KEY(OCS_fchmod), -1); OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERROR); + + /* non implemented error, e.g. such as DOS Filesystem with no perms */ + OCS_errno = OCS_ENOTSUP; + OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERR_NOT_IMPLEMENTED); UT_ClearForceFail(UT_KEY(OCS_fchmod)); /* all permission bits with uid/gid match */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h index 8d7d89b93..2ec37da74 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h @@ -34,6 +34,9 @@ #define OCS_EMSGSIZE 0x1804 #define OCS_ETIMEDOUT 0x1805 #define OCS_ESPIPE 0x1806 +#define OCS_ENOTSUP 0x1807 +#define OCS_ENOSYS 0x1808 +#define OCS_EROFS 0x1809 /* ----------------------------------------- */ /* types normally defined in errno.h */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/errno.h b/src/unit-test-coverage/ut-stubs/override_inc/errno.h index 636ac2a34..26c4ef810 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/errno.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/errno.h @@ -33,6 +33,9 @@ #define EMSGSIZE OCS_EMSGSIZE #define ETIMEDOUT OCS_ETIMEDOUT #define ESPIPE OCS_ESPIPE +#define ENOTSUP OCS_ENOTSUP +#define ENOSYS OCS_ENOSYS +#define EROFS OCS_EROFS #define errno OCS_errno From b5863b717bcb958c967ccb6cbf39814500721b85 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Thu, 4 Jun 2020 15:00:51 -0400 Subject: [PATCH 047/111] Fix #471, order of operations for delete all When cleaning up for shutdown, delete resources that have a task/thread first, followed by other resource types. This helps avoid possible dependencies as running threads might be using the other resources. --- src/os/shared/src/osapi-common.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/os/shared/src/osapi-common.c b/src/os/shared/src/osapi-common.c index c3b7fb0b5..62a5a433b 100644 --- a/src/os/shared/src/osapi-common.c +++ b/src/os/shared/src/osapi-common.c @@ -337,7 +337,18 @@ void OS_DeleteAllObjects(void) { ObjectCount = 0; ++TryCount; + + /* Delete timers and tasks first, as they could be actively using other object types */ + OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TIMECB, OS_OBJECT_CREATOR_ANY, + OS_CleanUpObject, &ObjectCount); + OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TIMEBASE, OS_OBJECT_CREATOR_ANY, + OS_CleanUpObject, &ObjectCount); + OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TASK, OS_OBJECT_CREATOR_ANY, + OS_CleanUpObject, &ObjectCount); + + /* Then try to delete all other remaining objects of any type */ OS_ForEachObject(OS_OBJECT_CREATOR_ANY, OS_CleanUpObject, &ObjectCount); + if (ObjectCount == 0 || TryCount > 4) { break; From fbfb6d6a4a297a6bd57964f7329f6b2f67e79e70 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 29 Dec 2020 10:51:42 -0500 Subject: [PATCH 048/111] Fix #574, Document UtAssert_Message parameters --- ut_assert/inc/utassert.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ut_assert/inc/utassert.h b/ut_assert/inc/utassert.h index 87ebf9a14..25f778883 100644 --- a/ut_assert/inc/utassert.h +++ b/ut_assert/inc/utassert.h @@ -272,13 +272,20 @@ bool UtAssertEx(bool Expression, UtAssert_CaseType_t CaseType, const char *File, void UtAssert_Abort(const char *Message); /** - * Output an informational message to the console/log file + * \brief Output an informational message to the console/log file * * Just like the standard printf except it will output to the given status channel (see utassert.h) * * This calls into the UT BSP function to actually write the message * to the current output device. This may be the console or a log file * or something else depending on what BSP is in use. + * + * \param MessageType Message case type + * \param File File name containing the message + * \param Line Line number containing the message + * \param Spec printf style format followed by args of message + * + * \sa Helper macros: UtPrintf(), UtDebug() */ void UtAssert_Message(uint8 MessageType, const char *File, uint32 Line, const char *Spec, ...) OS_PRINTF(4, 5); @@ -292,7 +299,7 @@ void UtAssert_Message(uint8 MessageType, const char *File, uint32 Line, const ch * * \param File File containing the test case * \param LineNum Line number containing the test case - * \param MessageType Should be set to either UT_MESSAGE_PASS or UT_MESSAGE_FAILURE. + * \param MessageType Message case type * \param SubsysName The subsystem under test (abbreviated name) * \param ShortDesc Short description of the test case * \param SegmentNum Sequence among the overall/global test Segments From d81c5ab9d1333ad532e93665f8dbe4900834178f Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 29 Dec 2020 11:16:02 -0500 Subject: [PATCH 049/111] Fix #445, add pointer parameter checks Add OS_CHECK_POINTER macros to OS_ConvertToArrayIndex and OS_TimeBaseGetFreeRun. --- src/os/shared/src/osapi-idmap.c | 3 +++ src/os/shared/src/osapi-timebase.c | 2 ++ src/unit-test-coverage/shared/src/coveragetest-idmap.c | 4 ++++ src/unit-test-coverage/shared/src/coveragetest-timebase.c | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 27debe318..b2f39b3fa 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -1463,6 +1463,9 @@ int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t object_id, osal_i osal_objtype_t actual_type; int32 return_code; + /* Check Parameters */ + OS_CHECK_POINTER(ArrayIndex); + obj_index = OS_ObjectIdToSerialNumber_Impl(object_id); actual_type = OS_ObjectIdToType_Impl(object_id); diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index 8ed4537cc..affca25fb 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -347,6 +347,8 @@ int32 OS_TimeBaseGetFreeRun(osal_id_t timebase_id, uint32 *freerun_val) OS_timebase_internal_record_t *timebase; /* Check parameters */ + OS_CHECK_POINTER(freerun_val); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, timebase_id, &token); if (return_code == OS_SUCCESS) { diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index ea06f17c4..d40261fa5 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -323,6 +323,10 @@ void Test_OS_ObjectIdToArrayIndex(void) expected = OS_ERR_INVALID_ID; actual = OS_ObjectIdToArrayIndex(0xFFFF, UT_OBJID_OTHER, &local_idx); UtAssert_True(actual == expected, "OS_ObjectIdToArrayIndex() (%ld) == OS_ERR_INVALID_ID", (long)actual); + + expected = OS_INVALID_POINTER; + actual = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_TASK, objid, NULL); + UtAssert_True(actual == expected, "OS_ObjectIdToArrayIndex() (%ld) == OS_INVALID_POINTER", (long)actual); } void Test_OS_ObjectIdFindByName(void) diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index fc1675c5d..a1e142590 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -234,6 +234,10 @@ void Test_OS_TimeBaseGetFreeRun(void) int32 actual = OS_TimeBaseGetFreeRun(UT_OBJID_1, &freerun); UtAssert_True(actual == expected, "OS_TimeBaseGetFreeRun() (%ld) == OS_SUCCESS", (long)actual); + + expected = OS_INVALID_POINTER; + actual = OS_TimeBaseGetFreeRun(UT_OBJID_1, NULL); + UtAssert_True(actual == expected, "OS_TimeBaseGetFreeRun() (%ld) == OS_INVALID_POINTER", (long)actual); } void Test_OS_TimeBase_CallbackThread(void) From 84fa1ceb88977b5301a2639d98bd481defa03d05 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 29 Dec 2020 11:19:05 -0500 Subject: [PATCH 050/111] Fix #598, Correct UtAssert_ZERO description typo --- ut_assert/inc/utassert.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ut_assert/inc/utassert.h b/ut_assert/inc/utassert.h index 87ebf9a14..a98ef7ee9 100644 --- a/ut_assert/inc/utassert.h +++ b/ut_assert/inc/utassert.h @@ -206,7 +206,7 @@ typedef struct } while (0) /** - * \brief Confirm an integer value is nonzero + * \brief Confirm an integer value is zero */ #define UtAssert_ZERO(actual) \ do \ From b04c4ff80da4a09cbf091f73b7da2cb1e94c8f36 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 29 Dec 2020 11:10:38 -0500 Subject: [PATCH 051/111] Fix #573, add OS_FileSysStatVolume Add OS_FileSysStatVolume as replacement for OS_fsBytesFree and OS_fsBlocksFree. Update unit tests and stubs for the new API call. Does not (yet) deprecate the existing functions, as references still need to be updated elsewhere in apps. --- src/os/inc/osapi-filesys.h | 37 ++++++ src/os/shared/inc/os-shared-filesys.h | 16 --- src/os/shared/src/osapi-filesys.c | 31 +++++ src/tests/file-api-test/file-api-test.c | 40 +++--- .../shared/src/coveragetest-filesys.c | 52 ++++++++ .../osfilesys-test/ut_osfilesys_diskio_test.c | 117 ++++++++++++++++++ .../osfilesys-test/ut_osfilesys_diskio_test.h | 1 + .../osfilesys-test/ut_osfilesys_test.c | 1 + src/ut-stubs/osapi-utstub-filesys.c | 22 ++++ 9 files changed, 283 insertions(+), 34 deletions(-) diff --git a/src/os/inc/osapi-filesys.h b/src/os/inc/osapi-filesys.h index 8b3d6797c..176243189 100644 --- a/src/os/inc/osapi-filesys.h +++ b/src/os/inc/osapi-filesys.h @@ -41,6 +41,19 @@ typedef struct uint32 FreeVolumes; /**< @brief Total number of volumes free */ } os_fsinfo_t; +/* + * @brief The data type filled in by the OS_FileSysStatVolume() call. + * + * Encapsulates detail information about the size and available space + * in a mounted file system volume. + */ +typedef struct +{ + size_t block_size; /**< Block size of underlying FS */ + osal_blockcount_t total_blocks; /**< Total blocks in underlying FS */ + osal_blockcount_t blocks_free; /**< Available blocks in underlying FS */ +} OS_statvfs_t; + /* * Exported Functions */ @@ -201,6 +214,30 @@ int32 OS_fsBlocksFree(const char *name); */ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free); +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Obtains information about size and free space in a volume + * + * Populates the supplied OS_statvfs_t structure, which includes + * the block size and total/free blocks in a file system volume. + * + * This replaces two older OSAL calls: + * + * OS_fsBlocksFree() is determined by reading the blocks_free + * output struct member + * OS_fsBytesFree() is determined by multiplying blocks_free + * by the block_size member + * + * @param[in] name The device/path to operate on + * @param[out] statbuf Output structure to populate + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if name or statbuf is NULL + * @retval #OS_ERROR if the OS call failed + */ +int32 OS_FileSysStatVolume(const char *name, OS_statvfs_t *statbuf); + /*-------------------------------------------------------------------------------------*/ /** * @brief Checks the health of a file system and repairs it if necessary diff --git a/src/os/shared/inc/os-shared-filesys.h b/src/os/shared/inc/os-shared-filesys.h index e00058301..717699f1f 100644 --- a/src/os/shared/inc/os-shared-filesys.h +++ b/src/os/shared/inc/os-shared-filesys.h @@ -84,22 +84,6 @@ enum OS_FILESYS_TYPE_MAX }; -/* - * The data type filled in by the "statvfs" call. - * - * This is defined here since there is no public API to get this info, - * only the total bytes free is accessible via the current OSAL API. - * - * However, returning the detailed info at this level means that the - * more detailed information could be made available with a new API call. - */ -typedef struct -{ - size_t block_size; - osal_blockcount_t total_blocks; - osal_blockcount_t blocks_free; -} OS_statvfs_t; - typedef struct { char device_name[OS_FS_DEV_NAME_LEN]; /**< The name of the underlying block device, if applicable */ diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index bc8156307..71a98119e 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -601,6 +601,37 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) } /* end OS_fsBytesFree */ +/*---------------------------------------------------------------- + * + * Function: OS_FileSysStatVolume + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysStatVolume(const char *name, OS_statvfs_t *statbuf) +{ + int32 return_code; + OS_object_token_t token; + + /* Check parameters */ + OS_CHECK_PATHNAME(name); + OS_CHECK_POINTER(statbuf); + + return_code = OS_ObjectIdGetBySearch(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, OS_FileSys_FindVirtMountPoint, + (void *)name, &token); + + if (return_code == OS_SUCCESS) + { + return_code = OS_FileSysStatVolume_Impl(&token, statbuf); + + OS_ObjectIdRelease(&token); + } + + return return_code; + +} /* end OS_FileSysStatVolume */ + /*---------------------------------------------------------------- * * Function: OS_chkfs diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index 1fc6b84a5..2ff84524f 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -424,18 +424,19 @@ void TestReadWriteLseek(void) ---------------------------------------------------------------------------------------*/ void TestMkRmDirFreeBytes(void) { - int32 status; - char filename1[OS_MAX_PATH_LEN]; - char filename2[OS_MAX_PATH_LEN]; - char dir1[OS_MAX_PATH_LEN]; - char dir2[OS_MAX_PATH_LEN]; - char buffer1[OS_MAX_PATH_LEN]; - char buffer2[OS_MAX_PATH_LEN]; - char copybuffer1[OS_MAX_PATH_LEN]; - char copybuffer2[OS_MAX_PATH_LEN]; - osal_id_t fd1; - osal_id_t fd2; - size_t size; + int32 status; + char filename1[OS_MAX_PATH_LEN]; + char filename2[OS_MAX_PATH_LEN]; + char dir1[OS_MAX_PATH_LEN]; + char dir2[OS_MAX_PATH_LEN]; + char buffer1[OS_MAX_PATH_LEN]; + char buffer2[OS_MAX_PATH_LEN]; + char copybuffer1[OS_MAX_PATH_LEN]; + char copybuffer2[OS_MAX_PATH_LEN]; + osal_id_t fd1; + osal_id_t fd2; + size_t size; + OS_statvfs_t statbuf; /* make the directory names for testing, as well as the filenames and the buffers * to put in the files */ @@ -450,8 +451,9 @@ void TestMkRmDirFreeBytes(void) /* NOTE: The blocks free call is not necessarily implemented on all filesystems. * So the response of OS_ERR_NOT_IMPLEMENTED is acceptable. */ - status = OS_fsBlocksFree("/drive0"); - UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status >= OS_SUCCESS, "Checking Free Blocks: %d", (int)status); + status = OS_FileSysStatVolume("/drive0", &statbuf); + UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, "Checking Free Blocks: status=%d blocks=%lu", + (int)status, (unsigned long)statbuf.blocks_free); /* make the two directories */ status = OS_mkdir(dir1, 0); @@ -486,8 +488,9 @@ void TestMkRmDirFreeBytes(void) memset(buffer1, 0, sizeof(buffer1)); memset(buffer2, 0, sizeof(buffer2)); - status = OS_fsBlocksFree("/drive0"); - UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status >= OS_SUCCESS, "Checking Free Blocks: %d", (int)status); + status = OS_FileSysStatVolume("/drive0", &statbuf); + UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, "Checking Free Blocks: status=%d blocks=%lu", + (int)status, (unsigned long)statbuf.blocks_free); /* read back out of the files what we wrote into them */ size = strlen(copybuffer1); @@ -526,8 +529,9 @@ void TestMkRmDirFreeBytes(void) status = OS_rmdir(dir2); UtAssert_True(status == OS_SUCCESS, "status after rmdir 2 = %d", (int)status); - status = OS_fsBlocksFree("/drive0"); - UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status >= OS_SUCCESS, "Checking Free Blocks: %d", (int)status); + status = OS_FileSysStatVolume("/drive0", &statbuf); + UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, "Checking Free Blocks: status=%d blocks=%lu", + (int)status, (unsigned long)statbuf.blocks_free); } /*--------------------------------------------------------------------------------------- diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index eb744b0f3..d8cdf1b38 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -328,6 +328,57 @@ void Test_OS_fsBytesFree(void) UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); } +void Test_OS_FileSysStatVolume(void) +{ + /* + * Test Case For: + * int32 OS_FileSysStatVolume(const char *name, OS_statvfs_t *statbuf) + */ + + OS_statvfs_t statbuf; + OS_statvfs_t statref; + int32 expected; + int32 actual; + + statref.block_size = OSAL_SIZE_C(1024); + statref.blocks_free = OSAL_BLOCKCOUNT_C(1111); + statref.total_blocks = OSAL_BLOCKCOUNT_C(2222); + UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statref, sizeof(statref), false); + OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | + OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + + expected = OS_SUCCESS; + actual = OS_FileSysStatVolume("/cf", &statbuf); + UtAssert_True(actual == expected, "OS_FileSysStatVolume() (%ld) == OS_SUCCESS", (long)actual); + + UtAssert_True(statbuf.block_size == statref.block_size, "blocks_size (%lu) == %lu", (unsigned long)statbuf.block_size, + (unsigned long)statref.block_size); + UtAssert_True(statbuf.total_blocks == statref.total_blocks, "total_blocks (%lu) == %lu", + (unsigned long)statbuf.total_blocks, (unsigned long)statref.total_blocks); + UtAssert_True(statbuf.blocks_free == statref.blocks_free, "blocks_free (%lu) == %lu", (unsigned long)statbuf.blocks_free, + (unsigned long)statref.blocks_free); + + /* validate error checking */ + expected = OS_INVALID_POINTER; + actual = OS_FileSysStatVolume(NULL, &statbuf); + UtAssert_True(actual == expected, "OS_FileSysStatVolume() (%ld) == OS_INVALID_POINTER", (long)actual); + actual = OS_FileSysStatVolume("/cf", NULL); + UtAssert_True(actual == expected, "OS_FileSysStatVolume() (%ld) == OS_INVALID_POINTER", (long)actual); + + /* Test Fail due to no matching VolTab entry */ + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); + expected = OS_ERR_NAME_NOT_FOUND; + actual = OS_FileSysStatVolume("/cf", &statbuf); + UtAssert_True(actual == expected, "OS_FileSysStatVolume() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); + UT_ResetState(UT_KEY(OS_ObjectIdGetBySearch)); + + /* Verify pass through of impl error */ + UT_SetDefaultReturnValue(UT_KEY(OS_FileSysStatVolume_Impl), OS_ERR_OPERATION_NOT_SUPPORTED); + expected = OS_ERR_OPERATION_NOT_SUPPORTED; + actual = OS_FileSysStatVolume("/cf", &statbuf); + UtAssert_True(actual == expected, "OS_FileSysStatVolume() (%ld) == OS_ERR_OPERATION_NOT_SUPPORTED", (long)actual); +} + void Test_OS_chkfs(void) { /* @@ -577,4 +628,5 @@ void UtTest_Setup(void) ADD_TEST(OS_GetFsInfo); ADD_TEST(OS_TranslatePath); ADD_TEST(OS_FileSys_FindVirtMountPoint); + ADD_TEST(OS_FileSysStatVolume); } diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c index ebbc668b8..410e1efbf 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c @@ -1271,6 +1271,123 @@ void UT_os_fsbytesfree_test() return; } +/*--------------------------------------------------------------------------------* +** Syntax: int32 OS_fsstatvolume(const char *name) +** Purpose: Returns the number of blocks free in a the file system +** Parameters: *name - a pointer to the name of the drive to check for free blocks +** Returns: OS_INVALID_POINTER if the pointer passed in is NULL +** OS_FS_ERR_PATH_TOO_LONG if the path passed in is too long +** OS_ERROR if the OS call failed +** Number of blocks free in a volume if succeeded +** OS_ERR_NOT_IMPLEMENTED if not implemented +** ----------------------------------------------------- +** Test #0: Not-implemented condition +** 1) Call this routine +** 2) If the returned value is OS_ERR_NOT_IMPLEMENTED, then exit test +** 3) Otherwise, continue. +** ----------------------------------------------------- +** Test #1: Null-pointer-arg condition +** 1) Call this routine with a null pointer as one of the arguments +** 2) Expect the returned value to be +** (a) OS_INVALID_POINTER +** ----------------------------------------------------- +** Test #2: Path-too-long-arg condition +** 1) Call this routine with a path name of length greater than Volume table's +** name as argument +** 2) Expect the returned value to be +** (a) OS_FS_ERR_PATH_TOO_LONG +** ----------------------------------------------------- +** Test #3: OS-call-failure condition +** 1) Setup the test to cause the OS call to fail inside this routine +** 2) Call this routine +** 3) Expect the returned value to be +** (a) OS_ERROR +** ----------------------------------------------------- +** Test#4: Nominal condition +** 1) Make sure no file system has been previously created +** 2) Call OS_mkfs +** 3) Expect the returned value to be +** (a) OS_SUCCESS +** 4) Call OS_mount with device name used in #2 +** 5) Expect the returned value to be +** (a) OS_SUCCESS +** 6) Call this routine with mount-point used in #4 +** 7) Expect the returned value to be +** (a) greater than or equal to 0 +** --------------------------------------------------------------------------------*/ +void UT_os_fsstatvolume_test(void) +{ + const char * testDesc; + OS_statvfs_t statbuf; + + /*-----------------------------------------------------*/ + testDesc = "API not implemented"; + + if (OS_FileSysStatVolume("/cf", &statbuf) == OS_ERR_NOT_IMPLEMENTED) + { + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); + goto UT_os_fsstatvolume_test_exit_tag; + } + + /*-----------------------------------------------------*/ + testDesc = "#1a Null-pointer-arg"; + + if (OS_FileSysStatVolume(NULL, &statbuf) == OS_INVALID_POINTER) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /*-----------------------------------------------------*/ + testDesc = "#1b Null-pointer-arg"; + + if (OS_FileSysStatVolume("/cf", NULL) == OS_INVALID_POINTER) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /*-----------------------------------------------------*/ + testDesc = "#2 Path-too-long-arg"; + + if (OS_FileSysStatVolume(g_fsLongName, &statbuf) == OS_FS_ERR_PATH_TOO_LONG) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /*-----------------------------------------------------*/ + testDesc = "#3 OS-call-failure"; + + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_INFO); + + /*-----------------------------------------------------*/ + testDesc = "#4 Nominal"; + + if (OS_mkfs(g_fsAddrPtr, g_devNames[4], g_volNames[4], g_blkSize, g_blkCnt) != OS_SUCCESS) + { + testDesc = "#4 Nominal - File-system-create failed"; + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_TSF); + goto UT_os_fsstatvolume_test_exit_tag; + } + + if (OS_mount(g_devNames[4], g_mntNames[4]) != OS_SUCCESS) + { + testDesc = "#4 Nominal - File-system-mount failed"; + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_TSF); + goto UT_os_fsstatvolume_test_exit_tag; + } + + if (OS_FileSysStatVolume(g_mntNames[4], &statbuf) >= 0) + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); + else + UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); + + /* Reset test environment */ + OS_unmount(g_mntNames[4]); + OS_rmfs(g_devNames[4]); + +UT_os_fsstatvolume_test_exit_tag: + return; +} + /*================================================================================* ** End of File: ut_osfilesys_diskio_test.c **================================================================================*/ diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h index c6ab2dd2a..f1420c68c 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h @@ -71,6 +71,7 @@ void UT_os_checkfs_test(void); void UT_os_fsblocksfree_test(void); void UT_os_fsbytesfree_test(void); +void UT_os_fsstatvolume_test(void); /*--------------------------------------------------------------------------------*/ diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c index 16a147d97..3850eff52 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c @@ -137,6 +137,7 @@ void UtTest_Setup(void) UtTest_Add(UT_os_checkfs_test, NULL, NULL, "OS_chkfs"); UtTest_Add(UT_os_fsblocksfree_test, NULL, NULL, "OS_fsBlocksFree"); UtTest_Add(UT_os_fsbytesfree_test, NULL, NULL, "OS_fsBytesFree"); + UtTest_Add(UT_os_fsstatvolume_test, NULL, NULL, "OS_FileSysStatVolume"); } /*================================================================================* diff --git a/src/ut-stubs/osapi-utstub-filesys.c b/src/ut-stubs/osapi-utstub-filesys.c index 02188510c..b696751e5 100644 --- a/src/ut-stubs/osapi-utstub-filesys.c +++ b/src/ut-stubs/osapi-utstub-filesys.c @@ -192,6 +192,28 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) return status; } +/***************************************************************************** + * + * Stub function for OS_FileSysStatVolume() + * + *****************************************************************************/ +int32 OS_FileSysStatVolume(const char *name, OS_statvfs_t *statbuf) +{ + UT_Stub_RegisterContext(UT_KEY(OS_FileSysStatVolume), name); + UT_Stub_RegisterContext(UT_KEY(OS_FileSysStatVolume), statbuf); + + int32 status; + + status = UT_DEFAULT_IMPL(OS_FileSysStatVolume); + + if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_FileSysStatVolume), statbuf, sizeof(*statbuf)) < sizeof(*statbuf)) + { + memset(statbuf, 0, sizeof(*statbuf)); + } + + return status; +} + /***************************************************************************** * * Stub function for OS_chkfs() From 847a6d2306650614c7e9d910a521a0d8a29b07b9 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Tue, 29 Dec 2020 11:25:35 -0500 Subject: [PATCH 052/111] Fix #544, add pointer check Add parameter check to OS_SocketSendTo and adjust coverage test to validate. --- src/os/shared/src/osapi-sockets.c | 1 + .../shared/src/coveragetest-sockets.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 1aad07df0..1972a65cc 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -437,6 +437,7 @@ int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, cons /* Check Parameters */ OS_CHECK_POINTER(buffer); OS_CHECK_SIZE(buflen); + OS_CHECK_POINTER(RemoteAddr); return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, sock_id, &token); if (return_code == OS_SUCCESS) diff --git a/src/unit-test-coverage/shared/src/coveragetest-sockets.c b/src/unit-test-coverage/shared/src/coveragetest-sockets.c index 938032578..3e807bbe9 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-sockets.c +++ b/src/unit-test-coverage/shared/src/coveragetest-sockets.c @@ -335,9 +335,17 @@ void Test_OS_SocketSendTo(void) UtAssert_True(actual == expected, "OS_SocketSendTo() (%ld) == OS_SUCCESS", (long)actual); expected = OS_INVALID_POINTER; - actual = OS_SocketSendTo(UT_OBJID_1, NULL, OSAL_SIZE_C(0), NULL); + actual = OS_SocketSendTo(UT_OBJID_1, NULL, sizeof(Buf), &Addr); UtAssert_True(actual == expected, "OS_SocketSendTo(NULL) (%ld) == OS_INVALID_POINTER", (long)actual); + expected = OS_INVALID_POINTER; + actual = OS_SocketSendTo(UT_OBJID_1, &Buf, sizeof(Buf), NULL); + UtAssert_True(actual == expected, "OS_SocketSendTo(NULL) (%ld) == OS_INVALID_POINTER", (long)actual); + + expected = OS_ERR_INVALID_SIZE; + actual = OS_SocketSendTo(UT_OBJID_1, &Buf, OSAL_SIZE_C(0), &Addr); + UtAssert_True(actual == expected, "OS_SocketSendTo(0) (%ld) == OS_ERR_INVALID_SIZE", (long)actual); + /* * Should fail if not a datagram socket */ From b82270fd7c4b36b5323e143e1dfcc4b97fb7fc8b Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 29 Dec 2020 14:46:04 -0500 Subject: [PATCH 053/111] Fix #606, Resolve cast-align error in VxWorks OS_TaskGetId_Impl --- src/os/vxworks/src/os-impl-tasks.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index ecb50db59..bc1e98ef5 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -400,16 +400,16 @@ int32 OS_TaskRegister_Impl(osal_id_t global_task_id) *-----------------------------------------------------------------*/ osal_id_t OS_TaskGetId_Impl(void) { - OS_impl_task_internal_record_t *lrec; - size_t idx; - osal_id_t id; + void *lrec; + size_t idx; + osal_id_t id; id = OS_OBJECT_ID_UNDEFINED; - lrec = (OS_impl_task_internal_record_t *)taskTcb(taskIdSelf()); + lrec = taskTcb(taskIdSelf()); if (lrec != NULL) { - idx = lrec - &OS_impl_task_table[0]; + idx = (OS_impl_task_internal_record_t *)lrec - &OS_impl_task_table[0]; if (idx < OS_MAX_TASKS) { id = OS_global_task_table[idx].active_id; From ccbaca09ee40e9c34e24b91e03ddb01fab337f2e Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Wed, 30 Dec 2020 17:59:38 -0500 Subject: [PATCH 054/111] Fix #429, update OSAL code to use time accessors Do not access members of OS_time_t directly, instead use conversion/accessor inline functions to get the desired value. Update the "stat" structure output by OS_stat to use the OS_time_t struct instead of int32, and update the OS_stat implemention to transfer the full resolution if it supports it (POSIX.1-2008 or newer). --- src/os/inc/osapi-clock.h | 291 +++++++++++++++++- src/os/inc/osapi-file.h | 11 +- src/os/portable/os-impl-posix-files.c | 38 ++- src/os/portable/os-impl-posix-gettime.c | 9 +- src/os/shared/src/osapi-clock.c | 2 +- .../timer-add-api-test/timer-add-api-test.c | 12 +- src/tests/timer-test/timer-test.c | 10 +- .../portable/src/coveragetest-posix-files.c | 8 +- .../portable/src/coveragetest-posix-gettime.c | 10 +- .../ut-stubs/inc/OCS_stat.h | 12 +- .../oscore-test/ut_oscore_misc_test.c | 18 +- src/unit-tests/ostimer-test/ut_ostimer_test.c | 4 +- src/ut-stubs/osapi-utstub-clock.c | 7 +- 13 files changed, 365 insertions(+), 67 deletions(-) diff --git a/src/os/inc/osapi-clock.h b/src/os/inc/osapi-clock.h index f664d3582..2f5464f9b 100644 --- a/src/os/inc/osapi-clock.h +++ b/src/os/inc/osapi-clock.h @@ -28,14 +28,26 @@ #include "osconfig.h" #include "common_types.h" -/** @brief OSAL time */ +/** + * @brief OSAL time interval structure + * + * This is used to represent a basic time interval. + * + * When used with OS_GetLocalTime/OS_SetLocalTime, this represents the + * interval from the OS's epoch point, typically 01 Jan 1970 00:00:00 UTC + * on systems that have a persistent real time clock (RTC), or the system + * boot time if there is no RTC available. + * + * Applications should not directly access fields within this structure, + * as the definition may change in future versions of OSAL. Instead, + * applications should use the accessor/conversion methods defined below. + */ typedef struct { uint32 seconds; uint32 microsecs; } OS_time_t; - /** @defgroup OSAPIClock OSAL Real Time Clock APIs * @{ */ @@ -66,7 +78,280 @@ int32 OS_GetLocalTime(OS_time_t *time_struct); * * @return Set local time status, see @ref OSReturnCodes */ -int32 OS_SetLocalTime(OS_time_t *time_struct); +int32 OS_SetLocalTime(const OS_time_t *time_struct); + + +/*-------------------------------------------------------------------------------------*/ +/* + * Accessor / Unit Conversion routines for OS_time_t + * + * These routines allow the user to simply interpret OS_time_t intervals into + * in normalized units of whole seconds, milliseconds, microseconds, or nanoseconds. + */ +/*-------------------------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get interval from an OS_time_t object normalized to whole number of seconds + * + * Extracts the number of whole seconds from a given OS_time_t object, discarding + * any fractional component. + * + * This may also replace a direct read of the "seconds" field from + * the OS_time_t object from previous versions of OSAL, where the + * structure was defined with separate seconds/microseconds fields. + * + * @sa OS_TimeGetMicrosecondsPart() + * + * @param[in] tm Time interval value + * @returns Whole number of seconds in time interval + */ +static inline int64 OS_TimeGetTotalSeconds(OS_time_t tm) +{ + return (tm.seconds); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get interval from an OS_time_t object normalized to millisecond units + * + * Note this refers to the complete interval, not just the fractional part. + * + * @param[in] tm Time interval value + * @returns Whole number of milliseconds in time interval + */ +static inline int64 OS_TimeGetTotalMilliseconds(OS_time_t tm) +{ + return (((int64)tm.seconds * 1000) + (tm.microsecs / 1000)); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get interval from an OS_time_t object normalized to microsecond units + * + * Note this refers to the complete interval, not just the fractional part. + * + * @param[in] tm Time interval value + * @returns Whole number of microseconds in time interval + */ +static inline int64 OS_TimeGetTotalMicroseconds(OS_time_t tm) +{ + return (((int64)tm.seconds * 1000000) + tm.microsecs); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get interval from an OS_time_t object normalized to nanosecond units + * + * Note this refers to the complete interval, not just the fractional part. + * + * @note There is no protection against overflow of the 64-bit return value. + * Applications must use caution to ensure that the interval does not exceed the + * representable range of a signed 64 bit integer - approximately 140 years. + * + * @param[in] tm Time interval value + * @returns Whole number of microseconds in time interval + */ +static inline int64 OS_TimeGetTotalNanoseconds(OS_time_t tm) +{ + return (((int64)tm.seconds * 1000000000) + (tm.microsecs * 1000)); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get subseconds portion (fractional part only) from an OS_time_t object + * + * Extracts the fractional part from a given OS_time_t object. + * Units returned are in ticks, not normalized to any standard time unit. + * + * @param[in] tm Time interval value + * @returns Fractional/subsecond portion of time interval in ticks + */ +static inline int64 OS_TimeGetFractionalPart(OS_time_t tm) +{ + return (tm.microsecs); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get 32-bit normalized subseconds (fractional part only) from an OS_time_t object + * + * Extracts the fractional part from a given OS_time_t object in maximum precision, + * with units of 2^(-32) sec. This is a base-2 fixed-point fractional value + * with the point left-justified in the 32-bit value (i.e. left of MSB). + * + * This is (mostly) compatible with the CFE "subseconds" value, where 0x80000000 represents + * exactly one half second, and 0 represents a full second. + * + * @param[in] tm Time interval value + * @returns Fractional/subsecond portion of time interval as 32-bit fixed point value + */ +static inline uint32 OS_TimeGetSubsecondsPart(OS_time_t tm) +{ + /* + * This computation avoids a 32-bit left shift which may not be implemented. + * + * It also must round up, otherwise this may result in a value one + * less than the original when converted back to usec again. + */ + return (((OS_TimeGetFractionalPart(tm) << 26) + 15624) / 15625); +} + + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get milliseconds portion (fractional part only) from an OS_time_t object + * + * Extracts the fractional part from a given OS_time_t object normalized + * to units of milliseconds. + * + * @sa OS_TimeGetTotalSeconds() + * + * @param[in] tm Time interval value + * @returns Number of milliseconds in time interval + */ +static inline uint32 OS_TimeGetMillisecondsPart(OS_time_t tm) +{ + return OS_TimeGetFractionalPart(tm) / 1000; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get microseconds portion (fractional part only) from an OS_time_t object + * + * Extracts the fractional part from a given OS_time_t object normalized + * to units of microseconds. + * + * This function may be used to adapt applications initially implemented + * using an older OSAL version where OS_time_t was a structure containing + * a "seconds" and "microsecs" field. + * + * This function will obtain a value that is compatible with the "microsecs" field of + * OS_time_t as it was defined in previous versions of OSAL, as well as the "tv_usec" + * field of POSIX-style "struct timeval" values. + * + * @sa OS_TimeGetTotalSeconds() + * + * @param[in] tm Time interval value + * @returns Number of microseconds in time interval + */ +static inline uint32 OS_TimeGetMicrosecondsPart(OS_time_t tm) +{ + return OS_TimeGetFractionalPart(tm); +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get nanoseconds portion (fractional part only) from an OS_time_t object + * + * Extracts the only number of nanoseconds from a given OS_time_t object. + * + * This function will obtain a value that is compatible with the "tv_nsec" field + * of POSIX-style "struct timespec" values. + * + * @sa OS_TimeGetTotalSeconds() + * + * @param[in] tm Time interval value + * @returns Number of nanoseconds in time interval + */ +static inline uint32 OS_TimeGetNanosecondsPart(OS_time_t tm) +{ + return OS_TimeGetFractionalPart(tm) * 1000; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Assemble/Convert a number of seconds + nanoseconds into an OS_time_t interval + * + * This creates an OS_time_t value using a whole number of seconds and a fractional + * part in units of nanoseconds. This is the inverse of OS_TimeGetTotalSeconds() + * and OS_TimeGetNanosecondsPart(), and should recreate the original OS_time_t + * value from these separate values (aside from any potential conversion losses + * due to limited resolution of the data types/units). + * + * @sa OS_TimeGetTotalSeconds(), OS_TimeGetNanosecondsPart() + * + * @param[in] seconds Whole number of seconds + * @param[in] nanoseconds Number of nanoseconds (fractional part only) + * @returns The input arguments represented as an OS_time_t interval + */ +static inline OS_time_t OS_TimeAssembleFromNanoseconds(int64 seconds, uint32 nanoseconds) +{ + OS_time_t result; + result.seconds = seconds; + result.microsecs = nanoseconds / 1000; + return result; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Assemble/Convert a number of seconds + subseconds into an OS_time_t interval + * + * This creates an OS_time_t value using a whole number of seconds and a fractional + * part in units of sub-seconds (1/2^32). This is the inverse of OS_TimeGetTotalSeconds() + * and OS_TimeGetSubsecondsPart(), and should recreate the original OS_time_t + * value from these separate values (aside from any potential conversion losses + * due to limited resolution of the data types/units). + * + * @sa OS_TimeGetTotalSeconds(), OS_TimeGetNanosecondsPart() + * @param[in] seconds Whole number of seconds + * @param[in] subseconds Number of subseconds (32 bit fixed point fractional part) + * @returns The input arguments represented as an OS_time_t interval + */ +static inline OS_time_t OS_TimeAssembleFromSubseconds(int64 seconds, uint32 subseconds) +{ + OS_time_t result; + result.seconds = seconds; + /* this should not round in any way, as the 32-bit input value has higher precision */ + result.microsecs = ((int64)subseconds * 15625) >> 26; + return result; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Computes the sum of two time intervals + * + * @param[in] time1 The first interval + * @param[in] time2 The second interval + * + * @return The sum of the two intervals (time1 + time2) + */ +static inline OS_time_t OS_TimeAdd(OS_time_t time1, OS_time_t time2) +{ + OS_time_t result = time1; + result.seconds += time2.seconds; + result.microsecs += time2.microsecs; + if (result.microsecs >= 1000000) + { + ++result.seconds; + result.microsecs -= 1000000; + } + return result; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Computes the difference between two time intervals + * + * @param[in] time1 The first interval + * @param[in] time2 The second interval + * + * @return The difference of the two intervals (time1 - time2) + */ +static inline OS_time_t OS_TimeSubtract(OS_time_t time1, OS_time_t time2) +{ + OS_time_t result = time1; + result.seconds -= time2.seconds; + result.microsecs -= time2.microsecs; + if (result.microsecs >= 1000000) + { + --result.seconds; + result.microsecs += 1000000; + } + return result; +} + + /**@}*/ #endif diff --git a/src/os/inc/osapi-file.h b/src/os/inc/osapi-file.h index fea9f7519..011da6872 100644 --- a/src/os/inc/osapi-file.h +++ b/src/os/inc/osapi-file.h @@ -27,6 +27,7 @@ #include "osconfig.h" #include "common_types.h" +#include "osapi-clock.h" /** @defgroup OSFileAccess OSAL File Access Option Defines @@ -63,9 +64,9 @@ typedef struct */ typedef struct { - uint32 FileModeBits; - int32 FileTime; - size_t FileSize; + uint32 FileModeBits; + OS_time_t FileTime; + size_t FileSize; } os_fstat_t; /** @@ -96,8 +97,8 @@ enum #define OS_FILESTAT_READ(x) ((x).FileModeBits & OS_FILESTAT_MODE_READ) /** @brief Access file stat size field */ #define OS_FILESTAT_SIZE(x) ((x).FileSize) -/** @brief Access file stat time field */ -#define OS_FILESTAT_TIME(x) ((x).FileTime) +/** @brief Access file stat time field as a whole number of seconds */ +#define OS_FILESTAT_TIME(x) (OS_TimeGetTotalSeconds((x).FileTime)) /** * @brief Flags that can be used with opening of a file (bitmask) diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index cb8d7df96..925f32d60 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "os-impl-files.h" #include "os-shared-file.h" @@ -133,10 +134,11 @@ int32 OS_FileOpen_Impl(const OS_object_token_t *token, const char *local_path, i *-----------------------------------------------------------------*/ int32 OS_FileStat_Impl(const char *local_path, os_fstat_t *FileStats) { - struct stat st; - mode_t readbits; - mode_t writebits; - mode_t execbits; + struct stat st; + mode_t readbits; + mode_t writebits; + mode_t execbits; + struct timespec filetime; if (stat(local_path, &st) < 0) { @@ -144,7 +146,31 @@ int32 OS_FileStat_Impl(const char *local_path, os_fstat_t *FileStats) } FileStats->FileSize = st.st_size; - FileStats->FileTime = st.st_mtime; + + /* + * NOTE: Traditional timestamps are only a whole number of seconds (time_t) + * POSIX.1-2008 expands this to have a full "struct timespec" with nanosecond + * resolution. + * + * GLIBC (and likely other C libraries that use similar feature selection) + * will expose this value based on _POSIX_C_SOURCE or _XOPEN_SOURCE minimum + * values. Otherwise this just falls back to standard 1-second resolution + * available via the "st_mtime" member. + */ +#if (_POSIX_C_SOURCE >= 200809L) || (_XOPEN_SOURCE >= 700) + /* + * Better - use the full resolution (seconds + nanoseconds) as specified in POSIX.1-2008 + */ + filetime = st.st_mtim; +#else + /* + * Fallback - every POSIX-compliant implementation must expose "st_mtime" field. + */ + filetime.tv_sec = st.st_mtime; + filetime.tv_nsec = 0; +#endif + + FileStats->FileTime = OS_TimeAssembleFromNanoseconds(filetime.tv_sec, filetime.tv_nsec); /* note that the "fst_mode" member is already zeroed by the caller */ if (S_ISDIR(st.st_mode)) @@ -212,7 +238,7 @@ int32 OS_FileChmod_Impl(const char *local_path, uint32 access) if (fd < 0) { return OS_ERROR; - } + } } /* diff --git a/src/os/portable/os-impl-posix-gettime.c b/src/os/portable/os-impl-posix-gettime.c index 59175d0a0..ddf59232f 100644 --- a/src/os/portable/os-impl-posix-gettime.c +++ b/src/os/portable/os-impl-posix-gettime.c @@ -73,9 +73,8 @@ int32 OS_GetLocalTime_Impl(OS_time_t *time_struct) if (Status == 0) { - time_struct->seconds = time.tv_sec; - time_struct->microsecs = time.tv_nsec / 1000; - ReturnCode = OS_SUCCESS; + *time_struct = OS_TimeAssembleFromNanoseconds(time.tv_sec, time.tv_nsec); + ReturnCode = OS_SUCCESS; } else { @@ -100,8 +99,8 @@ int32 OS_SetLocalTime_Impl(const OS_time_t *time_struct) int32 ReturnCode; struct timespec time; - time.tv_sec = time_struct->seconds; - time.tv_nsec = (time_struct->microsecs * 1000); + time.tv_sec = OS_TimeGetTotalSeconds(*time_struct); + time.tv_nsec = OS_TimeGetNanosecondsPart(*time_struct); Status = clock_settime(OSAL_GETTIME_SOURCE_CLOCK, &time); diff --git a/src/os/shared/src/osapi-clock.c b/src/os/shared/src/osapi-clock.c index 09dbf110d..1aec8bfc8 100644 --- a/src/os/shared/src/osapi-clock.c +++ b/src/os/shared/src/osapi-clock.c @@ -65,7 +65,7 @@ int32 OS_GetLocalTime(OS_time_t *time_struct) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_SetLocalTime(OS_time_t *time_struct) +int32 OS_SetLocalTime(const OS_time_t *time_struct) { /* Check inputs */ OS_CHECK_POINTER(time_struct); diff --git a/src/tests/timer-add-api-test/timer-add-api-test.c b/src/tests/timer-add-api-test/timer-add-api-test.c index 2ec048fd4..5ff9541b4 100644 --- a/src/tests/timer-add-api-test/timer-add-api-test.c +++ b/src/tests/timer-add-api-test/timer-add-api-test.c @@ -130,7 +130,7 @@ void TestTimerAddApi(void) OS_GetLocalTime(&EndTime); - for (i = NUMBER_OF_TIMERS-1; i >= 0; --i) + for (i = NUMBER_OF_TIMERS - 1; i >= 0; --i) { TimerStatus[i] = OS_TimerDelete(TimerID[i]); } @@ -144,15 +144,7 @@ void TestTimerAddApi(void) /* * Time limited test */ - microsecs = 1000000 * (EndTime.seconds - StartTime.seconds); - if (EndTime.microsecs < StartTime.microsecs) - { - microsecs -= StartTime.microsecs - EndTime.microsecs; - } - else - { - microsecs += EndTime.microsecs - StartTime.microsecs; - } + microsecs = OS_TimeGetTotalMicroseconds(OS_TimeSubtract(EndTime, StartTime)); /* Make sure the ratio of the timers are OK */ for (i = 0; i < NUMBER_OF_TIMERS; i++) diff --git a/src/tests/timer-test/timer-test.c b/src/tests/timer-test/timer-test.c index 4d86367d1..79ed1a43c 100644 --- a/src/tests/timer-test/timer-test.c +++ b/src/tests/timer-test/timer-test.c @@ -189,15 +189,7 @@ void TimerTestCheck(void) /* * Time limited test - check and exit */ - microsecs = 1000000 * (EndTime.seconds - StartTime.seconds); - if (EndTime.microsecs < StartTime.microsecs) - { - microsecs -= StartTime.microsecs - EndTime.microsecs; - } - else - { - microsecs += EndTime.microsecs - StartTime.microsecs; - } + microsecs = OS_TimeGetTotalMicroseconds(OS_TimeSubtract(EndTime, StartTime)); /* Make sure the ratio of the timers are OK */ for (i = 0; i < NUMBER_OF_TIMERS && i < OS_MAX_TIMERS; i++) diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index f6bb0788e..5264bf96b 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -81,6 +81,9 @@ void Test_OS_FileStat_Impl(void) RefStat.st_mode = ~((OCS_mode_t)0); RefStat.st_size = 1234; RefStat.st_mtime = 5678; + /* Also set the full resolution timespec */ + RefStat.st_mtim.tv_sec = 5678; + RefStat.st_mtim.tv_nsec = 3456; UT_SetDataBuffer(UT_KEY(OCS_stat), &RefStat, sizeof(RefStat), false); OSAPI_TEST_FUNCTION_RC(OS_FileStat_Impl, ("local", &FileStats), OS_SUCCESS); @@ -90,7 +93,7 @@ void Test_OS_FileStat_Impl(void) UtAssert_True(OS_FILESTAT_READ(FileStats), "File Read Bit set"); UtAssert_True(OS_FILESTAT_ISDIR(FileStats), "Directory Bit set"); UtAssert_True(OS_FILESTAT_SIZE(FileStats) == 1234, "Size match"); - UtAssert_True(OS_FILESTAT_TIME(FileStats) == 5678, "Time match"); + UtAssert_True(OS_FILESTAT_TIME(FileStats) == 5678, "Time match (seconds)"); } void Test_OS_FileChmod_Impl(void) @@ -122,6 +125,9 @@ void Test_OS_FileChmod_Impl(void) RefStat.st_mode = ~((OCS_mode_t)0); RefStat.st_size = 1234; RefStat.st_mtime = 5678; + /* Also set the full resolution timespec */ + RefStat.st_mtim.tv_sec = 5678; + RefStat.st_mtim.tv_nsec = 3456; UT_SetDataBuffer(UT_KEY(OCS_fstat), &RefStat, sizeof(RefStat), false); /* nominal 1 - full permissions with file owned by own uid/gid */ diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c b/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c index 8dc31a951..e69cb830a 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-gettime.c @@ -35,9 +35,8 @@ void Test_OS_GetLocalTime_Impl(void) * Test Case For: * int32 OS_GetLocalTime_Impl(OS_time_t *time_struct) */ - OS_time_t timeval; - timeval.seconds = 1; - timeval.microsecs = 1; + OS_time_t timeval = {0}; + OSAPI_TEST_FUNCTION_RC(OS_GetLocalTime_Impl, (&timeval), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_clock_gettime), -1); @@ -50,9 +49,8 @@ void Test_OS_SetLocalTime_Impl(void) * Test Case For: * int32 OS_SetLocalTime_Impl(const OS_time_t *time_struct) */ - OS_time_t timeval; - timeval.seconds = 1; - timeval.microsecs = 1; + OS_time_t timeval = {0}; + OSAPI_TEST_FUNCTION_RC(OS_SetLocalTime_Impl, (&timeval), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_clock_settime), -1); diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h index 841af324a..79c52ae17 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h @@ -24,6 +24,7 @@ #include #include +#include /* ----------------------------------------- */ /* constants normally defined in sys/stat.h */ @@ -39,11 +40,12 @@ struct OCS_stat { - OCS_mode_t st_mode; - OCS_off_t st_size; - OCS_time_t st_mtime; - OCS_uid_t st_uid; - OCS_gid_t st_gid; + OCS_mode_t st_mode; + OCS_off_t st_size; + OCS_time_t st_mtime; + struct OCS_timespec st_mtim; + OCS_uid_t st_uid; + OCS_gid_t st_gid; }; /* ----------------------------------------- */ diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.c b/src/unit-tests/oscore-test/ut_oscore_misc_test.c index f54ca186e..8b01a0d7a 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.c @@ -290,8 +290,8 @@ void UT_os_getlocaltime_test() for (i = 0; i < 5; i++) { UT_OS_LOG("OS_GetLocalTime() - #3 Nominal "); - UT_OS_LOG("[Expecting output after API call to increase over time: %ld.%ld]\n", (long)time_struct.seconds, - (long)time_struct.microsecs); + UT_OS_LOG("[Expecting output after API call to increase over time: %ld.%ld]\n", + (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); OS_TaskDelay(20); OS_GetLocalTime(&time_struct); @@ -379,23 +379,21 @@ void UT_os_setlocaltime_test() for (i = 0; i < 5; i++) { UT_OS_LOG("OS_SetLocalTime() - #3 Nominal "); - UT_OS_LOG("[Expecting output before API call to increase over time: %ld.%ld]\n", (long)time_struct.seconds, - (long)time_struct.microsecs); + UT_OS_LOG("[Expecting output before API call to increase over time: %ld.%ld]\n", + (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); OS_TaskDelay(20); OS_GetLocalTime(&time_struct); } } - memset(&time_struct, 0x00, sizeof(time_struct)); - time_struct.seconds = 20000; - time_struct.microsecs = 123; + time_struct = OS_TimeAssembleFromNanoseconds(20000, 123000); res = OS_SetLocalTime(&time_struct); if (res == OS_SUCCESS) { - UT_OS_LOG("OS_SetLocalTime() - #3 Nominal [New time set at %ld.%ld]\n", (long)time_struct.seconds, - (long)time_struct.microsecs); + UT_OS_LOG("OS_SetLocalTime() - #3 Nominal [New time set at %ld.%ld]\n", (long)OS_TimeGetTotalSeconds(time_struct), + (long)OS_TimeGetMicrosecondsPart(time_struct)); res = OS_GetLocalTime(&time_struct); if (res == OS_SUCCESS) @@ -404,7 +402,7 @@ void UT_os_setlocaltime_test() { UT_OS_LOG("OS_SetLocalTime() - #3 Nominal "); UT_OS_LOG("[Expecting output after API call to increase over time: %ld.%ld]\n", - (long)time_struct.seconds, (long)time_struct.microsecs); + (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); OS_TaskDelay(20); OS_GetLocalTime(&time_struct); diff --git a/src/unit-tests/ostimer-test/ut_ostimer_test.c b/src/unit-tests/ostimer-test/ut_ostimer_test.c index 6b6716f37..dcbe25d10 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_test.c +++ b/src/unit-tests/ostimer-test/ut_ostimer_test.c @@ -78,7 +78,7 @@ void UT_os_timercallback(osal_id_t timerId) static int32 loopCnt = 0, res = 0; static uint32 prevIntervalTime = 0; static uint32 currIntervalTime = 0; - static OS_time_t currTime = {0, 0}, endTime = {0, 0}; + static OS_time_t currTime = {0}, endTime = {0}; if (OS_ObjectIdEqual(timerId, g_timerId)) { @@ -94,7 +94,7 @@ void UT_os_timercallback(osal_id_t timerId) OS_GetLocalTime(&endTime); - currIntervalTime = 1000000 * (endTime.seconds - currTime.seconds) + endTime.microsecs - currTime.microsecs; + currIntervalTime = OS_TimeGetTotalMicroseconds(OS_TimeSubtract(endTime, currTime)); if (currIntervalTime >= prevIntervalTime) deltaTime = currIntervalTime - prevIntervalTime; diff --git a/src/ut-stubs/osapi-utstub-clock.c b/src/ut-stubs/osapi-utstub-clock.c index 37686f582..b13ce4798 100644 --- a/src/ut-stubs/osapi-utstub-clock.c +++ b/src/ut-stubs/osapi-utstub-clock.c @@ -52,9 +52,8 @@ int32 OS_GetLocalTime(OS_time_t *time_struct) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_GetLocalTime), time_struct, sizeof(*time_struct)) < sizeof(*time_struct)) { - count = UT_GetStubCount(UT_KEY(OS_GetLocalTime)); - time_struct->microsecs = 10000 * (count % 100); - time_struct->seconds = 1 + (count / 100); + count = UT_GetStubCount(UT_KEY(OS_GetLocalTime)); + *time_struct = OS_TimeAssembleFromNanoseconds(1 + (count / 100), 10000000 * (count % 100)); } return status; @@ -66,7 +65,7 @@ int32 OS_GetLocalTime(OS_time_t *time_struct) * Stub function for OS_SetLocalTime() * *****************************************************************************/ -int32 OS_SetLocalTime(OS_time_t *time_struct) +int32 OS_SetLocalTime(const OS_time_t *time_struct) { UT_Stub_RegisterContext(UT_KEY(OS_SetLocalTime), time_struct); From ae888d44f641fc5990691dcf60c0769395685978 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Tue, 29 Dec 2020 10:17:02 -0500 Subject: [PATCH 055/111] Fix #707 Resolve issues of auto tests in parallel build change sem flush to solve race condition change port numbers to be different from network test --- src/tests/select-test/select-test.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c index 80c8cc5bc..bcdef177a 100644 --- a/src/tests/select-test/select-test.c +++ b/src/tests/select-test/select-test.c @@ -108,7 +108,7 @@ void Setup_Server(void) UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); /* Set server port */ - actual = OS_SocketAddrSetPort(&s_addr, 9997); + actual = OS_SocketAddrSetPort(&s_addr, 9994); UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); /* Set server address */ @@ -142,7 +142,7 @@ void Setup_Client(void) UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); /* Set client port */ - actual = OS_SocketAddrSetPort(&c_addr, 9996); + actual = OS_SocketAddrSetPort(&c_addr, 9993); UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); /* Set client address */ @@ -193,7 +193,7 @@ void Setup_Server2(void) UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); /* Set server port */ - actual = OS_SocketAddrSetPort(&s2_addr, 9998); + actual = OS_SocketAddrSetPort(&s2_addr, 9995); UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); /* Set server address */ @@ -227,7 +227,7 @@ void Setup_Client2(void) UtAssert_True(actual == expected, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); /* Set client port */ - actual = OS_SocketAddrSetPort(&c2_addr, 9995); + actual = OS_SocketAddrSetPort(&c2_addr, 9992); UtAssert_True(actual == expected, "OS_SocketAddrSetPort() (%ld) == OS_SUCCESS", (long)actual); /* Set client address */ @@ -281,8 +281,8 @@ void Teardown_Multi(void) { uint32 status; - status = OS_BinSemFlush(bin_sem_id); - UtAssert_True(status == OS_SUCCESS, "BinSem1 Teardown multi flush Rc=%d", (int)status); + status = OS_BinSemGive(bin_sem_id); + UtAssert_True(status == OS_SUCCESS, "BinSem1 Teardown multi give Rc=%d", (int)status); OS_close(c2_socket_id); Teardown_Single(); From 900f97d4a8f5f6143b8c71a8b21be795a68ecb8a Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 4 Jan 2021 11:56:00 -0500 Subject: [PATCH 056/111] Fix #726, Resolve user's guide generation warnings --- src/os/inc/osapi-bsp.h | 2 ++ src/os/inc/osapi-idmap.h | 9 --------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/os/inc/osapi-bsp.h b/src/os/inc/osapi-bsp.h index 250fb30d2..ff8f95120 100644 --- a/src/os/inc/osapi-bsp.h +++ b/src/os/inc/osapi-bsp.h @@ -91,4 +91,6 @@ char *const *OS_BSP_GetArgV(void); ------------------------------------------------------------------*/ void OS_BSP_SetExitCode(int32 code); +/**@}*/ + #endif diff --git a/src/os/inc/osapi-idmap.h b/src/os/inc/osapi-idmap.h index 4458848dc..cd93b0f3e 100644 --- a/src/os/inc/osapi-idmap.h +++ b/src/os/inc/osapi-idmap.h @@ -51,15 +51,6 @@ #define OS_OBJECT_TYPE_USER 0x10 /**< @brief Object user type */ /**@}*/ -/** @defgroup OSAPICore OSAL Core Operation APIs - * - * These are for OSAL core operations for startup/initialization, running, and shutdown. - * Typically only used in bsps, unit tests, psps, etc. - * - * Not intended for user application use - * @{ - */ - /** @defgroup OSAPIObjUtil OSAL Object ID Utility APIs * @{ */ From 779d3e3170b56f6767c08b4e59ff783a9cade34b Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 4 Jan 2021 12:37:57 -0500 Subject: [PATCH 057/111] Fix #429, check time conversions in coverage test Add test cases to coverage test to validate all basic OS_time_t access operations and conversions. --- .../shared/src/coveragetest-clock.c | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/unit-test-coverage/shared/src/coveragetest-clock.c b/src/unit-test-coverage/shared/src/coveragetest-clock.c index 1e7b9b538..5a3b76e59 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-clock.c +++ b/src/unit-test-coverage/shared/src/coveragetest-clock.c @@ -61,6 +61,82 @@ void Test_OS_SetLocalTime(void) UtAssert_True(actual == expected, "OS_SetLocalTime() (%ld) == OS_INVALID_POINTER", (long)actual); } +void Test_OS_TimeAccessConversions(void) +{ + /* + * Test cases for the various time access and conversion functions: + * + * int64 OS_TimeGetTotalSeconds(OS_time_t tm) + * int64 OS_TimeGetTotalMilliseconds(OS_time_t tm) + * int64 OS_TimeGetTotalMicroseconds(OS_time_t tm) + * int64 OS_TimeGetTotalNanoseconds(OS_time_t tm) + * + * uint32 OS_TimeGetSubsecondsPart(OS_time_t tm) + * uint32 OS_TimeGetMillisecondsPart(OS_time_t tm) + * uint32 OS_TimeGetMicrosecondsPart(OS_time_t tm) + * uint32 OS_TimeGetNanosecondsPart(OS_time_t tm) + * + * OS_time_t OS_TimeAssembleFromNanoseconds(int64 seconds, uint32 nanoseconds) + * OS_time_t OS_TimeAssembleFromSubseconds(int64 seconds, uint32 subseconds) + * OS_time_t OS_TimeAdd(OS_time_t time1, OS_time_t time2) + * OS_time_t OS_TimeSubtract(OS_time_t time1, OS_time_t time2) + */ + OS_time_t t1; + OS_time_t t2; + OS_time_t t3; + OS_time_t t4; + + /* To base-2 32-bit fixed point: 0.234567890 s * 0x100000000 ~= 0x3c0ca428 */ + t1 = OS_TimeAssembleFromNanoseconds(1,234567890); + + /* From base-2 32-bit fixed point: 0x87654321 / 0x100000000 ~= 0.528888888 s */ + t2 = OS_TimeAssembleFromSubseconds(2,0x87654321); + + /* These functions only return the total (whole + fraction) in the requested units */ + UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t1), 1); + UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t2), 2); + + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t1), 1234); + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t2), 2528); + + UtAssert_UINT32_EQ(OS_TimeGetTotalMicroseconds(t1), 1234567); + UtAssert_UINT32_EQ(OS_TimeGetTotalMicroseconds(t2), 2528888); + + /* Note: Nanoseconds/Subseconds may not be exact due to limitations of OS_time_t resolution */ + UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t1), 1234567000); + UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t2), 2528888000); + + /* These functions only return the fractional part, not the whole part */ + UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t1), 0x3c0c953a); + UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t2), 0x87653438); + + UtAssert_UINT32_EQ(OS_TimeGetMillisecondsPart(t1), 234); + UtAssert_UINT32_EQ(OS_TimeGetMillisecondsPart(t2), 528); + + UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t1), 234567); + UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t2), 528888); + + UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t1), 234567000); + UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t2), 528888000); + + /* Simple Add/Subtract */ + t3 = OS_TimeAdd(t1, t2); + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t3), 3763); + t4 = OS_TimeSubtract(t3, t2); + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t4), 1234); + + /* Add/Subtract that will require carry */ + t1 = OS_TimeAssembleFromNanoseconds(3,777777777); + t2 = OS_TimeAssembleFromNanoseconds(4,888888888); + + t3 = OS_TimeAdd(t1, t2); + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t3), 8666); + t4 = OS_TimeSubtract(t3, t2); + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t4), 3777); +} + + + /* Osapi_Test_Setup * * Purpose: @@ -86,4 +162,5 @@ void UtTest_Setup(void) { ADD_TEST(OS_GetLocalTime); ADD_TEST(OS_SetLocalTime); + ADD_TEST(OS_TimeAccessConversions); } From ef851eaa49aebc01e6b4cb0660f1126349b97132 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 4 Jan 2021 14:45:17 -0500 Subject: [PATCH 058/111] fix#730-repress_redundant_assignment --- src/os/shared/src/osapi-idmap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 27debe318..69f89aa0b 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -762,6 +762,7 @@ void OS_WaitForStateChange(osal_objtype_t idtype, uint32 attempts) /* * After return, this task owns the table again */ + /* cppcheck-suppress redundantAssignment */ objtype->table_owner = saved_owner_id; } } From 5881078e38f0823d9664834aaa59b518a362910f Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 4 Jan 2021 16:03:25 -0500 Subject: [PATCH 059/111] Fix #644, Remove alignment macros --- src/os/inc/common_types.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/os/inc/common_types.h b/src/os/inc/common_types.h index 937f9db83..ae36830e5 100644 --- a/src/os/inc/common_types.h +++ b/src/os/inc/common_types.h @@ -53,8 +53,7 @@ extern "C" ** Define compiler specific macros ** The __extension__ compiler pragma is required ** for the uint64 type using GCC with the ANSI C90 standard. -** Other macros can go in here as needed, for example alignment -** pragmas. +** Other macros can go in here as needed. ** ** NOTE: The white-box (coverage) unit testing may need to disable ** these extra attributes. These test builds define the OSAPI_NO_SPECIAL_ATTRIBS @@ -62,14 +61,10 @@ extern "C" */ #if defined(__GNUC__) && !defined(OSAPI_NO_SPECIAL_ATTRIBS) #define _EXTENSION_ __extension__ -#define OS_PACK __attribute__((packed)) -#define OS_ALIGN(n) __attribute__((aligned(n))) #define OS_USED __attribute__((used)) #define OS_PRINTF(n, m) __attribute__((format(printf, n, m))) #else #define _EXTENSION_ -#define OS_PACK -#define OS_ALIGN(n) #define OS_USED #define OS_PRINTF(n, m) #endif From 9fbdf11fba4ecabb21bace650f442571a11afcfc Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 4 Jan 2021 17:52:00 -0500 Subject: [PATCH 060/111] Fix #712, Replace UT_OS_LOG with UtPrintf --- src/unit-tests/inc/ut_os_support.h | 2 -- .../oscore-test/ut_oscore_misc_test.c | 26 +++++++++---------- .../oscore-test/ut_oscore_task_test.c | 14 +++++----- .../osfile-test/ut_osfile_fileio_test.c | 8 +++--- src/unit-tests/osfile-test/ut_osfile_test.c | 4 +-- .../osnetwork-test/ut_osnetwork_misc_test.c | 2 +- .../ostimer-test/ut_ostimer_timerio_test.c | 4 +-- 7 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/unit-tests/inc/ut_os_support.h b/src/unit-tests/inc/ut_os_support.h index 147fef09f..ebdf0a974 100644 --- a/src/unit-tests/inc/ut_os_support.h +++ b/src/unit-tests/inc/ut_os_support.h @@ -109,8 +109,6 @@ static inline bool UtOsalImplemented(int32 Fn, const char *File, uint32 Line) /*--------------------------------------------------------------------------------*/ -#define UT_OS_LOG(...) UtAssert_Message(UTASSERT_CASETYPE_INFO, __FILE__, __LINE__, __VA_ARGS__); - /* * An osal_id_t value which is not OS_OBJECT_ID_UNDEFINED and also * not aliasing any other valid value/type. diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.c b/src/unit-tests/oscore-test/ut_oscore_misc_test.c index f54ca186e..5d45d0fc7 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.c @@ -161,7 +161,7 @@ void UT_os_apiinit_test() void UT_os_printf_test() { OS_printf_enable(); - UT_OS_LOG("OS_printf() - #1 Nominal [This is the expected stdout output after API call]\n"); + UtPrintf("OS_printf() - #1 Nominal [This is the expected stdout output after API call]\n"); OS_printf("OS_printf() - #1 Nominal [ This is the expected stdout output after API call]\n"); UT_OS_TEST_RESULT("#1 Nominal - Manual inspection required", UTASSERT_CASETYPE_MIR); @@ -184,7 +184,7 @@ void UT_os_printfenable_test() OS_printf_disable(); OS_printf_enable(); - UT_OS_LOG("OS_printf_enable() - #1 Nominal [This is the expected stdout output after API call]\n"); + UtPrintf("OS_printf_enable() - #1 Nominal [This is the expected stdout output after API call]\n"); OS_printf("OS_printf_enable() - #1 Nominal [This is the expected stdout output after API call]\n"); UT_OS_TEST_RESULT("#1 Nominal - Manual inspection required", UTASSERT_CASETYPE_MIR); @@ -205,18 +205,18 @@ void UT_os_printfenable_test() void UT_os_printfdisable_test() { OS_printf_enable(); - UT_OS_LOG("OS_printf_disable() - #1 Nominal [This is the expected stdout output before API call]\n"); + UtPrintf("OS_printf_disable() - #1 Nominal [This is the expected stdout output before API call]\n"); OS_printf("OS_printf_disable() - #1 Nominal [This is the expected stdout output before API call]\n"); OS_printf_disable(); - UT_OS_LOG("OS_printf_disable() - #1 Nominal [This is NOT the expected stdout output after API call]\n"); + UtPrintf("OS_printf_disable() - #1 Nominal [This is NOT the expected stdout output after API call]\n"); OS_printf("OS_printf_disable() - #1 Nominal [This is NOT the expected stdout output after API call]\n"); UT_OS_TEST_RESULT("#1 Nominal - Manual inspection required", UTASSERT_CASETYPE_MIR); /* Reset test environment */ OS_printf_enable(); - UT_OS_LOG("OS_printf_disable() - #1 Nominal [This is the expected stdout output after test reset]\n"); + UtPrintf("OS_printf_disable() - #1 Nominal [This is the expected stdout output after test reset]\n"); OS_printf("OS_printf_disable() - #1 Nominal [This is the expected stdout output after test reset]\n"); } @@ -286,11 +286,11 @@ void UT_os_getlocaltime_test() res = OS_GetLocalTime(&time_struct); if (res == OS_SUCCESS) { - UT_OS_LOG("\n"); + UtPrintf("\n"); for (i = 0; i < 5; i++) { - UT_OS_LOG("OS_GetLocalTime() - #3 Nominal "); - UT_OS_LOG("[Expecting output after API call to increase over time: %ld.%ld]\n", (long)time_struct.seconds, + UtPrintf("OS_GetLocalTime() - #3 Nominal "); + UtPrintf("[Expecting output after API call to increase over time: %ld.%ld]\n", (long)time_struct.seconds, (long)time_struct.microsecs); OS_TaskDelay(20); @@ -378,8 +378,8 @@ void UT_os_setlocaltime_test() { for (i = 0; i < 5; i++) { - UT_OS_LOG("OS_SetLocalTime() - #3 Nominal "); - UT_OS_LOG("[Expecting output before API call to increase over time: %ld.%ld]\n", (long)time_struct.seconds, + UtPrintf("OS_SetLocalTime() - #3 Nominal "); + UtPrintf("[Expecting output before API call to increase over time: %ld.%ld]\n", (long)time_struct.seconds, (long)time_struct.microsecs); OS_TaskDelay(20); @@ -394,7 +394,7 @@ void UT_os_setlocaltime_test() res = OS_SetLocalTime(&time_struct); if (res == OS_SUCCESS) { - UT_OS_LOG("OS_SetLocalTime() - #3 Nominal [New time set at %ld.%ld]\n", (long)time_struct.seconds, + UtPrintf("OS_SetLocalTime() - #3 Nominal [New time set at %ld.%ld]\n", (long)time_struct.seconds, (long)time_struct.microsecs); res = OS_GetLocalTime(&time_struct); @@ -402,8 +402,8 @@ void UT_os_setlocaltime_test() { for (i = 0; i < 5; i++) { - UT_OS_LOG("OS_SetLocalTime() - #3 Nominal "); - UT_OS_LOG("[Expecting output after API call to increase over time: %ld.%ld]\n", + UtPrintf("OS_SetLocalTime() - #3 Nominal "); + UtPrintf("[Expecting output after API call to increase over time: %ld.%ld]\n", (long)time_struct.seconds, (long)time_struct.microsecs); OS_TaskDelay(20); diff --git a/src/unit-tests/oscore-test/ut_oscore_task_test.c b/src/unit-tests/oscore-test/ut_oscore_task_test.c index bb3d5b9da..ff53e9f56 100644 --- a/src/unit-tests/oscore-test/ut_oscore_task_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_task_test.c @@ -84,7 +84,7 @@ void generic_test_task(void) task_id = OS_TaskGetId(); OS_TaskGetInfo(task_id, &task_prop); - UT_OS_LOG("Starting GenericTask: %s, id: %lx\n", task_prop.name, OS_ObjectIdToInteger(task_id)); + UtPrintf("Starting GenericTask: %s, id: %lx\n", task_prop.name, OS_ObjectIdToInteger(task_id)); while (1) { @@ -322,7 +322,7 @@ void UT_os_task_delete_test() **--------------------------------------------------------------------------------*/ void delete_handler_callback(void) { - UT_OS_LOG("Task delete callback...\n"); + UtPrintf("Task delete callback...\n"); } /*--------------------------------------------------------------------------------*/ @@ -337,7 +337,7 @@ void delete_handler_test_task(void) task_id = OS_TaskGetId(); OS_TaskGetInfo(task_id, &task_prop); - UT_OS_LOG("Starting DeleteTest Task: %s, id: %lx\n", task_prop.name, OS_ObjectIdToInteger(task_id)); + UtPrintf("Starting DeleteTest Task: %s, id: %lx\n", task_prop.name, OS_ObjectIdToInteger(task_id)); g_task_result = OS_TaskInstallDeleteHandler(&delete_handler_callback); @@ -443,7 +443,7 @@ void exit_test_task(void) task_id = OS_TaskGetId(); OS_TaskGetInfo(task_id, &task_prop); - UT_OS_LOG("Starting ExitTest Task: %s, id: %lx\n", task_prop.name, OS_ObjectIdToInteger(task_id)); + UtPrintf("Starting ExitTest Task: %s, id: %lx\n", task_prop.name, OS_ObjectIdToInteger(task_id)); /* ** The parent task will check to see if this task is valid. @@ -675,7 +675,7 @@ void register_test_task(void) task_id = OS_TaskGetId(); OS_TaskGetInfo(task_id, &task_prop); - UT_OS_LOG("Starting RegisterTest Task: %s\n", task_prop.name); + UtPrintf("Starting RegisterTest Task: %s\n", task_prop.name); ; /* @@ -775,7 +775,7 @@ void getid_test_task(void) task_id = OS_TaskGetId(); OS_TaskGetInfo(task_id, &task_prop); - UT_OS_LOG("OS_TaskGetId() - #1 Nominal [This is the returned task Id=%lx]\n", OS_ObjectIdToInteger(task_id)); + UtPrintf("OS_TaskGetId() - #1 Nominal [This is the returned task Id=%lx]\n", OS_ObjectIdToInteger(task_id)); while (1) { @@ -814,7 +814,7 @@ void UT_os_task_get_id_test() { OS_TaskDelay(500); - UT_OS_LOG("OS_TaskGetId() - #1 Nominal [This is the expected task Id=%lx]\n", + UtPrintf("OS_TaskGetId() - #1 Nominal [This is the expected task Id=%lx]\n", OS_ObjectIdToInteger(g_task_ids[1])); res = OS_TaskDelete(g_task_ids[1]); /* Won't hurt if its already deleted */ diff --git a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c index dbb8479a2..7ed2072f7 100644 --- a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c @@ -804,9 +804,9 @@ void UT_os_readfile_test() OS_close(g_fDescs[0]); OS_remove(g_fNames[0]); - UT_OS_LOG("OS_read() success test -- Write to file:\n\t%s\n", g_writeBuff); + UtPrintf("OS_read() success test -- Write to file:\n\t%s\n", g_writeBuff); ; - UT_OS_LOG("OS_read() success test -- Read from file:\n\t%s\n", g_readBuff); + UtPrintf("OS_read() success test -- Read from file:\n\t%s\n", g_readBuff); ; UT_os_readfile_test_exit_tag: @@ -975,9 +975,9 @@ void UT_os_writefile_test() OS_close(g_fDescs[0]); OS_remove(g_fNames[0]); - UT_OS_LOG("OS_write() success test -- Write to file:\n\t%s\n", g_writeBuff); + UtPrintf("OS_write() success test -- Write to file:\n\t%s\n", g_writeBuff); ; - UT_OS_LOG("OS_write() success test -- Read from file:\n\t%s\n", g_readBuff); + UtPrintf("OS_write() success test -- Read from file:\n\t%s\n", g_readBuff); ; UT_os_writefile_test_exit_tag: diff --git a/src/unit-tests/osfile-test/ut_osfile_test.c b/src/unit-tests/osfile-test/ut_osfile_test.c index fc6d6cea3..925fdb612 100644 --- a/src/unit-tests/osfile-test/ut_osfile_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_test.c @@ -79,7 +79,7 @@ int32 UT_os_setup_fs() res = OS_mkfs(g_fsAddrPtr, g_devName, "RAM3", OSAL_SIZE_C(512), OSAL_BLOCKCOUNT_C(64)); if (res != OS_SUCCESS) { - UT_OS_LOG("OS_mkfs() returns %d\n", (int)res); + UtPrintf("OS_mkfs() returns %d\n", (int)res); ; goto UT_os_setup_fs_exit_tag; } @@ -87,7 +87,7 @@ int32 UT_os_setup_fs() res = OS_mount(g_devName, g_mntName); if (res != OS_SUCCESS) { - UT_OS_LOG("OS_mount() returns %d\n", (int)res); + UtPrintf("OS_mount() returns %d\n", (int)res); ; OS_rmfs(g_devName); goto UT_os_setup_fs_exit_tag; diff --git a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c index 400695917..1ce269883 100644 --- a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c +++ b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c @@ -105,7 +105,7 @@ void UT_os_networkgetid_test() /* NOTE: This API does not return error codes. * Any return value could be valid */ - UT_OS_LOG("OS_NetworkGetID() return value=%ld", (long)res); + UtPrintf("OS_NetworkGetID() return value=%ld", (long)res); UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_MIR); UT_os_networkgetid_test_exit_tag: diff --git a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c index 94e8060e5..304da7d6b 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c +++ b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c @@ -550,7 +550,7 @@ void UT_os_timerset_test() intervalTime = 5; g_toleranceVal = 0; - UT_OS_LOG("\nOS_TimerSet() - #3 Interval-too-short (clk_accuracy=%d)\n", (int)g_clkAccuracy); + UtPrintf("\nOS_TimerSet() - #3 Interval-too-short (clk_accuracy=%d)\n", (int)g_clkAccuracy); res = OS_TimerSet(g_timerIds[3], startTime, intervalTime); if (res == OS_SUCCESS) { @@ -588,7 +588,7 @@ void UT_os_timerset_test() startTime = 1000; intervalTime = 500000; g_toleranceVal = intervalTime / 20; /* 5% */ - UT_OS_LOG("\nOS_TimerSet() - #1 Nominal condition (clk_accuracy=%d)\n", (int)g_clkAccuracy); + UtPrintf("\nOS_TimerSet() - #1 Nominal condition (clk_accuracy=%d)\n", (int)g_clkAccuracy); res = OS_TimerSet(g_timerIds[4], startTime, intervalTime); if (res == OS_SUCCESS) { From afaf617ad8aade1770a9e4ef1d68410e94f06ff0 Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Tue, 5 Jan 2021 13:06:01 -0500 Subject: [PATCH 061/111] Fix #740, Add cppcheck GitHub Actions workflow --- .github/workflows/static-analysis.yml | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/static-analysis.yml diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml new file mode 100644 index 000000000..4585b71bd --- /dev/null +++ b/.github/workflows/static-analysis.yml @@ -0,0 +1,50 @@ +name: Static Analysis + +# Run this workflow every time a new commit pushed to your repository +on: [push, pull_request] + +jobs: + + static-analysis: + name: Run cppcheck + runs-on: ubuntu-18.04 + + strategy: + fail-fast: false + matrix: + cppcheck: [all, osal] + + steps: + + - name: Install cppcheck + run: sudo apt-get install cppcheck -y + + # Checks out a copy of the cfs bundle + - name: Checkout code + uses: actions/checkout@v2 + with: + submodules: true + + - name: Run bundle cppcheck + if: ${{matrix.cppcheck =='all'}} + run: cppcheck --force --inline-suppr --quiet . 2> ${{matrix.cppcheck}}_cppcheck_err.txt + + # Run strict static analysis for embedded portions of osal + - name: osal strict cppcheck + if: ${{matrix.cppcheck =='osal'}} + run: | + cppcheck --force --inline-suppr --std=c99 --language=c --enable=warning,performance,portability,style --suppress=variableScope --inconclusive ./src/bsp ./src/os 2> ./${{matrix.cppcheck}}_cppcheck_err.txt + + - name: Archive Static Analysis Artifacts + uses: actions/upload-artifact@v2 + with: + name: ${{matrix.cppcheck}}-cppcheck-err + path: ./*cppcheck_err.txt + + - name: Check for errors + run: | + if [[ -s ${{matrix.cppcheck}}_cppcheck_err.txt ]]; + then + cat ${{matrix.cppcheck}}_cppcheck_err.txt + exit -1 + fi From ab8f96538ce1b8b996ab825c44d617779835b3ba Mon Sep 17 00:00:00 2001 From: astrogeco <59618057+astrogeco@users.noreply.github.com> Date: Wed, 6 Jan 2021 17:59:43 -0500 Subject: [PATCH 062/111] HOTFIX IC-20210105, Remove duplicate GitHub actions workflow call --- .github/workflows/static-analysis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 4585b71bd..3a4f0e9cd 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -1,7 +1,11 @@ name: Static Analysis # Run this workflow every time a new commit pushed to your repository -on: [push, pull_request] +on: + push: + branches: + - main + pull_request: jobs: From f09c57ea6eb15608fcee9704d4760310e2921be6 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Wed, 6 Jan 2021 20:34:10 -0500 Subject: [PATCH 063/111] Fix #429, add "assemble" routines for milli/microsecs Add OS_TimeAssembleFromMilliseconds and OS_TimeAssembleFromMicroseconds for a complete set of conversion routines in both directions. --- src/os/inc/osapi-clock.h | 49 +++++++++++++++++++ .../shared/src/coveragetest-clock.c | 25 ++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/os/inc/osapi-clock.h b/src/os/inc/osapi-clock.h index 2f5464f9b..30b7215e0 100644 --- a/src/os/inc/osapi-clock.h +++ b/src/os/inc/osapi-clock.h @@ -283,6 +283,55 @@ static inline OS_time_t OS_TimeAssembleFromNanoseconds(int64 seconds, uint32 nan return result; } +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Assemble/Convert a number of seconds + microseconds into an OS_time_t interval + * + * This creates an OS_time_t value using a whole number of seconds and a fractional + * part in units of microseconds. This is the inverse of OS_TimeGetTotalSeconds() + * and OS_TimeGetMicrosecondsPart(), and should recreate the original OS_time_t + * value from these separate values (aside from any potential conversion losses + * due to limited resolution of the data types/units). + * + * @sa OS_TimeGetTotalSeconds(), OS_TimeGetMicrosecondsPart() + * + * @param[in] seconds Whole number of seconds + * @param[in] microseconds Number of microseconds (fractional part only) + * @returns The input arguments represented as an OS_time_t interval + */ +static inline OS_time_t OS_TimeAssembleFromMicroseconds(int64 seconds, uint32 microseconds) +{ + OS_time_t result; + result.seconds = seconds; + result.microsecs = microseconds; + return result; +} + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Assemble/Convert a number of seconds + milliseconds into an OS_time_t interval + * + * This creates an OS_time_t value using a whole number of seconds and a fractional + * part in units of milliseconds. This is the inverse of OS_TimeGetTotalSeconds() + * and OS_TimeGetMillisecondsPart(), and should recreate the original OS_time_t + * value from these separate values (aside from any potential conversion losses + * due to limited resolution of the data types/units). + * + * @sa OS_TimeGetTotalSeconds(), OS_TimeGetMillisecondsPart() + * + * @param[in] seconds Whole number of seconds + * @param[in] milliseconds Number of milliseconds (fractional part only) + * @returns The input arguments represented as an OS_time_t interval + */ +static inline OS_time_t OS_TimeAssembleFromMilliseconds(int64 seconds, uint32 milliseconds) +{ + OS_time_t result; + result.seconds = seconds; + result.microsecs = milliseconds * 1000; + return result; +} + + /*-------------------------------------------------------------------------------------*/ /** * @brief Assemble/Convert a number of seconds + subseconds into an OS_time_t interval diff --git a/src/unit-test-coverage/shared/src/coveragetest-clock.c b/src/unit-test-coverage/shared/src/coveragetest-clock.c index 5a3b76e59..20959c987 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-clock.c +++ b/src/unit-test-coverage/shared/src/coveragetest-clock.c @@ -76,8 +76,11 @@ void Test_OS_TimeAccessConversions(void) * uint32 OS_TimeGetMicrosecondsPart(OS_time_t tm) * uint32 OS_TimeGetNanosecondsPart(OS_time_t tm) * + * OS_time_t OS_TimeAssembleFromMilliseconds(int64 seconds, uint32 milliseconds) + * OS_time_t OS_TimeAssembleFromMicroseconds(int64 seconds, uint32 microseconds) * OS_time_t OS_TimeAssembleFromNanoseconds(int64 seconds, uint32 nanoseconds) * OS_time_t OS_TimeAssembleFromSubseconds(int64 seconds, uint32 subseconds) + * * OS_time_t OS_TimeAdd(OS_time_t time1, OS_time_t time2) * OS_time_t OS_TimeSubtract(OS_time_t time1, OS_time_t time2) */ @@ -92,32 +95,54 @@ void Test_OS_TimeAccessConversions(void) /* From base-2 32-bit fixed point: 0x87654321 / 0x100000000 ~= 0.528888888 s */ t2 = OS_TimeAssembleFromSubseconds(2,0x87654321); + /* To base-2 32-bit fixed point: 0.045678 s * 0x100000000 ~= 0x0bb18dad */ + t3 = OS_TimeAssembleFromMicroseconds(0,45678); + + /* To base-2 32-bit fixed point: 0.901 s * 0x100000000 ~= 0xe6a7ef9e */ + t4 = OS_TimeAssembleFromMilliseconds(1,901); + /* These functions only return the total (whole + fraction) in the requested units */ UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t1), 1); UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t2), 2); + UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t3), 0); + UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t4), 1); UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t1), 1234); UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t2), 2528); + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t3), 45); + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t4), 1901); UtAssert_UINT32_EQ(OS_TimeGetTotalMicroseconds(t1), 1234567); UtAssert_UINT32_EQ(OS_TimeGetTotalMicroseconds(t2), 2528888); + UtAssert_UINT32_EQ(OS_TimeGetTotalMicroseconds(t3), 45678); + UtAssert_UINT32_EQ(OS_TimeGetTotalMicroseconds(t4), 1901000); /* Note: Nanoseconds/Subseconds may not be exact due to limitations of OS_time_t resolution */ UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t1), 1234567000); UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t2), 2528888000); + UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t3), 45678000); + UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t4), 1901000000); /* These functions only return the fractional part, not the whole part */ UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t1), 0x3c0c953a); UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t2), 0x87653438); + UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t3), 0x0bb18dad); + UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t4), 0xe6a7ef9e); UtAssert_UINT32_EQ(OS_TimeGetMillisecondsPart(t1), 234); UtAssert_UINT32_EQ(OS_TimeGetMillisecondsPart(t2), 528); + UtAssert_UINT32_EQ(OS_TimeGetMillisecondsPart(t3), 45); + UtAssert_UINT32_EQ(OS_TimeGetMillisecondsPart(t4), 901); UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t1), 234567); UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t2), 528888); + UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t3), 45678); + UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t4), 901000); UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t1), 234567000); UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t2), 528888000); + UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t3), 45678000); + UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t4), 901000000); /* Simple Add/Subtract */ t3 = OS_TimeAdd(t1, t2); From 32fd5cf8cdf4f9faba9aa8b2e96c3b2f9100e1c6 Mon Sep 17 00:00:00 2001 From: astrogeco <59618057+astrogeco@users.noreply.github.com> Date: Thu, 7 Jan 2021 14:17:58 -0500 Subject: [PATCH 064/111] Bump to v5.1.0-rc1+dev149 --- README.md | 10 ++++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 86cd9bdee..72d57a312 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,16 @@ The autogenerated OSAL user's guide can be viewed at + ### Development Build: 5.1.0-rc1+dev132 - Convert the OSAL Configuration Guide from docx and pdf to a markdown file. diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index b71137902..3b17e2e7d 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 132 +#define OS_BUILD_NUMBER 149 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* From 5bbf0419008b8c9d05e6d0eda15ddf17dfe500bd Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Thu, 7 Jan 2021 15:30:35 -0500 Subject: [PATCH 065/111] Fix #746, Add UtDebug message from OS_printf stub --- src/ut-stubs/osapi-utstub-printf.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ut-stubs/osapi-utstub-printf.c b/src/ut-stubs/osapi-utstub-printf.c index afe5d8db2..19b4b4a9c 100644 --- a/src/ut-stubs/osapi-utstub-printf.c +++ b/src/ut-stubs/osapi-utstub-printf.c @@ -63,9 +63,13 @@ void OS_printf(const char *string, ...) int32 status; size_t length = strlen(string); va_list va; + char str[128]; va_start(va, string); + vsnprintf(str, sizeof(str), string, va); + UtDebug("OS_printf: %s", str); + status = UT_DefaultStubImplWithArgs(__func__, UT_KEY(OS_printf), 0, va); if (status >= 0) From 4b65be018e9b95c1fae6f11b4eb8a940eae31d9f Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Tue, 5 Jan 2021 14:15:52 -0500 Subject: [PATCH 066/111] Fix #692, Resolve typos in unit test assert OR statements --- src/tests/network-api-test/network-api-test.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/tests/network-api-test/network-api-test.c b/src/tests/network-api-test/network-api-test.c index 019bbdb9b..58da01a02 100644 --- a/src/tests/network-api-test/network-api-test.c +++ b/src/tests/network-api-test/network-api-test.c @@ -113,7 +113,8 @@ void TestDatagramNetworkApi_Setup(void) /* OS_SocketOpen */ actual = OS_SocketOpen(&socket_id, OS_SocketDomain_INET6, OS_SocketType_DATAGRAM); - UtAssert_True(actual == OS_SUCCESS || OS_ERR_NOT_IMPLEMENTED, "OS_SocketOpen() (%ld) Passed", (long)actual); + UtAssert_True(actual == OS_SUCCESS || actual == OS_ERR_NOT_IMPLEMENTED, + "OS_SocketOpen() (%ld) Passed", (long)actual); OS_close(socket_id); expected = OS_INVALID_POINTER; @@ -126,12 +127,12 @@ void TestDatagramNetworkApi_Setup(void) /* OS_SocketAddrInit */ actual = OS_SocketAddrInit(&addr, OS_SocketDomain_INET6); - UtAssert_True(actual == OS_SUCCESS || OS_ERR_NOT_IMPLEMENTED, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", - (long)actual); + UtAssert_True(actual == OS_SUCCESS || actual == OS_ERR_NOT_IMPLEMENTED, + "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); actual = OS_SocketAddrInit(NULL, OS_SocketDomain_INET6); - UtAssert_True(actual == OS_INVALID_POINTER || OS_ERR_NOT_IMPLEMENTED, - "OS_SocketAddrInit() (%ld) == OS_INVALID_POINTER", (long)actual); + UtAssert_True(actual == OS_INVALID_POINTER || actual == OS_ERR_NOT_IMPLEMENTED, + "OS_SocketAddrInit() (%ld) == OS_INVALID_POINTER", (long)actual); expected = OS_ERR_NOT_IMPLEMENTED; actual = OS_SocketAddrInit(&addr, OS_SocketDomain_INVALID); From efd7f3553e58de33d487458871cc0f66da951e0d Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Mon, 4 Jan 2021 15:11:43 -0500 Subject: [PATCH 067/111] Fix #732 change uint32 to size_t --- src/bsp/pc-rtems/src/bsp_console.c | 2 +- src/os/rtems/src/os-impl-network.c | 2 +- src/os/rtems/src/os-impl-queues.c | 4 ++-- src/os/rtems/src/os-impl-tasks.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bsp/pc-rtems/src/bsp_console.c b/src/bsp/pc-rtems/src/bsp_console.c index 9a954c20e..85e521736 100644 --- a/src/bsp/pc-rtems/src/bsp_console.c +++ b/src/bsp/pc-rtems/src/bsp_console.c @@ -41,7 +41,7 @@ OS_BSP_ConsoleOutput_Impl See full description in header ------------------------------------------------------------------*/ -void OS_BSP_ConsoleOutput_Impl(const char *Str, uint32 DataLen) +void OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen) { /* writes the raw data directly to STDOUT_FILENO (unbuffered) */ write(STDOUT_FILENO, Str, DataLen); diff --git a/src/os/rtems/src/os-impl-network.c b/src/os/rtems/src/os-impl-network.c index c5a8a20ef..19c92e485 100644 --- a/src/os/rtems/src/os-impl-network.c +++ b/src/os/rtems/src/os-impl-network.c @@ -57,7 +57,7 @@ int32 OS_NetworkGetID_Impl(int32 *IdBuf) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_NetworkGetHostName_Impl(char *host_name, uint32 name_len) +int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len) { int32 return_code; diff --git a/src/os/rtems/src/os-impl-queues.c b/src/os/rtems/src/os-impl-queues.c index 58e978ceb..014e9e9ba 100644 --- a/src/os/rtems/src/os-impl-queues.c +++ b/src/os/rtems/src/os-impl-queues.c @@ -156,7 +156,7 @@ int32 OS_QueueDelete_Impl(const OS_object_token_t *token) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueueGet_Impl(const OS_object_token_t *token, void *data, uint32 size, uint32 *size_copied, int32 timeout) +int32 OS_QueueGet_Impl(const OS_object_token_t *token, void *data, size_t size, size_t *size_copied, int32 timeout) { int32 return_code; rtems_status_code status; @@ -253,7 +253,7 @@ int32 OS_QueueGet_Impl(const OS_object_token_t *token, void *data, uint32 size, * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, uint32 size, uint32 flags) +int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, size_t size, uint32 flags) { rtems_status_code status; rtems_id rtems_queue_id; diff --git a/src/os/rtems/src/os-impl-tasks.c b/src/os/rtems/src/os-impl-tasks.c index 606846648..0302ef01f 100644 --- a/src/os/rtems/src/os-impl-tasks.c +++ b/src/os/rtems/src/os-impl-tasks.c @@ -359,7 +359,7 @@ int32 OS_TaskGetInfo_Impl(const OS_object_token_t *token, OS_task_prop_t *task_p * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_TaskValidateSystemData_Impl(const void *sysdata, uint32 sysdata_size) +int32 OS_TaskValidateSystemData_Impl(const void *sysdata, size_t sysdata_size) { if (sysdata == NULL || sysdata_size != sizeof(rtems_id)) { From 62eb12d58421a6110b2915eca0e97c1bfada95bf Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 11 Jan 2021 14:55:13 -0500 Subject: [PATCH 068/111] Fix #577, Document nested tests not supported --- ut_assert/inc/uttest.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ut_assert/inc/uttest.h b/ut_assert/inc/uttest.h index b5bc71adb..d79ac8bee 100644 --- a/ut_assert/inc/uttest.h +++ b/ut_assert/inc/uttest.h @@ -43,6 +43,11 @@ * * Called by the user to register a new test case with the library. * + * Note: Nested addition of tests is not supported. Calling + * UtTest_Add from within a test function added using UtTest_Add + * will not cause the nested test to execute, and will be + * silently ignored. + * * \param Test Main test function to call. * \param Setup Setup function, called before the test function * \param Teardown Cleanup function, called after the test function From c968de0a2268b91c37c48f72d10d98c099dc7b84 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 11 Jan 2021 17:03:58 -0500 Subject: [PATCH 069/111] Fix #753, Remove UT_CheckForOpenSockets --- src/ut-stubs/utstub-helpers.c | 23 ----------------------- src/ut-stubs/utstub-helpers.h | 6 ------ 2 files changed, 29 deletions(-) diff --git a/src/ut-stubs/utstub-helpers.c b/src/ut-stubs/utstub-helpers.c index 22abd573e..9d5c1824c 100644 --- a/src/ut-stubs/utstub-helpers.c +++ b/src/ut-stubs/utstub-helpers.c @@ -184,26 +184,3 @@ void UT_ObjIdDecompose(osal_id_t id, uint32 *indx, UT_ObjType_t *objtype) *indx = idv & 0xFFFFUL; *objtype = (idv >> 16) ^ 0x4000UL; } - -/* -** Report and close any sockets found open -** Moved here temporarily to ensure full compatibility with CFE implementation -** -** NOTE - this historically only checked for queues that were created but not -** cleaned up. Although the current impl could check for anything, only queues -** are done for now. -*/ -void UT_CheckForOpenSockets(void) -{ - UT_ObjTypeState_t *StatePtr; - uint32 i; - - StatePtr = &UT_ObjState[UT_OBJTYPE_QUEUE]; - for (i = 0; i <= StatePtr->LastIssueNumber; ++i) - { - if ((StatePtr->ValidBits[i >> 3] & (1 << (i & 0x07))) != 0) - { - UtAssert_Failed("UT_Queue %d left open.\n", (int)i); - } - } -} diff --git a/src/ut-stubs/utstub-helpers.h b/src/ut-stubs/utstub-helpers.h index bb7775e9c..6450aaeb5 100644 --- a/src/ut-stubs/utstub-helpers.h +++ b/src/ut-stubs/utstub-helpers.h @@ -107,12 +107,6 @@ osal_id_t UT_AllocStubObjId(UT_ObjType_t ObjType); */ void UT_DeleteStubObjId(UT_ObjType_t ObjType, osal_id_t ObjId); -/* - * Helper function - Report any queue objects found open - * (for compatibility with CFE tests, only checks queues) - */ -void UT_CheckForOpenSockets(void); - /* * Helper function - Clear all OSAL UT stub objects * Resets the stub object table back to its initial/empty state From f12686ff285d210bb32c47ccdbe82657401a9d43 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Tue, 12 Jan 2021 17:05:06 -0500 Subject: [PATCH 070/111] Fix #755, resolve subtasks not ending on time --- src/tests/select-test/select-test.c | 45 +++++++++-------------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c index bcdef177a..7f4d97048 100644 --- a/src/tests/select-test/select-test.c +++ b/src/tests/select-test/select-test.c @@ -49,7 +49,6 @@ OS_SockAddr_t s2_addr; OS_SockAddr_t c_addr; OS_SockAddr_t c2_addr; osal_id_t bin_sem_id; -osal_id_t bin_sem_id2; /* *************************************** MAIN ************************************** */ @@ -67,24 +66,16 @@ void BinSemSetup(void) { uint32 status; OS_bin_sem_prop_t bin_sem_prop; - OS_bin_sem_prop_t bin_sem_prop2; /* * Create the binary semaphore * BinSem1 is used to control when the server can accept connections - * BinSem2 is used to make sure all sub task finish before the main task does. */ status = OS_BinSemCreate(&bin_sem_id, "BinSem1", 0, 0); UtAssert_True(status == OS_SUCCESS, "BinSem1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(bin_sem_id), (int)status); status = OS_BinSemGetInfo(bin_sem_id, &bin_sem_prop); UtAssert_True(status == OS_SUCCESS, "BinSem1 value=%d Rc=%d", (int)bin_sem_prop.value, (int)status); - - status = OS_BinSemCreate(&bin_sem_id2, "BinSem2", 0, 0); - UtAssert_True(status == OS_SUCCESS, "BinSem2 create Id=%lx Rc=%d", OS_ObjectIdToInteger(bin_sem_id2), (int)status); - - status = OS_BinSemGetInfo(bin_sem_id2, &bin_sem_prop2); - UtAssert_True(status == OS_SUCCESS, "BinSem2 value=%d Rc=%d", (int)bin_sem_prop2.value, (int)status); } void Setup_Server(void) @@ -167,9 +158,6 @@ void Server_Fn(void) status = OS_close(connsock_id); UtAssert_True(status == OS_SUCCESS, "status after close connsock_id = %d", (int)status); - - status = OS_BinSemGive(bin_sem_id2); - UtAssert_True(status == OS_SUCCESS, "BinSem2 Server 1 give Rc=%d", (int)status); } /* end Server_Fn */ void Setup_Server2(void) @@ -267,24 +255,17 @@ void Setup_Multi(void) void Teardown_Single(void) { - uint32 status; - - OS_close(c_socket_id); - status = OS_BinSemTake(bin_sem_id2); - UtAssert_True(status == OS_SUCCESS, "BinSem2 Teardown single take Rc=%d", (int)status); - - OS_BinSemDelete(bin_sem_id); - OS_BinSemDelete(bin_sem_id2); + OS_close(c_socket_id); + OS_BinSemDelete(bin_sem_id); } void Teardown_Multi(void) -{ - uint32 status; - - status = OS_BinSemGive(bin_sem_id); - UtAssert_True(status == OS_SUCCESS, "BinSem1 Teardown multi give Rc=%d", (int)status); +{ + //Server 1 is intentionaly left waiting so we close it out here. + OS_close(s_socket_id); + OS_TaskDelete(s_task_id); - OS_close(c2_socket_id); + OS_close(c2_socket_id); Teardown_Single(); } @@ -303,7 +284,7 @@ void TestSelectSingleRead(void) */ /* Create a server task/thread */ - int32 status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + int32 status = OS_TaskCreate(&s_task_id, "ServerSingleRead", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); @@ -353,7 +334,7 @@ void TestSelectMultipleRead(void) */ /* Create a server task/thread */ - status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + status = OS_TaskCreate(&s_task_id, "ServerMultiRead", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); @@ -361,7 +342,7 @@ void TestSelectMultipleRead(void) actual = OS_SocketConnect(c_socket_id, &s_addr, 10); UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); - status = OS_TaskCreate(&s2_task_id, "Server2", Server_Fn2, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + status = OS_TaskCreate(&s2_task_id, "ServerMultiRead2", Server_Fn2, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); @@ -402,7 +383,7 @@ void TestSelectSingleWrite(void) */ /* Create a server task/thread */ - int32 status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + int32 status = OS_TaskCreate(&s_task_id, "ServerSingleWrite", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); @@ -470,7 +451,7 @@ void TestSelectMultipleWrite(void) */ /* Create a server task/thread */ - status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + status = OS_TaskCreate(&s_task_id, "ServerMultiWrite", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); @@ -478,7 +459,7 @@ void TestSelectMultipleWrite(void) actual = OS_SocketConnect(c_socket_id, &s_addr, 10); UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); - status = OS_TaskCreate(&s2_task_id, "Server2", Server_Fn2, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), + status = OS_TaskCreate(&s2_task_id, "ServerMultiWrite2", Server_Fn2, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); From f9dd6b3138f5bd1999f1bf8ad109c374975d13ce Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Tue, 12 Jan 2021 23:00:47 -0500 Subject: [PATCH 071/111] HOTFIX IC-2021-01-12, Fix osal and usersguide doxygen warning Added Doxygen escape character "\" to "<>" symbols in comments --- src/os/inc/osapi-filesys.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/inc/osapi-filesys.h b/src/os/inc/osapi-filesys.h index 180456c32..8e37bdfb4 100644 --- a/src/os/inc/osapi-filesys.h +++ b/src/os/inc/osapi-filesys.h @@ -70,8 +70,8 @@ typedef struct * at runtime. It is intended to be called by the PSP/BSP prior to starting the application. * * @note OSAL virtual mount points are required to be a single, non-empty top-level directory - * name. Virtual path names always follow the form ///. - * Only the relative path may be omitted/empty (i.e. //) but the + * name. Virtual path names always follow the form /\/\/\. + * Only the relative path may be omitted/empty (i.e. /\/\) but the * virtual mount point must be present and not an empty string. In particular this means * it is not possible to directly refer to files in the "root" of the native file system * from OSAL. However it is possible to create a virtual map to the root, such as by calling: From e9638478b851ae083adac888f4df8665c9bf0fc6 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Thu, 17 Dec 2020 12:52:33 -0500 Subject: [PATCH 072/111] Fix #229, add mqueue functional test --- .../queue-test.c} | 96 ++++++++++++++++--- 1 file changed, 82 insertions(+), 14 deletions(-) rename src/tests/{queue-timeout-test/queue-timeout-test.c => queue-test/queue-test.c} (65%) diff --git a/src/tests/queue-timeout-test/queue-timeout-test.c b/src/tests/queue-test/queue-test.c similarity index 65% rename from src/tests/queue-timeout-test/queue-timeout-test.c rename to src/tests/queue-test/queue-test.c index e8271b51c..657dc658a 100644 --- a/src/tests/queue-timeout-test/queue-timeout-test.c +++ b/src/tests/queue-test/queue-test.c @@ -64,8 +64,9 @@ void TimerFunction(osal_id_t timer_id) void task_1(void) { int32 status; - uint32 data_received; size_t data_size; + char data_received[4] = {0}; + char expected[4] = "xyz"; OS_printf("Starting task 1\n"); @@ -83,7 +84,8 @@ void task_1(void) if (status == OS_SUCCESS) { ++task_1_messages; - OS_printf("TASK 1: Recieved a message on the queue\n"); + UtAssert_True(strcmp(data_received, expected) == 0, "TASK 1: data_received (%s) == expected (%s)", + data_received, expected); } else if (status == OS_QUEUE_TIMEOUT) { @@ -108,6 +110,8 @@ void QueueTimeoutCheck(void) UtAssert_True(status == OS_SUCCESS, "Timer delete Rc=%d", (int)status); status = OS_TaskDelete(task_1_id); UtAssert_True(status == OS_SUCCESS, "Task 1 delete Rc=%d", (int)status); + status = OS_QueueDelete(msgq_id); + UtAssert_True(status == OS_SUCCESS, "Queue 1 delete Rc=%d", (int)status); /* None of the tasks should have any failures in their own counters */ UtAssert_True(task_1_failures == 0, "Task 1 failures = %u", (unsigned int)task_1_failures); @@ -127,28 +131,76 @@ void QueueTimeoutCheck(void) (unsigned int)limit); } -void UtTest_Setup(void) +void QueueTimeoutSetup(void) { - if (OS_API_Init() != OS_SUCCESS) + int32 status; + uint32 accuracy; + + task_1_failures = 0; + task_1_messages = 0; + task_1_timeouts = 0; + + status = OS_QueueCreate(&msgq_id, "MsgQ", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); + UtAssert_True(status == OS_SUCCESS, "MsgQ create Id=%lx Rc=%d", OS_ObjectIdToInteger(msgq_id), (int)status); + + /* + ** Create the "consumer" task. + */ + status = OS_TaskCreate(&task_1_id, "Task 1", task_1, OSAL_STACKPTR_C(task_1_stack), sizeof(task_1_stack), + OSAL_PRIORITY_C(TASK_1_PRIORITY), 0); + UtAssert_True(status == OS_SUCCESS, "Task 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(task_1_id), (int)status); + + /* + ** Create a timer + */ + status = OS_TimerCreate(&timer_id, "Timer 1", &accuracy, &(TimerFunction)); + UtAssert_True(status == OS_SUCCESS, "Timer 1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(timer_id), (int)status); + UtPrintf("Timer Accuracy = %u microseconds \n", (unsigned int)accuracy); + + /* + ** Start the timer + */ + status = OS_TimerSet(timer_id, timer_start, timer_interval); + UtAssert_True(status == OS_SUCCESS, "Timer 1 set Rc=%d", (int)status); + + /* allow some time for task to run and accrue queue timeouts */ + while (timer_counter < 100) { - UtAssert_Abort("OS_API_Init() failed"); + OS_TaskDelay(100); } +} - /* - * Register the test setup and check routines in UT assert - */ - UtTest_Add(QueueTimeoutCheck, QueueTimeoutSetup, NULL, "QueueTimeoutTest"); +void QueueMessageCheck(void) +{ + int32 status; + + OS_printf("Delay for half a second before checking\n"); + OS_TaskDelay(500); + + status = OS_TimerDelete(timer_id); + UtAssert_True(status == OS_SUCCESS, "Timer delete Rc=%d", (int)status); + status = OS_TaskDelete(task_1_id); + UtAssert_True(status == OS_SUCCESS, "Task 1 delete Rc=%d", (int)status); + status = OS_QueueDelete(msgq_id); + UtAssert_True(status == OS_SUCCESS, "Queue 1 delete Rc=%d", (int)status); + + /* None of the tasks should have any failures in their own counters */ + UtAssert_True(task_1_failures == 0, "Task 1 failures = %u", (unsigned int)task_1_failures); + UtAssert_True(task_1_messages == 10, "Task 1 messages = %u", (unsigned int)task_1_messages); + UtAssert_True(task_1_timeouts == 0, "Task 1 timeouts = %u", (unsigned int)task_1_timeouts); } -void QueueTimeoutSetup(void) +void QueueMessageSetup(void) { int32 status; uint32 accuracy; - task_1_failures = 0; task_1_messages = 0; task_1_timeouts = 0; + int i; + const char Data[4] = "xyz"; + status = OS_QueueCreate(&msgq_id, "MsgQ", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); UtAssert_True(status == OS_SUCCESS, "MsgQ create Id=%lx Rc=%d", OS_ObjectIdToInteger(msgq_id), (int)status); @@ -172,9 +224,25 @@ void QueueTimeoutSetup(void) status = OS_TimerSet(timer_id, timer_start, timer_interval); UtAssert_True(status == OS_SUCCESS, "Timer 1 set Rc=%d", (int)status); - /* allow some time for task to run and accrue queue timeouts */ - while (timer_counter < 100) + /* Put 10 messages onto the que with some time inbetween to not overfill the que*/ + for (i = 0; i < 10; i++) { - OS_TaskDelay(100); + OS_TaskDelay(200); + status = OS_QueuePut(msgq_id, Data, sizeof(Data), 0); + UtAssert_True(status == OS_SUCCESS, "OS Queue Put Rc=%d", (int)status); } } + +void UtTest_Setup(void) +{ + if (OS_API_Init() != OS_SUCCESS) + { + UtAssert_Abort("OS_API_Init() failed"); + } + + /* + * Register the test setup and check routines in UT assert + */ + UtTest_Add(QueueTimeoutCheck, QueueTimeoutSetup, NULL, "QueueTimeoutTest"); + UtTest_Add(QueueMessageCheck, QueueMessageSetup, NULL, "QueueMessageCheck"); +} From df458a3bab1a8268f72e909ec60715626cdba07b Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 13 Jan 2021 09:33:15 -0500 Subject: [PATCH 073/111] Fix #757, Readd extern C in osapi.h to support C++ use --- src/os/inc/osapi.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/os/inc/osapi.h b/src/os/inc/osapi.h index 96b62a0bb..2d6e11a4b 100644 --- a/src/os/inc/osapi.h +++ b/src/os/inc/osapi.h @@ -30,6 +30,11 @@ #ifndef OSAPI_H #define OSAPI_H +#ifdef __cplusplus +extern "C" +{ +#endif + /* * Note - the "osapi-os-filesys.h" file previously included these system headers * plus a couple others. Some existing code used stdio/stdlib functions but did From a92873480f3e4d84fed66bb8bff5f2723211f72f Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Mon, 11 Jan 2021 14:46:10 -0500 Subject: [PATCH 074/111] Fix #692, display message when not implemented error occurs --- src/tests/network-api-test/network-api-test.c | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/tests/network-api-test/network-api-test.c b/src/tests/network-api-test/network-api-test.c index 58da01a02..891bcb6d8 100644 --- a/src/tests/network-api-test/network-api-test.c +++ b/src/tests/network-api-test/network-api-test.c @@ -113,8 +113,14 @@ void TestDatagramNetworkApi_Setup(void) /* OS_SocketOpen */ actual = OS_SocketOpen(&socket_id, OS_SocketDomain_INET6, OS_SocketType_DATAGRAM); - UtAssert_True(actual == OS_SUCCESS || actual == OS_ERR_NOT_IMPLEMENTED, - "OS_SocketOpen() (%ld) Passed", (long)actual); + if (actual == OS_ERR_NOT_IMPLEMENTED) + { + UtPrintf("INET6 not supported\n"); + } + else + { + UtAssert_True(actual == OS_SUCCESS, "OS_SocketOpen() (%ld) Passed", (long)actual); + } OS_close(socket_id); expected = OS_INVALID_POINTER; @@ -127,12 +133,24 @@ void TestDatagramNetworkApi_Setup(void) /* OS_SocketAddrInit */ actual = OS_SocketAddrInit(&addr, OS_SocketDomain_INET6); - UtAssert_True(actual == OS_SUCCESS || actual == OS_ERR_NOT_IMPLEMENTED, - "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); + if (actual == OS_ERR_NOT_IMPLEMENTED) + { + UtPrintf("INET6 not supported\n"); + } + else + { + UtAssert_True(actual == OS_SUCCESS, "OS_SocketAddrInit() (%ld) == OS_SUCCESS", (long)actual); + } actual = OS_SocketAddrInit(NULL, OS_SocketDomain_INET6); - UtAssert_True(actual == OS_INVALID_POINTER || actual == OS_ERR_NOT_IMPLEMENTED, - "OS_SocketAddrInit() (%ld) == OS_INVALID_POINTER", (long)actual); + if (actual == OS_ERR_NOT_IMPLEMENTED) + { + UtPrintf("INET6 not supported\n"); + } + else + { + UtAssert_True(actual == OS_INVALID_POINTER, "OS_SocketAddrInit() (%ld) == OS_INVALID_POINTER", (long)actual); + } expected = OS_ERR_NOT_IMPLEMENTED; actual = OS_SocketAddrInit(&addr, OS_SocketDomain_INVALID); From 55aa1a7267723a5eef89843aa8b7dfbd9ca1166a Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Thu, 17 Dec 2020 11:20:38 -0500 Subject: [PATCH 075/111] Fix #591, add test teardown failure to test summary --- ut_assert/src/utassert.c | 3 ++- ut_assert/src/utbsp.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ut_assert/src/utassert.c b/ut_assert/src/utassert.c index 677614cbf..a4a88ddda 100644 --- a/ut_assert/src/utassert.c +++ b/ut_assert/src/utassert.c @@ -79,12 +79,13 @@ void UtAssert_DoTestSegmentReport(const char *SegmentName, const UtAssert_TestCo char ReportBuffer[144]; snprintf(ReportBuffer, sizeof(ReportBuffer), - "%02u %-20s TOTAL::%-4u PASS::%-4u FAIL::%-4u MIR::%-4u TSF::%-4u N/A::%-4u\n", + "%02u %-20s TOTAL::%-4u PASS::%-4u FAIL::%-4u MIR::%-4u TSF::%-4u TTF::%-4u N/A::%-4u\n", (unsigned int)TestCounters->TestSegmentCount, SegmentName, (unsigned int)TestCounters->TotalTestCases, (unsigned int)TestCounters->CaseCount[UTASSERT_CASETYPE_PASS], (unsigned int)TestCounters->CaseCount[UTASSERT_CASETYPE_FAILURE], (unsigned int)TestCounters->CaseCount[UTASSERT_CASETYPE_MIR], (unsigned int)TestCounters->CaseCount[UTASSERT_CASETYPE_TSF], + (unsigned int)TestCounters->CaseCount[UTASSERT_CASETYPE_TTF], (unsigned int)TestCounters->CaseCount[UTASSERT_CASETYPE_NA]); UT_BSP_DoText(UTASSERT_CASETYPE_END, ReportBuffer); diff --git a/ut_assert/src/utbsp.c b/ut_assert/src/utbsp.c index 5e8b7998e..11b508efb 100644 --- a/ut_assert/src/utbsp.c +++ b/ut_assert/src/utbsp.c @@ -132,6 +132,7 @@ void UT_BSP_DoText(uint8 MessageType, const char *OutputMessage) Prefix = "TSF"; break; case UTASSERT_CASETYPE_TTF: + TermModeBits = OS_BSP_CONSOLEMODE_HIGHLIGHT | OS_BSP_CONSOLEMODE_RED | OS_BSP_CONSOLEMODE_BLUE; Prefix = "TTF"; break; case UTASSERT_CASETYPE_NA: From b0cb76ed53473f77b1589744aea55ccf2a122848 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Mon, 11 Jan 2021 09:32:46 -0500 Subject: [PATCH 076/111] Fix #699, format printf correctly --- src/tests/select-test/select-test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c index bcdef177a..7f09b1db6 100644 --- a/src/tests/select-test/select-test.c +++ b/src/tests/select-test/select-test.c @@ -318,7 +318,7 @@ void TestSelectSingleRead(void) /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); - UtAssert_True(StateFlags == 0, "OS_SelectSingle() (%d) == None", StateFlags); + UtAssert_True(StateFlags == 0, "OS_SelectSingle() (0x%x) == None", (unsigned int)StateFlags); status = OS_BinSemGive(bin_sem_id); @@ -433,7 +433,7 @@ void TestSelectSingleWrite(void) expected = OS_ERROR_TIMEOUT; /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); - UtAssert_True(StateFlags == 0, "OS_SelectSingle() (%d) == None", StateFlags); + UtAssert_True(StateFlags == 0, "OS_SelectSingle() (0x%x) == None", (unsigned int)StateFlags); expected = OS_SUCCESS; StateFlags = OS_STREAM_STATE_WRITABLE; @@ -549,7 +549,7 @@ void TestSelectSingleFile(void) /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); - UtAssert_True(StateFlags == 0, "OS_SelectSingle() (%d) == None", StateFlags); + UtAssert_True(StateFlags == 0, "OS_SelectSingle() (0x%x) == None", (unsigned int)StateFlags); } void UtTest_Setup(void) From fa8067955ad6262c38a22548d2ee81b8ad1caae6 Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Wed, 13 Jan 2021 17:10:09 -0500 Subject: [PATCH 077/111] Bump to v5.1.0-rc1+dev184 Update ReadMe --- README.md | 26 ++++++++++++++++++++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 72d57a312..fe32818ce 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,32 @@ The autogenerated OSAL user's guide can be viewed at + ### Development Build: 5.1.0-rc1+dev149 - Document UtAssert_Message parameters, also adds "see also" note for helper macros. diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index 3b17e2e7d..d6945377e 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 149 +#define OS_BUILD_NUMBER 184 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* From 9074cf98260d987a8af166d40002cac3d3307dd7 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Tue, 5 Jan 2021 11:10:48 -0500 Subject: [PATCH 078/111] Fix #685, change file create to use read write --- src/tests/file-api-test/file-api-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index 2ff84524f..120c2a6f4 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -253,7 +253,7 @@ void TestChmod(void) /*Make a file to test on. Start in Read only mode */ strncpy(filename, "/drive0/Filename1", sizeof(filename) - 1); filename[sizeof(filename) - 1] = 0; - status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE, OS_READ_ONLY); + status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_CREATE , OS_READ_WRITE); UtAssert_True(status >= OS_SUCCESS, "status after creat = %d", (int)status); status = OS_close(fd); UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); From 0d4c3c75cdbcd91da9fe34cbf09724d968cc6ff0 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Thu, 14 Jan 2021 13:09:21 -0500 Subject: [PATCH 079/111] Fix #748, add additional casts --- src/tests/select-test/select-test.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c index 7f09b1db6..066064bfc 100644 --- a/src/tests/select-test/select-test.c +++ b/src/tests/select-test/select-test.c @@ -328,8 +328,8 @@ void TestSelectSingleRead(void) /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", - StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%x) == OS_STREAM_STATE_READABLE", + (unsigned int)StateFlags); } void TestSelectMultipleRead(void) @@ -441,8 +441,8 @@ void TestSelectSingleWrite(void) /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", - StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%x) == OS_STREAM_STATE_WRITABLE", + (unsigned int)StateFlags); } } @@ -532,16 +532,16 @@ void TestSelectSingleFile(void) /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", - StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%x) == OS_STREAM_STATE_READABLE", + (unsigned int)StateFlags); StateFlags = OS_STREAM_STATE_WRITABLE; actual = OS_SelectSingle(fd, &StateFlags, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", - StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%x) == OS_STREAM_STATE_WRITABLE", + (unsigned int)StateFlags); expected = OS_ERROR_TIMEOUT; StateFlags = OS_STREAM_STATE_BOUND; From 619e88ffb2ce97e6cf516377a1519084618711b1 Mon Sep 17 00:00:00 2001 From: Ariel Adams Date: Thu, 17 Dec 2020 11:52:58 -0600 Subject: [PATCH 080/111] Fix #743, Create Security Policy --- SECURITY.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..30252dba3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +## Reporting a Vulnerability + +To report a vulnerability for the OSAL subsystem please [submit an issue](https://github.com/nasa/osal/issues/new/choose). + +For general cFS vulnerabilities please [open a cFS framework issue](https://github.com/nasa/cfs/issues/new/choose) and see our [top-level security policy](https://github.com/nasa/cFS/security/policy). + +In either case please use the "Bug Report" template and provide as much information as possible. Apply appropraite labels for each report. For security related reports, tag the issue with the "security" label. + +## Additional Support + +For additional support, email us at cfs-program@lists.nasa.gov. For help using OSAL and cFS, [subscribe to our mailing list](https://lists.nasa.gov/mailman/listinfo/cfs-community) that includes all the community members/users of the NASA core Flight Software (cFS) product line. The mailing list is used to communicate any information related to the cFS product such as current releases, bug findings and fixes, enhancement requests, community meeting notifications, sending out meeting minutes, etc. + +If you wish to report a cybersecurity incident or concern please contact the NASA Security Operations Center either by phone at 1-877-627-2732 or via email address soc@nasa.gov. From 7e34a2c2242d6e75a75d5479ea65ca2aeac5cea2 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Wed, 30 Dec 2020 13:47:48 -0500 Subject: [PATCH 081/111] Fix #429, update OS_time_t definition to 64-bit ticks Use a single 64-bit tick counter as OS_time_t, rather than a split 32 bit seconds + 32 bit microseconds counter. This benefits in several ways: - increases the timing precision by 10x (0.1us ticks) - increases the representable range by 400x (+/-14000 yrs) - simplifies addition/subtraction (no carry over) - avoids "year 2038" bug w/32-bit timestamps --- src/os/inc/osapi-clock.h | 78 ++++++++++--------- .../shared/src/coveragetest-clock.c | 12 +-- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/src/os/inc/osapi-clock.h b/src/os/inc/osapi-clock.h index 30b7215e0..fa854209f 100644 --- a/src/os/inc/osapi-clock.h +++ b/src/os/inc/osapi-clock.h @@ -44,10 +44,29 @@ */ typedef struct { - uint32 seconds; - uint32 microsecs; + int64 ticks; /**< Ticks elapsed since reference point */ } OS_time_t; + +/** + * @brief Multipliers/divisors to convert ticks into standardized units + * + * Various fixed conversion factor constants used by the conversion routines + * + * A 100ns tick time allows max intervals of about +/- 14000 years in + * a 64-bit signed integer value. + * + * @note Applications should not directly use these values, but rather use + * conversion routines below to obtain standardized units (seconds/microseconds/etc). + */ +enum +{ + OS_TIME_TICK_RESOLUTION_NS = 100, + OS_TIME_TICKS_PER_SECOND = 1000000000 / OS_TIME_TICK_RESOLUTION_NS, + OS_TIME_TICKS_PER_MSEC = 1000000 / OS_TIME_TICK_RESOLUTION_NS, + OS_TIME_TICKS_PER_USEC = 1000 / OS_TIME_TICK_RESOLUTION_NS +}; + /** @defgroup OSAPIClock OSAL Real Time Clock APIs * @{ */ @@ -108,7 +127,7 @@ int32 OS_SetLocalTime(const OS_time_t *time_struct); */ static inline int64 OS_TimeGetTotalSeconds(OS_time_t tm) { - return (tm.seconds); + return (tm.ticks / OS_TIME_TICKS_PER_SECOND); } /*-------------------------------------------------------------------------------------*/ @@ -122,7 +141,7 @@ static inline int64 OS_TimeGetTotalSeconds(OS_time_t tm) */ static inline int64 OS_TimeGetTotalMilliseconds(OS_time_t tm) { - return (((int64)tm.seconds * 1000) + (tm.microsecs / 1000)); + return (tm.ticks / OS_TIME_TICKS_PER_MSEC); } /*-------------------------------------------------------------------------------------*/ @@ -136,7 +155,7 @@ static inline int64 OS_TimeGetTotalMilliseconds(OS_time_t tm) */ static inline int64 OS_TimeGetTotalMicroseconds(OS_time_t tm) { - return (((int64)tm.seconds * 1000000) + tm.microsecs); + return (tm.ticks / OS_TIME_TICKS_PER_USEC); } /*-------------------------------------------------------------------------------------*/ @@ -154,7 +173,7 @@ static inline int64 OS_TimeGetTotalMicroseconds(OS_time_t tm) */ static inline int64 OS_TimeGetTotalNanoseconds(OS_time_t tm) { - return (((int64)tm.seconds * 1000000000) + (tm.microsecs * 1000)); + return (tm.ticks * OS_TIME_TICK_RESOLUTION_NS); } /*-------------------------------------------------------------------------------------*/ @@ -169,7 +188,7 @@ static inline int64 OS_TimeGetTotalNanoseconds(OS_time_t tm) */ static inline int64 OS_TimeGetFractionalPart(OS_time_t tm) { - return (tm.microsecs); + return (tm.ticks % OS_TIME_TICKS_PER_SECOND); } /*-------------------------------------------------------------------------------------*/ @@ -194,7 +213,8 @@ static inline uint32 OS_TimeGetSubsecondsPart(OS_time_t tm) * It also must round up, otherwise this may result in a value one * less than the original when converted back to usec again. */ - return (((OS_TimeGetFractionalPart(tm) << 26) + 15624) / 15625); + int64 frac = (OS_TimeGetFractionalPart(tm) << 30) + (OS_TIME_TICKS_PER_SECOND >> 2); + return (uint32)((frac - 1) / (OS_TIME_TICKS_PER_SECOND >> 2)); } @@ -212,7 +232,7 @@ static inline uint32 OS_TimeGetSubsecondsPart(OS_time_t tm) */ static inline uint32 OS_TimeGetMillisecondsPart(OS_time_t tm) { - return OS_TimeGetFractionalPart(tm) / 1000; + return (uint32)OS_TimeGetFractionalPart(tm) / OS_TIME_TICKS_PER_MSEC; } /*-------------------------------------------------------------------------------------*/ @@ -237,7 +257,7 @@ static inline uint32 OS_TimeGetMillisecondsPart(OS_time_t tm) */ static inline uint32 OS_TimeGetMicrosecondsPart(OS_time_t tm) { - return OS_TimeGetFractionalPart(tm); + return (uint32)OS_TimeGetFractionalPart(tm) / OS_TIME_TICKS_PER_USEC; } /*-------------------------------------------------------------------------------------*/ @@ -256,7 +276,7 @@ static inline uint32 OS_TimeGetMicrosecondsPart(OS_time_t tm) */ static inline uint32 OS_TimeGetNanosecondsPart(OS_time_t tm) { - return OS_TimeGetFractionalPart(tm) * 1000; + return (uint32)OS_TimeGetFractionalPart(tm) * OS_TIME_TICK_RESOLUTION_NS; } /*-------------------------------------------------------------------------------------*/ @@ -278,8 +298,8 @@ static inline uint32 OS_TimeGetNanosecondsPart(OS_time_t tm) static inline OS_time_t OS_TimeAssembleFromNanoseconds(int64 seconds, uint32 nanoseconds) { OS_time_t result; - result.seconds = seconds; - result.microsecs = nanoseconds / 1000; + result.ticks = seconds * OS_TIME_TICKS_PER_SECOND; + result.ticks += nanoseconds / OS_TIME_TICK_RESOLUTION_NS; return result; } @@ -302,8 +322,8 @@ static inline OS_time_t OS_TimeAssembleFromNanoseconds(int64 seconds, uint32 nan static inline OS_time_t OS_TimeAssembleFromMicroseconds(int64 seconds, uint32 microseconds) { OS_time_t result; - result.seconds = seconds; - result.microsecs = microseconds; + result.ticks = seconds * OS_TIME_TICKS_PER_SECOND; + result.ticks += microseconds * OS_TIME_TICKS_PER_USEC; return result; } @@ -326,8 +346,8 @@ static inline OS_time_t OS_TimeAssembleFromMicroseconds(int64 seconds, uint32 mi static inline OS_time_t OS_TimeAssembleFromMilliseconds(int64 seconds, uint32 milliseconds) { OS_time_t result; - result.seconds = seconds; - result.microsecs = milliseconds * 1000; + result.ticks = seconds * OS_TIME_TICKS_PER_SECOND; + result.ticks += milliseconds * OS_TIME_TICKS_PER_MSEC; return result; } @@ -350,9 +370,9 @@ static inline OS_time_t OS_TimeAssembleFromMilliseconds(int64 seconds, uint32 mi static inline OS_time_t OS_TimeAssembleFromSubseconds(int64 seconds, uint32 subseconds) { OS_time_t result; - result.seconds = seconds; + result.ticks = seconds * OS_TIME_TICKS_PER_SECOND; /* this should not round in any way, as the 32-bit input value has higher precision */ - result.microsecs = ((int64)subseconds * 15625) >> 26; + result.ticks += ((int64)subseconds * (OS_TIME_TICKS_PER_SECOND >> 2)) >> 30; return result; } @@ -367,15 +387,7 @@ static inline OS_time_t OS_TimeAssembleFromSubseconds(int64 seconds, uint32 subs */ static inline OS_time_t OS_TimeAdd(OS_time_t time1, OS_time_t time2) { - OS_time_t result = time1; - result.seconds += time2.seconds; - result.microsecs += time2.microsecs; - if (result.microsecs >= 1000000) - { - ++result.seconds; - result.microsecs -= 1000000; - } - return result; + return ((OS_time_t) { time1.ticks + time2.ticks }); } /*-------------------------------------------------------------------------------------*/ @@ -389,15 +401,7 @@ static inline OS_time_t OS_TimeAdd(OS_time_t time1, OS_time_t time2) */ static inline OS_time_t OS_TimeSubtract(OS_time_t time1, OS_time_t time2) { - OS_time_t result = time1; - result.seconds -= time2.seconds; - result.microsecs -= time2.microsecs; - if (result.microsecs >= 1000000) - { - --result.seconds; - result.microsecs += 1000000; - } - return result; + return ((OS_time_t) { time1.ticks - time2.ticks }); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-clock.c b/src/unit-test-coverage/shared/src/coveragetest-clock.c index 20959c987..8c7685c9f 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-clock.c +++ b/src/unit-test-coverage/shared/src/coveragetest-clock.c @@ -118,14 +118,14 @@ void Test_OS_TimeAccessConversions(void) UtAssert_UINT32_EQ(OS_TimeGetTotalMicroseconds(t4), 1901000); /* Note: Nanoseconds/Subseconds may not be exact due to limitations of OS_time_t resolution */ - UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t1), 1234567000); - UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t2), 2528888000); + UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t1), 1234567800); + UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t2), 2528888800); UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t3), 45678000); UtAssert_UINT32_EQ(OS_TimeGetTotalNanoseconds(t4), 1901000000); /* These functions only return the fractional part, not the whole part */ - UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t1), 0x3c0c953a); - UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t2), 0x87653438); + UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t1), 0x3c0ca2a6); + UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t2), 0x876541a4); UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t3), 0x0bb18dad); UtAssert_UINT32_EQ(OS_TimeGetSubsecondsPart(t4), 0xe6a7ef9e); @@ -139,8 +139,8 @@ void Test_OS_TimeAccessConversions(void) UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t3), 45678); UtAssert_UINT32_EQ(OS_TimeGetMicrosecondsPart(t4), 901000); - UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t1), 234567000); - UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t2), 528888000); + UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t1), 234567800); + UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t2), 528888800); UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t3), 45678000); UtAssert_UINT32_EQ(OS_TimeGetNanosecondsPart(t4), 901000000); From 8c7535c523aa140b3a5d43e674ba42c8345a16ad Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Thu, 14 Jan 2021 17:08:48 -0500 Subject: [PATCH 082/111] Fix #718, deprecate OS_fsBlocksFree and OS_fsBytesFree Users should call OS_FileSysStatVolume() and read the respective output members of the structure as indicated. --- src/os/inc/osapi-filesys.h | 11 + src/os/shared/src/osapi-filesys.c | 4 + .../shared/src/coveragetest-filesys.c | 77 ------- .../osfilesys-test/ut_osfilesys_diskio_test.c | 217 ------------------ .../osfilesys-test/ut_osfilesys_diskio_test.h | 2 - .../osfilesys-test/ut_osfilesys_test.c | 2 - src/ut-stubs/osapi-utstub-filesys.c | 4 + 7 files changed, 19 insertions(+), 298 deletions(-) diff --git a/src/os/inc/osapi-filesys.h b/src/os/inc/osapi-filesys.h index 8e37bdfb4..b0f719ce3 100644 --- a/src/os/inc/osapi-filesys.h +++ b/src/os/inc/osapi-filesys.h @@ -189,6 +189,8 @@ int32 OS_rmfs(const char *devname); */ int32 OS_unmount(const char *mountpoint); +#ifndef OSAL_OMIT_DEPRECATED + /*-------------------------------------------------------------------------------------*/ /** * @brief Obtain number of blocks free @@ -201,6 +203,10 @@ int32 OS_unmount(const char *mountpoint); * @retval #OS_INVALID_POINTER if name is NULL * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long * @retval #OS_ERROR if the OS call failed + * + * @deprecated Replaced by OS_FileSysStatVolume() - + * Value can be obtained by reading the "blocks_free" struct member. + * */ int32 OS_fsBlocksFree(const char *name); @@ -221,9 +227,14 @@ int32 OS_fsBlocksFree(const char *name); * @retval #OS_INVALID_POINTER if name is NULL * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long * @retval #OS_ERROR if the OS call failed + * + * @deprecated Replaced by OS_FileSysStatVolume(). + * Value can be obtained by multiplying the "blocks_free" by the "block_size" struct members. */ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free); +#endif /* OSAL_OMIT_DEPRECATED */ + /*-------------------------------------------------------------------------------------*/ /** * @brief Obtains information about size and free space in a volume diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index 135e4ca77..6db99f794 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -533,6 +533,8 @@ int32 OS_unmount(const char *mountpoint) return return_code; } /* end OS_unmount */ +#ifndef OSAL_OMIT_DEPRECATED + /*---------------------------------------------------------------- * * Function: OS_fsBlocksFree @@ -616,6 +618,8 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) } /* end OS_fsBytesFree */ +#endif /* OSAL_OMIT_DEPRECATED */ + /*---------------------------------------------------------------- * * Function: OS_FileSysStatVolume diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 6d3c7191b..8d3180866 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -253,81 +253,6 @@ void Test_OS_unmount(void) UtAssert_True(actual == expected, "OS_unmount() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); } -void Test_OS_fsBlocksFree(void) -{ - /* - * Test Case For: - * int32 OS_fsBlocksFree (const char *name) - */ - int32 expected = 1111; - int32 actual = ~OS_SUCCESS; - OS_statvfs_t statval; - - statval.block_size = OSAL_SIZE_C(1024); - statval.blocks_free = OSAL_BLOCKCOUNT_C(1111); - statval.total_blocks = OSAL_BLOCKCOUNT_C(2222); - UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statval, sizeof(statval), false); - OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | - OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; - - actual = OS_fsBlocksFree("/cf"); - UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == 1111", (long)actual); - - expected = OS_INVALID_POINTER; - actual = OS_fsBlocksFree(NULL); - UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_INVALID_POINTER", (long)actual); - - UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); - expected = OS_FS_ERR_PATH_TOO_LONG; - actual = OS_fsBlocksFree("/cf"); - UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); - - UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); - expected = OS_FS_ERR_PATH_INVALID; - actual = OS_fsBlocksFree("invalid"); - UtAssert_True(actual == expected, "OS_fsBlocksFree() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); -} - -void Test_OS_fsBytesFree(void) -{ - /* - * Test Case For: - * int32 OS_fsBytesFree (const char *name, uint64 *bytes_free) - */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - OS_statvfs_t statval; - uint64 bytes_free = 0; - - statval.block_size = OSAL_SIZE_C(1024); - statval.blocks_free = OSAL_BLOCKCOUNT_C(1111); - statval.total_blocks = OSAL_BLOCKCOUNT_C(2222); - UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statval, sizeof(statval), false); - OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | - OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; - - actual = OS_fsBytesFree("/cf", &bytes_free); - - UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(bytes_free == (1024 * 1111), "bytes_free (%lu) == (1024*1111)", (unsigned long)bytes_free); - - expected = OS_INVALID_POINTER; - actual = OS_fsBytesFree(NULL, NULL); - UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_INVALID_POINTER", (long)actual); - - UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); - expected = OS_FS_ERR_PATH_TOO_LONG; - actual = OS_fsBytesFree("/cf", &bytes_free); - UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); - - UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); - expected = OS_FS_ERR_PATH_INVALID; - actual = OS_fsBytesFree("invalid", &bytes_free); - UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); -} - void Test_OS_FileSysStatVolume(void) { /* @@ -625,8 +550,6 @@ void UtTest_Setup(void) ADD_TEST(OS_initfs); ADD_TEST(OS_mount); ADD_TEST(OS_unmount); - ADD_TEST(OS_fsBlocksFree); - ADD_TEST(OS_fsBytesFree); ADD_TEST(OS_chkfs); ADD_TEST(OS_FS_GetPhysDriveName); ADD_TEST(OS_GetFsInfo); diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c index 410e1efbf..e9938c84a 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c @@ -1053,223 +1053,6 @@ void UT_os_checkfs_test() return; } -/*--------------------------------------------------------------------------------* -** Syntax: int32 OS_fsBlocksFree(const char *name) -** Purpose: Returns the number of blocks free in a the file system -** Parameters: *name - a pointer to the name of the drive to check for free blocks -** Returns: OS_INVALID_POINTER if the pointer passed in is NULL -** OS_FS_ERR_PATH_TOO_LONG if the path passed in is too long -** OS_ERROR if the OS call failed -** Number of blocks free in a volume if succeeded -** OS_ERR_NOT_IMPLEMENTED if not implemented -** ----------------------------------------------------- -** Test #0: Not-implemented condition -** 1) Call this routine -** 2) If the returned value is OS_ERR_NOT_IMPLEMENTED, then exit test -** 3) Otherwise, continue. -** ----------------------------------------------------- -** Test #1: Null-pointer-arg condition -** 1) Call this routine with a null pointer as one of the arguments -** 2) Expect the returned value to be -** (a) OS_INVALID_POINTER -** ----------------------------------------------------- -** Test #2: Path-too-long-arg condition -** 1) Call this routine with a path name of length greater than Volume table's -** name as argument -** 2) Expect the returned value to be -** (a) OS_FS_ERR_PATH_TOO_LONG -** ----------------------------------------------------- -** Test #3: OS-call-failure condition -** 1) Setup the test to cause the OS call to fail inside this routine -** 2) Call this routine -** 3) Expect the returned value to be -** (a) OS_ERROR -** ----------------------------------------------------- -** Test#4: Nominal condition -** 1) Make sure no file system has been previously created -** 2) Call OS_mkfs -** 3) Expect the returned value to be -** (a) OS_SUCCESS -** 4) Call OS_mount with device name used in #2 -** 5) Expect the returned value to be -** (a) OS_SUCCESS -** 6) Call this routine with mount-point used in #4 -** 7) Expect the returned value to be -** (a) greater than or equal to 0 -** --------------------------------------------------------------------------------*/ -void UT_os_fsblocksfree_test() -{ - const char *testDesc; - - /*-----------------------------------------------------*/ - testDesc = "API not implemented"; - - if (OS_fsBlocksFree(NULL) == OS_ERR_NOT_IMPLEMENTED) - { - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); - goto UT_os_fsblocksfree_test_exit_tag; - } - - /*-----------------------------------------------------*/ - testDesc = "#1 Null-pointer-arg"; - - if (OS_fsBlocksFree(NULL) == OS_INVALID_POINTER) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - - /*-----------------------------------------------------*/ - testDesc = "#2 Path-too-long-arg"; - - if (OS_fsBlocksFree(g_fsLongName) == OS_FS_ERR_PATH_TOO_LONG) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - - /*-----------------------------------------------------*/ - testDesc = "#3 OS-call-failure"; - - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_INFO); - - /*-----------------------------------------------------*/ - testDesc = "#4 Nominal"; - - if (OS_mkfs(g_fsAddrPtr, g_devNames[4], g_volNames[4], g_blkSize, g_blkCnt) != OS_SUCCESS) - { - testDesc = "#4 Nominal - File-system-create failed"; - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_TSF); - goto UT_os_fsblocksfree_test_exit_tag; - } - - if (OS_mount(g_devNames[4], g_mntNames[4]) != OS_SUCCESS) - { - testDesc = "#4 Nominal - File-system-mount failed"; - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_TSF); - goto UT_os_fsblocksfree_test_exit_tag; - } - - if (OS_fsBlocksFree(g_mntNames[4]) >= 0) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - - /* Reset test environment */ - OS_unmount(g_mntNames[4]); - OS_rmfs(g_devNames[4]); - -UT_os_fsblocksfree_test_exit_tag: - return; -} - -/*--------------------------------------------------------------------------------* -** Syntax: int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) -** Purpose: Returns the number of bytes free in a the file system -** Parameters: *name - a pointer to the name of the drive to check for free bytes -** *bytes_free - a pointer that will hold the number of bytes free -** Returns: OS_INVALID_POINTER if the pointer passed in is NULL -** OS_ERROR if the OS call failed -** OS_SUCCESS if succeeded -** OS_ERR_NOT_IMPLEMENTED if not implemented -** ----------------------------------------------------- -** Test #0: Not-implemented condition -** 1) Call this routine -** 2) If the returned value is OS_ERR_NOT_IMPLEMENTED, then exit test -** 3) Otherwise, continue. -** ----------------------------------------------------- -** Test #1: Null-pointer-arg condition -** 1) Call this routine with a null pointer as one of the arguments -** 2) Expect the returned value to be -** (a) OS_INVALID_POINTER -** ----------------------------------------------------- -** Test #2: Path-too-long-arg condition -** 1) Call this routine with a path name of length greater than Volume table's -** name as argument -** 2) Expect the returned value to be -** (a) OS_FS_ERR_PATH_TOO_LONG -** ----------------------------------------------------- -** Test #3: OS-call-failure condition -** 1) Setup the test to cause the OS call to fail inside this routine -** 2) Call this routine -** 3) Expect the returned value to be -** (a) OS_ERROR -** ----------------------------------------------------- -** Test#4: Nominal condition -** 1) Make sure no file system has been previously created -** 2) Call OS_mkfs -** 3) Expect the returned value to be -** (a) OS_SUCCESS -** 4) Call OS_mount with device name used in #2 -** 5) Expect the returned value to be -** (a) OS_SUCCESS -** 6) Call this routine with mount-point used in #4 -** 7) Expect the returned value to be -** (a) greater than or equal to 0 -** --------------------------------------------------------------------------------*/ -void UT_os_fsbytesfree_test() -{ - uint64 retBytes = 0; - const char *testDesc; - - /*-----------------------------------------------------*/ - testDesc = "API not implemented"; - - if (OS_fsBytesFree(NULL, NULL) == OS_ERR_NOT_IMPLEMENTED) - { - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_NA); - goto UT_os_fsbytesfree_test_exit_tag; - } - - /*-----------------------------------------------------*/ - testDesc = "#1 Null-pointer-arg"; - - if ((OS_fsBytesFree(NULL, &retBytes) == OS_INVALID_POINTER) && - (OS_fsBytesFree(g_mntNames[1], NULL) == OS_INVALID_POINTER)) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - - /*-----------------------------------------------------*/ - testDesc = "#2 Path-too-long-arg"; - - if (OS_fsBytesFree(g_fsLongName, &retBytes) == OS_FS_ERR_PATH_TOO_LONG) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - - /*-----------------------------------------------------*/ - testDesc = "#3 OS-call-failure"; - - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_INFO); - - /*-----------------------------------------------------*/ - testDesc = "#4 Nominal"; - - if (OS_mkfs(g_fsAddrPtr, g_devNames[4], g_volNames[4], g_blkSize, g_blkCnt) != OS_SUCCESS) - { - testDesc = "#4 Nominal - File-system-create failed"; - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_TSF); - goto UT_os_fsbytesfree_test_exit_tag; - } - - if (OS_mount(g_devNames[4], g_mntNames[4]) != OS_SUCCESS) - { - testDesc = "#4 Nominal - File-system-mount failed"; - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_TSF); - goto UT_os_fsbytesfree_test_exit_tag; - } - - if (OS_fsBytesFree(g_mntNames[4], &retBytes) == OS_SUCCESS) - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_PASS); - else - UT_OS_TEST_RESULT(testDesc, UTASSERT_CASETYPE_FAILURE); - - /* Reset test environment */ - OS_unmount(g_mntNames[4]); - OS_rmfs(g_devNames[4]); - -UT_os_fsbytesfree_test_exit_tag: - return; -} /*--------------------------------------------------------------------------------* ** Syntax: int32 OS_fsstatvolume(const char *name) diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h index f1420c68c..b9141a773 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h @@ -69,8 +69,6 @@ void UT_os_translatepath_test(void); void UT_os_checkfs_test(void); -void UT_os_fsblocksfree_test(void); -void UT_os_fsbytesfree_test(void); void UT_os_fsstatvolume_test(void); /*--------------------------------------------------------------------------------*/ diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c index 3850eff52..5a8496d72 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c @@ -135,8 +135,6 @@ void UtTest_Setup(void) UtTest_Add(UT_os_translatepath_test, NULL, NULL, "OS_TranslatePath (internal)"); UtTest_Add(UT_os_checkfs_test, NULL, NULL, "OS_chkfs"); - UtTest_Add(UT_os_fsblocksfree_test, NULL, NULL, "OS_fsBlocksFree"); - UtTest_Add(UT_os_fsbytesfree_test, NULL, NULL, "OS_fsBytesFree"); UtTest_Add(UT_os_fsstatvolume_test, NULL, NULL, "OS_FileSysStatVolume"); } diff --git a/src/ut-stubs/osapi-utstub-filesys.c b/src/ut-stubs/osapi-utstub-filesys.c index b696751e5..f0f4d6175 100644 --- a/src/ut-stubs/osapi-utstub-filesys.c +++ b/src/ut-stubs/osapi-utstub-filesys.c @@ -153,6 +153,8 @@ int32 OS_unmount(const char *mountpoint) return status; } +#ifndef OSAL_OMIT_DEPRECATED + /***************************************************************************** * * Stub function for OS_fsBlocksFree() @@ -192,6 +194,8 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) return status; } +#endif /* OSAL_OMIT_DEPRECATED */ + /***************************************************************************** * * Stub function for OS_FileSysStatVolume() From 08693ccf8dd0ec22640978509b9e7546bc5bd9bc Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Fri, 15 Jan 2021 10:20:07 -0500 Subject: [PATCH 083/111] Fix #761, Terminate string in TestReadWriteLseek --- src/tests/file-api-test/file-api-test.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index 2ff84524f..406ba66eb 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -330,7 +330,8 @@ void TestReadWriteLseek(void) status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE, OS_READ_WRITE); UtAssert_True(status >= OS_SUCCESS, "status after creat = %d", (int)status); - size = strlen(buffer); + /* Write the string including null character */ + size = strlen(buffer) + 1; /* test write portion of R/W mode */ status = OS_write(fd, (void *)buffer, size); From abebf1ce76efb00e2d7ad28dd0f6879590e13adf Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Wed, 20 Jan 2021 13:03:27 -0500 Subject: [PATCH 084/111] Fix #742, make sure all pointers are checked for null --- src/os/shared/src/osapi-binsem.c | 6 +- src/os/shared/src/osapi-clock.c | 4 +- src/os/shared/src/osapi-common.c | 9 ++ src/os/shared/src/osapi-countsem.c | 6 +- src/os/shared/src/osapi-debug.c | 4 + src/os/shared/src/osapi-dir.c | 4 +- src/os/shared/src/osapi-errors.c | 1 + src/os/shared/src/osapi-file.c | 3 + src/os/shared/src/osapi-filesys.c | 14 ++- src/os/shared/src/osapi-heap.c | 1 + src/os/shared/src/osapi-idmap.c | 89 ++++++++++++++++++- src/os/shared/src/osapi-module.c | 25 ++++-- src/os/shared/src/osapi-printf.c | 9 ++ src/os/shared/src/osapi-select.c | 6 ++ src/os/shared/src/osapi-sockets.c | 15 +++- src/os/shared/src/osapi-task.c | 10 ++- src/os/shared/src/osapi-time.c | 5 ++ src/os/shared/src/osapi-timebase.c | 4 + .../shared/src/coveragetest-idmap.c | 8 +- 19 files changed, 198 insertions(+), 25 deletions(-) diff --git a/src/os/shared/src/osapi-binsem.c b/src/os/shared/src/osapi-binsem.c index 49510ae1c..1461f8aeb 100644 --- a/src/os/shared/src/osapi-binsem.c +++ b/src/os/shared/src/osapi-binsem.c @@ -100,7 +100,7 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia OS_object_token_t token; OS_bin_sem_internal_record_t *binsem; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(sem_id); OS_CHECK_APINAME(sem_name); @@ -255,7 +255,7 @@ int32 OS_BinSemGetIdByName(osal_id_t *sem_id, const char *sem_name) { int32 return_code; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(sem_id); OS_CHECK_POINTER(sem_name); @@ -278,7 +278,7 @@ int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) OS_object_token_t token; int32 return_code; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(bin_prop); memset(bin_prop, 0, sizeof(OS_bin_sem_prop_t)); diff --git a/src/os/shared/src/osapi-clock.c b/src/os/shared/src/osapi-clock.c index 1aec8bfc8..d5a844376 100644 --- a/src/os/shared/src/osapi-clock.c +++ b/src/os/shared/src/osapi-clock.c @@ -50,7 +50,7 @@ *-----------------------------------------------------------------*/ int32 OS_GetLocalTime(OS_time_t *time_struct) { - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(time_struct); return OS_GetLocalTime_Impl(time_struct); @@ -67,7 +67,7 @@ int32 OS_GetLocalTime(OS_time_t *time_struct) *-----------------------------------------------------------------*/ int32 OS_SetLocalTime(const OS_time_t *time_struct) { - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(time_struct); return OS_SetLocalTime_Impl(time_struct); diff --git a/src/os/shared/src/osapi-common.c b/src/os/shared/src/osapi-common.c index 62a5a433b..e2832d6cd 100644 --- a/src/os/shared/src/osapi-common.c +++ b/src/os/shared/src/osapi-common.c @@ -80,6 +80,12 @@ int32 OS_NotifyEvent(OS_Event_t event, osal_id_t object_id, void *data) { int32 status; + /* + * Check parameters + * + * Note "data" is not checked, because in certain configurations it can be validly null. + */ + if (OS_SharedGlobalVars.EventHandler != NULL) { status = OS_SharedGlobalVars.EventHandler(event, object_id, data); @@ -276,6 +282,9 @@ void OS_CleanUpObject(osal_id_t object_id, void *arg) { uint32 *ObjectCount; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(arg); + ObjectCount = (uint32 *)arg; ++(*ObjectCount); switch (OS_IdentifyObject(object_id)) diff --git a/src/os/shared/src/osapi-countsem.c b/src/os/shared/src/osapi-countsem.c index 9afcd2850..10ec1c461 100644 --- a/src/os/shared/src/osapi-countsem.c +++ b/src/os/shared/src/osapi-countsem.c @@ -92,7 +92,7 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init OS_object_token_t token; OS_count_sem_internal_record_t *countsem; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(sem_id); OS_CHECK_APINAME(sem_name); @@ -224,7 +224,7 @@ int32 OS_CountSemGetIdByName(osal_id_t *sem_id, const char *sem_name) { int32 return_code; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(sem_id); OS_CHECK_POINTER(sem_name); @@ -247,7 +247,7 @@ int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) OS_object_token_t token; int32 return_code; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(count_prop); memset(count_prop, 0, sizeof(OS_count_sem_prop_t)); diff --git a/src/os/shared/src/osapi-debug.c b/src/os/shared/src/osapi-debug.c index f6eef77ac..cd1b31c9d 100644 --- a/src/os/shared/src/osapi-debug.c +++ b/src/os/shared/src/osapi-debug.c @@ -55,6 +55,10 @@ void OS_DebugPrintf(uint32 Level, const char *Func, uint32 Line, const char *For { va_list va; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(Func); + //OS_CHECK_POINTER(Format); + if (OS_SharedGlobalVars.DebugLevel >= Level) { va_start(va, Format); diff --git a/src/os/shared/src/osapi-dir.c b/src/os/shared/src/osapi-dir.c index 06f55cdb3..7566aa606 100644 --- a/src/os/shared/src/osapi-dir.c +++ b/src/os/shared/src/osapi-dir.c @@ -118,7 +118,7 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) OS_dir_internal_record_t *dir; int32 return_code; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(dir_id); return_code = OS_TranslatePath(path, local_path); @@ -183,7 +183,7 @@ int32 OS_DirectoryRead(osal_id_t dir_id, os_dirent_t *dirent) OS_object_token_t token; int32 return_code; - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(dirent); /* Make sure the file descriptor is legit before using it */ diff --git a/src/os/shared/src/osapi-errors.c b/src/os/shared/src/osapi-errors.c index ddfe12f9b..c20c2bb66 100644 --- a/src/os/shared/src/osapi-errors.c +++ b/src/os/shared/src/osapi-errors.c @@ -101,6 +101,7 @@ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) uint32 return_code; const OS_ErrorTable_Entry_t *Error; + /* Check parameters */ OS_CHECK_POINTER(err_name); Error = OS_GLOBAL_ERROR_NAME_TABLE; diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 1db28e3da..13c46d9f8 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -112,6 +112,7 @@ int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 acc OS_object_token_t token; OS_stream_internal_record_t *stream; + /* Check parameters */ OS_CHECK_POINTER(filedes); /* @@ -630,6 +631,7 @@ int32 OS_FileOpenCheck(const char *Filename) OS_object_iter_t iter; OS_stream_internal_record_t *stream; + /* Check parameters */ OS_CHECK_POINTER(Filename); return_code = OS_ERROR; @@ -666,6 +668,7 @@ int32 OS_CloseFileByName(const char *Filename) OS_object_iter_t iter; OS_stream_internal_record_t *stream; + /* Check parameters */ OS_CHECK_POINTER(Filename); return_code = OS_FS_ERR_PATH_INVALID; diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index 135e4ca77..e75bcbce9 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -75,6 +75,9 @@ const char OS_FILESYS_RAMDISK_VOLNAME_PREFIX[] = "RAM"; *-----------------------------------------------------------------*/ bool OS_FileSysFilterFree(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { + /* Check parameters */ + OS_CHECK_POINTER(obj); + return !OS_ObjectIdDefined(obj->active_id); } @@ -91,6 +94,10 @@ bool OS_FileSysFilterFree(void *ref, const OS_object_token_t *token, const OS_co *-----------------------------------------------------------------*/ bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { + /* Check parameters */ + OS_CHECK_POINTER(ref); + OS_CHECK_POINTER(token); + OS_filesys_internal_record_t *filesys; const char * target = (const char *)ref; size_t mplen; @@ -126,7 +133,9 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs OS_object_token_t token; /* - ** Check parameters + * Check parameters + * + * Note "address" is not checked, because in certain configurations it can be validly null. */ OS_CHECK_STRING(fsdevname, sizeof(filesys->device_name), OS_FS_ERR_PATH_TOO_LONG); OS_CHECK_STRING(fsvolname, sizeof(filesys->volume_name), OS_FS_ERR_PATH_TOO_LONG); @@ -350,6 +359,7 @@ int32 OS_rmfs(const char *devname) int32 return_code; OS_object_token_t token; + /* Check parameters */ OS_CHECK_PATHNAME(devname); return_code = OS_ObjectIdGetByName(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, devname, &token); @@ -782,7 +792,7 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) /* ** Check to see if the path pointers are NULL */ - /* Check inputs */ + /* Check parameters */ OS_CHECK_POINTER(VirtualPath); OS_CHECK_POINTER(LocalPath); diff --git a/src/os/shared/src/osapi-heap.c b/src/os/shared/src/osapi-heap.c index 15ec6750e..888d0d7ec 100644 --- a/src/os/shared/src/osapi-heap.c +++ b/src/os/shared/src/osapi-heap.c @@ -50,6 +50,7 @@ *-----------------------------------------------------------------*/ int32 OS_HeapGetInfo(OS_heap_prop_t *heap_prop) { + /* Check parameters */ OS_CHECK_POINTER(heap_prop); return OS_HeapGetInfo_Impl(heap_prop); diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index a8fb26c4b..b9aba03bd 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -243,7 +243,11 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) *-----------------------------------------------------------------*/ bool OS_ForEachFilterCreator(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - OS_creator_filter_t *filter = ref; + /* Check parameters */ + OS_CHECK_POINTER(ref); + OS_CHECK_POINTER(obj); + + OS_creator_filter_t *filter = ref; /* * Check if the obj_id is both valid and matches @@ -263,6 +267,9 @@ bool OS_ForEachFilterCreator(void *ref, const OS_object_token_t *token, const OS *-----------------------------------------------------------------*/ int32 OS_ForEachDoCallback(osal_id_t obj_id, void *ref) { + /* Check parameters */ + OS_CHECK_POINTER(ref); + OS_creator_filter_t *filter = ref; /* Just invoke the user callback */ @@ -283,6 +290,9 @@ int32 OS_ForEachDoCallback(osal_id_t obj_id, void *ref) *-----------------------------------------------------------------*/ OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) { + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(token); + uint32 base_idx = OS_GetBaseForObjectType(token->obj_type); return &OS_common_table[base_idx + token->obj_idx]; } @@ -303,6 +313,11 @@ OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) *-----------------------------------------------------------------*/ bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { + /* Check parameters */ + OS_CHECK_POINTER(ref); + OS_CHECK_POINTER(token); + OS_CHECK_POINTER(obj); + return (obj->name_entry != NULL && strcmp((const char *)ref, obj->name_entry) == 0); } /* end OS_ObjectNameMatch */ @@ -324,6 +339,9 @@ bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_comm *-----------------------------------------------------------------*/ int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_object_token_t *token) { + /* Check parameters */ + OS_CHECK_POINTER(token); + memset(token, 0, sizeof(*token)); if (OS_SharedGlobalVars.Initialized == false) @@ -372,6 +390,9 @@ int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype *-----------------------------------------------------------------*/ void OS_ObjectIdTransactionCancel(OS_object_token_t *token) { + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(token); + if (token->lock_mode != OS_LOCK_MODE_NONE) { OS_Unlock_Global(token); @@ -424,6 +445,9 @@ int32 OS_ObjectIdConvertToken(OS_object_token_t *token) OS_common_record_t *obj; osal_id_t expected_id; + /* Check parameters */ + OS_CHECK_POINTER(token); + obj = OS_ObjectIdGlobalFromToken(token); expected_id = OS_ObjectIdFromToken(token); @@ -583,6 +607,13 @@ int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_obj OS_common_record_t *base; OS_common_record_t *record; + /* + * Check parameters + * + * Note "arg" is not checked, because in certain configurations it can be validly null. + */ + OS_CHECK_POINTER(token); + return_code = OS_ERR_NAME_NOT_FOUND; base = &OS_common_table[OS_GetBaseForObjectType(token->obj_type)]; obj_count = OS_GetMaxForObjectType(token->obj_type); @@ -638,6 +669,9 @@ int32 OS_ObjectIdFindNextFree(OS_object_token_t *token) OS_common_record_t *obj = NULL; OS_objtype_state_t *objtype_state; + /* Check parameters */ + OS_CHECK_POINTER(token); + base_id = OS_GetBaseForObjectType(token->obj_type); max_id = OS_GetMaxForObjectType(token->obj_type); objtype_state = &OS_objtype_state[token->obj_type]; @@ -716,6 +750,9 @@ void OS_Lock_Global(OS_object_token_t *token) osal_id_t self_task_id; OS_objtype_state_t *objtype; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(token); + if (token->obj_type < OS_OBJECT_TYPE_USER && token->lock_mode != OS_LOCK_MODE_NONE) { objtype = &OS_objtype_state[token->obj_type]; @@ -779,6 +816,9 @@ void OS_Unlock_Global(OS_object_token_t *token) { OS_objtype_state_t *objtype; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(token); + if (token->obj_type < OS_OBJECT_TYPE_USER && token->lock_mode != OS_LOCK_MODE_NONE) { objtype = &OS_objtype_state[token->obj_type]; @@ -827,6 +867,9 @@ void OS_WaitForStateChange(OS_object_token_t *token, uint32 attempts) osal_key_t saved_unlock_key; OS_objtype_state_t *objtype; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(token); + /* * This needs to release the lock, to allow other * tasks to make a change to the table. But to avoid @@ -876,6 +919,13 @@ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, o { osal_id_t final_id; + /* + * Check parameters + * + * Note "outid" is not checked, because in certain configurations it can be validly null. + */ + OS_CHECK_POINTER(token); + /* if operation was unsuccessful, then clear * the active_id field within the record, so * the record can be re-used later. @@ -920,6 +970,9 @@ int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_object_token_t *token { osal_id_t final_id; + /* Check parameters */ + OS_CHECK_POINTER(token); + /* Clear the OSAL ID if successful - this returns the record to the pool */ if (operation_status == OS_SUCCESS) { @@ -1019,6 +1072,9 @@ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t * int32 return_code; OS_object_token_t token; + /* Check parameters */ + OS_CHECK_POINTER(object_id); + /* * As this is an internal-only function, calling it will NULL is allowed. * This is required by the file/dir/socket API since these DO allow multiple @@ -1107,6 +1163,14 @@ void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id) { OS_common_record_t *record; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + /* + * Check parameters + * + * Note "final_id" is not checked, because in certain configurations it can be validly null. + */ + //OS_CHECK_POINTER(token); + if (token->lock_mode == OS_LOCK_MODE_NONE) { /* nothing to do */ @@ -1278,6 +1342,10 @@ int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, OS_object_ ------------------------------------------------------------------*/ void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t *token_to) { + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(token_to); + //OS_CHECK_POINTER(token_from); + /* start with a simple copy */ *token_to = *token_from; @@ -1297,6 +1365,13 @@ void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t * int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, osal_objtype_t objtype, OS_object_iter_t *iter) { + /* + * Check parameters + * + * Note "matcharg" is not checked, because in certain configurations it can be validly null. + */ + OS_CHECK_POINTER(iter); + iter->match = matchfunc; iter->arg = matcharg; iter->limit = OS_GetMaxForObjectType(objtype); @@ -1312,6 +1387,9 @@ int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, os ------------------------------------------------------------------*/ bool OS_ObjectFilterActive(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { + /* Check parameters */ + OS_CHECK_POINTER(obj); + return OS_ObjectIdDefined(obj->active_id); } @@ -1334,6 +1412,8 @@ bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter) { OS_common_record_t *record; bool got_next; + + OS_CHECK_POINTER(iter); got_next = false; iter->token.obj_id = OS_OBJECT_ID_UNDEFINED; @@ -1376,6 +1456,10 @@ int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal { int32 status; + /* Check parameters */ + OS_CHECK_POINTER(iter); + OS_CHECK_POINTER(func); + /* * This needs to temporarily unlock the global, * call the handler function, then re-lock. @@ -1438,6 +1522,9 @@ void OS_ForEachObjectOfType(osal_objtype_t idtype, osal_id_t creator_id, OS_ArgC OS_object_iter_t iter; OS_creator_filter_t filter; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(callback_arg) + filter.creator_id = creator_id; filter.user_callback = callback_ptr; filter.user_arg = callback_arg; diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 362334115..96c5d5835 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -101,6 +101,14 @@ int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, con int32 return_code = OS_ERR_NOT_IMPLEMENTED; OS_static_symbol_record_t *StaticSym = OS_STATIC_SYMTABLE_SOURCE; + /* + * Check parameters + * + * Note "ModuleName" is not checked, because in certain configurations it can be validly null. + */ + OS_CHECK_POINTER(SymbolAddress); + OS_CHECK_POINTER(SymbolName); + while (StaticSym != NULL) { if (StaticSym->Name == NULL) @@ -139,6 +147,9 @@ int32 OS_ModuleLoad_Static(const char *ModuleName) int32 return_code = OS_ERR_NAME_NOT_FOUND; OS_static_symbol_record_t *StaticSym = OS_STATIC_SYMTABLE_SOURCE; + /* Check parameters */ + OS_CHECK_POINTER(ModuleName); + while (StaticSym != NULL) { if (StaticSym->Name == NULL) @@ -194,11 +205,11 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f OS_module_internal_record_t *module; /* - ** Check parameters - ** - ** Note "filename" is not checked, because in certain configurations it can be validly - ** null. filename is checked for NULL-ness by the OS_TranslatePath() later. - */ + * Check parameters + * + * Note "filename" is not checked, because in certain configurations it can be validly + * null. filename is checked for NULL-ness by the OS_TranslatePath() later. + */ OS_CHECK_POINTER(module_id); OS_CHECK_APINAME(module_name); @@ -454,9 +465,7 @@ int32 OS_SymbolTableDump(const char *filename, size_t SizeLimit) char translated_path[OS_MAX_LOCAL_PATH_LEN]; OS_object_token_t token; - /* - ** Check parameters - */ + /* Check parameters */ OS_CHECK_POINTER(filename); /* diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index a174a4c61..4ed98e732 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -142,6 +142,12 @@ static int32 OS_Console_CopyOut(OS_console_internal_record_t *console, const cha size_t WriteOffset; int32 return_code; + /* Check parameters */ + OS_CHECK_POINTER(console); + OS_CHECK_POINTER(Str); + OS_CHECK_POINTER(NextWritePos); + + return_code = OS_ERROR; pmsg = Str; WriteOffset = *NextWritePos; @@ -256,6 +262,9 @@ void OS_printf(const char *String, ...) char msg_buffer[OS_BUFFER_SIZE]; int actualsz; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(String); + if (!OS_SharedGlobalVars.Initialized) { /* diff --git a/src/os/shared/src/osapi-select.c b/src/os/shared/src/osapi-select.c index d60b03288..3158ebbc3 100644 --- a/src/os/shared/src/osapi-select.c +++ b/src/os/shared/src/osapi-select.c @@ -89,6 +89,12 @@ int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs) { int32 return_code; + /* + * Check parameters + * + * Note "ReadSet" and "WriteSet" are not checked, because in certain configurations they can be validly null. + */ + /* * This does not currently increment any refcounts. * That means a file/socket can be closed while actively inside a diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index f610b8660..66f2aeae5 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -96,6 +96,10 @@ void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Ad uint16 port; OS_stream_internal_record_t *sock; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(token); + //OS_CHECK_POINTER(Addr); + sock = OS_OBJECT_TABLE_GET(OS_stream_table, *token); if (OS_SocketAddrToString_Impl(sock->stream_name, OS_MAX_API_NAME, Addr) != OS_SUCCESS) @@ -359,7 +363,11 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockA OS_object_token_t token; int32 return_code; - /* Check Parameters */ + /* + * Check parameters + * + * Note "RemoteAddr" is not checked, because in certain configurations it can be validly null. + */ OS_CHECK_POINTER(buffer); OS_CHECK_SIZE(buflen); @@ -493,6 +501,7 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) *-----------------------------------------------------------------*/ int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) { + /* Check parameters */ OS_CHECK_POINTER(Addr); return OS_SocketAddrInit_Impl(Addr, Domain); @@ -508,6 +517,7 @@ int32 OS_SocketAddrInit(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) *-----------------------------------------------------------------*/ int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) { + /* Check parameters */ OS_CHECK_POINTER(Addr); OS_CHECK_POINTER(buffer); OS_CHECK_SIZE(buflen); @@ -525,6 +535,7 @@ int32 OS_SocketAddrToString(char *buffer, size_t buflen, const OS_SockAddr_t *Ad *-----------------------------------------------------------------*/ int32 OS_SocketAddrFromString(OS_SockAddr_t *Addr, const char *string) { + /* Check parameters */ OS_CHECK_POINTER(Addr); OS_CHECK_POINTER(string); @@ -541,6 +552,7 @@ int32 OS_SocketAddrFromString(OS_SockAddr_t *Addr, const char *string) *-----------------------------------------------------------------*/ int32 OS_SocketAddrGetPort(uint16 *PortNum, const OS_SockAddr_t *Addr) { + /* Check parameters */ OS_CHECK_POINTER(Addr); OS_CHECK_POINTER(PortNum); @@ -557,6 +569,7 @@ int32 OS_SocketAddrGetPort(uint16 *PortNum, const OS_SockAddr_t *Addr) *-----------------------------------------------------------------*/ int32 OS_SocketAddrSetPort(OS_SockAddr_t *Addr, uint16 PortNum) { + /* Check parameters */ OS_CHECK_POINTER(Addr); return OS_SocketAddrSetPort_Impl(Addr, PortNum); diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index b46db2677..2cfa88aba 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -85,6 +85,9 @@ static int32 OS_TaskPrepare(osal_id_t task_id, osal_task_entry *entrypt) OS_object_token_t token; OS_task_internal_record_t *task; + /* Check parameters */ + OS_CHECK_POINTER(entrypt); + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TASK, task_id, &token); if (return_code == OS_SUCCESS) { @@ -178,7 +181,11 @@ int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry f OS_object_token_t token; OS_task_internal_record_t *task; - /* Check for NULL pointers */ + /* + * Check parameters + * + * Note "stack_pointer" is not checked, because in certain configurations it can be validly null. + */ OS_CHECK_POINTER(task_id); OS_CHECK_POINTER(function_pointer); OS_CHECK_APINAME(task_name); @@ -381,6 +388,7 @@ int32 OS_TaskGetIdByName(osal_id_t *task_id, const char *task_name) { int32 return_code; + /* Check parameters */ OS_CHECK_POINTER(task_id); OS_CHECK_POINTER(task_name); diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index 11e654caa..0400873de 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -111,6 +111,7 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ OS_CHECK_POINTER(timer_id); OS_CHECK_APINAME(timer_name); OS_CHECK_POINTER(callback_ptr); + OS_CHECK_POINTER(callback_arg); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -218,6 +219,9 @@ static void OS_Timer_NoArgCallback(osal_id_t objid, void *arg) { OS_Timer_ArgWrapper_t Conv; + /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ + //OS_CHECK_POINTER(arg); + /* * Note - did not write this as simply *((OS_SimpleCallback_t)arg) because * technically you cannot cast a void * to a function pointer. @@ -478,6 +482,7 @@ int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name) int32 return_code; osal_objtype_t objtype; + /* Check parameters */ OS_CHECK_POINTER(timer_id); OS_CHECK_POINTER(timer_name); diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index affca25fb..f922b2630 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -263,6 +263,7 @@ int32 OS_TimeBaseGetIdByName(osal_id_t *timer_id, const char *timebase_name) int32 return_code; osal_objtype_t objtype; + /* Check parameters */ OS_CHECK_POINTER(timer_id); OS_CHECK_APINAME(timebase_name); @@ -539,6 +540,9 @@ int32 OS_Milli2Ticks(uint32 milli_seconds, int *ticks) uint64 num_of_ticks; int32 return_code = OS_SUCCESS; + /* Check parameters */ + OS_CHECK_POINTER(ticks); + num_of_ticks = (((uint64)milli_seconds * OS_SharedGlobalVars.TicksPerSecond) + 999) / 1000; /* Check against maximum int32 (limit from some OS's) */ diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 6f7a4db4f..440d852c8 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -429,10 +429,14 @@ void Test_OS_ObjectIdFindByName(void) char TaskName[] = "UT_find"; osal_id_t objid; int32 expected = OS_ERR_NAME_NOT_FOUND; - int32 actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_UNDEFINED, NULL, NULL); - + int32 actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_UNDEFINED, NULL, &objid); UtAssert_True(actual == expected, "OS_ObjectFindIdByName(%s) (%ld) == OS_ERR_NAME_NOT_FOUND", "NULL", (long)actual); + expected = OS_INVALID_POINTER; + actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_UNDEFINED, TaskName, NULL); + UtAssert_True(actual == expected, "OS_ObjectFindIdByName(%s) (%ld) == OS_INVALID_POINTER", "NULL", (long)actual); + + /* * Pass in a name that is beyond OS_MAX_API_NAME */ From 33738d084f169eccf1018ffe43c1ee01fb2ba736 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Thu, 21 Jan 2021 11:41:51 -0500 Subject: [PATCH 085/111] HOTFIX - Reset va list in OS_printf stub --- src/ut-stubs/osapi-utstub-printf.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ut-stubs/osapi-utstub-printf.c b/src/ut-stubs/osapi-utstub-printf.c index 19b4b4a9c..52d162bcc 100644 --- a/src/ut-stubs/osapi-utstub-printf.c +++ b/src/ut-stubs/osapi-utstub-printf.c @@ -65,10 +65,14 @@ void OS_printf(const char *string, ...) va_list va; char str[128]; + /* Output the message when in debug mode */ va_start(va, string); - vsnprintf(str, sizeof(str), string, va); UtDebug("OS_printf: %s", str); + va_end(va); + + /* Reset va list for next use */ + va_start(va, string); status = UT_DefaultStubImplWithArgs(__func__, UT_KEY(OS_printf), 0, va); From 3fa2f50c078ffc4135e61e1f51c0048040c7a65b Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Mon, 4 Jan 2021 09:44:24 -0500 Subject: [PATCH 086/111] Fix #724, Refactor UT_ClearForceFail to UT_ClearDefaultReturnValue --- .../portable/src/coveragetest-posix-files.c | 8 +++---- .../shared/src/coveragetest-binsem.c | 2 +- .../shared/src/coveragetest-countsem.c | 2 +- .../shared/src/coveragetest-file.c | 6 ++--- .../shared/src/coveragetest-filesys.c | 14 ++++++------ .../shared/src/coveragetest-idmap.c | 2 +- .../shared/src/coveragetest-mutex.c | 2 +- .../shared/src/coveragetest-queue.c | 4 ++-- .../shared/src/coveragetest-select.c | 2 +- .../shared/src/coveragetest-sockets.c | 2 +- .../shared/src/coveragetest-task.c | 6 ++--- .../shared/src/coveragetest-time.c | 22 +++++++++---------- .../shared/src/coveragetest-timebase.c | 4 ++-- .../vxworks/src/coveragetest-common.c | 2 +- .../vxworks/src/coveragetest-console.c | 4 ++-- .../vxworks/src/coveragetest-filesys.c | 10 ++++----- .../vxworks/src/coveragetest-idmap.c | 2 +- .../vxworks/src/coveragetest-loader.c | 8 +++---- .../vxworks/src/coveragetest-no-module.c | 8 +++---- .../vxworks/src/coveragetest-symtab.c | 6 ++--- .../vxworks/src/coveragetest-tasks.c | 2 +- .../vxworks/src/coveragetest-timebase.c | 4 ++-- ut_assert/inc/utstubs.h | 13 ++++++++++- ut_assert/src/utstubs.c | 21 +++++++++++------- 24 files changed, 86 insertions(+), 70 deletions(-) diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index 51ef4581e..28a03e849 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -69,7 +69,7 @@ void Test_OS_FileStat_Impl(void) /* failure mode */ UT_SetDefaultReturnValue(UT_KEY(OCS_stat), -1); OSAPI_TEST_FUNCTION_RC(OS_FileStat_Impl, ("local", &FileStats), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_stat)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_stat)); /* nominal, no permission bits */ memset(&FileStats, 0, sizeof(FileStats)); @@ -108,12 +108,12 @@ void Test_OS_FileChmod_Impl(void) /* failure mode 0 (open) */ UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_open)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_open)); /* failure mode 1 (fstat) */ UT_SetDefaultReturnValue(UT_KEY(OCS_fstat), -1); OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_fstat)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_fstat)); /* failure mode 2 (fchmod) */ UT_SetDefaultReturnValue(UT_KEY(OCS_fchmod), -1); @@ -122,7 +122,7 @@ void Test_OS_FileChmod_Impl(void) /* non implemented error, e.g. such as DOS Filesystem with no perms */ OCS_errno = OCS_ENOTSUP; OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_ERR_NOT_IMPLEMENTED); - UT_ClearForceFail(UT_KEY(OCS_fchmod)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_fchmod)); /* all permission bits with uid/gid match */ RefStat.st_uid = UT_PortablePosixFileTest_GetSelfEUID(); diff --git a/src/unit-test-coverage/shared/src/coveragetest-binsem.c b/src/unit-test-coverage/shared/src/coveragetest-binsem.c index d46010c8b..37bfcd920 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-binsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-binsem.c @@ -150,7 +150,7 @@ void Test_OS_BinSemGetIdByName(void) actual = OS_BinSemGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_BinSemGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_BinSemGetIdByName(&objid, "NF"); diff --git a/src/unit-test-coverage/shared/src/coveragetest-countsem.c b/src/unit-test-coverage/shared/src/coveragetest-countsem.c index b89a2c6ed..f4d9fae62 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-countsem.c +++ b/src/unit-test-coverage/shared/src/coveragetest-countsem.c @@ -136,7 +136,7 @@ void Test_OS_CountSemGetIdByName(void) actual = OS_CountSemGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_CountSemGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_CountSemGetIdByName(&objid, "NF"); diff --git a/src/unit-test-coverage/shared/src/coveragetest-file.c b/src/unit-test-coverage/shared/src/coveragetest-file.c index 4292c5497..401ff6ae2 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-file.c +++ b/src/unit-test-coverage/shared/src/coveragetest-file.c @@ -82,7 +82,7 @@ void Test_OS_OpenCreate(void) expected = OS_ERROR; actual = OS_OpenCreate(&filedes, "/cf/file", OS_FILE_FLAG_NONE, OS_READ_WRITE); UtAssert_True(actual == OS_ERROR, "OS_OpenCreate() (%ld) == OS_ERROR (bad path)", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TranslatePath)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TranslatePath)); } void Test_OS_close(void) @@ -271,7 +271,7 @@ void Test_OS_cp(void) expected = -444; actual = OS_cp("/cf/file1", "/cf/file2"); UtAssert_True(actual == expected, "OS_cp() (%ld) == -444", (long)actual); - UT_ClearForceFail(UT_KEY(OS_GenericRead_Impl)); + UT_ClearDefaultReturnValue(UT_KEY(OS_GenericRead_Impl)); UT_SetDataBuffer(UT_KEY(OS_GenericRead_Impl), ReadBuf, sizeof(ReadBuf), false); UT_SetDefaultReturnValue(UT_KEY(OS_GenericWrite_Impl), -555); @@ -283,7 +283,7 @@ void Test_OS_cp(void) expected = OS_INVALID_POINTER; actual = OS_cp("/cf/file1", "/cf/file2"); UtAssert_True(actual == expected, "OS_cp() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TranslatePath)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TranslatePath)); } void Test_OS_mv(void) diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 8d3180866..17e8dc1f5 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -103,7 +103,7 @@ void Test_OS_mkfs(void) expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_mkfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_mkfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); /* set up for failure due to empty strings */ expected = OS_FS_ERR_PATH_INVALID; @@ -140,7 +140,7 @@ void Test_OS_rmfs(void) expected = OS_ERR_NAME_NOT_FOUND; actual = OS_rmfs("/ramdev4"); UtAssert_True(actual == expected, "OS_rmfs() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); - UT_ClearForceFail(UT_KEY(OS_ObjectIdGetByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdGetByName)); expected = OS_INVALID_POINTER; actual = OS_rmfs(NULL); @@ -178,7 +178,7 @@ void Test_OS_initfs(void) expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_initfs(TestBuffer, "/ramdev0", "vol", OSAL_SIZE_C(0), OSAL_BLOCKCOUNT_C(0)); UtAssert_True(actual == expected, "OS_initfs() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); /* set up for failure */ UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew), OS_ERR_NO_FREE_IDS); @@ -326,7 +326,7 @@ void Test_OS_chkfs(void) expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_chkfs("/cf", false); UtAssert_True(actual == expected, "OS_fsBytesFree() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); /* Test Fail due to no matching VolTab entry */ UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); @@ -351,7 +351,7 @@ void Test_OS_FS_GetPhysDriveName(void) expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); @@ -435,7 +435,7 @@ void Test_OS_TranslatePath(void) expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_strlen)); /* Invalid no '/' */ expected = OS_FS_ERR_PATH_INVALID; @@ -455,7 +455,7 @@ void Test_OS_TranslatePath(void) UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), OS_ERR_NAME_NOT_FOUND); actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); - UT_ClearForceFail(UT_KEY(OS_ObjectIdGetBySearch)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch)); /* VirtPathLen < VirtPathBegin */ UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 4, OS_MAX_PATH_LEN); diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 6f7a4db4f..a4c28141a 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -441,7 +441,7 @@ void Test_OS_ObjectIdFindByName(void) actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_OS_TASK, TaskName, &objid); UtAssert_True(actual == expected, "OS_ObjectFindIdByName(%s) (%ld) == OS_ERR_NAME_TOO_LONG", TaskName, (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); /* * Pass in a name that is actually not found diff --git a/src/unit-test-coverage/shared/src/coveragetest-mutex.c b/src/unit-test-coverage/shared/src/coveragetest-mutex.c index 4c68e64a3..5928c1d2e 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/shared/src/coveragetest-mutex.c @@ -121,7 +121,7 @@ void Test_OS_MutSemGetIdByName(void) actual = OS_MutSemGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_MutSemGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_MutSemGetIdByName(&objid, "NF"); diff --git a/src/unit-test-coverage/shared/src/coveragetest-queue.c b/src/unit-test-coverage/shared/src/coveragetest-queue.c index ba4387118..2ccd2ba98 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-queue.c +++ b/src/unit-test-coverage/shared/src/coveragetest-queue.c @@ -73,7 +73,7 @@ void Test_OS_QueueCreate(void) expected = OS_ERR_NAME_TOO_LONG; actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(0), OSAL_SIZE_C(4), 0); UtAssert_True(actual == expected, "OS_QueueCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); expected = OS_QUEUE_INVALID_SIZE; actual = OS_QueueCreate(&objid, "UT", OSAL_BLOCKCOUNT_C(1 + OS_QUEUE_MAX_DEPTH), OSAL_SIZE_C(4), 0); @@ -153,7 +153,7 @@ void Test_OS_QueueGetIdByName(void) UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_QueueGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_QueueGetIdByName() (%ld) == OS_SUCCESS", (long)actual); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_QueueGetIdByName(&objid, "NF"); diff --git a/src/unit-test-coverage/shared/src/coveragetest-select.c b/src/unit-test-coverage/shared/src/coveragetest-select.c index bb27e6451..34d81579e 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-select.c +++ b/src/unit-test-coverage/shared/src/coveragetest-select.c @@ -115,7 +115,7 @@ void Test_OS_SelectFdAddClearOps(void) UtAssert_True(!OS_SelectFdIsSet(&UtSet, UT_OBJID_1), "OS_SelectFdIsSet(1) == false"); UtAssert_True(!OS_SelectFdIsSet(&UtSet, UT_OBJID_2), "OS_SelectFdIsSet(2) == false"); - UT_ClearForceFail(UT_KEY(OS_ObjectIdToArrayIndex)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdToArrayIndex)); UtAssert_True(OS_SelectFdIsSet(&UtSet, UT_OBJID_1), "OS_SelectFdIsSet(1) == true"); UtAssert_True(!OS_SelectFdIsSet(&UtSet, UT_OBJID_2), "OS_SelectFdIsSet(2) == false"); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-sockets.c b/src/unit-test-coverage/shared/src/coveragetest-sockets.c index 3e807bbe9..6981bfca0 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-sockets.c +++ b/src/unit-test-coverage/shared/src/coveragetest-sockets.c @@ -375,7 +375,7 @@ void Test_OS_SocketGetIdByName(void) actual = OS_SocketGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_SocketGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_SocketGetIdByName(&objid, "NF"); diff --git a/src/unit-test-coverage/shared/src/coveragetest-task.c b/src/unit-test-coverage/shared/src/coveragetest-task.c index ad34cf8c0..672a3e101 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-task.c +++ b/src/unit-test-coverage/shared/src/coveragetest-task.c @@ -227,7 +227,7 @@ void Test_OS_TaskGetIdByName(void) actual = OS_TaskGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_TaskGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_TaskGetIdByName(&objid, "NF"); @@ -318,14 +318,14 @@ void Test_OS_TaskFindIdBySystemData(void) UT_SetDefaultReturnValue(UT_KEY(OS_TaskValidateSystemData_Impl), expected); actual = OS_TaskFindIdBySystemData(&task_id, &test_sysdata, sizeof(test_sysdata)); UtAssert_True(actual == expected, "OS_TaskFindIdBySystemData() (%ld) == OS_INVALID_POINTER", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TaskValidateSystemData_Impl)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TaskValidateSystemData_Impl)); /* Test search failure */ expected = OS_ERR_NAME_NOT_FOUND; UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch), expected); actual = OS_TaskFindIdBySystemData(&task_id, &test_sysdata, sizeof(test_sysdata)); UtAssert_True(actual == expected, "OS_TaskFindIdBySystemData() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); - UT_ClearForceFail(UT_KEY(OS_ObjectIdGetBySearch)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch)); } /* Osapi_Test_Setup diff --git a/src/unit-test-coverage/shared/src/coveragetest-time.c b/src/unit-test-coverage/shared/src/coveragetest-time.c index 445714f32..bb81ff0d2 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-time.c +++ b/src/unit-test-coverage/shared/src/coveragetest-time.c @@ -85,7 +85,7 @@ void Test_OS_TimerAdd(void) expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); expected = OS_INVALID_POINTER; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, NULL, &arg); @@ -95,19 +95,19 @@ void Test_OS_TimerAdd(void) expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TaskGetId_Impl)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl)); UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); expected = OS_ERROR; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERROR", (long)actual); - UT_ClearForceFail(UT_KEY(OS_ObjectIdGetById)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdGetById)); UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew), OS_ERROR); expected = OS_ERROR; actual = OS_TimerAdd(&objid, "UT", UT_OBJID_1, UT_TimerArgCallback, &arg); UtAssert_True(actual == expected, "OS_TimerAdd() (%ld) == OS_ERROR", (long)actual); - UT_ClearForceFail(UT_KEY(OS_ObjectIdAllocateNew)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew)); } void Test_OS_TimerCreate(void) @@ -147,13 +147,13 @@ void Test_OS_TimerCreate(void) expected = OS_ERROR; actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERROR", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TimeBaseCreate)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TimeBaseCreate)); UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); } void Test_OS_TimerSet(void) @@ -186,7 +186,7 @@ void Test_OS_TimerSet(void) expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerSet(UT_OBJID_2, 0, 1); UtAssert_True(actual == expected, "OS_TimerSet() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TaskGetId_Impl)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl)); } void Test_OS_TimerDelete(void) @@ -234,7 +234,7 @@ void Test_OS_TimerDelete(void) expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerDelete(UT_OBJID_2); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TaskGetId_Impl)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl)); } void Test_OS_TimerGetIdByName(void) @@ -250,7 +250,7 @@ void Test_OS_TimerGetIdByName(void) UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); actual = OS_TimerGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_TimerGetIdByName() (%ld) == OS_SUCCESS", (long)actual); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_TimerGetIdByName(&objid, "NF"); @@ -264,7 +264,7 @@ void Test_OS_TimerGetIdByName(void) expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerGetIdByName(&objid, "NF"); UtAssert_True(actual == expected, "OS_TimerGetIdByName() (%ld) == %ld", (long)actual, (long)expected); - UT_ClearForceFail(UT_KEY(OS_TaskGetId_Impl)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl)); } void Test_OS_TimerGetInfo(void) @@ -301,7 +301,7 @@ void Test_OS_TimerGetInfo(void) expected = OS_ERR_INCORRECT_OBJ_STATE; actual = OS_TimerGetInfo(UT_OBJID_1, &timer_prop); UtAssert_True(actual == expected, "OS_TimerGetInfo() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); - UT_ClearForceFail(UT_KEY(OS_TaskGetId_Impl)); + UT_ClearDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl)); } /* Osapi_Test_Setup diff --git a/src/unit-test-coverage/shared/src/coveragetest-timebase.c b/src/unit-test-coverage/shared/src/coveragetest-timebase.c index a1e142590..52489b730 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/shared/src/coveragetest-timebase.c @@ -103,7 +103,7 @@ void Test_OS_TimeBaseCreate(void) expected = OS_ERR_NAME_TOO_LONG; actual = OS_TimeBaseCreate(&objid, "UT", UT_TimerSync); UtAssert_True(actual == expected, "OS_TimeBaseCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); - UT_ClearForceFail(UT_KEY(OCS_memchr)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); UT_SetDefaultReturnValue(UT_KEY(OS_TaskGetId_Impl), 1 | (OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT)); expected = OS_ERR_INCORRECT_OBJ_STATE; @@ -166,7 +166,7 @@ void Test_OS_TimeBaseGetIdByName(void) actual = OS_TimeBaseGetIdByName(&objid, "UT"); UtAssert_True(actual == expected, "OS_TimeBaseGetIdByName() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); - UT_ClearForceFail(UT_KEY(OS_ObjectIdFindByName)); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); expected = OS_ERR_NAME_NOT_FOUND; actual = OS_TimeBaseGetIdByName(&objid, "NF"); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-common.c b/src/unit-test-coverage/vxworks/src/coveragetest-common.c index e8737479d..85ce295c1 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-common.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-common.c @@ -44,7 +44,7 @@ void Test_OS_API_Impl_Init(void) OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_StubKey_OS_VxWorks_TableMutex_Init, OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); - UT_ClearForceFail(UT_StubKey_OS_VxWorks_TableMutex_Init); + UT_ClearDefaultReturnValue(UT_StubKey_OS_VxWorks_TableMutex_Init); OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(OS_OBJECT_TYPE_OS_QUEUE), OS_SUCCESS); OSAPI_TEST_FUNCTION_RC(OS_API_Impl_Init(OS_OBJECT_TYPE_OS_BINSEM), OS_SUCCESS); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-console.c b/src/unit-test-coverage/vxworks/src/coveragetest-console.c index 0f0f437fa..39dc83670 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-console.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-console.c @@ -68,11 +68,11 @@ void Test_OS_ConsoleCreate_Impl(void) UT_SetDefaultReturnValue(UT_KEY(OCS_semCInitialize), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(&token), OS_SEM_FAILURE); - UT_ClearForceFail(UT_KEY(OCS_semCInitialize)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_semCInitialize)); UT_SetDefaultReturnValue(UT_KEY(OCS_taskSpawn), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(&token), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_taskSpawn)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_taskSpawn)); token.obj_idx = OS_MAX_CONSOLES + 1; OSAPI_TEST_FUNCTION_RC(OS_ConsoleCreate_Impl(&token), OS_ERR_NOT_IMPLEMENTED); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c index de2998415..8e08eae57 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-filesys.c @@ -140,7 +140,7 @@ void Test_OS_FileSysMountVolume_Impl(void) UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_open)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_open)); /* Additional cases for the FS_BASED handling */ OS_filesys_table[0].fstype = OS_FILESYS_TYPE_FS_BASED; @@ -154,7 +154,7 @@ void Test_OS_FileSysMountVolume_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_FS_ERR_DRIVE_NOT_CREATED); /* Mount dir does exist but not a directory */ - UT_ClearForceFail(UT_KEY(OCS_stat)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_stat)); OSAPI_TEST_FUNCTION_RC(OS_FileSysMountVolume_Impl(&token), OS_FS_ERR_PATH_INVALID); /* Mount dir does exist and is a directory */ @@ -179,11 +179,11 @@ void Test_OS_FileSysUnmountVolume_Impl(void) UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_open)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_open)); UT_SetDefaultReturnValue(UT_KEY(OCS_ioctl), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysUnmountVolume_Impl(&token), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_ioctl)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_ioctl)); /* Additional cases for the FS_BASED handling (no op on unmount) */ OS_filesys_table[0].fstype = OS_FILESYS_TYPE_FS_BASED; @@ -217,7 +217,7 @@ void Test_OS_FileSysCheckVolume_Impl(void) UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(&token, false), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_open)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_open)); UT_SetDefaultReturnValue(UT_KEY(OCS_ioctl), -1); OSAPI_TEST_FUNCTION_RC(OS_FileSysCheckVolume_Impl(&token, false), OS_ERROR); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c index e97635900..f8d7d907c 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c @@ -74,7 +74,7 @@ void Test_OS_API_Impl_Init(void) OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TableMutex_Init(0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_semMInitialize), -1); OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TableMutex_Init(OS_OBJECT_TYPE_OS_TASK), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_semMInitialize)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_semMInitialize)); OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TableMutex_Init(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c index 21fcb7858..505f69892 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-loader.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-loader.c @@ -55,10 +55,10 @@ void Test_OS_ModuleLoad_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(&token, "local"), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(&token, "local"), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_open)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_open)); UT_SetDefaultReturnValue(UT_KEY(OCS_loadModule), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(&token, "local"), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_loadModule)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_loadModule)); } void Test_OS_ModuleUnload_Impl(void) @@ -71,7 +71,7 @@ void Test_OS_ModuleUnload_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(&token), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_unldByModuleId), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(&token), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_unldByModuleId)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_unldByModuleId)); } void Test_OS_ModuleGetInfo_Impl(void) @@ -93,7 +93,7 @@ void Test_OS_ModuleGetInfo_Impl(void) memset(&module_prop, 0, sizeof(module_prop)); UT_SetDefaultReturnValue(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(&token, &module_prop), OS_SUCCESS); - UT_ClearForceFail(UT_KEY(OCS_moduleInfoGet)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_moduleInfoGet)); UtAssert_True(!module_prop.addr.valid, "addresses in output not valid"); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c b/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c index ed9b3083d..e736cbecf 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-no-module.c @@ -51,10 +51,10 @@ void Test_OS_ModuleLoad_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_open)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_open)); UT_SetDefaultReturnValue(UT_KEY(OCS_loadModule), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleLoad_Impl(0, "local"), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_loadModule)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_loadModule)); } void Test_OS_ModuleUnload_Impl(void) @@ -65,7 +65,7 @@ void Test_OS_ModuleUnload_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_unldByModuleId), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleUnload_Impl(0), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_unldByModuleId)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_unldByModuleId)); } void Test_OS_ModuleGetInfo_Impl(void) @@ -86,7 +86,7 @@ void Test_OS_ModuleGetInfo_Impl(void) memset(&module_prop, 0, sizeof(module_prop)); UT_SetDefaultReturnValue(UT_KEY(OCS_moduleInfoGet), OCS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_ModuleGetInfo_Impl(0, &module_prop), OS_SUCCESS); - UT_ClearForceFail(UT_KEY(OCS_moduleInfoGet)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_moduleInfoGet)); UtAssert_True(!module_prop.addr.valid, "addresses in output not valid"); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index 9f7d9b9db..a3ab7396b 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -71,10 +71,10 @@ void Test_OS_SymTableIterator_Impl(void) OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 101), false); UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_SYM_LEN + 10); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), false); - UT_ClearForceFail(UT_KEY(OCS_strlen)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_strlen)); UT_SetDefaultReturnValue(UT_KEY(OCS_write), -1); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), false); - UT_ClearForceFail(UT_KEY(OCS_write)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_write)); } void Test_OS_SymbolTableDump_Impl(void) @@ -85,7 +85,7 @@ void Test_OS_SymbolTableDump_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_SymbolTableDump_Impl("file", 10000), OS_SUCCESS); UT_SetDefaultReturnValue(UT_KEY(OCS_open), -1); OSAPI_TEST_FUNCTION_RC(OS_SymbolTableDump_Impl("file", 10000), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_open)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_open)); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c index 7f27a328d..5b20961e7 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c @@ -75,7 +75,7 @@ void Test_OS_TaskCreate_Impl(void) UT_SetDefaultReturnValue(UT_KEY(OCS_malloc), OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(&token, 0), OS_ERROR); - UT_ClearForceFail(UT_KEY(OCS_malloc)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_malloc)); OSAPI_TEST_FUNCTION_RC(OS_TaskCreate_Impl(&token, OS_FP_ENABLED), OS_SUCCESS); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_malloc)) == 2, "malloc() called"); UtAssert_True(UT_GetStubCount(UT_KEY(OCS_free)) == 0, "free() not called"); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c index 2690966e4..99e64ca8f 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c @@ -120,12 +120,12 @@ void Test_OS_TimeBaseCreate_Impl(void) /* fail to initialize the sem */ UT_SetDefaultReturnValue(UT_KEY(OCS_semMInitialize), -1); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_TIMER_ERR_INTERNAL); - UT_ClearForceFail(UT_KEY(OCS_semMInitialize)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_semMInitialize)); /* fail to spawn the task */ UT_SetDefaultReturnValue(UT_KEY(OCS_taskSpawn), -1); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_TIMER_ERR_INTERNAL); - UT_ClearForceFail(UT_KEY(OCS_taskSpawn)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_taskSpawn)); /* * this call to TimeBaseCreate_Impl should also fail, because diff --git a/ut_assert/inc/utstubs.h b/ut_assert/inc/utstubs.h index af525e553..f464d9e4a 100644 --- a/ut_assert/inc/utstubs.h +++ b/ut_assert/inc/utstubs.h @@ -193,6 +193,15 @@ void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, size_t *MaxSize, */ void UT_SetDefaultReturnValue(UT_EntryKey_t FuncKey, int32 Value); +/** + * Disable the forced failure mode for the given stub function + * + * This undoes the action of UT_SetDefaultReturnValue() + * + * \param FuncKey The stub function entry to clear. + */ +void UT_ClearDefaultReturnValue(UT_EntryKey_t FuncKey); + #ifndef OSAL_OMIT_DEPRECATED /** * Enable or disable the forced failure mode for the given stub function @@ -209,7 +218,6 @@ void UT_SetDefaultReturnValue(UT_EntryKey_t FuncKey, int32 Value); * @deprecated replaced by UT_SetDefaultReturnValue */ void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value); -#endif /** * Disable the forced failure mode for the given stub function @@ -217,8 +225,11 @@ void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value); * This undoes the action of UT_SetDefaultReturnValue() * * \param FuncKey The stub function entry to clear. + * + * @deprecated replaced by UT_ClearDefaultReturnValue */ void UT_ClearForceFail(UT_EntryKey_t FuncKey); +#endif /** * Set a Hook function for a particular call diff --git a/ut_assert/src/utstubs.c b/ut_assert/src/utstubs.c index 87db67fbc..ed737129a 100644 --- a/ut_assert/src/utstubs.c +++ b/ut_assert/src/utstubs.c @@ -335,14 +335,7 @@ void UT_SetDefaultReturnValue(UT_EntryKey_t FuncKey, int32 Value) } } -#ifndef OSAL_OMIT_DEPRECATED -void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value) -{ - UT_SetDefaultReturnValue(FuncKey, Value); -} -#endif - -void UT_ClearForceFail(UT_EntryKey_t FuncKey) +void UT_ClearDefaultReturnValue(UT_EntryKey_t FuncKey) { UT_StubTableEntry_t *StubPtr; @@ -353,6 +346,18 @@ void UT_ClearForceFail(UT_EntryKey_t FuncKey) } } +#ifndef OSAL_OMIT_DEPRECATED +void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value) +{ + UT_SetDefaultReturnValue(FuncKey, Value); +} + +void UT_ClearForceFail(UT_EntryKey_t FuncKey) +{ + UT_ClearDefaultReturnValue(FuncKey); +} +#endif + bool UT_GetStubRetcodeAndCount(UT_EntryKey_t FuncKey, int32 *Retcode, int32 *Count) { UT_StubTableEntry_t *StubPtr; From e248041a3e42279133b4ef0ce74bbf858d39da64 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Mon, 4 Jan 2021 10:09:37 -0500 Subject: [PATCH 087/111] Fix #722, update UT_SetDefaultReturnValue comments --- ut_assert/inc/utstubs.h | 15 +++++---------- ut_assert/src/utstubs.c | 4 ++-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/ut_assert/inc/utstubs.h b/ut_assert/inc/utstubs.h index f464d9e4a..7c532ec6f 100644 --- a/ut_assert/inc/utstubs.h +++ b/ut_assert/inc/utstubs.h @@ -180,21 +180,16 @@ void UT_SetDataBuffer(UT_EntryKey_t FuncKey, void *DataBuffer, size_t BufferSize void UT_GetDataBuffer(UT_EntryKey_t FuncKey, void **DataBuffer, size_t *MaxSize, size_t *Position); /** - * Enable or disable the forced failure mode for the given stub function - * - * This triggers a constant failure mode from the stub function, if implemented. - * The stub function will invoke a given failure path as defined by - * the stub implementation. - * - * A count of the number of times the failure mode is invoked will be maintained. + * Set the default return value for the given stub function. + * User needs to use UT_ClearDefaultReturnValue to clear the value. * * \param FuncKey The stub function to add the return code to. - * \param Value Arbitrary failure mode value (may or may not be used by the stub) + * \param Value Arbitrary return value (may or may not be used by the stub) */ void UT_SetDefaultReturnValue(UT_EntryKey_t FuncKey, int32 Value); /** - * Disable the forced failure mode for the given stub function + * Disable the default return for the given stub function * * This undoes the action of UT_SetDefaultReturnValue() * @@ -226,7 +221,7 @@ void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value); * * \param FuncKey The stub function entry to clear. * - * @deprecated replaced by UT_ClearDefaultReturnValue + * @deprecated replaced by UT_ClearDefaultReturnValue */ void UT_ClearForceFail(UT_EntryKey_t FuncKey); #endif diff --git a/ut_assert/src/utstubs.c b/ut_assert/src/utstubs.c index ed737129a..a4376b444 100644 --- a/ut_assert/src/utstubs.c +++ b/ut_assert/src/utstubs.c @@ -313,13 +313,13 @@ void UT_SetDefaultReturnValue(UT_EntryKey_t FuncKey, int32 Value) UT_StubTableEntry_t *Rc; /* - * First find an existing force fail entry for the function. + * First find an existing default return value entry for the function. * In case one is already set we do not duplicate (unlike deferred codes) */ Rc = UT_GetStubEntry(FuncKey, UT_ENTRYTYPE_FORCE_FAIL); if (Rc == NULL) { - /* Creating force fail entry - repeat search and grab any unused slot */ + /* Creating default return value entry - repeat search and grab any unused slot */ Rc = UT_GetStubEntry(FuncKey, UT_ENTRYTYPE_UNUSED); } From 4a77997f95f74ec1960edf2344f4515bf27cbdb3 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Fri, 22 Jan 2021 09:24:22 -0500 Subject: [PATCH 088/111] Fix #742, remove null checks from internal methods. --- src/os/shared/src/osapi-common.c | 9 -- src/os/shared/src/osapi-debug.c | 4 - src/os/shared/src/osapi-filesys.c | 15 +-- src/os/shared/src/osapi-idmap.c | 115 +++--------------- src/os/shared/src/osapi-module.c | 11 -- src/os/shared/src/osapi-printf.c | 8 +- src/os/shared/src/osapi-select.c | 8 +- src/os/shared/src/osapi-sockets.c | 12 +- src/os/shared/src/osapi-task.c | 11 +- src/os/shared/src/osapi-time.c | 8 +- src/os/shared/src/osapi-timebase.c | 3 - .../shared/src/coveragetest-idmap.c | 5 - 12 files changed, 36 insertions(+), 173 deletions(-) diff --git a/src/os/shared/src/osapi-common.c b/src/os/shared/src/osapi-common.c index e2832d6cd..62a5a433b 100644 --- a/src/os/shared/src/osapi-common.c +++ b/src/os/shared/src/osapi-common.c @@ -80,12 +80,6 @@ int32 OS_NotifyEvent(OS_Event_t event, osal_id_t object_id, void *data) { int32 status; - /* - * Check parameters - * - * Note "data" is not checked, because in certain configurations it can be validly null. - */ - if (OS_SharedGlobalVars.EventHandler != NULL) { status = OS_SharedGlobalVars.EventHandler(event, object_id, data); @@ -282,9 +276,6 @@ void OS_CleanUpObject(osal_id_t object_id, void *arg) { uint32 *ObjectCount; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(arg); - ObjectCount = (uint32 *)arg; ++(*ObjectCount); switch (OS_IdentifyObject(object_id)) diff --git a/src/os/shared/src/osapi-debug.c b/src/os/shared/src/osapi-debug.c index cd1b31c9d..f6eef77ac 100644 --- a/src/os/shared/src/osapi-debug.c +++ b/src/os/shared/src/osapi-debug.c @@ -55,10 +55,6 @@ void OS_DebugPrintf(uint32 Level, const char *Func, uint32 Line, const char *For { va_list va; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(Func); - //OS_CHECK_POINTER(Format); - if (OS_SharedGlobalVars.DebugLevel >= Level) { va_start(va, Format); diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index e75bcbce9..8d1b44c7e 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -75,9 +75,6 @@ const char OS_FILESYS_RAMDISK_VOLNAME_PREFIX[] = "RAM"; *-----------------------------------------------------------------*/ bool OS_FileSysFilterFree(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - /* Check parameters */ - OS_CHECK_POINTER(obj); - return !OS_ObjectIdDefined(obj->active_id); } @@ -94,10 +91,6 @@ bool OS_FileSysFilterFree(void *ref, const OS_object_token_t *token, const OS_co *-----------------------------------------------------------------*/ bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - /* Check parameters */ - OS_CHECK_POINTER(ref); - OS_CHECK_POINTER(token); - OS_filesys_internal_record_t *filesys; const char * target = (const char *)ref; size_t mplen; @@ -133,10 +126,10 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs OS_object_token_t token; /* - * Check parameters - * - * Note "address" is not checked, because in certain configurations it can be validly null. - */ + * Check parameters + * + * Note "address" is not checked, because in certain configurations it can be validly null. + */ OS_CHECK_STRING(fsdevname, sizeof(filesys->device_name), OS_FS_ERR_PATH_TOO_LONG); OS_CHECK_STRING(fsvolname, sizeof(filesys->volume_name), OS_FS_ERR_PATH_TOO_LONG); diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index b9aba03bd..d6e16791e 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -91,7 +91,6 @@ typedef struct void * user_arg; } OS_creator_filter_t; - /* * Global ID storage tables */ @@ -243,11 +242,7 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) *-----------------------------------------------------------------*/ bool OS_ForEachFilterCreator(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - /* Check parameters */ - OS_CHECK_POINTER(ref); - OS_CHECK_POINTER(obj); - - OS_creator_filter_t *filter = ref; + OS_creator_filter_t *filter = ref; /* * Check if the obj_id is both valid and matches @@ -267,9 +262,6 @@ bool OS_ForEachFilterCreator(void *ref, const OS_object_token_t *token, const OS *-----------------------------------------------------------------*/ int32 OS_ForEachDoCallback(osal_id_t obj_id, void *ref) { - /* Check parameters */ - OS_CHECK_POINTER(ref); - OS_creator_filter_t *filter = ref; /* Just invoke the user callback */ @@ -277,7 +269,6 @@ int32 OS_ForEachDoCallback(osal_id_t obj_id, void *ref) return OS_SUCCESS; } - /*---------------------------------------------------------------- * * Function: OS_ObjectIdGlobalFromToken @@ -290,9 +281,6 @@ int32 OS_ForEachDoCallback(osal_id_t obj_id, void *ref) *-----------------------------------------------------------------*/ OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) { - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(token); - uint32 base_idx = OS_GetBaseForObjectType(token->obj_type); return &OS_common_table[base_idx + token->obj_idx]; } @@ -313,11 +301,6 @@ OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) *-----------------------------------------------------------------*/ bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - /* Check parameters */ - OS_CHECK_POINTER(ref); - OS_CHECK_POINTER(token); - OS_CHECK_POINTER(obj); - return (obj->name_entry != NULL && strcmp((const char *)ref, obj->name_entry) == 0); } /* end OS_ObjectNameMatch */ @@ -339,9 +322,6 @@ bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_comm *-----------------------------------------------------------------*/ int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype, OS_object_token_t *token) { - /* Check parameters */ - OS_CHECK_POINTER(token); - memset(token, 0, sizeof(*token)); if (OS_SharedGlobalVars.Initialized == false) @@ -390,9 +370,6 @@ int32 OS_ObjectIdTransactionInit(OS_lock_mode_t lock_mode, osal_objtype_t idtype *-----------------------------------------------------------------*/ void OS_ObjectIdTransactionCancel(OS_object_token_t *token) { - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(token); - if (token->lock_mode != OS_LOCK_MODE_NONE) { OS_Unlock_Global(token); @@ -445,9 +422,6 @@ int32 OS_ObjectIdConvertToken(OS_object_token_t *token) OS_common_record_t *obj; osal_id_t expected_id; - /* Check parameters */ - OS_CHECK_POINTER(token); - obj = OS_ObjectIdGlobalFromToken(token); expected_id = OS_ObjectIdFromToken(token); @@ -607,13 +581,6 @@ int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_obj OS_common_record_t *base; OS_common_record_t *record; - /* - * Check parameters - * - * Note "arg" is not checked, because in certain configurations it can be validly null. - */ - OS_CHECK_POINTER(token); - return_code = OS_ERR_NAME_NOT_FOUND; base = &OS_common_table[OS_GetBaseForObjectType(token->obj_type)]; obj_count = OS_GetMaxForObjectType(token->obj_type); @@ -669,9 +636,6 @@ int32 OS_ObjectIdFindNextFree(OS_object_token_t *token) OS_common_record_t *obj = NULL; OS_objtype_state_t *objtype_state; - /* Check parameters */ - OS_CHECK_POINTER(token); - base_id = OS_GetBaseForObjectType(token->obj_type); max_id = OS_GetMaxForObjectType(token->obj_type); objtype_state = &OS_objtype_state[token->obj_type]; @@ -750,9 +714,6 @@ void OS_Lock_Global(OS_object_token_t *token) osal_id_t self_task_id; OS_objtype_state_t *objtype; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(token); - if (token->obj_type < OS_OBJECT_TYPE_USER && token->lock_mode != OS_LOCK_MODE_NONE) { objtype = &OS_objtype_state[token->obj_type]; @@ -784,16 +745,17 @@ void OS_Lock_Global(OS_object_token_t *token) * This makes it different for every operation, and different depending * on what task is calling the function. */ - token->lock_key.key_value = OS_LOCK_KEY_FIXED_VALUE | - ((OS_ObjectIdToInteger(self_task_id) ^ objtype->transaction_count) & 0xFFFFFF); + token->lock_key.key_value = + OS_LOCK_KEY_FIXED_VALUE | ((OS_ObjectIdToInteger(self_task_id) ^ objtype->transaction_count) & 0xFFFFFF); ++objtype->transaction_count; if (objtype->owner_key.key_value != 0) { /* this is almost certainly a bug */ - OS_DEBUG("ERROR: global %u acquired by task 0x%lx when already assigned key 0x%lx\n", (unsigned int)token->obj_type, - OS_ObjectIdToInteger(self_task_id), (unsigned long)objtype->owner_key.key_value); + OS_DEBUG("ERROR: global %u acquired by task 0x%lx when already assigned key 0x%lx\n", + (unsigned int)token->obj_type, OS_ObjectIdToInteger(self_task_id), + (unsigned long)objtype->owner_key.key_value); } else { @@ -802,8 +764,8 @@ void OS_Lock_Global(OS_object_token_t *token) } else { - OS_DEBUG("ERROR: cannot lock global %u for mode %u\n", - (unsigned int)token->obj_type, (unsigned int)token->lock_mode); + OS_DEBUG("ERROR: cannot lock global %u for mode %u\n", (unsigned int)token->obj_type, + (unsigned int)token->lock_mode); } } @@ -816,9 +778,6 @@ void OS_Unlock_Global(OS_object_token_t *token) { OS_objtype_state_t *objtype; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(token); - if (token->obj_type < OS_OBJECT_TYPE_USER && token->lock_mode != OS_LOCK_MODE_NONE) { objtype = &OS_objtype_state[token->obj_type]; @@ -835,8 +794,9 @@ void OS_Unlock_Global(OS_object_token_t *token) objtype->owner_key.key_value != token->lock_key.key_value) { /* this is almost certainly a bug */ - OS_DEBUG("ERROR: global %u released using mismatched key=0x%lx expected=0x%lx\n", (unsigned int)token->obj_type, - (unsigned long)token->lock_key.key_value, (unsigned long)objtype->owner_key.key_value); + OS_DEBUG("ERROR: global %u released using mismatched key=0x%lx expected=0x%lx\n", + (unsigned int)token->obj_type, (unsigned long)token->lock_key.key_value, + (unsigned long)objtype->owner_key.key_value); } objtype->owner_key = OS_LOCK_KEY_INVALID; @@ -846,8 +806,8 @@ void OS_Unlock_Global(OS_object_token_t *token) } else { - OS_DEBUG("ERROR: cannot unlock global %u for mode %u\n", - (unsigned int)token->obj_type, (unsigned int)token->lock_mode); + OS_DEBUG("ERROR: cannot unlock global %u for mode %u\n", (unsigned int)token->obj_type, + (unsigned int)token->lock_mode); } } @@ -867,9 +827,6 @@ void OS_WaitForStateChange(OS_object_token_t *token, uint32 attempts) osal_key_t saved_unlock_key; OS_objtype_state_t *objtype; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(token); - /* * This needs to release the lock, to allow other * tasks to make a change to the table. But to avoid @@ -919,13 +876,6 @@ int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, o { osal_id_t final_id; - /* - * Check parameters - * - * Note "outid" is not checked, because in certain configurations it can be validly null. - */ - OS_CHECK_POINTER(token); - /* if operation was unsuccessful, then clear * the active_id field within the record, so * the record can be re-used later. @@ -970,9 +920,6 @@ int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_object_token_t *token { osal_id_t final_id; - /* Check parameters */ - OS_CHECK_POINTER(token); - /* Clear the OSAL ID if successful - this returns the record to the pool */ if (operation_status == OS_SUCCESS) { @@ -1072,9 +1019,6 @@ int32 OS_ObjectIdFindByName(osal_objtype_t idtype, const char *name, osal_id_t * int32 return_code; OS_object_token_t token; - /* Check parameters */ - OS_CHECK_POINTER(object_id); - /* * As this is an internal-only function, calling it will NULL is allowed. * This is required by the file/dir/socket API since these DO allow multiple @@ -1163,14 +1107,6 @@ void OS_ObjectIdTransactionFinish(OS_object_token_t *token, osal_id_t *final_id) { OS_common_record_t *record; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - /* - * Check parameters - * - * Note "final_id" is not checked, because in certain configurations it can be validly null. - */ - //OS_CHECK_POINTER(token); - if (token->lock_mode == OS_LOCK_MODE_NONE) { /* nothing to do */ @@ -1342,10 +1278,6 @@ int32 OS_ObjectIdAllocateNew(osal_objtype_t idtype, const char *name, OS_object_ ------------------------------------------------------------------*/ void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t *token_to) { - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(token_to); - //OS_CHECK_POINTER(token_from); - /* start with a simple copy */ *token_to = *token_from; @@ -1365,13 +1297,6 @@ void OS_ObjectIdTransferToken(OS_object_token_t *token_from, OS_object_token_t * int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, osal_objtype_t objtype, OS_object_iter_t *iter) { - /* - * Check parameters - * - * Note "matcharg" is not checked, because in certain configurations it can be validly null. - */ - OS_CHECK_POINTER(iter); - iter->match = matchfunc; iter->arg = matcharg; iter->limit = OS_GetMaxForObjectType(objtype); @@ -1387,9 +1312,6 @@ int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, os ------------------------------------------------------------------*/ bool OS_ObjectFilterActive(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj) { - /* Check parameters */ - OS_CHECK_POINTER(obj); - return OS_ObjectIdDefined(obj->active_id); } @@ -1412,8 +1334,6 @@ bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter) { OS_common_record_t *record; bool got_next; - - OS_CHECK_POINTER(iter); got_next = false; iter->token.obj_id = OS_OBJECT_ID_UNDEFINED; @@ -1456,10 +1376,6 @@ int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal { int32 status; - /* Check parameters */ - OS_CHECK_POINTER(iter); - OS_CHECK_POINTER(func); - /* * This needs to temporarily unlock the global, * call the handler function, then re-lock. @@ -1517,13 +1433,14 @@ void OS_ForEachObject(osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void * See description in API and header file for detail * *-----------------------------------------------------------------*/ -void OS_ForEachObjectOfType(osal_objtype_t idtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, void *callback_arg) +void OS_ForEachObjectOfType(osal_objtype_t idtype, osal_id_t creator_id, OS_ArgCallback_t callback_ptr, + void *callback_arg) { OS_object_iter_t iter; OS_creator_filter_t filter; /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(callback_arg) + // OS_CHECK_POINTER(callback_arg) filter.creator_id = creator_id; filter.user_callback = callback_ptr; diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 96c5d5835..18b6eef26 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -101,14 +101,6 @@ int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, con int32 return_code = OS_ERR_NOT_IMPLEMENTED; OS_static_symbol_record_t *StaticSym = OS_STATIC_SYMTABLE_SOURCE; - /* - * Check parameters - * - * Note "ModuleName" is not checked, because in certain configurations it can be validly null. - */ - OS_CHECK_POINTER(SymbolAddress); - OS_CHECK_POINTER(SymbolName); - while (StaticSym != NULL) { if (StaticSym->Name == NULL) @@ -147,9 +139,6 @@ int32 OS_ModuleLoad_Static(const char *ModuleName) int32 return_code = OS_ERR_NAME_NOT_FOUND; OS_static_symbol_record_t *StaticSym = OS_STATIC_SYMTABLE_SOURCE; - /* Check parameters */ - OS_CHECK_POINTER(ModuleName); - while (StaticSym != NULL) { if (StaticSym->Name == NULL) diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index 4ed98e732..a6879f986 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -142,12 +142,6 @@ static int32 OS_Console_CopyOut(OS_console_internal_record_t *console, const cha size_t WriteOffset; int32 return_code; - /* Check parameters */ - OS_CHECK_POINTER(console); - OS_CHECK_POINTER(Str); - OS_CHECK_POINTER(NextWritePos); - - return_code = OS_ERROR; pmsg = Str; WriteOffset = *NextWritePos; @@ -263,7 +257,7 @@ void OS_printf(const char *String, ...) int actualsz; /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(String); + // OS_CHECK_POINTER(String); if (!OS_SharedGlobalVars.Initialized) { diff --git a/src/os/shared/src/osapi-select.c b/src/os/shared/src/osapi-select.c index 3158ebbc3..f74453366 100644 --- a/src/os/shared/src/osapi-select.c +++ b/src/os/shared/src/osapi-select.c @@ -90,10 +90,10 @@ int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs) int32 return_code; /* - * Check parameters - * - * Note "ReadSet" and "WriteSet" are not checked, because in certain configurations they can be validly null. - */ + * Check parameters + * + * Note "ReadSet" and "WriteSet" are not checked, because in certain configurations they can be validly null. + */ /* * This does not currently increment any refcounts. diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 66f2aeae5..ddfdd44ab 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -96,10 +96,6 @@ void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Ad uint16 port; OS_stream_internal_record_t *sock; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(token); - //OS_CHECK_POINTER(Addr); - sock = OS_OBJECT_TABLE_GET(OS_stream_table, *token); if (OS_SocketAddrToString_Impl(sock->stream_name, OS_MAX_API_NAME, Addr) != OS_SUCCESS) @@ -364,10 +360,10 @@ int32 OS_SocketRecvFrom(osal_id_t sock_id, void *buffer, size_t buflen, OS_SockA int32 return_code; /* - * Check parameters - * - * Note "RemoteAddr" is not checked, because in certain configurations it can be validly null. - */ + * Check parameters + * + * Note "RemoteAddr" is not checked, because in certain configurations it can be validly null. + */ OS_CHECK_POINTER(buffer); OS_CHECK_SIZE(buflen); diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index 2cfa88aba..29c60dd4f 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -85,9 +85,6 @@ static int32 OS_TaskPrepare(osal_id_t task_id, osal_task_entry *entrypt) OS_object_token_t token; OS_task_internal_record_t *task; - /* Check parameters */ - OS_CHECK_POINTER(entrypt); - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_TASK, task_id, &token); if (return_code == OS_SUCCESS) { @@ -182,10 +179,10 @@ int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry f OS_task_internal_record_t *task; /* - * Check parameters - * - * Note "stack_pointer" is not checked, because in certain configurations it can be validly null. - */ + * Check parameters + * + * Note "stack_pointer" is not checked, because in certain configurations it can be validly null. + */ OS_CHECK_POINTER(task_id); OS_CHECK_POINTER(function_pointer); OS_CHECK_APINAME(task_name); diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index 0400873de..fd834944f 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -106,12 +106,13 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ OS_timebase_internal_record_t *timebase; /* - ** Check Parameters + * Check parameters + * + * Note "callback_arg" is not checked, because in certain configurations it can be validly null. */ OS_CHECK_POINTER(timer_id); OS_CHECK_APINAME(timer_name); OS_CHECK_POINTER(callback_ptr); - OS_CHECK_POINTER(callback_arg); /* * Check our context. Not allowed to use the timer API from a timer callback. @@ -219,9 +220,6 @@ static void OS_Timer_NoArgCallback(osal_id_t objid, void *arg) { OS_Timer_ArgWrapper_t Conv; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - //OS_CHECK_POINTER(arg); - /* * Note - did not write this as simply *((OS_SimpleCallback_t)arg) because * technically you cannot cast a void * to a function pointer. diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index f922b2630..219f3e549 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -540,9 +540,6 @@ int32 OS_Milli2Ticks(uint32 milli_seconds, int *ticks) uint64 num_of_ticks; int32 return_code = OS_SUCCESS; - /* Check parameters */ - OS_CHECK_POINTER(ticks); - num_of_ticks = (((uint64)milli_seconds * OS_SharedGlobalVars.TicksPerSecond) + 999) / 1000; /* Check against maximum int32 (limit from some OS's) */ diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 440d852c8..ee8270dd8 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -432,11 +432,6 @@ void Test_OS_ObjectIdFindByName(void) int32 actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_UNDEFINED, NULL, &objid); UtAssert_True(actual == expected, "OS_ObjectFindIdByName(%s) (%ld) == OS_ERR_NAME_NOT_FOUND", "NULL", (long)actual); - expected = OS_INVALID_POINTER; - actual = OS_ObjectIdFindByName(OS_OBJECT_TYPE_UNDEFINED, TaskName, NULL); - UtAssert_True(actual == expected, "OS_ObjectFindIdByName(%s) (%ld) == OS_INVALID_POINTER", "NULL", (long)actual); - - /* * Pass in a name that is beyond OS_MAX_API_NAME */ From f725ee410b8f37c559835674a7380ed5a9682d13 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Wed, 6 Jan 2021 09:56:11 -0500 Subject: [PATCH 089/111] Fix #229, mqueue test uses sequence of numbers --- src/tests/queue-test/queue-test.c | 33 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/tests/queue-test/queue-test.c b/src/tests/queue-test/queue-test.c index 657dc658a..a79caa265 100644 --- a/src/tests/queue-test/queue-test.c +++ b/src/tests/queue-test/queue-test.c @@ -33,7 +33,9 @@ void QueueTimeoutSetup(void); void QueueTimeoutCheck(void); #define MSGQ_DEPTH 50 -#define MSGQ_SIZE 4 +#define MSGQ_SIZE sizeof(uint32) +#define MSGQ_TOTAL 10 +#define MSGQ_BURST 3 /* Task 1 */ #define TASK_1_STACK_SIZE 1024 @@ -65,8 +67,8 @@ void task_1(void) { int32 status; size_t data_size; - char data_received[4] = {0}; - char expected[4] = "xyz"; + uint32 data_received ; + uint32 expected = 0; OS_printf("Starting task 1\n"); @@ -84,8 +86,10 @@ void task_1(void) if (status == OS_SUCCESS) { ++task_1_messages; - UtAssert_True(strcmp(data_received, expected) == 0, "TASK 1: data_received (%s) == expected (%s)", + UtAssert_True(data_received == expected, "TASK 1: data_received (%u) == expected (%u)", data_received, expected); + + expected++; } else if (status == OS_QUEUE_TIMEOUT) { @@ -194,13 +198,12 @@ void QueueMessageSetup(void) { int32 status; uint32 accuracy; + int i; + uint32 Data = 0; task_1_failures = 0; task_1_messages = 0; task_1_timeouts = 0; - - int i; - const char Data[4] = "xyz"; - + status = OS_QueueCreate(&msgq_id, "MsgQ", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); UtAssert_True(status == OS_SUCCESS, "MsgQ create Id=%lx Rc=%d", OS_ObjectIdToInteger(msgq_id), (int)status); @@ -224,11 +227,17 @@ void QueueMessageSetup(void) status = OS_TimerSet(timer_id, timer_start, timer_interval); UtAssert_True(status == OS_SUCCESS, "Timer 1 set Rc=%d", (int)status); - /* Put 10 messages onto the que with some time inbetween to not overfill the que*/ - for (i = 0; i < 10; i++) + /* + * Put 10 messages onto the que with some time inbetween the later messages + * to make sure the que handles both storing and waiting for messages + */ + for (i = 0; i < MSGQ_TOTAL; i++) { - OS_TaskDelay(200); - status = OS_QueuePut(msgq_id, Data, sizeof(Data), 0); + if(i > MSGQ_BURST) + OS_TaskDelay(400); + + Data = i; + status = OS_QueuePut(msgq_id, (void *)&Data, sizeof(Data), 0); UtAssert_True(status == OS_SUCCESS, "OS Queue Put Rc=%d", (int)status); } } From 773dc88f16317e0b0c5088a3fc0af8d29d0fb496 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 19 Jan 2021 11:34:36 -0500 Subject: [PATCH 090/111] Fix #760, Install modules and clean up files for unit tests --- src/tests/file-api-test/file-api-test.c | 9 +++++++++ src/tests/select-test/select-test.c | 10 ++++++++-- src/unit-tests/osfile-test/ut_osfile_fileio_test.c | 3 ++- src/unit-tests/osloader-test/CMakeLists.txt | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index 07a2f4126..6d4a41d87 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -943,4 +943,13 @@ void TestOpenFileAPI(void) */ status = OS_CloseFileByName(filename2); UtAssert_True(status < OS_SUCCESS, "status after OS_CloseFileByName 2 = %d", (int)status); + + /* Try removing the files from the drive to end the function */ + status = OS_remove(filename1); + UtAssert_True(status == OS_SUCCESS, "status after remove filename1 = %d", (int)status); + status = OS_remove(filename2); + UtAssert_True(status == OS_SUCCESS, "status after remove filename2 = %d", (int)status); + status = OS_remove(filename3); + UtAssert_True(status == OS_SUCCESS, "status after remove filename3 = %d", (int)status); + } diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c index f42599c49..a98db1e29 100644 --- a/src/tests/select-test/select-test.c +++ b/src/tests/select-test/select-test.c @@ -50,6 +50,8 @@ OS_SockAddr_t c_addr; OS_SockAddr_t c2_addr; osal_id_t bin_sem_id; +#define OS_TEST_SELECT_FILENAME "/drive0/select_test.txt" + /* *************************************** MAIN ************************************** */ char * fsAddrPtr = NULL; @@ -58,7 +60,7 @@ static osal_id_t setup_file(void) osal_id_t id; OS_mkfs(fsAddrPtr, "/ramdev0", "RAM", 512, 20); OS_mount("/ramdev0", "/drive0"); - OS_OpenCreate(&id, "/drive0/select_test.txt", OS_FILE_FLAG_CREATE, OS_READ_WRITE); + OS_OpenCreate(&id, OS_TEST_SELECT_FILENAME, OS_FILE_FLAG_CREATE, OS_READ_WRITE); return id; } @@ -531,6 +533,10 @@ void TestSelectSingleFile(void) /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); UtAssert_True(StateFlags == 0, "OS_SelectSingle() (0x%x) == None", (unsigned int)StateFlags); + + /* Close and remove file */ + OS_close(fd); + OS_remove(OS_TEST_SELECT_FILENAME); } void UtTest_Setup(void) @@ -549,4 +555,4 @@ void UtTest_Setup(void) UtTest_Add(TestSelectSingleWrite, Setup_Single, Teardown_Single, "TestSelectSingleWrite"); UtTest_Add(TestSelectMultipleWrite, Setup_Multi, Teardown_Multi, "TestSelectMultipleWrite"); UtTest_Add(TestSelectSingleFile, NULL, NULL, "TestSelectSingleFile"); -} \ No newline at end of file +} diff --git a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c index 7ed2072f7..5f1f59b4c 100644 --- a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c @@ -2057,11 +2057,12 @@ void UT_os_outputtofile_test() } } +UT_os_outputtofile_test_exit_tag: + /* Reset test environment */ OS_close(g_fDescs[0]); OS_remove(g_fNames[0]); -UT_os_outputtofile_test_exit_tag: return; } diff --git a/src/unit-tests/osloader-test/CMakeLists.txt b/src/unit-tests/osloader-test/CMakeLists.txt index 72152120b..1c3159d9f 100644 --- a/src/unit-tests/osloader-test/CMakeLists.txt +++ b/src/unit-tests/osloader-test/CMakeLists.txt @@ -19,4 +19,7 @@ while(MOD GREATER 0) PREFIX "" LIBRARY_OUTPUT_DIRECTORY utmod) add_dependencies(osal_loader_UT MODULE${MOD}) + foreach(TGT ${INSTALL_TARGET_LIST}) + install(TARGETS MODULE${MOD} DESTINATION ${TGT}/${UT_INSTALL_SUBDIR}/utmod) + endforeach() endwhile(MOD GREATER 0) From 27d99a21c29248514d3f79f52d7814d72a1bdc68 Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Tue, 26 Jan 2021 19:33:15 -0500 Subject: [PATCH 091/111] Bump to v5.1.0-rc1+dev221 Update ReadMe --- README.md | 19 +++++++++++++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fe32818ce..51e3caaff 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,25 @@ The autogenerated OSAL user's guide can be viewed at + ### Development Build: 5.1.0-rc1+dev184 - Address issues with OSAL global table management: diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index d6945377e..bf0946a61 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 184 +#define OS_BUILD_NUMBER 221 #define OS_BUILD_BASELINE "v5.1.0-rc1" /* From e77e657e86a48fbba057bb83dcd4e72b3c594675 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Fri, 22 Jan 2021 16:46:16 -0500 Subject: [PATCH 092/111] Fix #602, bring OSAL code coverage back up to 100% Adds test cases where necessary to get 100% line coverage on VxWorks impl + shared/portable layers. --- src/os/shared/inc/os-shared-file.h | 11 ++- src/os/shared/inc/os-shared-filesys.h | 3 +- .../portable/src/coveragetest-posix-dirs.c | 14 ++++ .../shared/src/coveragetest-common.c | 41 ++++++++++- .../shared/src/coveragetest-file.c | 7 ++ .../shared/src/coveragetest-filesys.c | 19 +++-- .../shared/src/coveragetest-module.c | 47 ++++++++++++- .../shared/src/coveragetest-mutex.c | 39 +++++++++-- .../shared/src/coveragetest-queue.c | 8 ++- .../shared/src/coveragetest-time.c | 69 +++++++++++++------ .../vxworks/src/coveragetest-idmap.c | 19 ++++- .../vxworks/src/coveragetest-tasks.c | 13 ++++ .../vxworks/src/coveragetest-timebase.c | 15 +++- src/ut-stubs/osapi-utstub-binsem.c | 8 +-- src/ut-stubs/osapi-utstub-countsem.c | 8 +-- src/ut-stubs/osapi-utstub-dir.c | 4 +- src/ut-stubs/osapi-utstub-file.c | 10 +-- src/ut-stubs/osapi-utstub-filesys.c | 5 +- src/ut-stubs/osapi-utstub-idmap.c | 66 ++++-------------- src/ut-stubs/osapi-utstub-module.c | 4 +- src/ut-stubs/osapi-utstub-mutex.c | 8 +-- src/ut-stubs/osapi-utstub-queue.c | 8 +-- src/ut-stubs/osapi-utstub-sockets.c | 6 +- src/ut-stubs/osapi-utstub-task.c | 12 ++-- src/ut-stubs/osapi-utstub-time.c | 10 +-- src/ut-stubs/osapi-utstub-timebase.c | 8 +-- src/ut-stubs/utstub-helpers.c | 38 +++++----- src/ut-stubs/utstub-helpers.h | 27 ++------ 28 files changed, 347 insertions(+), 180 deletions(-) diff --git a/src/os/shared/inc/os-shared-file.h b/src/os/shared/inc/os-shared-file.h index fcadb2c40..909bf335c 100644 --- a/src/os/shared/inc/os-shared-file.h +++ b/src/os/shared/inc/os-shared-file.h @@ -183,4 +183,13 @@ int32 OS_FileRename_Impl(const char *old_path, const char *new_path); ------------------------------------------------------------------*/ int32 OS_FileChmod_Impl(const char *local_path, uint32 access); -#endif /* OS_SHARED_FILE_H */ + +/* + * Internal helper function + * + * Not called outside this unit, but need to be prototyped + * here for coverage test. + */ +int32 OS_FileIteratorClose(osal_id_t filedes, void *arg); + +#endif /* OS_SHARED_FILE_H */ diff --git a/src/os/shared/inc/os-shared-filesys.h b/src/os/shared/inc/os-shared-filesys.h index 717699f1f..b16a3765e 100644 --- a/src/os/shared/inc/os-shared-filesys.h +++ b/src/os/shared/inc/os-shared-filesys.h @@ -190,5 +190,6 @@ int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token); bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fsvolname, size_t blocksize, osal_blockcount_t numblocks, bool should_format); +bool OS_FileSysFilterFree(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); -#endif /* OS_SHARED_FILESYS_H */ +#endif /* OS_SHARED_FILESYS_H */ diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-dirs.c b/src/unit-test-coverage/portable/src/coveragetest-posix-dirs.c index 371e3b254..17d581fcd 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-dirs.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-dirs.c @@ -32,7 +32,9 @@ #include #include #include +#include #include +#include void Test_OS_DirCreate_Impl(void) { @@ -40,10 +42,22 @@ void Test_OS_DirCreate_Impl(void) * Test Case For: * int32 OS_DirCreate_Impl(const char *local_path, uint32 access) */ + struct OCS_stat statbuf; + OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl, ("dir", 0), OS_SUCCESS); + /* With errno other than EEXIST it should return OS_ERROR */ + OCS_errno = OCS_EROFS; UT_SetDefaultReturnValue(UT_KEY(OCS_mkdir), -1); OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl, ("dir", 0), OS_ERROR); + + /* If the errno is EEXIST it should return success */ + OCS_errno = OCS_EEXIST; + memset(&statbuf, 0, sizeof(statbuf)); + statbuf.st_mode = OCS_S_IFDIR; + UT_SetDataBuffer(UT_KEY(OCS_stat), &statbuf, sizeof(statbuf), false); + UT_SetDefaultReturnValue(UT_KEY(OCS_mkdir), -1); + OSAPI_TEST_FUNCTION_RC(OS_DirCreate_Impl, ("dir", 0), OS_SUCCESS); } void Test_OS_DirOpen_Impl(void) diff --git a/src/unit-test-coverage/shared/src/coveragetest-common.c b/src/unit-test-coverage/shared/src/coveragetest-common.c index a8c3d8706..f760641bd 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-common.c +++ b/src/unit-test-coverage/shared/src/coveragetest-common.c @@ -57,9 +57,9 @@ static int32 TimeBaseInitGlobal(void *UserObj, int32 StubRetcode, uint32 CallCou static int32 ObjectDeleteCountHook(void *UserObj, int32 StubRetcode, uint32 CallCount, const UT_StubContext_t *Context) { - uint32 *counter = (uint32 *)Context->ArgPtr[1]; + uint32 *counter = UT_Hook_GetArgValueByName(Context, "callback_arg", uint32 *); - if (CallCount == 0) + if (CallCount < 2) { *counter = 1; } @@ -77,6 +77,11 @@ static int32 SetShutdownFlagHook(void *UserObj, int32 StubRetcode, uint32 CallCo return StubRetcode; } +static int32 TestEventHandlerHook(OS_Event_t event, osal_id_t object_id, void *data) +{ + return UT_DEFAULT_IMPL(TestEventHandlerHook); +} + /* ********************************************************************************** ** PUBLIC API FUNCTIONS @@ -258,6 +263,37 @@ void Test_OS_IdleLoopAndShutdown(void) UtAssert_True(CallCount == 1, "OS_ApplicationShutdown_Impl() call count (%lu) == 1", (unsigned long)CallCount); } +void Test_OS_NotifyEvent(void) +{ + /* + * Test cases for: + * int32 OS_NotifyEvent(OS_Event_t event, osal_id_t object_id, void *data) + * int32 OS_RegisterEventHandler(OS_EventHandler_t handler) + */ + + OS_SharedGlobalVars.EventHandler = NULL; + + /* With no hook function registered OS_NotifyEvent() should return success */ + OSAPI_TEST_FUNCTION_RC(OS_NotifyEvent(OS_EVENT_RESERVED, OS_OBJECT_ID_UNDEFINED, NULL), OS_SUCCESS); + + /* Registering a NULL hook function should fail */ + OSAPI_TEST_FUNCTION_RC(OS_RegisterEventHandler(NULL), OS_INVALID_POINTER); + + /* Now Register the locally-defined hook function */ + OSAPI_TEST_FUNCTION_RC(OS_RegisterEventHandler(TestEventHandlerHook), OS_SUCCESS); + + /* Now this should invoke the test hook */ + OSAPI_TEST_FUNCTION_RC(OS_NotifyEvent(OS_EVENT_RESERVED, OS_OBJECT_ID_UNDEFINED, NULL), OS_SUCCESS); + UtAssert_STUB_COUNT(TestEventHandlerHook, 1); + + /* Should also return whatever the hook returned */ + UT_SetDefaultReturnValue(UT_KEY(TestEventHandlerHook), -12345); + OSAPI_TEST_FUNCTION_RC(OS_NotifyEvent(OS_EVENT_RESERVED, OS_OBJECT_ID_UNDEFINED, NULL), -12345); + UtAssert_STUB_COUNT(TestEventHandlerHook, 2); + + OS_SharedGlobalVars.EventHandler = NULL; +} + /* ------------------- End of test cases --------------------------------------*/ /* Osapi_Test_Setup @@ -288,4 +324,5 @@ void UtTest_Setup(void) ADD_TEST(OS_CleanUpObject); ADD_TEST(OS_IdleLoopAndShutdown); ADD_TEST(OS_ApplicationExit); + ADD_TEST(OS_NotifyEvent); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-file.c b/src/unit-test-coverage/shared/src/coveragetest-file.c index 401ff6ae2..3729b54b1 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-file.c +++ b/src/unit-test-coverage/shared/src/coveragetest-file.c @@ -386,6 +386,13 @@ void Test_OS_CloseAllFiles(void) actual = OS_CloseAllFiles(); UtAssert_True(actual == expected, "OS_CloseAllFiles() (%ld) == -222", (long)actual); + + /* This uses a helper function OS_FileIteratorClose() with the iterator, + * which needs to be called for coverage - it just invokes OS_close() */ + expected = OS_SUCCESS; + actual = OS_FileIteratorClose(UT_OBJID_1, NULL); + + UtAssert_True(actual == expected, "OS_FileIteratorClose() (%ld) == OS_SUCCESS", (long)actual); } /* Osapi_Test_Setup diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 17e8dc1f5..48e0d238b 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -376,9 +376,10 @@ void Test_OS_GetFsInfo(void) * Test Case For: * int32 OS_GetFsInfo(OS_FsInfo_t *filesys_info) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; - os_fsinfo_t filesys_info; + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + os_fsinfo_t filesys_info; + OS_common_record_t rec; UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdIteratorGetNext), 1); UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdIteratorGetNext), 3, 0); @@ -394,15 +395,21 @@ void Test_OS_GetFsInfo(void) "filesys_info.MaxVolumes (%lu) == OS_MAX_FILE_SYSTEMS", (unsigned long)filesys_info.MaxVolumes); /* since there are no open files, the free fd count should match the max */ - UtAssert_True(filesys_info.FreeFds == 2, "filesys_info.FreeFds (%lu) == 2", - (unsigned long)filesys_info.FreeFds); + UtAssert_True(filesys_info.FreeFds == 2, "filesys_info.FreeFds (%lu) == 2", (unsigned long)filesys_info.FreeFds); UtAssert_True(filesys_info.FreeVolumes == 3, "filesys_info.FreeVolumes (%lu) == 3", - (unsigned long)filesys_info.FreeVolumes); + (unsigned long)filesys_info.FreeVolumes); expected = OS_INVALID_POINTER; actual = OS_GetFsInfo(NULL); UtAssert_True(actual == expected, "OS_GetFsInfo() (%ld) == OS_INVALID_POINTER", (long)actual); + + /* This function uses a helper OS_FileSysFilterFree() that needs to be called for coverage. */ + /* It is just a wrapper around OS_ObjectIdDefined() for the record ID */ + memset(&rec, 0, sizeof(rec)); + UtAssert_True(OS_FileSysFilterFree(NULL, NULL, &rec), "OS_FileSysFilterFree() (unused record)"); + rec.active_id = UT_OBJID_1; + UtAssert_True(!OS_FileSysFilterFree(NULL, NULL, &rec), "!OS_FileSysFilterFree() (used record)"); } void Test_OS_TranslatePath(void) diff --git a/src/unit-test-coverage/shared/src/coveragetest-module.c b/src/unit-test-coverage/shared/src/coveragetest-module.c index 043ebeb36..2552626bb 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-module.c +++ b/src/unit-test-coverage/shared/src/coveragetest-module.c @@ -158,6 +158,44 @@ void Test_OS_SymbolLookup(void) UtAssert_True(actual == expected, "OS_SymbolLookup(UT_staticsym) (%ld) == OS_SUCCESS", (long)actual); } +void Test_OS_ModuleSymbolLookup(void) +{ + /* + * Test Case For: + * int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const char *symbol_name) + */ + int32 expected = OS_SUCCESS; + int32 actual = ~OS_SUCCESS; + cpuaddr testaddr = 0; + cpuaddr symaddr = 0; + + actual = OS_ModuleSymbolLookup(OS_OBJECT_ID_UNDEFINED, &symaddr, "uttestsym0"); + UtAssert_True(actual == expected, "OS_ModuleSymbolLookup(name=%s) (%ld) == OS_SUCCESS", "uttestsym0", (long)actual); + + UT_ResetState(UT_KEY(OS_ModuleSymbolLookup_Impl)); + UT_SetDefaultReturnValue(UT_KEY(OS_ModuleSymbolLookup_Impl), OS_ERROR); + + /* this lookup should always fail */ + symaddr = 0; + testaddr = 0; + actual = OS_ModuleSymbolLookup(OS_OBJECT_ID_UNDEFINED, &symaddr, "uttestsym1"); + expected = OS_ERROR; + UtAssert_True(actual == expected, "OS_ModuleSymbolLookup(name=%s) (%ld) == OS_ERROR", "uttestsym1", (long)actual); + UtAssert_True(symaddr == testaddr, "OS_ModuleSymbolLookup(address=%lx) == %lx", (unsigned long)symaddr, + (unsigned long)testaddr); + + actual = OS_ModuleSymbolLookup(OS_OBJECT_ID_UNDEFINED, NULL, NULL); + expected = OS_INVALID_POINTER; + UtAssert_True(actual == expected, "OS_ModuleSymbolLookup(NULL) (%ld) == OS_INVALID_POINTER", (long)actual); + + /* + * Look up a symbol that is present in the static symbol table + */ + actual = OS_ModuleSymbolLookup(OS_OBJECT_ID_UNDEFINED, &symaddr, "UT_staticsym"); + expected = OS_SUCCESS; + UtAssert_True(actual == expected, "OS_ModuleSymbolLookup(UT_staticsym) (%ld) == OS_SUCCESS", (long)actual); +} + void Test_OS_StaticSymbolLookup(void) { /* @@ -190,7 +228,7 @@ void Test_OS_StaticSymbolLookup(void) UtAssert_True(actual == expected, "OS_ModuleLoad_Static(name=%s) (%ld) == OS_SUCCESS", "UT", (long)actual); expected = OS_ERROR; - actual = OS_SymbolLookup_Static(&addr, "UT_staticsym", "NoModuleMatch"); + actual = OS_SymbolLookup_Static(&addr, "UT_staticsym", "NoModuleMatch"); UtAssert_True(actual == expected, "OS_SymbolLookup_Static(name=%s, NoModuleMatch) (%ld) == OS_ERROR", "Test_Func1", (long)actual); UtAssert_True(addr == (cpuaddr)&Test_DummyFunc, "OS_SymbolLookup_Static(address=%lx) == %lx", (unsigned long)addr, @@ -221,6 +259,12 @@ void Test_OS_SymbolTableDump(void) expected = OS_ERROR; actual = OS_SymbolTableDump("test", OSAL_SIZE_C(555)); UtAssert_True(actual == expected, "OS_SymbolTableDump() (%ld) == OS_ERROR", (long)actual); + + UT_ResetState(UT_KEY(OS_TranslatePath)); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdTransactionInit), OS_ERROR); + expected = OS_ERROR; + actual = OS_SymbolTableDump("test", OSAL_SIZE_C(555)); + UtAssert_True(actual == expected, "OS_SymbolTableDump() (%ld) == OS_ERROR", (long)actual); } void Test_OS_ModuleGetInfo(void) @@ -274,6 +318,7 @@ void UtTest_Setup(void) ADD_TEST(OS_ModuleLoad); ADD_TEST(OS_ModuleUnload); ADD_TEST(OS_SymbolLookup); + ADD_TEST(OS_ModuleSymbolLookup); ADD_TEST(OS_ModuleGetInfo); ADD_TEST(OS_SymbolTableDump); ADD_TEST(OS_StaticSymbolLookup); diff --git a/src/unit-test-coverage/shared/src/coveragetest-mutex.c b/src/unit-test-coverage/shared/src/coveragetest-mutex.c index 5928c1d2e..d5a5158d1 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-mutex.c +++ b/src/unit-test-coverage/shared/src/coveragetest-mutex.c @@ -85,12 +85,26 @@ void Test_OS_MutSemGive(void) * Test Case For: * int32 OS_MutSemGive ( uint32 sem_id ) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; + OS_mutex_internal_record_t *mutex; + int32 expected; + int32 actual; - actual = OS_MutSemGive(UT_OBJID_1); + expected = OS_SUCCESS; + + /* Set up for "last owner" matching the calling task (nominal) */ + mutex = &OS_mutex_table[1]; + mutex->last_owner = OS_TaskGetId(); + actual = OS_MutSemGive(UT_OBJID_1); UtAssert_True(actual == expected, "OS_MutSemGive() (%ld) == OS_SUCCESS", (long)actual); + + /* owner should be unset */ + UtAssert_True(!OS_ObjectIdDefined(mutex->last_owner), "Mutex owner unset"); + + /* Call again when not "owned". This still works (or at least it calls the OS impl) + * but should generate a debug message */ + actual = OS_MutSemGive(UT_OBJID_1); + UtAssert_True(actual == expected, "OS_MutSemGive(), not owned (%ld) == OS_SUCCESS", (long)actual); } void Test_OS_MutSemTake(void) @@ -99,11 +113,24 @@ void Test_OS_MutSemTake(void) * Test Case For: * int32 OS_MutSemTake ( uint32 sem_id ) */ - int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; + OS_mutex_internal_record_t *mutex; + int32 expected; + int32 actual; - actual = OS_MutSemTake(UT_OBJID_1); + expected = OS_SUCCESS; + /* Set up for "last owner" being undefined (nominal) */ + mutex = &OS_mutex_table[1]; + mutex->last_owner = OS_OBJECT_ID_UNDEFINED; + actual = OS_MutSemTake(UT_OBJID_1); + UtAssert_True(actual == expected, "OS_MutSemTake() (%ld) == OS_SUCCESS", (long)actual); + + /* owner should be set */ + UtAssert_True(OS_ObjectIdDefined(mutex->last_owner), "Mutex owner set"); + + /* Call again when not already "owned". This still works (or at least it calls the OS impl) + * but should generate a debug message */ + actual = OS_MutSemTake(UT_OBJID_1); UtAssert_True(actual == expected, "OS_MutSemTake() (%ld) == OS_SUCCESS", (long)actual); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-queue.c b/src/unit-test-coverage/shared/src/coveragetest-queue.c index 2ccd2ba98..44dab954f 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-queue.c +++ b/src/unit-test-coverage/shared/src/coveragetest-queue.c @@ -130,14 +130,20 @@ void Test_OS_QueuePut(void) int32 actual = ~OS_SUCCESS; const char Data[4] = "xyz"; - actual = OS_QueuePut(UT_OBJID_1, Data, sizeof(Data), 0); + OS_queue_table[1].max_depth = 10; + OS_queue_table[1].max_size = sizeof(Data); + actual = OS_QueuePut(UT_OBJID_1, Data, sizeof(Data), 0); UtAssert_True(actual == expected, "OS_QueuePut() (%ld) == OS_SUCCESS", (long)actual); /* test error cases */ expected = OS_INVALID_POINTER; actual = OS_QueuePut(UT_OBJID_1, NULL, sizeof(Data), 0); UtAssert_True(actual == expected, "OS_QueuePut() (%ld) == OS_INVALID_POINTER", (long)actual); + + expected = OS_QUEUE_INVALID_SIZE; + actual = OS_QueuePut(UT_OBJID_1, Data, 1 + sizeof(Data), 0); + UtAssert_True(actual == expected, "OS_QueuePut() (%ld) == OS_QUEUE_INVALID_SIZE", (long)actual); } void Test_OS_QueueGetIdByName(void) diff --git a/src/unit-test-coverage/shared/src/coveragetest-time.c b/src/unit-test-coverage/shared/src/coveragetest-time.c index bb81ff0d2..9e90abcc5 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-time.c +++ b/src/unit-test-coverage/shared/src/coveragetest-time.c @@ -154,6 +154,14 @@ void Test_OS_TimerCreate(void) actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERR_NAME_TOO_LONG", (long)actual); UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); + + /* This function creates its own timebase. If OS_DoTimerAdd() fails this timebase needs to be deleted */ + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + expected = OS_ERROR; + actual = OS_TimerCreate(&objid, "UT", &accuracy, UT_TimerCallback); + UtAssert_True(actual == expected, "OS_TimerCreate() (%ld) == OS_ERROR", (long)actual); + UT_ResetState(UT_KEY(OS_ObjectIdGetById)); + UtAssert_STUB_COUNT(OS_TimeBaseDelete, 1); } void Test_OS_TimerSet(void) @@ -195,35 +203,56 @@ void Test_OS_TimerDelete(void) * Test Case For: * int32 OS_TimerDelete(uint32 timer_id) */ - int32 expected = OS_SUCCESS; - int32 actual = OS_TimerDelete(UT_OBJID_1); - osal_id_t timebase_id; + int32 expected; + int32 actual; + osal_id_t timebase_id; + osal_id_t timer_objid_1, timer_objid_2; + OS_timebase_internal_record_t *timebase; + OS_object_token_t timebase_token; + uint32 accuracy; + + expected = OS_SUCCESS; + + /* The ObjIds in the ring need to match what will be in the token */ + /* Get a "timebase" from the stub so the objid will validate */ + OS_TimeBaseCreate(&timebase_id, "ut", NULL); + OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_id, &timebase_token); + timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, timebase_token); + OS_TimerAdd(&timer_objid_1, "UT1", timebase_id, UT_TimerArgCallback, NULL); + OS_TimerAdd(&timer_objid_2, "UT2", timebase_id, UT_TimerArgCallback, NULL); + + /* Sanity check: After adding the two timers the "first_cb" should be pointing at timer 2 */ + UtAssert_True(OS_ObjectIdEqual(timebase->first_cb, timer_objid_2), "First CB at timer 2"); + actual = OS_TimerDelete(timer_objid_2); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); - OS_timecb_table[1].timebase_token.obj_type = OS_OBJECT_TYPE_OS_TIMEBASE; - OS_timecb_table[1].timebase_token.obj_id = UT_OBJID_1; - OS_timecb_table[1].timebase_token.obj_idx = UT_INDEX_0; - OS_timecb_table[2].timebase_token = OS_timecb_table[1].timebase_token; - OS_timecb_table[2].next_cb = UT_OBJID_1; - OS_timecb_table[1].next_cb = UT_OBJID_1; - OS_timebase_table[0].first_cb = UT_OBJID_2; - actual = OS_TimerDelete(UT_OBJID_2); + /* After deleting timer 2 the "first_cb" should be pointing at timer 1 */ + UtAssert_True(OS_ObjectIdEqual(timebase->first_cb, timer_objid_1), "First CB at timer 1"); + + /* Re-add timer 2 again */ + OS_TimerAdd(&timer_objid_2, "UT2", timebase_id, UT_TimerArgCallback, NULL); + + /* Sanity check: the "first_cb" should be pointing at timer 2 again */ + UtAssert_True(OS_ObjectIdEqual(timebase->first_cb, timer_objid_2), "First CB at timer 2"); + + /* delete timer 1 */ + actual = OS_TimerDelete(timer_objid_1); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); - OS_timebase_table[0].first_cb = UT_OBJID_1; - actual = OS_TimerDelete(UT_OBJID_1); + /* The "first_cb" should be still pointing at timer 2 */ + UtAssert_True(OS_ObjectIdEqual(timebase->first_cb, timer_objid_2), "First CB at timer 2"); + + actual = OS_TimerDelete(timer_objid_2); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); + /* The "first_cb" should be undefined */ + UtAssert_True(!OS_ObjectIdDefined(timebase->first_cb), "First CB at OS_OBJECT_ID_UNDEFINED"); + /* verify deletion of the dedicated timebase objects * these are implicitly created as part of timer creation for API compatibility */ - OS_TimeBaseCreate(&timebase_id, "ut", NULL); - OS_UT_SetupTestTargetIndex(OS_OBJECT_TYPE_OS_TIMECB, UT_INDEX_1); - OS_timecb_table[1].flags = TIMECB_FLAG_DEDICATED_TIMEBASE; - OS_timecb_table[1].timebase_token.obj_type = OS_OBJECT_TYPE_OS_TIMEBASE; - OS_timecb_table[1].timebase_token.obj_id = timebase_id; - OS_timecb_table[1].timebase_token.obj_idx = OS_ObjectIdToInteger(timebase_id) & OS_OBJECT_INDEX_MASK; - actual = OS_TimerDelete(UT_OBJID_1); + OS_TimerCreate(&timer_objid_1, "UT1", &accuracy, UT_TimerCallback); + actual = OS_TimerDelete(timer_objid_1); UtAssert_True(actual == expected, "OS_TimerDelete() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(UT_GetStubCount(UT_KEY(OS_TimeBaseDelete)) == 1, "OS_TimerDelete() invoked OS_TimeBaseDelete()"); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c index f8d7d907c..f593d6148 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-idmap.c @@ -62,7 +62,7 @@ void Test_OS_Unlock_Global_Impl(void) UtAssert_True(UT_GetStubCount(UT_KEY(OCS_semGive)) == 1, "semTake() called"); UT_SetDefaultReturnValue(UT_KEY(OCS_semGive), -1); - OS_Lock_Global_Impl(OS_OBJECT_TYPE_OS_TASK); /* for coverage of error path */ + OS_Unlock_Global_Impl(OS_OBJECT_TYPE_OS_TASK); /* for coverage of error path */ } void Test_OS_API_Impl_Init(void) @@ -78,6 +78,22 @@ void Test_OS_API_Impl_Init(void) OSAPI_TEST_FUNCTION_RC(UT_Call_OS_VxWorks_TableMutex_Init(OS_OBJECT_TYPE_OS_TASK), OS_SUCCESS); } +void Test_OS_WaitForStateChange_Impl(void) +{ + /* + * Test Case For: + * void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) + */ + + /* + * This has no return value/error results - just needs to be called for coverage. + * Call it once with a low number and once with a high number of attempts - + * which should cause it to hit its limit for wait time. + */ + OS_WaitForStateChange_Impl(OS_OBJECT_TYPE_OS_TASK, 1); + OS_WaitForStateChange_Impl(OS_OBJECT_TYPE_OS_TASK, 1000); +} + /* ------------------- End of test cases --------------------------------------*/ /* Osapi_Test_Setup @@ -108,4 +124,5 @@ void UtTest_Setup(void) ADD_TEST(OS_Lock_Global_Impl); ADD_TEST(OS_Unlock_Global_Impl); ADD_TEST(OS_API_Impl_Init); + ADD_TEST(OS_WaitForStateChange_Impl); } diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c index 5b20961e7..8af36a00d 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c @@ -132,6 +132,18 @@ void Test_OS_TaskDelete_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_TaskDelete_Impl(&token), OS_ERROR); } +void Test_OS_TaskDetach_Impl(void) +{ + /* + * Test Case For: + * int32 OS_TaskDetach_Impl(const OS_object_token_t *token) + */ + OS_object_token_t token; + + /* no-op on VxWorks - always returns sucess */ + OSAPI_TEST_FUNCTION_RC(OS_TaskDetach_Impl(&token), OS_SUCCESS); +} + void Test_OS_TaskExit_Impl(void) { /* @@ -280,6 +292,7 @@ void UtTest_Setup(void) ADD_TEST(OS_VxWorksEntry); ADD_TEST(OS_TaskMatch_Impl); ADD_TEST(OS_TaskDelete_Impl); + ADD_TEST(OS_TaskDetach_Impl); ADD_TEST(OS_TaskExit_Impl); ADD_TEST(OS_TaskDelay_Impl); ADD_TEST(OS_TaskSetPriority_Impl); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c index 99e64ca8f..5455ecce4 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-timebase.c @@ -110,9 +110,15 @@ void Test_OS_TimeBaseCreate_Impl(void) * This should be done first as it will assign the "external_sync" * and therefore cause future calls to skip this block. */ - memset(&id, 0x01, sizeof(id)); + id = OS_ObjectIdFromInteger(OS_OBJECT_TYPE_OS_TIMEBASE << OS_OBJECT_TYPE_SHIFT); + + OS_global_timebase_table[0].active_id = id; + UT_TimeBaseTest_Setup(UT_INDEX_0, OCS_SIGRTMIN, false); + + id = OS_ObjectIdFromInteger(OS_ObjectIdToInteger(id) + 1); + OS_global_timebase_table[1].active_id = id; - UT_TimeBaseTest_Setup(UT_INDEX_1, OCS_SIGRTMIN, false); + UT_TimeBaseTest_Setup(UT_INDEX_1, 1 + OCS_SIGRTMIN, false); UT_SetDefaultReturnValue(UT_KEY(OCS_sigismember), true); OSAPI_TEST_FUNCTION_RC(OS_TimeBaseCreate_Impl(&token), OS_TIMER_ERR_UNAVAILABLE); UT_ResetState(UT_KEY(OCS_sigismember)); @@ -158,6 +164,11 @@ void Test_OS_TimeBaseCreate_Impl(void) UT_SetDefaultReturnValue(UT_KEY(OCS_timer_create), -1); UT_TimeBaseTest_CallRegisterTimer(OS_OBJECT_ID_UNDEFINED); UtAssert_True(UT_TimeBaseTest_CheckTimeBaseErrorState(UT_INDEX_0), "timer registration failure state"); + + UT_TimeBaseTest_ClearTimeBaseRegState(UT_INDEX_1); + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + UT_TimeBaseTest_CallRegisterTimer(OS_OBJECT_ID_UNDEFINED); + UtAssert_True(!UT_TimeBaseTest_CheckTimeBaseRegisteredState(UT_INDEX_0), "timer registration bad ID"); } void Test_OS_VxWorks_SigWait(void) diff --git a/src/ut-stubs/osapi-utstub-binsem.c b/src/ut-stubs/osapi-utstub-binsem.c index e85d4559e..3b7fd4da3 100644 --- a/src/ut-stubs/osapi-utstub-binsem.c +++ b/src/ut-stubs/osapi-utstub-binsem.c @@ -131,7 +131,7 @@ int32 OS_BinSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_initia if (status == OS_SUCCESS) { - *sem_id = UT_AllocStubObjId(UT_OBJTYPE_BINSEM); + *sem_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_BINSEM); } else { @@ -196,7 +196,7 @@ int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_BinSemGetInfo), bin_prop, sizeof(*bin_prop)) < sizeof(*bin_prop)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &bin_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &bin_prop->creator); strncpy(bin_prop->name, "Name", OS_MAX_API_NAME - 1); bin_prop->name[OS_MAX_API_NAME - 1] = '\0'; } @@ -234,7 +234,7 @@ int32 OS_BinSemDelete(osal_id_t sem_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_BINSEM, sem_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_BINSEM, sem_id); } return status; @@ -288,7 +288,7 @@ int32 OS_BinSemGetIdByName(osal_id_t *sem_id, const char *sem_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_BinSemGetIdByName), sem_id, sizeof(*sem_id)) < sizeof(*sem_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_BINSEM, sem_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_BINSEM, sem_id); } return status; diff --git a/src/ut-stubs/osapi-utstub-countsem.c b/src/ut-stubs/osapi-utstub-countsem.c index f4c4d3934..602af87f8 100644 --- a/src/ut-stubs/osapi-utstub-countsem.c +++ b/src/ut-stubs/osapi-utstub-countsem.c @@ -55,7 +55,7 @@ int32 OS_CountSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 sem_init if (status == OS_SUCCESS) { - *sem_id = UT_AllocStubObjId(UT_OBJTYPE_COUNTSEM); + *sem_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_COUNTSEM); } else { @@ -95,7 +95,7 @@ int32 OS_CountSemDelete(osal_id_t sem_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_COUNTSEM, sem_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_COUNTSEM, sem_id); } return status; @@ -167,7 +167,7 @@ int32 OS_CountSemGetIdByName(osal_id_t *sem_id, const char *sem_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_CountSemGetIdByName), sem_id, sizeof(*sem_id)) < sizeof(*sem_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_COUNTSEM, sem_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_COUNTSEM, sem_id); } return status; @@ -201,7 +201,7 @@ int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_CountSemGetInfo), count_prop, sizeof(*count_prop)) < sizeof(*count_prop)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &count_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &count_prop->creator); strncpy(count_prop->name, "Name", OS_MAX_API_NAME - 1); count_prop->name[OS_MAX_API_NAME - 1] = '\0'; } diff --git a/src/ut-stubs/osapi-utstub-dir.c b/src/ut-stubs/osapi-utstub-dir.c index 7f53306e8..43ad38760 100644 --- a/src/ut-stubs/osapi-utstub-dir.c +++ b/src/ut-stubs/osapi-utstub-dir.c @@ -86,7 +86,7 @@ int32 OS_DirectoryOpen(osal_id_t *dir_id, const char *path) if (Status == OS_SUCCESS) { - *dir_id = UT_AllocStubObjId(UT_OBJTYPE_DIR); + *dir_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_DIR); } else { @@ -111,7 +111,7 @@ int32 OS_DirectoryClose(osal_id_t dir_id) if (Status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_DIR, dir_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_DIR, dir_id); } return Status; diff --git a/src/ut-stubs/osapi-utstub-file.c b/src/ut-stubs/osapi-utstub-file.c index 6efd2913f..29a73f4c6 100644 --- a/src/ut-stubs/osapi-utstub-file.c +++ b/src/ut-stubs/osapi-utstub-file.c @@ -126,7 +126,7 @@ int32 OS_creat(const char *path, int32 access) if (status == OS_SUCCESS) { - objid = UT_AllocStubObjId(UT_OBJTYPE_FILESTREAM); + objid = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_STREAM); status = OS_ObjectIdToInteger(objid); } @@ -150,7 +150,7 @@ int32 OS_open(const char *path, int32 access, uint32 mode) if (status == OS_SUCCESS) { - objid = UT_AllocStubObjId(UT_OBJTYPE_FILESTREAM); + objid = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_STREAM); status = OS_ObjectIdToInteger(objid); } @@ -175,7 +175,7 @@ int32 OS_OpenCreate(osal_id_t *filedes, const char *path, int32 flags, int32 acc status = UT_DEFAULT_IMPL(OS_OpenCreate); if (status == OS_SUCCESS) { - *filedes = UT_AllocStubObjId(UT_OBJTYPE_FILESTREAM); + *filedes = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_STREAM); } else { @@ -200,7 +200,7 @@ int32 OS_close(osal_id_t filedes) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_FILESTREAM, filedes); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_STREAM, filedes); } return status; @@ -430,7 +430,7 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) { memset(fd_prop, 0, sizeof(*fd_prop)); fd_prop->IsValid = true; - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &fd_prop->User); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &fd_prop->User); } } diff --git a/src/ut-stubs/osapi-utstub-filesys.c b/src/ut-stubs/osapi-utstub-filesys.c index f0f4d6175..79622066d 100644 --- a/src/ut-stubs/osapi-utstub-filesys.c +++ b/src/ut-stubs/osapi-utstub-filesys.c @@ -54,7 +54,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const if (status == OS_SUCCESS) { - *filesys_id = UT_AllocStubObjId(UT_OBJTYPE_FILESYS); + *filesys_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_FILESYS); } else { @@ -210,7 +210,8 @@ int32 OS_FileSysStatVolume(const char *name, OS_statvfs_t *statbuf) status = UT_DEFAULT_IMPL(OS_FileSysStatVolume); - if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_FileSysStatVolume), statbuf, sizeof(*statbuf)) < sizeof(*statbuf)) + if (status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_FileSysStatVolume), statbuf, sizeof(*statbuf)) < sizeof(*statbuf)) { memset(statbuf, 0, sizeof(*statbuf)); } diff --git a/src/ut-stubs/osapi-utstub-idmap.c b/src/ut-stubs/osapi-utstub-idmap.c index 4b2bd3992..54078c925 100644 --- a/src/ut-stubs/osapi-utstub-idmap.c +++ b/src/ut-stubs/osapi-utstub-idmap.c @@ -43,7 +43,7 @@ /* * UT Helper function to create a fake object lock token */ -static void UT_TokenCompose(uint32 lock_mode, uint32 indx, UT_ObjType_t objtype, OS_object_token_t *token) +static void UT_TokenCompose(uint32 lock_mode, uint32 indx, osal_objtype_t objtype, OS_object_token_t *token) { token->lock_mode = lock_mode; token->obj_type = objtype; @@ -72,7 +72,7 @@ uint32 OS_GetMaxForObjectType(osal_objtype_t idtype) { int32 max; - if (idtype > UT_OBJTYPE_NONE && idtype < UT_OBJTYPE_MAX) + if (idtype > OS_OBJECT_TYPE_UNDEFINED && idtype < OS_OBJECT_TYPE_USER) { max = OSAL_MAX_VALID_PER_TYPE; } @@ -93,7 +93,7 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) { int32 base; - if (idtype > UT_OBJTYPE_NONE && idtype < UT_OBJTYPE_MAX) + if (idtype > OS_OBJECT_TYPE_UNDEFINED && idtype < OS_OBJECT_TYPE_USER) { base = OSAL_MAX_VALID_PER_TYPE * (idtype - 1); } @@ -112,9 +112,9 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) *****************************************************************************/ int32 OS_ObjectIdToArrayIndex(osal_objtype_t idtype, osal_id_t id, osal_index_t *ArrayIndex) { - int32 Status; - UT_ObjType_t checktype; - uint32 tempserial; + int32 Status; + osal_objtype_t checktype; + uint32 tempserial; Status = UT_DEFAULT_IMPL(OS_ObjectIdToArrayIndex); @@ -457,9 +457,9 @@ int32 OS_ConvertToArrayIndex(osal_id_t object_id, osal_index_t *ArrayIndex) if (return_code == OS_SUCCESS) { - UT_ObjType_t ObjType; + osal_objtype_t ObjType; UT_ObjIdDecompose(object_id, &tempserial, &ObjType); - if (ObjType != UT_OBJTYPE_NONE && ObjType < UT_OBJTYPE_MAX) + if (ObjType != OS_OBJECT_TYPE_UNDEFINED && ObjType < OS_OBJECT_TYPE_USER) { tempserial %= UT_MAXOBJS[ObjType]; } @@ -603,7 +603,7 @@ void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter) UT_DEFAULT_IMPL(OS_ObjectIdIteratorDestroy); } -int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t, void*)) +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t, void *)) { int32 Status; @@ -623,53 +623,13 @@ osal_objtype_t OS_IdentifyObject(osal_id_t object_id) { UT_Stub_RegisterContextGenericArg(UT_KEY(OS_IdentifyObject), object_id); - UT_ObjType_t ObjType; - uint32 checkindx; - int32 DefaultType; + osal_objtype_t ObjType; + uint32 checkindx; + int32 DefaultType; UT_ObjIdDecompose(object_id, &checkindx, &ObjType); - switch (ObjType) - { - case UT_OBJTYPE_TASK: - DefaultType = OS_OBJECT_TYPE_OS_TASK; - break; - case UT_OBJTYPE_QUEUE: - DefaultType = OS_OBJECT_TYPE_OS_QUEUE; - break; - case UT_OBJTYPE_COUNTSEM: - DefaultType = OS_OBJECT_TYPE_OS_COUNTSEM; - break; - case UT_OBJTYPE_BINSEM: - DefaultType = OS_OBJECT_TYPE_OS_BINSEM; - break; - case UT_OBJTYPE_MUTEX: - DefaultType = OS_OBJECT_TYPE_OS_MUTEX; - break; - case UT_OBJTYPE_TIMECB: - DefaultType = OS_OBJECT_TYPE_OS_TIMECB; - break; - case UT_OBJTYPE_MODULE: - DefaultType = OS_OBJECT_TYPE_OS_MODULE; - break; - case UT_OBJTYPE_FILESTREAM: - DefaultType = OS_OBJECT_TYPE_OS_STREAM; - break; - case UT_OBJTYPE_TIMEBASE: - DefaultType = OS_OBJECT_TYPE_OS_TIMEBASE; - break; - case UT_OBJTYPE_DIR: - DefaultType = OS_OBJECT_TYPE_OS_DIR; - break; - case UT_OBJTYPE_FILESYS: - DefaultType = OS_OBJECT_TYPE_OS_FILESYS; - break; - default: - DefaultType = OS_OBJECT_TYPE_UNDEFINED; - break; - } - - DefaultType = UT_DEFAULT_IMPL_RC(OS_IdentifyObject, DefaultType); + DefaultType = UT_DEFAULT_IMPL_RC(OS_IdentifyObject, ObjType); return DefaultType; } diff --git a/src/ut-stubs/osapi-utstub-module.c b/src/ut-stubs/osapi-utstub-module.c index 793369360..e62c85d2b 100644 --- a/src/ut-stubs/osapi-utstub-module.c +++ b/src/ut-stubs/osapi-utstub-module.c @@ -94,7 +94,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f if (status == OS_SUCCESS) { - *module_id = UT_AllocStubObjId(UT_OBJTYPE_MODULE); + *module_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_MODULE); } else { @@ -134,7 +134,7 @@ int32 OS_ModuleUnload(osal_id_t module_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_MODULE, module_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_MODULE, module_id); } return status; diff --git a/src/ut-stubs/osapi-utstub-mutex.c b/src/ut-stubs/osapi-utstub-mutex.c index baf060e93..fea9de66a 100644 --- a/src/ut-stubs/osapi-utstub-mutex.c +++ b/src/ut-stubs/osapi-utstub-mutex.c @@ -70,7 +70,7 @@ int32 OS_MutSemCreate(osal_id_t *sem_id, const char *sem_name, uint32 options) if (status == OS_SUCCESS) { - *sem_id = UT_AllocStubObjId(UT_OBJTYPE_MUTEX); + *sem_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_MUTEX); } else { @@ -110,7 +110,7 @@ int32 OS_MutSemDelete(osal_id_t sem_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_MUTEX, sem_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_MUTEX, sem_id); } return status; @@ -195,7 +195,7 @@ int32 OS_MutSemGetIdByName(osal_id_t *sem_id, const char *sem_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_MutSemGetIdByName), sem_id, sizeof(*sem_id)) < sizeof(*sem_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_MUTEX, sem_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_MUTEX, sem_id); } return status; @@ -231,7 +231,7 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) { strncpy(mut_prop->name, "Name", OS_MAX_API_NAME - 1); mut_prop->name[OS_MAX_API_NAME - 1] = '\0'; - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &mut_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &mut_prop->creator); } return status; diff --git a/src/ut-stubs/osapi-utstub-queue.c b/src/ut-stubs/osapi-utstub-queue.c index 77ed039ac..1888f10df 100644 --- a/src/ut-stubs/osapi-utstub-queue.c +++ b/src/ut-stubs/osapi-utstub-queue.c @@ -78,7 +78,7 @@ int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcoun if (status == OS_SUCCESS) { - *queue_id = UT_AllocStubObjId(UT_OBJTYPE_QUEUE); + *queue_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_QUEUE); } else { @@ -121,7 +121,7 @@ int32 OS_QueueDelete(osal_id_t queue_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_QUEUE, queue_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_QUEUE, queue_id); } return status; @@ -235,7 +235,7 @@ int32 OS_QueueGetIdByName(osal_id_t *queue_id, const char *queue_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_QueueGetIdByName), queue_id, sizeof(*queue_id)) < sizeof(*queue_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_QUEUE, queue_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_QUEUE, queue_id); } return status; @@ -269,7 +269,7 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_QueueGetInfo), queue_prop, sizeof(*queue_prop)) < sizeof(*queue_prop)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &queue_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &queue_prop->creator); strncpy(queue_prop->name, "Name", OS_MAX_API_NAME - 1); queue_prop->name[OS_MAX_API_NAME - 1] = '\0'; } diff --git a/src/ut-stubs/osapi-utstub-sockets.c b/src/ut-stubs/osapi-utstub-sockets.c index 3eb783d15..bd95e9598 100644 --- a/src/ut-stubs/osapi-utstub-sockets.c +++ b/src/ut-stubs/osapi-utstub-sockets.c @@ -52,7 +52,7 @@ int32 OS_SocketOpen(osal_id_t *sock_id, OS_SocketDomain_t Domain, OS_SocketType_ if (status == OS_SUCCESS) { - *sock_id = UT_AllocStubObjId(UT_OBJTYPE_SOCKET); + *sock_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_STREAM); } return status; @@ -209,7 +209,7 @@ int32 OS_SocketGetIdByName(osal_id_t *sock_id, const char *sock_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_SocketGetIdByName), sock_id, sizeof(*sock_id)) < sizeof(*sock_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_SOCKET, sock_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_STREAM, sock_id); } return status; @@ -236,7 +236,7 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) CopySize = UT_Stub_CopyToLocal(UT_KEY(OS_SocketGetInfo), sock_prop, sizeof(*sock_prop)); if (CopySize < sizeof(*sock_prop)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &sock_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &sock_prop->creator); strncpy(sock_prop->name, "ut", sizeof(sock_prop->name)); } } diff --git a/src/ut-stubs/osapi-utstub-task.c b/src/ut-stubs/osapi-utstub-task.c index f29990f8b..9d6db317b 100644 --- a/src/ut-stubs/osapi-utstub-task.c +++ b/src/ut-stubs/osapi-utstub-task.c @@ -70,7 +70,7 @@ int32 OS_TaskCreate(osal_id_t *task_id, const char *task_name, osal_task_entry f if (status == OS_SUCCESS) { - *task_id = UT_AllocStubObjId(UT_OBJTYPE_TASK); + *task_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_TASK); } else { @@ -106,7 +106,7 @@ int32 OS_TaskDelete(osal_id_t task_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_TASK, task_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_TASK, task_id); } return status; @@ -224,7 +224,7 @@ osal_id_t OS_TaskGetId(void) int32 status; status = UT_DEFAULT_IMPL_RC(OS_TaskGetId, 1); - UT_ObjIdCompose(status, UT_OBJTYPE_TASK, &TaskId); + UT_ObjIdCompose(status, OS_OBJECT_TYPE_OS_TASK, &TaskId); return TaskId; } @@ -246,7 +246,7 @@ int32 OS_TaskGetIdByName(osal_id_t *task_id, const char *task_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_TaskGetIdByName), task_id, sizeof(*task_id)) < sizeof(*task_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, task_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, task_id); } return status; @@ -281,7 +281,7 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_TaskGetInfo), task_prop, sizeof(*task_prop)) < sizeof(*task_prop)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &task_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &task_prop->creator); task_prop->stack_size = OSAL_SIZE_C(100); task_prop->priority = OSAL_PRIORITY_C(150); strncpy(task_prop->name, "UnitTest", OS_MAX_API_NAME - 1); @@ -316,7 +316,7 @@ int32 OS_TaskFindIdBySystemData(osal_id_t *task_id, const void *sysdata, size_t if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_TaskFindIdBySystemData), task_id, sizeof(*task_id)) < sizeof(*task_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, task_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, task_id); } return status; diff --git a/src/ut-stubs/osapi-utstub-time.c b/src/ut-stubs/osapi-utstub-time.c index 585463c67..e8478332a 100644 --- a/src/ut-stubs/osapi-utstub-time.c +++ b/src/ut-stubs/osapi-utstub-time.c @@ -57,7 +57,7 @@ int32 OS_TimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_t timebas if (status == OS_SUCCESS) { - *timer_id = UT_AllocStubObjId(UT_OBJTYPE_TIMECB); + *timer_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_TIMECB); } else { @@ -86,7 +86,7 @@ int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *clock_ if (status == OS_SUCCESS) { - *timer_id = UT_AllocStubObjId(UT_OBJTYPE_TIMECB); + *timer_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_TIMECB); } else { @@ -139,7 +139,7 @@ int32 OS_TimerDelete(osal_id_t timer_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_TIMECB, timer_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_TIMECB, timer_id); } return status; @@ -162,7 +162,7 @@ int32 OS_TimerGetIdByName(osal_id_t *timer_id, const char *timer_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_TimerGetIdByName), timer_id, sizeof(*timer_id)) < sizeof(*timer_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TIMECB, timer_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TIMECB, timer_id); } return status; @@ -200,7 +200,7 @@ int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop) UT_Stub_CopyToLocal(UT_KEY(OS_TimerGetInfo), timer_prop, sizeof(*timer_prop)) < sizeof(*timer_prop)) { memset(timer_prop, 0, sizeof(*timer_prop)); - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &timer_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &timer_prop->creator); } return status; diff --git a/src/ut-stubs/osapi-utstub-timebase.c b/src/ut-stubs/osapi-utstub-timebase.c index 16b490479..c654eefb2 100644 --- a/src/ut-stubs/osapi-utstub-timebase.c +++ b/src/ut-stubs/osapi-utstub-timebase.c @@ -54,7 +54,7 @@ int32 OS_TimeBaseCreate(osal_id_t *timebase_id, const char *timebase_name, OS_Ti if (status == OS_SUCCESS) { - *timebase_id = UT_AllocStubObjId(UT_OBJTYPE_TIMEBASE); + *timebase_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_TIMEBASE); } else { @@ -97,7 +97,7 @@ int32 OS_TimeBaseDelete(osal_id_t timebase_id) if (status == OS_SUCCESS) { - UT_DeleteStubObjId(UT_OBJTYPE_TIMEBASE, timebase_id); + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_TIMEBASE, timebase_id); } return status; @@ -120,7 +120,7 @@ int32 OS_TimeBaseGetIdByName(osal_id_t *timebase_id, const char *timebase_name) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_TimeBaseGetIdByName), timebase_id, sizeof(*timebase_id)) < sizeof(*timebase_id)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TIMEBASE, timebase_id); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_id); } return status; @@ -143,7 +143,7 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_TimeBaseGetInfo), timebase_prop, sizeof(*timebase_prop)) < sizeof(*timebase_prop)) { - UT_ObjIdCompose(1, UT_OBJTYPE_TASK, &timebase_prop->creator); + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &timebase_prop->creator); strncpy(timebase_prop->name, "Name", OS_MAX_API_NAME - 1); timebase_prop->name[OS_MAX_API_NAME - 1] = '\0'; } diff --git a/src/ut-stubs/utstub-helpers.c b/src/ut-stubs/utstub-helpers.c index 9d5c1824c..4050b2726 100644 --- a/src/ut-stubs/utstub-helpers.c +++ b/src/ut-stubs/utstub-helpers.c @@ -36,19 +36,19 @@ #include "osapi-idmap.h" -const uint32 UT_MAXOBJS[UT_OBJTYPE_MAX] = {[UT_OBJTYPE_TASK] = OS_MAX_TASKS, - [UT_OBJTYPE_QUEUE] = OS_MAX_QUEUES, - [UT_OBJTYPE_COUNTSEM] = OS_MAX_COUNT_SEMAPHORES, - [UT_OBJTYPE_BINSEM] = OS_MAX_BIN_SEMAPHORES, - [UT_OBJTYPE_MUTEX] = OS_MAX_MUTEXES, - [UT_OBJTYPE_TIMECB] = OS_MAX_TIMERS, - [UT_OBJTYPE_MODULE] = OS_MAX_MODULES, - [UT_OBJTYPE_FILESTREAM] = OS_MAX_NUM_OPEN_FILES, - [UT_OBJTYPE_TIMEBASE] = OS_MAX_TIMEBASES, - [UT_OBJTYPE_FILESYS] = OS_MAX_FILE_SYSTEMS, - [UT_OBJTYPE_DIR] = OS_MAX_NUM_OPEN_DIRS}; - -static UT_ObjTypeState_t UT_ObjState[UT_OBJTYPE_MAX]; +const uint32 UT_MAXOBJS[OS_OBJECT_TYPE_USER] = {[OS_OBJECT_TYPE_OS_TASK] = OS_MAX_TASKS, + [OS_OBJECT_TYPE_OS_QUEUE] = OS_MAX_QUEUES, + [OS_OBJECT_TYPE_OS_COUNTSEM] = OS_MAX_COUNT_SEMAPHORES, + [OS_OBJECT_TYPE_OS_BINSEM] = OS_MAX_BIN_SEMAPHORES, + [OS_OBJECT_TYPE_OS_MUTEX] = OS_MAX_MUTEXES, + [OS_OBJECT_TYPE_OS_TIMECB] = OS_MAX_TIMERS, + [OS_OBJECT_TYPE_OS_MODULE] = OS_MAX_MODULES, + [OS_OBJECT_TYPE_OS_STREAM] = OS_MAX_NUM_OPEN_FILES, + [OS_OBJECT_TYPE_OS_TIMEBASE] = OS_MAX_TIMEBASES, + [OS_OBJECT_TYPE_OS_FILESYS] = OS_MAX_FILE_SYSTEMS, + [OS_OBJECT_TYPE_OS_DIR] = OS_MAX_NUM_OPEN_DIRS}; + +static UT_ObjTypeState_t UT_ObjState[OS_OBJECT_TYPE_USER]; /** * Initialization function @@ -64,7 +64,7 @@ void UT_ClearAllStubObjects(void) /* * Helper function - "allocate" a fake object ID of the given type */ -osal_id_t UT_AllocStubObjId(UT_ObjType_t ObjType) +osal_id_t UT_AllocStubObjId(osal_objtype_t ObjType) { UT_ObjTypeState_t *StatePtr; uint8 ObjMask; @@ -73,7 +73,7 @@ osal_id_t UT_AllocStubObjId(UT_ObjType_t ObjType) UT_Stub_CallOnce(UT_ClearAllStubObjects); - if (ObjType == UT_OBJTYPE_NONE || ObjType >= UT_OBJTYPE_MAX) + if (ObjType == OS_OBJECT_TYPE_UNDEFINED || ObjType >= OS_OBJECT_TYPE_USER) { /* Code is broken, abort the test * (This signifies an error in the stub code itself hence the abort) @@ -115,11 +115,11 @@ osal_id_t UT_AllocStubObjId(UT_ObjType_t ObjType) /* * Helper function - "deallocate" a fake object ID of the given type */ -void UT_DeleteStubObjId(UT_ObjType_t ObjType, osal_id_t ObjId) +void UT_DeleteStubObjId(osal_objtype_t ObjType, osal_id_t ObjId) { UT_ObjTypeState_t *StatePtr; uint8 ObjMask; - UT_ObjType_t checktype; + osal_objtype_t checktype; uint32 checkidx; bool ObjWasValid; @@ -171,14 +171,14 @@ void UT_DeleteStubObjId(UT_ObjType_t ObjType, osal_id_t ObjId) } } -void UT_ObjIdCompose(uint32 indx, UT_ObjType_t objtype, osal_id_t *id) +void UT_ObjIdCompose(uint32 indx, osal_objtype_t objtype, osal_id_t *id) { /* note - the OS_ObjectIdFromInteger() is an inline function, * and therefore this uses the real thing and not a stub */ *id = OS_ObjectIdFromInteger((unsigned long)indx | ((0x4000UL | objtype) << 16)); } -void UT_ObjIdDecompose(osal_id_t id, uint32 *indx, UT_ObjType_t *objtype) +void UT_ObjIdDecompose(osal_id_t id, uint32 *indx, osal_objtype_t *objtype) { unsigned long idv = OS_ObjectIdToInteger(id); *indx = idv & 0xFFFFUL; diff --git a/src/ut-stubs/utstub-helpers.h b/src/ut-stubs/utstub-helpers.h index 6450aaeb5..8ac67a561 100644 --- a/src/ut-stubs/utstub-helpers.h +++ b/src/ut-stubs/utstub-helpers.h @@ -46,29 +46,12 @@ #include "common_types.h" #include "osapi-error.h" #include "osapi-constants.h" +#include "osapi-idmap.h" #include "utstubs.h" #include "utbsp.h" #include "utassert.h" #include "uttools.h" -typedef enum -{ - UT_OBJTYPE_NONE = 0, - UT_OBJTYPE_TASK, - UT_OBJTYPE_QUEUE, - UT_OBJTYPE_COUNTSEM, - UT_OBJTYPE_BINSEM, - UT_OBJTYPE_MUTEX, - UT_OBJTYPE_TIMECB, - UT_OBJTYPE_MODULE, - UT_OBJTYPE_FILESTREAM, - UT_OBJTYPE_SOCKET, - UT_OBJTYPE_TIMEBASE, - UT_OBJTYPE_DIR, - UT_OBJTYPE_FILESYS, - UT_OBJTYPE_MAX -} UT_ObjType_t; - /* * A constant to use in stubs where no other value is applicable */ @@ -100,12 +83,12 @@ extern const uint32 UT_MAXOBJS[]; /* * Helper function - "allocate" a fake object ID of the given type */ -osal_id_t UT_AllocStubObjId(UT_ObjType_t ObjType); +osal_id_t UT_AllocStubObjId(osal_objtype_t ObjType); /* * Helper function - "deallocate" a fake object ID of the given type */ -void UT_DeleteStubObjId(UT_ObjType_t ObjType, osal_id_t ObjId); +void UT_DeleteStubObjId(osal_objtype_t ObjType, osal_id_t ObjId); /* * Helper function - Clear all OSAL UT stub objects @@ -117,7 +100,7 @@ void UT_ClearAllStubObjects(void); * Compose/Decompose a unit test object ID from an index and type. * This is the UT-specific version not related to the OSAL runtime version. */ -void UT_ObjIdCompose(uint32 indx, UT_ObjType_t objtype, osal_id_t *id); -void UT_ObjIdDecompose(osal_id_t id, uint32 *indx, UT_ObjType_t *objtype); +void UT_ObjIdCompose(uint32 indx, osal_objtype_t objtype, osal_id_t *id); +void UT_ObjIdDecompose(osal_id_t id, uint32 *indx, osal_objtype_t *objtype); #endif From 3b2c729809c970bdc674fe2e7d991ac710d918a8 Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Wed, 27 Jan 2021 12:44:52 -0500 Subject: [PATCH 093/111] Fix #765, add null pointer check. --- src/os/shared/src/osapi-idmap.c | 3 --- src/os/shared/src/osapi-printf.c | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index d6e16791e..d44cab065 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -1439,9 +1439,6 @@ void OS_ForEachObjectOfType(osal_objtype_t idtype, osal_id_t creator_id, OS_ArgC OS_object_iter_t iter; OS_creator_filter_t filter; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - // OS_CHECK_POINTER(callback_arg) - filter.creator_id = creator_id; filter.user_callback = callback_ptr; filter.user_arg = callback_arg; diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index a6879f986..5b766193d 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -256,8 +256,7 @@ void OS_printf(const char *String, ...) char msg_buffer[OS_BUFFER_SIZE]; int actualsz; - /* TODO: void pointer, https://github.com/nasa/osal/issues/765 */ - // OS_CHECK_POINTER(String); + BUGCHECK((String) != NULL, ) if (!OS_SharedGlobalVars.Initialized) { From 72da4f28bc925d13f36d38e0016029a96b0770d7 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 3 Feb 2021 11:10:54 -0500 Subject: [PATCH 094/111] Fix #771, Add workflow timeout and format check --- .github/workflows/format-check.yml | 53 +++++++++++++++++++++++ .github/workflows/static-analysis.yml | 1 + .travis.yml | 61 --------------------------- README.md | 3 +- 4 files changed, 56 insertions(+), 62 deletions(-) create mode 100644 .github/workflows/format-check.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml new file mode 100644 index 000000000..0a998eccb --- /dev/null +++ b/.github/workflows/format-check.yml @@ -0,0 +1,53 @@ +name: Format Check + +# Run on main push and pull requests +on: + push: + branches: + - main + pull_request: + +jobs: + + static-analysis: + name: Run format check + runs-on: ubuntu-18.04 + timeout-minutes: 15 + + steps: + + - name: Install format checker + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo add-apt-repository 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main' + sudo apt-get update && sudo apt-get install clang-format-10 + + - name: Checkout bundle + uses: actions/checkout@v2 + with: + repository: nasa/cFS + + - name: Checkout + uses: actions/checkout@v2 + with: + path: repo + + - name: Generate format differences + run: | + cd repo + find . -name "*.[ch]" -exec clang-format-10 -i -style=file {} + + git diff > $GITHUB_WORKSPACE/style_differences.txt + + - name: Archive Static Analysis Artifacts + uses: actions/upload-artifact@v2 + with: + name: style_differences + path: style_differences.txt + + - name: Error on differences + run: | + if [[ -s style_differences.txt ]]; + then + cat style_differences.txt + exit -1 + fi diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 3a4f0e9cd..b81b11aa5 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -12,6 +12,7 @@ jobs: static-analysis: name: Run cppcheck runs-on: ubuntu-18.04 + timeout-minutes: 15 strategy: fail-fast: false diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 17b4806e5..000000000 --- a/.travis.yml +++ /dev/null @@ -1,61 +0,0 @@ -os: linux -dist: bionic -language: c -compiler: - - gcc -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - cmake cppcheck lcov - -_functional_test: &functional_test - script: - # Check versions - - cppcheck --version - - #cppcheck flight software osal/src/bsp, osal/src/os - - cppcheck --force --inline-suppr --std=c99 --language=c --error-exitcode=1 - --enable=warning,performance,portability,style --suppress=variableScope - --inconclusive --quiet src/bsp src/os 2>cppcheck_flight_osal.txt - - | - if [[ -s cppcheck_flight_osal.txt ]]; then - echo "You must fix cppcheck errors before submitting a pull request" - echo "" - cat cppcheck_flight_osal.txt - exit -1 - fi - - # Setup - - mkdir build - - cd build - - # Prep and build - - cmake -DENABLE_UNIT_TESTS=true -DOSAL_SYSTEM_BSPTYPE=generic-linux -DOSAL_CONFIG_DEBUG_PERMISSIVE_MODE=TRUE .. - - make - - # lcov capture pre-execution - - lcov --rc lcov_branch_coverage=1 --capture --initial --directory ./ --output-file coverage_base.info - - # Test - - make test - - # lcov post run analysis - - lcov --rc lcov_branch_coverage=1 --capture --directory ./ --output-file coverage_test.info - - lcov --rc lcov_branch_coverage=1 --add-tracefile coverage_base.info --add-tracefile - coverage_test.info --output-file coverage_total.info - - lcov --rc lcov_branch_coverage=1 --remove coverage_total.info '*unit-test-coverage*' - --output-file coverage_filtered.info - - genhtml coverage_filtered.info --output-directory lcov - -jobs: - include: - - env: BUILDTYPE=release OSAL_OMIT_DEPRECATED=true - <<: *functional_test - - env: BUILDTYPE=release OSAL_OMIT_DEPRECATED=false - <<: *functional_test - - env: BUILDTYPE=debug OSAL_OMIT_DEPRECATED=true - <<: *functional_test - - env: BUILDTYPE=debug OSAL_OMIT_DEPRECATED=false - <<: *functional_test diff --git a/README.md b/README.md index 51e3caaff..04f6c960d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -Travis-CI: [![Build Status](https://travis-ci.com/nasa/osal.svg)](https://travis-ci.com/nasa/osal) +![Static Analysis](https://github.com/nasa/osal/workflows/Static%20Analysis/badge.svg) +![Format Check](https://github.com/nasa/osal/workflows/Format%20Check/badge.svg) # Core Flight System : Framework : Operating System Abstraction Layer From a51fc93b1b8d61fd9a2b36186d18016e14f195df Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 9 Feb 2021 10:17:35 -0500 Subject: [PATCH 095/111] Fix #777, Static allocation of DummyVec in OSC_INUM_TO_IVEC stub --- .../ut-stubs/src/vxworks-intLib-stubs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c b/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c index 61499b1a3..d9112647a 100644 --- a/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c @@ -50,10 +50,10 @@ static void OCS_intLib_dummyfunc(void) {} OCS_VOIDFUNCPTR *OCS_INUM_TO_IVEC(unsigned int ui) { - int32 Status = UT_DEFAULT_IMPL(OCS_INUM_TO_IVEC); - OCS_VOIDFUNCPTR *VecTbl; - OCS_VOIDFUNCPTR DummyVec; - size_t VecTblSize; + int32 Status = UT_DEFAULT_IMPL(OCS_INUM_TO_IVEC); + OCS_VOIDFUNCPTR *VecTbl; + static OCS_VOIDFUNCPTR DummyVec; + size_t VecTblSize; if (Status == 0) { From b9a76972b45d4344ed3cff008251d08ee293f978 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 9 Feb 2021 16:17:13 -0500 Subject: [PATCH 096/111] Fix #783, Initialize locals flagged in static analysis --- src/os/shared/src/osapi-idmap.c | 2 +- src/unit-tests/osfile-test/ut_osfile_dirio_test.c | 4 ++-- src/ut-stubs/osapi-utstub-bsp.c | 2 +- src/ut-stubs/osapi-utstub-idmap.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index a8fb26c4b..fe5fce966 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -631,7 +631,7 @@ int32 OS_ObjectIdFindNextFree(OS_object_token_t *token) { uint32 max_id; uint32 base_id; - uint32 local_id; + uint32 local_id = 0; uint32 serial; uint32 i; int32 return_code; diff --git a/src/unit-tests/osfile-test/ut_osfile_dirio_test.c b/src/unit-tests/osfile-test/ut_osfile_dirio_test.c index 974b808bc..40540e824 100644 --- a/src/unit-tests/osfile-test/ut_osfile_dirio_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_dirio_test.c @@ -439,7 +439,7 @@ void UT_os_closedir_test() **--------------------------------------------------------------------------------*/ void UT_os_readdir_test() { - osal_id_t dirh; + osal_id_t dirh = OS_OBJECT_ID_UNDEFINED; const char *testDesc; strcpy(g_subdirNames[0], " "); @@ -566,7 +566,7 @@ void UT_os_readdir_test() **--------------------------------------------------------------------------------*/ void UT_os_rewinddir_test() { - osal_id_t dirh; + osal_id_t dirh = OS_OBJECT_ID_UNDEFINED; const char *testDesc; strcpy(g_subdirNames[0], " "); diff --git a/src/ut-stubs/osapi-utstub-bsp.c b/src/ut-stubs/osapi-utstub-bsp.c index 0b2acd90d..126b5bb7f 100644 --- a/src/ut-stubs/osapi-utstub-bsp.c +++ b/src/ut-stubs/osapi-utstub-bsp.c @@ -56,7 +56,7 @@ uint32 OS_BSP_GetArgC(void) ------------------------------------------------------------------*/ char *const *OS_BSP_GetArgV(void) { - void *buffer; + void *buffer = NULL; int32 status; status = UT_DEFAULT_IMPL(OS_BSP_GetArgV); diff --git a/src/ut-stubs/osapi-utstub-idmap.c b/src/ut-stubs/osapi-utstub-idmap.c index 4b2bd3992..53ee462d5 100644 --- a/src/ut-stubs/osapi-utstub-idmap.c +++ b/src/ut-stubs/osapi-utstub-idmap.c @@ -138,7 +138,7 @@ OS_common_record_t *OS_ObjectIdGlobalFromToken(const OS_object_token_t *token) { static OS_common_record_t fake_record; int32 status; - OS_common_record_t * recptr; + OS_common_record_t * recptr = &fake_record; status = UT_DEFAULT_IMPL(OS_ObjectIdGlobalFromToken); if (status == 0 && From 58006ae9e2be9132abaed1795d9bf8b9fb203f6c Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 9 Feb 2021 17:59:58 -0500 Subject: [PATCH 097/111] Fix #785, Clean commented out code --- src/tests/osal-core-test/osal-core-test.c | 41 ------------------- .../shared/src/coveragetest-idmap.c | 11 ++--- .../osfile-test/ut_osfile_fileio_test.c | 2 +- 3 files changed, 4 insertions(+), 50 deletions(-) diff --git a/src/tests/osal-core-test/osal-core-test.c b/src/tests/osal-core-test/osal-core-test.c index bef1e07d4..2a26934ef 100644 --- a/src/tests/osal-core-test/osal-core-test.c +++ b/src/tests/osal-core-test/osal-core-test.c @@ -142,8 +142,6 @@ void TestTasks(void) OS_task_prop_t taskprop; int loopcnt; - /* OS_TaskRegister(); */ - /* Testing Creating up to OS_MAX_TASKS, plus one more */ memset(TaskData, 0xFF, sizeof(TaskData)); for (tasknum = 0; tasknum < (OS_MAX_TASKS + 1); ++tasknum) @@ -223,7 +221,6 @@ void TestTasks(void) /* Create Task 0 again */ status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); - /*UtDebug("Create Status = %d, Id = %d\n",status,task_0_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 0"); /* Try and create another "Task 0", should fail as we already have one named "Task 0" */ @@ -233,29 +230,23 @@ void TestTasks(void) status = OS_TaskCreate(&task_2_id, "Task 2", task_generic_no_exit, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); - /* UtDebug("Create Status = %d, Id = %d\n",status,task_2_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 2"); status = OS_TaskCreate(&task_3_id, "Task 3", task_generic_no_exit, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); - /* UtDebug("Create Status = %d, Id = %d\n",status,task_3_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 3"); status = OS_TaskGetIdByName(&task_0_id, "Task 0"); - /* UtDebug("Satus after Getting the id of \"Task 0\":%d,%d \n\n",status,task_0_id); */ /*first newly created task should have id == 0*/ UtAssert_True(status == OS_SUCCESS, "OS_TaskGetIdByName, Task 0"); status = OS_TaskGetIdByName(&task_1_id, "Task 1"); - /*UtDebug("Satus after Getting the id of \"Task 1\":%d,%d \n\n",status,task_1_id);*/ UtAssert_True(status != OS_SUCCESS, "OS_TaskGetIdByName, Task 1"); status = OS_TaskGetIdByName(&task_2_id, "Task 2"); - /* UtDebug("Satus after Getting the id of \"Task 2\":%d,%d \n\n",status,task_2_id);*/ UtAssert_True(status == OS_SUCCESS, "OS_TaskGetIdByName, Task 2"); status = OS_TaskGetIdByName(&task_3_id, "Task 3"); - /* UtDebug("Satus after Getting the id of \"Task 3\":%d,%d \n\n",status,task_3_id); */ UtAssert_True(status == OS_SUCCESS, "OS_TaskGetIdByName, Task 3"); /* @@ -308,20 +299,16 @@ void TestQueues(void) InitializeQIds(); status = OS_QueueCreate(&msgq_0, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); - /* UtDebug("Status after Creating q 0: %d,%d\n",status,msgq_0);*/ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate, recreate 0"); /* This one should fail */ status = OS_QueueCreate(&msgq_1, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); - /* UtDebug("Status after Creating q 0 again: %d,%d\n",status,msgq_1); */ UtAssert_True(status != OS_SUCCESS, "OS_QueueCreate, dupe name 0"); status = OS_QueueCreate(&msgq_2, "q 2", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); - /* UtDebug("Status after Creating q 2: %d,%d\n",status,msgq_2); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate, recreate 2"); status = OS_QueueCreate(&msgq_3, "q 3", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); - /* UtDebug("Status after Creating q 3: %d,%d\n",status,msgq_3); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate, recreate 3"); /* @@ -349,19 +336,15 @@ void TestQueues(void) /* Time to Delete the Queues we just created */ status = OS_QueueDelete(msgq_0); - /* UtDebug("Status after Deleting q 0 : %d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueDelete, q 0"); status = OS_QueueDelete(msgq_1); - /* UtDebug("Status after Deleting q 1: %d\n",status); */ UtAssert_True(status != OS_SUCCESS, "OS_QueueDelete, q 1"); status = OS_QueueDelete(msgq_2); - /* UtDebug("Status after Deleting q 2: %d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueDelete, q 2"); status = OS_QueueDelete(msgq_3); - /* UtDebug("Status after Deleting q 3: %d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueDelete, q 3"); } /* end TestQueues */ @@ -404,35 +387,27 @@ void TestBinaries(void) */ InitializeBinIds(); status = OS_BinSemCreate(&bin_0, "Bin 0", OS_SEM_FULL, 0); - /* UtDebug("Status after creating: %d,%d\n",status,bin_0); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemCreate, recreate 0"); status = OS_BinSemCreate(&bin_1, "Bin 0", OS_SEM_FULL, 0); - /* UtDebug("Status after creating: %d,%d\n",status,bin_1); */ UtAssert_True(status != OS_SUCCESS, "OS_BinSemCreate, dupe name 0"); status = OS_BinSemCreate(&bin_2, "Bin 2", OS_SEM_EMPTY, 0); - /* UtDebug("Status after creating: %d,%d\n",status,bin_2); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemCreate, recreate 2"); status = OS_BinSemCreate(&bin_3, "Bin 3", OS_SEM_EMPTY, 0); - /* UtDebug("Status after creating: %d,%d\n",status,bin_3); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemCreate, recreate 3"); status = OS_BinSemGetIdByName(&bin_0, "Bin 0"); - /* UtDebug("Status after GETID: %d,%d\n",status,bin_0); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemGetIdByName, Bin 0"); status = OS_BinSemGetIdByName(&bin_1, "Bin 1"); - /* UtDebug("Status after GETID: %d,%d\n",status,bin_1); */ UtAssert_True(status != OS_SUCCESS, "OS_BinSemGetIdByName, Bin 1"); status = OS_BinSemGetIdByName(&bin_2, "Bin 2"); - /* UtDebug("Status after GETID: %d,%d\n",status,bin_2); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemGetIdByName, Bin 2"); status = OS_BinSemGetIdByName(&bin_3, "Bin 3"); - /* UtDebug("Status after GETID: %d,%d\n",status,bin_3); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemGetIdByName, Bin 3"); /* @@ -442,12 +417,10 @@ void TestBinaries(void) UtAssert_True(status != OS_SUCCESS, "OS_BinSemDelete, Old ID"); status = OS_BinSemDelete(bin_0); - /* UtDebug("Status after deleteing:%d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemDelete, Bin 0"); /* this one was never created */ status = OS_BinSemDelete(bin_1); - /* UtDebug("Status after deleteing:%d\n",status); */ UtAssert_True(status != OS_SUCCESS, "OS_BinSemDelete, Bin 1"); status = OS_BinSemDelete(bin_2); @@ -496,19 +469,15 @@ void TestMutexes(void) */ InitializeMutIds(); status = OS_MutSemCreate(&mut_0, "Mut 0", 0); - /* UtDebug("Status after creating Mut 0: %d,%d\n",status,mut_0); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemCreate, recreate 0"); status = OS_MutSemCreate(&mut_1, "Mut 0", 0); - /* UtDebug("Status after creating Mut 0 again: %d,%d\n",status,mut_1); */ UtAssert_True(status != OS_SUCCESS, "OS_MutSemCreate, dupe name 0"); status = OS_MutSemCreate(&mut_2, "Mut 2", 0); - /* UtDebug("Status after creating Mut 2: %d,%d\n",status,mut_2); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemCreate, recreate 2"); status = OS_MutSemCreate(&mut_3, "Mut 3", 0); - /* UtDebug("Status after creating Mut 3: %d,%d\n",status,mut_3); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemCreate, recreate 3"); status = OS_MutSemGetIdByName(&mut_0, "Mut 0"); @@ -530,20 +499,16 @@ void TestMutexes(void) UtAssert_True(status != OS_SUCCESS, "OS_MutSemDelete, Old ID"); status = OS_MutSemDelete(mut_0); - /* UtDebug("Status after deleteing Mut 0:%d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemDelete, Mut 0"); /* this one was never created*/ status = OS_MutSemDelete(mut_1); - /* UtDebug("Status after deleteing Mut 1:%d\n",status); */ UtAssert_True(status != OS_SUCCESS, "OS_MutSemDelete, Mut 1"); status = OS_MutSemDelete(mut_2); - /* UtDebug("Status after deleteing Mut 2:%d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemDelete, Mut 2"); status = OS_MutSemDelete(mut_3); - /* UtDebug("Status after deleteing Mut 3:%d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemDelete, Mut 3"); } /* end TestMutexes */ @@ -609,15 +574,12 @@ void TestGetInfos(void) UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate"); status = OS_QueueCreate(&msgq_0, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); - /* UtDebug("Status after Creating q 0: %d,%d\n",status,msgq_0); */ UtAssert_True(status == OS_SUCCESS, "OS_QueueCreate"); status = OS_BinSemCreate(&bin_0, "Bin 0", 1, 0); - /* UtDebug("Status after creating: %d,%d\n",status,bin_0); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemCreate"); status = OS_MutSemCreate(&mut_0, "Mut 0", 0); - /* UtDebug("Status after creating: %d,%d\n",status,mut_0); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemCreate"); /* Next Step is to get the properties of the objects */ @@ -639,14 +601,11 @@ void TestGetInfos(void) status = OS_QueueDelete(msgq_0); UtAssert_True(status == OS_SUCCESS, "OS_QueueDelete"); - /* UtDebug("Status after Deleting q 0: %d\n",status); */ status = OS_BinSemDelete(bin_0); - /* UtDebug("Status after deleteing:%d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_BinSemDelete"); status = OS_MutSemDelete(mut_0); - /* UtDebug("Status after deleteing:%d\n",status); */ UtAssert_True(status == OS_SUCCESS, "OS_MutSemDelete"); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index a4c28141a..d48a5a6fc 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -735,7 +735,7 @@ void Test_OS_ConvertToArrayIndex(void) * */ int32 expected = OS_SUCCESS; - int32 actual = ~OS_SUCCESS; // OS_ConvertToArrayIndex(); + int32 actual; osal_id_t refobjid; osal_index_t local_idx; @@ -1029,13 +1029,8 @@ void Test_OS_ObjectIdIterator(void) { /* * Test Case For: - * int32 OS_ObjectIdIteratorInit(OS_ObjectMatchFunc_t matchfunc, void *matcharg, osal_objtype_t objtype, - OS_object_iter_t *iter); - * bool OS_ObjectFilterActive(void *ref, const OS_object_token_t *token, const OS_common_record_t *obj); - * int32 OS_ObjectIdIterateActive(osal_objtype_t objtype, OS_object_iter_t *iter); - * bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter); - * void OS_ObjectIdIteratorDestroy(OS_object_iter_t *iter); - * int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t, void *)); + * OS_ObjectIdIteratorInit, OS_ObjectFilterActive, OS_ObjectIdIterateActive + * OS_ObjectIdIteratorGetNext, OS_ObjectIdIteratorDestroy, OS_ObjectIdIteratorProcessEntry */ OS_object_iter_t iter; OS_common_record_t rec; diff --git a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c index 5f1f59b4c..df94fe0e2 100644 --- a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c @@ -116,7 +116,7 @@ void UT_os_initfs_test() /*-----------------------------------------------------*/ testDesc = "#2 Nominal"; - /* Call to OS_FS_Init() is inside OS_API_Init(); */ + /* Call to OS_FS_Init is inside OS_API_Init */ res = OS_API_Init(); if (res == OS_ERR_NOT_IMPLEMENTED) { From dd2368daff72cd364861a44f8aefaf29233257d1 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 10 Feb 2021 08:45:35 -0500 Subject: [PATCH 098/111] Fix #788, Resolve coercion alters value warnings --- src/os/shared/src/osapi-errors.c | 2 +- src/os/shared/src/osapi-network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/shared/src/osapi-errors.c b/src/os/shared/src/osapi-errors.c index ddfe12f9b..a1f332626 100644 --- a/src/os/shared/src/osapi-errors.c +++ b/src/os/shared/src/osapi-errors.c @@ -98,7 +98,7 @@ static const OS_ErrorTable_Entry_t OS_GLOBAL_ERROR_NAME_TABLE[] = { *-----------------------------------------------------------------*/ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) { - uint32 return_code; + int32 return_code; const OS_ErrorTable_Entry_t *Error; OS_CHECK_POINTER(err_name); diff --git a/src/os/shared/src/osapi-network.c b/src/os/shared/src/osapi-network.c index 3e6b9eeb9..70367fa16 100644 --- a/src/os/shared/src/osapi-network.c +++ b/src/os/shared/src/osapi-network.c @@ -65,7 +65,7 @@ int32 OS_NetworkAPI_Init(void) *-----------------------------------------------------------------*/ int32 OS_NetworkGetHostName(char *host_name, size_t name_len) { - uint32 return_code; + int32 return_code; /* Check parameters */ OS_CHECK_POINTER(host_name); From 44e0afc3bb7ae7d014b2d8080444e309cf9abcb3 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 10 Feb 2021 09:06:40 -0500 Subject: [PATCH 099/111] Fix #790, Return status from OS_ConsoleAPI_Init --- src/os/shared/src/osapi-printf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/shared/src/osapi-printf.c b/src/os/shared/src/osapi-printf.c index a174a4c61..fb765b42d 100644 --- a/src/os/shared/src/osapi-printf.c +++ b/src/os/shared/src/osapi-printf.c @@ -111,7 +111,7 @@ int32 OS_ConsoleAPI_Init(void) OS_SharedGlobalVars.PrintfEnabled = true; } - return OS_SUCCESS; + return return_code; } /* end OS_ConsoleAPI_Init */ /* From 0e76b63942bb41ef9ddf3b967a98e98ca7332051 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 10 Feb 2021 16:47:22 -0500 Subject: [PATCH 100/111] Fix #796, Update os-impl-no-sockets.c to match APIs --- src/os/portable/os-impl-no-sockets.c | 127 ++++++++++----------------- 1 file changed, 47 insertions(+), 80 deletions(-) diff --git a/src/os/portable/os-impl-no-sockets.c b/src/os/portable/os-impl-no-sockets.c index 4ccc9a765..8a4befeda 100644 --- a/src/os/portable/os-impl-no-sockets.c +++ b/src/os/portable/os-impl-no-sockets.c @@ -42,157 +42,124 @@ ***************************************************************************************/ /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketOpen_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketOpen_Impl(uint32 sock_id) +int32 OS_SocketOpen_Impl(const OS_object_token_t *token) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketOpen_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketBind_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketBind_Impl(uint32 sock_id, const OS_SockAddr_t *Addr) +int32 OS_SocketBind_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketBind_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketConnect_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketConnect_Impl(uint32 sock_id, const OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketConnect_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr, int32 timeout) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketConnect_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAccept_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketAccept_Impl(uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketAccept_Impl(const OS_object_token_t *sock_token, const OS_object_token_t *conn_token, + OS_SockAddr_t *Addr, int32 timeout) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAccept_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketRecvFrom_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) +int32 OS_SocketRecvFrom_Impl(const OS_object_token_t *token, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, + int32 timeout) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketRecvFrom_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketSendTo_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) +int32 OS_SocketSendTo_Impl(const OS_object_token_t *token, const void *buffer, size_t buflen, + const OS_SockAddr_t *RemoteAddr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketSendTo_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketGetInfo_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketGetInfo_Impl(uint32 sock_id, OS_socket_prop_t *sock_prop) +int32 OS_SocketGetInfo_Impl(const OS_object_token_t *token, OS_socket_prop_t *sock_prop) { return OS_SUCCESS; -} /* end OS_SocketGetInfo_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrInit_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrInit_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrToString_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketAddrToString_Impl(char *buffer, uint32 buflen, const OS_SockAddr_t *Addr) +int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrToString_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrFromString_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrFromString_Impl(OS_SockAddr_t *Addr, const char *string) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrFromString_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrGetPort_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrGetPort_Impl(uint16 *PortNum, const OS_SockAddr_t *Addr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrGetPort_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrSetPort_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrSetPort_Impl(OS_SockAddr_t *Addr, uint16 PortNum) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrSetPort_Impl */ +} From 721e04292ce16613c0141080d86b547ebcb324e1 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Wed, 10 Feb 2021 16:58:10 -0500 Subject: [PATCH 101/111] Fix #797, Update os-impl-no-symtab.c to match APIs --- src/os/portable/os-impl-no-symtab.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/os/portable/os-impl-no-symtab.c b/src/os/portable/os-impl-no-symtab.c index 3af60dfa4..48e25a52a 100644 --- a/src/os/portable/os-impl-no-symtab.c +++ b/src/os/portable/os-impl-no-symtab.c @@ -31,43 +31,34 @@ #include "os-shared-module.h" /*---------------------------------------------------------------- + * Implementation for no dynamic loader configuration * - * Function: OS_GlobalSymbolLookup_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_GlobalSymbolLookup_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no dynamic loader configuration * - * Function: OS_ModuleSymbolLookup_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_ModuleSymbolLookup_Impl(uint32 local_id, cpuaddr *SymbolAddress, const char *SymbolName) +int32 OS_ModuleSymbolLookup_Impl(const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_ModuleSymbolLookup_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no dynamic loader configuration * - * Function: OS_SymbolTableDump_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SymbolTableDump_Impl(const char *filename, size_t SizeLimit) { return (OS_ERR_NOT_IMPLEMENTED); -} /* end OS_SymbolTableDump_Impl */ +} From 15ab294273d13a030aeb03b9d12e12c7a72a6564 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Thu, 11 Feb 2021 10:46:40 -0500 Subject: [PATCH 102/111] Fix #793, Remove unreachable code in OS_SocketOpen_Impl for BSD socket --- src/os/portable/os-impl-bsd-sockets.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/os/portable/os-impl-bsd-sockets.c b/src/os/portable/os-impl-bsd-sockets.c index 31ca3e911..8b66ca1b1 100644 --- a/src/os/portable/os-impl-bsd-sockets.c +++ b/src/os/portable/os-impl-bsd-sockets.c @@ -126,23 +126,14 @@ int32 OS_SocketOpen_Impl(const OS_object_token_t *token) return OS_ERR_NOT_IMPLEMENTED; } - switch (stream->socket_domain) + /* Only AF_INET* at this point, can add cases if support is expanded */ + switch (stream->socket_type) { - case OS_SocketDomain_INET: - case OS_SocketDomain_INET6: - switch (stream->socket_type) - { - case OS_SocketType_DATAGRAM: - os_proto = IPPROTO_UDP; - break; - case OS_SocketType_STREAM: - os_proto = IPPROTO_TCP; - break; - default: - break; - } + case OS_SocketType_DATAGRAM: + os_proto = IPPROTO_UDP; break; - default: + case OS_SocketType_STREAM: + os_proto = IPPROTO_TCP; break; } From 8c834861b9547e4b3b44471cfc3257fa5d1493bf Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Tue, 9 Feb 2021 12:44:09 -0500 Subject: [PATCH 103/111] Fix #781, Terminate UT macro variadic lists --- ut_assert/inc/utstubs.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ut_assert/inc/utstubs.h b/ut_assert/inc/utstubs.h index 7c532ec6f..75fd021f5 100644 --- a/ut_assert/inc/utstubs.h +++ b/ut_assert/inc/utstubs.h @@ -463,8 +463,15 @@ int32 UT_DefaultStubImpl(const char *FunctionName, UT_EntryKey_t FuncKey, int32 * * This version should be used on stubs that take no arguments * and are expected to return 0 in the nominal case + * + * NOTE - Adding a NULL to the va list is only done for the + * two macros that do not have a va list passed in by the + * caller and is NOT a general pattern. Hooks that handle + * va lists should utilize the UT_KEY to process + * va lists correctly based on the implementation (no + * general pattern should be assumed). */ -#define UT_DEFAULT_IMPL(FuncName) UT_DefaultStubImpl(#FuncName, UT_KEY(FuncName), 0) +#define UT_DEFAULT_IMPL(FuncName) UT_DefaultStubImpl(#FuncName, UT_KEY(FuncName), 0, NULL) /** * Macro to simplify usage of the UT_DefaultStubImpl() function @@ -475,8 +482,15 @@ int32 UT_DefaultStubImpl(const char *FunctionName, UT_EntryKey_t FuncKey, int32 * * This version should be used on stubs that take no arguments * and are expected to return nonzero in the nominal case + * + * NOTE - Adding a NULL to the va list is only done for the + * two macros that do not have a va list passed in by the + * caller and is NOT a general pattern. Hooks that handle + * va lists should utilize the UT_KEY to process + * va lists correctly based on the implementation (no + * general pattern should be assumed). */ -#define UT_DEFAULT_IMPL_RC(FuncName, Rc) UT_DefaultStubImpl(#FuncName, UT_KEY(FuncName), Rc) +#define UT_DEFAULT_IMPL_RC(FuncName, Rc) UT_DefaultStubImpl(#FuncName, UT_KEY(FuncName), Rc, NULL) /** * Macro to simplify usage of the UT_DefaultStubImpl() function From 69002757380d090e23780983974ea778f932e6b2 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Thu, 11 Feb 2021 15:59:57 -0500 Subject: [PATCH 104/111] Fix #803, Add check of semaphore to avoid unreachable code in posix OS_BinSemCreate_Impl --- src/os/posix/src/os-impl-binsem.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/os/posix/src/os-impl-binsem.c b/src/os/posix/src/os-impl-binsem.c index fe86c4b8a..42999931a 100644 --- a/src/os/posix/src/os-impl-binsem.c +++ b/src/os/posix/src/os-impl-binsem.c @@ -198,6 +198,17 @@ int32 OS_BinSemCreate_Impl(const OS_object_token_t *token, uint32 initial_value, cond_created = 1; + /* + * Check sem call, avoids unreachable destroy logic + */ + ret = pthread_cond_signal(&(sem->cv)); + if (ret != 0) + { + OS_DEBUG("Error: initial pthread_cond_signal failed: %s\n", strerror(ret)); + return_code = OS_SEM_FAILURE; + break; + } + /* ** fill out the proper OSAL table fields */ From efa18440c931b4b62a0d829de3874421e1c7a0b2 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Fri, 12 Feb 2021 10:41:39 -0500 Subject: [PATCH 105/111] Fix #808, length-limited string length checks Create a wrapper around memchr() that mimics the non-C99 function "strnlen()" which is in POSIX-2008. Use this instead of strlen() whenever the string being checked either originates in or will be copied into a fixed-length array buffer. --- src/os/shared/inc/os-shared-common.h | 24 +++++++++++++++++++ src/os/shared/src/osapi-filesys.c | 16 +++++++------ src/os/shared/src/osapi-idmap.c | 2 +- src/os/shared/src/osapi-sockets.c | 5 ++-- src/os/vxworks/src/os-impl-shell.c | 3 ++- src/os/vxworks/src/os-impl-symtab.c | 2 +- .../shared/src/coveragetest-filesys.c | 15 ++++++------ .../vxworks/src/coveragetest-symtab.c | 4 ++-- 8 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/os/shared/inc/os-shared-common.h b/src/os/shared/inc/os-shared-common.h index c3ae45f76..58ec31519 100644 --- a/src/os/shared/inc/os-shared-common.h +++ b/src/os/shared/inc/os-shared-common.h @@ -128,4 +128,28 @@ void OS_IdleLoop_Impl(void); ------------------------------------------------------------------*/ void OS_ApplicationShutdown_Impl(void); + +/*---------------------------------------------------------------- + + Function: OS_strnlen + + Purpose: Utility function to safely find the length of a string + within a fixed-size array buffer. + + Provides a local OSAL routine to get the functionality + of the (non-C99) "strnlen()" function, via the + C89/C99 standard "memchr()" function instead. + + ------------------------------------------------------------------*/ +static inline size_t OS_strnlen(const char *s, size_t maxlen) +{ + const char *end = memchr(s, 0, maxlen); + if (end != NULL) + { + /* actual length of string is difference */ + maxlen = end - s; + } + return maxlen; +} + #endif /* OS_SHARED_COMMON_H */ diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index 6db99f794..86d96d314 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -42,6 +42,7 @@ */ #include "os-shared-filesys.h" #include "os-shared-idmap.h" +#include "os-shared-common.h" enum { @@ -102,8 +103,9 @@ bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, co return false; } - mplen = strlen(filesys->virtual_mountpt); - return (mplen > 0 && strncmp(target, filesys->virtual_mountpt, mplen) == 0 && + mplen = OS_strnlen(filesys->virtual_mountpt, sizeof(filesys->virtual_mountpt)); + return (mplen > 0 && mplen < sizeof(filesys->virtual_mountpt) && + strncmp(target, filesys->virtual_mountpt, mplen) == 0 && (target[mplen] == '/' || target[mplen] == 0)); } /* end OS_FileSys_FindVirtMountPoint */ @@ -257,7 +259,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const ++dev_name; } - if (strlen(dev_name) >= OS_FS_DEV_NAME_LEN) + if (memchr(dev_name,0,sizeof(filesys->volume_name)) == NULL) { return OS_ERR_NAME_TOO_LONG; } @@ -793,7 +795,7 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) /* ** Check length */ - VirtPathLen = strlen(VirtualPath); + VirtPathLen = OS_strnlen(VirtualPath, OS_MAX_PATH_LEN); if (VirtPathLen >= OS_MAX_PATH_LEN) { return OS_FS_ERR_PATH_TOO_LONG; @@ -808,7 +810,7 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) /* strrchr returns a pointer to the last '/' char, so we advance one char */ name_ptr = name_ptr + 1; - if (strlen(name_ptr) >= OS_MAX_FILE_NAME) + if (memchr(name_ptr, 0, OS_MAX_FILE_NAME) == NULL) { return OS_FS_ERR_NAME_TOO_LONG; } @@ -838,8 +840,8 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) if ((filesys->flags & OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM) != 0) { - SysMountPointLen = strlen(filesys->system_mountpt); - VirtPathBegin = strlen(filesys->virtual_mountpt); + SysMountPointLen = OS_strnlen(filesys->system_mountpt, sizeof(filesys->system_mountpt)); + VirtPathBegin = OS_strnlen(filesys->virtual_mountpt, sizeof(filesys->virtual_mountpt)); if (SysMountPointLen < OS_MAX_LOCAL_PATH_LEN) { memcpy(LocalPath, filesys->system_mountpt, SysMountPointLen); diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index a8fb26c4b..15ae1ab75 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -1501,7 +1501,7 @@ int32 OS_GetResourceName(osal_id_t object_id, char *buffer, size_t buffer_size) if (record->name_entry != NULL) { - name_len = strlen(record->name_entry); + name_len = OS_strnlen(record->name_entry, buffer_size); if (buffer_size <= name_len) { /* indicates the name does not fit into supplied buffer */ diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index f610b8660..41be93847 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -42,6 +42,7 @@ #include "os-shared-idmap.h" #include "os-shared-file.h" #include "os-shared-sockets.h" +#include "os-shared-common.h" /* * Other OSAL public APIs used by this module @@ -104,7 +105,7 @@ void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Ad } if (OS_SocketAddrGetPort_Impl(&port, Addr) == OS_SUCCESS) { - len = strlen(sock->stream_name); + len = OS_strnlen(sock->stream_name, sizeof(sock->stream_name)); snprintf(&sock->stream_name[len], OS_MAX_API_NAME - len, ":%u", (unsigned int)port); } sock->stream_name[OS_MAX_API_NAME - 1] = 0; @@ -112,7 +113,7 @@ void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Ad if (parent_name) { /* Append the name from the parent socket. */ - len = strlen(sock->stream_name); + len = OS_strnlen(sock->stream_name, sizeof(sock->stream_name)); snprintf(&sock->stream_name[len], sizeof(sock->stream_name) - len, "-%s", parent_name); sock->stream_name[sizeof(sock->stream_name) - 1] = 0; } diff --git a/src/os/vxworks/src/os-impl-shell.c b/src/os/vxworks/src/os-impl-shell.c index 7fc9f3342..35c6000f2 100644 --- a/src/os/vxworks/src/os-impl-shell.c +++ b/src/os/vxworks/src/os-impl-shell.c @@ -34,6 +34,7 @@ #include "os-shared-shell.h" #include "os-shared-file.h" #include "os-shared-idmap.h" +#include "os-shared-common.h" #include #include @@ -78,7 +79,7 @@ int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd) cmd_impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, cmd_token); /* copy the command to the file, and then seek back to the beginning of the file */ - OS_write(fdCmd, Cmd, strlen(Cmd)); + OS_write(fdCmd, Cmd, OS_strnlen(Cmd, OS_MAX_CMD_LEN)); OS_lseek(fdCmd, 0, OS_SEEK_SET); /* Create a shell task the will run the command in the file, push output to OS_fd */ diff --git a/src/os/vxworks/src/os-impl-symtab.c b/src/os/vxworks/src/os-impl-symtab.c index 5dc9f94ee..74c0a3cf3 100644 --- a/src/os/vxworks/src/os-impl-symtab.c +++ b/src/os/vxworks/src/os-impl-symtab.c @@ -172,7 +172,7 @@ BOOL OS_SymTableIterator_Impl(char *name, SYM_VALUE val, SYM_TYPE type, _Vx_usr_ */ state = &OS_VxWorks_SymbolDumpState; - if (strlen(name) >= OS_MAX_SYM_LEN) + if (memchr(name, 0, OS_MAX_SYM_LEN) == NULL) { OS_DEBUG("%s(): symbol name too long\n", __func__); state->StatusCode = OS_ERROR; diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 17e8dc1f5..d6c98ee6a 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -62,12 +62,11 @@ void Test_OS_FileSysAddFixedMap(void) OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_FS_ERR_PATH_TOO_LONG); UT_SetDeferredRetcode(UT_KEY(OCS_memchr), 2, OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_FS_ERR_PATH_TOO_LONG); - UT_ResetState(UT_KEY(OCS_strlen)); UT_SetDefaultReturnValue(UT_KEY(OCS_strrchr), -1); - UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 1, 2 + OS_FS_DEV_NAME_LEN); + UT_SetDeferredRetcode(UT_KEY(OCS_memchr), 3, OS_ERROR); OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_ERR_NAME_TOO_LONG); - UT_ResetState(UT_KEY(OCS_strlen)); + UT_ResetState(UT_KEY(OCS_memchr)); UT_ResetState(UT_KEY(OCS_strrchr)); OSAPI_TEST_FUNCTION_RC(OS_FileSysAddFixedMap(&id, "/phys", "/virt"), OS_SUCCESS); @@ -431,18 +430,18 @@ void Test_OS_TranslatePath(void) actual = OS_TranslatePath(NULL, NULL); UtAssert_True(actual == expected, "OS_TranslatePath(NULL,NULL) (%ld) == OS_INVALID_POINTER", (long)actual); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_PATH_LEN + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath() (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); - UT_ClearDefaultReturnValue(UT_KEY(OCS_strlen)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); /* Invalid no '/' */ expected = OS_FS_ERR_PATH_INVALID; actual = OS_TranslatePath("invalid", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath() (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); - UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 2, OS_MAX_FILE_NAME + 1); + UT_SetDeferredRetcode(UT_KEY(OCS_memchr), 2, OS_ERROR); expected = OS_FS_ERR_NAME_TOO_LONG; actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath(/cf/test) (%ld) == OS_FS_ERR_NAME_TOO_LONG", (long)actual); @@ -458,13 +457,13 @@ void Test_OS_TranslatePath(void) UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdGetBySearch)); /* VirtPathLen < VirtPathBegin */ - UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 4, OS_MAX_PATH_LEN); + UT_SetDeferredRetcode(UT_KEY(OCS_memchr), 4, OS_ERROR); expected = OS_FS_ERR_PATH_INVALID; actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath(/cf/test) (%ld) == OS_FS_ERR_PATH_INVALID", (long)actual); /* (SysMountPointLen + VirtPathLen) > OS_MAX_LOCAL_PATH_LEN */ - UT_SetDeferredRetcode(UT_KEY(OCS_strlen), 3, OS_MAX_LOCAL_PATH_LEN); + UT_SetDeferredRetcode(UT_KEY(OCS_memchr), 3, OS_ERROR); expected = OS_FS_ERR_PATH_TOO_LONG; actual = OS_TranslatePath("/cf/test", LocalBuffer); UtAssert_True(actual == expected, "OS_TranslatePath(/cf/test) (%ld) == OS_FS_ERR_PATH_TOO_LONG", (long)actual); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index a3ab7396b..6bca6074b 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -69,9 +69,9 @@ void Test_OS_SymTableIterator_Impl(void) OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), true); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 101), false); - UT_SetDefaultReturnValue(UT_KEY(OCS_strlen), OS_MAX_SYM_LEN + 10); + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), false); - UT_ClearDefaultReturnValue(UT_KEY(OCS_strlen)); + UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); UT_SetDefaultReturnValue(UT_KEY(OCS_write), -1); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), false); UT_ClearDefaultReturnValue(UT_KEY(OCS_write)); From 6173a57e5b4bb0caf539f71d3b487a1833bba992 Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Mon, 8 Feb 2021 09:33:57 -0500 Subject: [PATCH 106/111] Fix #809, cast args to printf in queue-test Using %u conversion requires unsigned int arg, not necessarily uint32 --- src/tests/queue-test/queue-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/queue-test/queue-test.c b/src/tests/queue-test/queue-test.c index a79caa265..fa03daa89 100644 --- a/src/tests/queue-test/queue-test.c +++ b/src/tests/queue-test/queue-test.c @@ -87,7 +87,7 @@ void task_1(void) { ++task_1_messages; UtAssert_True(data_received == expected, "TASK 1: data_received (%u) == expected (%u)", - data_received, expected); + (unsigned int)data_received, (unsigned int)expected); expected++; } From 66b48f62fa9a49c09550b3dec44b57c663813a63 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 8 Feb 2021 17:51:24 -0500 Subject: [PATCH 107/111] Fix #775, Add CodeQL analysis to workflow --- .github/workflows/codeql-build.yml | 58 ++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/codeql-build.yml diff --git a/.github/workflows/codeql-build.yml b/.github/workflows/codeql-build.yml new file mode 100644 index 000000000..46f0ee81f --- /dev/null +++ b/.github/workflows/codeql-build.yml @@ -0,0 +1,58 @@ +name: "CodeQL Analysis" + +on: + push: + pull_request: + +env: + SIMULATION: native + ENABLE_UNIT_TESTS: true + OMIT_DEPRECATED: true + BUILDTYPE: release + +jobs: + + CodeQL-Build: + runs-on: ubuntu-18.04 + timeout-minutes: 15 + + steps: + # Checks out a copy of your repository on the ubuntu-latest machine + - name: Checkout bundle + uses: actions/checkout@v2 + with: + repository: nasa/cFS + submodules: true + + - name: Checkout submodule + uses: actions/checkout@v2 + with: + path: osal + + - name: Check versions + run: git submodule + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: c + queries: +security-extended, security-and-quality + + # Setup the build system + - name: Set up for build + run: | + cp ./cfe/cmake/Makefile.sample Makefile + cp -r ./cfe/cmake/sample_defs sample_defs + make prep + + # Build the code + - name: Build + run: | + make osal + make native/default_cpu1/osal/tests/ + make native/default_cpu1/osal/unit-test-coverage/ + make native/default_cpu1/osal/unit-tests/ + make native/default_cpu1/osal/ut-stubs/ + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 From 920fde80fb504c16c4e8d73c0266c7df636679eb Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Fri, 12 Feb 2021 15:58:38 -0500 Subject: [PATCH 108/111] Merge pull request #800 from skliper/fix796-no_sockets Fix #796, Update os-impl-no-sockets.c to match APIs --- src/os/portable/os-impl-no-sockets.c | 127 ++++++++++----------------- 1 file changed, 47 insertions(+), 80 deletions(-) diff --git a/src/os/portable/os-impl-no-sockets.c b/src/os/portable/os-impl-no-sockets.c index 4ccc9a765..8a4befeda 100644 --- a/src/os/portable/os-impl-no-sockets.c +++ b/src/os/portable/os-impl-no-sockets.c @@ -42,157 +42,124 @@ ***************************************************************************************/ /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketOpen_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketOpen_Impl(uint32 sock_id) +int32 OS_SocketOpen_Impl(const OS_object_token_t *token) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketOpen_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketBind_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketBind_Impl(uint32 sock_id, const OS_SockAddr_t *Addr) +int32 OS_SocketBind_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketBind_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketConnect_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketConnect_Impl(uint32 sock_id, const OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketConnect_Impl(const OS_object_token_t *token, const OS_SockAddr_t *Addr, int32 timeout) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketConnect_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAccept_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketAccept_Impl(uint32 sock_id, uint32 connsock_id, OS_SockAddr_t *Addr, int32 timeout) +int32 OS_SocketAccept_Impl(const OS_object_token_t *sock_token, const OS_object_token_t *conn_token, + OS_SockAddr_t *Addr, int32 timeout) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAccept_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketRecvFrom_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketRecvFrom_Impl(uint32 sock_id, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, int32 timeout) +int32 OS_SocketRecvFrom_Impl(const OS_object_token_t *token, void *buffer, size_t buflen, OS_SockAddr_t *RemoteAddr, + int32 timeout) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketRecvFrom_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketSendTo_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketSendTo_Impl(uint32 sock_id, const void *buffer, size_t buflen, const OS_SockAddr_t *RemoteAddr) +int32 OS_SocketSendTo_Impl(const OS_object_token_t *token, const void *buffer, size_t buflen, + const OS_SockAddr_t *RemoteAddr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketSendTo_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketGetInfo_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketGetInfo_Impl(uint32 sock_id, OS_socket_prop_t *sock_prop) +int32 OS_SocketGetInfo_Impl(const OS_object_token_t *token, OS_socket_prop_t *sock_prop) { return OS_SUCCESS; -} /* end OS_SocketGetInfo_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrInit_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrInit_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrToString_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ -int32 OS_SocketAddrToString_Impl(char *buffer, uint32 buflen, const OS_SockAddr_t *Addr) +int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrToString_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrFromString_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrFromString_Impl(OS_SockAddr_t *Addr, const char *string) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrFromString_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrGetPort_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrGetPort_Impl(uint16 *PortNum, const OS_SockAddr_t *Addr) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrGetPort_Impl */ +} /*---------------------------------------------------------------- + * Implementation for no network configuration * - * Function: OS_SocketAddrSetPort_Impl - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * + * See prototype for argument/return detail *-----------------------------------------------------------------*/ int32 OS_SocketAddrSetPort_Impl(OS_SockAddr_t *Addr, uint16 PortNum) { return OS_ERR_NOT_IMPLEMENTED; -} /* end OS_SocketAddrSetPort_Impl */ +} From a8e095538bef87377d2a2c0f28bd71e11c8ebbd6 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Thu, 11 Feb 2021 17:22:50 -0500 Subject: [PATCH 109/111] Fix #805, Null terminate when using strncpy --- src/os/shared/src/osapi-binsem.c | 2 +- src/os/shared/src/osapi-countsem.c | 2 +- src/os/shared/src/osapi-errors.c | 3 ++- src/os/shared/src/osapi-file.c | 5 +++-- src/os/shared/src/osapi-filesys.c | 5 +++-- src/os/shared/src/osapi-module.c | 6 +++--- src/os/shared/src/osapi-mutex.c | 2 +- src/os/shared/src/osapi-queue.c | 2 +- src/os/shared/src/osapi-sockets.c | 2 +- src/os/shared/src/osapi-time.c | 2 +- src/os/shared/src/osapi-timebase.c | 2 +- src/os/vxworks/src/os-impl-symtab.c | 3 ++- src/ut-stubs/osapi-utstub-binsem.c | 4 ++-- src/ut-stubs/osapi-utstub-countsem.c | 4 ++-- src/ut-stubs/osapi-utstub-filesys.c | 6 ++++-- src/ut-stubs/osapi-utstub-mutex.c | 4 ++-- src/ut-stubs/osapi-utstub-queue.c | 4 ++-- src/ut-stubs/osapi-utstub-sockets.c | 3 ++- src/ut-stubs/osapi-utstub-task.c | 4 ++-- src/ut-stubs/osapi-utstub-timebase.c | 4 ++-- 20 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/os/shared/src/osapi-binsem.c b/src/os/shared/src/osapi-binsem.c index 1461f8aeb..e498db02f 100644 --- a/src/os/shared/src/osapi-binsem.c +++ b/src/os/shared/src/osapi-binsem.c @@ -289,7 +289,7 @@ int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) { record = OS_OBJECT_TABLE_GET(OS_global_bin_sem_table, token); - strncpy(bin_prop->name, record->name_entry, OS_MAX_API_NAME - 1); + strncpy(bin_prop->name, record->name_entry, sizeof(bin_prop->name) - 1); bin_prop->creator = record->creator; return_code = OS_BinSemGetInfo_Impl(&token, bin_prop); diff --git a/src/os/shared/src/osapi-countsem.c b/src/os/shared/src/osapi-countsem.c index 10ec1c461..9eebafc84 100644 --- a/src/os/shared/src/osapi-countsem.c +++ b/src/os/shared/src/osapi-countsem.c @@ -258,7 +258,7 @@ int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) { record = OS_OBJECT_TABLE_GET(OS_global_count_sem_table, token); - strncpy(count_prop->name, record->name_entry, OS_MAX_API_NAME - 1); + strncpy(count_prop->name, record->name_entry, sizeof(count_prop->name) - 1); count_prop->creator = record->creator; return_code = OS_CountSemGetInfo_Impl(&token, count_prop); diff --git a/src/os/shared/src/osapi-errors.c b/src/os/shared/src/osapi-errors.c index 2eb04e943..4751c134c 100644 --- a/src/os/shared/src/osapi-errors.c +++ b/src/os/shared/src/osapi-errors.c @@ -121,7 +121,8 @@ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) if (Error->Number == error_num && Error->Name != NULL) { - strncpy(*err_name, Error->Name, OS_ERROR_NAME_LENGTH - 1); + strncpy(*err_name, Error->Name, sizeof(*err_name) - 1); + *err_name[sizeof(*err_name) - 1] = 0; return_code = OS_SUCCESS; } else diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 13c46d9f8..20811afb3 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -475,7 +475,8 @@ int32 OS_rename(const char *old, const char *new) if (stream->socket_domain == OS_SocketDomain_INVALID && strcmp(stream->stream_name, old) == 0) { - strcpy(stream->stream_name, new); + strncpy(stream->stream_name, new, sizeof(stream->stream_name) - 1); + stream->stream_name[sizeof(stream->stream_name) - 1] = 0; } } @@ -606,7 +607,7 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) { record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); - strncpy(fd_prop->Path, record->name_entry, OS_MAX_PATH_LEN - 1); + strncpy(fd_prop->Path, record->name_entry, sizeof(fd_prop->Path) - 1); fd_prop->User = record->creator; fd_prop->IsValid = true; diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index de48793a8..058084bfe 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -152,7 +152,7 @@ int32 OS_FileSys_Initialize(char *address, const char *fsdevname, const char *fs filesys->blocksize = blocksize; filesys->numblocks = numblocks; filesys->address = address; - strcpy(filesys->volume_name, fsvolname); + strncpy(filesys->volume_name, fsvolname, sizeof(filesys->volume_name) - 1); /* * Determine basic type of filesystem, if not already known @@ -461,7 +461,8 @@ int32 OS_mount(const char *devname, const char *mountpoint) /* mark as mounted in the local table. * For now this does both sides (system and virtual) */ filesys->flags |= OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; - strcpy(filesys->virtual_mountpt, mountpoint); + strncpy(filesys->virtual_mountpt, mountpoint, sizeof(filesys->virtual_mountpt) - 1); + filesys->virtual_mountpt[sizeof(filesys->virtual_mountpt) - 1] = 0; } OS_ObjectIdRelease(&token); diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 18b6eef26..447d86006 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -255,7 +255,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f else { /* supplied filename was valid, so store a copy for future reference */ - strncpy(module->file_name, filename, OS_MAX_PATH_LEN); + strncpy(module->file_name, filename, sizeof(module->file_name) - 1); module->module_type = OS_MODULE_TYPE_DYNAMIC; /* Now call the OS-specific implementation. This reads info from the module table. */ @@ -333,8 +333,8 @@ int32 OS_ModuleInfo(osal_id_t module_id, OS_module_prop_t *module_prop) record = OS_OBJECT_TABLE_GET(OS_global_module_table, token); module = OS_OBJECT_TABLE_GET(OS_module_table, token); - strncpy(module_prop->name, record->name_entry, OS_MAX_API_NAME - 1); - strncpy(module_prop->filename, module->file_name, OS_MAX_API_NAME - 1); + strncpy(module_prop->name, record->name_entry, sizeof(module_prop->name) - 1); + strncpy(module_prop->filename, module->file_name, sizeof(module_prop->filename) - 1); return_code = OS_ModuleGetInfo_Impl(&token, module_prop); diff --git a/src/os/shared/src/osapi-mutex.c b/src/os/shared/src/osapi-mutex.c index 50d6a1fee..93cc0e92f 100644 --- a/src/os/shared/src/osapi-mutex.c +++ b/src/os/shared/src/osapi-mutex.c @@ -272,7 +272,7 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) { record = OS_OBJECT_TABLE_GET(OS_global_mutex_table, token); - strncpy(mut_prop->name, record->name_entry, OS_MAX_API_NAME - 1); + strncpy(mut_prop->name, record->name_entry, sizeof(mut_prop->name) - 1); mut_prop->creator = record->creator; return_code = OS_MutSemGetInfo_Impl(&token, mut_prop); diff --git a/src/os/shared/src/osapi-queue.c b/src/os/shared/src/osapi-queue.c index cda46e141..0e03044b5 100644 --- a/src/os/shared/src/osapi-queue.c +++ b/src/os/shared/src/osapi-queue.c @@ -272,7 +272,7 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) { record = OS_OBJECT_TABLE_GET(OS_global_queue_table, token); - strncpy(queue_prop->name, record->name_entry, OS_MAX_API_NAME - 1); + strncpy(queue_prop->name, record->name_entry, sizeof(queue_prop->name) - 1); queue_prop->creator = record->creator; /* diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index ddfdd44ab..8a5401d7c 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -477,7 +477,7 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) { record = OS_OBJECT_TABLE_GET(OS_global_stream_table, token); - strncpy(sock_prop->name, record->name_entry, OS_MAX_API_NAME - 1); + strncpy(sock_prop->name, record->name_entry, sizeof(sock_prop->name) - 1); sock_prop->creator = record->creator; return_code = OS_SocketGetInfo_Impl(&token, sock_prop); diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index fd834944f..1e907d5ed 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -538,7 +538,7 @@ int32 OS_TimerGetInfo(osal_id_t timer_id, OS_timer_prop_t *timer_prop) timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, token); timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, timecb->timebase_token); - strncpy(timer_prop->name, record->name_entry, OS_MAX_API_NAME - 1); + strncpy(timer_prop->name, record->name_entry, sizeof(timer_prop->name) - 1); timer_prop->creator = record->creator; timer_prop->interval_time = (uint32)timecb->interval_time; timer_prop->accuracy = timebase->accuracy_usec; diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index 219f3e549..6d71a53b7 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -319,7 +319,7 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro record = OS_OBJECT_TABLE_GET(OS_global_timebase_table, token); timebase = OS_OBJECT_TABLE_GET(OS_timebase_table, token); - strncpy(timebase_prop->name, record->name_entry, OS_MAX_API_NAME - 1); + strncpy(timebase_prop->name, record->name_entry, sizeof(timebase_prop->name) - 1); timebase_prop->creator = record->creator; timebase_prop->nominal_interval_time = timebase->nominal_interval_time; timebase_prop->freerun_time = timebase->freerun_time; diff --git a/src/os/vxworks/src/os-impl-symtab.c b/src/os/vxworks/src/os-impl-symtab.c index 5dc9f94ee..4694630b2 100644 --- a/src/os/vxworks/src/os-impl-symtab.c +++ b/src/os/vxworks/src/os-impl-symtab.c @@ -196,7 +196,8 @@ BOOL OS_SymTableIterator_Impl(char *name, SYM_VALUE val, SYM_TYPE type, _Vx_usr_ /* ** Copy symbol name */ - strncpy(symRecord.SymbolName, name, OS_MAX_SYM_LEN); + strncpy(symRecord.SymbolName, name, sizeof(symRecord.SymbolName) - 1); + symRecord.SymbolName[sizeof(symRecord.SymbolName) - 1] = 0; /* ** Save symbol address diff --git a/src/ut-stubs/osapi-utstub-binsem.c b/src/ut-stubs/osapi-utstub-binsem.c index 3b7fd4da3..f2f1c746e 100644 --- a/src/ut-stubs/osapi-utstub-binsem.c +++ b/src/ut-stubs/osapi-utstub-binsem.c @@ -197,8 +197,8 @@ int32 OS_BinSemGetInfo(osal_id_t sem_id, OS_bin_sem_prop_t *bin_prop) UT_Stub_CopyToLocal(UT_KEY(OS_BinSemGetInfo), bin_prop, sizeof(*bin_prop)) < sizeof(*bin_prop)) { UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &bin_prop->creator); - strncpy(bin_prop->name, "Name", OS_MAX_API_NAME - 1); - bin_prop->name[OS_MAX_API_NAME - 1] = '\0'; + strncpy(bin_prop->name, "Name", sizeof(bin_prop->name) - 1); + bin_prop->name[sizeof(bin_prop->name) - 1] = '\0'; } return status; diff --git a/src/ut-stubs/osapi-utstub-countsem.c b/src/ut-stubs/osapi-utstub-countsem.c index 602af87f8..31c7faaa7 100644 --- a/src/ut-stubs/osapi-utstub-countsem.c +++ b/src/ut-stubs/osapi-utstub-countsem.c @@ -202,8 +202,8 @@ int32 OS_CountSemGetInfo(osal_id_t sem_id, OS_count_sem_prop_t *count_prop) UT_Stub_CopyToLocal(UT_KEY(OS_CountSemGetInfo), count_prop, sizeof(*count_prop)) < sizeof(*count_prop)) { UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &count_prop->creator); - strncpy(count_prop->name, "Name", OS_MAX_API_NAME - 1); - count_prop->name[OS_MAX_API_NAME - 1] = '\0'; + strncpy(count_prop->name, "Name", sizeof(count_prop->name) - 1); + count_prop->name[sizeof(count_prop->name) - 1] = '\0'; } return status; diff --git a/src/ut-stubs/osapi-utstub-filesys.c b/src/ut-stubs/osapi-utstub-filesys.c index 79622066d..2f40682a2 100644 --- a/src/ut-stubs/osapi-utstub-filesys.c +++ b/src/ut-stubs/osapi-utstub-filesys.c @@ -249,7 +249,8 @@ int32 OS_FS_GetPhysDriveName(char *PhysDriveName, const char *MountPoint) int32 status; status = UT_DEFAULT_IMPL(OS_FS_GetPhysDriveName); - strncpy(PhysDriveName, MountPoint, OS_FS_PHYS_NAME_LEN); + strncpy(PhysDriveName, MountPoint, OS_FS_PHYS_NAME_LEN - 1); + PhysDriveName[OS_FS_PHYS_NAME_LEN - 1] = 0; return status; } @@ -288,7 +289,8 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath) if (status == OS_SUCCESS && VirtualPath != NULL && LocalPath != NULL && UT_Stub_CopyToLocal(UT_KEY(OS_TranslatePath), LocalPath, OS_MAX_LOCAL_PATH_LEN) == 0) { - strncpy(LocalPath, VirtualPath, OS_MAX_LOCAL_PATH_LEN); + strncpy(LocalPath, VirtualPath, OS_MAX_LOCAL_PATH_LEN - 1); + LocalPath[OS_MAX_LOCAL_PATH_LEN - 1] = 0; } return status; diff --git a/src/ut-stubs/osapi-utstub-mutex.c b/src/ut-stubs/osapi-utstub-mutex.c index fea9de66a..89912f6e6 100644 --- a/src/ut-stubs/osapi-utstub-mutex.c +++ b/src/ut-stubs/osapi-utstub-mutex.c @@ -229,8 +229,8 @@ int32 OS_MutSemGetInfo(osal_id_t sem_id, OS_mut_sem_prop_t *mut_prop) if (status == OS_SUCCESS && UT_Stub_CopyToLocal(UT_KEY(OS_MutSemGetInfo), mut_prop, sizeof(*mut_prop)) < sizeof(*mut_prop)) { - strncpy(mut_prop->name, "Name", OS_MAX_API_NAME - 1); - mut_prop->name[OS_MAX_API_NAME - 1] = '\0'; + strncpy(mut_prop->name, "Name", sizeof(mut_prop->name) - 1); + mut_prop->name[sizeof(mut_prop->name) - 1] = '\0'; UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &mut_prop->creator); } diff --git a/src/ut-stubs/osapi-utstub-queue.c b/src/ut-stubs/osapi-utstub-queue.c index 1888f10df..faa7fe675 100644 --- a/src/ut-stubs/osapi-utstub-queue.c +++ b/src/ut-stubs/osapi-utstub-queue.c @@ -270,8 +270,8 @@ int32 OS_QueueGetInfo(osal_id_t queue_id, OS_queue_prop_t *queue_prop) UT_Stub_CopyToLocal(UT_KEY(OS_QueueGetInfo), queue_prop, sizeof(*queue_prop)) < sizeof(*queue_prop)) { UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &queue_prop->creator); - strncpy(queue_prop->name, "Name", OS_MAX_API_NAME - 1); - queue_prop->name[OS_MAX_API_NAME - 1] = '\0'; + strncpy(queue_prop->name, "Name", sizeof(queue_prop->name) - 1); + queue_prop->name[sizeof(queue_prop->name) - 1] = '\0'; } return status; diff --git a/src/ut-stubs/osapi-utstub-sockets.c b/src/ut-stubs/osapi-utstub-sockets.c index bd95e9598..5a211c846 100644 --- a/src/ut-stubs/osapi-utstub-sockets.c +++ b/src/ut-stubs/osapi-utstub-sockets.c @@ -237,7 +237,8 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) if (CopySize < sizeof(*sock_prop)) { UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &sock_prop->creator); - strncpy(sock_prop->name, "ut", sizeof(sock_prop->name)); + strncpy(sock_prop->name, "ut", sizeof(sock_prop->name) - 1); + sock_prop->name[sizeof(sock_prop->name) - 1] = 0; } } diff --git a/src/ut-stubs/osapi-utstub-task.c b/src/ut-stubs/osapi-utstub-task.c index 9d6db317b..ce3dc4c80 100644 --- a/src/ut-stubs/osapi-utstub-task.c +++ b/src/ut-stubs/osapi-utstub-task.c @@ -284,8 +284,8 @@ int32 OS_TaskGetInfo(osal_id_t task_id, OS_task_prop_t *task_prop) UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &task_prop->creator); task_prop->stack_size = OSAL_SIZE_C(100); task_prop->priority = OSAL_PRIORITY_C(150); - strncpy(task_prop->name, "UnitTest", OS_MAX_API_NAME - 1); - task_prop->name[OS_MAX_API_NAME - 1] = '\0'; + strncpy(task_prop->name, "UnitTest", sizeof(task_prop->name) - 1); + task_prop->name[sizeof(task_prop->name) - 1] = '\0'; } return status; diff --git a/src/ut-stubs/osapi-utstub-timebase.c b/src/ut-stubs/osapi-utstub-timebase.c index c654eefb2..b439eb1e0 100644 --- a/src/ut-stubs/osapi-utstub-timebase.c +++ b/src/ut-stubs/osapi-utstub-timebase.c @@ -144,8 +144,8 @@ int32 OS_TimeBaseGetInfo(osal_id_t timebase_id, OS_timebase_prop_t *timebase_pro UT_Stub_CopyToLocal(UT_KEY(OS_TimeBaseGetInfo), timebase_prop, sizeof(*timebase_prop)) < sizeof(*timebase_prop)) { UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &timebase_prop->creator); - strncpy(timebase_prop->name, "Name", OS_MAX_API_NAME - 1); - timebase_prop->name[OS_MAX_API_NAME - 1] = '\0'; + strncpy(timebase_prop->name, "Name", sizeof(timebase_prop->name) - 1); + timebase_prop->name[sizeof(timebase_prop->name) - 1] = '\0'; } return status; From 831100a675ad19d3f2876135c8852e3577849585 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Fri, 12 Feb 2021 18:08:21 -0500 Subject: [PATCH 110/111] Fix #796, Apply formatting --- .../src/generic_linux_bsp_internal.h | 2 +- .../src/generic_vxworks_bsp_internal.h | 2 +- src/bsp/pc-rtems/src/bsp_start.c | 16 +-- src/bsp/pc-rtems/src/pcrtems_bsp_internal.h | 6 +- src/os/inc/osapi-binsem.h | 2 - src/os/inc/osapi-bsp.h | 1 - src/os/inc/osapi-clock.h | 17 +-- src/os/inc/osapi-common.h | 2 - src/os/inc/osapi-constants.h | 2 - src/os/inc/osapi-dir.h | 2 - src/os/inc/osapi-error.h | 5 +- src/os/inc/osapi-file.h | 1 - src/os/inc/osapi-filesys.h | 12 +- src/os/inc/osapi-module.h | 5 +- src/os/inc/osapi-mutex.h | 1 - src/os/inc/osapi-os-net.h | 1 - src/os/inc/osapi-os-timer.h | 1 - src/os/inc/osapi-queue.h | 1 - src/os/inc/osapi-timebase.h | 2 +- src/os/inc/osapi-version.h | 6 +- src/os/inc/osapi.h | 1 - src/os/portable/os-impl-no-symtab.c | 3 - src/os/posix/inc/os-impl-binsem.h | 2 +- src/os/posix/inc/os-impl-console.h | 2 +- src/os/posix/inc/os-impl-countsem.h | 2 +- src/os/posix/inc/os-impl-dirs.h | 2 +- src/os/posix/inc/os-impl-files.h | 2 +- src/os/posix/inc/os-impl-gettime.h | 2 +- src/os/posix/inc/os-impl-idmap.h | 2 +- src/os/posix/inc/os-impl-io.h | 2 +- src/os/posix/inc/os-impl-loader.h | 2 +- src/os/posix/inc/os-impl-mutex.h | 2 +- src/os/posix/inc/os-impl-network.h | 2 +- src/os/posix/inc/os-impl-queues.h | 2 +- src/os/posix/inc/os-impl-select.h | 2 +- src/os/posix/inc/os-impl-sockets.h | 2 +- src/os/posix/inc/os-impl-tasks.h | 3 +- src/os/posix/inc/os-impl-timebase.h | 2 +- src/os/posix/inc/os-posix.h | 4 +- src/os/posix/src/os-impl-idmap.c | 15 +-- src/os/posix/src/os-impl-tasks.c | 4 +- src/os/posix/src/os-impl-timebase.c | 4 +- src/os/rtems/inc/os-impl-binsem.h | 2 +- src/os/rtems/inc/os-impl-console.h | 2 +- src/os/rtems/inc/os-impl-countsem.h | 2 +- src/os/rtems/inc/os-impl-dirs.h | 2 +- src/os/rtems/inc/os-impl-files.h | 2 +- src/os/rtems/inc/os-impl-gettime.h | 2 +- src/os/rtems/inc/os-impl-idmap.h | 2 +- src/os/rtems/inc/os-impl-io.h | 2 +- src/os/rtems/inc/os-impl-loader.h | 2 +- src/os/rtems/inc/os-impl-mutex.h | 2 +- src/os/rtems/inc/os-impl-queues.h | 2 +- src/os/rtems/inc/os-impl-select.h | 2 +- src/os/rtems/inc/os-impl-sockets.h | 2 +- src/os/rtems/inc/os-impl-tasks.h | 2 +- src/os/rtems/inc/os-impl-timebase.h | 2 +- src/os/rtems/inc/os-rtems.h | 18 +-- src/os/rtems/src/os-impl-idmap.c | 9 +- src/os/rtems/src/os-impl-queues.c | 6 +- src/os/rtems/src/os-impl-timebase.c | 8 +- src/os/shared/inc/os-shared-binsem.h | 2 +- src/os/shared/inc/os-shared-clock.h | 2 +- src/os/shared/inc/os-shared-common.h | 7 +- src/os/shared/inc/os-shared-countsem.h | 2 +- src/os/shared/inc/os-shared-dir.h | 2 +- src/os/shared/inc/os-shared-errors.h | 2 +- src/os/shared/inc/os-shared-file.h | 1 - src/os/shared/inc/os-shared-globaldefs.h | 10 +- src/os/shared/inc/os-shared-heap.h | 2 +- src/os/shared/inc/os-shared-idmap.h | 8 +- src/os/shared/inc/os-shared-module.h | 2 +- src/os/shared/inc/os-shared-mutex.h | 6 +- src/os/shared/inc/os-shared-network.h | 2 +- src/os/shared/inc/os-shared-printf.h | 2 +- src/os/shared/inc/os-shared-queue.h | 2 +- src/os/shared/inc/os-shared-select.h | 2 +- src/os/shared/inc/os-shared-shell.h | 2 +- src/os/shared/inc/os-shared-sockets.h | 2 +- src/os/shared/inc/os-shared-task.h | 2 +- src/os/shared/inc/os-shared-time.h | 2 +- src/os/shared/inc/os-shared-timebase.h | 2 +- src/os/shared/src/osapi-common.c | 9 +- src/os/shared/src/osapi-errors.c | 2 +- src/os/shared/src/osapi-file.c | 2 - src/os/shared/src/osapi-filesys.c | 7 +- src/os/shared/src/osapi-module.c | 9 +- src/os/shared/src/osapi-queue.c | 3 +- src/os/shared/src/osapi-sockets.c | 1 - src/os/shared/src/osapi-time.c | 22 +-- src/os/shared/src/osapi-timebase.c | 5 +- src/os/vxworks/inc/os-impl-binsem.h | 2 +- src/os/vxworks/inc/os-impl-console.h | 2 +- src/os/vxworks/inc/os-impl-countsem.h | 2 +- src/os/vxworks/inc/os-impl-dirs.h | 4 +- src/os/vxworks/inc/os-impl-files.h | 2 +- src/os/vxworks/inc/os-impl-filesys.h | 2 +- src/os/vxworks/inc/os-impl-gettime.h | 2 +- src/os/vxworks/inc/os-impl-idmap.h | 2 +- src/os/vxworks/inc/os-impl-io.h | 2 +- src/os/vxworks/inc/os-impl-loader.h | 2 +- src/os/vxworks/inc/os-impl-mutex.h | 2 +- src/os/vxworks/inc/os-impl-network.h | 2 +- src/os/vxworks/inc/os-impl-queues.h | 2 +- src/os/vxworks/inc/os-impl-select.h | 2 +- src/os/vxworks/inc/os-impl-sockets.h | 2 +- src/os/vxworks/inc/os-impl-symtab.h | 2 +- src/os/vxworks/inc/os-impl-tasks.h | 8 +- src/os/vxworks/inc/os-impl-timebase.h | 2 +- src/os/vxworks/inc/os-vxworks.h | 2 +- src/os/vxworks/src/os-impl-dirs-globals.c | 7 +- src/os/vxworks/src/os-impl-idmap.c | 75 +++-------- src/os/vxworks/src/os-impl-shell.c | 4 +- src/os/vxworks/src/os-impl-tasks.c | 4 +- src/os/vxworks/src/os-impl-timebase.c | 24 ++-- src/tests/file-api-test/file-api-test.c | 50 ++++--- src/tests/osal-core-test/osal-core-test.c | 62 ++++----- src/tests/queue-test/queue-test.c | 24 ++-- src/tests/select-test/select-test.c | 18 +-- src/tests/timer-test/timer-test.c | 12 +- .../inc/ut-adaptor-portable-posix-files.h | 2 +- .../inc/ut-adaptor-portable-posix-io.h | 2 +- .../portable/src/os-portable-coveragetest.h | 2 +- .../shared/adaptors/inc/ut-adaptor-module.h | 2 +- .../shared/src/coveragetest-clock.c | 22 ++- .../shared/src/coveragetest-filesys.c | 24 ++-- .../shared/src/coveragetest-idmap.c | 125 +++++++++--------- .../shared/src/coveragetest-task.c | 6 +- .../shared/src/os-shared-coveragetest.h | 2 +- .../ut-stubs/inc/OCS_arpa_inet.h | 2 +- .../ut-stubs/inc/OCS_assert.h | 2 +- .../ut-stubs/inc/OCS_basetypes.h | 2 +- .../ut-stubs/inc/OCS_blkIo.h | 2 +- .../ut-stubs/inc/OCS_bsp-impl.h | 2 +- .../ut-stubs/inc/OCS_cbioLib.h | 2 +- .../ut-stubs/inc/OCS_complex.h | 2 +- .../ut-stubs/inc/OCS_ctype.h | 2 +- .../ut-stubs/inc/OCS_dirent.h | 2 +- .../ut-stubs/inc/OCS_dlfcn.h | 2 +- .../ut-stubs/inc/OCS_dosFsLib.h | 2 +- .../ut-stubs/inc/OCS_drv_hdisk_ataDrv.h | 2 +- .../ut-stubs/inc/OCS_errno.h | 2 +- .../ut-stubs/inc/OCS_errnoLib.h | 2 +- .../ut-stubs/inc/OCS_fcntl.h | 2 +- .../ut-stubs/inc/OCS_fenv.h | 2 +- .../ut-stubs/inc/OCS_float.h | 2 +- .../ut-stubs/inc/OCS_hostLib.h | 2 +- .../ut-stubs/inc/OCS_intLib.h | 2 +- .../ut-stubs/inc/OCS_inttypes.h | 2 +- .../ut-stubs/inc/OCS_ioLib.h | 2 +- src/unit-test-coverage/ut-stubs/inc/OCS_iv.h | 2 +- .../ut-stubs/inc/OCS_loadLib.h | 2 +- .../ut-stubs/inc/OCS_locale.h | 2 +- .../ut-stubs/inc/OCS_logLib.h | 2 +- .../ut-stubs/inc/OCS_math.h | 2 +- .../ut-stubs/inc/OCS_memPartLib.h | 2 +- .../ut-stubs/inc/OCS_moduleLib.h | 2 +- .../ut-stubs/inc/OCS_mqueue.h | 2 +- .../ut-stubs/inc/OCS_msgQLib.h | 2 +- .../ut-stubs/inc/OCS_net_if.h | 2 +- .../ut-stubs/inc/OCS_netdb.h | 2 +- .../ut-stubs/inc/OCS_netinet_in.h | 2 +- .../ut-stubs/inc/OCS_netinet_tcp.h | 2 +- .../ut-stubs/inc/OCS_objLib.h | 2 +- .../ut-stubs/inc/OCS_poll.h | 2 +- .../ut-stubs/inc/OCS_pthread.h | 2 +- .../ut-stubs/inc/OCS_ramDiskCbio.h | 2 +- .../ut-stubs/inc/OCS_ramDrv.h | 2 +- .../ut-stubs/inc/OCS_sched.h | 2 +- .../ut-stubs/inc/OCS_semLib.h | 2 +- .../ut-stubs/inc/OCS_semaphore.h | 2 +- .../ut-stubs/inc/OCS_setjmp.h | 2 +- .../ut-stubs/inc/OCS_shellLib.h | 2 +- .../ut-stubs/inc/OCS_signal.h | 2 +- .../ut-stubs/inc/OCS_stat.h | 2 +- .../ut-stubs/inc/OCS_stdarg.h | 2 +- .../ut-stubs/inc/OCS_stdio.h | 2 +- .../ut-stubs/inc/OCS_stdlib.h | 2 +- .../ut-stubs/inc/OCS_string.h | 2 +- .../ut-stubs/inc/OCS_strings.h | 2 +- .../ut-stubs/inc/OCS_symLib.h | 2 +- .../ut-stubs/inc/OCS_sysLib.h | 2 +- .../ut-stubs/inc/OCS_sys_ioctl.h | 2 +- .../ut-stubs/inc/OCS_sys_ipc.h | 2 +- .../ut-stubs/inc/OCS_sys_mman.h | 2 +- .../ut-stubs/inc/OCS_sys_select.h | 2 +- .../ut-stubs/inc/OCS_sys_socket.h | 2 +- .../ut-stubs/inc/OCS_sys_time.h | 2 +- .../ut-stubs/inc/OCS_sys_times.h | 2 +- .../ut-stubs/inc/OCS_sys_types.h | 2 +- .../ut-stubs/inc/OCS_sys_un.h | 2 +- .../ut-stubs/inc/OCS_sys_wait.h | 2 +- .../ut-stubs/inc/OCS_taskLib.h | 2 +- .../ut-stubs/inc/OCS_taskVarLib.h | 2 +- .../ut-stubs/inc/OCS_termios.h | 2 +- .../ut-stubs/inc/OCS_tgmath.h | 2 +- .../ut-stubs/inc/OCS_time.h | 2 +- .../ut-stubs/inc/OCS_timers.h | 2 +- .../ut-stubs/inc/OCS_ulimit.h | 2 +- .../ut-stubs/inc/OCS_unistd.h | 2 +- .../ut-stubs/inc/OCS_unldLib.h | 2 +- .../ut-stubs/inc/OCS_usrLib.h | 2 +- .../ut-stubs/inc/OCS_version.h | 2 +- .../ut-stubs/inc/OCS_vxWorks.h | 2 +- .../ut-stubs/inc/OCS_wchar.h | 2 +- .../ut-stubs/inc/OCS_wctype.h | 2 +- .../ut-stubs/inc/OCS_xbdBlkDev.h | 2 +- .../ut-stubs/inc/OCS_xbdRamDisk.h | 2 +- .../ut-stubs/override_inc/arpa/inet.h | 2 +- .../ut-stubs/override_inc/assert.h | 2 +- .../ut-stubs/override_inc/blkIo.h | 2 +- .../ut-stubs/override_inc/bsp-impl.h | 2 +- .../ut-stubs/override_inc/cbioLib.h | 2 +- .../ut-stubs/override_inc/complex.h | 2 +- .../ut-stubs/override_inc/ctype.h | 2 +- .../ut-stubs/override_inc/dirent.h | 2 +- .../ut-stubs/override_inc/dlfcn.h | 2 +- .../ut-stubs/override_inc/dosFsLib.h | 2 +- .../ut-stubs/override_inc/drv/hdisk/ataDrv.h | 2 +- .../ut-stubs/override_inc/errno.h | 2 +- .../ut-stubs/override_inc/errnoLib.h | 2 +- .../ut-stubs/override_inc/fcntl.h | 2 +- .../ut-stubs/override_inc/fenv.h | 2 +- .../ut-stubs/override_inc/float.h | 2 +- .../ut-stubs/override_inc/hostLib.h | 2 +- .../ut-stubs/override_inc/intLib.h | 2 +- .../ut-stubs/override_inc/inttypes.h | 2 +- .../ut-stubs/override_inc/ioLib.h | 2 +- .../ut-stubs/override_inc/iv.h | 2 +- .../ut-stubs/override_inc/loadLib.h | 2 +- .../ut-stubs/override_inc/locale.h | 2 +- .../ut-stubs/override_inc/logLib.h | 2 +- .../ut-stubs/override_inc/math.h | 2 +- .../ut-stubs/override_inc/memPartLib.h | 2 +- .../ut-stubs/override_inc/moduleLib.h | 2 +- .../ut-stubs/override_inc/mqueue.h | 2 +- .../ut-stubs/override_inc/msgQLib.h | 2 +- .../ut-stubs/override_inc/net/if.h | 2 +- .../ut-stubs/override_inc/netdb.h | 2 +- .../ut-stubs/override_inc/netinet/in.h | 2 +- .../ut-stubs/override_inc/netinet/tcp.h | 2 +- .../ut-stubs/override_inc/objLib.h | 2 +- .../ut-stubs/override_inc/poll.h | 2 +- .../ut-stubs/override_inc/pthread.h | 2 +- .../ut-stubs/override_inc/ramDiskCbio.h | 2 +- .../ut-stubs/override_inc/ramDrv.h | 2 +- .../ut-stubs/override_inc/sched.h | 2 +- .../ut-stubs/override_inc/selectLib.h | 2 +- .../ut-stubs/override_inc/semLib.h | 2 +- .../ut-stubs/override_inc/semaphore.h | 2 +- .../ut-stubs/override_inc/setjmp.h | 2 +- .../ut-stubs/override_inc/shellLib.h | 2 +- .../ut-stubs/override_inc/signal.h | 2 +- .../ut-stubs/override_inc/stat.h | 2 +- .../ut-stubs/override_inc/stdarg.h | 2 +- .../ut-stubs/override_inc/stdio.h | 2 +- .../ut-stubs/override_inc/stdlib.h | 2 +- .../ut-stubs/override_inc/string.h | 2 +- .../ut-stubs/override_inc/strings.h | 2 +- .../ut-stubs/override_inc/symLib.h | 2 +- .../ut-stubs/override_inc/sys/ioctl.h | 2 +- .../ut-stubs/override_inc/sys/ipc.h | 2 +- .../ut-stubs/override_inc/sys/mman.h | 2 +- .../ut-stubs/override_inc/sys/select.h | 2 +- .../ut-stubs/override_inc/sys/signal.h | 2 +- .../ut-stubs/override_inc/sys/socket.h | 2 +- .../ut-stubs/override_inc/sys/stat.h | 2 +- .../ut-stubs/override_inc/sys/statvfs.h | 2 +- .../ut-stubs/override_inc/sys/time.h | 2 +- .../ut-stubs/override_inc/sys/times.h | 2 +- .../ut-stubs/override_inc/sys/types.h | 2 +- .../ut-stubs/override_inc/sys/un.h | 2 +- .../ut-stubs/override_inc/sys/wait.h | 2 +- .../ut-stubs/override_inc/sysLib.h | 2 +- .../ut-stubs/override_inc/taskLib.h | 2 +- .../ut-stubs/override_inc/taskVarLib.h | 2 +- .../ut-stubs/override_inc/termios.h | 2 +- .../ut-stubs/override_inc/tgmath.h | 2 +- .../ut-stubs/override_inc/time.h | 2 +- .../ut-stubs/override_inc/timers.h | 2 +- .../ut-stubs/override_inc/ulimit.h | 2 +- .../ut-stubs/override_inc/unistd.h | 2 +- .../ut-stubs/override_inc/unldLib.h | 2 +- .../ut-stubs/override_inc/usrLib.h | 2 +- .../ut-stubs/override_inc/version.h | 2 +- .../ut-stubs/override_inc/vxWorks.h | 2 +- .../ut-stubs/override_inc/wchar.h | 2 +- .../ut-stubs/override_inc/wctype.h | 2 +- .../ut-stubs/override_inc/xbdBlkDev.h | 2 +- .../ut-stubs/override_inc/xbdRamDisk.h | 2 +- .../ut-stubs/src/osapi-loader-impl-stubs.c | 3 +- .../ut-stubs/src/osapi-queue-impl-stubs.c | 3 +- .../ut-stubs/src/posix-dlfcn-stubs.c | 2 +- .../ut-stubs/src/vxworks-intLib-stubs.c | 2 +- .../vxworks/adaptors/inc/ut-adaptor-binsem.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-common.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-console.h | 2 +- .../adaptors/inc/ut-adaptor-countsem.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-dirs.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-files.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-filesys.h | 2 +- .../adaptors/inc/ut-adaptor-filetable-stub.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-idmap.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-loader.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-mutex.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-queues.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-symtab.h | 2 +- .../vxworks/adaptors/inc/ut-adaptor-tasks.h | 2 +- .../adaptors/inc/ut-adaptor-timebase.h | 2 +- .../adaptors/src/ut-adaptor-dirtable-stub.c | 1 - .../vxworks/src/os-vxworks-coveragetest.h | 2 +- src/unit-tests/inc/ut_os_support.h | 2 +- .../oscore-test/ut_oscore_binsem_test.h | 2 +- .../oscore-test/ut_oscore_countsem_test.h | 2 +- .../oscore-test/ut_oscore_misc_test.c | 10 +- .../oscore-test/ut_oscore_misc_test.h | 2 +- .../oscore-test/ut_oscore_mutex_test.h | 2 +- .../oscore-test/ut_oscore_queue_test.h | 2 +- .../oscore-test/ut_oscore_select_test.h | 2 +- .../oscore-test/ut_oscore_task_test.c | 2 +- .../oscore-test/ut_oscore_task_test.h | 2 +- src/unit-tests/oscore-test/ut_oscore_test.h | 2 +- .../osfile-test/ut_osfile_dirio_test.h | 2 +- .../osfile-test/ut_osfile_fileio_test.h | 2 +- src/unit-tests/osfile-test/ut_osfile_test.h | 2 +- .../osfilesys-test/ut_osfilesys_diskio_test.c | 1 - .../osfilesys-test/ut_osfilesys_diskio_test.h | 2 +- .../osfilesys-test/ut_osfilesys_test.h | 2 +- .../osloader-test/ut_osloader_module_test.h | 2 +- .../osloader-test/ut_osloader_symtable_test.c | 1 - .../osloader-test/ut_osloader_symtable_test.h | 2 +- .../osloader-test/ut_osloader_test.h | 2 +- .../ut_osloader_test_platforms.h | 2 +- .../osnetwork-test/ut_osnetwork_misc_test.h | 2 +- .../osnetwork-test/ut_osnetwork_test.h | 2 +- src/unit-tests/ostimer-test/ut_ostimer_test.h | 2 +- .../ostimer-test/ut_ostimer_timerio_test.h | 2 +- src/ut-stubs/osapi-utstub-filesys.c | 2 +- ut_assert/inc/utassert.h | 39 +++--- ut_assert/inc/utbsp.h | 2 +- ut_assert/inc/utstubs.h | 6 +- ut_assert/src/utbsp.c | 2 +- ut_assert/src/utglobal.h | 2 +- 343 files changed, 636 insertions(+), 699 deletions(-) diff --git a/src/bsp/generic-linux/src/generic_linux_bsp_internal.h b/src/bsp/generic-linux/src/generic_linux_bsp_internal.h index 75548fe08..85ab8145e 100644 --- a/src/bsp/generic-linux/src/generic_linux_bsp_internal.h +++ b/src/bsp/generic-linux/src/generic_linux_bsp_internal.h @@ -46,4 +46,4 @@ typedef struct */ extern OS_BSP_GenericLinuxGlobalData_t OS_BSP_GenericLinuxGlobal; -#endif /* GENERIC_LINUX_BSP_INTERNAL_H */ +#endif /* GENERIC_LINUX_BSP_INTERNAL_H */ diff --git a/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h b/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h index b879a4c16..640603c4a 100644 --- a/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h +++ b/src/bsp/generic-vxworks/src/generic_vxworks_bsp_internal.h @@ -33,4 +33,4 @@ */ #include "bsp-impl.h" -#endif /* GENERIC_VXWORKS_BSP_INTERNAL_H */ +#endif /* GENERIC_VXWORKS_BSP_INTERNAL_H */ diff --git a/src/bsp/pc-rtems/src/bsp_start.c b/src/bsp/pc-rtems/src/bsp_start.c index ce6ef503e..cb2e43542 100644 --- a/src/bsp/pc-rtems/src/bsp_start.c +++ b/src/bsp/pc-rtems/src/bsp_start.c @@ -370,16 +370,16 @@ rtems_task Init(rtems_task_argument ignored) * 16 internal semaphores * */ -#define CONFIGURE_MAXIMUM_TASKS (OS_MAX_TASKS + 8) -#define CONFIGURE_MAXIMUM_TIMERS (OS_MAX_TIMERS + 2) -#define CONFIGURE_MAXIMUM_SEMAPHORES (OS_MAX_BIN_SEMAPHORES + OS_MAX_COUNT_SEMAPHORES + OS_MAX_MUTEXES + 16) -#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES (OS_MAX_QUEUES + 4) -#define CONFIGURE_MAXIMUM_DRIVERS 10 -#define CONFIGURE_MAXIMUM_POSIX_KEYS 4 +#define CONFIGURE_MAXIMUM_TASKS (OS_MAX_TASKS + 8) +#define CONFIGURE_MAXIMUM_TIMERS (OS_MAX_TIMERS + 2) +#define CONFIGURE_MAXIMUM_SEMAPHORES (OS_MAX_BIN_SEMAPHORES + OS_MAX_COUNT_SEMAPHORES + OS_MAX_MUTEXES + 16) +#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES (OS_MAX_QUEUES + 4) +#define CONFIGURE_MAXIMUM_DRIVERS 10 +#define CONFIGURE_MAXIMUM_POSIX_KEYS 4 #ifdef _RTEMS_5_ - #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS (OS_MAX_NUM_OPEN_FILES + 8) +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS (OS_MAX_NUM_OPEN_FILES + 8) #else - #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS (OS_MAX_NUM_OPEN_FILES + 8) +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS (OS_MAX_NUM_OPEN_FILES + 8) #endif #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h b/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h index 919e219a4..67f7ff1cb 100644 --- a/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h +++ b/src/bsp/pc-rtems/src/pcrtems_bsp_internal.h @@ -43,9 +43,9 @@ * Handle the differences between RTEMS 5 and 4.11 copyright notice */ #ifdef _RTEMS_5_ - #define OSAL_BSP_COPYRIGHT_NOTICE rtems_get_copyright_notice() +#define OSAL_BSP_COPYRIGHT_NOTICE rtems_get_copyright_notice() #else - #define OSAL_BSP_COPYRIGHT_NOTICE _Copyright_Notice +#define OSAL_BSP_COPYRIGHT_NOTICE _Copyright_Notice #endif /* @@ -73,4 +73,4 @@ typedef struct */ extern OS_BSP_PcRtemsGlobalData_t OS_BSP_PcRtemsGlobal; -#endif /* PCRTEMS_BSP_INTERNAL_H */ +#endif /* PCRTEMS_BSP_INTERNAL_H */ diff --git a/src/os/inc/osapi-binsem.h b/src/os/inc/osapi-binsem.h index 99c18e4d2..4474450bc 100644 --- a/src/os/inc/osapi-binsem.h +++ b/src/os/inc/osapi-binsem.h @@ -28,7 +28,6 @@ #include "osconfig.h" #include "common_types.h" - /** @defgroup OSSemaphoreStates OSAL Semaphore State Defines * @{ */ @@ -36,7 +35,6 @@ #define OS_SEM_EMPTY 0 /**< @brief Semaphore empty state */ /**@}*/ - /** @brief OSAL binary semaphore properties */ typedef struct { diff --git a/src/os/inc/osapi-bsp.h b/src/os/inc/osapi-bsp.h index ff8f95120..3fa39d140 100644 --- a/src/os/inc/osapi-bsp.h +++ b/src/os/inc/osapi-bsp.h @@ -28,7 +28,6 @@ #include "osconfig.h" #include "common_types.h" - /**************************************************************************************** BSP LOW-LEVEL IMPLEMENTATION FUNCTIONS ****************************************************************************************/ diff --git a/src/os/inc/osapi-clock.h b/src/os/inc/osapi-clock.h index fa854209f..b2fb0349d 100644 --- a/src/os/inc/osapi-clock.h +++ b/src/os/inc/osapi-clock.h @@ -44,18 +44,17 @@ */ typedef struct { - int64 ticks; /**< Ticks elapsed since reference point */ + int64 ticks; /**< Ticks elapsed since reference point */ } OS_time_t; - /** * @brief Multipliers/divisors to convert ticks into standardized units - * + * * Various fixed conversion factor constants used by the conversion routines - * + * * A 100ns tick time allows max intervals of about +/- 14000 years in * a 64-bit signed integer value. - * + * * @note Applications should not directly use these values, but rather use * conversion routines below to obtain standardized units (seconds/microseconds/etc). */ @@ -99,7 +98,6 @@ int32 OS_GetLocalTime(OS_time_t *time_struct); */ int32 OS_SetLocalTime(const OS_time_t *time_struct); - /*-------------------------------------------------------------------------------------*/ /* * Accessor / Unit Conversion routines for OS_time_t @@ -217,7 +215,6 @@ static inline uint32 OS_TimeGetSubsecondsPart(OS_time_t tm) return (uint32)((frac - 1) / (OS_TIME_TICKS_PER_SECOND >> 2)); } - /*-------------------------------------------------------------------------------------*/ /** * @brief Get milliseconds portion (fractional part only) from an OS_time_t object @@ -351,7 +348,6 @@ static inline OS_time_t OS_TimeAssembleFromMilliseconds(int64 seconds, uint32 mi return result; } - /*-------------------------------------------------------------------------------------*/ /** * @brief Assemble/Convert a number of seconds + subseconds into an OS_time_t interval @@ -387,7 +383,7 @@ static inline OS_time_t OS_TimeAssembleFromSubseconds(int64 seconds, uint32 subs */ static inline OS_time_t OS_TimeAdd(OS_time_t time1, OS_time_t time2) { - return ((OS_time_t) { time1.ticks + time2.ticks }); + return ((OS_time_t) {time1.ticks + time2.ticks}); } /*-------------------------------------------------------------------------------------*/ @@ -401,10 +397,9 @@ static inline OS_time_t OS_TimeAdd(OS_time_t time1, OS_time_t time2) */ static inline OS_time_t OS_TimeSubtract(OS_time_t time1, OS_time_t time2) { - return ((OS_time_t) { time1.ticks - time2.ticks }); + return ((OS_time_t) {time1.ticks - time2.ticks}); } - /**@}*/ #endif diff --git a/src/os/inc/osapi-common.h b/src/os/inc/osapi-common.h index 5a2c66db7..ac6b1bcdc 100644 --- a/src/os/inc/osapi-common.h +++ b/src/os/inc/osapi-common.h @@ -28,7 +28,6 @@ #include "osconfig.h" #include "common_types.h" - /** * @brief A set of events that can be used with BSP event callback routines */ @@ -98,7 +97,6 @@ typedef enum */ typedef int32 (*OS_EventHandler_t)(OS_Event_t event, osal_id_t object_id, void *data); - /** @defgroup OSAPICore OSAL Core Operation APIs * * These are for OSAL core operations for startup/initialization, running, and shutdown. diff --git a/src/os/inc/osapi-constants.h b/src/os/inc/osapi-constants.h index 0d10fdf46..e3aa32f1c 100644 --- a/src/os/inc/osapi-constants.h +++ b/src/os/inc/osapi-constants.h @@ -34,7 +34,6 @@ #define OS_PEND (-1) #define OS_CHECK (0) - /** * @brief Initializer for the osal_id_t type which will not match any valid value */ @@ -54,5 +53,4 @@ */ #define OS_MAX_LOCAL_PATH_LEN (OS_MAX_PATH_LEN + OS_FS_PHYS_NAME_LEN) - #endif diff --git a/src/os/inc/osapi-dir.h b/src/os/inc/osapi-dir.h index a2c6f3e2f..a9c594dcc 100644 --- a/src/os/inc/osapi-dir.h +++ b/src/os/inc/osapi-dir.h @@ -28,8 +28,6 @@ #include "osconfig.h" #include "common_types.h" - - /** @brief Directory entry */ typedef struct { diff --git a/src/os/inc/osapi-error.h b/src/os/inc/osapi-error.h index 77bfcf296..c0af8e57e 100644 --- a/src/os/inc/osapi-error.h +++ b/src/os/inc/osapi-error.h @@ -82,7 +82,7 @@ typedef char os_err_name_t[OS_ERROR_NAME_LENGTH]; #define OS_ERR_INCORRECT_OBJ_STATE (-35) /**< @brief Incorrect object state */ #define OS_ERR_INCORRECT_OBJ_TYPE (-36) /**< @brief Incorrect object type */ #define OS_ERR_STREAM_DISCONNECTED (-37) /**< @brief Stream disconnected */ -#define OS_ERR_OPERATION_NOT_SUPPORTED (-38) /**< @brief Requested operation is not support on the supplied object(s) */ +#define OS_ERR_OPERATION_NOT_SUPPORTED (-38) /**< @brief Requested operation not support on supplied object(s) */ #define OS_ERR_INVALID_SIZE (-40) /**< @brief Invalid Size */ /* @@ -99,10 +99,8 @@ typedef char os_err_name_t[OS_ERROR_NAME_LENGTH]; #define OS_FS_ERR_DEVICE_NOT_FREE (-107) /**< @brief FS device not free */ #define OS_FS_ERR_PATH_INVALID (-108) /**< @brief FS path invalid */ - /**@}*/ - /** @defgroup OSAPIError OSAL Error Info APIs * @{ */ @@ -119,5 +117,4 @@ typedef char os_err_name_t[OS_ERROR_NAME_LENGTH]; int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name); /**@}*/ - #endif diff --git a/src/os/inc/osapi-file.h b/src/os/inc/osapi-file.h index 011da6872..421b64442 100644 --- a/src/os/inc/osapi-file.h +++ b/src/os/inc/osapi-file.h @@ -29,7 +29,6 @@ #include "common_types.h" #include "osapi-clock.h" - /** @defgroup OSFileAccess OSAL File Access Option Defines * @{ */ diff --git a/src/os/inc/osapi-filesys.h b/src/os/inc/osapi-filesys.h index b0f719ce3..e49671b0d 100644 --- a/src/os/inc/osapi-filesys.h +++ b/src/os/inc/osapi-filesys.h @@ -31,7 +31,6 @@ #define OS_CHK_ONLY 0 /**< Unused, API takes bool */ #define OS_REPAIR 1 /**< Unused, API takes bool */ - /** @brief OSAL file system info */ typedef struct { @@ -203,10 +202,10 @@ int32 OS_unmount(const char *mountpoint); * @retval #OS_INVALID_POINTER if name is NULL * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long * @retval #OS_ERROR if the OS call failed - * + * * @deprecated Replaced by OS_FileSysStatVolume() - * Value can be obtained by reading the "blocks_free" struct member. - * + * */ int32 OS_fsBlocksFree(const char *name); @@ -227,13 +226,13 @@ int32 OS_fsBlocksFree(const char *name); * @retval #OS_INVALID_POINTER if name is NULL * @retval #OS_FS_ERR_PATH_TOO_LONG if the name is too long * @retval #OS_ERROR if the OS call failed - * - * @deprecated Replaced by OS_FileSysStatVolume(). + * + * @deprecated Replaced by OS_FileSysStatVolume(). * Value can be obtained by multiplying the "blocks_free" by the "block_size" struct members. */ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free); -#endif /* OSAL_OMIT_DEPRECATED */ +#endif /* OSAL_OMIT_DEPRECATED */ /*-------------------------------------------------------------------------------------*/ /** @@ -326,5 +325,4 @@ int32 OS_TranslatePath(const char *VirtualPath, char *LocalPath); int32 OS_GetFsInfo(os_fsinfo_t *filesys_info); /**@}*/ - #endif diff --git a/src/os/inc/osapi-module.h b/src/os/inc/osapi-module.h index c3196e677..d6f60fde6 100644 --- a/src/os/inc/osapi-module.h +++ b/src/os/inc/osapi-module.h @@ -25,7 +25,6 @@ #ifndef OSAPI_MODULE_H #define OSAPI_MODULE_H - #include "osconfig.h" #include "common_types.h" @@ -47,7 +46,7 @@ * to unload the module in the future, if the symbols are in use by other entities. * */ -#define OS_MODULE_FLAG_GLOBAL_SYMBOLS 0x00 +#define OS_MODULE_FLAG_GLOBAL_SYMBOLS 0x00 /** * @brief Requests OS_ModuleLoad() to keep the symbols local/private to this module @@ -69,7 +68,7 @@ * application must ensure that all references obtained in this manner have * been cleaned up/released before unloading the module. */ -#define OS_MODULE_FLAG_LOCAL_SYMBOLS 0x01 +#define OS_MODULE_FLAG_LOCAL_SYMBOLS 0x01 /* ** Typedefs diff --git a/src/os/inc/osapi-mutex.h b/src/os/inc/osapi-mutex.h index b41d9a994..d7ba1664c 100644 --- a/src/os/inc/osapi-mutex.h +++ b/src/os/inc/osapi-mutex.h @@ -28,7 +28,6 @@ #include "osconfig.h" #include "common_types.h" - /** @brief OSAL mutex properties */ typedef struct { diff --git a/src/os/inc/osapi-os-net.h b/src/os/inc/osapi-os-net.h index 3b8c43b84..6b18ca94e 100644 --- a/src/os/inc/osapi-os-net.h +++ b/src/os/inc/osapi-os-net.h @@ -45,5 +45,4 @@ #include "osapi-sockets.h" #include "osapi-network.h" - #endif diff --git a/src/os/inc/osapi-os-timer.h b/src/os/inc/osapi-os-timer.h index 30535bc53..7b27548f3 100644 --- a/src/os/inc/osapi-os-timer.h +++ b/src/os/inc/osapi-os-timer.h @@ -45,5 +45,4 @@ #include "osapi-timebase.h" #include "osapi-timer.h" - #endif diff --git a/src/os/inc/osapi-queue.h b/src/os/inc/osapi-queue.h index 5f989ff80..3bc5a877a 100644 --- a/src/os/inc/osapi-queue.h +++ b/src/os/inc/osapi-queue.h @@ -35,7 +35,6 @@ typedef struct osal_id_t creator; } OS_queue_prop_t; - /** @defgroup OSAPIMsgQueue OSAL Message Queue APIs * @{ */ diff --git a/src/os/inc/osapi-timebase.h b/src/os/inc/osapi-timebase.h index ec038053e..1e709ee2b 100644 --- a/src/os/inc/osapi-timebase.h +++ b/src/os/inc/osapi-timebase.h @@ -31,7 +31,7 @@ /* ** Typedefs */ -typedef uint32 (*OS_TimerSync_t)(osal_id_t timer_id); /**< @brief Timer sync */ +typedef uint32 (*OS_TimerSync_t)(osal_id_t timer_id); /**< @brief Timer sync */ /** @brief Time base properties */ typedef struct diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index bf0946a61..5708be8ca 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -38,7 +38,9 @@ */ #define OS_MAJOR_VERSION 5 /*!< @brief ONLY APPLY for OFFICIAL releases. Major version number. */ #define OS_MINOR_VERSION 0 /*!< @brief ONLY APPLY for OFFICIAL releases. Minor version number. */ -#define OS_REVISION 99 /*!< @brief ONLY APPLY for OFFICIAL releases. Revision version number. A value of "99" indicates an unreleased development version. */ +#define OS_REVISION \ + 99 /*!< @brief ONLY APPLY for OFFICIAL releases. Revision version number. A value of "99" indicates an unreleased \ + development version. */ #define OS_MISSION_REV 0 /*!< @brief ONLY USED by MISSION Implementations. Mission revision */ @@ -70,7 +72,7 @@ OSAL 4.1 is present. */ #define OSAL_API_VERSION ((OS_MAJOR_VERSION * 10000) + (OS_MINOR_VERSION * 100) + OS_REVISION) -#endif /* OSAPI_VERSION_H */ +#endif /* OSAPI_VERSION_H */ /************************/ /* End of File Comment */ diff --git a/src/os/inc/osapi.h b/src/os/inc/osapi.h index 2d6e11a4b..11701501a 100644 --- a/src/os/inc/osapi.h +++ b/src/os/inc/osapi.h @@ -98,7 +98,6 @@ extern "C" #include "osapi-bsp.h" - #ifdef __cplusplus } #endif diff --git a/src/os/portable/os-impl-no-symtab.c b/src/os/portable/os-impl-no-symtab.c index 48e25a52a..270fd598d 100644 --- a/src/os/portable/os-impl-no-symtab.c +++ b/src/os/portable/os-impl-no-symtab.c @@ -38,7 +38,6 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) { return OS_ERR_NOT_IMPLEMENTED; - } /*---------------------------------------------------------------- @@ -49,7 +48,6 @@ int32 OS_GlobalSymbolLookup_Impl(cpuaddr *SymbolAddress, const char *SymbolName) int32 OS_ModuleSymbolLookup_Impl(const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName) { return OS_ERR_NOT_IMPLEMENTED; - } /*---------------------------------------------------------------- @@ -60,5 +58,4 @@ int32 OS_ModuleSymbolLookup_Impl(const OS_object_token_t *token, cpuaddr *Symbol int32 OS_SymbolTableDump_Impl(const char *filename, size_t SizeLimit) { return (OS_ERR_NOT_IMPLEMENTED); - } diff --git a/src/os/posix/inc/os-impl-binsem.h b/src/os/posix/inc/os-impl-binsem.h index d55f3e165..356ec8e94 100644 --- a/src/os/posix/inc/os-impl-binsem.h +++ b/src/os/posix/inc/os-impl-binsem.h @@ -44,4 +44,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_binsem_internal_record_t OS_impl_bin_sem_table[OS_MAX_BIN_SEMAPHORES]; -#endif /* OS_IMPL_BINSEM_H */ +#endif /* OS_IMPL_BINSEM_H */ diff --git a/src/os/posix/inc/os-impl-console.h b/src/os/posix/inc/os-impl-console.h index eb92465e3..3ed7ac81f 100644 --- a/src/os/posix/inc/os-impl-console.h +++ b/src/os/posix/inc/os-impl-console.h @@ -42,4 +42,4 @@ typedef struct extern OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; -#endif /* OS_IMPL_CONSOLE_H */ +#endif /* OS_IMPL_CONSOLE_H */ diff --git a/src/os/posix/inc/os-impl-countsem.h b/src/os/posix/inc/os-impl-countsem.h index d6ee39a75..176fcd9ec 100644 --- a/src/os/posix/inc/os-impl-countsem.h +++ b/src/os/posix/inc/os-impl-countsem.h @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_countsem_internal_record_t OS_impl_count_sem_table[OS_MAX_COUNT_SEMAPHORES]; -#endif /* OS_IMPL_COUNTSEM_H */ +#endif /* OS_IMPL_COUNTSEM_H */ diff --git a/src/os/posix/inc/os-impl-dirs.h b/src/os/posix/inc/os-impl-dirs.h index 981f3530b..e10b8e185 100644 --- a/src/os/posix/inc/os-impl-dirs.h +++ b/src/os/posix/inc/os-impl-dirs.h @@ -45,4 +45,4 @@ typedef struct */ extern OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; -#endif /* OS_IMPL_DIRS_H */ +#endif /* OS_IMPL_DIRS_H */ diff --git a/src/os/posix/inc/os-impl-files.h b/src/os/posix/inc/os-impl-files.h index df01c5b23..ec9f1e01c 100644 --- a/src/os/posix/inc/os-impl-files.h +++ b/src/os/posix/inc/os-impl-files.h @@ -48,4 +48,4 @@ extern gid_t OS_IMPL_SELF_EGID; extern const int OS_IMPL_REGULAR_FILE_FLAGS; -#endif /* OS_IMPL_FILES_H */ +#endif /* OS_IMPL_FILES_H */ diff --git a/src/os/posix/inc/os-impl-gettime.h b/src/os/posix/inc/os-impl-gettime.h index 308d3b4d8..c48d6f324 100644 --- a/src/os/posix/inc/os-impl-gettime.h +++ b/src/os/posix/inc/os-impl-gettime.h @@ -33,4 +33,4 @@ #define OSAL_GETTIME_SOURCE_CLOCK CLOCK_MONOTONIC -#endif /* OS_IMPL_GETTIME_H */ +#endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/posix/inc/os-impl-idmap.h b/src/os/posix/inc/os-impl-idmap.h index fcedf13ef..00194e1ac 100644 --- a/src/os/posix/inc/os-impl-idmap.h +++ b/src/os/posix/inc/os-impl-idmap.h @@ -41,4 +41,4 @@ typedef struct /* Tables where the lock state information is stored */ extern OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER]; -#endif /* OS_IMPL_IDMAP_H */ +#endif /* OS_IMPL_IDMAP_H */ diff --git a/src/os/posix/inc/os-impl-io.h b/src/os/posix/inc/os-impl-io.h index 80a67119b..9db8e7c81 100644 --- a/src/os/posix/inc/os-impl-io.h +++ b/src/os/posix/inc/os-impl-io.h @@ -48,4 +48,4 @@ typedef struct */ extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; -#endif /* OS_IMPL_IO_H */ +#endif /* OS_IMPL_IO_H */ diff --git a/src/os/posix/inc/os-impl-loader.h b/src/os/posix/inc/os-impl-loader.h index 3fbfb00b5..b7dc4b641 100644 --- a/src/os/posix/inc/os-impl-loader.h +++ b/src/os/posix/inc/os-impl-loader.h @@ -52,4 +52,4 @@ typedef struct */ extern OS_impl_module_internal_record_t OS_impl_module_table[OS_MAX_MODULES]; -#endif /* OS_IMPL_LOADER_H */ +#endif /* OS_IMPL_LOADER_H */ diff --git a/src/os/posix/inc/os-impl-mutex.h b/src/os/posix/inc/os-impl-mutex.h index c286b0c10..61db43dbf 100644 --- a/src/os/posix/inc/os-impl-mutex.h +++ b/src/os/posix/inc/os-impl-mutex.h @@ -40,4 +40,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_mutex_internal_record_t OS_impl_mutex_table[OS_MAX_MUTEXES]; -#endif /* OS_IMPL_MUTEX_H */ +#endif /* OS_IMPL_MUTEX_H */ diff --git a/src/os/posix/inc/os-impl-network.h b/src/os/posix/inc/os-impl-network.h index eaa507cff..977f978d6 100644 --- a/src/os/posix/inc/os-impl-network.h +++ b/src/os/posix/inc/os-impl-network.h @@ -30,4 +30,4 @@ #include -#endif /* OS_IMPL_NETWORK_H */ +#endif /* OS_IMPL_NETWORK_H */ diff --git a/src/os/posix/inc/os-impl-queues.h b/src/os/posix/inc/os-impl-queues.h index f94091183..673b6a0a0 100644 --- a/src/os/posix/inc/os-impl-queues.h +++ b/src/os/posix/inc/os-impl-queues.h @@ -40,4 +40,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_queue_internal_record_t OS_impl_queue_table[OS_MAX_QUEUES]; -#endif /* OS_IMPL_QUEUES_H */ +#endif /* OS_IMPL_QUEUES_H */ diff --git a/src/os/posix/inc/os-impl-select.h b/src/os/posix/inc/os-impl-select.h index 13d299397..bdcdc9ba0 100644 --- a/src/os/posix/inc/os-impl-select.h +++ b/src/os/posix/inc/os-impl-select.h @@ -33,4 +33,4 @@ #include #include -#endif /* OS_IMPL_SELECT_H */ +#endif /* OS_IMPL_SELECT_H */ diff --git a/src/os/posix/inc/os-impl-sockets.h b/src/os/posix/inc/os-impl-sockets.h index 7911c9ddc..217253246 100644 --- a/src/os/posix/inc/os-impl-sockets.h +++ b/src/os/posix/inc/os-impl-sockets.h @@ -43,4 +43,4 @@ */ #define OS_IMPL_SOCKET_FLAGS O_NONBLOCK -#endif /* OS_IMPL_SOCKETS_H */ +#endif /* OS_IMPL_SOCKETS_H */ diff --git a/src/os/posix/inc/os-impl-tasks.h b/src/os/posix/inc/os-impl-tasks.h index d73d3628f..da25cd0ea 100644 --- a/src/os/posix/inc/os-impl-tasks.h +++ b/src/os/posix/inc/os-impl-tasks.h @@ -45,5 +45,4 @@ extern OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; int32 OS_Posix_InternalTaskCreate_Impl(pthread_t *pthr, osal_priority_t priority, size_t stacksz, PthreadFuncPtr_t entry, void *entry_arg); - -#endif /* OS_IMPL_TASKS_H */ +#endif /* OS_IMPL_TASKS_H */ diff --git a/src/os/posix/inc/os-impl-timebase.h b/src/os/posix/inc/os-impl-timebase.h index 103b78911..a995f4b8b 100644 --- a/src/os/posix/inc/os-impl-timebase.h +++ b/src/os/posix/inc/os-impl-timebase.h @@ -50,4 +50,4 @@ typedef struct extern OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; -#endif /* OS_IMPL_TIMEBASE_H */ +#endif /* OS_IMPL_TIMEBASE_H */ diff --git a/src/os/posix/inc/os-posix.h b/src/os/posix/inc/os-posix.h index d05d4ac5b..9c2c1d2c9 100644 --- a/src/os/posix/inc/os-posix.h +++ b/src/os/posix/inc/os-posix.h @@ -107,6 +107,6 @@ int32 OS_Posix_FileSysAPI_Impl_Init(void); int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype); -void OS_Posix_CompAbsDelayTime(uint32 msecs, struct timespec *tm); +void OS_Posix_CompAbsDelayTime(uint32 msecs, struct timespec *tm); -#endif /* OS_POSIX_H */ +#endif /* OS_POSIX_H */ diff --git a/src/os/posix/src/os-impl-idmap.c b/src/os/posix/src/os-impl-idmap.c index 2ec48dda3..60c7ce0c2 100644 --- a/src/os/posix/src/os-impl-idmap.c +++ b/src/os/posix/src/os-impl-idmap.c @@ -49,8 +49,7 @@ static OS_impl_objtype_lock_t OS_module_table_lock; static OS_impl_objtype_lock_t OS_filesys_table_lock; static OS_impl_objtype_lock_t OS_console_lock; -OS_impl_objtype_lock_t * const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = -{ +OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = { [OS_OBJECT_TYPE_UNDEFINED] = NULL, [OS_OBJECT_TYPE_OS_TASK] = &OS_global_task_table_lock, [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_lock, @@ -86,7 +85,7 @@ void OS_Posix_ReleaseTableMutex(void *mut) void OS_Lock_Global_Impl(osal_objtype_t idtype) { OS_impl_objtype_lock_t *impl; - int ret; + int ret; impl = OS_impl_objtype_lock_table[idtype]; @@ -109,7 +108,7 @@ void OS_Lock_Global_Impl(osal_objtype_t idtype) void OS_Unlock_Global_Impl(osal_objtype_t idtype) { OS_impl_objtype_lock_t *impl; - int ret; + int ret; impl = OS_impl_objtype_lock_table[idtype]; @@ -140,7 +139,7 @@ void OS_Unlock_Global_Impl(osal_objtype_t idtype) void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) { OS_impl_objtype_lock_t *impl; - struct timespec ts; + struct timespec ts; impl = OS_impl_objtype_lock_table[idtype]; @@ -183,9 +182,9 @@ void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) ---------------------------------------------------------------------------------------*/ int32 OS_Posix_TableMutex_Init(osal_objtype_t idtype) { - int ret; - int32 return_code = OS_SUCCESS; - pthread_mutexattr_t mutex_attr; + int ret; + int32 return_code = OS_SUCCESS; + pthread_mutexattr_t mutex_attr; OS_impl_objtype_lock_t *impl; impl = OS_impl_objtype_lock_table[idtype]; diff --git a/src/os/posix/src/os-impl-tasks.c b/src/os/posix/src/os-impl-tasks.c index 5fd06e8bf..bf1761772 100644 --- a/src/os/posix/src/os-impl-tasks.c +++ b/src/os/posix/src/os-impl-tasks.c @@ -421,8 +421,8 @@ int32 OS_Posix_TaskAPI_Impl_Init(void) ret_long = sysconf(_SC_PAGESIZE); if (ret_long < 0) { - OS_DEBUG("Could not get page size via sysconf: %s\n", strerror(errno)); - return OS_ERROR; + OS_DEBUG("Could not get page size via sysconf: %s\n", strerror(errno)); + return OS_ERROR; } POSIX_GlobalVars.PageSize = ret_long; diff --git a/src/os/posix/src/os-impl-timebase.c b/src/os/posix/src/os-impl-timebase.c index 87828730b..669f17e7e 100644 --- a/src/os/posix/src/os-impl-timebase.c +++ b/src/os/posix/src/os-impl-timebase.c @@ -302,8 +302,8 @@ int32 OS_Posix_TimeBaseAPI_Impl_Init(void) * - This is used internally for reporting accuracy, * - TicksPerSecond values over 2M will return zero */ - OS_SharedGlobalVars.MicroSecPerTick = (1000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / - OS_SharedGlobalVars.TicksPerSecond; + OS_SharedGlobalVars.MicroSecPerTick = + (1000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / OS_SharedGlobalVars.TicksPerSecond; } while (0); return (return_code); diff --git a/src/os/rtems/inc/os-impl-binsem.h b/src/os/rtems/inc/os-impl-binsem.h index 4af72c46c..7437e6c5b 100644 --- a/src/os/rtems/inc/os-impl-binsem.h +++ b/src/os/rtems/inc/os-impl-binsem.h @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_binsem_internal_record_t OS_impl_bin_sem_table[OS_MAX_BIN_SEMAPHORES]; -#endif /* OS_IMPL_BINSEM_H */ +#endif /* OS_IMPL_BINSEM_H */ diff --git a/src/os/rtems/inc/os-impl-console.h b/src/os/rtems/inc/os-impl-console.h index adcaa49dd..03663aad9 100644 --- a/src/os/rtems/inc/os-impl-console.h +++ b/src/os/rtems/inc/os-impl-console.h @@ -42,4 +42,4 @@ typedef struct extern OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; -#endif /* OS_IMPL_CONSOLE_H */ +#endif /* OS_IMPL_CONSOLE_H */ diff --git a/src/os/rtems/inc/os-impl-countsem.h b/src/os/rtems/inc/os-impl-countsem.h index a992d62e6..5070ee6db 100644 --- a/src/os/rtems/inc/os-impl-countsem.h +++ b/src/os/rtems/inc/os-impl-countsem.h @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_countsem_internal_record_t OS_impl_count_sem_table[OS_MAX_COUNT_SEMAPHORES]; -#endif /* OS_IMPL_COUNTSEM_H */ +#endif /* OS_IMPL_COUNTSEM_H */ diff --git a/src/os/rtems/inc/os-impl-dirs.h b/src/os/rtems/inc/os-impl-dirs.h index e7f7d073f..8db0eee60 100644 --- a/src/os/rtems/inc/os-impl-dirs.h +++ b/src/os/rtems/inc/os-impl-dirs.h @@ -45,4 +45,4 @@ typedef struct */ extern OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; -#endif /* OS_IMPL_DIRS_H */ +#endif /* OS_IMPL_DIRS_H */ diff --git a/src/os/rtems/inc/os-impl-files.h b/src/os/rtems/inc/os-impl-files.h index 5b58da49a..c15b915b6 100644 --- a/src/os/rtems/inc/os-impl-files.h +++ b/src/os/rtems/inc/os-impl-files.h @@ -42,4 +42,4 @@ #define OS_IMPL_REGULAR_FILE_FLAGS 0 -#endif /* OS_IMPL_FILES_H */ +#endif /* OS_IMPL_FILES_H */ diff --git a/src/os/rtems/inc/os-impl-gettime.h b/src/os/rtems/inc/os-impl-gettime.h index 5b3b8237c..28690e350 100644 --- a/src/os/rtems/inc/os-impl-gettime.h +++ b/src/os/rtems/inc/os-impl-gettime.h @@ -33,4 +33,4 @@ #define OSAL_GETTIME_SOURCE_CLOCK CLOCK_MONOTONIC -#endif /* OS_IMPL_GETTIME_H */ +#endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/rtems/inc/os-impl-idmap.h b/src/os/rtems/inc/os-impl-idmap.h index c953afbcf..1f0285192 100644 --- a/src/os/rtems/inc/os-impl-idmap.h +++ b/src/os/rtems/inc/os-impl-idmap.h @@ -40,4 +40,4 @@ typedef struct /* Tables where the lock state information is stored */ extern OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER]; -#endif /* OS_IMPL_IDMAP_H */ +#endif /* OS_IMPL_IDMAP_H */ diff --git a/src/os/rtems/inc/os-impl-io.h b/src/os/rtems/inc/os-impl-io.h index 3ad2aa372..da6432214 100644 --- a/src/os/rtems/inc/os-impl-io.h +++ b/src/os/rtems/inc/os-impl-io.h @@ -46,4 +46,4 @@ typedef struct */ extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; -#endif /* OS_IMPL_IO_H */ +#endif /* OS_IMPL_IO_H */ diff --git a/src/os/rtems/inc/os-impl-loader.h b/src/os/rtems/inc/os-impl-loader.h index 126899e34..12503c023 100644 --- a/src/os/rtems/inc/os-impl-loader.h +++ b/src/os/rtems/inc/os-impl-loader.h @@ -50,4 +50,4 @@ typedef struct extern OS_impl_module_internal_record_t OS_impl_module_table[OS_MAX_MODULES]; -#endif /* OS_IMPL_LOADER_H */ +#endif /* OS_IMPL_LOADER_H */ diff --git a/src/os/rtems/inc/os-impl-mutex.h b/src/os/rtems/inc/os-impl-mutex.h index d59896874..be17d462a 100644 --- a/src/os/rtems/inc/os-impl-mutex.h +++ b/src/os/rtems/inc/os-impl-mutex.h @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_mutex_internal_record_t OS_impl_mutex_table[OS_MAX_MUTEXES]; -#endif /* OS_IMPL_MUTEX_H */ +#endif /* OS_IMPL_MUTEX_H */ diff --git a/src/os/rtems/inc/os-impl-queues.h b/src/os/rtems/inc/os-impl-queues.h index 38542793b..354abec24 100644 --- a/src/os/rtems/inc/os-impl-queues.h +++ b/src/os/rtems/inc/os-impl-queues.h @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_queue_internal_record_t OS_impl_queue_table[OS_MAX_QUEUES]; -#endif /* OS_IMPL_QUEUES_H */ +#endif /* OS_IMPL_QUEUES_H */ diff --git a/src/os/rtems/inc/os-impl-select.h b/src/os/rtems/inc/os-impl-select.h index a4591dd76..4e6164365 100644 --- a/src/os/rtems/inc/os-impl-select.h +++ b/src/os/rtems/inc/os-impl-select.h @@ -33,4 +33,4 @@ #include #include -#endif /* OS_IMPL_SELECT_H */ +#endif /* OS_IMPL_SELECT_H */ diff --git a/src/os/rtems/inc/os-impl-sockets.h b/src/os/rtems/inc/os-impl-sockets.h index 286e37873..a1e557801 100644 --- a/src/os/rtems/inc/os-impl-sockets.h +++ b/src/os/rtems/inc/os-impl-sockets.h @@ -43,4 +43,4 @@ */ #define OS_IMPL_SOCKET_FLAGS O_NONBLOCK -#endif /* OS_IMPL_SOCKETS_H */ +#endif /* OS_IMPL_SOCKETS_H */ diff --git a/src/os/rtems/inc/os-impl-tasks.h b/src/os/rtems/inc/os-impl-tasks.h index 491a8c1b2..d8fb5dd47 100644 --- a/src/os/rtems/inc/os-impl-tasks.h +++ b/src/os/rtems/inc/os-impl-tasks.h @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; -#endif /* OS_IMPL_TASKS_H */ +#endif /* OS_IMPL_TASKS_H */ diff --git a/src/os/rtems/inc/os-impl-timebase.h b/src/os/rtems/inc/os-impl-timebase.h index 747f74ce0..998d6354f 100644 --- a/src/os/rtems/inc/os-impl-timebase.h +++ b/src/os/rtems/inc/os-impl-timebase.h @@ -50,4 +50,4 @@ typedef struct extern OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; -#endif /* OS_IMPL_TIMEBASE_H */ +#endif /* OS_IMPL_TIMEBASE_H */ diff --git a/src/os/rtems/inc/os-rtems.h b/src/os/rtems/inc/os-rtems.h index 2514bdf53..b901f3911 100644 --- a/src/os/rtems/inc/os-rtems.h +++ b/src/os/rtems/inc/os-rtems.h @@ -56,15 +56,15 @@ * Handle the data structure and API name changes between RTEMS 4.11 and RTEMS 5.1 */ #ifdef _RTEMS_5_ - #define OSAL_HEAP_INFO_BLOCK Heap_Information_block - #define OSAL_UNRESOLV_REC_TYPE rtems_rtl_unresolv_rec - #define OSAL_UNRESOLVED_SYMBOL rtems_rtl_unresolved_symbol - #define OSAL_UNRESOLVED_ITERATE rtems_rtl_unresolved_iterate +#define OSAL_HEAP_INFO_BLOCK Heap_Information_block +#define OSAL_UNRESOLV_REC_TYPE rtems_rtl_unresolv_rec +#define OSAL_UNRESOLVED_SYMBOL rtems_rtl_unresolved_symbol +#define OSAL_UNRESOLVED_ITERATE rtems_rtl_unresolved_iterate #else - #define OSAL_HEAP_INFO_BLOCK region_information_block - #define OSAL_UNRESOLV_REC_TYPE rtems_rtl_unresolv_rec_t - #define OSAL_UNRESOLVED_SYMBOL rtems_rtl_unresolved_name - #define OSAL_UNRESOLVED_ITERATE rtems_rtl_unresolved_interate +#define OSAL_HEAP_INFO_BLOCK region_information_block +#define OSAL_UNRESOLV_REC_TYPE rtems_rtl_unresolv_rec_t +#define OSAL_UNRESOLVED_SYMBOL rtems_rtl_unresolved_name +#define OSAL_UNRESOLVED_ITERATE rtems_rtl_unresolved_interate #endif /**************************************************************************************** @@ -100,4 +100,4 @@ int32 OS_Rtems_FileSysAPI_Impl_Init(void); int32 OS_Rtems_TableMutex_Init(osal_objtype_t idtype); -#endif /* OS_RTEMS_H */ +#endif /* OS_RTEMS_H */ diff --git a/src/os/rtems/src/os-impl-idmap.c b/src/os/rtems/src/os-impl-idmap.c index 340cc9fc0..cdce72602 100644 --- a/src/os/rtems/src/os-impl-idmap.c +++ b/src/os/rtems/src/os-impl-idmap.c @@ -58,8 +58,7 @@ static OS_impl_objtype_lock_t OS_module_table_lock; static OS_impl_objtype_lock_t OS_filesys_table_lock; static OS_impl_objtype_lock_t OS_console_lock; -OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = -{ +OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = { [OS_OBJECT_TYPE_UNDEFINED] = NULL, [OS_OBJECT_TYPE_OS_TASK] = &OS_task_table_lock, [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_lock, @@ -86,7 +85,7 @@ OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = void OS_Lock_Global_Impl(osal_objtype_t idtype) { OS_impl_objtype_lock_t *impl; - rtems_status_code rtems_sc; + rtems_status_code rtems_sc; impl = OS_impl_objtype_lock_table[idtype]; @@ -109,7 +108,7 @@ void OS_Lock_Global_Impl(osal_objtype_t idtype) void OS_Unlock_Global_Impl(osal_objtype_t idtype) { OS_impl_objtype_lock_t *impl; - rtems_status_code rtems_sc; + rtems_status_code rtems_sc; impl = OS_impl_objtype_lock_table[idtype]; @@ -162,7 +161,7 @@ void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) int32 OS_Rtems_TableMutex_Init(osal_objtype_t idtype) { OS_impl_objtype_lock_t *impl; - rtems_status_code rtems_sc; + rtems_status_code rtems_sc; impl = OS_impl_objtype_lock_table[idtype]; if (impl == NULL) diff --git a/src/os/rtems/src/os-impl-queues.c b/src/os/rtems/src/os-impl-queues.c index 014e9e9ba..2e8ec2188 100644 --- a/src/os/rtems/src/os-impl-queues.c +++ b/src/os/rtems/src/os-impl-queues.c @@ -101,9 +101,9 @@ int32 OS_QueueCreate_Impl(const OS_object_token_t *token, uint32 flags) ** (RTEMS_FIFO or RTEMS_PRIORITY) is irrelevant since only one task waits ** on each queue. */ - status = rtems_message_queue_create(r_name, /* 32-bit RTEMS object name; not used */ - queue->max_depth, /* maximum number of messages in queue (queue depth) */ - queue->max_size, /* maximum size in bytes of a message */ + status = rtems_message_queue_create(r_name, /* 32-bit RTEMS object name; not used */ + queue->max_depth, /* maximum number of messages in queue (queue depth) */ + queue->max_size, /* maximum size in bytes of a message */ RTEMS_FIFO | RTEMS_LOCAL, /* attributes (default) */ &(impl->id) /* object ID returned for queue */ ); diff --git a/src/os/rtems/src/os-impl-timebase.c b/src/os/rtems/src/os-impl-timebase.c index 75bc531aa..321b02109 100644 --- a/src/os/rtems/src/os-impl-timebase.c +++ b/src/os/rtems/src/os-impl-timebase.c @@ -235,8 +235,8 @@ int32 OS_Rtems_TimeBaseAPI_Impl_Init(void) * This really should be an exact/whole number result; otherwise this * will round to the nearest nanosecond. */ - RTEMS_GlobalVars.ClockAccuracyNsec = (1000000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / - OS_SharedGlobalVars.TicksPerSecond; + RTEMS_GlobalVars.ClockAccuracyNsec = + (1000000000 + (OS_SharedGlobalVars.TicksPerSecond / 2)) / OS_SharedGlobalVars.TicksPerSecond; /* * Finally compute the Microseconds per tick @@ -331,8 +331,8 @@ int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) * The tick_sem is a simple semaphore posted by the ISR and taken by the * timebase helper task (created later). */ - rtems_sc = rtems_semaphore_create(r_name, 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, 0, - &local->tick_sem); + rtems_sc = + rtems_semaphore_create(r_name, 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, 0, &local->tick_sem); if (rtems_sc != RTEMS_SUCCESSFUL) { OS_DEBUG("Error: Tick Sem could not be created: %d\n", (int)rtems_sc); diff --git a/src/os/shared/inc/os-shared-binsem.h b/src/os/shared/inc/os-shared-binsem.h index 9ba97e4d9..b4273c426 100644 --- a/src/os/shared/inc/os-shared-binsem.h +++ b/src/os/shared/inc/os-shared-binsem.h @@ -122,4 +122,4 @@ int32 OS_BinSemDelete_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_BinSemGetInfo_Impl(const OS_object_token_t *token, OS_bin_sem_prop_t *bin_prop); -#endif /* OS_SHARED_BINSEM_H */ +#endif /* OS_SHARED_BINSEM_H */ diff --git a/src/os/shared/inc/os-shared-clock.h b/src/os/shared/inc/os-shared-clock.h index 97da529bb..dab3a5ea1 100644 --- a/src/os/shared/inc/os-shared-clock.h +++ b/src/os/shared/inc/os-shared-clock.h @@ -54,4 +54,4 @@ int32 OS_GetLocalTime_Impl(OS_time_t *time_struct); ------------------------------------------------------------------*/ int32 OS_SetLocalTime_Impl(const OS_time_t *time_struct); -#endif /* OS_SHARED_CLOCK_H */ +#endif /* OS_SHARED_CLOCK_H */ diff --git a/src/os/shared/inc/os-shared-common.h b/src/os/shared/inc/os-shared-common.h index 58ec31519..f9eb15180 100644 --- a/src/os/shared/inc/os-shared-common.h +++ b/src/os/shared/inc/os-shared-common.h @@ -128,7 +128,6 @@ void OS_IdleLoop_Impl(void); ------------------------------------------------------------------*/ void OS_ApplicationShutdown_Impl(void); - /*---------------------------------------------------------------- Function: OS_strnlen @@ -137,9 +136,9 @@ void OS_ApplicationShutdown_Impl(void); within a fixed-size array buffer. Provides a local OSAL routine to get the functionality - of the (non-C99) "strnlen()" function, via the + of the (non-C99) "strnlen()" function, via the C89/C99 standard "memchr()" function instead. - + ------------------------------------------------------------------*/ static inline size_t OS_strnlen(const char *s, size_t maxlen) { @@ -152,4 +151,4 @@ static inline size_t OS_strnlen(const char *s, size_t maxlen) return maxlen; } -#endif /* OS_SHARED_COMMON_H */ +#endif /* OS_SHARED_COMMON_H */ diff --git a/src/os/shared/inc/os-shared-countsem.h b/src/os/shared/inc/os-shared-countsem.h index 4330125ab..c02cc9db4 100644 --- a/src/os/shared/inc/os-shared-countsem.h +++ b/src/os/shared/inc/os-shared-countsem.h @@ -112,4 +112,4 @@ int32 OS_CountSemDelete_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_CountSemGetInfo_Impl(const OS_object_token_t *token, OS_count_sem_prop_t *count_prop); -#endif /* OS_SHARED_COUNTSEM_H */ +#endif /* OS_SHARED_COUNTSEM_H */ diff --git a/src/os/shared/inc/os-shared-dir.h b/src/os/shared/inc/os-shared-dir.h index df8d1257b..081f5ae60 100644 --- a/src/os/shared/inc/os-shared-dir.h +++ b/src/os/shared/inc/os-shared-dir.h @@ -111,4 +111,4 @@ int32 OS_DirRewind_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_DirRemove_Impl(const char *local_path); -#endif /* OS_SHARED_DIR_H */ +#endif /* OS_SHARED_DIR_H */ diff --git a/src/os/shared/inc/os-shared-errors.h b/src/os/shared/inc/os-shared-errors.h index 131db4435..a93764caf 100644 --- a/src/os/shared/inc/os-shared-errors.h +++ b/src/os/shared/inc/os-shared-errors.h @@ -39,4 +39,4 @@ typedef struct extern const OS_ErrorTable_Entry_t OS_IMPL_ERROR_NAME_TABLE[]; -#endif /* OS_SHARED_ERRORS_H */ +#endif /* OS_SHARED_ERRORS_H */ diff --git a/src/os/shared/inc/os-shared-file.h b/src/os/shared/inc/os-shared-file.h index 909bf335c..715908dc3 100644 --- a/src/os/shared/inc/os-shared-file.h +++ b/src/os/shared/inc/os-shared-file.h @@ -183,7 +183,6 @@ int32 OS_FileRename_Impl(const char *old_path, const char *new_path); ------------------------------------------------------------------*/ int32 OS_FileChmod_Impl(const char *local_path, uint32 access); - /* * Internal helper function * diff --git a/src/os/shared/inc/os-shared-globaldefs.h b/src/os/shared/inc/os-shared-globaldefs.h index 39da9b5e2..dc35c88c4 100644 --- a/src/os/shared/inc/os-shared-globaldefs.h +++ b/src/os/shared/inc/os-shared-globaldefs.h @@ -69,10 +69,10 @@ typedef struct OS_object_token OS_object_token_t; */ typedef union { - void * opaque_arg; - OS_ArgCallback_t arg_callback_func; - osal_id_t id; - osal_index_t idx; + void * opaque_arg; + OS_ArgCallback_t arg_callback_func; + osal_id_t id; + osal_index_t idx; } OS_U32ValueWrapper_t; /* @@ -109,7 +109,7 @@ extern void OS_DebugPrintf(uint32 Level, const char *Func, uint32 Line, const ch * (e.g. read/write) return a size as an int32 type, and therefore the * operation cannot exceed the bounds of this type. */ -#define OS_CHECK_SIZE(val) ARGCHECK((val) > 0 && (val) < (UINT32_MAX/2), OS_ERR_INVALID_SIZE) +#define OS_CHECK_SIZE(val) ARGCHECK((val) > 0 && (val) < (UINT32_MAX / 2), OS_ERR_INVALID_SIZE) /* * An OSAL-specific check macro for arbitrary string argument validation. diff --git a/src/os/shared/inc/os-shared-heap.h b/src/os/shared/inc/os-shared-heap.h index 0bd19d854..d419d7d4a 100644 --- a/src/os/shared/inc/os-shared-heap.h +++ b/src/os/shared/inc/os-shared-heap.h @@ -48,4 +48,4 @@ ------------------------------------------------------------------*/ int32 OS_HeapGetInfo_Impl(OS_heap_prop_t *heap_prop); -#endif /* OS_SHARED_HEAP_H */ +#endif /* OS_SHARED_HEAP_H */ diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index a08e16628..9f487c82e 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -52,7 +52,8 @@ typedef enum OS_LOCK_MODE_NONE, /**< Quick ID validity check, does not lock global table at all (use with caution) */ OS_LOCK_MODE_GLOBAL, /**< Confirm ID match, and if successful, leave global table locked */ OS_LOCK_MODE_REFCOUNT, /**< Confirm ID match, increment refcount, and unlock global table. ID is not changed. */ - OS_LOCK_MODE_EXCLUSIVE, /**< Confirm ID match AND refcount equal zero, then change ID to RESERVED value and unlock global. */ + OS_LOCK_MODE_EXCLUSIVE, /**< Confirm ID match AND refcount equal zero, then change ID to RESERVED value and unlock + global. */ OS_LOCK_MODE_RESERVED /**< Confirm ID is already set to RESERVED, otherwise like OS_LOCK_MODE_GLOBAL. */ } OS_lock_mode_t; @@ -214,7 +215,6 @@ void OS_WaitForStateChange(OS_object_token_t *token, uint32 attempts); ------------------------------------------------------------------*/ void OS_WaitForStateChange_Impl(osal_objtype_t objtype, uint32 attempts); - /* Function prototypes for routines implemented in common layers but private to OSAL @@ -533,7 +533,7 @@ static inline const OS_object_token_t *OS_ObjectIdIteratorRef(OS_object_iter_t * Returns: None ------------------------------------------------------------------*/ -int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t,void*)); +int32 OS_ObjectIdIteratorProcessEntry(OS_object_iter_t *iter, int32 (*func)(osal_id_t, void *)); /* * Internal helper functions @@ -545,4 +545,4 @@ bool OS_ObjectNameMatch(void *ref, const OS_object_token_t *token, const OS_com int32 OS_ObjectIdFindNextMatch(OS_ObjectMatchFunc_t MatchFunc, void *arg, OS_object_token_t *token); int32 OS_ObjectIdFindNextFree(OS_object_token_t *token); -#endif /* OS_SHARED_IDMAP_H */ +#endif /* OS_SHARED_IDMAP_H */ diff --git a/src/os/shared/inc/os-shared-module.h b/src/os/shared/inc/os-shared-module.h index 58bd6f542..5f0e53adb 100644 --- a/src/os/shared/inc/os-shared-module.h +++ b/src/os/shared/inc/os-shared-module.h @@ -130,4 +130,4 @@ int32 OS_SymbolTableDump_Impl(const char *filename, size_t size_limit); int32 OS_ModuleLoad_Static(const char *ModuleName); int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName); -#endif /* OS_SHARED_MODULE_H */ +#endif /* OS_SHARED_MODULE_H */ diff --git a/src/os/shared/inc/os-shared-mutex.h b/src/os/shared/inc/os-shared-mutex.h index 7658ed28b..524f9fcde 100644 --- a/src/os/shared/inc/os-shared-mutex.h +++ b/src/os/shared/inc/os-shared-mutex.h @@ -33,8 +33,8 @@ typedef struct { - char obj_name[OS_MAX_API_NAME]; - osal_id_t last_owner; + char obj_name[OS_MAX_API_NAME]; + osal_id_t last_owner; } OS_mutex_internal_record_t; /* @@ -97,4 +97,4 @@ int32 OS_MutSemDelete_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_MutSemGetInfo_Impl(const OS_object_token_t *token, OS_mut_sem_prop_t *mut_prop); -#endif /* OS_SHARED_MUTEX_H */ +#endif /* OS_SHARED_MUTEX_H */ diff --git a/src/os/shared/inc/os-shared-network.h b/src/os/shared/inc/os-shared-network.h index 8515d5be8..19fd03d79 100644 --- a/src/os/shared/inc/os-shared-network.h +++ b/src/os/shared/inc/os-shared-network.h @@ -63,4 +63,4 @@ int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len); ------------------------------------------------------------------*/ int32 OS_NetworkGetID_Impl(int32 *IdBuf); -#endif /* OS_SHARED_NETWORK_H */ +#endif /* OS_SHARED_NETWORK_H */ diff --git a/src/os/shared/inc/os-shared-printf.h b/src/os/shared/inc/os-shared-printf.h index 8deeaab68..43393a154 100644 --- a/src/os/shared/inc/os-shared-printf.h +++ b/src/os/shared/inc/os-shared-printf.h @@ -103,4 +103,4 @@ void OS_ConsoleOutput_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ void OS_ConsoleWakeup_Impl(const OS_object_token_t *token); -#endif /* OS_SHARED_PRINTF_H */ +#endif /* OS_SHARED_PRINTF_H */ diff --git a/src/os/shared/inc/os-shared-queue.h b/src/os/shared/inc/os-shared-queue.h index 3f68ef98f..d0d123989 100644 --- a/src/os/shared/inc/os-shared-queue.h +++ b/src/os/shared/inc/os-shared-queue.h @@ -107,4 +107,4 @@ int32 OS_QueuePut_Impl(const OS_object_token_t *token, const void *data, size_t ------------------------------------------------------------------*/ int32 OS_QueueGetInfo_Impl(const OS_object_token_t *token, OS_queue_prop_t *queue_prop); -#endif /* OS_SHARED_QUEUE_H */ +#endif /* OS_SHARED_QUEUE_H */ diff --git a/src/os/shared/inc/os-shared-select.h b/src/os/shared/inc/os-shared-select.h index 7b8d58cc9..051bf4a50 100644 --- a/src/os/shared/inc/os-shared-select.h +++ b/src/os/shared/inc/os-shared-select.h @@ -78,4 +78,4 @@ int32 OS_SelectSingle_Impl(const OS_object_token_t *token, uint32 *SelectFlags, ------------------------------------------------------------------*/ int32 OS_SelectMultiple_Impl(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs); -#endif /* OS_SHARED_SELECT_H */ +#endif /* OS_SHARED_SELECT_H */ diff --git a/src/os/shared/inc/os-shared-shell.h b/src/os/shared/inc/os-shared-shell.h index be16a296c..db58583b7 100644 --- a/src/os/shared/inc/os-shared-shell.h +++ b/src/os/shared/inc/os-shared-shell.h @@ -44,4 +44,4 @@ ------------------------------------------------------------------*/ int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd); -#endif /* OS_SHARED_SHELL_H */ +#endif /* OS_SHARED_SHELL_H */ diff --git a/src/os/shared/inc/os-shared-sockets.h b/src/os/shared/inc/os-shared-sockets.h index 3bcdcbd62..7c3175753 100644 --- a/src/os/shared/inc/os-shared-sockets.h +++ b/src/os/shared/inc/os-shared-sockets.h @@ -180,4 +180,4 @@ int32 OS_SocketAddrSetPort_Impl(OS_SockAddr_t *Addr, uint16 PortNum); */ void OS_CreateSocketName(const OS_object_token_t *token, const OS_SockAddr_t *Addr, const char *parent_name); -#endif /* OS_SHARED_SOCKETS_H */ +#endif /* OS_SHARED_SOCKETS_H */ diff --git a/src/os/shared/inc/os-shared-task.h b/src/os/shared/inc/os-shared-task.h index f6826f05f..29f45fcbe 100644 --- a/src/os/shared/inc/os-shared-task.h +++ b/src/os/shared/inc/os-shared-task.h @@ -192,4 +192,4 @@ bool OS_TaskIdMatchSystemData_Impl(void *ref, const OS_object_token_t *token, co ------------------------------------------------------------------*/ int32 OS_TaskValidateSystemData_Impl(const void *sysdata, size_t sysdata_size); -#endif /* OS_SHARED_TASK_H */ +#endif /* OS_SHARED_TASK_H */ diff --git a/src/os/shared/inc/os-shared-time.h b/src/os/shared/inc/os-shared-time.h index 74f0a8dcc..1cf14a15e 100644 --- a/src/os/shared/inc/os-shared-time.h +++ b/src/os/shared/inc/os-shared-time.h @@ -64,4 +64,4 @@ extern OS_timecb_internal_record_t OS_timecb_table[OS_MAX_TIMERS]; ---------------------------------------------------------------------------------------*/ int32 OS_TimerCbAPI_Init(void); -#endif /* OS_SHARED_TIME_H */ +#endif /* OS_SHARED_TIME_H */ diff --git a/src/os/shared/inc/os-shared-timebase.h b/src/os/shared/inc/os-shared-timebase.h index 3875da5f3..4e838d227 100644 --- a/src/os/shared/inc/os-shared-timebase.h +++ b/src/os/shared/inc/os-shared-timebase.h @@ -138,4 +138,4 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id); ------------------------------------------------------------------*/ int32 OS_Milli2Ticks(uint32 milli_seconds, int *ticks); -#endif /* OS_SHARED_TIMEBASE_H */ +#endif /* OS_SHARED_TIMEBASE_H */ diff --git a/src/os/shared/src/osapi-common.c b/src/os/shared/src/osapi-common.c index 62a5a433b..2848228c8 100644 --- a/src/os/shared/src/osapi-common.c +++ b/src/os/shared/src/osapi-common.c @@ -339,12 +339,9 @@ void OS_DeleteAllObjects(void) ++TryCount; /* Delete timers and tasks first, as they could be actively using other object types */ - OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TIMECB, OS_OBJECT_CREATOR_ANY, - OS_CleanUpObject, &ObjectCount); - OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TIMEBASE, OS_OBJECT_CREATOR_ANY, - OS_CleanUpObject, &ObjectCount); - OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TASK, OS_OBJECT_CREATOR_ANY, - OS_CleanUpObject, &ObjectCount); + OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TIMECB, OS_OBJECT_CREATOR_ANY, OS_CleanUpObject, &ObjectCount); + OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TIMEBASE, OS_OBJECT_CREATOR_ANY, OS_CleanUpObject, &ObjectCount); + OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_TASK, OS_OBJECT_CREATOR_ANY, OS_CleanUpObject, &ObjectCount); /* Then try to delete all other remaining objects of any type */ OS_ForEachObject(OS_OBJECT_CREATOR_ANY, OS_CleanUpObject, &ObjectCount); diff --git a/src/os/shared/src/osapi-errors.c b/src/os/shared/src/osapi-errors.c index 4751c134c..a7abfa09a 100644 --- a/src/os/shared/src/osapi-errors.c +++ b/src/os/shared/src/osapi-errors.c @@ -123,7 +123,7 @@ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) { strncpy(*err_name, Error->Name, sizeof(*err_name) - 1); *err_name[sizeof(*err_name) - 1] = 0; - return_code = OS_SUCCESS; + return_code = OS_SUCCESS; } else { diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 20811afb3..6781985d1 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -47,8 +47,6 @@ #include "osapi-filesys.h" #include "osapi-sockets.h" - - /* * Sanity checks on the user-supplied configuration * The relevent OS_MAX limit should be defined and greater than zero diff --git a/src/os/shared/src/osapi-filesys.c b/src/os/shared/src/osapi-filesys.c index 74d761dfd..9eb01c768 100644 --- a/src/os/shared/src/osapi-filesys.c +++ b/src/os/shared/src/osapi-filesys.c @@ -105,8 +105,7 @@ bool OS_FileSys_FindVirtMountPoint(void *ref, const OS_object_token_t *token, co mplen = OS_strnlen(filesys->virtual_mountpt, sizeof(filesys->virtual_mountpt)); return (mplen > 0 && mplen < sizeof(filesys->virtual_mountpt) && - strncmp(target, filesys->virtual_mountpt, mplen) == 0 && - (target[mplen] == '/' || target[mplen] == 0)); + strncmp(target, filesys->virtual_mountpt, mplen) == 0 && (target[mplen] == '/' || target[mplen] == 0)); } /* end OS_FileSys_FindVirtMountPoint */ /*---------------------------------------------------------------- @@ -261,7 +260,7 @@ int32 OS_FileSysAddFixedMap(osal_id_t *filesys_id, const char *phys_path, const ++dev_name; } - if (memchr(dev_name,0,sizeof(filesys->volume_name)) == NULL) + if (memchr(dev_name, 0, sizeof(filesys->volume_name)) == NULL) { return OS_ERR_NAME_TOO_LONG; } @@ -624,7 +623,7 @@ int32 OS_fsBytesFree(const char *name, uint64 *bytes_free) } /* end OS_fsBytesFree */ -#endif /* OSAL_OMIT_DEPRECATED */ +#endif /* OSAL_OMIT_DEPRECATED */ /*---------------------------------------------------------------- * diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 447d86006..fd24962d1 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -46,7 +46,6 @@ */ #include "osapi-filesys.h" - /* * Sanity checks on the user-supplied configuration * The relevent OS_MAX limit should be defined @@ -112,7 +111,7 @@ int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, con break; } if (strcmp(StaticSym->Name, SymbolName) == 0 && - (ModuleName == NULL || strcmp(StaticSym->Module, ModuleName) == 0)) + (ModuleName == NULL || strcmp(StaticSym->Module, ModuleName) == 0)) { /* found matching symbol */ *SymbolAddress = (cpuaddr)StaticSym->Address; @@ -198,7 +197,7 @@ int32 OS_ModuleLoad(osal_id_t *module_id, const char *module_name, const char *f * * Note "filename" is not checked, because in certain configurations it can be validly * null. filename is checked for NULL-ness by the OS_TranslatePath() later. - */ + */ OS_CHECK_POINTER(module_id); OS_CHECK_APINAME(module_name); @@ -450,8 +449,8 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const *-----------------------------------------------------------------*/ int32 OS_SymbolTableDump(const char *filename, size_t SizeLimit) { - int32 return_code; - char translated_path[OS_MAX_LOCAL_PATH_LEN]; + int32 return_code; + char translated_path[OS_MAX_LOCAL_PATH_LEN]; OS_object_token_t token; /* Check parameters */ diff --git a/src/os/shared/src/osapi-queue.c b/src/os/shared/src/osapi-queue.c index 0e03044b5..f50278f8e 100644 --- a/src/os/shared/src/osapi-queue.c +++ b/src/os/shared/src/osapi-queue.c @@ -87,7 +87,8 @@ int32 OS_QueueAPI_Init(void) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, uint32 flags) +int32 OS_QueueCreate(osal_id_t *queue_id, const char *queue_name, osal_blockcount_t queue_depth, size_t data_size, + uint32 flags) { int32 return_code; OS_object_token_t token; diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index 4d2ac4e0f..cdf0fded9 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -49,7 +49,6 @@ */ #include "osapi-select.h" - /* * Global data for the API */ diff --git a/src/os/shared/src/osapi-time.c b/src/os/shared/src/osapi-time.c index 1e907d5ed..df92e6a58 100644 --- a/src/os/shared/src/osapi-time.c +++ b/src/os/shared/src/osapi-time.c @@ -59,7 +59,7 @@ OS_timecb_internal_record_t OS_timecb_table[OS_MAX_TIMERS]; typedef union { OS_TimerCallback_t timer_callback_func; - void *opaque_arg; + void * opaque_arg; } OS_Timer_ArgWrapper_t; /**************************************************************************************** @@ -129,8 +129,8 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ * If successful, then after this statement, we MUST decrement the refcount * if we leave this routine with an error. */ - return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_ref_id, - &timebase_token); + return_code = + OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_TIMEBASE, timebase_ref_id, &timebase_token); if (return_code != OS_SUCCESS) { return return_code; @@ -165,14 +165,16 @@ static int32 OS_DoTimerAdd(osal_id_t *timer_id, const char *timer_name, osal_id_ */ OS_TimeBaseLock_Impl(&timebase_token); - if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timebase->first_cb, &listcb_token) == OS_SUCCESS) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timebase->first_cb, &listcb_token) == + OS_SUCCESS) { list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); timecb->next_cb = OS_ObjectIdFromToken(&listcb_token); timecb->prev_cb = list_timecb->prev_cb; - if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->prev_cb, &listcb_token) == OS_SUCCESS) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->prev_cb, &listcb_token) == + OS_SUCCESS) { list_timecb->prev_cb = OS_ObjectIdFromToken(&timecb_token); list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); @@ -238,8 +240,8 @@ static void OS_Timer_NoArgCallback(osal_id_t objid, void *arg) *-----------------------------------------------------------------*/ int32 OS_TimerCreate(osal_id_t *timer_id, const char *timer_name, uint32 *accuracy, OS_TimerCallback_t callback_ptr) { - int32 return_code; - osal_id_t timebase_ref_id; + int32 return_code; + osal_id_t timebase_ref_id; OS_Timer_ArgWrapper_t Conv; /* @@ -431,12 +433,14 @@ int32 OS_TimerDelete(osal_id_t timer_id) } } - if(OS_ObjectIdGetById(OS_LOCK_MODE_NONE,OS_OBJECT_TYPE_OS_TIMECB,timecb->prev_cb,&listcb_token) == OS_SUCCESS) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->prev_cb, &listcb_token) == + OS_SUCCESS) { list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); list_timecb->next_cb = timecb->next_cb; } - if(OS_ObjectIdGetById(OS_LOCK_MODE_NONE,OS_OBJECT_TYPE_OS_TIMECB,timecb->next_cb,&listcb_token) == OS_SUCCESS) + if (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->next_cb, &listcb_token) == + OS_SUCCESS) { list_timecb = OS_OBJECT_TABLE_GET(OS_timecb_table, listcb_token); list_timecb->prev_cb = timecb->prev_cb; diff --git a/src/os/shared/src/osapi-timebase.c b/src/os/shared/src/osapi-timebase.c index 6d71a53b7..a7918852a 100644 --- a/src/os/shared/src/osapi-timebase.c +++ b/src/os/shared/src/osapi-timebase.c @@ -518,8 +518,9 @@ void OS_TimeBase_CallbackThread(osal_id_t timebase_id) } } - } while (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->next_cb, &cb_token) == OS_SUCCESS && - !OS_ObjectIdEqual(OS_ObjectIdFromToken(&cb_token), timebase->first_cb)); + } while (OS_ObjectIdGetById(OS_LOCK_MODE_NONE, OS_OBJECT_TYPE_OS_TIMECB, timecb->next_cb, &cb_token) == + OS_SUCCESS && + !OS_ObjectIdEqual(OS_ObjectIdFromToken(&cb_token), timebase->first_cb)); } OS_TimeBaseUnlock_Impl(&token); diff --git a/src/os/vxworks/inc/os-impl-binsem.h b/src/os/vxworks/inc/os-impl-binsem.h index 0cb2e426e..d18aa9a61 100644 --- a/src/os/vxworks/inc/os-impl-binsem.h +++ b/src/os/vxworks/inc/os-impl-binsem.h @@ -41,4 +41,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_binsem_internal_record_t OS_impl_bin_sem_table[OS_MAX_BIN_SEMAPHORES]; -#endif /* OS_IMPL_BINSEM_H */ +#endif /* OS_IMPL_BINSEM_H */ diff --git a/src/os/vxworks/inc/os-impl-console.h b/src/os/vxworks/inc/os-impl-console.h index 9941471b3..56d44993c 100644 --- a/src/os/vxworks/inc/os-impl-console.h +++ b/src/os/vxworks/inc/os-impl-console.h @@ -44,4 +44,4 @@ typedef struct extern OS_impl_console_internal_record_t OS_impl_console_table[OS_MAX_CONSOLES]; -#endif /* OS_IMPL_CONSOLE_H */ +#endif /* OS_IMPL_CONSOLE_H */ diff --git a/src/os/vxworks/inc/os-impl-countsem.h b/src/os/vxworks/inc/os-impl-countsem.h index 511f2513b..4d14393a2 100644 --- a/src/os/vxworks/inc/os-impl-countsem.h +++ b/src/os/vxworks/inc/os-impl-countsem.h @@ -41,4 +41,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_countsem_internal_record_t OS_impl_count_sem_table[OS_MAX_COUNT_SEMAPHORES]; -#endif /* OS_IMPL_COUNTSEM_H */ +#endif /* OS_IMPL_COUNTSEM_H */ diff --git a/src/os/vxworks/inc/os-impl-dirs.h b/src/os/vxworks/inc/os-impl-dirs.h index 9dc4447f7..5ae902ee2 100644 --- a/src/os/vxworks/inc/os-impl-dirs.h +++ b/src/os/vxworks/inc/os-impl-dirs.h @@ -42,7 +42,7 @@ * mkdir() in a consistent, POSIX compliant fashion. */ #ifdef OSAL_VXWORKS6_COMPATIBILITY -#define mkdir(path,mode) mkdir(path) +#define mkdir(path, mode) mkdir(path) #endif typedef struct @@ -55,4 +55,4 @@ typedef struct */ extern OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; -#endif /* OS_IMPL_DIRS_H */ +#endif /* OS_IMPL_DIRS_H */ diff --git a/src/os/vxworks/inc/os-impl-files.h b/src/os/vxworks/inc/os-impl-files.h index 29461d94b..64378a043 100644 --- a/src/os/vxworks/inc/os-impl-files.h +++ b/src/os/vxworks/inc/os-impl-files.h @@ -47,4 +47,4 @@ */ #define OS_IMPL_REGULAR_FILE_FLAGS 0 -#endif /* OS_IMPL_FILES_H */ +#endif /* OS_IMPL_FILES_H */ diff --git a/src/os/vxworks/inc/os-impl-filesys.h b/src/os/vxworks/inc/os-impl-filesys.h index d39863f6f..b376ef0fa 100644 --- a/src/os/vxworks/inc/os-impl-filesys.h +++ b/src/os/vxworks/inc/os-impl-filesys.h @@ -42,4 +42,4 @@ typedef struct extern OS_impl_filesys_internal_record_t OS_impl_filesys_table[OS_MAX_FILE_SYSTEMS]; -#endif /* OS_IMPL_FILESYS_H */ +#endif /* OS_IMPL_FILESYS_H */ diff --git a/src/os/vxworks/inc/os-impl-gettime.h b/src/os/vxworks/inc/os-impl-gettime.h index a24a37ccf..5a66cabd9 100644 --- a/src/os/vxworks/inc/os-impl-gettime.h +++ b/src/os/vxworks/inc/os-impl-gettime.h @@ -33,4 +33,4 @@ #define OSAL_GETTIME_SOURCE_CLOCK CLOCK_MONOTONIC -#endif /* OS_IMPL_GETTIME_H */ +#endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/vxworks/inc/os-impl-idmap.h b/src/os/vxworks/inc/os-impl-idmap.h index a8e47a580..2e2098a31 100644 --- a/src/os/vxworks/inc/os-impl-idmap.h +++ b/src/os/vxworks/inc/os-impl-idmap.h @@ -41,4 +41,4 @@ typedef struct /* Tables where the lock state information is stored */ extern OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER]; -#endif /* OS_IMPL_IDMAP_H */ +#endif /* OS_IMPL_IDMAP_H */ diff --git a/src/os/vxworks/inc/os-impl-io.h b/src/os/vxworks/inc/os-impl-io.h index e0ee37baa..0968588f6 100644 --- a/src/os/vxworks/inc/os-impl-io.h +++ b/src/os/vxworks/inc/os-impl-io.h @@ -55,4 +55,4 @@ extern OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_F */ #define GENERIC_IO_CONST_DATA_CAST (void *) -#endif /* OS_IMPL_IO_H */ +#endif /* OS_IMPL_IO_H */ diff --git a/src/os/vxworks/inc/os-impl-loader.h b/src/os/vxworks/inc/os-impl-loader.h index 031899364..3093c6e5d 100644 --- a/src/os/vxworks/inc/os-impl-loader.h +++ b/src/os/vxworks/inc/os-impl-loader.h @@ -51,4 +51,4 @@ typedef struct */ extern OS_impl_module_internal_record_t OS_impl_module_table[OS_MAX_MODULES]; -#endif /* OS_IMPL_LOADER_H */ +#endif /* OS_IMPL_LOADER_H */ diff --git a/src/os/vxworks/inc/os-impl-mutex.h b/src/os/vxworks/inc/os-impl-mutex.h index 45b286429..08bb6b388 100644 --- a/src/os/vxworks/inc/os-impl-mutex.h +++ b/src/os/vxworks/inc/os-impl-mutex.h @@ -40,4 +40,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_mutsem_internal_record_t OS_impl_mutex_table[OS_MAX_MUTEXES]; -#endif /* OS_IMPL_MUTEX_H */ +#endif /* OS_IMPL_MUTEX_H */ diff --git a/src/os/vxworks/inc/os-impl-network.h b/src/os/vxworks/inc/os-impl-network.h index 482ddbdb9..4b473c856 100644 --- a/src/os/vxworks/inc/os-impl-network.h +++ b/src/os/vxworks/inc/os-impl-network.h @@ -36,4 +36,4 @@ #include #include -#endif /* OS_IMPL_NETWORK_H */ +#endif /* OS_IMPL_NETWORK_H */ diff --git a/src/os/vxworks/inc/os-impl-queues.h b/src/os/vxworks/inc/os-impl-queues.h index 6305af6e8..d82a7affe 100644 --- a/src/os/vxworks/inc/os-impl-queues.h +++ b/src/os/vxworks/inc/os-impl-queues.h @@ -39,4 +39,4 @@ typedef struct /* Tables where the OS object information is stored */ extern OS_impl_queue_internal_record_t OS_impl_queue_table[OS_MAX_QUEUES]; -#endif /* OS_IMPL_QUEUES_H */ +#endif /* OS_IMPL_QUEUES_H */ diff --git a/src/os/vxworks/inc/os-impl-select.h b/src/os/vxworks/inc/os-impl-select.h index 338814f5e..d29b5d8e5 100644 --- a/src/os/vxworks/inc/os-impl-select.h +++ b/src/os/vxworks/inc/os-impl-select.h @@ -31,4 +31,4 @@ #include "os-impl-io.h" #include -#endif /* OS_IMPL_SELECT_H */ +#endif /* OS_IMPL_SELECT_H */ diff --git a/src/os/vxworks/inc/os-impl-sockets.h b/src/os/vxworks/inc/os-impl-sockets.h index cf7732093..32dbabea2 100644 --- a/src/os/vxworks/inc/os-impl-sockets.h +++ b/src/os/vxworks/inc/os-impl-sockets.h @@ -46,4 +46,4 @@ /* The "in.h" header file supplied in VxWorks 6.9 is missing the "in_port_t" typedef */ typedef u_short in_port_t; -#endif /* OS_IMPL_SOCKETS_H */ +#endif /* OS_IMPL_SOCKETS_H */ diff --git a/src/os/vxworks/inc/os-impl-symtab.h b/src/os/vxworks/inc/os-impl-symtab.h index 5dab5df28..037207385 100644 --- a/src/os/vxworks/inc/os-impl-symtab.h +++ b/src/os/vxworks/inc/os-impl-symtab.h @@ -44,4 +44,4 @@ extern SymbolDumpState_t OS_VxWorks_SymbolDumpState; BOOL OS_SymTableIterator_Impl(char *name, SYM_VALUE val, SYM_TYPE type, _Vx_usr_arg_t arg, SYM_GROUP group); -#endif /* OS_IMPL_SYMTAB_H */ +#endif /* OS_IMPL_SYMTAB_H */ diff --git a/src/os/vxworks/inc/os-impl-tasks.h b/src/os/vxworks/inc/os-impl-tasks.h index 213ced273..12ef8f726 100644 --- a/src/os/vxworks/inc/os-impl-tasks.h +++ b/src/os/vxworks/inc/os-impl-tasks.h @@ -43,12 +43,12 @@ typedef WIND_TCB OS_VxWorks_TCB_t; typedef struct { OS_VxWorks_TCB_t tcb; /* Must be first */ - TASK_ID vxid; - void *heap_block; /* set non-null if the stack was obtained with malloc() */ - size_t heap_block_size; + TASK_ID vxid; + void * heap_block; /* set non-null if the stack was obtained with malloc() */ + size_t heap_block_size; } OS_impl_task_internal_record_t; /* Tables where the OS object information is stored */ extern OS_impl_task_internal_record_t OS_impl_task_table[OS_MAX_TASKS]; -#endif /* OS_IMPL_TASKS_H */ +#endif /* OS_IMPL_TASKS_H */ diff --git a/src/os/vxworks/inc/os-impl-timebase.h b/src/os/vxworks/inc/os-impl-timebase.h index 559ca2e3e..72dbd22ba 100644 --- a/src/os/vxworks/inc/os-impl-timebase.h +++ b/src/os/vxworks/inc/os-impl-timebase.h @@ -61,4 +61,4 @@ typedef struct extern OS_impl_timebase_internal_record_t OS_impl_timebase_table[OS_MAX_TIMEBASES]; -#endif /* OS_IMPL_TIMEBASE_H */ +#endif /* OS_IMPL_TIMEBASE_H */ diff --git a/src/os/vxworks/inc/os-vxworks.h b/src/os/vxworks/inc/os-vxworks.h index 4d9e1eefd..da6b8da22 100644 --- a/src/os/vxworks/inc/os-vxworks.h +++ b/src/os/vxworks/inc/os-vxworks.h @@ -82,4 +82,4 @@ int32 OS_VxWorks_GenericSemGive(SEM_ID vxid); int32 OS_VxWorks_TableMutex_Init(osal_objtype_t idtype); -#endif /* OS_VXWORKS_H */ +#endif /* OS_VXWORKS_H */ diff --git a/src/os/vxworks/src/os-impl-dirs-globals.c b/src/os/vxworks/src/os-impl-dirs-globals.c index 7be3ab73a..aa53a3585 100644 --- a/src/os/vxworks/src/os-impl-dirs-globals.c +++ b/src/os/vxworks/src/os-impl-dirs-globals.c @@ -33,13 +33,11 @@ #include "os-impl-dirs.h" #include "os-shared-dir.h" - /* * The directory handle table. */ OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; - /*---------------------------------------------------------------- * * Function: OS_VxWorks_DirAPI_Impl_Init @@ -49,7 +47,6 @@ OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; *-----------------------------------------------------------------*/ int32 OS_VxWorks_DirAPI_Impl_Init(void) { - memset(OS_impl_dir_table, 0, sizeof(OS_impl_dir_table)); - return OS_SUCCESS; + memset(OS_impl_dir_table, 0, sizeof(OS_impl_dir_table)); + return OS_SUCCESS; } /* end OS_VxWorks_DirAPI_Impl_Init */ - diff --git a/src/os/vxworks/src/os-impl-idmap.c b/src/os/vxworks/src/os-impl-idmap.c index 503d8f7f5..a8da5bd2d 100644 --- a/src/os/vxworks/src/os-impl-idmap.c +++ b/src/os/vxworks/src/os-impl-idmap.c @@ -60,57 +60,20 @@ VX_MUTEX_SEMAPHORE(OS_module_table_mut_mem); VX_MUTEX_SEMAPHORE(OS_filesys_table_mut_mem); VX_MUTEX_SEMAPHORE(OS_console_table_mut_mem); -static OS_impl_objtype_lock_t OS_task_table_lock = -{ - .mem = OS_task_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_queue_table_lock = -{ - .mem = OS_queue_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_bin_sem_table_lock = -{ - .mem = OS_bin_sem_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_mutex_table_lock = -{ - .mem = OS_mutex_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_count_sem_table_lock = -{ - .mem = OS_count_sem_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_stream_table_lock = -{ - .mem = OS_stream_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_dir_table_lock = -{ - .mem = OS_dir_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_timebase_table_lock = -{ - .mem = OS_timebase_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_timecb_table_lock = -{ - .mem = OS_timecb_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_module_table_lock = -{ - .mem = OS_module_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_filesys_table_lock = -{ - .mem = OS_filesys_table_mut_mem -}; -static OS_impl_objtype_lock_t OS_console_table_lock = -{ - .mem = OS_console_table_mut_mem -}; - -OS_impl_objtype_lock_t * const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = -{ +static OS_impl_objtype_lock_t OS_task_table_lock = {.mem = OS_task_table_mut_mem}; +static OS_impl_objtype_lock_t OS_queue_table_lock = {.mem = OS_queue_table_mut_mem}; +static OS_impl_objtype_lock_t OS_bin_sem_table_lock = {.mem = OS_bin_sem_table_mut_mem}; +static OS_impl_objtype_lock_t OS_mutex_table_lock = {.mem = OS_mutex_table_mut_mem}; +static OS_impl_objtype_lock_t OS_count_sem_table_lock = {.mem = OS_count_sem_table_mut_mem}; +static OS_impl_objtype_lock_t OS_stream_table_lock = {.mem = OS_stream_table_mut_mem}; +static OS_impl_objtype_lock_t OS_dir_table_lock = {.mem = OS_dir_table_mut_mem}; +static OS_impl_objtype_lock_t OS_timebase_table_lock = {.mem = OS_timebase_table_mut_mem}; +static OS_impl_objtype_lock_t OS_timecb_table_lock = {.mem = OS_timecb_table_mut_mem}; +static OS_impl_objtype_lock_t OS_module_table_lock = {.mem = OS_module_table_mut_mem}; +static OS_impl_objtype_lock_t OS_filesys_table_lock = {.mem = OS_filesys_table_mut_mem}; +static OS_impl_objtype_lock_t OS_console_table_lock = {.mem = OS_console_table_mut_mem}; + +OS_impl_objtype_lock_t *const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = { [OS_OBJECT_TYPE_UNDEFINED] = NULL, [OS_OBJECT_TYPE_OS_TASK] = &OS_task_table_lock, [OS_OBJECT_TYPE_OS_QUEUE] = &OS_queue_table_lock, @@ -123,8 +86,7 @@ OS_impl_objtype_lock_t * const OS_impl_objtype_lock_table[OS_OBJECT_TYPE_USER] = [OS_OBJECT_TYPE_OS_TIMECB] = &OS_timecb_table_lock, [OS_OBJECT_TYPE_OS_MODULE] = &OS_module_table_lock, [OS_OBJECT_TYPE_OS_FILESYS] = &OS_filesys_table_lock, - [OS_OBJECT_TYPE_OS_CONSOLE] = &OS_console_table_lock -}; + [OS_OBJECT_TYPE_OS_CONSOLE] = &OS_console_table_lock}; /*---------------------------------------------------------------- * @@ -190,11 +152,10 @@ void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) } OS_Unlock_Global_Impl(idtype); - taskDelay(wait_ticks); - OS_Lock_Global_Impl(idtype); + taskDelay(wait_ticks); + OS_Lock_Global_Impl(idtype); } - /**************************************************************************************** INITIALIZATION FUNCTION ****************************************************************************************/ @@ -210,7 +171,7 @@ void OS_WaitForStateChange_Impl(osal_objtype_t idtype, uint32 attempts) int32 OS_VxWorks_TableMutex_Init(osal_objtype_t idtype) { OS_impl_objtype_lock_t *impl; - SEM_ID semid; + SEM_ID semid; impl = OS_impl_objtype_lock_table[idtype]; if (impl == NULL) diff --git a/src/os/vxworks/src/os-impl-shell.c b/src/os/vxworks/src/os-impl-shell.c index 35c6000f2..4401c9867 100644 --- a/src/os/vxworks/src/os-impl-shell.c +++ b/src/os/vxworks/src/os-impl-shell.c @@ -83,8 +83,8 @@ int32 OS_ShellOutputToFile_Impl(const OS_object_token_t *token, const char *Cmd) OS_lseek(fdCmd, 0, OS_SEEK_SET); /* Create a shell task the will run the command in the file, push output to OS_fd */ - Result = shellGenericInit("INTERPRETER=Cmd", 0, NULL, &shellName, false, false, - cmd_impl->fd, out_impl->fd, out_impl->fd); + Result = shellGenericInit("INTERPRETER=Cmd", 0, NULL, &shellName, false, false, cmd_impl->fd, out_impl->fd, + out_impl->fd); } if (Result == OK) diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index 060454817..2f6ebfed4 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -234,7 +234,7 @@ int32 OS_TaskCreate_Impl(const OS_object_token_t *token, uint32 flags) actualstackbase += actualsz; /* move to last byte of stack block */ #endif - status = taskInit((WIND_TCB*)&lrec->tcb, /* address of new task's TCB */ + status = taskInit((WIND_TCB *)&lrec->tcb, /* address of new task's TCB */ (char *)task->task_name, vxpri, /* priority of new task */ vxflags, /* task option word */ (char *)actualstackbase, /* base of new task's stack */ @@ -414,7 +414,7 @@ int32 OS_TaskRegister_Impl(osal_id_t global_task_id) *-----------------------------------------------------------------*/ osal_id_t OS_TaskGetId_Impl(void) { - void *lrec; + void * lrec; size_t idx; osal_id_t id; diff --git a/src/os/vxworks/src/os-impl-timebase.c b/src/os/vxworks/src/os-impl-timebase.c index 887bf64b8..235413179 100644 --- a/src/os/vxworks/src/os-impl-timebase.c +++ b/src/os/vxworks/src/os-impl-timebase.c @@ -218,10 +218,10 @@ void OS_VxWorks_RegisterTimer(osal_id_t obj_id) OS_object_token_t token; struct sigevent evp; int status; - int32 retcode; + int32 retcode; retcode = OS_ObjectIdGetById(OS_LOCK_MODE_RESERVED, OS_OBJECT_TYPE_OS_TIMEBASE, obj_id, &token); - if (retcode == OS_SUCCESS) + if (retcode == OS_SUCCESS) { local = OS_OBJECT_TABLE_GET(OS_impl_timebase_table, token); @@ -251,12 +251,12 @@ void OS_VxWorks_RegisterTimer(osal_id_t obj_id) local->timer_state = OS_TimerRegState_SUCCESS; } - OS_ObjectIdRelease(&token); + OS_ObjectIdRelease(&token); + } + else + { + OS_DEBUG("OS_VxWorks_RegisterTimer() bad ID, code=%d\n", (int)retcode); } - else - { - OS_DEBUG("OS_VxWorks_RegisterTimer() bad ID, code=%d\n", (int)retcode); - } } /* end OS_VxWorks_RegisterTimer */ /**************************************************************************************** @@ -462,9 +462,9 @@ int32 OS_TimeBaseCreate_Impl(const OS_object_token_t *token) { local->handler_task = taskSpawn(timebase->timebase_name, OSAL_TIMEBASE_TASK_PRIORITY, /* priority */ OSAL_TIMEBASE_TASK_OPTION_WORD, /* task option word */ - OSAL_TIMEBASE_TASK_STACK_SIZE, /* size (bytes) of stack needed */ - (FUNCPTR)OS_VxWorks_TimeBaseTask, /* Timebase helper task entry point */ - OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), /* 1st arg is ID */ + OSAL_TIMEBASE_TASK_STACK_SIZE, /* size (bytes) of stack needed */ + (FUNCPTR)OS_VxWorks_TimeBaseTask, /* Timebase helper task entry point */ + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), /* 1st arg is ID */ 0, 0, 0, 0, 0, 0, 0, 0, 0); /* check if taskSpawn failed */ @@ -566,8 +566,8 @@ int32 OS_TimeBaseSet_Impl(const OS_object_token_t *token, uint32 start_time, uin if (status == OK) { local->configured_start_time = (timeout.it_value.tv_sec * 1000000) + (timeout.it_value.tv_nsec / 1000); - local->configured_interval_time = (timeout.it_interval.tv_sec * 1000000) + - (timeout.it_interval.tv_nsec / 1000); + local->configured_interval_time = + (timeout.it_interval.tv_sec * 1000000) + (timeout.it_interval.tv_nsec / 1000); if (local->configured_start_time != start_time) { diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index 6d4a41d87..b82867782 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -246,53 +246,62 @@ void TestOpenClose(void) ---------------------------------------------------------------------------------------*/ void TestChmod(void) { - char filename[OS_MAX_PATH_LEN]; + char filename[OS_MAX_PATH_LEN]; int32 status; osal_id_t fd; /*Make a file to test on. Start in Read only mode */ strncpy(filename, "/drive0/Filename1", sizeof(filename) - 1); filename[sizeof(filename) - 1] = 0; - status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_CREATE , OS_READ_WRITE); + status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_CREATE, OS_READ_WRITE); UtAssert_True(status >= OS_SUCCESS, "status after creat = %d", (int)status); status = OS_close(fd); UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); /*Testing Write Only */ status = OS_chmod(filename, OS_WRITE_ONLY); - if(status != OS_ERR_NOT_IMPLEMENTED){ + if (status != OS_ERR_NOT_IMPLEMENTED) + { UtAssert_True(status == OS_SUCCESS, "status after chmod = %d", (int)status); status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_NONE, OS_WRITE_ONLY); UtAssert_True(status >= OS_SUCCESS, "status after reopen = %d", (int)status); status = OS_close(fd); UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); - }else{ - UtPrintf("OS_chmod not implemented for write only\n"); - } + } + else + { + UtPrintf("OS_chmod not implemented for write only\n"); + } /*Testing Read Only */ status = OS_chmod(filename, OS_READ_ONLY); - if(status != OS_ERR_NOT_IMPLEMENTED){ + if (status != OS_ERR_NOT_IMPLEMENTED) + { UtAssert_True(status == OS_SUCCESS, "status after chmod = %d", (int)status); status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_NONE, OS_READ_ONLY); UtAssert_True(status >= OS_SUCCESS, "status after reopen = %d", (int)status); status = OS_close(fd); - UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); - }else{ + UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); + } + else + { UtPrintf("OS_chmod not implemented for read only\n"); - } + } /*Testing Read Write */ status = OS_chmod(filename, OS_READ_WRITE); - if(status != OS_ERR_NOT_IMPLEMENTED){ + if (status != OS_ERR_NOT_IMPLEMENTED) + { UtAssert_True(status == OS_SUCCESS, "status after chmod = %d", (int)status); status = OS_OpenCreate(&fd, filename, OS_FILE_FLAG_NONE, OS_READ_WRITE); UtAssert_True(status >= OS_SUCCESS, "status after reopen = %d", (int)status); status = OS_close(fd); - UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); - }else{ + UtAssert_True(status == OS_SUCCESS, "status after close = %d", (int)status); + } + else + { UtPrintf("OS_chmod not implemented for read write\n"); - } + } /*Removing the file */ status = OS_remove(filename); @@ -453,8 +462,8 @@ void TestMkRmDirFreeBytes(void) /* NOTE: The blocks free call is not necessarily implemented on all filesystems. * So the response of OS_ERR_NOT_IMPLEMENTED is acceptable. */ status = OS_FileSysStatVolume("/drive0", &statbuf); - UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, "Checking Free Blocks: status=%d blocks=%lu", - (int)status, (unsigned long)statbuf.blocks_free); + UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, + "Checking Free Blocks: status=%d blocks=%lu", (int)status, (unsigned long)statbuf.blocks_free); /* make the two directories */ status = OS_mkdir(dir1, 0); @@ -490,8 +499,8 @@ void TestMkRmDirFreeBytes(void) memset(buffer1, 0, sizeof(buffer1)); memset(buffer2, 0, sizeof(buffer2)); status = OS_FileSysStatVolume("/drive0", &statbuf); - UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, "Checking Free Blocks: status=%d blocks=%lu", - (int)status, (unsigned long)statbuf.blocks_free); + UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, + "Checking Free Blocks: status=%d blocks=%lu", (int)status, (unsigned long)statbuf.blocks_free); /* read back out of the files what we wrote into them */ size = strlen(copybuffer1); @@ -531,8 +540,8 @@ void TestMkRmDirFreeBytes(void) UtAssert_True(status == OS_SUCCESS, "status after rmdir 2 = %d", (int)status); status = OS_FileSysStatVolume("/drive0", &statbuf); - UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, "Checking Free Blocks: status=%d blocks=%lu", - (int)status, (unsigned long)statbuf.blocks_free); + UtAssert_True(status == OS_ERR_NOT_IMPLEMENTED || status == OS_SUCCESS, + "Checking Free Blocks: status=%d blocks=%lu", (int)status, (unsigned long)statbuf.blocks_free); } /*--------------------------------------------------------------------------------------- @@ -951,5 +960,4 @@ void TestOpenFileAPI(void) UtAssert_True(status == OS_SUCCESS, "status after remove filename2 = %d", (int)status); status = OS_remove(filename3); UtAssert_True(status == OS_SUCCESS, "status after remove filename3 = %d", (int)status); - } diff --git a/src/tests/osal-core-test/osal-core-test.c b/src/tests/osal-core-test/osal-core-test.c index 2a26934ef..79593e653 100644 --- a/src/tests/osal-core-test/osal-core-test.c +++ b/src/tests/osal-core-test/osal-core-test.c @@ -68,13 +68,13 @@ osal_id_t msgq_2; osal_id_t msgq_3; osal_id_t bin_0; -osal_id_t bin_1; +osal_id_t bin_1; osal_id_t bin_2; osal_id_t bin_3; osal_id_t mut_0; -osal_id_t mut_1; -osal_id_t mut_2; +osal_id_t mut_1; +osal_id_t mut_2; osal_id_t mut_3; /* helper function for "OS_ForEachObject" test cases */ @@ -219,21 +219,21 @@ void TestTasks(void) InitializeTaskIds(); /* Create Task 0 again */ - status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), - OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); + status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), + sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 0"); /* Try and create another "Task 0", should fail as we already have one named "Task 0" */ - status = OS_TaskCreate(&task_1_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), - OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); + status = OS_TaskCreate(&task_1_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), + sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status != OS_SUCCESS, "OS_TaskCreate, dupe name 0"); - status = OS_TaskCreate(&task_2_id, "Task 2", task_generic_no_exit, OSAL_STACKPTR_C(task_2_stack), sizeof(task_2_stack), - OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); + status = OS_TaskCreate(&task_2_id, "Task 2", task_generic_no_exit, OSAL_STACKPTR_C(task_2_stack), + sizeof(task_2_stack), OSAL_PRIORITY_C(TASK_2_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 2"); - status = OS_TaskCreate(&task_3_id, "Task 3", task_generic_no_exit, OSAL_STACKPTR_C(task_3_stack), sizeof(task_3_stack), - OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); + status = OS_TaskCreate(&task_3_id, "Task 3", task_generic_no_exit, OSAL_STACKPTR_C(task_3_stack), + sizeof(task_3_stack), OSAL_PRIORITY_C(TASK_3_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate, recreate 3"); status = OS_TaskGetIdByName(&task_0_id, "Task 0"); @@ -521,40 +521,40 @@ void TestMutexes(void) /* ************************************************************************** */ void InitializeTaskIds(void) { - task_0_id = OS_OBJECT_ID_UNDEFINED; - task_1_id = OS_OBJECT_ID_UNDEFINED; - task_2_id = OS_OBJECT_ID_UNDEFINED; - task_3_id = OS_OBJECT_ID_UNDEFINED; + task_0_id = OS_OBJECT_ID_UNDEFINED; + task_1_id = OS_OBJECT_ID_UNDEFINED; + task_2_id = OS_OBJECT_ID_UNDEFINED; + task_3_id = OS_OBJECT_ID_UNDEFINED; return; } /* end InitializeTaskIds */ /* **************************************************************************** */ void InitializeQIds(void) { - msgq_0 = OS_OBJECT_ID_UNDEFINED; - msgq_1 = OS_OBJECT_ID_UNDEFINED; - msgq_2 = OS_OBJECT_ID_UNDEFINED; - msgq_3 = OS_OBJECT_ID_UNDEFINED; + msgq_0 = OS_OBJECT_ID_UNDEFINED; + msgq_1 = OS_OBJECT_ID_UNDEFINED; + msgq_2 = OS_OBJECT_ID_UNDEFINED; + msgq_3 = OS_OBJECT_ID_UNDEFINED; return; } /* end InitializeQIds */ /* ***************************************************************************** */ void InitializeBinIds(void) { - bin_0 = OS_OBJECT_ID_UNDEFINED; - bin_1 = OS_OBJECT_ID_UNDEFINED; - bin_2 = OS_OBJECT_ID_UNDEFINED; - bin_3 = OS_OBJECT_ID_UNDEFINED; + bin_0 = OS_OBJECT_ID_UNDEFINED; + bin_1 = OS_OBJECT_ID_UNDEFINED; + bin_2 = OS_OBJECT_ID_UNDEFINED; + bin_3 = OS_OBJECT_ID_UNDEFINED; return; } /* end InitializeBinIds */ /* ***************************************************************************** */ void InitializeMutIds(void) { - mut_0 = OS_OBJECT_ID_UNDEFINED; - mut_1 = OS_OBJECT_ID_UNDEFINED; - mut_2 = OS_OBJECT_ID_UNDEFINED; - mut_3 = OS_OBJECT_ID_UNDEFINED; + mut_0 = OS_OBJECT_ID_UNDEFINED; + mut_1 = OS_OBJECT_ID_UNDEFINED; + mut_2 = OS_OBJECT_ID_UNDEFINED; + mut_3 = OS_OBJECT_ID_UNDEFINED; return; } /* end InitializeMutIds */ @@ -569,8 +569,8 @@ void TestGetInfos(void) /* first step is to create an object to to get the properties of */ - status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), - OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); + status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), + sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate"); status = OS_QueueCreate(&msgq_0, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); @@ -619,8 +619,8 @@ void TestGenericQueries(void) TestCallbackState_t State; char ResourceName[OS_MAX_API_NAME]; - status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), sizeof(task_0_stack), - OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); + status = OS_TaskCreate(&task_0_id, "Task 0", task_generic_no_exit, OSAL_STACKPTR_C(task_0_stack), + sizeof(task_0_stack), OSAL_PRIORITY_C(TASK_0_PRIORITY), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate (%ld) == OS_SUCCESS", (long)status); status = OS_QueueCreate(&msgq_0, "q 0", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); diff --git a/src/tests/queue-test/queue-test.c b/src/tests/queue-test/queue-test.c index fa03daa89..352d8e2a3 100644 --- a/src/tests/queue-test/queue-test.c +++ b/src/tests/queue-test/queue-test.c @@ -35,7 +35,7 @@ void QueueTimeoutCheck(void); #define MSGQ_DEPTH 50 #define MSGQ_SIZE sizeof(uint32) #define MSGQ_TOTAL 10 -#define MSGQ_BURST 3 +#define MSGQ_BURST 3 /* Task 1 */ #define TASK_1_STACK_SIZE 1024 @@ -67,8 +67,8 @@ void task_1(void) { int32 status; size_t data_size; - uint32 data_received ; - uint32 expected = 0; + uint32 data_received; + uint32 expected = 0; OS_printf("Starting task 1\n"); @@ -198,12 +198,12 @@ void QueueMessageSetup(void) { int32 status; uint32 accuracy; - int i; - uint32 Data = 0; + int i; + uint32 Data = 0; task_1_failures = 0; task_1_messages = 0; task_1_timeouts = 0; - + status = OS_QueueCreate(&msgq_id, "MsgQ", OSAL_BLOCKCOUNT_C(MSGQ_DEPTH), OSAL_SIZE_C(MSGQ_SIZE), 0); UtAssert_True(status == OS_SUCCESS, "MsgQ create Id=%lx Rc=%d", OS_ObjectIdToInteger(msgq_id), (int)status); @@ -227,16 +227,16 @@ void QueueMessageSetup(void) status = OS_TimerSet(timer_id, timer_start, timer_interval); UtAssert_True(status == OS_SUCCESS, "Timer 1 set Rc=%d", (int)status); - /* - * Put 10 messages onto the que with some time inbetween the later messages - * to make sure the que handles both storing and waiting for messages - */ + /* + * Put 10 messages onto the que with some time inbetween the later messages + * to make sure the que handles both storing and waiting for messages + */ for (i = 0; i < MSGQ_TOTAL; i++) { - if(i > MSGQ_BURST) + if (i > MSGQ_BURST) OS_TaskDelay(400); - Data = i; + Data = i; status = OS_QueuePut(msgq_id, (void *)&Data, sizeof(Data), 0); UtAssert_True(status == OS_SUCCESS, "OS Queue Put Rc=%d", (int)status); } diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c index a98db1e29..c9d773a55 100644 --- a/src/tests/select-test/select-test.c +++ b/src/tests/select-test/select-test.c @@ -257,17 +257,17 @@ void Setup_Multi(void) void Teardown_Single(void) { - OS_close(c_socket_id); - OS_BinSemDelete(bin_sem_id); + OS_close(c_socket_id); + OS_BinSemDelete(bin_sem_id); } void Teardown_Multi(void) -{ - //Server 1 is intentionaly left waiting so we close it out here. +{ + // Server 1 is intentionaly left waiting so we close it out here. OS_close(s_socket_id); OS_TaskDelete(s_task_id); - OS_close(c2_socket_id); + OS_close(c2_socket_id); Teardown_Single(); } @@ -286,8 +286,8 @@ void TestSelectSingleRead(void) */ /* Create a server task/thread */ - int32 status = OS_TaskCreate(&s_task_id, "ServerSingleRead", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), - OSAL_PRIORITY_C(50), 0); + int32 status = OS_TaskCreate(&s_task_id, "ServerSingleRead", Server_Fn, OSAL_TASK_STACK_ALLOCATE, + OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); /* Connect to a server */ @@ -385,8 +385,8 @@ void TestSelectSingleWrite(void) */ /* Create a server task/thread */ - int32 status = OS_TaskCreate(&s_task_id, "ServerSingleWrite", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), - OSAL_PRIORITY_C(50), 0); + int32 status = OS_TaskCreate(&s_task_id, "ServerSingleWrite", Server_Fn, OSAL_TASK_STACK_ALLOCATE, + OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); /* Connect to a server */ diff --git a/src/tests/timer-test/timer-test.c b/src/tests/timer-test/timer-test.c index 79ed1a43c..79ba39d5b 100644 --- a/src/tests/timer-test/timer-test.c +++ b/src/tests/timer-test/timer-test.c @@ -111,12 +111,12 @@ void TimerTestSetup(void) void TimerTestTask(void) { - int i = 0; - int32 TimerStatus[NUMBER_OF_TIMERS]; - osal_index_t TableId; - osal_id_t TimerID[NUMBER_OF_TIMERS]; - char TimerName[NUMBER_OF_TIMERS][20] = {"TIMER1", "TIMER2", "TIMER3", "TIMER4", "TIMER5"}; - uint32 ClockAccuracy; + int i = 0; + int32 TimerStatus[NUMBER_OF_TIMERS]; + osal_index_t TableId; + osal_id_t TimerID[NUMBER_OF_TIMERS]; + char TimerName[NUMBER_OF_TIMERS][20] = {"TIMER1", "TIMER2", "TIMER3", "TIMER4", "TIMER5"}; + uint32 ClockAccuracy; for (i = 0; i < NUMBER_OF_TIMERS && i < OS_MAX_TIMERS; i++) { diff --git a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h index 82806e680..a405b68af 100644 --- a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h +++ b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-files.h @@ -34,4 +34,4 @@ OCS_uid_t UT_PortablePosixFileTest_GetSelfEUID(void); OCS_gid_t UT_PortablePosixFileTest_GetSelfEGID(void); -#endif /* UT_ADAPTOR_PORTABLE_POSIX_FILES_H */ +#endif /* UT_ADAPTOR_PORTABLE_POSIX_FILES_H */ diff --git a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h index 8385e3c2c..a4cadae82 100644 --- a/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h +++ b/src/unit-test-coverage/portable/adaptors/inc/ut-adaptor-portable-posix-io.h @@ -40,4 +40,4 @@ *****************************************************/ void UT_PortablePosixIOTest_Set_Selectable(osal_index_t local_id, bool is_selectable); -#endif /* UT_ADAPTOR_PORTABLE_POSIX_IO_H */ +#endif /* UT_ADAPTOR_PORTABLE_POSIX_IO_H */ diff --git a/src/unit-test-coverage/portable/src/os-portable-coveragetest.h b/src/unit-test-coverage/portable/src/os-portable-coveragetest.h index 2d938fc4e..ce017dd0a 100644 --- a/src/unit-test-coverage/portable/src/os-portable-coveragetest.h +++ b/src/unit-test-coverage/portable/src/os-portable-coveragetest.h @@ -66,4 +66,4 @@ void Osapi_Test_Setup(void); void Osapi_Test_Teardown(void); -#endif /* OS_PORTABLE_COVERAGETEST_H */ +#endif /* OS_PORTABLE_COVERAGETEST_H */ diff --git a/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h b/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h index 0292ac666..da0ce088b 100644 --- a/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h +++ b/src/unit-test-coverage/shared/adaptors/inc/ut-adaptor-module.h @@ -52,4 +52,4 @@ void Test_DummyFunc(void); int32 Osapi_Call_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, const char *ModuleName); int32 Osapi_Call_ModuleLoad_Static(const char *ModuleName); -#endif /* UT_ADAPTOR_MODULE_H */ +#endif /* UT_ADAPTOR_MODULE_H */ diff --git a/src/unit-test-coverage/shared/src/coveragetest-clock.c b/src/unit-test-coverage/shared/src/coveragetest-clock.c index 8c7685c9f..244f8b2e1 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-clock.c +++ b/src/unit-test-coverage/shared/src/coveragetest-clock.c @@ -65,17 +65,17 @@ void Test_OS_TimeAccessConversions(void) { /* * Test cases for the various time access and conversion functions: - * + * * int64 OS_TimeGetTotalSeconds(OS_time_t tm) * int64 OS_TimeGetTotalMilliseconds(OS_time_t tm) * int64 OS_TimeGetTotalMicroseconds(OS_time_t tm) * int64 OS_TimeGetTotalNanoseconds(OS_time_t tm) - * + * * uint32 OS_TimeGetSubsecondsPart(OS_time_t tm) * uint32 OS_TimeGetMillisecondsPart(OS_time_t tm) * uint32 OS_TimeGetMicrosecondsPart(OS_time_t tm) * uint32 OS_TimeGetNanosecondsPart(OS_time_t tm) - * + * * OS_time_t OS_TimeAssembleFromMilliseconds(int64 seconds, uint32 milliseconds) * OS_time_t OS_TimeAssembleFromMicroseconds(int64 seconds, uint32 microseconds) * OS_time_t OS_TimeAssembleFromNanoseconds(int64 seconds, uint32 nanoseconds) @@ -90,23 +90,23 @@ void Test_OS_TimeAccessConversions(void) OS_time_t t4; /* To base-2 32-bit fixed point: 0.234567890 s * 0x100000000 ~= 0x3c0ca428 */ - t1 = OS_TimeAssembleFromNanoseconds(1,234567890); + t1 = OS_TimeAssembleFromNanoseconds(1, 234567890); /* From base-2 32-bit fixed point: 0x87654321 / 0x100000000 ~= 0.528888888 s */ - t2 = OS_TimeAssembleFromSubseconds(2,0x87654321); + t2 = OS_TimeAssembleFromSubseconds(2, 0x87654321); /* To base-2 32-bit fixed point: 0.045678 s * 0x100000000 ~= 0x0bb18dad */ - t3 = OS_TimeAssembleFromMicroseconds(0,45678); + t3 = OS_TimeAssembleFromMicroseconds(0, 45678); /* To base-2 32-bit fixed point: 0.901 s * 0x100000000 ~= 0xe6a7ef9e */ - t4 = OS_TimeAssembleFromMilliseconds(1,901); + t4 = OS_TimeAssembleFromMilliseconds(1, 901); /* These functions only return the total (whole + fraction) in the requested units */ UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t1), 1); UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t2), 2); UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t3), 0); UtAssert_UINT32_EQ(OS_TimeGetTotalSeconds(t4), 1); - + UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t1), 1234); UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t2), 2528); UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t3), 45); @@ -151,8 +151,8 @@ void Test_OS_TimeAccessConversions(void) UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t4), 1234); /* Add/Subtract that will require carry */ - t1 = OS_TimeAssembleFromNanoseconds(3,777777777); - t2 = OS_TimeAssembleFromNanoseconds(4,888888888); + t1 = OS_TimeAssembleFromNanoseconds(3, 777777777); + t2 = OS_TimeAssembleFromNanoseconds(4, 888888888); t3 = OS_TimeAdd(t1, t2); UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t3), 8666); @@ -160,8 +160,6 @@ void Test_OS_TimeAccessConversions(void) UtAssert_UINT32_EQ(OS_TimeGetTotalMilliseconds(t4), 3777); } - - /* Osapi_Test_Setup * * Purpose: diff --git a/src/unit-test-coverage/shared/src/coveragetest-filesys.c b/src/unit-test-coverage/shared/src/coveragetest-filesys.c index 99e725d6a..ce24aabc7 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-filesys.c +++ b/src/unit-test-coverage/shared/src/coveragetest-filesys.c @@ -236,8 +236,8 @@ void Test_OS_unmount(void) UtAssert_True(actual == expected, "OS_mount() (%ld) == OS_ERR_NAME_NOT_FOUND", (long)actual); /* set up so record is in the right state for mounting */ - OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | - OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = + OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; expected = OS_SUCCESS; actual = OS_unmount("/ram0"); UtAssert_True(actual == expected, "OS_unmount(nominal) (%ld) == OS_SUCCESS", (long)actual); @@ -268,19 +268,19 @@ void Test_OS_FileSysStatVolume(void) statref.blocks_free = OSAL_BLOCKCOUNT_C(1111); statref.total_blocks = OSAL_BLOCKCOUNT_C(2222); UT_SetDataBuffer(UT_KEY(OS_FileSysStatVolume_Impl), &statref, sizeof(statref), false); - OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | - OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = + OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; expected = OS_SUCCESS; actual = OS_FileSysStatVolume("/cf", &statbuf); UtAssert_True(actual == expected, "OS_FileSysStatVolume() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(statbuf.block_size == statref.block_size, "blocks_size (%lu) == %lu", (unsigned long)statbuf.block_size, - (unsigned long)statref.block_size); + UtAssert_True(statbuf.block_size == statref.block_size, "blocks_size (%lu) == %lu", + (unsigned long)statbuf.block_size, (unsigned long)statref.block_size); UtAssert_True(statbuf.total_blocks == statref.total_blocks, "total_blocks (%lu) == %lu", (unsigned long)statbuf.total_blocks, (unsigned long)statref.total_blocks); - UtAssert_True(statbuf.blocks_free == statref.blocks_free, "blocks_free (%lu) == %lu", (unsigned long)statbuf.blocks_free, - (unsigned long)statref.blocks_free); + UtAssert_True(statbuf.blocks_free == statref.blocks_free, "blocks_free (%lu) == %lu", + (unsigned long)statbuf.blocks_free, (unsigned long)statref.blocks_free); /* validate error checking */ expected = OS_INVALID_POINTER; @@ -356,8 +356,8 @@ void Test_OS_FS_GetPhysDriveName(void) actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_ERR_INCORRECT_OBJ_STATE", (long)actual); - OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | - OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = + OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; expected = OS_SUCCESS; actual = OS_FS_GetPhysDriveName(NameBuf, "none"); UtAssert_True(actual == expected, "OS_FS_GetPhysDriveName() (%ld) == OS_SUCCESS", (long)actual); @@ -422,8 +422,8 @@ void Test_OS_TranslatePath(void) int32 actual = ~OS_SUCCESS; /* Set up the local record for success */ - OS_filesys_table[1].flags = OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | - OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; + OS_filesys_table[1].flags = + OS_FILESYS_FLAG_IS_READY | OS_FILESYS_FLAG_IS_MOUNTED_SYSTEM | OS_FILESYS_FLAG_IS_MOUNTED_VIRTUAL; strcpy(OS_filesys_table[1].virtual_mountpt, "/cf"); strcpy(OS_filesys_table[1].system_mountpt, "/mnt/cf"); diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 978ef44cb..00834d784 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -96,7 +96,7 @@ void Test_OS_LockUnlockGlobal(void) memset(&token, 0, sizeof(token)); - token.obj_type = OS_OBJECT_TYPE_OS_COUNTSEM; + token.obj_type = OS_OBJECT_TYPE_OS_COUNTSEM; token.lock_mode = OS_LOCK_MODE_GLOBAL; /* @@ -236,8 +236,8 @@ void Test_OS_ObjectIdConvertToken(void) token.obj_id = objid; actual = OS_ObjectIdConvertToken(&token); expected = OS_ERR_INVALID_ID; - UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(RESERVED) (%ld) == OS_ERR_INVALID_ID (%ld)", - (long)actual, (long)expected); + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(RESERVED) (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, + (long)expected); /* Global should not be released */ UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 2); @@ -284,8 +284,8 @@ void Test_OS_ObjectIdConvertToken(void) token.obj_id = objid; actual = OS_ObjectIdConvertToken(&token); expected = OS_SUCCESS; - UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(RESERVED) (%ld) == OS_SUCCESS (%ld)", - (long)actual, (long)expected); + UtAssert_True(actual == expected, "OS_ObjectIdConvertLock(RESERVED) (%ld) == OS_SUCCESS (%ld)", (long)actual, + (long)expected); /* Global should not be released */ UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 3); @@ -720,9 +720,8 @@ void Test_OS_ObjectIdAllocateNew(void) */ UT_SetDefaultReturnValue(UT_KEY(OS_NotifyEvent), OS_ERR_INVALID_SIZE); expected = OS_ERR_INVALID_SIZE; - actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc2", &token); + actual = OS_ObjectIdAllocateNew(OS_OBJECT_TYPE_OS_TASK, "UT_alloc2", &token); UtAssert_True(actual == expected, "OS_ObjectIdAllocateNew() (%ld) == OS_ERR_INVALID_SIZE", (long)actual); - } void Test_OS_ConvertToArrayIndex(void) @@ -774,15 +773,17 @@ void Test_OS_ObjectIdTransaction(void) UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 0); /* shutdown will prevent transactions */ - OS_SharedGlobalVars.Initialized = true; + OS_SharedGlobalVars.Initialized = true; OS_SharedGlobalVars.ShutdownFlag = OS_SHUTDOWN_MAGIC_NUMBER; - OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_BINSEM, &token), OS_ERR_INCORRECT_OBJ_STATE); + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_BINSEM, &token), + OS_ERR_INCORRECT_OBJ_STATE); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); UtAssert_UINT32_EQ(token.obj_type, OS_OBJECT_TYPE_UNDEFINED); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 0); /* except for exclusive (delete) transactions, which should succeed */ - OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_BINSEM, &token), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_EXCLUSIVE, OS_OBJECT_TYPE_OS_BINSEM, &token), + OS_SUCCESS); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_EXCLUSIVE); UtAssert_UINT32_EQ(token.obj_idx, -1); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 1); @@ -793,24 +794,26 @@ void Test_OS_ObjectIdTransaction(void) /* other cases for normal operating mode */ OS_SharedGlobalVars.ShutdownFlag = 0; - OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_COUNTSEM, &token), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_OS_COUNTSEM, &token), + OS_SUCCESS); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_GLOBAL); UtAssert_UINT32_EQ(token.obj_type, OS_OBJECT_TYPE_OS_COUNTSEM); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 2); /* bad object type */ - OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_UNDEFINED, &token), OS_ERR_INCORRECT_OBJ_TYPE); + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdTransactionInit(OS_LOCK_MODE_GLOBAL, OS_OBJECT_TYPE_UNDEFINED, &token), + OS_ERR_INCORRECT_OBJ_TYPE); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); UtAssert_UINT32_EQ(token.obj_type, OS_OBJECT_TYPE_UNDEFINED); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 2); /* normal finish (sets ID from passed in value) */ - objid = UT_OBJID_1; - token.obj_id = UT_OBJID_2; - token.obj_idx = UT_INDEX_2; - token.obj_type = OS_OBJECT_TYPE_OS_TASK; - token.lock_mode = OS_LOCK_MODE_GLOBAL; - record = OS_ObjectIdGlobalFromToken(&token); + objid = UT_OBJID_1; + token.obj_id = UT_OBJID_2; + token.obj_idx = UT_INDEX_2; + token.obj_type = OS_OBJECT_TYPE_OS_TASK; + token.lock_mode = OS_LOCK_MODE_GLOBAL; + record = OS_ObjectIdGlobalFromToken(&token); record->refcount = 1; OS_ObjectIdTransactionFinish(&token, &objid); @@ -820,9 +823,9 @@ void Test_OS_ObjectIdTransaction(void) UtAssert_UINT32_EQ(record->refcount, 0); /* exclusive lock finish (restores ID from token) */ - record->refcount = 1; + record->refcount = 1; record->active_id = OS_OBJECT_ID_RESERVED; - token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; OS_ObjectIdTransactionFinish(&token, NULL); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 3); UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 3); @@ -830,8 +833,8 @@ void Test_OS_ObjectIdTransaction(void) UtAssert_UINT32_EQ(record->refcount, 0); /* refcount finish (no change to ID) */ - token.lock_mode = OS_LOCK_MODE_REFCOUNT; - record->refcount = 1; + token.lock_mode = OS_LOCK_MODE_REFCOUNT; + record->refcount = 1; record->active_id = UT_OBJID_1; OS_ObjectIdTransactionFinish(&token, NULL); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 4); @@ -849,9 +852,9 @@ void Test_OS_ObjectIdTransaction(void) /* test transferring a refcount token */ memset(&token2, 0xBB, sizeof(token2)); - token.obj_id = UT_OBJID_2; - token.obj_idx = UT_INDEX_2; - token.obj_type = OS_OBJECT_TYPE_OS_TASK; + token.obj_id = UT_OBJID_2; + token.obj_idx = UT_INDEX_2; + token.obj_type = OS_OBJECT_TYPE_OS_TASK; token.lock_mode = OS_LOCK_MODE_GLOBAL; OS_ObjectIdTransferToken(&token, &token2); @@ -873,66 +876,71 @@ void Test_OS_ObjectIdFinalize(void) * int32 OS_ObjectIdFinalizeNew(int32 operation_status, OS_object_token_t *token, osal_id_t *outid); * int32 OS_ObjectIdFinalizeDelete(int32 operation_status, OS_object_token_t *token); */ - int32 expected; - int32 actual; - OS_object_token_t token; - osal_id_t objid; + int32 expected; + int32 actual; + OS_object_token_t token; + osal_id_t objid; OS_common_record_t *record; memset(&token, 0, sizeof(token)); - objid = UT_OBJID_1; - token.obj_id = UT_OBJID_2; - token.obj_idx = UT_INDEX_2; - token.obj_type = OS_OBJECT_TYPE_OS_TASK; + objid = UT_OBJID_1; + token.obj_id = UT_OBJID_2; + token.obj_idx = UT_INDEX_2; + token.obj_type = OS_OBJECT_TYPE_OS_TASK; token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; record = OS_ObjectIdGlobalFromToken(&token); /* if creation fails, RC should be passed through and ID set to UNDEFINED */ - token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; record->active_id = OS_OBJECT_ID_RESERVED; - expected = OS_ERR_INVALID_ID; - actual = OS_ObjectIdFinalizeNew(OS_ERR_INVALID_ID, &token, &objid); - UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, (long)expected); + expected = OS_ERR_INVALID_ID; + actual = OS_ObjectIdFinalizeNew(OS_ERR_INVALID_ID, &token, &objid); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_ERR_INVALID_ID (%ld)", + (long)actual, (long)expected); OSAPI_TEST_OBJID(objid, ==, OS_OBJECT_ID_UNDEFINED); OSAPI_TEST_OBJID(record->active_id, ==, OS_OBJECT_ID_UNDEFINED); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); /* if creation succeeds, RC should be passed through and ID set to token value */ - token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; record->active_id = OS_OBJECT_ID_RESERVED; - expected = OS_SUCCESS; - actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token, &objid); - UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + expected = OS_SUCCESS; + actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token, &objid); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, + (long)expected); OSAPI_TEST_OBJID(objid, ==, token.obj_id); OSAPI_TEST_OBJID(record->active_id, ==, token.obj_id); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); /* verify passing NULL for out ID for path coverage */ - token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; record->active_id = OS_OBJECT_ID_RESERVED; - expected = OS_SUCCESS; - actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token, NULL); - UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + expected = OS_SUCCESS; + actual = OS_ObjectIdFinalizeNew(OS_SUCCESS, &token, NULL); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeNew() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, + (long)expected); OSAPI_TEST_OBJID(record->active_id, ==, token.obj_id); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); /* if delete succeeds, RC should be passed through and ID set to UNDEFINED */ - token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; record->active_id = OS_OBJECT_ID_RESERVED; - expected = OS_SUCCESS; - actual = OS_ObjectIdFinalizeDelete(OS_SUCCESS, &token); - UtAssert_True(actual == expected, "OS_ObjectIdFinalizeDelete() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, (long)expected); + expected = OS_SUCCESS; + actual = OS_ObjectIdFinalizeDelete(OS_SUCCESS, &token); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeDelete() rc passthru (%ld) == OS_SUCCESS (%ld)", (long)actual, + (long)expected); OSAPI_TEST_OBJID(record->active_id, ==, OS_OBJECT_ID_UNDEFINED); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); /* if delete fails, RC should be passed through and ID set to the token value */ - token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; + token.lock_mode = OS_LOCK_MODE_EXCLUSIVE; record->active_id = OS_OBJECT_ID_RESERVED; - expected = OS_ERR_INVALID_ID; - actual = OS_ObjectIdFinalizeDelete(OS_ERR_INVALID_ID, &token); - UtAssert_True(actual == expected, "OS_ObjectIdFinalizeDelete() rc passthru (%ld) == OS_ERR_INVALID_ID (%ld)", (long)actual, (long)expected); + expected = OS_ERR_INVALID_ID; + actual = OS_ObjectIdFinalizeDelete(OS_ERR_INVALID_ID, &token); + UtAssert_True(actual == expected, "OS_ObjectIdFinalizeDelete() rc passthru (%ld) == OS_ERR_INVALID_ID (%ld)", + (long)actual, (long)expected); OSAPI_TEST_OBJID(record->active_id, ==, token.obj_id); UtAssert_UINT32_EQ(token.lock_mode, OS_LOCK_MODE_NONE); } @@ -1031,11 +1039,12 @@ void Test_OS_ObjectIdIterator(void) * OS_ObjectIdIteratorInit, OS_ObjectFilterActive, OS_ObjectIdIterateActive * OS_ObjectIdIteratorGetNext, OS_ObjectIdIteratorDestroy, OS_ObjectIdIteratorProcessEntry */ - OS_object_iter_t iter; + OS_object_iter_t iter; OS_common_record_t rec; - uint32 testarg; + uint32 testarg; - OSAPI_TEST_FUNCTION_RC(OS_ObjectIdIteratorInit(NULL, NULL, OS_OBJECT_TYPE_UNDEFINED, &iter), OS_ERR_INCORRECT_OBJ_TYPE); + OSAPI_TEST_FUNCTION_RC(OS_ObjectIdIteratorInit(NULL, NULL, OS_OBJECT_TYPE_UNDEFINED, &iter), + OS_ERR_INCORRECT_OBJ_TYPE); OSAPI_TEST_FUNCTION_RC(OS_ObjectIdIterateActive(OS_OBJECT_TYPE_OS_TASK, &iter), OS_SUCCESS); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 1); @@ -1046,18 +1055,16 @@ void Test_OS_ObjectIdIterator(void) UtAssert_True(OS_ObjectFilterActive(NULL, NULL, &rec), "OS_ObjectFilterActive() non-empty record"); /* OS_ObjectIdIteratorProcessEntry unlocks and re-locks */ - testarg = 4; + testarg = 4; iter.arg = &testarg; OS_ObjectIdIteratorProcessEntry(&iter, TestIterator); UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 1); UtAssert_STUB_COUNT(OS_Lock_Global_Impl, 2); - /* OS_ObjectIdIteratorDestroy is just a passthrough to OS_ObjectIdTransactionCancel, * but need to call for coverage */ OS_ObjectIdIteratorDestroy(&iter); UtAssert_STUB_COUNT(OS_Unlock_Global_Impl, 2); - } /* Osapi_Test_Setup diff --git a/src/unit-test-coverage/shared/src/coveragetest-task.c b/src/unit-test-coverage/shared/src/coveragetest-task.c index 672a3e101..a97af4301 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-task.c +++ b/src/unit-test-coverage/shared/src/coveragetest-task.c @@ -109,7 +109,8 @@ void Test_OS_TaskCreate(void) osal_id_t objid; int32 actual; - actual = OS_TaskCreate(&objid, "UT", UT_TestHook, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(128), OSAL_PRIORITY_C(0), 0); + actual = + OS_TaskCreate(&objid, "UT", UT_TestHook, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(128), OSAL_PRIORITY_C(0), 0); UtAssert_True(actual == expected, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); @@ -255,7 +256,8 @@ void Test_OS_TaskGetInfo(void) UtAssert_True(actual == expected, "OS_TaskGetInfo() (%ld) == OS_SUCCESS", (long)actual); OSAPI_TEST_OBJID(task_prop.creator, ==, UT_OBJID_OTHER); UtAssert_True(strcmp(task_prop.name, "ABC") == 0, "task_prop.name (%s) == ABC", task_prop.name); - UtAssert_True(task_prop.stack_size == 222, "task_prop.stack_size (%lu) == 222", (unsigned long)task_prop.stack_size); + UtAssert_True(task_prop.stack_size == 222, "task_prop.stack_size (%lu) == 222", + (unsigned long)task_prop.stack_size); UtAssert_True(task_prop.priority == 133, "task_prop.priority (%lu) == 133", (unsigned long)task_prop.priority); OS_task_table[1].stack_size = OSAL_SIZE_C(0); diff --git a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h index 4244a99d5..bfefc17d0 100644 --- a/src/unit-test-coverage/shared/src/os-shared-coveragetest.h +++ b/src/unit-test-coverage/shared/src/os-shared-coveragetest.h @@ -113,4 +113,4 @@ void Osapi_Test_Setup(void); */ void Osapi_Test_Teardown(void); -#endif /* OS_SHARED_COVERAGETEST_H */ +#endif /* OS_SHARED_COVERAGETEST_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h b/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h index d75e8a18f..77128e614 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_arpa_inet.h @@ -39,4 +39,4 @@ extern const char *OCS_inet_ntop(int af, const void *cp, char *buf, size_t len); extern int OCS_inet_pton(int af, const char *cp, void *buf); -#endif /* OCS_ARPA_INET_H */ +#endif /* OCS_ARPA_INET_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h b/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h index 6018cf0da..fc23e44d3 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_assert.h @@ -38,4 +38,4 @@ void OCS_assert(bool expression); -#endif /* OCS_ASSERT_H */ +#endif /* OCS_ASSERT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h b/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h index ec19105b5..0d1098e6f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_basetypes.h @@ -36,4 +36,4 @@ #include /* for correct INT_MAX, etc. */ #include /* for correct boolean semantics */ -#endif /* OCS_BASETYPES_H */ +#endif /* OCS_BASETYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h b/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h index dae8c8643..8816c7f42 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_blkIo.h @@ -32,4 +32,4 @@ typedef struct OCS_BLK_DEV } OCS_BLK_DEV; typedef OCS_BLK_DEV *OCS_BLK_DEV_ID; -#endif /* OCS_BLKIO_H */ +#endif /* OCS_BLKIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h index e14d43cf2..f0a285402 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_bsp-impl.h @@ -90,4 +90,4 @@ extern void OCS_OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen); ------------------------------------------------------------------*/ extern void OCS_OS_BSP_ConsoleSetMode_Impl(uint32_t ModeBits); -#endif /* OCS_BSP_IMPL_H */ +#endif /* OCS_BSP_IMPL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h index 655b0f8d7..cfabf811b 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_cbioLib.h @@ -37,4 +37,4 @@ /* prototypes normally declared in cbioLib.h */ /* ----------------------------------------- */ -#endif /* OCS_CBIOLIB_H */ +#endif /* OCS_CBIOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h b/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h index 011fb2e12..2e68e379d 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_complex.h @@ -36,4 +36,4 @@ /* prototypes normally declared in complex.h */ /* ----------------------------------------- */ -#endif /* OCS_COMPLEX_H */ +#endif /* OCS_COMPLEX_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h index 254eb0183..f68aa8b0b 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ctype.h @@ -38,4 +38,4 @@ extern int OCS_isgraph(int c); -#endif /* OCS_CTYPE_H */ +#endif /* OCS_CTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h b/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h index 44089bb73..af9ce8418 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_dirent.h @@ -48,4 +48,4 @@ extern OCS_DIR * OCS_opendir(const char *name); extern struct OCS_dirent *OCS_readdir(OCS_DIR *dirp); extern void OCS_rewinddir(OCS_DIR *dirp); -#endif /* OCS_DIRENT_H */ +#endif /* OCS_DIRENT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h b/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h index e576ff3ee..fe8934a17 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_dlfcn.h @@ -41,4 +41,4 @@ extern char *OCS_dlerror(void); extern void *OCS_dlopen(const char *file, int flags); extern void *OCS_dlsym(void *handle, const char *name); -#endif /* OCS_DLFCN_H */ +#endif /* OCS_DLFCN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h index e17165a44..1f783ecf2 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_dosFsLib.h @@ -43,4 +43,4 @@ /* ----------------------------------------- */ extern OCS_STATUS OCS_dosFsVolFormat(char *path, int opt, OCS_FUNCPTR pPromptFunc); -#endif /* OCS_DOSFSLIB_H */ +#endif /* OCS_DOSFSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h index 2e87822c1..65c63d700 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_drv_hdisk_ataDrv.h @@ -39,4 +39,4 @@ /* ----------------------------------------- */ extern OCS_BLK_DEV *OCS_ataDevCreate(int ctrl, int drive, unsigned int nBlocks, unsigned int blkOffset); -#endif /* OCS_DRV_HDISK_ATADRV_H */ +#endif /* OCS_DRV_HDISK_ATADRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h index 290ed09fe..79c123e0d 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h @@ -49,4 +49,4 @@ extern int OCS_errno; -#endif /* OCS_ERRNO_H */ +#endif /* OCS_ERRNO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h index 88cbb5563..73b0c2039 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_errnoLib.h @@ -39,4 +39,4 @@ extern int OCS_errnoGet(void); -#endif /* OCS_ERRNOLIB_H */ +#endif /* OCS_ERRNOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h index 48408b35c..b1ab963f9 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h @@ -81,4 +81,4 @@ extern int OCS_fcntl(int fd, int cmd, ...); extern int OCS_open(const char *file, int oflag, ...); -#endif /* OCS_FCNTL_H */ +#endif /* OCS_FCNTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h index b1a9bc92d..aba58fad0 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_fenv.h @@ -36,4 +36,4 @@ /* prototypes normally declared in fenv.h */ /* ----------------------------------------- */ -#endif /* OCS_FENV_H */ +#endif /* OCS_FENV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_float.h b/src/unit-test-coverage/ut-stubs/inc/OCS_float.h index afc4cb397..97cab7bbc 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_float.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_float.h @@ -36,4 +36,4 @@ /* prototypes normally declared in float.h */ /* ----------------------------------------- */ -#endif /* OCS_FLOAT_H */ +#endif /* OCS_FLOAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h index a070b2533..ed9e020a3 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_hostLib.h @@ -44,4 +44,4 @@ /* ----------------------------------------- */ extern int OCS_hostGetByName(char *name); -#endif /* OCS_HOSTLIB_H */ +#endif /* OCS_HOSTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h index 45d0ad544..724f8396b 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_intLib.h @@ -44,4 +44,4 @@ extern int OCS_intLock(void); extern int OCS_intUnlock(int lockKey); extern OCS_VOIDFUNCPTR *OCS_INUM_TO_IVEC(unsigned int ui); -#endif /* OCS_INTLIB_H */ +#endif /* OCS_INTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h b/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h index 700c9c822..0b326e904 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_inttypes.h @@ -36,4 +36,4 @@ /* prototypes normally declared in inttypes.h */ /* ----------------------------------------- */ -#endif /* OCS_INTTYPES_H */ +#endif /* OCS_INTTYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h index bee9238ec..6e8dd63d7 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ioLib.h @@ -42,4 +42,4 @@ extern int OCS_ioctl(int fd, unsigned long request, ...); -#endif /* OCS_IOLIB_H */ +#endif /* OCS_IOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h index 8252f66e0..5ddb8182e 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_iv.h @@ -24,4 +24,4 @@ #include -#endif /* OCS_IV_H */ +#endif /* OCS_IV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h index d042c16de..b9eb5abc6 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_loadLib.h @@ -40,4 +40,4 @@ extern OCS_MODULE_ID OCS_loadModule(int fd, unsigned int symFlag); -#endif /* OCS_LOADLIB_H */ +#endif /* OCS_LOADLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h b/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h index 278ced3ce..40d070f8e 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_locale.h @@ -36,4 +36,4 @@ /* prototypes normally declared in locale.h */ /* ----------------------------------------- */ -#endif /* OCS_LOCALE_H */ +#endif /* OCS_LOCALE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h index 22de5a19a..0eb53f915 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_logLib.h @@ -37,4 +37,4 @@ /* prototypes normally declared in logLib.h */ /* ----------------------------------------- */ -#endif /* OCS_LOGLIB_H */ +#endif /* OCS_LOGLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_math.h b/src/unit-test-coverage/ut-stubs/inc/OCS_math.h index a8cfe8c28..3b07bce2d 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_math.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_math.h @@ -36,4 +36,4 @@ /* prototypes normally declared in math.h */ /* ----------------------------------------- */ -#endif /* OCS_MATH_H */ +#endif /* OCS_MATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h index c0a7b1935..d1201761a 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_memPartLib.h @@ -54,4 +54,4 @@ extern OCS_STATUS OCS_memPartInfoGet(OCS_PART_ID partId, /* partition ID extern OCS_PART_ID OCS_memSysPartId; -#endif /* OCS_MEMPARTLIB_H */ +#endif /* OCS_MEMPARTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h index 63c73db4c..a7b3ca224 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_moduleLib.h @@ -58,4 +58,4 @@ typedef struct OCS_MODULE_INFO extern OCS_STATUS OCS_moduleInfoGet(OCS_MODULE_ID moduleId, OCS_MODULE_INFO *pModuleInfo); -#endif /* OCS_MODULELIB_H */ +#endif /* OCS_MODULELIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h b/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h index d317d4f22..da7ae4eb9 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_mqueue.h @@ -55,4 +55,4 @@ extern int OCS_mq_timedsend(OCS_mqd_t mqdes, const char *msg_ptr, size_t const struct OCS_timespec *abs_timeout); extern int OCS_mq_unlink(const char *name); -#endif /* OCS_MQUEUE_H */ +#endif /* OCS_MQUEUE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h index 5a5086671..46e540cc7 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_msgQLib.h @@ -54,4 +54,4 @@ extern OCS_STATUS OCS_msgQDelete(OCS_MSG_Q_ID msgQId); extern int OCS_msgQReceive(OCS_MSG_Q_ID msgQId, char *buffer, OCS_UINT maxNBytes, int timeout); extern OCS_STATUS OCS_msgQSend(OCS_MSG_Q_ID msgQId, char *buffer, OCS_UINT nBytes, int timeout, int priority); -#endif /* OCS_MSGQLIB_H */ +#endif /* OCS_MSGQLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h b/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h index c1dafe5b3..b04003749 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_net_if.h @@ -36,4 +36,4 @@ /* prototypes normally declared in net/if.h */ /* ----------------------------------------- */ -#endif /* OCS_NET_IF_H */ +#endif /* OCS_NET_IF_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h index bd1390376..69aedbfad 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h @@ -36,4 +36,4 @@ /* prototypes normally declared in netdb.h */ /* ----------------------------------------- */ -#endif /* OCS_NETDB_H */ +#endif /* OCS_NETDB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h index cd9bba777..db4194a17 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h @@ -41,4 +41,4 @@ extern uint16_t OCS_ntohs(uint16_t netshort); extern uint32_t OCS_htonl(uint32_t hostlong); extern uint32_t OCS_ntohl(uint32_t netlong); -#endif /* OCS_NETINET_IN_H */ +#endif /* OCS_NETINET_IN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h index 8c5e03ef6..e9a89fa26 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_tcp.h @@ -36,4 +36,4 @@ /* prototypes normally declared in netinet/tcp.h */ /* ----------------------------------------- */ -#endif /* OCS_NETINET_TCP_H */ +#endif /* OCS_NETINET_TCP_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h index 1b01331f0..12716d859 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_objLib.h @@ -44,4 +44,4 @@ /* prototypes normally declared in objLib.h */ /* ----------------------------------------- */ -#endif /* OCS_OBJLIB_H */ +#endif /* OCS_OBJLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h b/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h index d9c58f557..471ebf757 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_poll.h @@ -36,4 +36,4 @@ /* prototypes normally declared in poll.h */ /* ----------------------------------------- */ -#endif /* OCS_POLL_H */ +#endif /* OCS_POLL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h b/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h index 20bd35c3f..975513806 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_pthread.h @@ -122,4 +122,4 @@ extern int OCS_pthread_setschedprio(OCS_pthread_t target_thread, int prio); extern int OCS_pthread_setspecific(OCS_pthread_key_t key, const void *pointer); extern int OCS_pthread_sigmask(int how, const OCS_sigset_t *set, OCS_sigset_t *oldset); -#endif /* OCS_PTHREAD_H */ +#endif /* OCS_PTHREAD_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h index 9a5f65856..1eb14362d 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDiskCbio.h @@ -37,4 +37,4 @@ /* prototypes normally declared in ramDiskCbio.h */ /* ----------------------------------------- */ -#endif /* OCS_RAMDISKCBIO_H */ +#endif /* OCS_RAMDISKCBIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h index faa89be57..6b6ce2e44 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ramDrv.h @@ -39,4 +39,4 @@ /* ----------------------------------------- */ extern OCS_BLK_DEV *OCS_ramDevCreate(char *ramAddr, int bytesPerSec, int secPerTrack, int nSectors, int secOffset); -#endif /* OCS_RAMDRV_H */ +#endif /* OCS_RAMDRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h index 14ca9fe5d..ceae63638 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sched.h @@ -45,4 +45,4 @@ struct OCS_sched_param extern int OCS_sched_get_priority_max(int policy); extern int OCS_sched_get_priority_min(int policy); -#endif /* OCS_SCHED_H */ +#endif /* OCS_SCHED_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h index e6c386a0c..aedc0d2b2 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_semLib.h @@ -70,4 +70,4 @@ extern OCS_STATUS OCS_semFlush(OCS_SEM_ID semId); extern OCS_STATUS OCS_semTake(OCS_SEM_ID semId, int timeout); extern OCS_STATUS OCS_semGive(OCS_SEM_ID semId); -#endif /* OCS_SEMLIB_H */ +#endif /* OCS_SEMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h b/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h index be7862691..b05c25df5 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_semaphore.h @@ -49,4 +49,4 @@ extern int OCS_sem_post(OCS_sem_t *sem); extern int OCS_sem_timedwait(OCS_sem_t *sem, const struct OCS_timespec *abstime); extern int OCS_sem_wait(OCS_sem_t *sem); -#endif /* OCS_SEMAPHORE_H */ +#endif /* OCS_SEMAPHORE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h b/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h index 63ac867f2..febc81156 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_setjmp.h @@ -36,4 +36,4 @@ /* prototypes normally declared in setjmp.h */ /* ----------------------------------------- */ -#endif /* OCS_SETJMP_H */ +#endif /* OCS_SETJMP_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h index c79987ce8..4f316da0b 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_shellLib.h @@ -40,4 +40,4 @@ extern OCS_STATUS OCS_shellGenericInit(const char *config, int stackSize, const char *shellName, char **pShellName, OCS_BOOL interactive, OCS_BOOL loginAccess, int fdin, int fdout, int fderr); -#endif /* OCS_SHELLLIB_H */ +#endif /* OCS_SHELLLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h b/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h index dfdda0041..13990a46f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_signal.h @@ -74,4 +74,4 @@ extern int OCS_sigprocmask(int how, const OCS_sigset_t *set, OCS_si extern int OCS_sigsuspend(const OCS_sigset_t *set); extern int OCS_sigwait(const OCS_sigset_t *set, int *sig); -#endif /* OCS_SIGNAL_H */ +#endif /* OCS_SIGNAL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h index 79c52ae17..bc2702ae5 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stat.h @@ -74,4 +74,4 @@ extern int OCS_fstat(int fd, struct OCS_stat *buf); extern int OCS_statvfs(const char *file, struct OCS_statvfs *buf); -#endif /* OCS_STAT_H */ +#endif /* OCS_STAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h index b0299c8d1..b788b203f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdarg.h @@ -43,4 +43,4 @@ typedef struct #define OCS_va_start(ap, last) ap.p = &last #define OCS_va_end(ap) -#endif /* OCS_STDARG_H */ +#endif /* OCS_STDARG_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h index f6fa1fb37..31ce73425 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdio.h @@ -54,4 +54,4 @@ extern OCS_FILE *OCS_stdin; extern OCS_FILE *OCS_stdout; extern OCS_FILE *OCS_stderr; -#endif /* OCS_STDIO_H */ +#endif /* OCS_STDIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h index 21f58f107..b0fe69988 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_stdlib.h @@ -46,4 +46,4 @@ extern int OCS_system(const char *command); extern void * OCS_malloc(size_t sz); extern void OCS_free(void *ptr); -#endif /* OCS_STDLIB_H */ +#endif /* OCS_STDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_string.h b/src/unit-test-coverage/ut-stubs/inc/OCS_string.h index f58965910..470ba2e82 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_string.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_string.h @@ -50,4 +50,4 @@ extern char * OCS_strcat(char *dest, const char *src); extern char * OCS_strncat(char *dest, const char *src, size_t n); extern char * OCS_strerror(int errnum); -#endif /* OCS_STRING_H */ +#endif /* OCS_STRING_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h b/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h index b71872507..74e2c5cab 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_strings.h @@ -36,4 +36,4 @@ /* prototypes normally declared in strings.h */ /* ----------------------------------------- */ -#endif /* OCS_STRINGS_H */ +#endif /* OCS_STRINGS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h index 69b886112..16037a4f8 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_symLib.h @@ -70,4 +70,4 @@ extern OCS_STATUS OCS_symFindByName(OCS_SYMTAB_ID symTblId, char *name, char ** extern OCS_SYMBOL *OCS_symEach(OCS_SYMTAB_ID symTblId, OCS_symEach_Routine_t routine, int routineArg); extern OCS_STATUS OCS_symFind(OCS_SYMTAB_ID symTblId, OCS_SYMBOL_DESC *pSymbol); -#endif /* OCS_SYMLIB_H */ +#endif /* OCS_SYMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h index 06b96ff7d..0f6093256 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sysLib.h @@ -38,4 +38,4 @@ /* ----------------------------------------- */ extern int OCS_sysClkRateGet(void); -#endif /* OCS_SYSLIB_H */ +#endif /* OCS_SYSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h index 3a09a9486..60ef5e79e 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ioctl.h @@ -38,4 +38,4 @@ extern int OCS_ioctl(int fd, unsigned long request, ...); -#endif /* OCS_SYS_IOCTL_H */ +#endif /* OCS_SYS_IOCTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h index f2f8b58ad..f566826f2 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_ipc.h @@ -36,4 +36,4 @@ /* prototypes normally declared in sys/ipc.h */ /* ----------------------------------------- */ -#endif /* OCS_SYS_IPC_H */ +#endif /* OCS_SYS_IPC_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h index dab686d11..7bdff049f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_mman.h @@ -45,4 +45,4 @@ void *OCS_mmap(void *addr, size_t length, int prot, int flags, int fd, OCS_off_t offset); int OCS_munmap(void *addr, size_t length); -#endif /* OCS_SYS_MMAN_H */ +#endif /* OCS_SYS_MMAN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h index 627c1df4a..531cad372 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_select.h @@ -55,4 +55,4 @@ extern int OCS_FD_ISSET(int fd, OCS_fd_set *set); extern void OCS_FD_CLR(int fd, OCS_fd_set *set); extern void OCS_FD_ZERO(OCS_fd_set *set); -#endif /* OCS_SYS_SELECT_H */ +#endif /* OCS_SYS_SELECT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h index f87ababdc..35e079f03 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_socket.h @@ -55,4 +55,4 @@ extern OCS_ssize_t OCS_sendto(int fd, const void *buf, size_t n, int flags, cons extern int OCS_setsockopt(int fd, int level, int optname, const void *optval, OCS_socklen_t optlen); extern int OCS_socket(int domain, int type, int protocol); -#endif /* OCS_SYS_SOCKET_H */ +#endif /* OCS_SYS_SOCKET_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h index 8f905ab12..54b7044b3 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_time.h @@ -37,4 +37,4 @@ /* prototypes normally declared in sys/time.h */ /* ----------------------------------------- */ -#endif /* OCS_SYS_TIME_H */ +#endif /* OCS_SYS_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h index 3957d99a6..3f92ec9ca 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_times.h @@ -37,4 +37,4 @@ /* prototypes normally declared in sys/times.h */ /* ----------------------------------------- */ -#endif /* OCS_SYS_TIMES_H */ +#endif /* OCS_SYS_TIMES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h index 40158454f..c3db9b65f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_types.h @@ -43,4 +43,4 @@ typedef int OCS_uid_t; /* prototypes normally declared in sys/types.h */ /* ----------------------------------------- */ -#endif /* OCS_SYS_TYPES_H */ +#endif /* OCS_SYS_TYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h index a5d62205f..197ea1840 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_un.h @@ -36,4 +36,4 @@ /* prototypes normally declared in sys/un.h */ /* ----------------------------------------- */ -#endif /* OCS_SYS_UN_H */ +#endif /* OCS_SYS_UN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h index be91da5ce..6ec53b345 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_sys_wait.h @@ -36,4 +36,4 @@ /* prototypes normally declared in sys/wait.h */ /* ----------------------------------------- */ -#endif /* OCS_SYS_WAIT_H */ +#endif /* OCS_SYS_WAIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h index 72a7b7e63..bc2bccc39 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_taskLib.h @@ -79,4 +79,4 @@ OCS_STATUS OCS_taskInit(OCS_WIND_TCB *pTcb, char *name, int priority, int option OCS_WIND_TCB *OCS_taskTcb(OCS_TASK_ID tid); -#endif /* OCS_TASKLIB_H */ +#endif /* OCS_TASKLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h index 332998e47..9ac4f3937 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_taskVarLib.h @@ -39,4 +39,4 @@ extern OCS_STATUS OCS_taskVarAdd(int tid, int *pVar); -#endif /* OCS_TASKVARLIB_H */ +#endif /* OCS_TASKVARLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h b/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h index 70b3dcc17..6420fa2d0 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_termios.h @@ -36,4 +36,4 @@ /* prototypes normally declared in termios.h */ /* ----------------------------------------- */ -#endif /* OCS_TERMIOS_H */ +#endif /* OCS_TERMIOS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h b/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h index 7cb26cf0e..b547b841a 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_tgmath.h @@ -36,4 +36,4 @@ /* prototypes normally declared in tgmath.h */ /* ----------------------------------------- */ -#endif /* OCS_TGMATH_H */ +#endif /* OCS_TGMATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_time.h b/src/unit-test-coverage/ut-stubs/inc/OCS_time.h index 003b2f3b1..20894c1b6 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_time.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_time.h @@ -79,4 +79,4 @@ extern int OCS_timer_settime(OCS_timer_t timerid, int flags, const struct OCS_it extern int OCS_timer_connect(OCS_timer_t timerid, OCS_TIMER_CONNECT_FUNC func, int arg); -#endif /* OCS_TIME_H */ +#endif /* OCS_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h b/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h index f80d25d27..be5085b59 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_timers.h @@ -36,4 +36,4 @@ /* prototypes normally declared in timers.h */ /* ----------------------------------------- */ -#endif /* OCS_TIMERS_H */ +#endif /* OCS_TIMERS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h b/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h index 3b9453282..153150bec 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_ulimit.h @@ -37,4 +37,4 @@ /* ----------------------------------------- */ long OCS_ulimit(int cmd, long newlimit); -#endif /* OCS_ULIMIT_H */ +#endif /* OCS_ULIMIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h b/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h index 565924255..34a5d4c1c 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_unistd.h @@ -56,4 +56,4 @@ extern int OCS_rmdir(const char *path); extern long int OCS_sysconf(int name); extern OCS_ssize_t OCS_write(int fd, const void *buf, size_t n); -#endif /* OCS_UNISTD_H */ +#endif /* OCS_UNISTD_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h index 2f1c709b7..c3de289e7 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_unldLib.h @@ -39,4 +39,4 @@ /* ----------------------------------------- */ extern OCS_STATUS OCS_unldByModuleId(OCS_MODULE_ID moduleId, int options); -#endif /* OCS_UNLDLIB_H */ +#endif /* OCS_UNLDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h b/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h index f45e873f2..bc8c9127a 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_usrLib.h @@ -37,4 +37,4 @@ /* prototypes normally declared in usrLib.h */ /* ----------------------------------------- */ -#endif /* OCS_USRLIB_H */ +#endif /* OCS_USRLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_version.h b/src/unit-test-coverage/ut-stubs/inc/OCS_version.h index 203e8e828..89766255f 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_version.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_version.h @@ -36,4 +36,4 @@ /* prototypes normally declared in version.h */ /* ----------------------------------------- */ -#endif /* OCS_VERSION_H */ +#endif /* OCS_VERSION_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h b/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h index 6b4f24d6b..6db9b9300 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_vxWorks.h @@ -76,4 +76,4 @@ typedef void (*OCS_VOIDFUNCPTR)(void); /* prototypes normally declared in vxWorks.h */ /* ----------------------------------------- */ -#endif /* OCS_VXWORKS_H */ +#endif /* OCS_VXWORKS_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h b/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h index dd9fb6709..050413681 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_wchar.h @@ -36,4 +36,4 @@ /* prototypes normally declared in wchar.h */ /* ----------------------------------------- */ -#endif /* OCS_WCHAR_H */ +#endif /* OCS_WCHAR_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h b/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h index a7d975dee..0aa046df6 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_wctype.h @@ -36,4 +36,4 @@ /* prototypes normally declared in wctype.h */ /* ----------------------------------------- */ -#endif /* OCS_WCTYPE_H */ +#endif /* OCS_WCTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h index f805cbe6c..346083205 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdBlkDev.h @@ -42,4 +42,4 @@ typedef int OCS_device_t; extern OCS_device_t OCS_xbdBlkDevCreateSync(OCS_BLK_DEV *bd, const char *name); extern OCS_STATUS OCS_xbdBlkDevDelete(OCS_device_t dev, OCS_BLK_DEV **ppbd); -#endif /* OCS_XBDBLKDEV_H */ +#endif /* OCS_XBDBLKDEV_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h index 4ef1f945f..ac2fec4df 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_xbdRamDisk.h @@ -37,4 +37,4 @@ /* prototypes normally declared in xbdRamDisk.h */ /* ----------------------------------------- */ -#endif /* OCS_XBDRAMDISK_H */ +#endif /* OCS_XBDRAMDISK_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h b/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h index 74b0c48d0..b2a1af6b7 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/arpa/inet.h @@ -30,4 +30,4 @@ #define inet_ntop OCS_inet_ntop #define inet_pton OCS_inet_pton -#endif /* OSAL_OVERRIDE_ARPA_INET_H */ +#endif /* OSAL_OVERRIDE_ARPA_INET_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/assert.h b/src/unit-test-coverage/ut-stubs/override_inc/assert.h index 6999e07ec..7e606c698 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/assert.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/assert.h @@ -30,4 +30,4 @@ #define assert OCS_assert -#endif /* OSAL_OVERRIDE_ASSERT_H */ +#endif /* OSAL_OVERRIDE_ASSERT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h b/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h index 3667b3f13..c367eb5e6 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/blkIo.h @@ -32,4 +32,4 @@ #define BLK_DEV OCS_BLK_DEV #define BLK_DEV_ID OCS_BLK_DEV_ID -#endif /* OSAL_OVERRIDE_BLKIO_H */ +#endif /* OSAL_OVERRIDE_BLKIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h b/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h index 3e4c5cebb..1bde70096 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/bsp-impl.h @@ -43,4 +43,4 @@ END bsp-impl.h *********************/ -#endif /* BSP_IMPL_H */ +#endif /* BSP_IMPL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h b/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h index d970c13d4..1d2456dd3 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/cbioLib.h @@ -28,4 +28,4 @@ /* mappings for declarations in cbioLib.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_CBIOLIB_H */ +#endif /* OSAL_OVERRIDE_CBIOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/complex.h b/src/unit-test-coverage/ut-stubs/override_inc/complex.h index 48c6b9cd1..18fe48ec8 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/complex.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/complex.h @@ -28,4 +28,4 @@ /* mappings for declarations in complex.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_COMPLEX_H */ +#endif /* OSAL_OVERRIDE_COMPLEX_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ctype.h b/src/unit-test-coverage/ut-stubs/override_inc/ctype.h index b3d66aead..bc20c62fc 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ctype.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ctype.h @@ -30,4 +30,4 @@ #define isgraph OCS_isgraph -#endif /* OSAL_OVERRIDE_CTYPE_H */ +#endif /* OSAL_OVERRIDE_CTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/dirent.h b/src/unit-test-coverage/ut-stubs/override_inc/dirent.h index b29378369..4b1de1b47 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/dirent.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/dirent.h @@ -35,4 +35,4 @@ #define readdir OCS_readdir #define rewinddir OCS_rewinddir -#endif /* OSAL_OVERRIDE_DIRENT_H */ +#endif /* OSAL_OVERRIDE_DIRENT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h b/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h index b5cd80ebd..20cccc404 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/dlfcn.h @@ -33,4 +33,4 @@ #define dlopen OCS_dlopen #define dlsym OCS_dlsym -#endif /* OSAL_OVERRIDE_DLFCN_H */ +#endif /* OSAL_OVERRIDE_DLFCN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h b/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h index 46772ffa7..503da1d14 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/dosFsLib.h @@ -36,4 +36,4 @@ #define dosFsVolFormat OCS_dosFsVolFormat -#endif /* OSAL_OVERRIDE_DOSFSLIB_H */ +#endif /* OSAL_OVERRIDE_DOSFSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h b/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h index 1b9d9f659..325551d07 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/drv/hdisk/ataDrv.h @@ -31,4 +31,4 @@ /* ----------------------------------------- */ #define ataDevCreate OCS_ataDevCreate -#endif /* OSAL_OVERRIDE_DRV_HDISK_ATADRV_H */ +#endif /* OSAL_OVERRIDE_DRV_HDISK_ATADRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/errno.h b/src/unit-test-coverage/ut-stubs/override_inc/errno.h index 91ff72ad6..80ccf685e 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/errno.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/errno.h @@ -40,4 +40,4 @@ #define errno OCS_errno -#endif /* OSAL_OVERRIDE_ERRNO_H */ +#endif /* OSAL_OVERRIDE_ERRNO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h b/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h index 0616fce77..a8589b83c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/errnoLib.h @@ -30,4 +30,4 @@ /* ----------------------------------------- */ #define errnoGet OCS_errnoGet -#endif /* OSAL_OVERRIDE_ERRNOLIB_H */ +#endif /* OSAL_OVERRIDE_ERRNOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h index 50b359062..35cc45daa 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h @@ -56,4 +56,4 @@ #define fcntl OCS_fcntl #define open OCS_open -#endif /* OSAL_OVERRIDE_FCNTL_H */ +#endif /* OSAL_OVERRIDE_FCNTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/fenv.h b/src/unit-test-coverage/ut-stubs/override_inc/fenv.h index 0f57e4ac3..8573a3de7 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/fenv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/fenv.h @@ -28,4 +28,4 @@ /* mappings for declarations in fenv.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_FENV_H */ +#endif /* OSAL_OVERRIDE_FENV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/float.h b/src/unit-test-coverage/ut-stubs/override_inc/float.h index 17cbacb5f..cc993a971 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/float.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/float.h @@ -28,4 +28,4 @@ /* mappings for declarations in float.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_FLOAT_H */ +#endif /* OSAL_OVERRIDE_FLOAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h b/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h index c1597bee9..2719ea193 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/hostLib.h @@ -37,4 +37,4 @@ /* ----------------------------------------- */ #define hostGetByName OCS_hostGetByName -#endif /* HOSTLIB_H */ +#endif /* HOSTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/intLib.h b/src/unit-test-coverage/ut-stubs/override_inc/intLib.h index ad7b71d30..ed9669c40 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/intLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/intLib.h @@ -36,4 +36,4 @@ #define intUnlock OCS_intUnlock #define INUM_TO_IVEC OCS_INUM_TO_IVEC -#endif /* OSAL_OVERRIDE_INTLIB_H */ +#endif /* OSAL_OVERRIDE_INTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h b/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h index 16ea9a0de..a973d6244 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/inttypes.h @@ -28,4 +28,4 @@ /* mappings for declarations in inttypes.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_INTTYPES_H */ +#endif /* OSAL_OVERRIDE_INTTYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h b/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h index 9057af7b2..f8006ed59 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ioLib.h @@ -33,4 +33,4 @@ #define FIOUNMOUNT OCS_FIOUNMOUNT #define ioctl OCS_ioctl -#endif /* OSAL_OVERRIDE_IOLIB_H */ +#endif /* OSAL_OVERRIDE_IOLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/iv.h b/src/unit-test-coverage/ut-stubs/override_inc/iv.h index 6d7070fda..760755c9c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/iv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/iv.h @@ -28,4 +28,4 @@ /* mappings for declarations in iv.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_IV_H */ +#endif /* OSAL_OVERRIDE_IV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h b/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h index bb6503866..d45867fa5 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/loadLib.h @@ -32,4 +32,4 @@ #define loadModule OCS_loadModule -#endif /* OSAL_OVERRIDE_LOADLIB_H */ +#endif /* OSAL_OVERRIDE_LOADLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/locale.h b/src/unit-test-coverage/ut-stubs/override_inc/locale.h index 4b23b4361..07b96a1fc 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/locale.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/locale.h @@ -28,4 +28,4 @@ /* mappings for declarations in locale.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_LOCALE_H */ +#endif /* OSAL_OVERRIDE_LOCALE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/logLib.h b/src/unit-test-coverage/ut-stubs/override_inc/logLib.h index d746d7117..a58c2b2a0 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/logLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/logLib.h @@ -29,4 +29,4 @@ /* mappings for declarations in logLib.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_LOGLIB_H */ +#endif /* OSAL_OVERRIDE_LOGLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/math.h b/src/unit-test-coverage/ut-stubs/override_inc/math.h index cc3845973..ff67798ea 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/math.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/math.h @@ -28,4 +28,4 @@ /* mappings for declarations in math.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_MATH_H */ +#endif /* OSAL_OVERRIDE_MATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h b/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h index 37e46b4b1..d66695b40 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/memPartLib.h @@ -35,4 +35,4 @@ #define memPartInfoGet OCS_memPartInfoGet #define memSysPartId OCS_memSysPartId -#endif /* OSAL_OVERRIDE_MEMPARTLIB_H */ +#endif /* OSAL_OVERRIDE_MEMPARTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h b/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h index 9e8d949de..e15586153 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/moduleLib.h @@ -34,4 +34,4 @@ #define moduleInfoGet OCS_moduleInfoGet -#endif /* OSAL_OVERRIDE_MODULELIB_H */ +#endif /* OSAL_OVERRIDE_MODULELIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h b/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h index 14613166c..5bd35d613 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/mqueue.h @@ -39,4 +39,4 @@ #define mq_timedsend OCS_mq_timedsend #define mq_unlink OCS_mq_unlink -#endif /* OSAL_OVERRIDE_MQUEUE_H */ +#endif /* OSAL_OVERRIDE_MQUEUE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h b/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h index 41050a5b9..8a5ba72d5 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/msgQLib.h @@ -42,4 +42,4 @@ #define msgQReceive OCS_msgQReceive #define msgQSend OCS_msgQSend -#endif /* OSAL_OVERRIDE_MSGQLIB_H */ +#endif /* OSAL_OVERRIDE_MSGQLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/net/if.h b/src/unit-test-coverage/ut-stubs/override_inc/net/if.h index 04bdc16c3..e3a1c48a2 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/net/if.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/net/if.h @@ -28,4 +28,4 @@ /* mappings for declarations in net/if.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_NET_IF_H */ +#endif /* OSAL_OVERRIDE_NET_IF_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netdb.h b/src/unit-test-coverage/ut-stubs/override_inc/netdb.h index 44385a8b0..fe5425609 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netdb.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netdb.h @@ -28,4 +28,4 @@ /* mappings for declarations in netdb.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_NETDB_H */ +#endif /* OSAL_OVERRIDE_NETDB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h b/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h index 093738874..eb885172c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h @@ -33,4 +33,4 @@ #define htonl OCS_htonl #define ntohl OCS_ntohl -#endif /* OSAL_OVERRIDE_NETINET_IN_H */ +#endif /* OSAL_OVERRIDE_NETINET_IN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h b/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h index 2509afc0e..a0269e6de 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netinet/tcp.h @@ -28,4 +28,4 @@ /* mappings for declarations in netinet/tcp.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_NETINET_TCP_H */ +#endif /* OSAL_OVERRIDE_NETINET_TCP_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/objLib.h b/src/unit-test-coverage/ut-stubs/override_inc/objLib.h index 12dc589b5..54496069a 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/objLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/objLib.h @@ -36,4 +36,4 @@ #define S_objLib_OBJ_TIMEOUT OCS_S_objLib_OBJ_TIMEOUT #define S_objLib_OBJ_NO_METHOD OCS_S_objLib_OBJ_NO_METHOD -#endif /* OSAL_OVERRIDE_OBJLIB_H */ +#endif /* OSAL_OVERRIDE_OBJLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/poll.h b/src/unit-test-coverage/ut-stubs/override_inc/poll.h index 205e1f9a0..adaae476c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/poll.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/poll.h @@ -28,4 +28,4 @@ /* mappings for declarations in poll.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_POLL_H */ +#endif /* OSAL_OVERRIDE_POLL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/pthread.h b/src/unit-test-coverage/ut-stubs/override_inc/pthread.h index 858ef5b5a..3a061f2d4 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/pthread.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/pthread.h @@ -76,4 +76,4 @@ #define pthread_setspecific OCS_pthread_setspecific #define pthread_sigmask OCS_pthread_sigmask -#endif /* OSAL_OVERRIDE_PTHREAD_H */ +#endif /* OSAL_OVERRIDE_PTHREAD_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h b/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h index 09b138a2d..1c925fc43 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ramDiskCbio.h @@ -29,4 +29,4 @@ /* mappings for declarations in ramDiskCbio.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_RAMDISKCBIO_H */ +#endif /* OSAL_OVERRIDE_RAMDISKCBIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h b/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h index 892e2212c..97896710c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ramDrv.h @@ -32,4 +32,4 @@ #define ramDevCreate OCS_ramDevCreate -#endif /* OSAL_OVERRIDE_RAMDRV_H */ +#endif /* OSAL_OVERRIDE_RAMDRV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sched.h b/src/unit-test-coverage/ut-stubs/override_inc/sched.h index f9cb17c56..53f6484a3 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sched.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sched.h @@ -36,4 +36,4 @@ #define sched_get_priority_max OCS_sched_get_priority_max #define sched_get_priority_min OCS_sched_get_priority_min -#endif /* OSAL_OVERRIDE_SCHED_H */ +#endif /* OSAL_OVERRIDE_SCHED_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h b/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h index efe8f9b57..d43a2a58b 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/selectLib.h @@ -35,4 +35,4 @@ /* mappings for declarations in selectLib.h */ /* ----------------------------------------- */ -#endif /* SELECTLIB_H */ +#endif /* SELECTLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/semLib.h b/src/unit-test-coverage/ut-stubs/override_inc/semLib.h index 33b7a81e6..d73febc05 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/semLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/semLib.h @@ -54,4 +54,4 @@ #define semTake OCS_semTake #define semGive OCS_semGive -#endif /* OSAL_OVERRIDE_SEMLIB_H */ +#endif /* OSAL_OVERRIDE_SEMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h b/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h index 4821f5a63..845434983 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/semaphore.h @@ -36,4 +36,4 @@ #define sem_timedwait OCS_sem_timedwait #define sem_wait OCS_sem_wait -#endif /* OSAL_OVERRIDE_SEMAPHORE_H */ +#endif /* OSAL_OVERRIDE_SEMAPHORE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h b/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h index 614e0158a..61d82bc1f 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/setjmp.h @@ -28,4 +28,4 @@ /* mappings for declarations in setjmp.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_SETJMP_H */ +#endif /* OSAL_OVERRIDE_SETJMP_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h b/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h index 07fe614ee..ce6e4d61c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/shellLib.h @@ -30,4 +30,4 @@ /* ----------------------------------------- */ #define shellGenericInit OCS_shellGenericInit -#endif /* OSAL_OVERRIDE_SHELLLIB_H */ +#endif /* OSAL_OVERRIDE_SHELLLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/signal.h b/src/unit-test-coverage/ut-stubs/override_inc/signal.h index ae34e7973..ec1b31caf 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/signal.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/signal.h @@ -56,4 +56,4 @@ #define sigsuspend OCS_sigsuspend #define sigwait OCS_sigwait -#endif /* OSAL_OVERRIDE_SIGNAL_H */ +#endif /* OSAL_OVERRIDE_SIGNAL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stat.h b/src/unit-test-coverage/ut-stubs/override_inc/stat.h index 250dfd2b6..e0cabeafd 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stat.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stat.h @@ -40,4 +40,4 @@ #define statvfs OCS_statvfs #define statfs OCS_statvfs -#endif /* OSAL_OVERRIDE_STAT_H */ +#endif /* OSAL_OVERRIDE_STAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h b/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h index bff62d729..187c73683 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdarg.h @@ -32,4 +32,4 @@ #define va_start(ap, last) OCS_va_start(ap, last) #define va_end(ap) OCS_va_end(ap) -#endif /* OSAL_OVERRIDE_STDARG_H */ +#endif /* OSAL_OVERRIDE_STDARG_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdio.h b/src/unit-test-coverage/ut-stubs/override_inc/stdio.h index 659f7056f..e09a93696 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdio.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdio.h @@ -45,4 +45,4 @@ #define stdout OCS_stdout #define stderr OCS_stderr -#endif /* OSAL_OVERRIDE_STDIO_H */ +#endif /* OSAL_OVERRIDE_STDIO_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h b/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h index bf1d54f40..9ea6f219b 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/stdlib.h @@ -37,4 +37,4 @@ #define malloc OCS_malloc #define free OCS_free -#endif /* OSAL_OVERRIDE_STDLIB_H */ +#endif /* OSAL_OVERRIDE_STDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/string.h b/src/unit-test-coverage/ut-stubs/override_inc/string.h index b5d14fcbb..e4b83f152 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/string.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/string.h @@ -41,4 +41,4 @@ #define strncat OCS_strncat #define strerror OCS_strerror -#endif /* OSAL_OVERRIDE_STRING_H */ +#endif /* OSAL_OVERRIDE_STRING_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/strings.h b/src/unit-test-coverage/ut-stubs/override_inc/strings.h index 226344f2d..1d7142f31 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/strings.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/strings.h @@ -28,4 +28,4 @@ /* mappings for declarations in strings.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_STRINGS_H */ +#endif /* OSAL_OVERRIDE_STRINGS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/symLib.h b/src/unit-test-coverage/ut-stubs/override_inc/symLib.h index 66ede2c2e..1adcd6adf 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/symLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/symLib.h @@ -51,4 +51,4 @@ #define symEach OCS_symEach #define symFind OCS_symFind -#endif /* SYMLIB_H */ +#endif /* SYMLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h index e510b4c15..8038d86b4 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/ioctl.h @@ -30,4 +30,4 @@ #define ioctl OCS_ioctl -#endif /* OSAL_OVERRIDE_SYS_IOCTL_H */ +#endif /* OSAL_OVERRIDE_SYS_IOCTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h index e94760c2d..7d99f3b4c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/ipc.h @@ -28,4 +28,4 @@ /* mappings for declarations in sys/ipc.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_SYS_IPC_H */ +#endif /* OSAL_OVERRIDE_SYS_IPC_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h index f4d9e40bb..ef3c670f8 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/mman.h @@ -38,4 +38,4 @@ #define mmap OCS_mmap #define munmap OCS_munmap -#endif /* OSAL_OVERRIDE_SYS_MMAN_H */ +#endif /* OSAL_OVERRIDE_SYS_MMAN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h index 8f7809ef1..4a2ddb46f 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/select.h @@ -50,4 +50,4 @@ #define FD_CLR OCS_FD_CLR #define FD_ZERO OCS_FD_ZERO -#endif /* SELECT_H */ +#endif /* SELECT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h index d2014f1f9..0304c264e 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/signal.h @@ -25,4 +25,4 @@ /* alias to signal.h */ #include -#endif /* OSAL_OVERRIDE_SYS_SIGNAL_H */ +#endif /* OSAL_OVERRIDE_SYS_SIGNAL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h index 50c5bf346..11128a920 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/socket.h @@ -39,4 +39,4 @@ #define setsockopt OCS_setsockopt #define socket OCS_socket -#endif /* OSAL_OVERRIDE_SYS_SOCKET_H */ +#endif /* OSAL_OVERRIDE_SYS_SOCKET_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h index 575ad693a..b6f5d80ce 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/stat.h @@ -25,4 +25,4 @@ /* alias to stat.h */ #include -#endif /* OSAL_OVERRIDE_SYS_STAT_H */ +#endif /* OSAL_OVERRIDE_SYS_STAT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h index a024f1700..7d53a30e2 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/statvfs.h @@ -25,4 +25,4 @@ /* alias to stat.h */ #include -#endif /* OSAL_OVERRIDE_SYS_STATVFS_H */ +#endif /* OSAL_OVERRIDE_SYS_STATVFS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h index 5c25ab547..111336de4 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/time.h @@ -29,4 +29,4 @@ /* mappings for declarations in sys/time.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_SYS_TIME_H */ +#endif /* OSAL_OVERRIDE_SYS_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h index fe9f01c68..052399273 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/times.h @@ -29,4 +29,4 @@ /* mappings for declarations in sys/times.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_SYS_TIMES_H */ +#endif /* OSAL_OVERRIDE_SYS_TIMES_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h index a6e83d510..c1cd599f8 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/types.h @@ -34,4 +34,4 @@ #define gid_t OCS_gid_t #define uid_t OCS_uid_t -#endif /* OSAL_OVERRIDE_SYS_TYPES_H */ +#endif /* OSAL_OVERRIDE_SYS_TYPES_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h index 57540467e..9addd5013 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/un.h @@ -28,4 +28,4 @@ /* mappings for declarations in sys/un.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_SYS_UN_H */ +#endif /* OSAL_OVERRIDE_SYS_UN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h b/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h index 497834d24..1d410f5e3 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sys/wait.h @@ -28,4 +28,4 @@ /* mappings for declarations in sys/wait.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_SYS_WAIT_H */ +#endif /* OSAL_OVERRIDE_SYS_WAIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h b/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h index b26213cc7..145041eb7 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/sysLib.h @@ -30,4 +30,4 @@ /* ----------------------------------------- */ #define sysClkRateGet OCS_sysClkRateGet -#endif /* OSAL_OVERRIDE_SYSLIB_H */ +#endif /* OSAL_OVERRIDE_SYSLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h b/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h index dcf88983f..0b939ea80 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/taskLib.h @@ -53,4 +53,4 @@ #define taskInit OCS_taskInit #define taskTcb OCS_taskTcb -#endif /* OSAL_OVERRIDE_TASKLIB_H */ +#endif /* OSAL_OVERRIDE_TASKLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h b/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h index 1e89cb3b3..46f3f7a4a 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/taskVarLib.h @@ -31,4 +31,4 @@ #define taskVarAdd OCS_taskVarAdd -#endif /* OSAL_OVERRIDE_TASKVARLIB_H */ +#endif /* OSAL_OVERRIDE_TASKVARLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/termios.h b/src/unit-test-coverage/ut-stubs/override_inc/termios.h index 8713f77a0..ab4887d2c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/termios.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/termios.h @@ -28,4 +28,4 @@ /* mappings for declarations in termios.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_TERMIOS_H */ +#endif /* OSAL_OVERRIDE_TERMIOS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h b/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h index 419f4118c..87bd41129 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/tgmath.h @@ -28,4 +28,4 @@ /* mappings for declarations in tgmath.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_TGMATH_H */ +#endif /* OSAL_OVERRIDE_TGMATH_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/time.h b/src/unit-test-coverage/ut-stubs/override_inc/time.h index d5d4cd298..9cfcbe605 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/time.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/time.h @@ -51,4 +51,4 @@ #define timer_settime OCS_timer_settime #define timer_connect OCS_timer_connect -#endif /* OSAL_OVERRIDE_TIME_H */ +#endif /* OSAL_OVERRIDE_TIME_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/timers.h b/src/unit-test-coverage/ut-stubs/override_inc/timers.h index 843fcdbff..b6c6012ae 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/timers.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/timers.h @@ -29,4 +29,4 @@ * Note: this is just an alias for time.h */ -#endif /* OSAL_OVERRIDE_TIMERS_H */ +#endif /* OSAL_OVERRIDE_TIMERS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h b/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h index 93d0c4039..c1d9c6768 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/ulimit.h @@ -29,4 +29,4 @@ /* ----------------------------------------- */ #define ulimit OCS_ulimit -#endif /* OSAL_OVERRIDE_ULIMIT_H */ +#endif /* OSAL_OVERRIDE_ULIMIT_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/unistd.h b/src/unit-test-coverage/ut-stubs/override_inc/unistd.h index a4c334d25..31d3afeb6 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/unistd.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/unistd.h @@ -47,4 +47,4 @@ #define sysconf OCS_sysconf #define write OCS_write -#endif /* OSAL_OVERRIDE_UNISTD_H */ +#endif /* OSAL_OVERRIDE_UNISTD_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h b/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h index 29a5f4546..5076192cf 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/unldLib.h @@ -31,4 +31,4 @@ /* ----------------------------------------- */ #define unldByModuleId OCS_unldByModuleId -#endif /* OSAL_OVERRIDE_UNLDLIB_H */ +#endif /* OSAL_OVERRIDE_UNLDLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h b/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h index 3ff95193c..21f4b9104 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/usrLib.h @@ -29,4 +29,4 @@ /* mappings for declarations in usrLib.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_USRLIB_H */ +#endif /* OSAL_OVERRIDE_USRLIB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/version.h b/src/unit-test-coverage/ut-stubs/override_inc/version.h index f9c4cc62f..4ccf55a6c 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/version.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/version.h @@ -28,4 +28,4 @@ /* mappings for declarations in version.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_VERSION_H */ +#endif /* OSAL_OVERRIDE_VERSION_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h b/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h index 2fd8fe4f3..0f36e6510 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/vxWorks.h @@ -53,4 +53,4 @@ #define _Vx_usr_arg_t OCS_Vx_usr_arg_t -#endif /* VXWORKS_H */ +#endif /* VXWORKS_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/wchar.h b/src/unit-test-coverage/ut-stubs/override_inc/wchar.h index 253f6b37e..9f0d251eb 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/wchar.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/wchar.h @@ -28,4 +28,4 @@ /* mappings for declarations in wchar.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_WCHAR_H */ +#endif /* OSAL_OVERRIDE_WCHAR_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/wctype.h b/src/unit-test-coverage/ut-stubs/override_inc/wctype.h index 5718491ec..abcec3509 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/wctype.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/wctype.h @@ -28,4 +28,4 @@ /* mappings for declarations in wctype.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_WCTYPE_H */ +#endif /* OSAL_OVERRIDE_WCTYPE_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h b/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h index 4f8d7ca3b..39bba2a37 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/xbdBlkDev.h @@ -35,4 +35,4 @@ #define xbdBlkDevCreateSync OCS_xbdBlkDevCreateSync #define xbdBlkDevDelete OCS_xbdBlkDevDelete -#endif /* OSAL_OVERRIDE_XBDBLKDEV_H */ +#endif /* OSAL_OVERRIDE_XBDBLKDEV_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h b/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h index f5e282797..9344b0294 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/xbdRamDisk.h @@ -29,4 +29,4 @@ /* mappings for declarations in xbdRamDisk.h */ /* ----------------------------------------- */ -#endif /* OSAL_OVERRIDE_XBDRAMDISK_H */ +#endif /* OSAL_OVERRIDE_XBDRAMDISK_H */ diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c index 7c2b2ccc5..fedb8593b 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-loader-impl-stubs.c @@ -40,5 +40,6 @@ UT_DEFAULT_STUB(OS_ModuleLoad_Impl, (const OS_object_token_t *token, const char UT_DEFAULT_STUB(OS_ModuleUnload_Impl, (const OS_object_token_t *token)) UT_DEFAULT_STUB(OS_ModuleGetInfo_Impl, (const OS_object_token_t *token, OS_module_prop_t *module_prop)) UT_DEFAULT_STUB(OS_GlobalSymbolLookup_Impl, (cpuaddr * SymbolAddress, const char *SymbolName)) -UT_DEFAULT_STUB(OS_ModuleSymbolLookup_Impl, (const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName)) +UT_DEFAULT_STUB(OS_ModuleSymbolLookup_Impl, + (const OS_object_token_t *token, cpuaddr *SymbolAddress, const char *SymbolName)) UT_DEFAULT_STUB(OS_SymbolTableDump_Impl, (const char *filename, size_t size_limit)) diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c index d3eea368a..238a8831f 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-queue-impl-stubs.c @@ -40,6 +40,7 @@ UT_DEFAULT_STUB(OS_QueueCreate_Impl, (const OS_object_token_t *token, uint32 flags)) UT_DEFAULT_STUB(OS_QueueDelete_Impl, (const OS_object_token_t *token)) -UT_DEFAULT_STUB(OS_QueueGet_Impl, (const OS_object_token_t *token, void *data, size_t size, size_t *size_copied, int32 timeout)) +UT_DEFAULT_STUB(OS_QueueGet_Impl, + (const OS_object_token_t *token, void *data, size_t size, size_t *size_copied, int32 timeout)) UT_DEFAULT_STUB(OS_QueuePut_Impl, (const OS_object_token_t *token, const void *data, size_t size, uint32 flags)) UT_DEFAULT_STUB(OS_QueueGetInfo_Impl, (const OS_object_token_t *token, OS_queue_prop_t *queue_prop)) diff --git a/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c index 5f93bddfb..a97a164c9 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-dlfcn-stubs.c @@ -39,4 +39,4 @@ extern char *OCS_dlerror(void); extern void *OCS_dlopen(const char *file, int mode); extern void *OCS_dlsym(void *handle, const char *name); -#endif /* OCS_DLFCN_H */ +#endif /* OCS_DLFCN_H */ diff --git a/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c b/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c index d9112647a..ff3d15fde 100644 --- a/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/vxworks-intLib-stubs.c @@ -51,7 +51,7 @@ static void OCS_intLib_dummyfunc(void) {} OCS_VOIDFUNCPTR *OCS_INUM_TO_IVEC(unsigned int ui) { int32 Status = UT_DEFAULT_IMPL(OCS_INUM_TO_IVEC); - OCS_VOIDFUNCPTR *VecTbl; + OCS_VOIDFUNCPTR * VecTbl; static OCS_VOIDFUNCPTR DummyVec; size_t VecTblSize; diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h index 7975d296b..3e33db446 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-binsem.h @@ -48,4 +48,4 @@ extern const UT_EntryKey_t UT_StubKey_GenericSemGive; extern int32 UT_Call_OS_VxWorks_BinSemAPI_Impl_Init(void); -#endif /* UT_ADAPTOR_BINSEM_H */ +#endif /* UT_ADAPTOR_BINSEM_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h index c1c7b645d..75dd24a0a 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-common.h @@ -55,4 +55,4 @@ extern int32 OS_VxWorks_GenericSemGive(OCS_SEM_ID vxid); */ extern const UT_EntryKey_t UT_StubKey_OS_VxWorks_TableMutex_Init; -#endif /* UT_ADAPTOR_COMMON_H */ +#endif /* UT_ADAPTOR_COMMON_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h index 835ca465f..2d45fbafb 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-console.h @@ -44,4 +44,4 @@ extern void UT_ConsoleTest_TaskEntry(int arg); */ extern void UT_ConsoleTest_SetConsoleAsync(osal_index_t local_id, bool is_async); -#endif /* UT_ADAPTOR_CONSOLE_H */ +#endif /* UT_ADAPTOR_CONSOLE_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h index b074ce878..9e628a9ec 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-countsem.h @@ -46,4 +46,4 @@ extern size_t const UT_Ref_OS_impl_count_sem_table_SIZE; int32 UT_Call_OS_VxWorks_CountSemAPI_Impl_Init(void); -#endif /* UT_ADAPTOR_COUNTSEM_H */ +#endif /* UT_ADAPTOR_COUNTSEM_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h index 3ffb95cf4..d528b209e 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-dirs.h @@ -44,4 +44,4 @@ */ extern int32 UT_Call_OS_VxWorks_DirAPI_Impl_Init(void); -#endif /* UT_ADAPTOR_DIRS_H */ +#endif /* UT_ADAPTOR_DIRS_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h index 4bc2f7b44..a77d79ce8 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-files.h @@ -55,4 +55,4 @@ unsigned int UT_FileTest_GetSelfEGID(void); void UT_FileTest_Set_Selectable(osal_index_t local_id, bool is_selectable); -#endif /* UT_ADAPTOR_FILES_H */ +#endif /* UT_ADAPTOR_FILES_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h index 5f6ec4f51..b82f90ca0 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filesys.h @@ -36,4 +36,4 @@ extern size_t const UT_Ref_OS_impl_filesys_table_SIZE; void UT_FileSysTest_SetupFileSysEntry(osal_index_t id, OCS_BLK_DEV *blkdev, OCS_device_t xbddev, uint32 MaxParts); -#endif /* UT_ADAPTOR_FILESYS_H */ +#endif /* UT_ADAPTOR_FILESYS_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h index 4b4e00172..3881fde0e 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-filetable-stub.h @@ -34,4 +34,4 @@ extern void *const UT_FileTableTest_OS_impl_filehandle_table; extern size_t const UT_FileTableTest_OS_impl_filehandle_table_SIZE; -#endif /* UT_ADAPTOR_FILETABLE_STUB_H */ +#endif /* UT_ADAPTOR_FILETABLE_STUB_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h index b2daaa36a..69117f85e 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-idmap.h @@ -42,4 +42,4 @@ int32 UT_Call_OS_VxWorks_TableMutex_Init(osal_objtype_t idtype); void UT_IdMapTest_SetImplTableMutex(osal_objtype_t idtype, OCS_SEM_ID vxid); -#endif /* UT_ADAPTOR_IDMAP_H */ +#endif /* UT_ADAPTOR_IDMAP_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h index 4e04fb3e3..2d5a11827 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-loader.h @@ -38,4 +38,4 @@ extern size_t const UT_Ref_OS_impl_module_table_SIZE; extern int32 UT_Call_OS_VxWorks_ModuleAPI_Impl_Init(void); -#endif /* UT_ADAPTOR_LOADER_H */ +#endif /* UT_ADAPTOR_LOADER_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h index 52485d7a4..a4ed0f0ac 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-mutex.h @@ -46,4 +46,4 @@ extern size_t const UT_Ref_OS_impl_mutex_table_SIZE; int32 UT_Call_OS_VxWorks_MutexAPI_Impl_Init(void); -#endif /* UT_ADAPTOR_MUTEX_H */ +#endif /* UT_ADAPTOR_MUTEX_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h index 4e0cd2360..e29935dc5 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-queues.h @@ -45,4 +45,4 @@ extern size_t const UT_Ref_OS_impl_queue_table_SIZE; int32 UT_Call_OS_VxWorks_QueueAPI_Impl_Init(void); -#endif /* UT_ADAPTOR_QUEUES_H */ +#endif /* UT_ADAPTOR_QUEUES_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h index 01d3d86db..9e8f1a32f 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-symtab.h @@ -32,4 +32,4 @@ int32 UT_SymTabTest_CallIteratorFunc(const char *name, void *val, size_t TestSize, size_t SizeLimit); -#endif /* UT_ADAPTOR_SYMTAB_H */ +#endif /* UT_ADAPTOR_SYMTAB_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h index df8114f4a..68a4894f5 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-tasks.h @@ -48,4 +48,4 @@ void UT_TaskTest_SetImplTaskId(osal_index_t local_id, OCS_TASK_ID TaskI int UT_TaskTest_CallEntryPoint(osal_id_t arg); OCS_WIND_TCB *UT_TaskTest_GetTaskTcb(osal_index_t local_id); -#endif /* UT_ADAPTOR_TASKS_H */ +#endif /* UT_ADAPTOR_TASKS_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h index 6581b0329..a377dd541 100644 --- a/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h +++ b/src/unit-test-coverage/vxworks/adaptors/inc/ut-adaptor-timebase.h @@ -62,4 +62,4 @@ bool UT_TimeBaseTest_CheckTimeBaseErrorState(osal_index_t local_id); /* Invoke the internal UsecToTimespec API */ void UT_TimeBaseTest_UsecToTimespec(uint32 usecs, struct OCS_timespec *time_spec); -#endif /* UT_ADAPTOR_TIMEBASE_H */ +#endif /* UT_ADAPTOR_TIMEBASE_H */ diff --git a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c index 766326414..392b5cee0 100644 --- a/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c +++ b/src/unit-test-coverage/vxworks/adaptors/src/ut-adaptor-dirtable-stub.c @@ -33,4 +33,3 @@ #include OS_impl_dir_internal_record_t OS_impl_dir_table[OS_MAX_NUM_OPEN_DIRS]; - diff --git a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h index 334ebe41c..ac41fa602 100644 --- a/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h +++ b/src/unit-test-coverage/vxworks/src/os-vxworks-coveragetest.h @@ -71,4 +71,4 @@ void Osapi_Test_Setup(void); void Osapi_Test_Teardown(void); -#endif /* OS_VXWORKS_COVERAGETEST_H */ +#endif /* OS_VXWORKS_COVERAGETEST_H */ diff --git a/src/unit-tests/inc/ut_os_support.h b/src/unit-tests/inc/ut_os_support.h index ebdf0a974..ff7c9144e 100644 --- a/src/unit-tests/inc/ut_os_support.h +++ b/src/unit-tests/inc/ut_os_support.h @@ -135,7 +135,7 @@ static inline bool UtOsalImplemented(int32 Fn, const char *File, uint32 Line) /*--------------------------------------------------------------------------------*/ -#endif /* UT_OS_SUPPORT_H */ +#endif /* UT_OS_SUPPORT_H */ /*================================================================================* ** End of File: ut_os_support.h diff --git a/src/unit-tests/oscore-test/ut_oscore_binsem_test.h b/src/unit-tests/oscore-test/ut_oscore_binsem_test.h index 6aa311fe0..081a87d3a 100644 --- a/src/unit-tests/oscore-test/ut_oscore_binsem_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_binsem_test.h @@ -64,7 +64,7 @@ void UT_os_bin_sem_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_BINSEM_TEST_H */ +#endif /* UT_OSCORE_BINSEM_TEST_H */ /*================================================================================* ** End of File: ut_oscore_binsem_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_countsem_test.h b/src/unit-tests/oscore-test/ut_oscore_countsem_test.h index 71e9d31d6..6cad49f9c 100644 --- a/src/unit-tests/oscore-test/ut_oscore_countsem_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_countsem_test.h @@ -63,7 +63,7 @@ void UT_os_count_sem_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_COUNTSEM_TEST_H */ +#endif /* UT_OSCORE_COUNTSEM_TEST_H */ /*================================================================================* ** End of File: ut_oscore_countsem_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.c b/src/unit-tests/oscore-test/ut_oscore_misc_test.c index cb0527312..4a33644e9 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.c @@ -291,7 +291,7 @@ void UT_os_getlocaltime_test() { UtPrintf("OS_GetLocalTime() - #3 Nominal "); UtPrintf("[Expecting output after API call to increase over time: %ld.%ld]\n", - (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); + (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); OS_TaskDelay(20); OS_GetLocalTime(&time_struct); @@ -380,7 +380,7 @@ void UT_os_setlocaltime_test() { UtPrintf("OS_SetLocalTime() - #3 Nominal "); UtPrintf("[Expecting output before API call to increase over time: %ld.%ld]\n", - (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); + (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); OS_TaskDelay(20); OS_GetLocalTime(&time_struct); @@ -392,8 +392,8 @@ void UT_os_setlocaltime_test() res = OS_SetLocalTime(&time_struct); if (res == OS_SUCCESS) { - UtPrintf("OS_SetLocalTime() - #3 Nominal [New time set at %ld.%ld]\n", (long)OS_TimeGetTotalSeconds(time_struct), - (long)OS_TimeGetMicrosecondsPart(time_struct)); + UtPrintf("OS_SetLocalTime() - #3 Nominal [New time set at %ld.%ld]\n", + (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); res = OS_GetLocalTime(&time_struct); if (res == OS_SUCCESS) @@ -402,7 +402,7 @@ void UT_os_setlocaltime_test() { UtPrintf("OS_SetLocalTime() - #3 Nominal "); UtPrintf("[Expecting output after API call to increase over time: %ld.%ld]\n", - (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); + (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); OS_TaskDelay(20); OS_GetLocalTime(&time_struct); diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.h b/src/unit-tests/oscore-test/ut_oscore_misc_test.h index ffed19bea..4cf6fb5c5 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.h @@ -68,7 +68,7 @@ void UT_os_heapgetinfo_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_MISC_TEST_H */ +#endif /* UT_OSCORE_MISC_TEST_H */ /*================================================================================* ** End of File: ut_oscore_misc_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_mutex_test.h b/src/unit-tests/oscore-test/ut_oscore_mutex_test.h index a476ca410..50fdec19b 100644 --- a/src/unit-tests/oscore-test/ut_oscore_mutex_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_mutex_test.h @@ -62,7 +62,7 @@ void UT_os_mut_sem_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_MUTEX_TEST_H */ +#endif /* UT_OSCORE_MUTEX_TEST_H */ /*================================================================================* ** End of File: ut_oscore_mutex_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_queue_test.h b/src/unit-tests/oscore-test/ut_oscore_queue_test.h index 1499ac770..1a45d3e2e 100644 --- a/src/unit-tests/oscore-test/ut_oscore_queue_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_queue_test.h @@ -62,7 +62,7 @@ void UT_os_queue_get_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_QUEUE_TEST_H */ +#endif /* UT_OSCORE_QUEUE_TEST_H */ /*================================================================================* ** End of File: ut_oscore_queue_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_select_test.h b/src/unit-tests/oscore-test/ut_oscore_select_test.h index ab2e57c6b..467e5707a 100644 --- a/src/unit-tests/oscore-test/ut_oscore_select_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_select_test.h @@ -59,7 +59,7 @@ void UT_os_select_multi_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_SELECT_TEST_H */ +#endif /* UT_OSCORE_SELECT_TEST_H */ /*================================================================================* ** End of File: ut_oscore_select_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_task_test.c b/src/unit-tests/oscore-test/ut_oscore_task_test.c index ff53e9f56..41dd84e80 100644 --- a/src/unit-tests/oscore-test/ut_oscore_task_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_task_test.c @@ -815,7 +815,7 @@ void UT_os_task_get_id_test() OS_TaskDelay(500); UtPrintf("OS_TaskGetId() - #1 Nominal [This is the expected task Id=%lx]\n", - OS_ObjectIdToInteger(g_task_ids[1])); + OS_ObjectIdToInteger(g_task_ids[1])); res = OS_TaskDelete(g_task_ids[1]); /* Won't hurt if its already deleted */ diff --git a/src/unit-tests/oscore-test/ut_oscore_task_test.h b/src/unit-tests/oscore-test/ut_oscore_task_test.h index 69425ad15..60b35ad5b 100644 --- a/src/unit-tests/oscore-test/ut_oscore_task_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_task_test.h @@ -69,7 +69,7 @@ void UT_os_task_get_id_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_TASK_TEST_H */ +#endif /* UT_OSCORE_TASK_TEST_H */ /*================================================================================* ** End of File: ut_oscore_task_test.h diff --git a/src/unit-tests/oscore-test/ut_oscore_test.h b/src/unit-tests/oscore-test/ut_oscore_test.h index 90848ac2b..2c412a6a0 100644 --- a/src/unit-tests/oscore-test/ut_oscore_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_test.h @@ -62,7 +62,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSCORE_TEST_H */ +#endif /* UT_OSCORE_TEST_H */ /*================================================================================* ** End of File: ut_oscore_test_posix.h diff --git a/src/unit-tests/osfile-test/ut_osfile_dirio_test.h b/src/unit-tests/osfile-test/ut_osfile_dirio_test.h index 62cca6385..04ff11525 100644 --- a/src/unit-tests/osfile-test/ut_osfile_dirio_test.h +++ b/src/unit-tests/osfile-test/ut_osfile_dirio_test.h @@ -64,7 +64,7 @@ void UT_os_removedir_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSFILE_DIRIO_H */ +#endif /* UT_OSFILE_DIRIO_H */ /*================================================================================* ** End of File: ut_osfile_dirio.h diff --git a/src/unit-tests/osfile-test/ut_osfile_fileio_test.h b/src/unit-tests/osfile-test/ut_osfile_fileio_test.h index c605f912b..6f149a3ca 100644 --- a/src/unit-tests/osfile-test/ut_osfile_fileio_test.h +++ b/src/unit-tests/osfile-test/ut_osfile_fileio_test.h @@ -80,7 +80,7 @@ void UT_os_closefilebyname_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSFILE_FILEIO_H */ +#endif /* UT_OSFILE_FILEIO_H */ /*================================================================================* ** End of File: ut_osfile_fileio.h diff --git a/src/unit-tests/osfile-test/ut_osfile_test.h b/src/unit-tests/osfile-test/ut_osfile_test.h index ab4c9c624..53459e6e4 100644 --- a/src/unit-tests/osfile-test/ut_osfile_test.h +++ b/src/unit-tests/osfile-test/ut_osfile_test.h @@ -57,7 +57,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSFILE_TEST_H */ +#endif /* UT_OSFILE_TEST_H */ /*================================================================================* ** End of File: ut_osfile_test.h diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c index e9938c84a..dd28ae4ee 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c @@ -1053,7 +1053,6 @@ void UT_os_checkfs_test() return; } - /*--------------------------------------------------------------------------------* ** Syntax: int32 OS_fsstatvolume(const char *name) ** Purpose: Returns the number of blocks free in a the file system diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h index b9141a773..b2573eb66 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.h @@ -73,7 +73,7 @@ void UT_os_fsstatvolume_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSFILESYS_DISKIO_TEST_H */ +#endif /* UT_OSFILESYS_DISKIO_TEST_H */ /*================================================================================* ** End of File: ut_osfilesys_diskio_test.h diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_test.h b/src/unit-tests/osfilesys-test/ut_osfilesys_test.h index d80f62bdc..7e78dbd91 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_test.h +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_test.h @@ -56,7 +56,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSFILESYS_TEST_H */ +#endif /* UT_OSFILESYS_TEST_H */ /*================================================================================* ** End of File: ut_osfilesys_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_module_test.h b/src/unit-tests/osloader-test/ut_osloader_module_test.h index c63c923f5..70057ea10 100644 --- a/src/unit-tests/osloader-test/ut_osloader_module_test.h +++ b/src/unit-tests/osloader-test/ut_osloader_module_test.h @@ -59,7 +59,7 @@ void UT_os_module_info_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSLOADER_MODULE_TEST_H */ +#endif /* UT_OSLOADER_MODULE_TEST_H */ /*================================================================================* ** End of File: ut_osloader_module_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_symtable_test.c b/src/unit-tests/osloader-test/ut_osloader_symtable_test.c index 1ccf5a5c4..b81ddb1ec 100644 --- a/src/unit-tests/osloader-test/ut_osloader_symtable_test.c +++ b/src/unit-tests/osloader-test/ut_osloader_symtable_test.c @@ -213,7 +213,6 @@ void UT_os_module_symbol_lookup_test() return; } - /*--------------------------------------------------------------------------------* ** Syntax: OS_SymbolTableDump ** Purpose: Dumps the system symbol table to the given filename diff --git a/src/unit-tests/osloader-test/ut_osloader_symtable_test.h b/src/unit-tests/osloader-test/ut_osloader_symtable_test.h index de756c85e..5e572362a 100644 --- a/src/unit-tests/osloader-test/ut_osloader_symtable_test.h +++ b/src/unit-tests/osloader-test/ut_osloader_symtable_test.h @@ -59,7 +59,7 @@ void UT_os_symbol_table_dump_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSLOADER_SYMTABLE_TEST_H */ +#endif /* UT_OSLOADER_SYMTABLE_TEST_H */ /*================================================================================* ** End of File: ut_osloader_symtable_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_test.h b/src/unit-tests/osloader-test/ut_osloader_test.h index 43941ef39..61c0175d6 100644 --- a/src/unit-tests/osloader-test/ut_osloader_test.h +++ b/src/unit-tests/osloader-test/ut_osloader_test.h @@ -57,7 +57,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSLOADER_TEST_H */ +#endif /* UT_OSLOADER_TEST_H */ /*================================================================================* ** End of File: ut_osloader_test.h diff --git a/src/unit-tests/osloader-test/ut_osloader_test_platforms.h b/src/unit-tests/osloader-test/ut_osloader_test_platforms.h index 49aadbe12..0e62c9206 100644 --- a/src/unit-tests/osloader-test/ut_osloader_test_platforms.h +++ b/src/unit-tests/osloader-test/ut_osloader_test_platforms.h @@ -63,7 +63,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSLOADER_TEST_PLATFORMS_H */ +#endif /* UT_OSLOADER_TEST_PLATFORMS_H */ /*================================================================================* ** End of File: ut_osloader_test_platforms.h diff --git a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h index aeb22d05f..038aff40f 100644 --- a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h +++ b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.h @@ -58,7 +58,7 @@ void UT_os_networkgethostname_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSNETWORK_MISC_TEST_H */ +#endif /* UT_OSNETWORK_MISC_TEST_H */ /*================================================================================* ** End of File: ut_osnetwork_misc_test.h diff --git a/src/unit-tests/osnetwork-test/ut_osnetwork_test.h b/src/unit-tests/osnetwork-test/ut_osnetwork_test.h index 8a08d2767..90a29fc72 100644 --- a/src/unit-tests/osnetwork-test/ut_osnetwork_test.h +++ b/src/unit-tests/osnetwork-test/ut_osnetwork_test.h @@ -56,7 +56,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSNETWORK_TEST_H */ +#endif /* UT_OSNETWORK_TEST_H */ /*================================================================================* ** End of File: ut_osnetwork_test.h diff --git a/src/unit-tests/ostimer-test/ut_ostimer_test.h b/src/unit-tests/ostimer-test/ut_ostimer_test.h index e5f890386..126611d5c 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_test.h +++ b/src/unit-tests/ostimer-test/ut_ostimer_test.h @@ -56,7 +56,7 @@ /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSTIMER_TEST_H */ +#endif /* UT_OSTIMER_TEST_H */ /*================================================================================* ** End of File: ut_ostimer_test.h diff --git a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h index 9a1501906..eec6a7e94 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h +++ b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.h @@ -64,7 +64,7 @@ void UT_os_timergetinfo_test(void); /*--------------------------------------------------------------------------------*/ -#endif /* UT_OSTIMER_TIMERIO_TEST_H */ +#endif /* UT_OSTIMER_TIMERIO_TEST_H */ /*================================================================================* ** End of File: ut_ostimer_timerio_test.h diff --git a/src/ut-stubs/osapi-utstub-filesys.c b/src/ut-stubs/osapi-utstub-filesys.c index 2f40682a2..57393fc7a 100644 --- a/src/ut-stubs/osapi-utstub-filesys.c +++ b/src/ut-stubs/osapi-utstub-filesys.c @@ -153,7 +153,7 @@ int32 OS_unmount(const char *mountpoint) return status; } -#ifndef OSAL_OMIT_DEPRECATED +#ifndef OSAL_OMIT_DEPRECATED /***************************************************************************** * diff --git a/ut_assert/inc/utassert.h b/ut_assert/inc/utassert.h index 08969e3bb..8bf875cf3 100644 --- a/ut_assert/inc/utassert.h +++ b/ut_assert/inc/utassert.h @@ -90,50 +90,49 @@ typedef struct #define UtAssert_True(Expression, ...) UtAssertEx(Expression, UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Evaluates a expression as either true or false. true means the test passed, false means the test failed. */ -#define UtAssert_Bool(Expression, ...) \ - UtAssertEx(Expression, UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_Bool(Expression, ...) UtAssertEx(Expression, UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Asserts a test failure */ #define UtAssert_Failed(...) UtAssertEx(false, UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares two integers and determines if they are equal within a specified absolute tolerance. */ -#define UtAssert_IntegerCmpAbs(x, y, Tolerance, ...) \ - UtAssertEx((abs((x) - (y)) <= (Tolerance)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_IntegerCmpAbs(x, y, Tolerance, ...) \ + UtAssertEx((abs((x) - (y)) <= (Tolerance)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares two floating point numbers and determines if they are equal within a specified absolute tolerance. */ -#define UtAssert_DoubleCmpAbs(x, y, Tolerance, ...) \ - UtAssertEx((fabs((x) - (y)) <= (Tolerance)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_DoubleCmpAbs(x, y, Tolerance, ...) \ + UtAssertEx((fabs((x) - (y)) <= (Tolerance)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares two floating point numbers and determines if they are equal within a specified relative tolerance. */ -#define UtAssert_DoubleCmpRel(x, y, Ratio, ...) \ - UtAssertEx((fabs((x) - (y))/(x) <= (Ratio)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_DoubleCmpRel(x, y, Ratio, ...) \ + UtAssertEx((fabs((x) - (y)) / (x) <= (Ratio)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares two strings and determines if they are equal. */ -#define UtAssert_StrCmp(String1, String2, ...) \ - UtAssertEx((strcmp(String1, String2) == 0), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_StrCmp(String1, String2, ...) \ + UtAssertEx((strcmp(String1, String2) == 0), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares at most Length characters of two strings and determines if they are equal. */ -#define UtAssert_StrnCmp(String1, String2, Length, ...) \ - UtAssertEx((strncmp(String1, String2, Length) == 0), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_StrnCmp(String1, String2, Length, ...) \ + UtAssertEx((strncmp(String1, String2, Length) == 0), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares two regions of memory and determines if they are equal. */ -#define UtAssert_MemCmp(Memory1, Memory2, Length, ...) \ - UtAssertEx((memcmp(Memory1, Memory2, Length) == 0), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_MemCmp(Memory1, Memory2, Length, ...) \ + UtAssertEx((memcmp(Memory1, Memory2, Length) == 0), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares a region of memory to a static pattern and determines if they are equal. Note: Use UtMemSet to * fill a region of memory with a static pattern. */ -#define UtAssert_MemCmpValue(Memory, Value, Length, ...) \ - UtAssertEx((UtMemCmpValue(Memory, Value, Length)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_MemCmpValue(Memory, Value, Length, ...) \ + UtAssertEx((UtMemCmpValue(Memory, Value, Length)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares a region of memory to a byte count pattern and determines if they are equal. Note: Use UtMemFill to * fill a region of memory with a byte count pattern. */ -#define UtAssert_MemCmpCount(Memory, Length, ...) \ - UtAssertEx((UtMemCmpCount(Memory, Length)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_MemCmpCount(Memory, Length, ...) \ + UtAssertEx((UtMemCmpCount(Memory, Length)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* Compares a region of memory with the contents of a binary file and determines if they are equal. Note: Use * UtMem2BinFile to copy a region of memory to a binary file. */ -#define UtAssert_Mem2BinFileCmp(Memory, Filename, ...) \ - UtAssertEx((UtMem2BinFileCmp(Memory, Filename)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) +#define UtAssert_Mem2BinFileCmp(Memory, Filename, ...) \ + UtAssertEx((UtMem2BinFileCmp(Memory, Filename)), UtAssert_GetContext(), __FILE__, __LINE__, __VA_ARGS__) /* A wrapper around UtAssertEx that allows the user to specify the failure type and a more descriptive message */ #define UtAssert_Type(Type, Expression, ...) \ diff --git a/ut_assert/inc/utbsp.h b/ut_assert/inc/utbsp.h index 109e94ce6..27de86013 100644 --- a/ut_assert/inc/utbsp.h +++ b/ut_assert/inc/utbsp.h @@ -100,4 +100,4 @@ void UT_BSP_DoText(uint8 MessageType, const char *OutputMessage); */ void UT_BSP_EndTest(const UtAssert_TestCounter_t *TestCounters); -#endif /* UTBSP_H */ +#endif /* UTBSP_H */ diff --git a/ut_assert/inc/utstubs.h b/ut_assert/inc/utstubs.h index 75fd021f5..ad7601218 100644 --- a/ut_assert/inc/utstubs.h +++ b/ut_assert/inc/utstubs.h @@ -209,7 +209,7 @@ void UT_ClearDefaultReturnValue(UT_EntryKey_t FuncKey); * * \param FuncKey The stub function to add the return code to. * \param Value Arbitrary failure mode value (may or may not be used by the stub) - * + * * @deprecated replaced by UT_SetDefaultReturnValue */ void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value); @@ -220,7 +220,7 @@ void UT_SetForceFail(UT_EntryKey_t FuncKey, int32 Value); * This undoes the action of UT_SetDefaultReturnValue() * * \param FuncKey The stub function entry to clear. - * + * * @deprecated replaced by UT_ClearDefaultReturnValue */ void UT_ClearForceFail(UT_EntryKey_t FuncKey); @@ -540,4 +540,4 @@ int32 UT_DefaultStubImpl(const char *FunctionName, UT_EntryKey_t FuncKey, int32 return UT_DEFAULT_IMPL(FuncName); \ } -#endif /* UTSTUBS_H */ +#endif /* UTSTUBS_H */ diff --git a/ut_assert/src/utbsp.c b/ut_assert/src/utbsp.c index 11b508efb..3de0efae4 100644 --- a/ut_assert/src/utbsp.c +++ b/ut_assert/src/utbsp.c @@ -133,7 +133,7 @@ void UT_BSP_DoText(uint8 MessageType, const char *OutputMessage) break; case UTASSERT_CASETYPE_TTF: TermModeBits = OS_BSP_CONSOLEMODE_HIGHLIGHT | OS_BSP_CONSOLEMODE_RED | OS_BSP_CONSOLEMODE_BLUE; - Prefix = "TTF"; + Prefix = "TTF"; break; case UTASSERT_CASETYPE_NA: Prefix = "N/A"; diff --git a/ut_assert/src/utglobal.h b/ut_assert/src/utglobal.h index 7664a3415..cc0c08e4c 100644 --- a/ut_assert/src/utglobal.h +++ b/ut_assert/src/utglobal.h @@ -64,4 +64,4 @@ typedef struct */ extern UtAssert_Global_t UtAssert_Global; -#endif /* UTASSERT_GLOBAL_H */ +#endif /* UTASSERT_GLOBAL_H */ From fec2d91241b59ead52da974456d7a3157c1734d1 Mon Sep 17 00:00:00 2001 From: "Gerardo E. Cruz-Ortiz" <59618057+astrogeco@users.noreply.github.com> Date: Fri, 12 Feb 2021 18:32:13 -0500 Subject: [PATCH 111/111] Bump to v5.1.0-rc1+dev262 --- README.md | 22 ++++++++++++++++++++++ src/os/inc/osapi-version.h | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 04f6c960d..01a94dd59 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,28 @@ The autogenerated OSAL user's guide can be viewed at + ### Development Build: 5.1.0-rc1+dev221 - Fixes `printf` format to correctly build in RTEMS-5. diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index 5708be8ca..9923b82c3 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -30,7 +30,7 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 221 +#define OS_BUILD_NUMBER 262 #define OS_BUILD_BASELINE "v5.1.0-rc1" /*

ut2CSh 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%0D{(iJXm~>k12uG^j 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