Commit 9681988e authored by Andreas Schmidt's avatar Andreas Schmidt
Browse files

Created first prototype of Python bindings.

Conflicts:
	src/prrt/block.h
	src/prrt/packet.c
	src/prrt/processes/data_receiver.c
	src/prrt/processes/data_transmitter.c
	src/prrt/processes/feedback_receiver.c
	src/prrt/socket.c
	src/prrt/socket.h
	src/prrt/stores/forward_packet_table.c
	src/receiver.c
	src/sender.c
	src/util/list.c
	src/util/list.h
parent ba9d6c5b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
.idea/
build/
bin/
lib/
*.cmake
prrt.cpython-35m-x86_64-linux-gnu.so
src/cython/prrt.c
CMakeCache.txt
CMakeFiles/
Makefile
 No newline at end of file

build.sh

0 → 100644
+3 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
rm src/cython/prrt.c
python setup.py build_ext --inplace
 No newline at end of file

eval.py

0 → 100644
+38 −0
Original line number Diff line number Diff line
import sys
sys.path.insert(0, "./build")
import prrt
import threading

class receiverThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.sock = prrt.PrrtSocket(5000, False)

    def run(self):
        print("Receiving")
        while(1):
            print("Recv")
            p = self.sock.recv()
            print(p)

        print("Receiver Thread")

class senderThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.sock = prrt.PrrtSocket(6000, True)
        print("CREATED sock")

    def run(self):
        print("Connecting")
        self.sock.connect("localhost", 5000)
        print("Connected")
        self.sock.send("Test")
        print("Sent")

if __name__ == "__main__":
    recvThread = receiverThread()
    sendThread = senderThread()

    recvThread.start()
    sendThread.run()

setup.py

0 → 100644
+7 −0
Original line number Diff line number Diff line
from distutils.core import setup
from Cython.Build import cythonize

setup(
    include_dirs=["./src"],
    ext_modules = cythonize("src/cython/prrt.pyx")
)
 No newline at end of file

src/cython/cprrt.pxd

0 → 100644
+128 −0
Original line number Diff line number Diff line
from libc.stdint cimport uint32_t, uint16_t, uint8_t

cdef extern from "pthread.h" nogil:
    ctypedef struct pthread_t:
        pass

    ctypedef struct pthread_mutex_t:
        pass

    ctypedef struct pthread_cond_t:
        pass

cdef extern from "prrt/stores/forward_packet_table.h":
    cdef struct prrtForwardPacketTable:
        pass

    ctypedef prrtForwardPacketTable PrrtForwardPacketTable

cdef extern from "prrt/vdmcode/block_code.h":
    cdef struct prrtCoder:
        pass

    ctypedef prrtCoder PrrtCoder

cdef extern from "prrt/coding_params.h":
    cdef struct prrtCodingParams:
        uint8_t k;
        uint8_t r;
        uint8_t n;
        uint8_t n_p;

    ctypedef prrtCodingParams PrrtCodingParams

cdef extern from "util/list.h":
    cdef struct list:
        pass

    ctypedef list List

    cdef struct listNode:
        pass

    ctypedef listNode ListNode

    void List_push(List *list, const void *value)
    void *List_pop(const List *list)

    void List_unshift(List *list, const void *value)
    void *List_shift(const List *list)

    void *List_remove(List *list, const ListNode *node)

cdef extern from "prrt/block.h":
    cdef struct prrtBlock:
        uint32_t data_count
        uint32_t redundancy_count
        PrrtCodingParams coding_params
        uint32_t largest_data_length
        uint16_t base_seqno
        List* data_blocks
        List* redundancy_blocks
        uint8_t is_coded

    ctypedef prrtBlock PrrtBlock

cdef extern from "prrt/packet.h":
    cdef struct prrtPacket:
        uint8_t type_priority;
        uint8_t index;
        uint16_t seqno;
        void* payload;
        uint32_t payload_len;

    ctypedef prrtPacket PrrtPacket

cdef extern from "prrt/socket.h":
    ctypedef struct PrrtReceiver:
        const char* host_name
        uint16_t port

    cdef struct prrtSocket:
        int dataSocketFd
        int feedbackSocketFd
        pthread_t receiveFeedbackThread

        pthread_t sendThread
        pthread_mutex_t outQueueFilledMutex
        pthread_cond_t outQueueFilledCv
        List* outQueue

        pthread_t receiveDataThread
        pthread_mutex_t inQueueFilledMutex
        pthread_cond_t inQueueFilledMutexCv
        List *inQueue

        BPTreeNode* dataStore

        BPTreeNode* blockStore

        PrrtForwardPacketTable* forwardPacketTable

        PrrtReceiver receivers[10]
        int receiverLength
        uint16_t packetsCount
        uint16_t sequenceNumberSource
        uint16_t sequenceNumberRepetition
        uint16_t sequenceNumberRedundancy
        uint16_t sequenceNumberFeedback

    ctypedef prrtSocket PrrtSocket

    cdef PrrtSocket* PrrtSocket_create(uint16_t port, uint8_t is_sender)
    int PrrtSocket_close(const PrrtSocket *sock_ptr)
    int PrrtSocket_connect(PrrtSocket *sock_ptr, const char *host, const uint16_t port)
    int PrrtSocket_send(PrrtSocket *sock_ptr, const void *data, const size_t data_len)
    void PrrtSocket_recv(const PrrtSocket *sock_ptr, void **buf_ptr, ssize_t *length)
    PrrtPacket *PrrtSocket_recv_feedback(const PrrtSocket *sock_ptr, void *bufin, const size_t length)

cdef extern from "util/bptree.h":
    ctypedef struct BPTreeNode:
        pass

    BPTreeNode *BPTree_insert(BPTreeNode *root, int key, void *value);
    BPTreeNode *BPTree_delete(BPTreeNode *root, int key);
    BPTreeNode *BPTree_destroy(BPTreeNode *root);
    void *BPTree_get(BPTreeNode *root, int key);
    void BPTree_get_range(BPTreeNode *root, List *list, int key_start, int key_end);
Loading