* Makefile.in: Remove some obsolete stuff.
* dcrt0.cc (dll_crt0_1): Call signal_fixup_after_exec where appropriate. Set myself->uid from parent version. Just use ThreadItem Init method. Close or store hexec_proc as appropriate. (_dll_crt0): Store user_data->forkee here so that proper tests can be made subsequently. (do_exit): Remove hExeced stuff. * environ.cc (environ_init): Accept environ count as well as environ pointer. * environ.h: Reflect above change. * pinfo.cc (pinfo_init): Ditto. Accept environ count. (fixup_in_spawned_child): Remove. * spawn.cc (spawn_guts): Move signal code to dll_crt0_1. Don't suspend execing process since it is no longer necessary. Store envc. * exceptions.cc (signal_fixup_after_exec): New function. (call_handler): Remove hExeced test. * child_info.h (cygheap_exec_info): Store envc as well as envp. (child_info_spawn): Store hexec_proc so that it can be closed in child. * path.cc (normalize_posix_path): Avoid intermediate use of temporary cwd buf. (normalize_win32_path): Ditto. (cwdstuff::get_initial): Always set lock. * sigproc.h: Remove hExeced. * strace.cc (strace::vsprntf): Modify to accomodate for lack of hExeced. * thread.cc (MTinterface::Init): Merge Init1 and ClearReent into this method. (MTinterface::Init1): Eliminate. (MTinterface::ClearReent): Eliminate. * thread.h: Reflect above changes. * include/sys/strace.h (strace): Make microseconds() public. Make various functions 'regparm', throughout. * pinfo.h (_pinfo): Inline simple signal manipulation functions. Requires inclusion of thread.h which was removed from .cc files, where appropriate. throughout. * pinfo.cc: Eliminate signal manipulation functions. (_pinfo::exit): Calculate total rusage for exiting process here. * cygheap.cc (size2bucket): Eliminate. (init_buckets): Ditto. (_cmalloc): Calculate size and bits in a loop rather than going through a function call. (_crealloc): Use stored array index to calculate allocated size. * spawn.cc (spawn_guts): Use _pinfo exit method to exit, calculating cpu usage.
This commit is contained in:
parent
d9d9b70718
commit
166b2571ce
|
@ -1,3 +1,49 @@
|
|||
Mon Oct 16 18:37:22 2000 Christopher Faylor <cgf@cygnus.com>
|
||||
|
||||
* Makefile.in: Remove some obsolete stuff.
|
||||
* dcrt0.cc (dll_crt0_1): Call signal_fixup_after_exec where appropriate.
|
||||
Set myself->uid from parent version.
|
||||
Just use ThreadItem Init method. Close or store hexec_proc as appropriate.
|
||||
(_dll_crt0): Store user_data->forkee here so that proper tests can be made
|
||||
subsequently.
|
||||
(do_exit): Remove hExeced stuff.
|
||||
* environ.cc (environ_init): Accept environ count as well as environ pointer.
|
||||
* environ.h: Reflect above change.
|
||||
* pinfo.cc (pinfo_init): Ditto. Accept environ count.
|
||||
(fixup_in_spawned_child): Remove.
|
||||
* spawn.cc (spawn_guts): Move signal code to dll_crt0_1. Don't suspend
|
||||
execing process since it is no longer necessary. Store envc.
|
||||
* exceptions.cc (signal_fixup_after_exec): New function.
|
||||
(call_handler): Remove hExeced test.
|
||||
* child_info.h (cygheap_exec_info): Store envc as well as envp.
|
||||
(child_info_spawn): Store hexec_proc so that it can be closed in child.
|
||||
* path.cc (normalize_posix_path): Avoid intermediate use of temporary cwd buf.
|
||||
(normalize_win32_path): Ditto.
|
||||
(cwdstuff::get_initial): Always set lock.
|
||||
* sigproc.h: Remove hExeced.
|
||||
* strace.cc (strace::vsprntf): Modify to accomodate for lack of hExeced.
|
||||
* thread.cc (MTinterface::Init): Merge Init1 and ClearReent into this method.
|
||||
(MTinterface::Init1): Eliminate.
|
||||
(MTinterface::ClearReent): Eliminate.
|
||||
* thread.h: Reflect above changes.
|
||||
* include/sys/strace.h (strace): Make microseconds() public.
|
||||
|
||||
Sun Oct 15 21:54:52 2000 Christopher Faylor <cgf@cygnus.com>
|
||||
|
||||
Make various functions 'regparm', throughout.
|
||||
* pinfo.h (_pinfo): Inline simple signal manipulation functions.
|
||||
Requires inclusion of thread.h which was removed from .cc files, where
|
||||
appropriate. throughout.
|
||||
* pinfo.cc: Eliminate signal manipulation functions.
|
||||
(_pinfo::exit): Calculate total rusage for exiting process here.
|
||||
* cygheap.cc (size2bucket): Eliminate.
|
||||
(init_buckets): Ditto.
|
||||
(_cmalloc): Calculate size and bits in a loop rather than going through
|
||||
a function call.
|
||||
(_crealloc): Use stored array index to calculate allocated size.
|
||||
* spawn.cc (spawn_guts): Use _pinfo exit method to exit, calculating
|
||||
cpu usage.
|
||||
|
||||
Sat Oct 14 21:24:16 2000 Christopher Faylor <cgf@cygnus.com>
|
||||
|
||||
* exceptions.cc (set_console_handler): Don't allocate
|
||||
|
|
|
@ -51,7 +51,7 @@ CC:=@CC@
|
|||
# FIXME: Which is it, CC or CC_FOR_TARGET?
|
||||
CC_FOR_TARGET:=$(CC)
|
||||
CFLAGS:=@CFLAGS@
|
||||
CFLAGS+=-MD
|
||||
CFLAGS+=-MD -fbuiltin
|
||||
CXXFLAGS:=@CXXFLAGS@
|
||||
|
||||
# For linking mount, etc. crt0.o isn't accessable in a fresh build.
|
||||
|
@ -84,11 +84,6 @@ RUNTEST = `if [ -f $${srcdir}/../dejagnu/runtest ] ; then \
|
|||
else echo runtest; fi`
|
||||
RUNTESTFLAGS =
|
||||
|
||||
ifdef MT_SAFE
|
||||
MT_SAFE_HEADERS:=thread.h
|
||||
MT_SAFE_OBJECTS:=pthread.o thread.o
|
||||
endif
|
||||
|
||||
# Parameters used in building the cygwin.dll.
|
||||
# We build as new-cygwin.dll and rename at install time to overcome
|
||||
# native rebuilding issues (we don't want the build tools to see a partially
|
||||
|
@ -123,11 +118,11 @@ DLL_OFILES:=assert.o cygheap.o dcrt0.o debug.o delqueue.o dir.o dlfcn.o \
|
|||
fhandler_random.o fhandler_raw.o fhandler_serial.o fhandler_tape.o \
|
||||
fhandler_termios.o fhandler_tty.o fhandler_windows.o fhandler_zero.o \
|
||||
fork.o glob.o grp.o heap.o init.o ioctl.o localtime.o malloc.o mmap.o \
|
||||
net.o ntea.o passwd.o path.o pinfo.o pipe.o poll.o regexp.o regerror.o \
|
||||
regsub.o registry.o resource.o scandir.o security.o select.o shared.o \
|
||||
signal.o sigproc.o smallprint.o spawn.o strace.o strsep.o sync.o \
|
||||
syscalls.o sysconf.o syslog.o termios.o times.o tty.o uinfo.o uname.o \
|
||||
wait.o window.o \
|
||||
net.o ntea.o passwd.o path.o pinfo.o pipe.o poll.o pthread.o regexp.o \
|
||||
regerror.o regsub.o registry.o resource.o scandir.o security.o select.o \
|
||||
shared.o signal.o sigproc.o smallprint.o spawn.o strace.o strsep.o \
|
||||
sync.o syscalls.o sysconf.o syslog.o termios.o thread.o times.o tty.o \
|
||||
uinfo.o uname.o wait.o window.o \
|
||||
$(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MT_SAFE_OBJECTS)
|
||||
|
||||
GMON_OFILES:= gmon.o mcount.o profil.o
|
||||
|
@ -219,15 +214,6 @@ Makefile: cygwin.din
|
|||
$(DEF_FILE): cygwin.din config.status
|
||||
$(SHELL) config.status
|
||||
|
||||
# .h file dependencies
|
||||
# This may be overkill, but it's better than the previous situation.
|
||||
# As files/dependencies are added and removed from Cygwin, please keep
|
||||
# this list up to date.
|
||||
|
||||
WINSUP_H:=winsup.h fhandler.h path.h shared.h \
|
||||
sigproc.h include/cygwin/version.h \
|
||||
$(MT_SAFE_HEADERS)
|
||||
|
||||
winsup.h: config.h
|
||||
|
||||
ifneq (,${wildcard *.d})
|
||||
|
|
|
@ -60,12 +60,14 @@ class fhandler_base;
|
|||
class cygheap_exec_info
|
||||
{
|
||||
public:
|
||||
uid_t uid;
|
||||
char *old_title;
|
||||
fhandler_base **fds;
|
||||
size_t nfds;
|
||||
int argc;
|
||||
char **argv;
|
||||
char **environ;
|
||||
int envc;
|
||||
char **envp;
|
||||
HANDLE myself_pinfo;
|
||||
char *cwd_posix;
|
||||
char *cwd_win32;
|
||||
|
@ -76,6 +78,7 @@ class child_info_spawn: public child_info
|
|||
{
|
||||
public:
|
||||
cygheap_exec_info *moreinfo;
|
||||
HANDLE hexec_proc;
|
||||
|
||||
child_info_spawn (): moreinfo (NULL) {}
|
||||
~child_info_spawn ()
|
||||
|
@ -90,11 +93,11 @@ public:
|
|||
cfree (moreinfo->cwd_posix);
|
||||
if (moreinfo->cwd_win32)
|
||||
cfree (moreinfo->cwd_win32);
|
||||
if (moreinfo->environ)
|
||||
if (moreinfo->envp)
|
||||
{
|
||||
for (char **e = moreinfo->environ; *e; e++)
|
||||
for (char **e = moreinfo->envp; *e; e++)
|
||||
cfree (*e);
|
||||
cfree (moreinfo->environ);
|
||||
cfree (moreinfo->envp);
|
||||
}
|
||||
CloseHandle (moreinfo->myself_pinfo);
|
||||
cfree (moreinfo);
|
||||
|
|
|
@ -8,9 +8,9 @@ This software is a copyrighted work licensed under the terms of the
|
|||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||
details. */
|
||||
|
||||
void __stdcall seterrno_from_win_error (const char *file, int line, DWORD code);
|
||||
void __stdcall seterrno (const char *, int line);
|
||||
int __stdcall geterrno_from_win_error (DWORD code, int deferrno);
|
||||
void __stdcall seterrno_from_win_error (const char *file, int line, DWORD code) __attribute__ ((regparm(3)));
|
||||
void __stdcall seterrno (const char *, int line) __attribute__ ((regparm(2)));
|
||||
int __stdcall geterrno_from_win_error (DWORD code, int deferrno) __attribute__ ((regparm(2)));
|
||||
|
||||
#define __seterrno() seterrno (__FILE__, __LINE__)
|
||||
#define __seterrno_from_win_error(val) seterrno_from_win_error (__FILE__, __LINE__, val)
|
||||
|
|
|
@ -70,35 +70,6 @@ _csbrk (int sbs)
|
|||
|
||||
#define NBUCKETS 32
|
||||
char *buckets[NBUCKETS] = {0};
|
||||
int bucket2size[NBUCKETS] = {0};
|
||||
|
||||
static inline int
|
||||
size2bucket (int size)
|
||||
{
|
||||
int rv = 0x1f;
|
||||
int bit = ~0x10;
|
||||
int i;
|
||||
|
||||
if (size < 4)
|
||||
size = 4;
|
||||
size = (size + 3) & ~3;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
if (bucket2size[rv & bit] >= size)
|
||||
rv &= bit;
|
||||
bit >>= 1;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
static inline void
|
||||
init_buckets ()
|
||||
{
|
||||
unsigned b;
|
||||
for (b = 0; b < NBUCKETS; b++)
|
||||
bucket2size[b] = (1 << b);
|
||||
}
|
||||
|
||||
struct _cmalloc_entry
|
||||
{
|
||||
|
@ -116,16 +87,19 @@ struct _cmalloc_entry
|
|||
#define to_cmalloc(s) ((_cmalloc_entry *) (((char *) (s)) - (int) (N0->data)))
|
||||
#define cygheap_chain ((_cmalloc_entry **)cygheap)
|
||||
|
||||
static void *_cmalloc (int size) __attribute ((regparm(1)));
|
||||
static void *__stdcall _crealloc (void *ptr, int size) __attribute ((regparm(2)));
|
||||
|
||||
static void *__stdcall
|
||||
_cmalloc (int size)
|
||||
{
|
||||
_cmalloc_entry *rvc;
|
||||
int b;
|
||||
int b, sz;
|
||||
|
||||
if (bucket2size[0] == 0)
|
||||
init_buckets ();
|
||||
/* Calculate "bit bucket" and size as a power of two. */
|
||||
for (b = 3, sz = 8; sz && sz < (size + 4); b++, sz <<= 1)
|
||||
continue;
|
||||
|
||||
b = size2bucket (size);
|
||||
cygheap_protect->acquire ();
|
||||
if (buckets[b])
|
||||
{
|
||||
|
@ -135,7 +109,7 @@ _cmalloc (int size)
|
|||
}
|
||||
else
|
||||
{
|
||||
size = bucket2size[b] + sizeof (_cmalloc_entry);
|
||||
size = sz + sizeof (_cmalloc_entry);
|
||||
rvc = (_cmalloc_entry *) _csbrk (size);
|
||||
|
||||
rvc->b = b;
|
||||
|
@ -165,7 +139,7 @@ _crealloc (void *ptr, int size)
|
|||
newptr = _cmalloc (size);
|
||||
else
|
||||
{
|
||||
int oldsize = bucket2size[to_cmalloc (ptr)->b];
|
||||
int oldsize = 1 << to_cmalloc (ptr)->b;
|
||||
if (size <= oldsize)
|
||||
return ptr;
|
||||
newptr = _cmalloc (size);
|
||||
|
@ -228,7 +202,7 @@ cygheap_fixup_in_child (HANDLE parent, bool execed)
|
|||
}
|
||||
}
|
||||
|
||||
static void *__stdcall
|
||||
inline static void *
|
||||
creturn (cygheap_types x, cygheap_entry * c, int len)
|
||||
{
|
||||
if (!c)
|
||||
|
|
|
@ -32,12 +32,12 @@ extern HANDLE cygheap_max;
|
|||
#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
|
||||
|
||||
extern "C" {
|
||||
void __stdcall cfree (void *);
|
||||
void __stdcall cfree (void *) __attribute__ ((regparm(1)));
|
||||
void __stdcall cygheap_fixup_in_child (HANDLE, bool);
|
||||
void *__stdcall cmalloc (cygheap_types, DWORD);
|
||||
void *__stdcall crealloc (void *, DWORD);
|
||||
void *__stdcall ccalloc (cygheap_types, DWORD, DWORD);
|
||||
char *__stdcall cstrdup (const char *);
|
||||
char *__stdcall cstrdup1 (const char *);
|
||||
void *__stdcall cmalloc (cygheap_types, DWORD) __attribute__ ((regparm(2)));
|
||||
void *__stdcall crealloc (void *, DWORD) __attribute__ ((regparm(2)));
|
||||
void *__stdcall ccalloc (cygheap_types, DWORD, DWORD) __attribute__ ((regparm(3)));
|
||||
char *__stdcall cstrdup (const char *) __attribute__ ((regparm(1)));
|
||||
char *__stdcall cstrdup1 (const char *) __attribute__ ((regparm(1)));
|
||||
void __stdcall cygheap_init ();
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ details. */
|
|||
#include "exceptions.h"
|
||||
#include "autoload.h"
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
@ -27,7 +28,6 @@ details. */
|
|||
#include "perthread.h"
|
||||
#include "path.h"
|
||||
#include "dtable.h"
|
||||
#include "thread.h"
|
||||
#include "shared_info.h"
|
||||
#include "cygwin_version.h"
|
||||
#include "perprocess.h"
|
||||
|
@ -650,7 +650,7 @@ dll_crt0_1 ()
|
|||
_impure_ptr = &reent_data;
|
||||
|
||||
user_data->resourcelocks->Init ();
|
||||
user_data->threadinterface->Init0 ();
|
||||
user_data->threadinterface->Init (user_data->forkee);
|
||||
|
||||
threadname_init ();
|
||||
debug_init ();
|
||||
|
@ -658,6 +658,7 @@ dll_crt0_1 ()
|
|||
|
||||
regthread ("main", GetCurrentThreadId ());
|
||||
|
||||
int envc = 0;
|
||||
char **envp = NULL;
|
||||
|
||||
if (child_proc_info)
|
||||
|
@ -671,14 +672,17 @@ dll_crt0_1 ()
|
|||
cygheap_fixup_in_child (child_proc_info->parent, 0);
|
||||
alloc_stack (fork_info);
|
||||
set_myself (mypid);
|
||||
user_data->forkee = child_proc_info->cygpid;
|
||||
user_data->heaptop = child_proc_info->heaptop;
|
||||
user_data->heapbase = child_proc_info->heapbase;
|
||||
user_data->heapptr = child_proc_info->heapptr;
|
||||
ProtectHandle (child_proc_info->forker_finished);
|
||||
break;
|
||||
case PROC_EXEC:
|
||||
case PROC_SPAWN:
|
||||
CloseHandle (spawn_info->hexec_proc);
|
||||
goto around;
|
||||
case PROC_EXEC:
|
||||
hexec_proc = spawn_info->hexec_proc;
|
||||
around:
|
||||
HANDLE h;
|
||||
cygheap_fixup_in_child (spawn_info->parent, 1);
|
||||
if (!spawn_info->moreinfo->myself_pinfo ||
|
||||
|
@ -689,12 +693,14 @@ dll_crt0_1 ()
|
|||
set_myself (mypid, h);
|
||||
__argc = spawn_info->moreinfo->argc;
|
||||
__argv = spawn_info->moreinfo->argv;
|
||||
envp = spawn_info->moreinfo->environ;
|
||||
envp = spawn_info->moreinfo->envp;
|
||||
envc = spawn_info->moreinfo->envc;
|
||||
cygcwd.fixup_after_exec (spawn_info->moreinfo->cwd_win32,
|
||||
spawn_info->moreinfo->cwd_posix,
|
||||
spawn_info->moreinfo->cwd_hash);
|
||||
fdtab.fixup_after_exec (spawn_info->parent, spawn_info->moreinfo->nfds,
|
||||
spawn_info->moreinfo->fds);
|
||||
signal_fixup_after_exec (child_proc_info->type == PROC_SPAWN);
|
||||
CloseHandle (spawn_info->parent);
|
||||
if (spawn_info->moreinfo->old_title)
|
||||
{
|
||||
|
@ -702,6 +708,9 @@ dll_crt0_1 ()
|
|||
cfree (spawn_info->moreinfo->old_title);
|
||||
}
|
||||
ProtectHandle (child_proc_info->subproc_ready);
|
||||
myself->uid = spawn_info->moreinfo->uid;
|
||||
if (myself->uid == USHRT_MAX)
|
||||
myself->use_psid = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -730,6 +739,8 @@ dll_crt0_1 ()
|
|||
instead of each time a file is opened. */
|
||||
set_process_privileges ();
|
||||
|
||||
cygbench ("pre-forkee");
|
||||
|
||||
if (user_data->forkee)
|
||||
{
|
||||
/* If we've played with the stack, stacksize != 0. That means that
|
||||
|
@ -751,24 +762,11 @@ dll_crt0_1 ()
|
|||
cygcwd.init ();
|
||||
|
||||
/* Initialize our process table entry. */
|
||||
pinfo_init (envp);
|
||||
pinfo_init (envp, envc);
|
||||
|
||||
if (!old_title && GetConsoleTitle (title_buf, TITLESIZE))
|
||||
old_title = title_buf;
|
||||
|
||||
/* Nasty static stuff needed by newlib - initialize it.
|
||||
Note that impure_ptr has already been set up to point to this above
|
||||
NB. This *MUST* be done here, just after the forkee code as some
|
||||
of the calls below (eg. uinfo_init) do stdio calls - this area must
|
||||
be set to zero before then. */
|
||||
|
||||
user_data->threadinterface->ClearReent();
|
||||
user_data->threadinterface->Init1();
|
||||
|
||||
char *line = GetCommandLineA ();
|
||||
|
||||
line = strcpy ((char *) alloca (strlen (line) + 1), line);
|
||||
|
||||
/* Allocate fdtab */
|
||||
dtable_init ();
|
||||
|
||||
|
@ -786,6 +784,9 @@ dll_crt0_1 ()
|
|||
|
||||
if (!__argc)
|
||||
{
|
||||
char *line = GetCommandLineA ();
|
||||
line = strcpy ((char *) alloca (strlen (line) + 1), line);
|
||||
|
||||
/* Scan the command line and build argv. Expand wildcards if not
|
||||
called from another cygwin process. */
|
||||
build_argv (line, __argv, __argc,
|
||||
|
@ -848,6 +849,7 @@ dll_crt0_1 ()
|
|||
set_errno (0);
|
||||
|
||||
MALLOC_CHECK;
|
||||
cygbench (__progname);
|
||||
if (user_data->main)
|
||||
exit (user_data->main (__argc, __argv, *user_data->envptr));
|
||||
}
|
||||
|
@ -862,6 +864,9 @@ extern "C" void __stdcall
|
|||
_dll_crt0 ()
|
||||
{
|
||||
char zeros[sizeof (fork_info->zero)] = {0};
|
||||
#ifdef DEBUGGING
|
||||
strace.microseconds ();
|
||||
#endif
|
||||
|
||||
/* Set the os_being_run global. */
|
||||
set_os_type ();
|
||||
|
@ -893,10 +898,11 @@ _dll_crt0 ()
|
|||
{
|
||||
switch (fork_info->type)
|
||||
{
|
||||
case PROC_EXEC:
|
||||
case PROC_SPAWN:
|
||||
case PROC_FORK:
|
||||
case PROC_FORK1:
|
||||
user_data->forkee = fork_info->cygpid;
|
||||
case PROC_EXEC:
|
||||
case PROC_SPAWN:
|
||||
{
|
||||
child_proc_info = fork_info;
|
||||
mypid = child_proc_info->cygpid;
|
||||
|
@ -997,9 +1003,7 @@ do_exit (int status)
|
|||
}
|
||||
}
|
||||
|
||||
if ((hExeced && hExeced != INVALID_HANDLE_VALUE) || (n & EXIT_NOCLOSEALL))
|
||||
n &= ~EXIT_NOCLOSEALL;
|
||||
else if (exit_state < ES_CLOSEALL)
|
||||
if (exit_state < ES_CLOSEALL)
|
||||
{
|
||||
exit_state = ES_CLOSEALL;
|
||||
close_all_files ();
|
||||
|
@ -1024,6 +1028,8 @@ do_exit (int status)
|
|||
/* Kill orphaned children on group leader exit */
|
||||
if (myself->pid == myself->pgid)
|
||||
{
|
||||
system_printf ("%d == pgrp %d, send SIG{HUP,CONT} to stopped children",
|
||||
myself->pid, myself->pgid);
|
||||
sigproc_printf ("%d == pgrp %d, send SIG{HUP,CONT} to stopped children",
|
||||
myself->pid, myself->pgid);
|
||||
kill_pgrp (myself->pgid, -SIGHUP);
|
||||
|
@ -1044,17 +1050,7 @@ do_exit (int status)
|
|||
}
|
||||
|
||||
window_terminate ();
|
||||
fill_rusage (&myself->rusage_self, hMainProc);
|
||||
|
||||
events_terminate ();
|
||||
|
||||
if (hExeced && hExeced != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
debug_printf ("Killing(%d) non-cygwin process, handle %p", n, hExeced);
|
||||
TerminateProcess (hExeced, n);
|
||||
ForceCloseHandle1 (hExeced, childhProc);
|
||||
}
|
||||
|
||||
shared_terminate ();
|
||||
|
||||
minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n);
|
||||
|
@ -1101,6 +1097,16 @@ __api_fatal (const char *fmt, ...)
|
|||
myself->exit (1);
|
||||
}
|
||||
|
||||
#ifdef DEBUGGING
|
||||
void __stdcall
|
||||
cygbench (const char *s)
|
||||
{
|
||||
char buf[1024];
|
||||
if (GetEnvironmentVariable ("CYGWIN_BENCH", buf, sizeof (buf)))
|
||||
small_printf ("%05d ***** %s : %10d\n", GetCurrentProcessId (), s, strace.microseconds ());
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
|
||||
/* This struct is unused, but it illustrates the layout of a DLL
|
||||
|
|
|
@ -16,22 +16,12 @@ details. */
|
|||
#endif
|
||||
|
||||
extern "C" {
|
||||
#ifndef DEBUGGING0
|
||||
DWORD __stdcall WFSO (HANDLE, DWORD);
|
||||
DWORD __stdcall WFMO (DWORD, CONST HANDLE *, BOOL, DWORD);
|
||||
#else
|
||||
DWORD __stdcall WFSO (const char *fn, int ln, HANDLE, DWORD);
|
||||
DWORD __stdcall WFMO (const char *fn, int ln, DWORD, CONST HANDLE *, BOOL, DWORD);
|
||||
#endif
|
||||
DWORD __stdcall WFSO (HANDLE, DWORD) __attribute__ ((regparm(2)));
|
||||
DWORD __stdcall WFMO (DWORD, CONST HANDLE *, BOOL, DWORD) __attribute__ ((regparm(3)));
|
||||
}
|
||||
|
||||
#ifndef DEBUGGING0
|
||||
#define WaitForSingleObject WFSO
|
||||
#define WaitForMultipleObject WFMO
|
||||
#else
|
||||
#define WaitForSingleObject(a, b) WFSO (__FUNCTION__, __LINE__, a, b)
|
||||
#define WaitForMultipleObject(a, b, c, d) WFMO (__FUNCTION__, __LINE__, a, b, c, d)
|
||||
#endif
|
||||
|
||||
#if !defined(_DEBUG_H_)
|
||||
#define _DEBUG_H_
|
||||
|
@ -43,6 +33,7 @@ void __stdcall regthread (const char *, DWORD);
|
|||
int __stdcall iscygthread ();
|
||||
|
||||
#ifndef DEBUGGING
|
||||
# define cygbench(s)
|
||||
# define ForceCloseHandle CloseHandle
|
||||
# define ForceCloseHandle1(h, n) CloseHandle (h)
|
||||
# define ForceCloseHandle2(h, n) CloseHandle (h)
|
||||
|
@ -75,6 +66,7 @@ void debug_init ();
|
|||
void __stdcall add_handle (const char *, int, HANDLE, const char *);
|
||||
BOOL __stdcall close_handle (const char *, int, HANDLE, const char *, BOOL);
|
||||
int __stdcall lpfu (const char *, int, DWORD timeout);
|
||||
void __stdcall cygbench (const char *s);
|
||||
|
||||
#endif /*DEBUGGING*/
|
||||
#endif /*_DEBUG_H_*/
|
||||
|
|
|
@ -29,7 +29,6 @@ details. */
|
|||
#include "fhandler.h"
|
||||
#include "path.h"
|
||||
#include "dtable.h"
|
||||
#include "thread.h"
|
||||
|
||||
dtable fdtab;
|
||||
|
||||
|
@ -154,7 +153,7 @@ dtable::release (int fd)
|
|||
{
|
||||
if (!not_open (fd))
|
||||
{
|
||||
delete fds[fd]; /* CGF FIXME */
|
||||
delete fds[fd];
|
||||
fds[fd] = NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,14 +27,14 @@ public:
|
|||
fhandler_base *build_fhandler (int fd, DWORD dev, const char *name,
|
||||
int unit = -1);
|
||||
fhandler_base *build_fhandler (int fd, const char *name, HANDLE h);
|
||||
int not_open (int n);
|
||||
int not_open (int n) __attribute__ ((regparm(1)));
|
||||
int find_unused_handle (int start);
|
||||
int find_unused_handle () { return find_unused_handle (first_fd_for_open);}
|
||||
void release (int fd);
|
||||
void init_std_file_from_handle (int fd, HANDLE handle, DWORD access, const char *name);
|
||||
int dup2 (int oldfd, int newfd);
|
||||
void fixup_after_exec (HANDLE, size_t, fhandler_base **);
|
||||
fhandler_base *operator [](int fd) { return fds[fd]; }
|
||||
inline fhandler_base *operator [](int fd) { return fds[fd]; }
|
||||
select_record *select_read (int fd, select_record *s);
|
||||
select_record *select_write (int fd, select_record *s);
|
||||
select_record *select_except (int fd, select_record *s);
|
||||
|
|
|
@ -517,10 +517,10 @@ regopt (const char *name)
|
|||
* environment variable and set appropriate options from it.
|
||||
*/
|
||||
void
|
||||
environ_init (char **envp)
|
||||
environ_init (char **envp, int envc)
|
||||
{
|
||||
char *rawenv;
|
||||
int sz, i;
|
||||
int i;
|
||||
char *p;
|
||||
char *newp;
|
||||
int sawTERM = 0;
|
||||
|
@ -541,9 +541,8 @@ environ_init (char **envp)
|
|||
envp_passed_in = 0;
|
||||
else
|
||||
{
|
||||
sz = envsize (envp, 1);
|
||||
char **newenv = (char **) malloc (sz);
|
||||
memcpy (newenv, envp, sz);
|
||||
char **newenv = (char **) malloc (envc);
|
||||
memcpy (newenv, envp, envc);
|
||||
cfree (envp);
|
||||
envp = newenv;
|
||||
envp_passed_in = 1;
|
||||
|
@ -551,7 +550,7 @@ environ_init (char **envp)
|
|||
}
|
||||
|
||||
/* Allocate space for environment + trailing NULL + CYGWIN env. */
|
||||
lastenviron = envp = (char **) malloc ((4 + (sz = 100)) * sizeof (char *));
|
||||
lastenviron = envp = (char **) malloc ((4 + (envc = 100)) * sizeof (char *));
|
||||
rawenv = GetEnvironmentStrings ();
|
||||
|
||||
/* Current directory information is recorded as variables of the
|
||||
|
@ -561,9 +560,8 @@ environ_init (char **envp)
|
|||
for (i = 0, p = rawenv; *p != '\0'; p = strchr (p, '\0') + 1, i++)
|
||||
{
|
||||
newp = strdup (p);
|
||||
if (i >= sz)
|
||||
envp = (char **) realloc (envp, (4 + (sz += 100)) *
|
||||
sizeof (char *));
|
||||
if (i >= envc)
|
||||
envp = (char **) realloc (envp, (4 + (envc += 100)) * sizeof (char *));
|
||||
envp[i] = newp;
|
||||
if (*newp == '=')
|
||||
*newp = '!';
|
||||
|
|
|
@ -9,7 +9,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|||
details. */
|
||||
|
||||
/* Initialize the environment */
|
||||
void environ_init (char **);
|
||||
void environ_init (char **, int);
|
||||
|
||||
/* The structure below is used to control conversion to/from posix-style
|
||||
* file specs. Currently, only PATH and HOME are converted, but PATH
|
||||
|
|
|
@ -18,7 +18,6 @@ details. */
|
|||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
#include "cygerrno.h"
|
||||
#include "thread.h"
|
||||
#include "perthread.h"
|
||||
#include "shared_info.h"
|
||||
#include "perprocess.h"
|
||||
|
@ -639,7 +638,7 @@ interrupt_now (CONTEXT *ctx, int sig, struct sigaction& siga, void *handler)
|
|||
SetThreadContext (myself->getthread2signal (), ctx); /* Restart the thread */
|
||||
}
|
||||
|
||||
void __cdecl
|
||||
void __stdcall
|
||||
signal_fixup_after_fork ()
|
||||
{
|
||||
if (!sigsave.sig)
|
||||
|
@ -653,6 +652,18 @@ signal_fixup_after_fork ()
|
|||
}
|
||||
}
|
||||
|
||||
void __stdcall
|
||||
signal_fixup_after_exec (bool isspawn)
|
||||
{
|
||||
/* Set up child's signal handlers */
|
||||
for (int i = 0; i < NSIG; i++)
|
||||
{
|
||||
myself->getsig(i).sa_mask = 0;
|
||||
if (myself->getsig(i).sa_handler != SIG_IGN || isspawn)
|
||||
myself->getsig(i).sa_handler = SIG_DFL;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
interrupt_on_return (DWORD ebp, int sig, struct sigaction& siga, void *handler)
|
||||
{
|
||||
|
@ -775,7 +786,7 @@ call_handler (int sig, struct sigaction& siga, void *handler)
|
|||
}
|
||||
|
||||
next:
|
||||
if (hExeced != NULL || (!using_mainthread_frame && interruptible (cx.Eip)))
|
||||
if (!using_mainthread_frame && interruptible (cx.Eip))
|
||||
interrupt_now (&cx, sig, siga, handler);
|
||||
else if (!interrupt_on_return (ebp, sig, siga, handler))
|
||||
{
|
||||
|
|
|
@ -463,7 +463,7 @@ fhandler_base::read (void *in_ptr, size_t in_len)
|
|||
}
|
||||
|
||||
/* Scan buffer and turn \r\n into \n */
|
||||
register char *src= (char *) ptr;
|
||||
register char *src = (char *) ptr;
|
||||
register char *dst = (char *) ptr;
|
||||
register char *end = src + copied_chars - 1;
|
||||
|
||||
|
@ -772,7 +772,7 @@ rootdir(char *full_path)
|
|||
* \\server\share... -> \\server\share\
|
||||
* else current drive.
|
||||
*/
|
||||
char *root=full_path;
|
||||
char *root = full_path;
|
||||
|
||||
if (full_path[1] == ':')
|
||||
strcpy (full_path + 2, "\\");
|
||||
|
|
|
@ -301,6 +301,7 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
|
|||
|
||||
/* Initialize signal/process handling */
|
||||
sigproc_init ();
|
||||
cygbench ("fork-child");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@ details. */
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
|
|
@ -23,10 +23,10 @@
|
|||
|
||||
class strace
|
||||
{
|
||||
int microseconds ();
|
||||
int vsprntf (char *buf, const char *func, const char *infmt, va_list ap);
|
||||
void write (unsigned category, const char *buf, int count);
|
||||
public:
|
||||
int microseconds ();
|
||||
int version;
|
||||
int active;
|
||||
int lmicrosec;
|
||||
|
|
|
@ -16,7 +16,6 @@ details. */
|
|||
#include "fhandler.h"
|
||||
#include "dtable.h"
|
||||
#include "cygerrno.h"
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
|
|
@ -27,7 +27,6 @@ details. */
|
|||
#include "fhandler.h"
|
||||
#include "path.h"
|
||||
#include "dtable.h"
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
|
|
@ -16,7 +16,6 @@ details. */
|
|||
#include "cygerrno.h"
|
||||
#include "fhandler.h"
|
||||
#include "dtable.h"
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
|
|
@ -62,7 +62,6 @@ details. */
|
|||
#include "cygerrno.h"
|
||||
#include "fhandler.h"
|
||||
#include "path.h"
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
@ -574,15 +573,13 @@ normalize_posix_path (const char *src, char *dst)
|
|||
}
|
||||
if (!isslash (src[0]))
|
||||
{
|
||||
char cwd[MAX_PATH];
|
||||
if (!cygcwd.get (cwd))
|
||||
if (!cygcwd.get (dst))
|
||||
return get_errno ();
|
||||
if (strlen (cwd) + 1 + strlen (src) >= MAX_PATH)
|
||||
if (strlen (dst) + 1 + strlen (src) >= MAX_PATH)
|
||||
{
|
||||
debug_printf ("ENAMETOOLONG = normalize_posix_path (%s)", src);
|
||||
return ENAMETOOLONG;
|
||||
}
|
||||
strcpy (dst, cwd);
|
||||
dst = strchr (dst, '\0');
|
||||
if (*src == '.')
|
||||
goto sawdot;
|
||||
|
@ -681,17 +678,15 @@ normalize_win32_path (const char *src, char *dst)
|
|||
|
||||
if (!SLASH_P (src[0]) && strchr (src, ':') == NULL)
|
||||
{
|
||||
char cwd[MAX_PATH];
|
||||
if (!cygcwd.get (cwd, 0))
|
||||
if (!cygcwd.get (dst, 0))
|
||||
return get_errno ();
|
||||
if (strlen (cwd) + 1 + strlen (src) >= MAX_PATH)
|
||||
if (strlen (dst) + 1 + strlen (src) >= MAX_PATH)
|
||||
{
|
||||
debug_printf ("ENAMETOOLONG = normalize_win32_path (%s)", src);
|
||||
return ENAMETOOLONG;
|
||||
}
|
||||
strcpy (dst, cwd);
|
||||
dst += strlen (dst);
|
||||
if (!*cwd || !SLASH_P (dst[-1]))
|
||||
if (!SLASH_P (dst[-1]))
|
||||
*dst++ = '\\';
|
||||
}
|
||||
/* Two leading \'s? If so, preserve them. */
|
||||
|
@ -2775,7 +2770,7 @@ cygwin_split_path (const char *path, char *dir, char *file)
|
|||
})
|
||||
|
||||
/* Return TRUE if two strings match up to length n */
|
||||
int __stdcall
|
||||
extern "C" int __stdcall
|
||||
strncasematch (const char *s1, const char *s2, size_t n)
|
||||
{
|
||||
if (s1 == s2)
|
||||
|
@ -2792,7 +2787,7 @@ strncasematch (const char *s1, const char *s2, size_t n)
|
|||
}
|
||||
|
||||
/* Return TRUE if two strings match */
|
||||
int __stdcall
|
||||
extern "C" int __stdcall
|
||||
strcasematch (const char *s1, const char *s2)
|
||||
{
|
||||
if (s1 == s2)
|
||||
|
@ -2807,7 +2802,7 @@ strcasematch (const char *s1, const char *s2)
|
|||
return *s2 == '\0';
|
||||
}
|
||||
|
||||
char * __stdcall
|
||||
extern "C" char * __stdcall
|
||||
strcasestr (const char *searchee, const char *lookfor)
|
||||
{
|
||||
if (*searchee == 0)
|
||||
|
@ -2881,10 +2876,11 @@ cwdstuff::fixup_after_exec (char *win32_cwd, char *posix_cwd, DWORD hash_cwd)
|
|||
bool
|
||||
cwdstuff::get_initial ()
|
||||
{
|
||||
lock->acquire ();
|
||||
|
||||
if (win32)
|
||||
return 1;
|
||||
|
||||
lock->acquire ();
|
||||
int i;
|
||||
DWORD len, dlen;
|
||||
for (i = 0, dlen = MAX_PATH, len = 0; i < 3; dlen *= 2, i++)
|
||||
|
@ -2899,6 +2895,7 @@ cwdstuff::get_initial ()
|
|||
__seterrno ();
|
||||
lock->release ();
|
||||
debug_printf ("get_initial_cwd failed, %E");
|
||||
lock->release ();
|
||||
return 0;
|
||||
}
|
||||
set (NULL);
|
||||
|
|
|
@ -16,7 +16,6 @@ details. */
|
|||
#include "fhandler.h"
|
||||
#include "dtable.h"
|
||||
#include "cygerrno.h"
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
@ -30,7 +29,7 @@ static char NO_COPY pinfo_dummy[sizeof(pinfo)] = {0};
|
|||
|
||||
pinfo NO_COPY myself ((_pinfo *)&pinfo_dummy); // Avoid myself != NULL checks
|
||||
|
||||
static HANDLE hexec_proc = NULL;
|
||||
HANDLE hexec_proc = NULL;
|
||||
|
||||
void __stdcall
|
||||
pinfo_fixup_after_fork ()
|
||||
|
@ -46,19 +45,6 @@ pinfo_fixup_after_fork ()
|
|||
}
|
||||
}
|
||||
|
||||
void __stdcall
|
||||
pinfo_fixup_in_spawned_child (HANDLE hchild)
|
||||
{
|
||||
HANDLE h;
|
||||
if (!hexec_proc)
|
||||
return;
|
||||
if (!DuplicateHandle (hchild, hexec_proc, hMainProc, &h, 0, TRUE,
|
||||
DUPLICATE_CLOSE_SOURCE))
|
||||
system_printf ("couldn't close handle %p in child, %E", hexec_proc);
|
||||
else
|
||||
CloseHandle (h);
|
||||
}
|
||||
|
||||
/* Initialize the process table.
|
||||
This is done once when the dll is first loaded. */
|
||||
|
||||
|
@ -102,11 +88,11 @@ set_myself (pid_t pid, HANDLE h)
|
|||
/* Initialize the process table entry for the current task.
|
||||
This is not called for fork'd tasks, only exec'd ones. */
|
||||
void __stdcall
|
||||
pinfo_init (char **envp)
|
||||
pinfo_init (char **envp, int envc)
|
||||
{
|
||||
if (envp)
|
||||
{
|
||||
environ_init (envp);
|
||||
environ_init (envp, envc);
|
||||
/* spawn has already set up a pid structure for us so we'll use that */
|
||||
myself->process_state |= PID_CYGPARENT;
|
||||
}
|
||||
|
@ -120,98 +106,28 @@ pinfo_init (char **envp)
|
|||
myself->ctty = -1;
|
||||
myself->uid = USHRT_MAX;
|
||||
|
||||
environ_init (NULL); /* call after myself has been set up */
|
||||
environ_init (NULL, 0); /* call after myself has been set up */
|
||||
}
|
||||
|
||||
debug_printf ("pid %d, pgid %d", myself->pid, myself->pgid);
|
||||
}
|
||||
|
||||
void
|
||||
_pinfo::exit (UINT n)
|
||||
_pinfo::exit (UINT n, bool norecord)
|
||||
{
|
||||
process_state = PID_EXITED;
|
||||
if (!norecord)
|
||||
process_state = PID_EXITED;
|
||||
|
||||
/* FIXME: There is a potential race between an execed process and its
|
||||
parent here. I hated to add a mutex just for this, though. */
|
||||
struct rusage r;
|
||||
fill_rusage (&r, hMainProc);
|
||||
add_rusage (&rusage_self, &r);
|
||||
|
||||
sigproc_printf ("Calling ExitProcess %d", n);
|
||||
ExitProcess (n);
|
||||
}
|
||||
|
||||
struct sigaction&
|
||||
_pinfo::getsig(int sig)
|
||||
{
|
||||
#ifdef _MT_SAFE
|
||||
if (thread2signal)
|
||||
return thread2signal->sigs[sig];
|
||||
return sigs[sig];
|
||||
#else
|
||||
return sigs[sig];
|
||||
#endif
|
||||
};
|
||||
|
||||
sigset_t&
|
||||
_pinfo::getsigmask ()
|
||||
{
|
||||
#ifdef _MT_SAFE
|
||||
if (thread2signal)
|
||||
return *thread2signal->sigmask;
|
||||
return sig_mask;
|
||||
#else
|
||||
return sig_mask;
|
||||
#endif
|
||||
};
|
||||
|
||||
void
|
||||
_pinfo::setsigmask (sigset_t _mask)
|
||||
{
|
||||
#ifdef _MT_SAFE
|
||||
if (thread2signal)
|
||||
*(thread2signal->sigmask) = _mask;
|
||||
sig_mask=_mask;
|
||||
#else
|
||||
sig_mask=_mask;
|
||||
#endif
|
||||
}
|
||||
|
||||
LONG *
|
||||
_pinfo::getsigtodo(int sig)
|
||||
{
|
||||
#ifdef _MT_SAFE
|
||||
if (thread2signal)
|
||||
return thread2signal->sigtodo + __SIGOFFSET + sig;
|
||||
return _sigtodo + __SIGOFFSET + sig;
|
||||
#else
|
||||
return _sigtodo + __SIGOFFSET + sig;
|
||||
#endif
|
||||
}
|
||||
|
||||
extern HANDLE hMainThread;
|
||||
|
||||
HANDLE
|
||||
_pinfo::getthread2signal()
|
||||
{
|
||||
#ifdef _MT_SAFE
|
||||
if (thread2signal)
|
||||
return thread2signal->win32_obj_id;
|
||||
return hMainThread;
|
||||
#else
|
||||
return hMainThread;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
_pinfo::setthread2signal(void *_thr)
|
||||
{
|
||||
#ifdef _MT_SAFE
|
||||
// assert has myself lock
|
||||
thread2signal=(ThreadItem*)_thr;
|
||||
#else
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
_pinfo::copysigs(_pinfo *_other)
|
||||
{
|
||||
sigs = _other->sigs;
|
||||
}
|
||||
|
||||
void
|
||||
pinfo::init (pid_t n, DWORD create, HANDLE in_h)
|
||||
{
|
||||
|
|
|
@ -20,8 +20,8 @@ enum
|
|||
|
||||
#define PSIZE 1024
|
||||
|
||||
class ThreadItem;
|
||||
#include <sys/resource.h>
|
||||
#include "thread.h"
|
||||
|
||||
class _pinfo
|
||||
{
|
||||
|
@ -104,20 +104,41 @@ public:
|
|||
/* Non-zero if process was stopped by a signal. */
|
||||
char stopsig;
|
||||
|
||||
struct sigaction& getsig (int);
|
||||
void copysigs (_pinfo* );
|
||||
sigset_t& getsigmask ();
|
||||
void setsigmask (sigset_t);
|
||||
LONG* getsigtodo (int);
|
||||
HANDLE getthread2signal ();
|
||||
void setthread2signal (void *);
|
||||
void exit (UINT n) __attribute__ ((noreturn));
|
||||
void exit (UINT n, bool norecord = 0) __attribute__ ((noreturn, regparm(2)));
|
||||
|
||||
inline struct sigaction& getsig (int sig)
|
||||
{
|
||||
return thread2signal ? thread2signal->sigs[sig] : sigs[sig];
|
||||
}
|
||||
|
||||
inline void copysigs (_pinfo *p) {sigs = p->sigs;}
|
||||
|
||||
inline sigset_t& getsigmask ()
|
||||
{
|
||||
return thread2signal ? *thread2signal->sigmask : sig_mask;
|
||||
}
|
||||
|
||||
inline void setsigmask (sigset_t mask)
|
||||
{
|
||||
if (thread2signal)
|
||||
*(thread2signal->sigmask) = mask;
|
||||
sig_mask = mask;
|
||||
}
|
||||
|
||||
inline LONG* getsigtodo (int sig) {return _sigtodo + __SIGOFFSET + sig;}
|
||||
|
||||
inline HANDLE getthread2signal ()
|
||||
{
|
||||
return thread2signal ? thread2signal->win32_obj_id : hMainThread;
|
||||
}
|
||||
|
||||
inline void setthread2signal (void *thr) {thread2signal = (ThreadItem *) thr;}
|
||||
|
||||
private:
|
||||
struct sigaction sigs[NSIG];
|
||||
sigset_t sig_mask; /* one set for everything to ignore. */
|
||||
LONG _sigtodo[NSIG + __SIGOFFSET];
|
||||
ThreadItem* thread2signal; // NULL means means thread any other means a pthread
|
||||
ThreadItem *thread2signal; // NULL means means thread any other means a pthread
|
||||
};
|
||||
|
||||
class pinfo
|
||||
|
@ -172,7 +193,7 @@ cygwin_pid (pid_t pid)
|
|||
return (pid_t) (os_being_run == winNT) ? pid : -(int) pid;
|
||||
}
|
||||
|
||||
void __stdcall pinfo_init (char **);
|
||||
void __stdcall pinfo_init (char **, int);
|
||||
void __stdcall set_myself (pid_t pid, HANDLE h = NULL);
|
||||
extern pinfo myself;
|
||||
|
||||
|
@ -181,7 +202,7 @@ extern "C" int _spawnve (HANDLE hToken, int mode, const char *path,
|
|||
const char *const *argv, const char *const *envp);
|
||||
|
||||
extern void __stdcall pinfo_fixup_after_fork ();
|
||||
extern void __stdcall pinfo_fixup_in_spawned_child (HANDLE hchild);
|
||||
extern HANDLE hexec_proc;
|
||||
|
||||
/* For mmaps across fork(). */
|
||||
int __stdcall recreate_mmaps_after_fork (void *);
|
||||
|
|
|
@ -456,22 +456,9 @@ proc_terminate (void)
|
|||
pchildren[i].release ();
|
||||
}
|
||||
nchildren = nzombies = 0;
|
||||
|
||||
/* Just zero sync_proc_subproc as the delete below seems to cause
|
||||
problems for older gccs. */
|
||||
#if 1
|
||||
sync_proc_subproc = NULL;
|
||||
#else
|
||||
/* Attempt to close and release sync_proc_subproc in a
|
||||
* non-raceable manner.
|
||||
*/
|
||||
muto *m = sync_proc_subproc;
|
||||
if (m)
|
||||
{
|
||||
sync_proc_subproc = NULL;
|
||||
// delete m;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
sigproc_printf ("leaving");
|
||||
}
|
||||
|
|
|
@ -101,11 +101,10 @@ BOOL __stdcall proc_exists (_pinfo *);
|
|||
BOOL __stdcall pid_exists (pid_t);
|
||||
int __stdcall sig_send (_pinfo *, int, DWORD ebp = (DWORD) __builtin_frame_address (0));
|
||||
void __stdcall signal_fixup_after_fork ();
|
||||
void __stdcall signal_fixup_after_exec (bool);
|
||||
|
||||
extern char myself_nowait_dummy[];
|
||||
extern char myself_nowait_nonmain_dummy[];
|
||||
extern HANDLE hExeced; // Process handle of new window
|
||||
// process created by spawn_guts()
|
||||
|
||||
#define WAIT_SIG_EXITING (WAIT_OBJECT_0 + 1)
|
||||
|
||||
|
|
|
@ -158,8 +158,6 @@ handle (int n, int direction)
|
|||
return fh->get_output_handle ();
|
||||
}
|
||||
|
||||
HANDLE NO_COPY hExeced = NULL;
|
||||
|
||||
int
|
||||
iscmd (const char *argv0, const char *what)
|
||||
{
|
||||
|
@ -289,12 +287,9 @@ static int __stdcall
|
|||
spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
|
||||
const char *const envp[], int mode)
|
||||
{
|
||||
int i;
|
||||
BOOL rc;
|
||||
pid_t cygpid;
|
||||
|
||||
hExeced = NULL;
|
||||
|
||||
MALLOC_CHECK;
|
||||
|
||||
if (prog_arg == NULL)
|
||||
|
@ -507,10 +502,12 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
|
|||
cygcwd.copy (ciresrv.moreinfo->cwd_posix, ciresrv.moreinfo->cwd_win32,
|
||||
ciresrv.moreinfo->cwd_hash);
|
||||
|
||||
ciresrv.moreinfo->environ = (char **) cmalloc (HEAP_1_ARGV, envsize (envp, 1));
|
||||
ciresrv.moreinfo->envc = envsize (envp, 0);
|
||||
ciresrv.moreinfo->envp = (char **) cmalloc (HEAP_1_ARGV, ciresrv.moreinfo->envc);
|
||||
ciresrv.hexec_proc = hexec_proc;
|
||||
char **c;
|
||||
const char * const *e;
|
||||
for (c = ciresrv.moreinfo->environ, e = envp; *e;)
|
||||
for (c = ciresrv.moreinfo->envp, e = envp; *e;)
|
||||
*c++ = cstrdup1 (*e++);
|
||||
*c = NULL;
|
||||
if (mode != _P_OVERLAY ||
|
||||
|
@ -530,11 +527,12 @@ skip_arg_parsing:
|
|||
|
||||
syscall_printf ("spawn_guts (%s, %.132s)", (char *) real_path, one_line.buf);
|
||||
|
||||
int flags = CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED |
|
||||
GetPriorityClass (hMainProc);
|
||||
int flags = CREATE_DEFAULT_ERROR_MODE | GetPriorityClass (hMainProc);
|
||||
|
||||
if (mode == _P_DETACH || !set_console_state_for_spawn ())
|
||||
flags |= DETACHED_PROCESS;
|
||||
if (mode != _P_OVERLAY)
|
||||
flags |= CREATE_SUSPENDED;
|
||||
|
||||
/* Build windows style environment list */
|
||||
char *envblock;
|
||||
|
@ -552,7 +550,24 @@ skip_arg_parsing:
|
|||
if (!hToken && myself->token != INVALID_HANDLE_VALUE)
|
||||
hToken = myself->token;
|
||||
|
||||
if (hToken)
|
||||
cygbench ("spawn-guts");
|
||||
if (!hToken)
|
||||
{
|
||||
ciresrv.moreinfo->uid = getuid ();
|
||||
rc = CreateProcess (real_path, /* image name - with full path */
|
||||
one_line.buf, /* what was passed to exec */
|
||||
/* process security attrs */
|
||||
allow_ntsec ? sec_user (sa_buf) : &sec_all_nih,
|
||||
/* thread security attrs */
|
||||
allow_ntsec ? sec_user (sa_buf) : &sec_all_nih,
|
||||
TRUE, /* inherit handles from parent */
|
||||
flags,
|
||||
envblock,/* environment */
|
||||
0, /* use current drive/directory */
|
||||
&si,
|
||||
&pi);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* allow the child to interact with our window station/desktop */
|
||||
HANDLE hwst, hdsk;
|
||||
|
@ -561,6 +576,7 @@ skip_arg_parsing:
|
|||
char wstname[1024];
|
||||
char dskname[1024];
|
||||
|
||||
ciresrv.moreinfo->uid = USHRT_MAX;
|
||||
hwst = GetProcessWindowStation();
|
||||
SetUserObjectSecurity(hwst, &dsi, get_null_sd ());
|
||||
GetUserObjectInformation(hwst, UOI_NAME, wstname, 1024, &n);
|
||||
|
@ -612,19 +628,6 @@ skip_arg_parsing:
|
|||
&& myself->impersonated && myself->token != INVALID_HANDLE_VALUE)
|
||||
seteuid (uid);
|
||||
}
|
||||
else
|
||||
rc = CreateProcess (real_path, /* image name - with full path */
|
||||
one_line.buf, /* what was passed to exec */
|
||||
/* process security attrs */
|
||||
allow_ntsec ? sec_user (sa_buf) : &sec_all_nih,
|
||||
/* thread security attrs */
|
||||
allow_ntsec ? sec_user (sa_buf) : &sec_all_nih,
|
||||
TRUE, /* inherit handles from parent */
|
||||
flags,
|
||||
envblock,/* environment */
|
||||
0, /* use current drive/directory */
|
||||
&si,
|
||||
&pi);
|
||||
|
||||
MALLOC_CHECK;
|
||||
if (envblock)
|
||||
|
@ -654,26 +657,17 @@ skip_arg_parsing:
|
|||
|
||||
/* Name the handle similarly to proc_subproc. */
|
||||
ProtectHandle1 (pi.hProcess, childhProc);
|
||||
ProtectHandle (pi.hThread);
|
||||
|
||||
if (mode == _P_OVERLAY)
|
||||
{
|
||||
/* These are both duplicated in the child code. We do this here,
|
||||
primarily for strace. */
|
||||
strcpy (myself->progname, real_path);
|
||||
hExeced = pi.hProcess;
|
||||
myself->dwProcessId = pi.dwProcessId;
|
||||
|
||||
/* Set up child's signal handlers */
|
||||
/* CGF FIXME - consolidate with signal stuff below */
|
||||
for (i = 0; i < NSIG; i++)
|
||||
{
|
||||
myself->getsig(i).sa_mask = 0;
|
||||
if (myself->getsig(i).sa_handler != SIG_IGN || (mode != _P_OVERLAY))
|
||||
myself->getsig(i).sa_handler = SIG_DFL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pinfo_fixup_in_spawned_child (pi.hProcess);
|
||||
ProtectHandle (pi.hThread);
|
||||
pinfo child (cygpid, 1);
|
||||
if (!child)
|
||||
{
|
||||
|
@ -684,7 +678,6 @@ skip_arg_parsing:
|
|||
child->username[0] = '\0';
|
||||
child->progname[0] = '\0';
|
||||
child->ppid = myself->pid;
|
||||
child->uid = myself->uid;
|
||||
child->gid = myself->gid;
|
||||
child->pgid = myself->pgid;
|
||||
child->sid = myself->sid;
|
||||
|
@ -702,27 +695,15 @@ skip_arg_parsing:
|
|||
child->rootlen = myself->rootlen;
|
||||
child->dwProcessId = pi.dwProcessId;
|
||||
child->hProcess = pi.hProcess;
|
||||
for (i = 0; i < NSIG; i++)
|
||||
{
|
||||
child->getsig(i).sa_mask = 0;
|
||||
if (child->getsig(i).sa_handler != SIG_IGN || (mode != _P_OVERLAY))
|
||||
child->getsig(i).sa_handler = SIG_DFL;
|
||||
}
|
||||
if (hToken)
|
||||
{
|
||||
/* Set child->uid to USHRT_MAX to force calling internal_getlogin()
|
||||
from child process. Clear username and psid to play it safe. */
|
||||
child->uid = USHRT_MAX;
|
||||
child->use_psid = 0;
|
||||
}
|
||||
child.remember ();
|
||||
/* Start the child running */
|
||||
ResumeThread (pi.hThread);
|
||||
}
|
||||
|
||||
sigproc_printf ("spawned windows pid %d", pi.dwProcessId);
|
||||
/* Start the child running */
|
||||
ResumeThread (pi.hThread);
|
||||
ForceCloseHandle (pi.hThread);
|
||||
|
||||
sigproc_printf ("spawned windows pid %d", pi.dwProcessId);
|
||||
|
||||
if (hToken && hToken != myself->token)
|
||||
CloseHandle (hToken);
|
||||
|
||||
|
@ -824,16 +805,6 @@ skip_arg_parsing:
|
|||
system_printf ("old hProcess %p, hProcess %p", oldh, myself->hProcess);
|
||||
}
|
||||
}
|
||||
if (hExeced)
|
||||
{
|
||||
ForceCloseHandle1 (hExeced, childhProc);
|
||||
hExeced = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
}
|
||||
else if (exited)
|
||||
{
|
||||
ForceCloseHandle1 (hExeced, childhProc);
|
||||
hExeced = INVALID_HANDLE_VALUE; // stop do_exit from attempting to terminate child
|
||||
}
|
||||
|
||||
MALLOC_CHECK;
|
||||
|
@ -841,11 +812,9 @@ skip_arg_parsing:
|
|||
switch (mode)
|
||||
{
|
||||
case _P_OVERLAY:
|
||||
ForceCloseHandle1 (pi.hProcess, childhProc);
|
||||
proc_terminate ();
|
||||
struct rusage r;
|
||||
fill_rusage (&r, hMainProc);
|
||||
add_rusage (&myself->rusage_self, &r);
|
||||
ExitProcess (0);
|
||||
myself->exit (0, 1);
|
||||
break;
|
||||
case _P_WAIT:
|
||||
waitpid (cygpid, (int *) &res, 0);
|
||||
|
|
|
@ -134,7 +134,9 @@ strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
|
|||
*p = '\000';
|
||||
p = progname;
|
||||
count = __small_sprintf (buf, fmt, p && *p ? p : "?",
|
||||
myself->pid, hExeced ? "!" : "");
|
||||
myself->pid,
|
||||
myself->dwProcessId != GetCurrentProcessId ()
|
||||
? "!" : "");
|
||||
if (func)
|
||||
count += getfunc (buf + count, func);
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@ details. */
|
|||
#include "fhandler.h"
|
||||
#include "path.h"
|
||||
#include "dtable.h"
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
|
|
@ -20,7 +20,6 @@ details. */
|
|||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
@ -81,7 +80,7 @@ _reent_clib ()
|
|||
|
||||
SetLastError (tmp);
|
||||
return _r->_clib;
|
||||
};
|
||||
}
|
||||
|
||||
struct _winsup_t *
|
||||
_reent_winsup ()
|
||||
|
@ -95,7 +94,7 @@ _reent_winsup ()
|
|||
#endif
|
||||
SetLastError (tmp);
|
||||
return _r->_winsup;
|
||||
};
|
||||
}
|
||||
|
||||
inline LPCRITICAL_SECTION
|
||||
ResourceLocks::Lock (int _resid)
|
||||
|
@ -108,7 +107,7 @@ ResourceLocks::Lock (int _resid)
|
|||
_resid, &lock, user_data, myself->pid, GetCurrentThreadId ());
|
||||
#endif
|
||||
return &lock;
|
||||
};
|
||||
}
|
||||
|
||||
void
|
||||
SetResourceLock (int _res_id, int _mode, const char *_function)
|
||||
|
@ -138,7 +137,7 @@ ReleaseResourceLock (int _res_id, int _mode, const char *_function)
|
|||
#endif
|
||||
|
||||
LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id));
|
||||
};
|
||||
}
|
||||
|
||||
#ifdef _CYG_THREAD_FAILSAFE
|
||||
void
|
||||
|
@ -157,8 +156,6 @@ AssertResourceOwner (int _res_id, int _mode)
|
|||
void
|
||||
ResourceLocks::Init ()
|
||||
{
|
||||
thread_printf ("Init resource lock %p -> %p", this, &lock);
|
||||
|
||||
InitializeCriticalSection (&lock);
|
||||
inited = true;
|
||||
|
||||
|
@ -167,8 +164,8 @@ ResourceLocks::Init ()
|
|||
count = 0;
|
||||
#endif
|
||||
|
||||
thread_printf ("Resource lock %p inited by %p , %d", &lock, user_data, myself->pid);
|
||||
};
|
||||
thread_printf ("lock %p inited by %p , %d", &lock, user_data, myself->pid);
|
||||
}
|
||||
|
||||
void
|
||||
ResourceLocks::Delete ()
|
||||
|
@ -179,7 +176,7 @@ ResourceLocks::Delete ()
|
|||
DeleteCriticalSection (&lock);
|
||||
inited = false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// Thread interface
|
||||
|
@ -188,7 +185,7 @@ void
|
|||
MTinterface::ReleaseItem (MTitem * _item)
|
||||
{
|
||||
_item->used = false;
|
||||
};
|
||||
}
|
||||
|
||||
MTitem *
|
||||
MTinterface::Find (void *_value, int (*comp) (void *, void *), register int &_index, MTList * _list)
|
||||
|
@ -202,7 +199,7 @@ MTinterface::Find (void *_value, int (*comp) (void *, void *), register int &_in
|
|||
current = NULL;
|
||||
}
|
||||
return current;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
MTinterface::Find (MTitem & _item, MTList * _list)
|
||||
|
@ -216,21 +213,22 @@ MTinterface::Find (MTitem & _item, MTList * _list)
|
|||
break;
|
||||
}
|
||||
return (_index == _list->index ? -1 : _index);
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
MTinterface::FindNextUnused (MTList * _list)
|
||||
{
|
||||
register int i = 0;
|
||||
for (; i < _list->index && _list->items[i] != NULL && _list->items[i]->used && _list->items[i]->joinable != 'Y'; i++);
|
||||
for (; i < _list->index && _list->items[i] != NULL && _list->items[i]->used && _list->items[i]->joinable != 'Y'; i++)
|
||||
continue;
|
||||
return i;
|
||||
};
|
||||
}
|
||||
|
||||
MTitem *
|
||||
MTinterface::GetItem (int _index, MTList * _list)
|
||||
{
|
||||
return (_index < _list->index ? _list->items[_index] : NULL);
|
||||
};
|
||||
}
|
||||
|
||||
MTitem *
|
||||
MTinterface::SetItem (int _index, MTitem * _item, MTList * _list)
|
||||
|
@ -238,23 +236,24 @@ MTinterface::SetItem (int _index, MTitem * _item, MTList * _list)
|
|||
if (_index == _list->index && _list->index < MT_MAX_ITEMS)
|
||||
_list->index++;
|
||||
return (_index < _list->index ? _list->items[_index] = _item : NULL);
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
CmpPthreadObj (void *_i, void *_value)
|
||||
{
|
||||
return ((MTitem *) _i)->Id () == *(int *) _value;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
CmpThreadId (void *_i, void *_id)
|
||||
{
|
||||
return ((ThreadItem *) _i)->thread_id == * (DWORD *) _id;
|
||||
};
|
||||
}
|
||||
|
||||
void
|
||||
MTinterface::Init0 ()
|
||||
MTinterface::Init (int forked)
|
||||
{
|
||||
#if 0
|
||||
for (int i = 0; i < MT_MAX_ITEMS; i++)
|
||||
{
|
||||
threadlist.items[i] = NULL;
|
||||
|
@ -265,6 +264,7 @@ MTinterface::Init0 ()
|
|||
threadlist.index = 0;
|
||||
mutexlist.index = 0;
|
||||
semalist.index = 0;
|
||||
#endif
|
||||
|
||||
reent_index = TlsAlloc ();
|
||||
|
||||
|
@ -272,39 +272,35 @@ MTinterface::Init0 ()
|
|||
reents._winsup = &winsup_reent;
|
||||
|
||||
winsup_reent._process_logmask = LOG_UPTO (LOG_DEBUG);
|
||||
#if 0
|
||||
winsup_reent._grp_pos = 0;
|
||||
winsup_reent._process_ident = 0;
|
||||
winsup_reent._process_logopt = 0;
|
||||
winsup_reent._process_facility = 0;
|
||||
#endif
|
||||
|
||||
TlsSetValue (reent_index, &reents);
|
||||
// the static reent_data will be used in the main thread
|
||||
|
||||
};
|
||||
if (forked)
|
||||
return;
|
||||
|
||||
void
|
||||
MTinterface::Init1 ()
|
||||
{
|
||||
// create entry for main thread
|
||||
|
||||
int i = FindNextUnused (&threadlist);
|
||||
assert (i == 0);
|
||||
ThreadItem *item = (ThreadItem *) GetItem (i, &threadlist);
|
||||
ThreadItem *item = (ThreadItem *) GetItem (0, &threadlist);
|
||||
|
||||
item = (ThreadItem *) SetItem (i, &mainthread, &threadlist);
|
||||
item = (ThreadItem *) SetItem (0, &mainthread, &threadlist);
|
||||
item->used = true;
|
||||
item->win32_obj_id = myself->hProcess;
|
||||
item->thread_id = GetCurrentThreadId ();
|
||||
#if 0
|
||||
item->function = NULL;
|
||||
|
||||
item->sigs = NULL;
|
||||
item->sigmask = NULL;
|
||||
item->sigtodo = NULL;
|
||||
};
|
||||
#endif
|
||||
|
||||
void
|
||||
MTinterface::ClearReent ()
|
||||
{
|
||||
struct _reent *r = _REENT;
|
||||
memset (r, 0, sizeof (struct _reent));
|
||||
|
||||
|
@ -312,9 +308,7 @@ MTinterface::ClearReent ()
|
|||
r->_stdin = &r->__sf[0];
|
||||
r->_stdout = &r->__sf[1];
|
||||
r->_stderr = &r->__sf[2];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
ThreadItem *
|
||||
MTinterface::CreateThread (pthread_t * t, TFD (func), void *arg, pthread_attr_t a)
|
||||
|
@ -342,8 +336,7 @@ MTinterface::CreateThread (pthread_t * t, TFD (func), void *arg, pthread_attr_t
|
|||
*t = (pthread_t) item->win32_obj_id;
|
||||
|
||||
return item;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
MutexItem *
|
||||
MTinterface::CreateMutex (pthread_mutex_t * mutex)
|
||||
|
@ -375,7 +368,7 @@ MTinterface::GetCallingThread ()
|
|||
DWORD id = GetCurrentThreadId ();
|
||||
int index = 0;
|
||||
return (ThreadItem *) Find (&id, &CmpThreadId, index, &threadlist);
|
||||
};
|
||||
}
|
||||
|
||||
ThreadItem *
|
||||
MTinterface::GetThread (pthread_t * _t)
|
||||
|
@ -383,7 +376,7 @@ MTinterface::GetThread (pthread_t * _t)
|
|||
AssertResourceOwner (LOCK_THREAD_LIST, READ_LOCK);
|
||||
int index = 0;
|
||||
return (ThreadItem *) Find (_t, &CmpPthreadObj, index, &threadlist);
|
||||
};
|
||||
}
|
||||
|
||||
MutexItem *
|
||||
MTinterface::GetMutex (pthread_mutex_t * mp)
|
||||
|
@ -406,19 +399,19 @@ void
|
|||
MTitem::Destroy ()
|
||||
{
|
||||
CloseHandle (win32_obj_id);
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
MutexItem::Lock ()
|
||||
{
|
||||
return WaitForSingleObject (win32_obj_id, INFINITE);
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
MutexItem::TryLock ()
|
||||
{
|
||||
return WaitForSingleObject (win32_obj_id, 0);
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
MutexItem::UnLock ()
|
||||
|
@ -448,26 +441,26 @@ MTinterface::CreateSemaphore (sem_t * _s, int pshared, int _v)
|
|||
*_s = (sem_t) item->win32_obj_id;
|
||||
|
||||
return item;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
SemaphoreItem::Wait ()
|
||||
{
|
||||
return WaitForSingleObject (win32_obj_id, INFINITE);
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
SemaphoreItem::Post ()
|
||||
{
|
||||
long pc;
|
||||
return ReleaseSemaphore (win32_obj_id, 1, &pc);
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
SemaphoreItem::TryWait ()
|
||||
{
|
||||
return WaitForSingleObject (win32_obj_id, 0);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
////////////////////////// Pthreads
|
||||
|
@ -547,34 +540,34 @@ __pthread_create (pthread_t * thread, const pthread_attr_t * attr, TFD (start_ro
|
|||
|
||||
ReleaseResourceLock (LOCK_THREAD_LIST, WRITE_LOCK | READ_LOCK, "__pthread_create");
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_attr_init (pthread_attr_t * attr)
|
||||
{
|
||||
attr->stacksize = 0;
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_attr_setstacksize (pthread_attr_t * attr, size_t size)
|
||||
{
|
||||
attr->stacksize = size;
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size)
|
||||
{
|
||||
*size = attr->stacksize;
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_attr_destroy (pthread_attr_t * /*attr*/)
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_exit (void *value_ptr)
|
||||
|
@ -609,7 +602,7 @@ __pthread_join (pthread_t * thread, void **return_val)
|
|||
}/* End if*/
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_detach (pthread_t * thread)
|
||||
|
@ -667,30 +660,30 @@ __pthread_getsequence_np (pthread_t * thread)
|
|||
{
|
||||
GETTHREAD ("__pthread_getsequence_np");
|
||||
return item->GetThreadId ();
|
||||
};
|
||||
}
|
||||
|
||||
/* Thread SpecificData */
|
||||
int
|
||||
__pthread_key_create (pthread_key_t */*key*/)
|
||||
{
|
||||
NOT_IMP ("_p_key_create\n");
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_key_delete (pthread_key_t */*key*/)
|
||||
{
|
||||
NOT_IMP ("_p_key_delete\n");
|
||||
};
|
||||
}
|
||||
int
|
||||
__pthread_setspecific (pthread_key_t */*key*/, const void */*value*/)
|
||||
{
|
||||
NOT_IMP ("_p_key_setsp\n");
|
||||
};
|
||||
}
|
||||
void *
|
||||
__pthread_getspecific (pthread_key_t */*key*/)
|
||||
{
|
||||
NOT_IMP ("_p_key_getsp\n");
|
||||
};
|
||||
}
|
||||
|
||||
/* Thread signal */
|
||||
int
|
||||
|
@ -708,7 +701,7 @@ __pthread_kill (pthread_t * thread, int sig)
|
|||
// unlock myself
|
||||
return rval;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set)
|
||||
|
@ -728,7 +721,7 @@ __pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set)
|
|||
// unlock this myself
|
||||
|
||||
return rval;
|
||||
};
|
||||
}
|
||||
|
||||
/* ID */
|
||||
pthread_t
|
||||
|
@ -741,13 +734,13 @@ __pthread_self ()
|
|||
ReleaseResourceLock (LOCK_THREAD_LIST, READ_LOCK, "__pthread_self");
|
||||
return (pthread_t) item->Id ();
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_equal (pthread_t * t1, pthread_t * t2)
|
||||
{
|
||||
return (*t1 - *t2);
|
||||
};
|
||||
}
|
||||
|
||||
/* Mutexes */
|
||||
|
||||
|
@ -762,7 +755,7 @@ __pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t */*_att
|
|||
|
||||
ReleaseResourceLock (LOCK_MUTEX_LIST, WRITE_LOCK | READ_LOCK, "__pthread_mutex_init");
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_mutex_lock (pthread_mutex_t * mutex)
|
||||
|
@ -772,7 +765,7 @@ __pthread_mutex_lock (pthread_mutex_t * mutex)
|
|||
item->Lock ();
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_mutex_trylock (pthread_mutex_t * mutex)
|
||||
|
@ -783,7 +776,7 @@ __pthread_mutex_trylock (pthread_mutex_t * mutex)
|
|||
return EBUSY;
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_mutex_unlock (pthread_mutex_t * mutex)
|
||||
|
@ -793,7 +786,7 @@ __pthread_mutex_unlock (pthread_mutex_t * mutex)
|
|||
item->UnLock ();
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__pthread_mutex_destroy (pthread_mutex_t * mutex)
|
||||
|
@ -810,7 +803,7 @@ __pthread_mutex_destroy (pthread_mutex_t * mutex)
|
|||
|
||||
ReleaseResourceLock (LOCK_MUTEX_LIST, READ_LOCK | WRITE_LOCK, "__pthread_mutex_destroy");
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
/* Semaphores */
|
||||
int
|
||||
|
@ -824,7 +817,7 @@ __sem_init (sem_t * sem, int pshared, unsigned int value)
|
|||
|
||||
ReleaseResourceLock (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_init");
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__sem_destroy (sem_t * sem)
|
||||
|
@ -841,7 +834,7 @@ __sem_destroy (sem_t * sem)
|
|||
|
||||
ReleaseResourceLock (LOCK_SEM_LIST, READ_LOCK | WRITE_LOCK, "__sem_destroy");
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__sem_wait (sem_t * sem)
|
||||
|
@ -851,7 +844,7 @@ __sem_wait (sem_t * sem)
|
|||
item->Wait ();
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__sem_trywait (sem_t * sem)
|
||||
|
@ -862,7 +855,7 @@ __sem_trywait (sem_t * sem)
|
|||
return EAGAIN;
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
int
|
||||
__sem_post (sem_t * sem)
|
||||
|
@ -872,7 +865,7 @@ __sem_post (sem_t * sem)
|
|||
item->Post ();
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
|
|
|
@ -110,8 +110,8 @@ struct __reent_t
|
|||
|
||||
_reent *_reent_clib ();
|
||||
_winsup_t *_reent_winsup ();
|
||||
void SetResourceLock (int, int, const char *);
|
||||
void ReleaseResourceLock (int, int, const char *);
|
||||
void SetResourceLock (int, int, const char *) __attribute__ ((regparm(3)));
|
||||
void ReleaseResourceLock (int, int, const char *) __attribute__ ((regparm(3)));
|
||||
|
||||
#ifdef _CYG_THREAD_FAILSAFE
|
||||
void AssertResourceOwner (int, int);
|
||||
|
@ -209,9 +209,7 @@ public:
|
|||
struct _winsup_t winsup_reent;
|
||||
ThreadItem mainthread;
|
||||
|
||||
void Init0 ();
|
||||
void Init1 ();
|
||||
void ClearReent ();
|
||||
void Init (int);
|
||||
|
||||
void ReleaseItem (MTitem *);
|
||||
|
||||
|
|
|
@ -19,7 +19,6 @@ details. */
|
|||
#include "cygerrno.h"
|
||||
#include "fhandler.h"
|
||||
#include "path.h"
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
|
|
@ -18,7 +18,6 @@ details. */
|
|||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <lm.h>
|
||||
#include "thread.h"
|
||||
#include "sync.h"
|
||||
#include "sigproc.h"
|
||||
#include "pinfo.h"
|
||||
|
|
|
@ -184,15 +184,15 @@ int __stdcall writable_directory (const char *file);
|
|||
int __stdcall stat_dev (DWORD, int, unsigned long, struct stat *);
|
||||
extern BOOL allow_ntsec;
|
||||
|
||||
unsigned long __stdcall hash_path_name (unsigned long hash, const char *name);
|
||||
void __stdcall nofinalslash (const char *src, char *dst);
|
||||
extern "C" char *__stdcall rootdir (char *full_path);
|
||||
unsigned long __stdcall hash_path_name (unsigned long hash, const char *name) __attribute__ ((regparm(2)));
|
||||
void __stdcall nofinalslash (const char *src, char *dst) __attribute__ ((regparm(2)));
|
||||
extern "C" char *__stdcall rootdir (char *full_path) __attribute__ ((regparm(1)));
|
||||
|
||||
/* String manipulation */
|
||||
char *__stdcall strccpy (char *s1, const char **s2, char c);
|
||||
int __stdcall strcasematch (const char *s1, const char *s2);
|
||||
int __stdcall strncasematch (const char *s1, const char *s2, size_t n);
|
||||
char *__stdcall strcasestr (const char *searchee, const char *lookfor);
|
||||
extern "C" char *__stdcall strccpy (char *s1, const char **s2, char c);
|
||||
extern "C" int __stdcall strcasematch (const char *s1, const char *s2) __attribute__ ((regparm(2)));
|
||||
extern "C" int __stdcall strncasematch (const char *s1, const char *s2, size_t n) __attribute__ ((regparm(3)));
|
||||
extern "C" char *__stdcall strcasestr (const char *searchee, const char *lookfor) __attribute__ ((regparm(2)));
|
||||
|
||||
/* Time related */
|
||||
void __stdcall totimeval (struct timeval *dst, FILETIME * src, int sub, int flag);
|
||||
|
|
Loading…
Reference in New Issue