2 #include <dragontype/number.h>
9 #include "recv_thread.h"
11 void *dragonnet_peer_recv_thread(void *g_peer)
13 DragonnetPeer *p = (DragonnetPeer *) g_peer;
15 pthread_rwlock_wrlock(&p->mu);
16 assert(p->state == DRAGONNET_PEER_CREATED);
18 pthread_rwlock_unlock(&p->mu);
23 // Copy socket fd so that shutdown doesn't block
24 pthread_rwlock_rdlock(&p->mu);
26 pthread_rwlock_unlock(&p->mu);
28 ssize_t len = recv(sock, &type, sizeof type, MSG_WAITALL);
31 dragonnet_peer_delete(p);
37 pthread_rwlock_wrlock(&p->mu);
43 pthread_rwlock_unlock(&p->mu);
49 pthread_rwlock_rdlock(&p->mu);
50 void (*on_recv_type)(struct dragonnet_peer *, u16) = p->on_recv_type;
51 pthread_rwlock_unlock(&p->mu);
53 if (on_recv_type != NULL)
54 on_recv_type(p, type);