Commit 223addb1 authored by Andreas Schmidt's avatar Andreas Schmidt
Browse files

Packet copies are now shallow copies by default

parent fff6c3e9
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@ add_subdirectory(util)

add_executable(sender sender.c)
add_executable(receiver receiver.c)
add_executable(refcount refcount.c)

target_link_libraries(sender LINK_PUBLIC PRRT UTIL ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(receiver LINK_PUBLIC PRRT UTIL ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(refcount LINK_PUBLIC PRRT UTIL ${CMAKE_THREAD_LIBS_INIT})
+22 −4
Original line number Diff line number Diff line
@@ -92,6 +92,11 @@ int PrrtPacket_print(PrrtPacket *packet_ptr) {
}

PrrtPacket *PrrtPacket_copy(PrrtPacket *original) {
    __sync_fetch_and_add(&original->refcount, 1);
    return original;
}

PrrtPacket *PrrtPacket_deepcopy(PrrtPacket *original) {
    PrrtPacket *newPacket = calloc(1, sizeof(PrrtPacket));
    check_mem(newPacket);
    void *payload = calloc(1, original->payloadLength);
@@ -105,6 +110,8 @@ PrrtPacket *PrrtPacket_copy(PrrtPacket *original) {
    newPacket->sequenceNumber = original->sequenceNumber;
    newPacket->type_priority = original->type_priority;

    newPacket->refcount = 1;


    return newPacket;
    error:
@@ -122,6 +129,7 @@ create_header(uint8_t priority, prrtSequenceNumber_t seqno, prrtPacketLength_t s
    packet->index = index;
    packet->sequenceNumber = seqno;
    packet->payloadLength = size;
    packet->refcount = 1;

    return packet;

@@ -214,6 +222,10 @@ void *encode_general_header(void *buf_ptr, const PrrtPacket *packet) {
}

bool PrrtPacket_decode(void *srcBuffer, uint16_t srcBufferSize, PrrtPacket *targetPacket) {

    // targetPacket is uninitialized, so we need to set the reference count
    targetPacket->refcount = 1;

    prrtPacketLength_t payload_len = (prrtPacketLength_t) (srcBufferSize - PRRT_PACKET_ENCODED_GENERAL_HEADER_LENGTH);
    targetPacket->type_priority = *(uint8_t *) srcBuffer;
    srcBuffer += 1;
@@ -295,12 +307,18 @@ void *decode_data_header(void *dstBuffer, const void *srcBuffer) {
}

int PrrtPacket_destroy(PrrtPacket *packet) {

    prrtRefcount_t refcount = __sync_fetch_and_sub(&packet->refcount, 1);
    if (refcount > 1) {
        return 0;
    } else {
        if (packet->payload != NULL) {
            free(packet->payload);
        }
        free(packet);
        return 0;
    }
}

PrrtPacket *PrrtPacket_create_data_packet(uint8_t priority, const void *payloadPointer,
                                          prrtPacketLength_t dataLength, prrtSequenceNumber_t sequenceNumber,
+6 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ typedef atomic_uint_fast32_t prrtAtomicDeliveryRate_t;
typedef uint32_t prrtByteCount_t;
typedef uint8_t prrtPacketType_t;

typedef uint16_t prrtRefcount_t;

typedef struct prrtIncompleteBlock {
    prrtSequenceNumber_t sequenceNumberBase;
    uint16_t repairCycleIndex;
@@ -58,6 +60,8 @@ typedef struct prrtPacket {
    prrtTimedelta_t rtt;

    struct sockaddr_in sender_addr;

    prrtRefcount_t refcount;
} PrrtPacket;
#define PRRT_PACKET_GENERAL_HEADER_SIZE 8
#define PRRT_PACKET_ENCODED_GENERAL_HEADER_LENGTH 4
@@ -124,6 +128,8 @@ int PrrtPacket_print(PrrtPacket *packet_ptr);

PrrtPacket *PrrtPacket_copy(PrrtPacket *original);

PrrtPacket *PrrtPacket_deepcopy(PrrtPacket *original);

PrrtPacket *PrrtPacket_create_data_packet(uint8_t priority, const void *payloadPointer,
                                          prrtPacketLength_t dataLength, prrtSequenceNumber_t sequenceNumber,
                                          prrtTimedelta_t targetDelay);

prrt/refcount.c

0 → 100644
+19 −0
Original line number Diff line number Diff line
#include "proto/types/packet.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int prio = 0;
const int seqnum = 1337;
const int timedelta = 0;

int main() {
    const char* payload = "just some example payload";
    struct prrtPacket *a = PrrtPacket_create_data_packet(prio, payload, strlen(payload), seqnum, timedelta);
    printf("refcount(a): %u\n\n", a->refcount);
    struct prrtPacket *b = PrrtPacket_copy(a);
    printf("refcount(a): %u\nrefcount(b): %u\n\n", a->refcount, b->refcount);
    PrrtPacket_destroy(a);
    printf("refcount(b): %u\n", b->refcount);
    PrrtPacket_destroy(b);
}