23 #include <sys/socket.h> 101 std::string basePath =
"/tmp/ROOTMP-";
106 unsigned nWorker = 0;
109 int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sockets);
111 Error(
"TMPClient::Fork",
"[E][C] Could not create socketpair. Error n. . Now retrying.\n%d", errno);
125 TSocket *s =
new TSocket(sockets[0], (std::to_string(pid)).c_str());
130 Error(
"TMPClient::Fork",
"[E][C] Could not connect to worker with pid %d. Giving up.\n", pid);
147 if (signalHandlers && signalHandlers->
GetSize() > 0)
155 for (
auto h : *fileHandlers) {
190 server.
Init(sockets[1], nWorker);
226 if (count == nMessages)
232 Error(
"TMPClient:Broadcast",
"[E] Could not send message to server\n");
279 waitpid(pid,
nullptr, 0);
299 unsigned code = msg.first;
301 const char *str = ReadBuffer<const char*>(msg.second.get());
304 Error(
"TMPClient::HandleMPCode",
"[I][C] message received: %s\n", str);
306 Error(
"TMPClient::HandleMPCode",
"[E][C] error message received: %s\n", str);
309 Error(
"TMPClient::HandleMPCode",
"[I][C] shutdown notice received from %s\n", str);
312 Error(
"TMPClient::HandleMPCode",
"[W][C] unknown code received. code=%d\n", code);
R__EXTERN TGuiFactory * gBatchGuiFactory
virtual Bool_t IsValid() const
std::vector< pid_t > fWorkerPids
A vector containing the PIDs of children processes/workers.
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
virtual void Remove(TSocket *sock)
Remove a socket from the monitor.
bool Fork(TMPWorker &server)
This method forks the ROOT session into fNWorkers children processes.
virtual TSeqCollection * GetListOfFileHandlers() const
TMonitor fMon
This object manages the sockets and detect socket events via TMonitor::Select.
This class works in conjuction with TMPClient, reacting to messages received from it as specified by ...
int MPSend(TSocket *s, unsigned code)
Send a message with the specified code on the specified socket.
virtual void Add(TSocket *sock, Int_t interest=kRead)
Add socket to the monitor's active list.
virtual void RemoveAll()
Remove all sockets from the monitor.
~TMPClient()
Class destructor.
virtual TFileHandler * RemoveFileHandler(TFileHandler *fh)
Remove a file handler from the list of file handlers.
unsigned fNWorkers
The number of workers that should be spawned upon forking.
void Remove(TSocket *s)
Remove a certain socket from the monitor.
Sequenceable collection abstract base class.
virtual int GetSysInfo(SysInfo_t *info) const
Returns static system info, like OS type, CPU type, number of CPUs RAM size, etc into the SysInfo_t s...
virtual void DeActivate(TSocket *sock)
De-activate a socket.
void DeActivate(TSocket *s)
DeActivate a certain socket.
R__EXTERN TGuiFactory * gGuiFactory
Used by the workers to notify client of shutdown.
void Error(const char *location, const char *msgfmt,...)
Fatal error: whoever sends this message is terminating execution.
R__EXTERN TVirtualX * gGXBatch
virtual TObject * First() const
Return the first object in the list. Returns 0 when list is empty.
std::pair< unsigned, std::unique_ptr< TBufferFile > > MPCodeBufPair
An std::pair that wraps the code and optional object contained in a message.
R__EXTERN TSystem * gSystem
TList * GetListOfActives() const
Returns a list with all active sockets.
virtual TSeqCollection * GetListOfSignalHandlers() const
TMPClient(unsigned nWorkers=0)
Class constructor.
Used by the client to tell servers to shutdown.
virtual TSignalHandler * RemoveSignalHandler(TSignalHandler *sh)
Remove a signal handler from list of signal handlers.
bool fIsParent
This is true if this is the parent/client process, false if this is a child/worker process...
TList * GetListOfDeActives() const
Returns a list with all de-active sockets.
void HandleMPCode(MPCodeBufPair &msg, TSocket *sender)
Handle messages containing an EMPCode.
virtual void Init(int fd, unsigned workerN)
This method is called by children processes right after forking.
virtual void ActivateAll()
Activate all de-activated sockets.
unsigned Broadcast(unsigned code, unsigned nMessages=0)
Send a message with the specified code to at most nMessages workers.
virtual Int_t GetSize() const
void ReapWorkers()
Wait on worker processes and remove their pids from fWorkerPids.
virtual TObject * First() const =0