267e201dae
cygthread to handle extra argument, throughout. * cygthread.h (cygthread::callproc): Declare new method. (cygthread::cygthread): Add optional length argument to allow copying arguments to executing thread. * cygthread.cc (cygthread::callproc): Define new method. (cygthread::stub): Use callfunc to invoke thread func to allow potentially allocating stack memory which will be returned. (cygthread::simplestub): Ditto. (cygthread::cygthread): Accept arglen argument. Reset ev here prior to activating thread. Wait for ev after activating thread if we're copying contents to the thread. Wait until the end before setting h, to allow thread synchronization. (cygthread::release): Don't reset ev here. Rely on that happening the next time the thread is activated. * pinfo.h (commune_process): Rename declaration from _pinfo::commune_process. * pinfo.cc (commune_process): Ditto for definition. Modify slightly to allow running as a separate cygthread. * sigproc.cc (child_info::sync): Always wait for both subproc_ready and any hProcess if we have a cygwin parent. (talktome): Change argument to be a pointer to siginfo_t. Contiguously allocate whole siginfo_t structure + any needed extra for eventual passing to commune_process thread. (wait_sig): Accommodate change in talktome argument. * pipe.cc (fhandler_pipe::fixup_after_exec): Remove debugging.
58 lines
1.4 KiB
C++
58 lines
1.4 KiB
C++
/* cygthread.h
|
|
|
|
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
#ifndef _CYGTHREAD_H
|
|
#define _CYGTHREAD_H
|
|
|
|
class cygthread
|
|
{
|
|
LONG inuse;
|
|
DWORD id;
|
|
HANDLE h;
|
|
HANDLE ev;
|
|
HANDLE thread_sync;
|
|
void *stack_ptr;
|
|
const char *__name;
|
|
#ifdef DEBUGGING
|
|
const char *__oldname;
|
|
bool terminated;
|
|
#endif
|
|
LPTHREAD_START_ROUTINE func;
|
|
unsigned arglen;
|
|
VOID *arg;
|
|
bool is_freerange;
|
|
static bool exiting;
|
|
HANDLE notify_detached;
|
|
public:
|
|
bool terminate_thread ();
|
|
static DWORD WINAPI stub (VOID *);
|
|
static DWORD WINAPI simplestub (VOID *);
|
|
static DWORD main_thread_id;
|
|
static const char * name (DWORD = 0);
|
|
void callfunc (bool) __attribute__ ((noinline, regparm (2)));
|
|
void auto_release () {func = NULL;}
|
|
void release (bool);
|
|
cygthread (LPTHREAD_START_ROUTINE, unsigned, LPVOID, const char *, HANDLE = NULL);
|
|
cygthread () {};
|
|
static void init ();
|
|
bool detach (HANDLE = NULL);
|
|
operator HANDLE ();
|
|
void * operator new (size_t);
|
|
static cygthread *freerange ();
|
|
static void terminate ();
|
|
bool SetThreadPriority (int nPriority) {return ::SetThreadPriority (h, nPriority);}
|
|
void zap_h ()
|
|
{
|
|
CloseHandle (h);
|
|
h = NULL;
|
|
}
|
|
};
|
|
|
|
#define cygself NULL
|
|
#endif /*_CYGTHREAD_H*/
|