Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c46d22e

Browse files
committed
Print ps (process status) for us when starting a new thread.
Even less shuffling of stdout (only at start of new interpreter). Interact properly with new interpreter initialization conventions (must use Py_Initialize/Py_Finalize *and* Py_NewInterpreter/Py_EndInterpreter). Probably more minor changes.
1 parent 35d4337 commit c46d22e

1 file changed

Lines changed: 40 additions & 9 deletions

File tree

Demo/pysvr/pysvr.c

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,12 @@ static void create_thread(int, struct sockaddr_in *);
4848
static void *service_thread(struct workorder *);
4949
static void run_interpreter(FILE *, FILE *);
5050
static int run_command(char *, PyObject *);
51+
static void ps(void);
5152

5253
static char *progname = "pysvr";
5354

55+
static PyThreadState *gtstate;
56+
5457
main(int argc, char **argv)
5558
{
5659
int port = PORT;
@@ -98,7 +101,7 @@ usage()
98101
static void
99102
main_thread(int port)
100103
{
101-
int sock, conn, size;
104+
int sock, conn, size, i;
102105
struct sockaddr_in addr, clientaddr;
103106

104107
sock = socket(PF_INET, SOCK_STREAM, 0);
@@ -108,7 +111,7 @@ main_thread(int port)
108111
exit(1);
109112
}
110113

111-
memset(&addr, '\0', sizeof addr);
114+
memset((char *)&addr, '\0', sizeof addr);
112115
addr.sin_family = AF_INET;
113116
addr.sin_port = htons(port);
114117
addr.sin_addr.s_addr = 0L;
@@ -126,8 +129,9 @@ main_thread(int port)
126129

127130
fprintf(stderr, "Listening on port %d...\n", port);
128131

129-
for (;;) {
132+
for (i = 0; ; i++) {
130133
size = sizeof clientaddr;
134+
memset((char *) &clientaddr, '\0', size);
131135
conn = accept(sock, (struct sockaddr *) &clientaddr, &size);
132136
if (conn < 0) {
133137
oprogname();
@@ -136,6 +140,7 @@ main_thread(int port)
136140
}
137141

138142
size = sizeof addr;
143+
memset((char *) &addr, '\0', size);
139144
if (getsockname(conn, (struct sockaddr *)&addr, &size) < 0) {
140145
oprogname();
141146
perror("can't get socket name of connection");
@@ -150,8 +155,21 @@ main_thread(int port)
150155
close(conn);
151156
continue;
152157
}
158+
if (i == 4) {
159+
close(conn);
160+
break;
161+
}
153162
create_thread(conn, &clientaddr);
154163
}
164+
165+
close(sock);
166+
167+
if (gtstate) {
168+
PyEval_AcquireThread(gtstate);
169+
gtstate = NULL;
170+
Py_Finalize();
171+
}
172+
exit(0);
155173
}
156174

157175
static void
@@ -192,8 +210,11 @@ static PyObject *the_builtins;
192210
static void
193211
init_python()
194212
{
195-
PyEval_InitThreads(); /* Create and acquire the interpreter lock */
196-
PyEval_ReleaseLock(); /* Release the lock */
213+
if (gtstate)
214+
return;
215+
Py_Initialize(); /* Initialize the interpreter */
216+
PyEval_InitThreads(); /* Create (and acquire) the interpreter lock */
217+
gtstate = PyEval_SaveThread(); /* Release the thread state */
197218
}
198219

199220
static void *
@@ -203,6 +224,8 @@ service_thread(struct workorder *work)
203224

204225
fprintf(stderr, "Start thread for connection %d.\n", work->conn);
205226

227+
ps();
228+
206229
input = fdopen(work->conn, "r");
207230
if (input == NULL) {
208231
oprogname();
@@ -264,6 +287,10 @@ run_interpreter(FILE *input, FILE *output)
264287
new_stdin = PyFile_FromFile(input, "<socket-in>", "r", NULL);
265288
new_stdout = PyFile_FromFile(output, "<socket-out>", "w", NULL);
266289

290+
PySys_SetObject("stdin", new_stdin);
291+
PySys_SetObject("stdout", new_stdout);
292+
PySys_SetObject("stderr", new_stdout);
293+
267294
for (n = 1; !PyErr_Occurred(); n++) {
268295
Py_BEGIN_ALLOW_THREADS
269296
fprintf(output, "%d> ", n);
@@ -286,10 +313,6 @@ run_interpreter(FILE *input, FILE *output)
286313
if (p[0] == '#' || p[0] == '\0')
287314
continue;
288315

289-
PySys_SetObject("stdin", new_stdin);
290-
PySys_SetObject("stdout", new_stdout);
291-
PySys_SetObject("stderr", new_stdout);
292-
293316
end = run_command(buffer, globals);
294317
if (end < 0)
295318
PyErr_Print();
@@ -327,3 +350,11 @@ run_command(char *buffer, PyObject *globals)
327350
Py_DECREF(v);
328351
return 0;
329352
}
353+
354+
static void
355+
ps()
356+
{
357+
char buffer[100];
358+
sprintf(buffer, "ps -l -p %d </dev/null | tail +2l\n", getpid());
359+
system(buffer);
360+
}

0 commit comments

Comments
 (0)