Merge branch 'development' into LTS_development

This commit is contained in:
Thulinma 2015-08-28 21:58:43 +02:00
commit d6922c92f5
8 changed files with 57 additions and 19 deletions

View file

@ -181,16 +181,38 @@ namespace IPC {
}
}
///\brief Tries to wait for the semaphore, returns true if successfull, false otherwise
///\brief Tries to wait for the semaphore, returns true if successful, false otherwise
bool semaphore::tryWait() {
bool result;
int result;
#if defined(__CYGWIN__) || defined(_WIN32)
result = WaitForSingleObject(mySem, 0);//wait at most 1ms
if (result == 0x80){
WARN_MSG("Consistency error caught on semaphore %s", myName);
result = 0;
}
#else
result = sem_trywait(mySem);
#endif
return (result == 0);
}
///\brief Tries to wait for the semaphore for a single second, returns true if successful, false otherwise
bool semaphore::tryWaitOneSecond() {
int result;
#if defined(__CYGWIN__) || defined(_WIN32)
result = WaitForSingleObject(mySem, 1000);//wait at most 1s
if (result == 0x80){
WARN_MSG("Consistency error caught on semaphore %s", myName);
result = 0;
}
#else
struct timespec wt;
wt.tv_sec = 1;
wt.tv_nsec = 0;
result = sem_timedwait(mySem, &wt);
#endif
return (result == 0);
}
///\brief Closes the currently opened semaphore
void semaphore::close() {

View file

@ -64,6 +64,7 @@ namespace IPC {
void post();
void wait();
bool tryWait();
bool tryWaitOneSecond();
void close();
void unlink();
private:

View file

@ -109,9 +109,23 @@ void statusMonitor(void * np){
//this scope prevents the configMutex from being locked constantly
{
tthread::lock_guard<tthread::mutex> guard(Controller::configMutex);
Controller::CheckProtocols(Controller::Storage["config"]["protocols"], Controller::capabilities);
Controller::CheckAllStreams(Controller::Storage["streams"]);
//Controller::myConverter.updateStatus();
bool changed = false;
//checks online protocols, reports changes to status
changed |= Controller::CheckProtocols(Controller::Storage["config"]["protocols"], Controller::capabilities);
//checks stream statuses, reports changes to status
changed |= Controller::CheckAllStreams(Controller::Storage["streams"]);
//check if the config semaphore is stuck, by trying to lock it for 5 attempts of 1 second...
IPC::semaphore configLock("!mistConfLock", O_CREAT | O_RDWR, ACCESSPERMS, 1);
if (!configLock.tryWaitOneSecond() && !configLock.tryWaitOneSecond() && !configLock.tryWaitOneSecond() && !configLock.tryWaitOneSecond()){
//that failed. We now unlock it, no matter what - and print a warning that it was stuck.
WARN_MSG("Configuration semaphore was stuck. Force-unlocking it and re-writing config.");
changed = true;
}
configLock.post();
if (changed){
Controller::writeConfig();
}
}
Util::wait(5000);//wait at least 5 seconds
}

View file

@ -194,7 +194,6 @@ int Controller::handleAPIConnection(Socket::Connection & conn){
//Parse config and streams from the request.
if (Request.isMember("config")){
Controller::checkConfig(Request["config"], Controller::Storage["config"]);
Controller::CheckProtocols(Controller::Storage["config"]["protocols"], capabilities);
}
if (Request.isMember("streams")){
Controller::CheckStreams(Request["streams"], Controller::Storage["streams"]);

View file

@ -81,7 +81,8 @@ namespace Controller {
///\brief Checks current protocol configuration, updates state of enabled connectors if neccessary.
///\param p An object containing all protocols.
///\param capabilities An object containing the detected capabilities.
void CheckProtocols(JSON::Value & p, JSON::Value & capabilities){
///\returns True if any action was taken
bool CheckProtocols(JSON::Value & p, JSON::Value & capabilities){
std::set<std::string> runningConns;
// used for building args
@ -145,12 +146,14 @@ namespace Controller {
}
}
bool action = false;
//shut down deleted/changed connectors
std::map<std::string, pid_t>::iterator it;
for (it = currentConnectors.begin(); it != currentConnectors.end(); it++){
if (!runningConns.count(it->first)){
if (Util::Procs::isActive(it->second)){
Log("CONF", "Stopping connector " + it->first);
action = true;
Util::Procs::Stop(it->second);
}
currentConnectors.erase(it);
@ -162,6 +165,7 @@ namespace Controller {
while (runningConns.size() && conf.is_active){
if (!currentConnectors.count(*runningConns.begin()) || !Util::Procs::isActive(currentConnectors[*runningConns.begin()])){
Log("CONF", "Starting connector: " + *runningConns.begin());
action = true;
// clear out old args
for (i=0; i<15; i++){argarr[i] = 0;}
// get args for this connector
@ -171,6 +175,7 @@ namespace Controller {
}
runningConns.erase(runningConns.begin());
}
return action;
}
}

View file

@ -6,6 +6,6 @@ namespace Controller {
void UpdateProtocol(std::string protocol);
/// Checks current protocol configuration, updates state of enabled connectors if neccesary.
void CheckProtocols(JSON::Value & p, JSON::Value & capabilities);
bool CheckProtocols(JSON::Value & p, JSON::Value & capabilities);
}

View file

@ -93,7 +93,8 @@ namespace Controller {
///\brief Checks all streams, restoring if needed.
///\param data The stream configuration for the server.
void CheckAllStreams(JSON::Value & data){
///\returns True if the server status changed
bool CheckAllStreams(JSON::Value & data){
long long int currTime = Util::epoch();
for (JSON::ObjIter jit = data.ObjBegin(); jit != data.ObjEnd(); jit++){
checkStream(jit->first, jit->second);
@ -117,19 +118,15 @@ namespace Controller {
jit->second["online"] = 1;
}
}
//check for changes in config or streams
static JSON::Value strlist;
bool changed = false;
if (strlist["config"] != Storage["config"]){
if (strlist["config"] != Storage["config"] || strlist["streams"] != Storage["streams"]){
strlist["config"] = Storage["config"];
changed = true;
}
if (strlist["streams"] != Storage["streams"]){
strlist["streams"] = Storage["streams"];
changed = true;
}
if (changed){
writeConfig();
return true;
}
return false;
}
void AddStreams(JSON::Value & in, JSON::Value & out){

View file

@ -3,7 +3,7 @@
namespace Controller {
bool streamsEqual(JSON::Value & one, JSON::Value & two);
void checkStream(std::string name, JSON::Value & data);
void CheckAllStreams(JSON::Value & data);
bool CheckAllStreams(JSON::Value & data);
void CheckStreams(JSON::Value & in, JSON::Value & out);
void AddStreams(JSON::Value & in, JSON::Value & out);