Loading prrt/CMakeLists.txt +2 −0 Original line number Diff line number Diff line Loading @@ -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}) prrt/proto/types/packet.c +22 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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: Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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, Loading prrt/proto/types/packet.h +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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); Loading 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); } Loading
prrt/CMakeLists.txt +2 −0 Original line number Diff line number Diff line Loading @@ -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})
prrt/proto/types/packet.c +22 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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: Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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, Loading
prrt/proto/types/packet.h +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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); Loading
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); }