/*! * \brief Deletes the name and its associated number from the names database. * * \param[in] name The name to be deleted. * * \return MQX_OK * \return MQX_CANNOT_CALL_FUNCTION_FROM_ISR (Function cannot be called from an * ISR.) * \return MQX_COMPONENT_DOES_NOT_EXIST (Name component is not created.) * \return MQX_INVALID_COMPONENT_BASE (Name component data is not valid.) * \return NAME_TOO_SHORT (Name is 0 length string.) * \return NAME_TOO_LONG (Name is longer than NAME_MAX_NAME_SIZE.) * \return NAME_NOT_FOUND (Name is not in the names database.) * * \warning Cannot be called from an ISR. * * \see _name_add * \see _name_create_component * \see _name_find */ _mqx_uint _name_delete ( char *name ) { /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; void *handle; _mqx_uint result; _GET_KERNEL_DATA(kernel_data); _KLOGE2(KLOG_name_delete, name); #if MQX_CHECK_ERRORS if (kernel_data->IN_ISR) { _KLOGX2(KLOG_name_delete, MQX_CANNOT_CALL_FUNCTION_FROM_ISR); return (MQX_CANNOT_CALL_FUNCTION_FROM_ISR); } /* Endif */ #endif /* MQX_CHECK_ERRORS */ handle = kernel_data->KERNEL_COMPONENTS[KERNEL_NAME_MANAGEMENT]; #if MQX_CHECK_ERRORS if (handle == NULL) { _KLOGX2(KLOG_name_delete, MQX_COMPONENT_DOES_NOT_EXIST); return (MQX_COMPONENT_DOES_NOT_EXIST); } /* Endif */ #endif /* MQX_CHECK_ERRORS */ result = _name_delete_internal(handle, name); _KLOGX2(KLOG_name_delete, result); return (result); } /* Endbody */
_mqx_uint _sem_post ( /* [IN] - The semaphore handle returned by _sem_open. */ pointer users_sem_ptr ) { /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; SEM_STRUCT_PTR sem_ptr; #if MQX_COMPONENT_DESTRUCTION SEM_COMPONENT_STRUCT_PTR sem_component_ptr; #endif SEM_CONNECTION_STRUCT_PTR new_sem_connection_ptr; SEM_CONNECTION_STRUCT_PTR sem_connection_ptr; TD_STRUCT_PTR new_td_ptr; boolean task_added = FALSE; boolean destroying_semaphore = FALSE; _GET_KERNEL_DATA(kernel_data); _KLOGE2(KLOG_sem_post, users_sem_ptr); sem_connection_ptr = (SEM_CONNECTION_STRUCT_PTR)users_sem_ptr; #if MQX_CHECK_VALIDITY if (sem_connection_ptr->VALID != SEM_VALID) { _KLOGX2(KLOG_sem_post, SEM_INVALID_SEMAPHORE_HANDLE); return(SEM_INVALID_SEMAPHORE_HANDLE); } /* Endif */ #endif sem_ptr = sem_connection_ptr->SEM_PTR; #if MQX_CHECK_ERRORS if (sem_ptr->POLICY & SEM_STRICT) { if (kernel_data->IN_ISR) { _KLOGX2(KLOG_sem_post, MQX_CANNOT_CALL_FUNCTION_FROM_ISR); return(MQX_CANNOT_CALL_FUNCTION_FROM_ISR); } /* Endif */ if (sem_connection_ptr->TD_PTR != kernel_data->ACTIVE_PTR) { /* ONLY OPENING task can use the semaphore */ _KLOGX2(KLOG_sem_post, SEM_INVALID_SEMAPHORE_HANDLE); return(SEM_INVALID_SEMAPHORE_HANDLE); } /* Endif */ if (sem_connection_ptr->POST_STATE == 0) { _KLOGX2(KLOG_sem_post, SEM_CANNOT_POST); return(SEM_CANNOT_POST); } /* Endif */ } /* Endif */ #endif _INT_DISABLE(); #if MQX_CHECK_VALIDITY if (sem_ptr->VALID != SEM_VALID) { _int_enable(); _KLOGX2(KLOG_sem_post, SEM_INVALID_SEMAPHORE); return(SEM_INVALID_SEMAPHORE); } /* Endif */ #endif if (sem_ptr->POLICY & SEM_STRICT) { #if MQX_CHECK_ERRORS if (sem_ptr->COUNT > sem_ptr->MAX_COUNT) { /* Corruption somewhere */ _int_enable(); _KLOGX2(KLOG_sem_post, SEM_INVALID_SEMAPHORE_COUNT); return(SEM_INVALID_SEMAPHORE_COUNT); } /* Endif */ #endif --sem_connection_ptr->POST_STATE; if (sem_connection_ptr->POST_STATE == 0) { _QUEUE_REMOVE(&sem_ptr->OWNING_TASKS, sem_connection_ptr); } /* Endif */ } /* Endif */ if (_QUEUE_GET_SIZE(&sem_ptr->WAITING_TASKS)) { /* Schedule a waiting task to run */ new_sem_connection_ptr = (SEM_CONNECTION_STRUCT_PTR) ((pointer)sem_ptr->WAITING_TASKS.NEXT); while (new_sem_connection_ptr != (pointer)&sem_ptr->WAITING_TASKS) { new_td_ptr = new_sem_connection_ptr->TD_PTR; if ((new_td_ptr->STATE & STATE_MASK) == SEM_BLOCKED) { _TIME_DEQUEUE(new_td_ptr, kernel_data); _TASK_READY(new_td_ptr, kernel_data); new_td_ptr->INFO = SEM_AVAILABLE; task_added = TRUE; break; } /* Endif */ new_sem_connection_ptr = (SEM_CONNECTION_STRUCT_PTR) new_sem_connection_ptr->NEXT; } /* Endwhile */ } /* Endif */ if (!task_added) { ++sem_ptr->COUNT; #if MQX_COMPONENT_DESTRUCTION if ( sem_ptr->DELAYED_DESTROY ) { if ( ( (sem_ptr->POLICY & SEM_STRICT) && (sem_ptr->COUNT == sem_ptr->MAX_COUNT) ) || ( !(sem_ptr->POLICY & SEM_STRICT) ) ) { /* Destroy the semaphore name */ sem_ptr->VALID = 0; destroying_semaphore = TRUE; } /* Endif */ } /* Endif */ #endif } /* Endif */ if (sem_connection_ptr->BOOSTED && (sem_connection_ptr->POST_STATE == 0)) { /* This task was boosted by a waiting task */ _sched_unboost_priority_internal(kernel_data->ACTIVE_PTR, sem_connection_ptr->BOOSTED); sem_connection_ptr->BOOSTED = 0; } /* Endif */ _INT_ENABLE(); /* Let higher priority task run */ _CHECK_RUN_SCHEDULER(); #if MQX_COMPONENT_DESTRUCTION if (destroying_semaphore) { sem_component_ptr = (SEM_COMPONENT_STRUCT_PTR) kernel_data->KERNEL_COMPONENTS[KERNEL_SEMAPHORES]; if (sem_component_ptr != NULL) { _name_delete_internal(sem_component_ptr->NAME_TABLE_HANDLE, sem_ptr->NAME); } /* Endif */ _mem_free(sem_ptr); } /* Endif */ #endif _KLOGX2(KLOG_sem_post, MQX_OK); return(MQX_OK); } /* Endbody */