if (svcSize <= 0) {
// Queue error response mark connection bad
char badreqRep[] = { DINIT_RP_BADREQ };
- queuePacket(badreqRep, 1);
+ if (! queuePacket(badreqRep, 1)) return;
bad_conn_close = true;
ev_io_set(&iob, iob.fd, EV_WRITE);
return;
try {
char ack_buf[] = { DINIT_RP_ACK };
service_set->startService(serviceName.c_str());
- queuePacket(ack_buf, 1);
+ if (! queuePacket(ack_buf, 1)) return;
}
catch (ServiceLoadExc &slexc) {
char outbuf[] = { DINIT_RP_SERVICELOADERR };
- queuePacket(outbuf, 1);
+ if (! queuePacket(outbuf, 1)) return;
}
catch (std::bad_alloc &baexc) {
char outbuf[] = { DINIT_RP_SERVICEOOM };
- queuePacket(outbuf, 1); // might degenerate to DINIT_RP_OOM, which is fine.
+ if (! queuePacket(outbuf, 1)) return; // might degenerate to DINIT_RP_OOM, which is fine.
}
}
else {
service_set->stop_all_services();
log_to_console = true;
char ackBuf[] = { DINIT_RP_ACK };
- queuePacket(ackBuf, 1);
+ if (! queuePacket(ackBuf, 1)) return;
}
else {
// TODO send NAK
}
}
-void ControlConn::rollbackComplete() noexcept
+bool ControlConn::rollbackComplete() noexcept
{
char ackBuf[1] = { DINIT_ROLLBACK_COMPLETED };
- queuePacket(ackBuf, 1);
+ return queuePacket(ackBuf, 1);
}
void ControlConn::dataReady() noexcept
class ControlConn
{
+ friend void control_conn_cb(struct ev_loop *, ev_io *, int);
+
struct ev_io iob;
struct ev_loop *loop;
ServiceSet *service_set;
// Process a packet. Can cause the ControlConn to be deleted iff there are no
// outgoing packets queued.
void processPacket();
+
+ // Notify that data is ready to be read from the socket.
+ void dataReady() noexcept;
+ void sendData() noexcept;
public:
ControlConn(struct ev_loop * loop, ServiceSet * service_set, int fd) : loop(loop), service_set(service_set), bufidx(0), chklen(0)
active_control_conns++;
}
- void rollbackComplete() noexcept;
- // Notify that data is ready to be read from the socket.
- void dataReady() noexcept;
- void sendData() noexcept;
-
-
+ bool rollbackComplete() noexcept;
+
~ControlConn() noexcept;
};