fastcgi++
manager.cpp
Go to the documentation of this file.
00001 #include <fastcgi++/manager.hpp>
00002 
00003 
00004 Fastcgipp::ManagerPar* Fastcgipp::ManagerPar::instance=0;
00005 
00006 Fastcgipp::ManagerPar::ManagerPar(int fd, const boost::function<void(Protocol::FullId, Message)>& sendMessage_, bool doSetupSignals): transceiver(fd, sendMessage_), asleep(false), stopBool(false), terminateBool(false)
00007 {
00008    if(doSetupSignals) setupSignals();
00009    instance=this;
00010 }
00011 
00012 void Fastcgipp::ManagerPar::terminate()
00013 {
00014    boost::lock_guard<boost::mutex> terminateLock(terminateMutex);
00015    boost::lock_guard<boost::mutex> sleepLock(sleepMutex);
00016    terminateBool=true;
00017    if(asleep)
00018    {
00019       transceiver.wake();
00020       asleep=false;
00021    }
00022 }
00023 
00024 void Fastcgipp::ManagerPar::stop()
00025 {
00026    boost::lock_guard<boost::mutex> stopLock(stopMutex);
00027    boost::lock_guard<boost::mutex> sleepLock(sleepMutex);
00028    stopBool=true;
00029    if(asleep)
00030    {
00031       transceiver.wake();
00032       asleep=false;
00033    }
00034 }
00035 
00036 void Fastcgipp::ManagerPar::signalHandler(int signum)
00037 {
00038    switch(signum)
00039    {
00040       case SIGUSR1:
00041       {
00042          if(instance) instance->terminate();
00043          break;
00044       }
00045       case SIGTERM:
00046       {
00047          if(instance) instance->stop();
00048          break;
00049       }
00050    }
00051 }
00052 
00053 void Fastcgipp::ManagerPar::setupSignals()
00054 {
00055    struct sigaction sigAction;
00056    sigAction.sa_handler=Fastcgipp::ManagerPar::signalHandler;
00057    sigemptyset(&sigAction.sa_mask);
00058    sigAction.sa_flags=0;
00059 
00060    sigaction(SIGPIPE, &sigAction, NULL);
00061    sigaction(SIGUSR1, &sigAction, NULL);
00062    sigaction(SIGTERM, &sigAction, NULL);
00063 }
00064 
00065 void Fastcgipp::ManagerPar::localHandler(Protocol::FullId id)
00066 {
00067    using namespace std;
00068    using namespace Protocol;
00069    Message message(messages.front());
00070    messages.pop();
00071    
00072    if(!message.type)
00073    {
00074       const Header& header=*(Header*)message.data.get(); 
00075       switch(header.getType())
00076       {
00077          case GET_VALUES:
00078          {
00079             size_t nameSize;
00080             size_t valueSize;
00081             const char* name;
00082             const char* value;
00083             processParamHeader(message.data.get()+sizeof(Header), header.getContentLength(), name, nameSize, value, valueSize);
00084             if(nameSize==14 && !memcmp(name, "FCGI_MAX_CONNS", 14))
00085             {
00086                Block buffer(transceiver.requestWrite(sizeof(maxConnsReply)));
00087                memcpy(buffer.data, (const char*)&maxConnsReply, sizeof(maxConnsReply));
00088                transceiver.secureWrite(sizeof(maxConnsReply), id, false);
00089             }
00090             else if(nameSize==13 && !memcmp(name, "FCGI_MAX_REQS", 13))
00091             {
00092                Block buffer(transceiver.requestWrite(sizeof(maxReqsReply)));
00093                memcpy(buffer.data, (const char*)&maxReqsReply, sizeof(maxReqsReply));
00094                transceiver.secureWrite(sizeof(maxReqsReply), id, false);
00095             }
00096             else if(nameSize==15 && !memcmp(name, "FCGI_MPXS_CONNS", 15))
00097             {
00098                Block buffer(transceiver.requestWrite(sizeof(mpxsConnsReply)));
00099                memcpy(buffer.data, (const char*)&mpxsConnsReply, sizeof(mpxsConnsReply));
00100                transceiver.secureWrite(sizeof(mpxsConnsReply), id, false);
00101             }
00102 
00103             break;
00104          }
00105 
00106          default:
00107          {
00108             Block buffer(transceiver.requestWrite(sizeof(Header)+sizeof(UnknownType)));
00109 
00110             Header& sendHeader=*(Header*)buffer.data;
00111             sendHeader.setVersion(Protocol::version);
00112             sendHeader.setType(UNKNOWN_TYPE);
00113             sendHeader.setRequestId(0);
00114             sendHeader.setContentLength(sizeof(UnknownType));
00115             sendHeader.setPaddingLength(0);
00116 
00117             UnknownType& sendBody=*(UnknownType*)(buffer.data+sizeof(Header));
00118             sendBody.setType(header.getType());
00119 
00120             transceiver.secureWrite(sizeof(Header)+sizeof(UnknownType), id, false);
00121 
00122             break;
00123          }
00124       }
00125    }
00126 }