/* Connection functions */ int connectionWaitForInit (int connSock, uint32_t * width, uint32_t * height, uint32_t * sampling, char ** firstFrame) { wireworld_message_t message[4]; assert (width != NULL); assert (height != NULL); assert (sampling != NULL); assert (firstFrame != NULL); if (recvMessages (connSock, message, 4) == 0 && message[0] == R_INIT) { // If init message, retrieve sizes and sampling *width = message[1]; *height = message[2]; *sampling = message[3]; // Prepare buffer to read init map uint32_t data_size = wireworldFrameMessageSize (*width, *height); wireworld_message_t * buf = malloc (data_size * sizeof (wireworld_message_t)); assert (buf != NULL); // Read map if (recvMessages (connSock, buf, data_size) == 0) { // Alloc char map *firstFrame = malloc (*width * *height * sizeof (char)); assert (*firstFrame != NULL); // Convert network map to char map networkToCharMap (buf, *firstFrame, *width, *height); // destroy temp buffer free (buf); return 0; } else { fprintf (stderr, "Unable to read the first frame\n"); free (buf); return -1; } } else { fprintf (stderr, "Received something which is not an init message\n"); return -1; } }
int connectionWaitFrameRequest (int connSock) { assert (connSock != -1); wireworld_message_t message; int res = recvMessages (connSock, &message, 1); if (res == 0) { if (message == R_FRAME) { return 0; } else { fprintf (stderr, "Expected R_FRAME message but got something else : %u\n", message); } } else if (res == 1) { return 1; } else { fprintf (stderr, "Error while receiving R_FRAME request\n"); } return -1; }
void * mediatorThreadLoop( void * data ) { // Grab this guy from the data ShinyFilesystemMediator * sfm = (ShinyFilesystemMediator *) data; // Our ROUTER socket to deal with all incoming fuse noise zmq::socket_t * medSock = new zmq::socket_t( *sfm->ctx, ZMQ_ROUTER ); medSock->bind( sfm->getZMQEndpointFuse() ); // My list of zmq messages std::vector<zmq::message_t *> msgList; bool keepRunning = true; // Keep going as long as we don't get a DESTROY message. :P while( keepRunning ) { // Check for messages from fuse threads recvMessages( medSock, msgList ); // If we actually received anything if( msgList.size() ) { if( msgList.size() > 2 ) { // Now begins the real work. keepRunning = sfm->handleMessage( medSock, msgList ); } else { WARN( "Malformed message to mediator! msgList.size() == %d", msgList.size() ); for( int i = 0; i < msgList.size(); ++i ) { WARN( " %d) [%d] %.*s", i, msgList[i]->size(), msgList[i]->size() > 10 ? 10 : msgList[i]->size() ); } } freeMsgList( msgList ); } } // Cleanup the socket so that closing the context doesn't wait forever. :P delete( medSock ); return NULL; }