Commit d6cbdc2a authored by Greg Williams's avatar Greg Williams
Browse files

Added start of remote hangup detection.

Added test_system_fatal_errors.c to test hangup detection handling, which is configured to only run agsinst actual HW since not yet supported by kinetic-java simulator.
parent bd855db3
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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.
 *
+2 −0
Original line number Diff line number Diff line
@@ -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;

+1 −0
Original line number Diff line number Diff line
@@ -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;
}
+5 −0
Original line number Diff line number Diff line
@@ -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);
+22 −39
Original line number Diff line number Diff line
@@ -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);
@@ -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,
@@ -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);
@@ -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);
        }
@@ -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;
@@ -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;
@@ -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