4 #ifdef _MSC_VER // Visual Studio
7 #pragma comment(lib, "Ws2_32.lib")
8 #define pipe(fds) _pipe(fds, 1048575, _O_BINARY)
12 #define STDIN_FILENO 0
13 #define STDOUT_FILENO 1
14 #define STDERR_FILENO 2
22 bool JupyROOTExecutorImpl(
const char *code);
23 bool JupyROOTDeclarerImpl(
const char *code);
25 class JupyROOTExecutorHandler {
27 bool fCapturing =
false;
28 std::string fStdoutpipe;
29 std::string fStderrpipe;
30 int fStdout_pipe[2] = {0,0};
31 int fStderr_pipe[2] = {0,0};
32 int fSaved_stderr = 0;
33 int fSaved_stdout = 0;
35 JupyROOTExecutorHandler();
40 std::string &GetStdout();
41 std::string &GetStderr();
45 #ifndef F_LINUX_SPECIFIC_BASE
46 #define F_LINUX_SPECIFIC_BASE 1024
49 #define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
52 constexpr
long MAX_PIPE_SIZE = 1048575;
54 JupyROOTExecutorHandler::JupyROOTExecutorHandler() {}
57 static void PollImpl(FILE *stdStream,
int *pipeHandle, std::string &pipeContent)
63 buf_read = read(pipeHandle[0], &ch, 1);
70 void JupyROOTExecutorHandler::Poll()
72 PollImpl(stdout, fStdout_pipe, fStdoutpipe);
73 PollImpl(stderr, fStderr_pipe, fStderrpipe);
76 static void InitCaptureImpl(
int &savedStdStream,
int *pipeHandle,
int FILENO)
78 savedStdStream = dup(FILENO);
79 if (pipe(pipeHandle) != 0) {
82 #ifdef _MSC_VER // Visual Studio
83 unsigned long mode = 1;
84 ioctlsocket(pipeHandle[0], FIONBIO, &mode);
86 long flags_stdout = fcntl(pipeHandle[0], F_GETFL);
87 if (flags_stdout == -1)
return;
88 flags_stdout |= O_NONBLOCK;
89 fcntl(pipeHandle[0], F_SETFL, flags_stdout);
90 fcntl(pipeHandle[0], F_SETPIPE_SZ, MAX_PIPE_SIZE);
92 dup2(pipeHandle[1], FILENO);
96 void JupyROOTExecutorHandler::InitCapture()
99 InitCaptureImpl(fSaved_stdout, fStdout_pipe, STDOUT_FILENO);
100 InitCaptureImpl(fSaved_stderr, fStderr_pipe, STDERR_FILENO);
105 void JupyROOTExecutorHandler::EndCapture()
109 dup2(fSaved_stdout, STDOUT_FILENO);
110 dup2(fSaved_stderr, STDERR_FILENO);
115 void JupyROOTExecutorHandler::Clear()
121 std::string &JupyROOTExecutorHandler::GetStdout()
126 std::string &JupyROOTExecutorHandler::GetStderr()
131 JupyROOTExecutorHandler *JupyROOTExecutorHandler_ptr =
nullptr;
134 bool JupyROOTExecutorImpl(
const char *code)
138 auto err = TInterpreter::kNoError;
139 if (gInterpreter->ProcessLine(code, &err)) {
143 if (err == TInterpreter::kProcessing) {
144 gInterpreter->ProcessLine(
".@");
145 gInterpreter->ProcessLine(
"cerr << \"Unbalanced braces. This cell was not processed.\" << endl;");
154 bool JupyROOTDeclarerImpl(
const char *code)
158 if (gInterpreter->Declare(code)) {
169 int JupyROOTExecutor(
const char *code)
171 return JupyROOTExecutorImpl(code);
173 int JupyROOTDeclarer(
const char *code)
175 return JupyROOTDeclarerImpl(code);
178 void JupyROOTExecutorHandler_Clear()
180 JupyROOTExecutorHandler_ptr->Clear();
183 void JupyROOTExecutorHandler_Ctor()
185 if (!JupyROOTExecutorHandler_ptr) {
186 JupyROOTExecutorHandler_ptr =
new JupyROOTExecutorHandler();
188 gInterpreter->ProcessLine(
"SetErrorHandler((ErrorHandlerFunc_t)&DefaultErrorHandler);");
192 void JupyROOTExecutorHandler_Poll()
194 JupyROOTExecutorHandler_ptr->Poll();
197 void JupyROOTExecutorHandler_EndCapture()
199 JupyROOTExecutorHandler_ptr->EndCapture();
202 void JupyROOTExecutorHandler_InitCapture()
204 JupyROOTExecutorHandler_ptr->InitCapture();
207 const char *JupyROOTExecutorHandler_GetStdout()
209 return JupyROOTExecutorHandler_ptr->GetStdout().c_str();
212 const char *JupyROOTExecutorHandler_GetStderr()
214 return JupyROOTExecutorHandler_ptr->GetStderr().c_str();
217 void JupyROOTExecutorHandler_Dtor()
219 if (!JupyROOTExecutorHandler_ptr)
return;
220 delete JupyROOTExecutorHandler_ptr;
221 JupyROOTExecutorHandler_ptr =
nullptr;