Commit 1a76994c authored by Scott Vokes's avatar Scott Vokes
Browse files

Lock/unlock operation via connection, not via possibly stale operation handle.

parent a926fb64
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -51,11 +51,12 @@ KineticStatus KineticOperation_SendRequest(KineticOperation* const operation)
    KINETIC_ASSERT(operation->connection != NULL);
    KINETIC_ASSERT(operation->request != NULL);
    
    if (!KineticRequest_LockOperation(operation)) {
    KineticConnection *connection = operation->connection;
    if (!KineticRequest_LockConnection(connection)) {
        return KINETIC_STATUS_CONNECTION_ERROR;
    }
    KineticStatus status = KineticOperation_SendRequestInLock(operation);
    KineticRequest_UnlockOperation(operation);
    KineticRequest_UnlockConnection(connection);
    return status;
}

+4 −4
Original line number Diff line number Diff line
@@ -147,12 +147,12 @@ bool KineticRequest_SendRequest(KineticOperation *operation,
    return bus_send_request(operation->connection->messageBus, &bus_msg);
}

bool KineticRequest_LockOperation(KineticOperation *operation)
bool KineticRequest_LockConnection(KineticConnection *connection)
{
    return 0 == pthread_mutex_lock(&operation->connection->sendMutex);
    return 0 == pthread_mutex_lock(&connection->sendMutex);
}

bool KineticRequest_UnlockOperation(KineticOperation *operation)
bool KineticRequest_UnlockConnection(KineticConnection *connection)
{
    return 0 == pthread_mutex_unlock(&operation->connection->sendMutex);
    return 0 == pthread_mutex_unlock(&connection->sendMutex);
}
+2 −2
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ KineticStatus KineticRequest_PackMessage(KineticOperation *operation,
bool KineticRequest_SendRequest(KineticOperation *operation,
    uint8_t *msg, size_t msgSize);

bool KineticRequest_LockOperation(KineticOperation *operation);
bool KineticRequest_UnlockOperation(KineticOperation *operation);
bool KineticRequest_LockConnection(KineticConnection *connection);
bool KineticRequest_UnlockConnection(KineticConnection *connection);

#endif
+11 −11
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ void test_KineticOperation_Init_should_configure_the_operation(void)

void test_KineticOperation_SendRequest_should_error_out_on_lock_failure(void)
{
    KineticRequest_LockOperation_ExpectAndReturn(&Operation, false);
    KineticRequest_LockConnection_ExpectAndReturn(Operation.connection, false);
    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_CONNECTION_ERROR, status);
}
@@ -98,12 +98,12 @@ void test_KineticOperation_SendRequest_should_error_out_on_lock_failure(void)

void test_KineticOperation_SendRequest_should_return_MEMORY_ERROR_on_command_pack_failure(void)
{
    KineticRequest_LockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_LockConnection_ExpectAndReturn(Operation.connection, true);
    KineticSession *session = Operation.connection->pSession;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

    KineticRequest_PackCommand_ExpectAndReturn(Operation.request, KINETIC_REQUEST_PACK_FAILURE);
    KineticRequest_UnlockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_UnlockConnection_ExpectAndReturn(Operation.connection, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_MEMORY_ERROR, status);
@@ -111,14 +111,14 @@ void test_KineticOperation_SendRequest_should_return_MEMORY_ERROR_on_command_pac

void test_KineticOperation_SendRequest_should_return_error_status_on_authentication_failure(void)
{
    KineticRequest_LockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_LockConnection_ExpectAndReturn(Operation.connection, true);
    KineticSession *session = Operation.connection->pSession;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

    KineticRequest_PackCommand_ExpectAndReturn(Operation.request, 100);
    KineticRequest_PopulateAuthentication_ExpectAndReturn(&session->config,
        Operation.request, NULL, KINETIC_STATUS_HMAC_REQUIRED);
    KineticRequest_UnlockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_UnlockConnection_ExpectAndReturn(Operation.connection, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_HMAC_REQUIRED, status);
@@ -126,7 +126,7 @@ void test_KineticOperation_SendRequest_should_return_error_status_on_authenticat

void test_KineticOperation_SendRequest_should_return_error_status_on_PackMessage_failure(void)
{
    KineticRequest_LockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_LockConnection_ExpectAndReturn(Operation.connection, true);
    KineticSession *session = Operation.connection->pSession;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

@@ -136,7 +136,7 @@ void test_KineticOperation_SendRequest_should_return_error_status_on_PackMessage

    KineticRequest_PackMessage_ExpectAndReturn(&Operation, &msg, &msgSize,
        KINETIC_STATUS_MEMORY_ERROR);
    KineticRequest_UnlockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_UnlockConnection_ExpectAndReturn(Operation.connection, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_MEMORY_ERROR, status);
@@ -144,7 +144,7 @@ void test_KineticOperation_SendRequest_should_return_error_status_on_PackMessage

void test_KineticOperation_SendRequest_should_return_REQUEST_REJECTED_if_SendRequest_fails(void)
{
    KineticRequest_LockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_LockConnection_ExpectAndReturn(Operation.connection, true);
    KineticSession *session = Operation.connection->pSession;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

@@ -158,7 +158,7 @@ void test_KineticOperation_SendRequest_should_return_REQUEST_REJECTED_if_SendReq

    KineticRequest_SendRequest_ExpectAndReturn(&Operation, msg, msgSize, false);
    KineticCountingSemaphore_Give_Expect(Operation.connection->outstandingOperations);
    KineticRequest_UnlockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_UnlockConnection_ExpectAndReturn(Operation.connection, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_REQUEST_REJECTED, status);
@@ -166,7 +166,7 @@ void test_KineticOperation_SendRequest_should_return_REQUEST_REJECTED_if_SendReq

void test_KineticOperation_SendRequest_should_acquire_and_increment_sequence_count_and_send_PDU_to_bus(void)
{
    KineticRequest_LockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_LockConnection_ExpectAndReturn(Operation.connection, true);
    KineticSession *session = Operation.connection->pSession;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

@@ -179,7 +179,7 @@ void test_KineticOperation_SendRequest_should_acquire_and_increment_sequence_cou
    KineticCountingSemaphore_Take_Expect(Operation.connection->outstandingOperations);

    KineticRequest_SendRequest_ExpectAndReturn(&Operation, msg, msgSize, true);
    KineticRequest_UnlockOperation_ExpectAndReturn(&Operation, true);
    KineticRequest_UnlockConnection_ExpectAndReturn(Operation.connection, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_SUCCESS, status);