1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
11 #include <anna/core/tracing/Logger.hpp>
12 #include <anna/core/mt/Semaphore.hpp>
14 #include <anna/xml/Node.hpp>
15 #include <anna/xml/Attribute.hpp>
17 #include <anna/comm/Communicator.hpp>
18 #include <anna/comm/Handler.hpp>
19 #include <anna/comm/Transport.hpp>
24 //------------------------------------------------------------------------------------------------
25 // En modo MT aprovechamos las capacidades que tiene esta clase por el hecho de heredar de
26 // anna::Runnable -> invocaremos a do_action atraves de Runnnable::run.
28 // En modo ST invocamos directamente al Handler::apply.
29 //------------------------------------------------------------------------------------------------
30 void comm::Handler::do_action()
31 throw(RuntimeException) {
34 pollfd.events = POLLIN | POLLRDNORM;
35 const int npoll = poll(&pollfd, 1, 1000);
37 if(npoll == -1 && errno != EINTR) {
38 const int xerrno(errno);
39 string msg(asString());
40 msg += " | Error checking messages";
41 throw RuntimeException(msg, xerrno, ANNA_FILE_LOCATION);
46 if(supportTimeout() == false) {
47 if(npoll == 1 && (pollfd.revents & (POLLIN | POLLRDNORM)) != 0) {
53 } catch(RuntimeException& ex) {
58 * En la práctica este código sólo se ejecutará en modo MT, ya que en modo ST, sólo se invocará a Handler::do_action
59 * cuando se compruebe que actividad en el 'fd' asociado a este manejador.
61 * Sin embargo en MT el thread está ejecutando este código periódicamente.
63 else if(++ a_loop == 5) {
68 } catch(RuntimeException& ex) {
73 Microsecond now(anna::functions::hardwareClock());
75 if(npoll == 1 && (pollfd.revents & (POLLIN | POLLRDNORM)) != 0) {
81 } catch(RuntimeException& ex) {
84 } else if(isTimeout(now) == true) {
87 string msg(asString());
88 msg += " | Closed due to inactivity";
89 Logger::warning(msg, ANNA_FILE_LOCATION);
91 a_communicator->detach(this);
96 * Parece ser que puede ser que además de los POLLIN y POLLRDNORN que estamos comprobando
97 * pueden aparecer más bits, POLLINVAL (p.e) lo que provocaría
99 if(npoll == 1 && done == false) {
101 string msg(asString());
102 msg += " | Detected unsupported event";
103 Logger::warning(msg, ANNA_FILE_LOCATION);
105 a_communicator->detach(this);
109 std::string comm::Handler::asString() const
111 string msg("comm::Handler { ");
112 msg += Runnable::asString();
114 if(a_type == Type::Custom)
115 msg += " | Type: Custom";
117 msg += functions::asString(" | fd: %d", a_fd);
120 msg += " | Timeout: ";
121 msg += a_timeout.asString();
128 xml::Node* comm::Handler::asXML(xml::Node* parent) const
129 throw(RuntimeException) {
130 xml::Node* result = parent->createChild("comm.Handler");
135 void comm::Handler::asAttribute(xml::Node* node) const
136 throw(RuntimeException) {
137 node->createAttribute("Id", getId());
138 node->createAttribute("RequestStop", anna::functions::asString(hasRequestedStop()));
140 if(a_type == Type::Custom)
141 node->createAttribute("Type", "Custom");
143 node->createAttribute("fd", a_fd);
146 node->createAttribute("Timeout", a_timeout / 1000);
148 node->createAttribute("Timeout", "none");