mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	 41d97d6777
			
		
	
	
		41d97d6777
		
	
	
	
	
		
			
			PC/os2emx/
    Makefile
    README.os2emx
    config.c
    dlfcn.c            // libdl emulation code for loadable extensions
    dlfcn.h
    dllentry.c         // DLL initialisation routine for Python DLL
    getpath.c
    pyconfig.h
    python23.def       // Python DLL symbol export definitions
    pythonpm.c         // console-less PM interpreter wrapper
		
	
			
		
			
				
	
	
		
			124 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			124 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();
 | |
| }
 |