Commit 93edc4b5 authored by Greg Williams's avatar Greg Williams
Browse files

Fixed overlapped I/O memory issue by giving each connection its own PDU list,...

Fixed overlapped I/O memory issue by giving each connection its own PDU list, which allows cleanup of only PDUs owned by a given connection. Still need to add mutex to lists for thread safety
parent 61399cad
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -2,12 +2,12 @@ require 'kinetic-ruby'

compiler = ENV.fetch('CC', 'gcc')
compiler_location = `which #{compiler}`.strip
compiler_info = `#{compiler} --version`.strip
compiler_info = `#{compiler} --version 2>&1`.strip
puts "" +
"Configuration:\n" +
"  compiler: #{compiler}\n" +
"  compiler:\n" +
"    location: #{compiler_location}\n" +
"  version info:\n" +
"    info:\n" +
"      " + compiler_info.gsub(/\n/, "\n      ") + "\n\n"

KineticRuby::Rake::load_tasks
+0 −1
Original line number Diff line number Diff line
@@ -129,6 +129,5 @@
    - "#{Ceedling.load_path}"
  :enabled:
    - stdout_ide_tests_report
    - xml_tests_report
    - module_generator
...
+14 −19
Original line number Diff line number Diff line
@@ -22,9 +22,7 @@
#include "kinetic_logger.h"
#include <stdlib.h>

STATIC KineticList PDUList = {.start = NULL, .last = NULL};

void* KineticAllocator_NewItem(KineticList* list, size_t size)
void* KineticAllocator_NewItem(KineticList* const list, size_t size)
{
    KineticListItem* newItem = (KineticListItem*)malloc(sizeof(KineticListItem));
    if (newItem == NULL) {
@@ -51,7 +49,7 @@ void* KineticAllocator_NewItem(KineticList* list, size_t size)
    return newItem->data;
}

void KineticAllocator_FreeItem(KineticList* list, void* item)
void KineticAllocator_FreeItem(KineticList* const list, void* item)
{
    KineticListItem* cur = list->start;
    while (cur->data != item) {
@@ -113,9 +111,8 @@ void KineticAllocator_FreeItem(KineticList* list, void* item)
    }
}

void KineticAllocator_FreeList(KineticList* list)
void KineticAllocator_FreeList(KineticList* const list)
{
    LOG_LOCATION;
    if (list != NULL) {
        LOG("Freeing list of all items");
        KineticListItem* current = list->start;
@@ -153,10 +150,10 @@ void KineticAllocator_FreeList(KineticList* list)



KineticPDU* KineticAllocator_NewPDU(void)
KineticPDU* KineticAllocator_NewPDU(KineticList* const list)
{
    KineticPDU* newPDU = (KineticPDU*)KineticAllocator_NewItem(
                             &PDUList, sizeof(KineticPDU));
                             list, sizeof(KineticPDU));
    if (newPDU == NULL) {
        LOG("Failed allocating new PDU!");
        return NULL;
@@ -166,21 +163,20 @@ KineticPDU* KineticAllocator_NewPDU(void)
    return newPDU;
}

void KineticAllocator_FreePDU(KineticPDU* pdu)
void KineticAllocator_FreePDU(KineticList* const list, KineticPDU* pdu)
{
    if ((pdu->proto != NULL) && pdu->protobufDynamicallyExtracted) {
        // LOG("Freeing dynamically allocated protobuf");
        KineticProto__free_unpacked(pdu->proto, NULL);
    };
    KineticAllocator_FreeItem(&PDUList, (void*)pdu);
    KineticAllocator_FreeItem(list, (void*)pdu);
}

void KineticAllocator_FreeAllPDUs(void)
void KineticAllocator_FreeAllPDUs(KineticList* const list)
{
    LOG_LOCATION;
    if (PDUList.start != NULL) {
    if (list->start != NULL) {
        LOG("Freeing all PDUs...");
        KineticListItem* current = PDUList.start;
        KineticListItem* current = list->start;
        while (current != NULL) {
            KineticPDU* pdu = (KineticPDU*)current->data;
            if (pdu != NULL && pdu->proto != NULL
@@ -189,18 +185,17 @@ void KineticAllocator_FreeAllPDUs(void)
            }
            current = current->next;
        }
        KineticAllocator_FreeList(&PDUList);
        KineticAllocator_FreeList(list);
    }
    else {
        LOG("  Nothing to free!");
    }
}

bool KineticAllocator_ValidateAllMemoryFreed(void)
bool KineticAllocator_ValidateAllMemoryFreed(KineticList* const list)
{
    bool empty = (PDUList.start == NULL);
    LOG_LOCATION;
    bool empty = (list->start == NULL);
    // LOGF("  PDUList: 0x%0llX, empty=%s",
         // (long long)PDUList.start, empty ? "true" : "false");
         // (long long)list->start, empty ? "true" : "false");
    return empty;
}
+4 −4
Original line number Diff line number Diff line
@@ -23,9 +23,9 @@

#include "kinetic_types_internal.h"

KineticPDU* KineticAllocator_NewPDU(void);
void KineticAllocator_FreePDU(KineticPDU* pdu);
void KineticAllocator_FreeAllPDUs(void);
bool KineticAllocator_ValidateAllMemoryFreed(void);
KineticPDU* KineticAllocator_NewPDU(KineticList* const list);
void KineticAllocator_FreePDU(KineticList* const list, KineticPDU* pdu);
void KineticAllocator_FreeAllPDUs(KineticList* const list);
bool KineticAllocator_ValidateAllMemoryFreed(KineticList* const list);

#endif // _KINETIC_ALLOCATOR
+4 −4
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@ KineticOperation KineticOperation_Create(KineticConnection* const connection)

    KineticOperation operation = {
        .connection = connection,
        .request = KineticAllocator_NewPDU(),
        .response =  KineticAllocator_NewPDU(),
        .request = KineticAllocator_NewPDU(&connection->pdus),
        .response =  KineticAllocator_NewPDU(&connection->pdus),
    };

    if (operation.request == NULL) {
@@ -81,12 +81,12 @@ KineticStatus KineticOperation_Free(KineticOperation* const operation)
    }

    if (operation->request != NULL) {
        KineticAllocator_FreePDU(operation->request);
        KineticAllocator_FreePDU(&operation->connection->pdus, operation->request);
        operation->request = NULL;
    }

    if (operation->response != NULL) {
        KineticAllocator_FreePDU(operation->response);
        KineticAllocator_FreePDU(&operation->connection->pdus, operation->response);
        operation->response = NULL;
    }

Loading