#include "vsleeptimer.h"
#include "wjpeg.h"
-
Command* Command::instance = NULL;
Command::Command()
initted = 0;
isStandby = 0;
firstBoot = 1;
+ signals = 0;
connLost = NULL;
crashed = false;
server = NULL;
#else
ReleaseMutex(masterLock);
#endif
-
- button = remote->getButtonPress(2); // FIXME why is this set to 2 and not 0? so it can quit
+ button = remote->getButtonPress(2); // Don't block (0) in case a signal arrives after checking signals but before this line
// something happened, lock and process
-
+ if (signals) processSignals(); // If a signal arrived process now.
+
// logger->log("Command", Log::DEBUG, "WANT LOCK");
#ifndef WIN32
pthread_mutex_lock(&masterLock);
}
+void Command::setSignal(int signalReceived)
+{
+ if (signalReceived == SIGINT)
+ signals |= SIG_INT;
+ else if (signalReceived == SIGTERM)
+ signals |= SIG_TERM;
+ else if (signalReceived == SIGUSR1)
+ signals |= SIG_USR1;
+ else if (signalReceived == SIGUSR2)
+ signals |= SIG_USR2;
+ else if (signalReceived == SIGURG)
+ signals |= SIG_URG;
+}
+
+void Command::processSignals()
+{
+ if (signals & SIG_INT)
+ {
+ signals = signals & ~SIG_INT;
+ logger->log("Command", Log::NOTICE, "INT signal, shutting down...");
+ stop();
+ }
+
+ if (signals & SIG_TERM)
+ {
+ signals = signals & ~SIG_TERM;
+ logger->log("Command", Log::NOTICE, "TERM signal, shutting down...");
+ stop();
+ }
+
+ if (signals & SIG_USR1)
+ {
+ logger->log("Command", Log::NOTICE, "USR1 signal");
+ signals = signals & ~SIG_USR1;
+ }
+
+ if (signals & SIG_USR2)
+ {
+ logger->log("Command", Log::NOTICE, "USR2 signal");
+ signals = signals & ~SIG_USR2;
+ }
+
+ if (signals & SIG_URG)
+ {
+ logger->log("Command", Log::NOTICE, "URG signal"); // This is used to break from getButtonPress to process the message queue
+ signals = signals & ~SIG_URG;
+ }
+}
+
void Command::postMessage(Message* m)
{
// This is locked here in case the main loop is not waiting for an event, but is processing one
typedef vector<struct ASLPref> ASLPrefList;
+#define SIG_INT 1
+#define SIG_TERM 2
+#define SIG_USR1 4
+#define SIG_USR2 8
+#define SIG_URG 16
+
class Command : public MessageQueue
{
public:
void postMessageNoLock(Message* m); // override of MessageQueue::postMessage
bool postMessageIfNotBusy(Message* m); // for timers, when masterMutex might be locked
void postMessageFromOuterSpace(Message* m); // err, read the cc comments.
- void sig1();
+ void setSignal(int signalReceived);
void connectionLost();
void setAdvMenues(bool adv) {advmenues=adv;};
private:
void handleCommand(int);
+ void processSignals();
void doStandby();
void doPowerOn();
void doPowerOff();
void doWallpaper();
void doFromTheTop(bool which); // true - show vinfo,wait. false - del vinfo,restart
void buildCrashedBox();
+ void sig1();
static Command* instance;
#ifndef WIN32
UCHAR irun;
UCHAR isStandby;
UCHAR firstBoot;
+ ULONG signals;
Log* logger;
BoxStack* boxstack;
void shutdown(int code);
-
-
// Global variables --------------------------------------------------------------------------------------------------
Log* logger;
Remote* remote;
logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGUSR1. Aborting.");
shutdown(1);
}
-/*
sigtest = signal(SIGUSR2, sighandler);
if (sigtest == SIG_ERR)
{
logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGUSR2. Aborting.");
shutdown(1);
}
-*/
sigtest = signal(SIGURG, sighandler);
if (sigtest == SIG_ERR)
{
void sighandler(int signalReceived)
{
- logger->log("Core", Log::NOTICE, "Signal %i received", signalReceived);
-
- switch (signalReceived)
- {
- case SIGINT:
- {
- logger->log("Core", Log::NOTICE, "Interrupt signal, shutting down...");
- command->stop(); // FIXME this is probably not safe - use the messaging system / is that even safe?
- break;
- }
- case SIGTERM:
- {
- logger->log("Core", Log::NOTICE, "Term signal, shutting down...");
- command->stop(); // FIXME this is probably not safe - use the messaging system / is that even safe?
- break;
- }
- case SIGUSR1:
- {
- logger->log("Core", Log::NOTICE, "USR1 signal, screenshot...");
- command->sig1();
- break;
- }
-/*
- case SIGUSR1:
- {
- logger->log("Core", Log::DEBUG, "SIGUSR1 caught");
- logger->upLogLevel();
- break;
- }
- case SIGUSR2:
- {
- logger->log("Core", Log::DEBUG, "SIGUSR2 caught");
- logger->downLogLevel();
- break;
- }
-*/
- case SIGURG:
- {
- logger->log("Core", Log::DEBUG, "SIGURG caught");
- break;
- }
- }
+ if (command) command->setSignal(signalReceived);
}
+
#endif
// -------------------------------------------------------------------------------------------------------------------
{
command->shutdown();
delete command;
+ command = NULL;
logger->log("Core", Log::NOTICE, "Command module shut down");
}