fastcgi++
|
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 }