Beispiel #1
0
	void Component::run()
	{
		try {
			std::cerr << "starting component " << name << "..." << std::endl;
			startIO();
			std::cerr << "    ... " << name << " ready." << std::endl;
		} catch (std::exception & ex) {
			log->error("Cannot startup component:", &ex);
			try {
				state = STATE_FAILURE;
				meta.reportState(state, "Cannot startup component:", &ex);
			} catch (CMSException & me) {
				log->error("cannot report failure state", & me);
			}
			requestExit();
		}

		while (!exitRequested()) {
			// Report that we are alive before we check system ready status,
			// (in case we were stalled due to a long act() or react() this
			// means we "report back" to the rest of the system)
			meta.IamAlive();
      //printf("run %i\n",exitRequested());
			// Check at every loop that the total system is ready
			bool exitFlag = false;
			synchronized (&meta) {
				if (!meta.isSystemReady()) {
					log->info("waiting for system to become ready");
				}
				while (!meta.isSystemReady()) {
					try {
						meta.wait(1000);
					} catch (decaf::lang::Exception & ie) {
						ie.printStackTrace();
					}
					if (meta.isSystemReady()) {
						log->info("system ready - let's go");
					}
					if (exitRequested()) {
						exitFlag = true;
						break;
					}
				}
			}
			if (exitFlag) break;

			try {
				// Check if we should do something proactively:
				long long before = System::currentTimeMillis();
				act();
				long long timeSpentInAct = System::currentTimeMillis() - before;
				meta.statistics()->actTime((long)timeSpentInAct);
			} catch (std::exception & e) {
				log->error("error when trying to act", & e);
				try {
					state = STATE_FAILURE;
					meta.reportState(state, "error when trying to act", &e);
				} catch (CMSException & me) {
					log->error("cannot report failure state", & me);
				}
				requestExit();
				return;
			}

			Receiver * r = NULL;
			synchronized (&mutex) {
				if (inputWaiting.empty()) {
				// block until input becomes available
				mutex.wait(waitingTime);
				}
				// check again
				if (!inputWaiting.empty()) {
					r = inputWaiting.front();
					inputWaiting.pop();
				}
			}
			if (r == NULL) continue;
			//assert(receivers.contains(r)); // the receiver that alerted us is not one of our receivers;
			SEMAINEMessage * message = r->getMessage();
			assert(message != NULL); // Receiver alerted me but has no message
			meta.statistics()->countMessageReceived();

			try {
				// time that the message travelled, in "user" time (ms since system startup -- this should be independent of clock asynchrony)
				long long timeMessageTravelled = meta.getTime() - message->getUsertime();
				meta.statistics()->transmitTime((long)timeMessageTravelled);
				// Now, do something meaningful with the message,
				// and possibly send output via the Senders.
				long long before = System::currentTimeMillis();
				react(message);
				delete message;
				long long timeSpentInReact = System::currentTimeMillis() - before;
				meta.statistics()->reactTime((long)timeSpentInReact);
			} catch (std::exception & e) {
				log->error("error when trying to react", &e);
				try {
					state = STATE_FAILURE;
					std::string errMsg = CMSLogger::toLogMessageText("error when trying to react", &e)
						+ "(message was: " + CMSLogger::message2logString(message) + ")";
					meta.reportState(state, errMsg);
				} catch (CMSException & me) {
					log->error("cannot report failure state", & me);
				}
				requestExit();
				return;
			}
		}
	}