prrt.pyx 3.15 KB
Newer Older
Andreas Schmidt's avatar
Andreas Schmidt committed
1
from libc.stdint cimport uint32_t, uint16_t, uint8_t, int32_t
Andreas Schmidt's avatar
Andreas Schmidt committed
2 3
from libc.stdlib cimport malloc, free

4 5
cimport cprrt

6
cdef extern from "proto/applicationConstraints.c":
7 8
    pass

9
cdef extern from "proto/stores/dataPacketStore.c":
10 11
    pass

12
cdef extern from "proto/stores/forwardPacketTable.c":
13
    pass
14

15
cdef extern from "proto/stores/lossGatherer.c":
16 17
    pass

18
cdef extern from "proto/stores/packetTimeoutTable.c":
19 20
    pass

21
cdef extern from "proto/stores/repairBlockStore.c":
22 23
    pass

Andreas Schmidt's avatar
Andreas Schmidt committed
24 25 26
cdef extern from "proto/types/packetTimeout.c":
    pass

27
cdef extern from "proto/processes/feedbackReceiver.c":
28
    pass
29

30
cdef extern from "proto/processes/dataReceiver.c":
31
    pass
32

33
cdef extern from "proto/processes/dataTransmitter.c":
34
    pass
35

36
cdef extern from "proto/block.c":
37
    pass
38

39
cdef extern from "proto/clock.c":
40
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
41

42
cdef extern from "proto/channelStateInformation.c":
43
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
44

45
cdef extern from "proto/vdmcode/block_code.c":
46
    pass
47

48
cdef extern from "proto/codingParams.c":
49
    pass
50

51
cdef extern from "proto/receiver.c":
52
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
53

54
cdef extern from "proto/packet.c":
55
    pass
56

57
cdef extern from "proto/socket.c":
58
    pass
59 60

cdef extern from "util/bptree.c":
61
    pass
62

63 64
cdef extern from "util/bitmap.c":
    pass
65

66 67
cdef extern from "util/list.c":
    pass
68

Andreas Schmidt's avatar
Andreas Schmidt committed
69 70 71
cdef extern from "util/pipe.c":
    pass

72 73
cdef class PrrtSocket:
    cdef cprrt.PrrtSocket* _c_socket
Andreas Schmidt's avatar
Andreas Schmidt committed
74
    cdef bint isSender
75

76 77 78
    def __cinit__(self, port, isSender, target_delay = 1):
        target_delay_us = target_delay * 1000**2
        self._c_socket = cprrt.PrrtSocket_create(isSender, target_delay_us)
Andreas Schmidt's avatar
Andreas Schmidt committed
79
        cprrt.PrrtSocket_bind(self._c_socket, "0.0.0.0", port)
Andreas Schmidt's avatar
Andreas Schmidt committed
80

Andreas Schmidt's avatar
Andreas Schmidt committed
81
        self.isSender = isSender
82

83 84 85 86 87
    property thread_pinning:

        def __get__(self):
            return cprrt.PrrtSocket_uses_thread_pinning(self._c_socket)

88
    property target_delay:
89

90 91 92
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
93
            return cprrt.PrrtSocket_get_sock_opt(self._c_socket, "targetdelay") * 0.000001
94

95 96 97 98 99 100 101 102 103 104 105
    property app_queue_size:
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
            return cprrt.PrrtSocket_get_sock_opt(self._c_socket, "app_queue_size")

        def __set__(self, value):
            if not self.isSender:
                raise Exception("Not a sender.")
            cprrt.PrrtSocket_set_sock_opt(self._c_socket, "app_queue_size", value)

106
    property rtt:
107 108 109 110
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
            return cprrt.PrrtSocket_get_rtt(self._c_socket) * 0.000001
111

rna's avatar
rna committed
112
    def recv(self, wait_time):
Andreas Schmidt's avatar
Andreas Schmidt committed
113 114 115 116
        cdef char buffer[65536]
        cdef int32_t len
        with nogil:
            len = cprrt.PrrtSocket_recv(self._c_socket, <void*> buffer)
117
        return buffer[:len]
118 119

    def connect(self, host, port):
Andreas Schmidt's avatar
Andreas Schmidt committed
120 121 122 123
        cdef bytes encodedHost = host.encode("utf-8")
        cprrt.PrrtSocket_connect(self._c_socket, encodedHost, port)

    def send(self, data):
124
        cprrt.PrrtSocket_send(self._c_socket, data, len(data))
Andreas Schmidt's avatar
Andreas Schmidt committed
125

126 127 128
    def __dealloc__(self):
        if self._c_socket != NULL:
            cprrt.PrrtSocket_close(self._c_socket)