2 #include <dragonnet/peer.h>
3 #include <dragonnet/recv.h>
4 #include <dragonnet/recv_thread.h>
10 void *dragonnet_peer_recv_thread(void *g_peer)
12 DragonnetPeer *p = (DragonnetPeer *) g_peer;
14 pthread_rwlock_wrlock(&p->mu);
15 assert(p->state == DRAGONNET_PEER_CREATED);
17 pthread_rwlock_unlock(&p->mu);
20 DragonnetTypeId type_id;
22 // Copy socket fd so that shutdown doesn't block
23 pthread_rwlock_rdlock(&p->mu);
25 pthread_rwlock_unlock(&p->mu);
27 ssize_t len = recv(sock, &type_id, sizeof type_id, MSG_WAITALL);
30 dragonnet_peer_delete(p);
36 pthread_rwlock_wrlock(&p->mu);
42 pthread_rwlock_unlock(&p->mu);
46 type_id = be16toh(type_id);
47 DragonnetType type = dragonnet_types[type_id];
48 unsigned char buf[type.siz];
49 type.deserialize(p, buf);
51 pthread_rwlock_rdlock(&p->mu);
52 bool (*on_recv)(struct dragonnet_peer *, DragonnetTypeId, void *) = p->on_recv;
53 void (*on_recv_type)(DragonnetPeer *, void *) = p->on_recv_type[type_id];
54 pthread_rwlock_unlock(&p->mu);
56 if (on_recv != NULL && !on_recv(p, type_id, buf))
59 if (on_recv_type != NULL)