Lines Matching refs:peerProxy

273 static void peerProxyExpectHeader(PeerProxy* peerProxy) {
274 peerProxy->inputState = READING_HEADER;
275 bufferPrepareForRead(peerProxy->inputBuffer, sizeof(Header));
279 static void peerProxyPrepareOutgoingHeader(PeerProxy* peerProxy) {
280 peerProxy->outgoingHeader.data
281 = (char*) &(peerProxy->currentPacket->header);
282 peerProxy->outgoingHeader.size = sizeof(Header);
283 bufferPrepareForWrite(&peerProxy->outgoingHeader);
287 static void peerProxyEnqueueOutgoingPacket(PeerProxy* peerProxy,
290 if (peerProxy->currentPacket == NULL) {
292 peerProxy->currentPacket = newPacket;
293 peerProxy->lastPacket = newPacket;
295 peerProxyPrepareOutgoingHeader(peerProxy);
297 peerProxy->lastPacket->nextPacket = newPacket;
302 static void peerProxyLockAndEnqueueOutgoingPacket(PeerProxy* peerProxy,
304 Peer* peer = peerProxy->peer;
306 peerProxyEnqueueOutgoingPacket(peerProxy, newPacket);
314 static bool peerProxyNextPacket(PeerProxy* peerProxy) {
315 Peer* peer = peerProxy->peer;
318 OutgoingPacket* current = peerProxy->currentPacket;
327 peerProxy->currentPacket = next;
332 peerProxy->lastPacket = NULL;
337 peerProxyPrepareOutgoingHeader(peerProxy);
375 static void peerProxyKill(PeerProxy* peerProxy, bool errnoIsSet) {
377 ALOGI("Peer %d died. errno: %s", peerProxy->credentials.pid,
380 ALOGI("Peer %d died.", peerProxy->credentials.pid);
384 if (peerProxy->master) {
388 Peer* localPeer = peerProxy->peer;
389 pid_t pid = peerProxy->credentials.pid;
395 = peerProxy->credentials.pid;
409 if (peerProxy->fd != NULL) {
410 peerProxy->fd->remove = true;
414 while (peerProxyNextPacket(peerProxy)) {}
416 bufferFree(peerProxy->inputBuffer);
419 if (peerProxy->connections != NULL) {
421 hashmapForEach(peerProxy->connections, &peerProxyRemoveConnection,
422 peerProxy);
423 hashmapFree(peerProxy->connections);
430 free(peerProxy);
433 static void peerProxyHandleError(PeerProxy* peerProxy, char* functionName) {
442 peerProxyKill(peerProxy, true);
450 static bool peerProxyWriteFromBuffer(PeerProxy* peerProxy, Buffer* outgoing) {
451 ssize_t size = bufferWrite(outgoing, peerProxy->fd->fd);
453 peerProxyHandleError(peerProxy, "write");
461 static void peerProxyWriteBytes(PeerProxy* peerProxy) {
462 Buffer* buffer = peerProxy->currentPacket->bytes;
463 if (peerProxyWriteFromBuffer(peerProxy, buffer)) {
465 peerProxyNextPacket(peerProxy);
470 static void peerProxyWriteConnection(PeerProxy* peerProxy) {
471 int socket = peerProxy->currentPacket->socket;
492 *((int *) CMSG_DATA(cmptr)) = peerProxy->currentPacket->socket;
501 ssize_t result = sendmsg(peerProxy->fd->fd, &msg, 0);
504 peerProxyHandleError(peerProxy, "sendmsg");
507 peerProxyNextPacket(peerProxy);
518 PeerProxy* peerProxy = (PeerProxy*) fd->data;
519 OutgoingPacket* current = peerProxy->currentPacket;
527 Buffer* outgoingHeader = &peerProxy->outgoingHeader;
531 headerWritten = peerProxyWriteFromBuffer(peerProxy, outgoingHeader);
542 peerProxyWriteConnection(peerProxy);
545 peerProxyWriteBytes(peerProxy);
550 peerProxyNextPacket(peerProxy);
564 PeerProxy* peerProxy = (PeerProxy*) fd->data;
566 peerLock(peerProxy->peer);
567 bool hasPackets = peerProxy->currentPacket != NULL;
568 peerUnlock(peerProxy->peer);
581 static void peerProxyExpectBytes(PeerProxy* peerProxy, Header* header) {
584 peerProxy->inputState = READING_BYTES;
585 if (bufferPrepareForRead(peerProxy->inputBuffer, header->size) == -1) {
590 peerProxyKill(peerProxy, false);
613 PeerProxy* peerProxy = hashmapGet(peer->peerProxies, &pid);
614 if (peerProxy != NULL) {
615 return peerProxy;
648 peerProxy = peerProxyCreate(peer, credentials);
649 if (peerProxy == NULL) {
660 return peerProxy;
687 PeerProxy* peerProxy = peerProxyGetOrCreate(localPeer, pid, false);
688 if (peerProxy == NULL) {
692 peerProxy->credentials = header->credentials;
697 masterProxy->connecting = peerProxy;
706 static void peerProxySetFd(PeerProxy* peerProxy, SelectableFd* fd) {
707 peerProxy->fd = fd;
708 fd->data = peerProxy;
778 PeerProxy* peerProxy = masterProxy->connecting;
779 if (peerProxy == NULL) {
788 peerProxy->credentials.pid);
790 peerProxyKill(peerProxy, false);
793 peerProxySetFd(peerProxy, selectableFd);
851 static void masterReportConnectionError(PeerProxy* peerProxy,
856 " dead.", peerProxy->credentials.pid, credentials.pid);
864 peerProxyLockAndEnqueueOutgoingPacket(peerProxy, packet);
870 static void masterHandleConnectionRequest(PeerProxy* peerProxy,
872 Peer* master = peerProxy->peer;
874 if (!hashmapContainsKey(peerProxy->connections, &targetPid)) {
880 masterReportConnectionError(peerProxy, header->credentials);
882 masterConnectPeers(peerProxy, targetPeer);
887 peerProxyExpectHeader(peerProxy);
899 PeerProxy* peerProxy = NULL;
901 peerProxy = hashmapGet(peer->peerProxies, &pid);
904 if (peerProxy != NULL) {
906 peerProxyKill(peerProxy, false);
917 static void peerProxyHandleHeader(PeerProxy* peerProxy, Header* header) {
920 masterHandleConnectionRequest(peerProxy, header);
923 masterProxyExpectConnection(peerProxy, header);
926 masterProxyHandleConnectionError(peerProxy, header);
929 peerProxyExpectBytes(peerProxy, header);
932 ALOGW("Invalid packet type from %d: %d", peerProxy->credentials.pid,
934 peerProxyKill(peerProxy, false);
942 static bool peerProxyBufferInput(PeerProxy* peerProxy) {
943 Buffer* in = peerProxy->inputBuffer;
944 ssize_t size = bufferRead(in, peerProxy->fd->fd);
946 peerProxyHandleError(peerProxy, "read");
951 peerProxyKill(peerProxy, false);
967 PeerProxy* peerProxy = (PeerProxy*) fd->data;
968 int state = peerProxy->inputState;
969 Buffer* in = peerProxy->inputBuffer;
972 if (peerProxyBufferInput(peerProxy)) {
976 peerProxyHandleHeader(peerProxy, header);
981 if (peerProxyBufferInput(peerProxy)) {
984 peerProxy->peer->onBytes(peerProxy->credentials,
988 peerProxyExpectHeader(peerProxy);
992 masterProxyAcceptConnection(peerProxy);
1000 PeerProxy* peerProxy = calloc(1, sizeof(PeerProxy));
1001 if (peerProxy == NULL) {
1005 peerProxy->inputBuffer = bufferCreate(sizeof(Header));
1006 if (peerProxy->inputBuffer == NULL) {
1007 free(peerProxy);
1011 peerProxy->peer = peer;
1012 peerProxy->credentials = credentials;
1015 peerProxyExpectHeader(peerProxy);
1019 pid_t* pid = &(peerProxy->credentials.pid);
1020 hashmapPut(peer->peerProxies, pid, peerProxy);
1021 return peerProxy;
1060 PeerProxy* peerProxy
1062 if (peerProxy != NULL) {
1079 peerProxy = peerProxyCreate(masterPeer, credentials);
1081 if (peerProxy == NULL) {
1086 peerProxy->connections = hashmapCreate(10, &pidHash, &pidEquals);
1087 peerProxySetFd(peerProxy, socketFd);
1162 PeerProxy* peerProxy = peerProxyGetOrCreate(peer, pid, true);
1163 if (peerProxy == NULL) {
1170 peerProxyEnqueueOutgoingPacket(peerProxy, packet);
1237 PeerProxy* peerProxy = peerProxyGetOrCreate(peer, pid, true);
1238 if (peerProxy == NULL) {
1245 peerProxyEnqueueOutgoingPacket(peerProxy, packet);