fastcgi++
manager.cpp
Go to the documentation of this file.
1 #include <fastcgi++/manager.hpp>
2 
3 
5 
6 Fastcgipp::ManagerPar::ManagerPar(int fd, const boost::function<void(Protocol::FullId, Message)>& sendMessage_, bool doSetupSignals): transceiver(fd, sendMessage_), asleep(false), stopBool(false), terminateBool(false)
7 {
8  if(doSetupSignals) setupSignals();
9  instance=this;
10 }
11 
13 {
14  boost::lock_guard<boost::mutex> terminateLock(terminateMutex);
15  boost::lock_guard<boost::mutex> sleepLock(sleepMutex);
16  terminateBool=true;
17  if(asleep)
18  {
19  transceiver.wake();
20  asleep=false;
21  }
22 }
23 
25 {
26  boost::lock_guard<boost::mutex> stopLock(stopMutex);
27  boost::lock_guard<boost::mutex> sleepLock(sleepMutex);
28  stopBool=true;
29  if(asleep)
30  {
31  transceiver.wake();
32  asleep=false;
33  }
34 }
35 
37 {
38  switch(signum)
39  {
40  case SIGUSR1:
41  {
42  if(instance) instance->terminate();
43  break;
44  }
45  case SIGTERM:
46  {
47  if(instance) instance->stop();
48  break;
49  }
50  }
51 }
52 
54 {
55  struct sigaction sigAction;
56  sigAction.sa_handler=Fastcgipp::ManagerPar::signalHandler;
57  sigemptyset(&sigAction.sa_mask);
58  sigAction.sa_flags=0;
59 
60  sigaction(SIGPIPE, &sigAction, NULL);
61  sigaction(SIGUSR1, &sigAction, NULL);
62  sigaction(SIGTERM, &sigAction, NULL);
63 }
64 
66 {
67  using namespace std;
68  using namespace Protocol;
69  Message message(messages.front());
70  messages.pop();
71 
72  if(!message.type)
73  {
74  const Header& header=*(Header*)message.data.get();
75  switch(header.getType())
76  {
77  case GET_VALUES:
78  {
79  size_t nameSize;
80  size_t valueSize;
81  const char* name;
82  const char* value;
83  processParamHeader(message.data.get()+sizeof(Header), header.getContentLength(), name, nameSize, value, valueSize);
84  if(nameSize==14 && !memcmp(name, "FCGI_MAX_CONNS", 14))
85  {
86  Block buffer(transceiver.requestWrite(sizeof(maxConnsReply)));
87  memcpy(buffer.data, (const char*)&maxConnsReply, sizeof(maxConnsReply));
88  transceiver.secureWrite(sizeof(maxConnsReply), id, false);
89  }
90  else if(nameSize==13 && !memcmp(name, "FCGI_MAX_REQS", 13))
91  {
92  Block buffer(transceiver.requestWrite(sizeof(maxReqsReply)));
93  memcpy(buffer.data, (const char*)&maxReqsReply, sizeof(maxReqsReply));
94  transceiver.secureWrite(sizeof(maxReqsReply), id, false);
95  }
96  else if(nameSize==15 && !memcmp(name, "FCGI_MPXS_CONNS", 15))
97  {
98  Block buffer(transceiver.requestWrite(sizeof(mpxsConnsReply)));
99  memcpy(buffer.data, (const char*)&mpxsConnsReply, sizeof(mpxsConnsReply));
100  transceiver.secureWrite(sizeof(mpxsConnsReply), id, false);
101  }
102 
103  break;
104  }
105 
106  default:
107  {
108  Block buffer(transceiver.requestWrite(sizeof(Header)+sizeof(UnknownType)));
109 
110  Header& sendHeader=*(Header*)buffer.data;
111  sendHeader.setVersion(Protocol::version);
112  sendHeader.setType(UNKNOWN_TYPE);
113  sendHeader.setRequestId(0);
114  sendHeader.setContentLength(sizeof(UnknownType));
115  sendHeader.setPaddingLength(0);
116 
117  UnknownType& sendBody=*(UnknownType*)(buffer.data+sizeof(Header));
118  sendBody.setType(header.getType());
119 
120  transceiver.secureWrite(sizeof(Header)+sizeof(UnknownType), id, false);
121 
122  break;
123  }
124  }
125  }
126 }