/*! * \brief This function destroys an endpoint. * * The function destroys an endpoint on the local node and frees any buffers that may be queued. * * \param[in] endpoint Pointer to the endpoint triplet to be deleted. * * \return MCC_SUCCESS * \return MCC_ERR_ENDPOINT (the endpoint doesn't exist) * \return MCC_ERR_SEMAPHORE (semaphore handling error) * * \see mcc_create_endpoint * \see MCC_ENDPOINT */ int mcc_destroy_endpoint(MCC_ENDPOINT *endpoint) { int return_value = MCC_SUCCESS; /* Semaphore-protected section start */ return_value = mcc_get_semaphore(); if(return_value != MCC_SUCCESS) return return_value; /* Remove the endpoint data from the book-keeping structure */ return_value = mcc_remove_endpoint(*endpoint); if(return_value != MCC_SUCCESS) { mcc_release_semaphore(); return return_value; } /* Clear OS synchronization module parts associated with the endpoint to be destroyed */ mcc_clear_os_sync_for_ep(endpoint); /* Semaphore-protected section end */ return_value = mcc_release_semaphore(); if(return_value != MCC_SUCCESS) return return_value; return return_value; }
/*! * \brief This function de-initializes the Multi Core Communication subsystem for a given node. * * The function frees all resources of the node. Deletes all endpoints and frees any buffers that may have been queued there. * * \param[in] node Node number to be deinitialized. * * \return MCC_SUCCESS * \return MCC_ERR_SEMAPHORE (semaphore handling error) * * \see mcc_initialize */ int mcc_destroy(MCC_NODE node) { int i = 0, return_value; #if (MCC_OS_USED == MCC_MQX) for(i=0; i<MCC_MQX_LWEVENT_COMPONENTS_COUNT; i++) { _lwevent_destroy(&lwevent_buffer_queued[i]); } _lwevent_destroy(&lwevent_buffer_freed); #endif /* Semaphore-protected section start */ return_value = mcc_get_semaphore(); if(return_value != MCC_SUCCESS) return return_value; /* All endpoints of the particular node have to be removed from the endpoint table */ MCC_DCACHE_INVALIDATE_MLINES(&bookeeping_data->endpoint_table[0], MCC_ATTR_MAX_RECEIVE_ENDPOINTS * sizeof(MCC_ENDPOINT_MAP_ITEM)); for(i = 0; i < MCC_ATTR_MAX_RECEIVE_ENDPOINTS; i++) { if (bookeeping_data->endpoint_table[i].endpoint.node == node) { /* Remove the endpoint from the table */ mcc_remove_endpoint(bookeeping_data->endpoint_table[i].endpoint); } } /* Semaphore-protected section end */ return_value = mcc_release_semaphore(); if(return_value != MCC_SUCCESS) return return_value; /* Deinitialize synchronization module */ mcc_deinit_semaphore(MCC_SHMEM_SEMAPHORE_NUMBER); return return_value; }
/*! * \brief This function de-initializes the Multi Core Communication subsystem for a given node. * * The function frees all resources of the node. Deletes all endpoints and frees any buffers that may have been queued there. * * \param[in] node Node number to be deinitialized. * * \return MCC_SUCCESS * \return MCC_ERR_SEMAPHORE (semaphore handling error) * \return MCC_ERR_OSSYNC (OS synchronization module(s) deinitialization failed) * * \see mcc_initialize */ int mcc_destroy(MCC_NODE node) { int i = 0, return_value; /* Semaphore-protected section start */ return_value = mcc_get_semaphore(); if(return_value != MCC_SUCCESS) return return_value; /* All endpoints of the particular node have to be removed from the endpoint table */ MCC_DCACHE_INVALIDATE_MLINES(&bookeeping_data->endpoint_table[0], MCC_ATTR_MAX_RECEIVE_ENDPOINTS * sizeof(MCC_ENDPOINT_MAP_ITEM)); for(i = 0; i < MCC_ATTR_MAX_RECEIVE_ENDPOINTS; i++) { if (bookeeping_data->endpoint_table[i].endpoint.node == node) { /* Remove the endpoint from the table */ mcc_remove_endpoint(bookeeping_data->endpoint_table[i].endpoint); } } /* Semaphore-protected section end */ return_value = mcc_release_semaphore(); if(return_value != MCC_SUCCESS) return return_value; /* Deinitialize synchronization module */ mcc_deinit_semaphore(MCC_SHMEM_SEMAPHORE_NUMBER); /* De-initialize OS synchronization module(s) (for unblocking tasks waiting for new data and for unblocking tasks waiting for a free buffer */ return_value = mcc_deinit_os_sync(); if(return_value != MCC_SUCCESS) return return_value; return return_value; }
/*! * \brief This function destroys an endpoint. * * The function destroys an endpoint on the local node and frees any buffers that may be queued. * * \param[in] endpoint Pointer to the endpoint triplet to be deleted. * * \return MCC_SUCCESS * \return MCC_ERR_ENDPOINT (the endpoint doesn't exist) * \return MCC_ERR_SEMAPHORE (semaphore handling error) * * \see mcc_create_endpoint * \see MCC_ENDPOINT */ int mcc_destroy_endpoint(MCC_ENDPOINT *endpoint) { int return_value = MCC_SUCCESS; /* Semaphore-protected section start */ return_value = mcc_get_semaphore(); if(return_value != MCC_SUCCESS) return return_value; /* Add new endpoint data into the book-keeping structure */ return_value = mcc_remove_endpoint(*endpoint); if(return_value != MCC_SUCCESS) { mcc_release_semaphore(); return return_value; } /* Semaphore-protected section end */ return_value = mcc_release_semaphore(); if(return_value != MCC_SUCCESS) return return_value; return return_value; }