bool PubSubClient::_wait_for(MQTT::message_type match_type, uint16_t match_pid) { while (!_client->available()) { if (millis() - lastInActivity > keepalive * 1000UL) return false; yield(); } while (millis() < lastInActivity + (keepalive * 1000)) { // Read the packet and check it MQTT::Message *msg = MQTT::readPacket(*_client); if (msg != NULL) { lastInActivity = millis(); if (msg->type() == match_type) { uint8_t pid = msg->packet_id(); delete msg; if (match_pid) return pid == match_pid; return true; } _process_message(msg); delete msg; } yield(); } return false; }
bool PubSubClient::loop() { if (!connected()) return false; unsigned long t = millis(); if ((t - lastInActivity > keepalive * 1000UL) || (t - lastOutActivity > keepalive * 1000UL)) { if (pingOutstanding) { _client->stop(); return false; } else { MQTT::Ping ping; ping.send(*_client); lastInActivity = lastOutActivity = t; pingOutstanding = true; } } if (_client->available()) { // Read the packet and check it MQTT::Message *msg = MQTT::readPacket(*_client); if (msg != NULL) { lastInActivity = millis(); _process_message(msg); delete msg; } } return true; }
/* * TODO: we need to keep track of the "me" * structures created here, because we need to * free them in "pmixp_stepd_finalize" */ void pmix_server_new_conn(int fd) { eio_obj_t *obj; PMIXP_DEBUG("Request from fd = %d", fd); /* Set nonblocking */ fd_set_nonblocking(fd); fd_set_close_on_exec(fd); pmixp_io_engine_t *me = xmalloc(sizeof(pmixp_io_engine_t)); pmix_io_init(me, fd, srv_rcvd_header); /* We use slurm_forward_data to send message to stepd's * SLURM will put user ID there. We need to skip it. */ pmix_io_rcvd_padding(me, sizeof(uint32_t)); if( 2 == _process_message(me) ){ /* connection was fully processed here */ xfree(me); return; } /* If it is a blocking operation: create AIO object to * handle it */ obj = eio_obj_create(fd, &peer_ops, (void *)me); eio_new_obj(pmixp_info_io(), obj); }
static int _serv_read(eio_obj_t *obj, List objs) { PMIXP_DEBUG("fd = %d", obj->fd); pmixp_io_engine_t *me = (pmixp_io_engine_t *)obj->arg; bool proceed = true; pmixp_debug_hang(0); /* Read and process all received messages */ while (proceed) { switch( _process_message(me) ){ case 2: obj->shutdown = true; PMIXP_DEBUG("Connection finalized fd = %d", obj->fd); /* cleanup after this connection */ eio_remove_obj(obj, objs); xfree(me); case 0: proceed = 0; case 1: break; } } return 0; }
bool PubSubClient::wait_for(uint8_t match_type, uint16_t match_pid) { while (!_client.available()) { if (millis() - lastInActivity > keepalive * 1000UL) return false; delayMicroseconds(100); } while (millis() < lastInActivity + (keepalive * 1000)) { // Read the packet and check it MQTT::Message *msg = MQTT::readPacket(_client); if (msg != NULL) { bool ret = _process_message(msg, match_type, match_pid); delete msg; if (ret) return true; } delayMicroseconds(100); } return false; }