mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 13:11:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			125 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			125 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* OS/2 PM main program - creates a hidden window, and starts Python
 | ||
|  |  * interpreter in a separate thread, so that Python scripts can be | ||
|  |  * run in PM process space without a console Window.  The interpreter | ||
|  |  * is incorporated by linking in the Python DLL. | ||
|  |  * | ||
|  |  * As it stands, I don't think this is adequate for supporting Python | ||
|  |  * GUI modules, as the Python thread doesn't have its own message | ||
|  |  * queue - which is required of threads that want to create/use | ||
|  |  * PM windows. | ||
|  |  * | ||
|  |  * This code owes a lot to "OS/2 Presentation Manager Programming", by | ||
|  |  * Charles Petzold. | ||
|  |  * | ||
|  |  * Andrew MacIntyre <andymac@bullseye.apana.org.au>, August 2001. | ||
|  |  * Released under the terms of the Python 2.1.1 licence - see the LICENCE | ||
|  |  * file in the Python v2.1.1 (or later) source distribution. | ||
|  |  * Copyright assigned to the Python Software Foundation, 2001. | ||
|  |  */ | ||
|  | 
 | ||
|  | #define INCL_DOS
 | ||
|  | #define INCL_WIN
 | ||
|  | #include <os2.h>
 | ||
|  | #include <process.h>
 | ||
|  | 
 | ||
|  | #include "Python.h"
 | ||
|  | 
 | ||
|  | /* use structure to pass command line to Python thread */ | ||
|  | typedef struct | ||
|  | { | ||
|  | 	int argc; | ||
|  | 	char **argv; | ||
|  | 	HWND Frame; | ||
|  | 	int running; | ||
|  | } arglist; | ||
|  | 
 | ||
|  | /* make this a global to simplify access.
 | ||
|  |  * it should only be set from the Python thread, or by the code that | ||
|  |  * initiates the Python thread when the thread cannot be created. | ||
|  |  */ | ||
|  | int PythonRC; | ||
|  | 
 | ||
|  | extern DL_EXPORT(int) Py_Main(int, char **); | ||
|  | void PythonThread(void *); | ||
|  | 
 | ||
|  | int | ||
|  | main(int argc, char **argv) | ||
|  | { | ||
|  | 	ULONG FrameFlags = FCF_TITLEBAR | | ||
|  | 			   FCF_SYSMENU | | ||
|  | 			   FCF_SIZEBORDER | | ||
|  | 			   FCF_HIDEBUTTON | | ||
|  | 			   FCF_SHELLPOSITION | | ||
|  | 			   FCF_TASKLIST; | ||
|  | 	HAB hab; | ||
|  | 	HMQ hmq; | ||
|  | 	HWND Client; | ||
|  | 	QMSG qmsg; | ||
|  | 	arglist args; | ||
|  | 	int python_tid; | ||
|  | 
 | ||
|  | 	/* init PM and create message queue */ | ||
|  | 	hab = WinInitialize(0); | ||
|  | 	hmq = WinCreateMsgQueue(hab, 0); | ||
|  | 
 | ||
|  | 	/* create a (hidden) Window to house the window procedure */ | ||
|  | 	args.Frame = WinCreateStdWindow(HWND_DESKTOP, | ||
|  | 					0, | ||
|  | 					&FrameFlags, | ||
|  | 					NULL, | ||
|  | 					"PythonPM", | ||
|  | 					0L, | ||
|  | 					0, | ||
|  | 					0, | ||
|  | 					&Client); | ||
|  | 
 | ||
|  | 	/* run Python interpreter in a thread */ | ||
|  | 	args.argc = argc; | ||
|  | 	args.argv = argv; | ||
|  | 	args.running = 0; | ||
|  | 	if (-1 == (python_tid = _beginthread(PythonThread, NULL, 1024 * 1024, &args))) | ||
|  | 	{ | ||
|  | 		/* couldn't start thread */ | ||
|  | 		WinAlarm(HWND_DESKTOP, WA_ERROR); | ||
|  | 		PythonRC = 1; | ||
|  | 	} | ||
|  | 	else | ||
|  | 	{ | ||
|  | 		/* process PM messages, until Python exits */ | ||
|  | 		while (WinGetMsg(hab, &qmsg, NULLHANDLE, 0, 0)) | ||
|  | 			WinDispatchMsg(hab, &qmsg); | ||
|  | 		if (args.running > 0) | ||
|  | 			DosKillThread(python_tid); | ||
|  | 	} | ||
|  | 		 | ||
|  | 	/* destroy window, shutdown message queue and PM */ | ||
|  | 	WinDestroyWindow(args.Frame); | ||
|  | 	WinDestroyMsgQueue(hmq); | ||
|  | 	WinTerminate(hab); | ||
|  | 
 | ||
|  | 	return PythonRC; | ||
|  | } | ||
|  | 
 | ||
|  | void PythonThread(void *argl) | ||
|  | { | ||
|  | 	HAB hab; | ||
|  | 	arglist *args; | ||
|  | 
 | ||
|  | 	/* PM initialisation */ | ||
|  | 	hab = WinInitialize(0); | ||
|  | 
 | ||
|  | 	/* start Python */ | ||
|  | 	args = (arglist *)argl; | ||
|  | 	args->running = 1; | ||
|  | 	PythonRC = Py_Main(args->argc, args->argv); | ||
|  | 
 | ||
|  | 	/* enter a critical section and send the termination message */ | ||
|  | 	DosEnterCritSec(); | ||
|  | 	args->running = 0; | ||
|  | 	WinPostMsg(args->Frame, WM_QUIT, NULL, NULL); | ||
|  | 
 | ||
|  | 	/* shutdown PM and terminate thread */ | ||
|  | 	WinTerminate(hab); | ||
|  | 	_endthread(); | ||
|  | } |