Import Tcl-code 8.6.8
This commit is contained in:
@@ -31,6 +31,15 @@ typedef struct TCLEXCEPTION_REGISTRATION {
|
||||
} TCLEXCEPTION_REGISTRATION;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Windows version dependend functions
|
||||
*/
|
||||
typedef struct TclWinProcs {
|
||||
BOOL (WINAPI *cancelSynchronousIo)(HANDLE);
|
||||
} TclWinProcs;
|
||||
|
||||
MODULE_SCOPE TclWinProcs tclWinProcs;
|
||||
|
||||
/*
|
||||
* Some versions of Borland C have a define for the OSVERSIONINFO for
|
||||
* Win32s and for NT, but not for Windows 95.
|
||||
@@ -86,4 +95,70 @@ MODULE_SCOPE void TclpSetAllocCache(void *);
|
||||
#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
|
||||
#endif
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
* Declarations of helper-workers threaded facilities for a pipe based channel.
|
||||
*
|
||||
* Corresponding functionality provided in "tclWinPipe.c".
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
typedef struct TclPipeThreadInfo {
|
||||
HANDLE evControl; /* Auto-reset event used by the main thread to
|
||||
* signal when the pipe thread should attempt
|
||||
* to do read/write operation. Additionally
|
||||
* used as signal to stop (state set to -1) */
|
||||
volatile LONG state; /* Indicates current state of the thread */
|
||||
ClientData clientData; /* Referenced data of the main thread */
|
||||
HANDLE evWakeUp; /* Optional wake-up event worker set by shutdown */
|
||||
} TclPipeThreadInfo;
|
||||
|
||||
|
||||
/* If pipe-workers will use some tcl subsystem, we can use ckalloc without
|
||||
* more overhead for finalize thread (should be executed anyway)
|
||||
*
|
||||
* #define _PTI_USE_CKALLOC 1
|
||||
*/
|
||||
|
||||
/*
|
||||
* State of the pipe-worker.
|
||||
*
|
||||
* State PTI_STATE_STOP possible from idle state only, worker owns TI structure.
|
||||
* Otherwise PTI_STATE_END used (main thread hold ownership of the TI).
|
||||
*/
|
||||
|
||||
#define PTI_STATE_IDLE 0 /* idle or not yet initialzed */
|
||||
#define PTI_STATE_WORK 1 /* in work */
|
||||
#define PTI_STATE_STOP 2 /* thread should stop work (owns TI structure) */
|
||||
#define PTI_STATE_END 4 /* thread should stop work (worker is busy) */
|
||||
#define PTI_STATE_DOWN 8 /* worker is down */
|
||||
|
||||
|
||||
MODULE_SCOPE
|
||||
TclPipeThreadInfo * TclPipeThreadCreateTI(TclPipeThreadInfo **pipeTIPtr,
|
||||
ClientData clientData, HANDLE wakeEvent);
|
||||
MODULE_SCOPE int TclPipeThreadWaitForSignal(TclPipeThreadInfo **pipeTIPtr);
|
||||
|
||||
static inline void
|
||||
TclPipeThreadSignal(
|
||||
TclPipeThreadInfo **pipeTIPtr)
|
||||
{
|
||||
TclPipeThreadInfo *pipeTI = *pipeTIPtr;
|
||||
if (pipeTI) {
|
||||
SetEvent(pipeTI->evControl);
|
||||
}
|
||||
};
|
||||
|
||||
static inline int
|
||||
TclPipeThreadIsAlive(
|
||||
TclPipeThreadInfo **pipeTIPtr)
|
||||
{
|
||||
TclPipeThreadInfo *pipeTI = *pipeTIPtr;
|
||||
return (pipeTI && pipeTI->state != PTI_STATE_DOWN);
|
||||
};
|
||||
|
||||
MODULE_SCOPE int TclPipeThreadStopSignal(TclPipeThreadInfo **pipeTIPtr, HANDLE wakeEvent);
|
||||
MODULE_SCOPE void TclPipeThreadStop(TclPipeThreadInfo **pipeTIPtr, HANDLE hThread);
|
||||
MODULE_SCOPE void TclPipeThreadExit(TclPipeThreadInfo **pipeTIPtr);
|
||||
|
||||
#endif /* _TCLWININT */
|
||||
|
||||
Reference in New Issue
Block a user