Loading include/kinetic_client.h +11 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,17 @@ KineticStatus KineticClient_CreateSession(KineticSessionConfig * const config, */ KineticStatus KineticClient_DestroySession(KineticSession * const session); /** * @brief Returns the reason reported in the case of the Kinetic device * terminating a session in the case of a catastrophic error occurring. * * @param session The KineticSession to query. * * @return Returns the status reported prior to termination * or KINTEIC_STATUS_SUCCESS if not terminated. */ KineticStatus KineticClient_GetTerminationStatus(KineticSession * const session); /** * @brief Executes a `NOOP` operation to test whether the Kinetic Device is operational. * Loading include/kinetic_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -192,6 +192,8 @@ typedef enum { KINETIC_STATUS_REQUEST_REJECTED, ///< No request was attempted. KINETIC_STATUS_DEVICE_NAME_REQUIRED, ///< A device name is required, but was empty KINETIC_STATUS_INVALID_LOG_TYPE, ///< The device log type specified was invalid KINETIC_STATUS_HMAC_FAILURE, ///< An HMAC validation error was detected KINTEIC_STATUS_SESSION_TERMINATED, ///< The session has been terminated by the Kinetic device KINETIC_STATUS_COUNT ///< Number of status codes in KineticStatusDescriptor } KineticStatus; Loading src/lib/kinetic_allocator.c +1 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ KineticSession* KineticAllocator_NewSession(struct bus * b, KineticSessionConfig KineticResourceWaiter_Init(&session->connectionReady); session->messageBus = b; session->socket = -1; // start with an invalid file descriptor session->terminationStatus = KINETIC_STATUS_SUCCESS; return session; } Loading src/lib/kinetic_client.c +5 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,11 @@ KineticStatus KineticClient_DestroySession(KineticSession* const session) return status; } KineticStatus KineticClient_GetTerminationStatus(KineticSession * const session) { return KineticSession_GetTerminationStatus(session); } KineticStatus KineticClient_NoOp(KineticSession* const session) { KINETIC_ASSERT(session); Loading src/lib/kinetic_controller.c +22 −39 Original line number Diff line number Diff line Loading @@ -31,32 +31,7 @@ #include <pthread.h> #include "bus.h" KineticOperation* KineticController_CreateOperation(KineticSession * const session) { if (session == NULL) { LOG0("Specified session is NULL"); return NULL; } LOGF3("--------------------------------------------------\n" "Building new operation on session @ 0x%llX", session); KineticOperation* operation = KineticAllocator_NewOperation(session); if (operation == NULL || operation->request == NULL) { return NULL; } return operation; } typedef struct { pthread_mutex_t receiveCompleteMutex; pthread_cond_t receiveComplete; bool completed; KineticStatus status; } DefaultCallbackData; static void DefaultCallback(KineticCompletionData* kinetic_data, void* client_data) STATIC void DefaultCallback(KineticCompletionData* kinetic_data, void* client_data) { DefaultCallbackData * data = client_data; pthread_mutex_lock(&data->receiveCompleteMutex); Loading @@ -66,7 +41,7 @@ static void DefaultCallback(KineticCompletionData* kinetic_data, void* client_da pthread_mutex_unlock(&data->receiveCompleteMutex); } static KineticCompletionClosure DefaultClosure(DefaultCallbackData * const data) STATIC KineticCompletionClosure DefaultClosure(DefaultCallbackData * const data) { return (KineticCompletionClosure) { .callback = DefaultCallback, Loading @@ -80,13 +55,15 @@ KineticStatus KineticController_ExecuteOperation(KineticOperation* operation, Ki KINETIC_ASSERT(operation->session != NULL); KineticStatus status = KINETIC_STATUS_INVALID; if (closure != NULL) { if (operation->session->terminationStatus != KINETIC_STATUS_SUCCESS) { return KINTEIC_STATUS_SESSION_TERMINATED; } if (closure != NULL) { operation->closure = *closure; return KineticOperation_SendRequest(operation); } else { else { DefaultCallbackData data; pthread_mutex_init(&data.receiveCompleteMutex, NULL); pthread_cond_init(&data.receiveComplete, NULL); Loading @@ -100,8 +77,9 @@ KineticStatus KineticController_ExecuteOperation(KineticOperation* operation, Ki if (status == KINETIC_STATUS_SUCCESS) { pthread_mutex_lock(&data.receiveCompleteMutex); while(data.completed == false) { pthread_cond_wait(&data.receiveComplete, &data.receiveCompleteMutex); } while(data.completed == false) { pthread_cond_wait(&data.receiveComplete, &data.receiveCompleteMutex); } status = data.status; pthread_mutex_unlock(&data.receiveCompleteMutex); } Loading @@ -117,8 +95,7 @@ KineticStatus bus_to_kinetic_status(bus_send_status_t const status) { KineticStatus res = KINETIC_STATUS_INVALID; switch(status) { switch(status) { // TODO scrutinize all these mappings case BUS_SEND_SUCCESS: res = KINETIC_STATUS_SUCCESS; Loading Loading @@ -217,10 +194,17 @@ void KineticController_HandleUnexpectedResponse(void *msg, logTag = statusTag; logAtLevel = 0; protoLogAtLevel = 0; if (response && response->command && response->command->status && response->command->status->has_code) { session->terminationStatus = KineticProtoStatusCode_to_KineticStatus(response->command->status->code); KineticSession_Disconnect(session); } } else { } else { KineticLogger_LogTimestamp(0, "WARNING: Received unexpected response!"); logTag = unexpectedTag; logAtLevel = 0; Loading Loading @@ -279,8 +263,7 @@ void KineticController_HandleResult(bus_msg_result_t *res, void *udata) KineticLogger_LogHeader(3, &response->header); KineticLogger_LogProtobuf(3, response->proto); } else { else { // pull out bus error? LOGF0("Error receiving response, got message bus error: %s", bus_error_string(res->status)); if (res->status == BUS_SEND_RX_TIMEOUT) { Loading Loading
include/kinetic_client.h +11 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,17 @@ KineticStatus KineticClient_CreateSession(KineticSessionConfig * const config, */ KineticStatus KineticClient_DestroySession(KineticSession * const session); /** * @brief Returns the reason reported in the case of the Kinetic device * terminating a session in the case of a catastrophic error occurring. * * @param session The KineticSession to query. * * @return Returns the status reported prior to termination * or KINTEIC_STATUS_SUCCESS if not terminated. */ KineticStatus KineticClient_GetTerminationStatus(KineticSession * const session); /** * @brief Executes a `NOOP` operation to test whether the Kinetic Device is operational. * Loading
include/kinetic_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -192,6 +192,8 @@ typedef enum { KINETIC_STATUS_REQUEST_REJECTED, ///< No request was attempted. KINETIC_STATUS_DEVICE_NAME_REQUIRED, ///< A device name is required, but was empty KINETIC_STATUS_INVALID_LOG_TYPE, ///< The device log type specified was invalid KINETIC_STATUS_HMAC_FAILURE, ///< An HMAC validation error was detected KINTEIC_STATUS_SESSION_TERMINATED, ///< The session has been terminated by the Kinetic device KINETIC_STATUS_COUNT ///< Number of status codes in KineticStatusDescriptor } KineticStatus; Loading
src/lib/kinetic_allocator.c +1 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ KineticSession* KineticAllocator_NewSession(struct bus * b, KineticSessionConfig KineticResourceWaiter_Init(&session->connectionReady); session->messageBus = b; session->socket = -1; // start with an invalid file descriptor session->terminationStatus = KINETIC_STATUS_SUCCESS; return session; } Loading
src/lib/kinetic_client.c +5 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,11 @@ KineticStatus KineticClient_DestroySession(KineticSession* const session) return status; } KineticStatus KineticClient_GetTerminationStatus(KineticSession * const session) { return KineticSession_GetTerminationStatus(session); } KineticStatus KineticClient_NoOp(KineticSession* const session) { KINETIC_ASSERT(session); Loading
src/lib/kinetic_controller.c +22 −39 Original line number Diff line number Diff line Loading @@ -31,32 +31,7 @@ #include <pthread.h> #include "bus.h" KineticOperation* KineticController_CreateOperation(KineticSession * const session) { if (session == NULL) { LOG0("Specified session is NULL"); return NULL; } LOGF3("--------------------------------------------------\n" "Building new operation on session @ 0x%llX", session); KineticOperation* operation = KineticAllocator_NewOperation(session); if (operation == NULL || operation->request == NULL) { return NULL; } return operation; } typedef struct { pthread_mutex_t receiveCompleteMutex; pthread_cond_t receiveComplete; bool completed; KineticStatus status; } DefaultCallbackData; static void DefaultCallback(KineticCompletionData* kinetic_data, void* client_data) STATIC void DefaultCallback(KineticCompletionData* kinetic_data, void* client_data) { DefaultCallbackData * data = client_data; pthread_mutex_lock(&data->receiveCompleteMutex); Loading @@ -66,7 +41,7 @@ static void DefaultCallback(KineticCompletionData* kinetic_data, void* client_da pthread_mutex_unlock(&data->receiveCompleteMutex); } static KineticCompletionClosure DefaultClosure(DefaultCallbackData * const data) STATIC KineticCompletionClosure DefaultClosure(DefaultCallbackData * const data) { return (KineticCompletionClosure) { .callback = DefaultCallback, Loading @@ -80,13 +55,15 @@ KineticStatus KineticController_ExecuteOperation(KineticOperation* operation, Ki KINETIC_ASSERT(operation->session != NULL); KineticStatus status = KINETIC_STATUS_INVALID; if (closure != NULL) { if (operation->session->terminationStatus != KINETIC_STATUS_SUCCESS) { return KINTEIC_STATUS_SESSION_TERMINATED; } if (closure != NULL) { operation->closure = *closure; return KineticOperation_SendRequest(operation); } else { else { DefaultCallbackData data; pthread_mutex_init(&data.receiveCompleteMutex, NULL); pthread_cond_init(&data.receiveComplete, NULL); Loading @@ -100,8 +77,9 @@ KineticStatus KineticController_ExecuteOperation(KineticOperation* operation, Ki if (status == KINETIC_STATUS_SUCCESS) { pthread_mutex_lock(&data.receiveCompleteMutex); while(data.completed == false) { pthread_cond_wait(&data.receiveComplete, &data.receiveCompleteMutex); } while(data.completed == false) { pthread_cond_wait(&data.receiveComplete, &data.receiveCompleteMutex); } status = data.status; pthread_mutex_unlock(&data.receiveCompleteMutex); } Loading @@ -117,8 +95,7 @@ KineticStatus bus_to_kinetic_status(bus_send_status_t const status) { KineticStatus res = KINETIC_STATUS_INVALID; switch(status) { switch(status) { // TODO scrutinize all these mappings case BUS_SEND_SUCCESS: res = KINETIC_STATUS_SUCCESS; Loading Loading @@ -217,10 +194,17 @@ void KineticController_HandleUnexpectedResponse(void *msg, logTag = statusTag; logAtLevel = 0; protoLogAtLevel = 0; if (response && response->command && response->command->status && response->command->status->has_code) { session->terminationStatus = KineticProtoStatusCode_to_KineticStatus(response->command->status->code); KineticSession_Disconnect(session); } } else { } else { KineticLogger_LogTimestamp(0, "WARNING: Received unexpected response!"); logTag = unexpectedTag; logAtLevel = 0; Loading Loading @@ -279,8 +263,7 @@ void KineticController_HandleResult(bus_msg_result_t *res, void *udata) KineticLogger_LogHeader(3, &response->header); KineticLogger_LogProtobuf(3, response->proto); } else { else { // pull out bus error? LOGF0("Error receiving response, got message bus error: %s", bus_error_string(res->status)); if (res->status == BUS_SEND_RX_TIMEOUT) { Loading