2 #include <dragonnet/peer.h>
3 #include <dragonnet/recv.h>
4 #include <dragonnet/recv_thread.h>
5 #include <dragontype/number.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_id, sizeof type_id, MSG_WAITALL);
31 dragonnet_peer_delete(p);
37 pthread_rwlock_wrlock(&p->mu);
43 pthread_rwlock_unlock(&p->mu);
47 type_id = be16toh(type_id);
48 DragonnetType type = dragonnet_types[type_id];
50 type.deserialize(p, buf);
52 pthread_rwlock_rdlock(&p->mu);
53 bool (*on_recv)(struct dragonnet_peer *, u16, void *) = p->on_recv;
54 void (*on_recv_type)(DragonnetPeer *, void *) = p->on_recv_type[type_id];
55 pthread_rwlock_unlock(&p->mu);
57 if (on_recv != NULL && !on_recv(p, type_id, buf))
60 if (on_recv_type != NULL)