Commit e43934d4 authored by Andreas Schmidt's avatar Andreas Schmidt
Browse files

Thread pinning is now enabled by a method call.

parent 59b4a78f
Loading
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -4,12 +4,6 @@ if (DEBUG)
    add_definitions(-DDEBUG)
endif()

option(THREAD_PINNING "Sender and receiver threads are pinned to a core." OFF)

if (THREAD_PINNING)
    add_definitions(-DTHREAD_PINNING)
endif()

option(XLAP "Run XLAP to trace packets." OFF)

if (XLAP)
+4 −4
Original line number Diff line number Diff line
@@ -11,9 +11,6 @@ cdef extern from "pthread.h" nogil:
    ctypedef struct pthread_cond_t:
        pass

cdef extern from "py_defines.h":
    pass

cdef extern from "proto/vdmcode/block_code.h":
    cdef struct prrtCoder:
        pass
@@ -124,9 +121,12 @@ cdef extern from "proto/socket.h":
    int32_t PrrtSocket_timedrecv(PrrtSocket *sock_ptr, void *buf_ptr, const uint32_t wait_time) nogil
    bint PrrtSocket_set_sock_opt(PrrtSocket *sock_ptr, const_char *name, const uint32_t value)
    uint32_t PrrtSocket_get_sock_opt(PrrtSocket *sock_ptr, const_char *name)
    bint PrrtSocket_uses_thread_pinning(PrrtSocket *socket)
    uint32_t PrrtSocket_get_rtt(PrrtSocket *socket)

    bint PrrtSocket_uses_thread_pinning(PrrtSocket *socket)
    bint PrrtSocket_enable_thread_pinning(PrrtSocket *socket)



cdef extern from "proto/stores/receiveDataQueue.h":
    ctypedef struct PrrtReceiveDataQueue:
+20 −8
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ PrrtSocket *PrrtSocket_create(const bool is_sender, prrtTimedelta_t target_delay
    s->isHardwareTimestamping = false;
    s->interfaceName = NULL;

    s->isThreadPinning = false;

    PrrtClock_init(&s->clock);

    s->isBound = false;
@@ -83,6 +85,16 @@ PrrtSocket *PrrtSocket_create(const bool is_sender, prrtTimedelta_t target_delay
    return NULL;
}

bool PrrtSocket_enable_thread_pinning(PrrtSocket *s) {
    check(s->isBound == false, "Thread pinning can only be enabled before calling PrrtSocket_bind()");
    s->isThreadPinning = true;
    return true;

    error:
    PERROR("PrrtSocket_enable_thread_pinning() failed.%s", "");
    return false;
}

bool PrrtSocket_enable_hardware_timestamping(PrrtSocket *s, const char * interface_name) {
    check(s->isBound == false, "Hardware timestamping can only be enabled before calling PrrtSocket_bind()");
    s->isHardwareTimestamping = true;
@@ -160,8 +172,10 @@ bool PrrtSocket_bind(PrrtSocket *s, const char *ipAddress, const uint16_t port)
        pthread_attr_init(s->receiveFeedbackThreadAttr);
        s->sendDataThreadAttr = calloc(1, sizeof(pthread_attr_t));
        pthread_attr_init(s->sendDataThreadAttr);
        if(s->isThreadPinning) {
            pin_thread_to_core(s->receiveFeedbackThreadAttr, 1);
            pin_thread_to_core(s->sendDataThreadAttr, 2);
        }

        check(pthread_create(&s->receiveFeedbackThread, s->receiveFeedbackThreadAttr,
                             receive_feedback_loop,
@@ -174,7 +188,9 @@ bool PrrtSocket_bind(PrrtSocket *s, const char *ipAddress, const uint16_t port)
    } else {
        s->receiveDataThreadAttr = calloc(1, sizeof(pthread_attr_t));
        pthread_attr_init(s->receiveDataThreadAttr);
        if(s->isThreadPinning) {
            pin_thread_to_core(s->receiveDataThreadAttr, 3);
        }
        check(pthread_create(&s->receiveDataThread, s->receiveDataThreadAttr, receive_data_loop,
                             (void *) s) ==
              EXIT_SUCCESS,
@@ -518,11 +534,7 @@ bool PrrtSocket_cleanup(PrrtSocket *s) {
}

bool PrrtSocket_uses_thread_pinning(PrrtSocket *s) {
#ifdef THREAD_PINNING
    return true;
#else
    return false;
#endif
    return atomic_load_explicit(&s->isThreadPinning, memory_order_acquire);
}

uint32_t PrrtSocket_get_rtt(PrrtSocket *s) {
+5 −1
Original line number Diff line number Diff line
@@ -72,8 +72,10 @@ typedef struct prrtSocket {
    pthread_attr_t *sendDataThreadAttr;
    pthread_attr_t *receiveDataThreadAttr;

    bool isHardwareTimestamping;
    atomic_bool isHardwareTimestamping;
    char *interfaceName;

    atomic_bool isThreadPinning;
} PrrtSocket;


@@ -81,6 +83,8 @@ PrrtSocket *PrrtSocket_create(bool is_sender, prrtTimedelta_t target_delay_us);

bool PrrtSocket_enable_hardware_timestamping(PrrtSocket *s, const char * interface_name);

bool PrrtSocket_enable_thread_pinning(PrrtSocket *s);

bool PrrtSocket_bind(PrrtSocket *s, const char *ipAddress, const uint16_t port);

bool PrrtSocket_set_sock_opt(PrrtSocket *s, const char *name, const uint32_t value);
+6 −1
Original line number Diff line number Diff line
@@ -66,6 +66,9 @@ cdef extern from "util/bptree.c":
cdef extern from "util/bitmap.c":
    pass

cdef extern from "util/common.c":
    pass

cdef extern from "util/list.c":
    pass

@@ -76,9 +79,11 @@ cdef class PrrtSocket:
    cdef cprrt.PrrtSocket* _c_socket
    cdef bint isSender

    def __cinit__(self, port, isSender, target_delay = 1):
    def __cinit__(self, port, isSender, target_delay = 1, thread_pinning = False):
        target_delay_us = target_delay * 1000**2
        self._c_socket = cprrt.PrrtSocket_create(isSender, target_delay_us)
        if thread_pinning:
            cprrt.PrrtSocket_enable_thread_pinning(self._c_socket)
        cprrt.PrrtSocket_bind(self._c_socket, "0.0.0.0", port)

        self.isSender = isSender
Loading