mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-29 02:20:21 +08:00
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.
105 lines
3.1 KiB
C++
105 lines
3.1 KiB
C++
/* dtable.h: fd table definition.
|
|
|
|
Copyright 2000, 2001, 2003, 2004, 2005 Red Hat, Inc.
|
|
|
|
This file is part of Cygwin.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
/* Initial and increment values for cygwin's fd table */
|
|
#define NOFILE_INCR 32
|
|
|
|
#include "thread.h"
|
|
#include "sync.h"
|
|
|
|
class suffix_info;
|
|
class fhandler_fifo;
|
|
|
|
#define BFH_OPTS (PC_NULLEMPTY | PC_FULL | PC_POSIX)
|
|
class dtable
|
|
{
|
|
static muto lock_cs;
|
|
fhandler_base **fds;
|
|
#ifdef NEWVFORK
|
|
fhandler_base **fds_on_hold;
|
|
#endif
|
|
fhandler_base **archetypes;
|
|
unsigned narchetypes;
|
|
unsigned farchetype;
|
|
static const int initial_archetype_size = 8;
|
|
int first_fd_for_open;
|
|
int cnt_need_fixup_before;
|
|
void lock () {lock_cs.acquire ();}
|
|
void unlock () {lock_cs.release ();}
|
|
void init_lock ();
|
|
public:
|
|
size_t size;
|
|
|
|
dtable () : archetypes (NULL), narchetypes (0), farchetype (0), first_fd_for_open(3), cnt_need_fixup_before(0) {}
|
|
void init () {first_fd_for_open = 3;}
|
|
|
|
void dec_need_fixup_before ()
|
|
{ if (cnt_need_fixup_before > 0) --cnt_need_fixup_before; }
|
|
void inc_need_fixup_before ()
|
|
{ cnt_need_fixup_before++; }
|
|
bool need_fixup_before ()
|
|
{ return cnt_need_fixup_before > 0; }
|
|
|
|
int vfork_child_dup ();
|
|
void vfork_parent_restore ();
|
|
void vfork_child_fixup ();
|
|
fhandler_base *dup_worker (fhandler_base *oldfh);
|
|
int extend (int howmuch);
|
|
void fixup_before_exec (DWORD win_proc_id);
|
|
void fixup_before_fork (DWORD win_proc_id);
|
|
void fixup_after_fork (HANDLE);
|
|
inline int not_open (int fd)
|
|
{
|
|
lock ();
|
|
int res = fd < 0 || fd >= (int) size || fds[fd] == NULL;
|
|
unlock ();
|
|
return res;
|
|
}
|
|
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);
|
|
int dup2 (int oldfd, int newfd);
|
|
void fixup_after_exec ();
|
|
inline fhandler_base *&operator [](int fd) const { 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);
|
|
operator fhandler_base **() {return fds;}
|
|
void stdio_init ();
|
|
void get_debugger_info ();
|
|
void set_file_pointers_for_exec ();
|
|
#ifdef NEWVFORK
|
|
bool in_vfork_cleanup () {return fds_on_hold == fds;}
|
|
#endif
|
|
fhandler_fifo *find_fifo (const char *);
|
|
fhandler_base *find_archetype (device& dev);
|
|
fhandler_base **add_archetype ();
|
|
void delete_archetype (fhandler_base *);
|
|
friend void dtable_init ();
|
|
friend void __stdcall close_all_files (bool);
|
|
friend class cygheap_fdmanip;
|
|
friend class cygheap_fdget;
|
|
friend class cygheap_fdnew;
|
|
friend class cygheap_fdenum;
|
|
friend class lock_process;
|
|
};
|
|
|
|
fhandler_base *build_fh_dev (const device&, const char * = NULL);
|
|
fhandler_base *build_fh_name (const char *unix_name, HANDLE = NULL, unsigned = 0, suffix_info * = NULL);
|
|
fhandler_base *build_fh_pc (path_conv& pc);
|
|
|
|
void dtable_init ();
|
|
void stdio_init ();
|
|
extern dtable fdtab;
|
|
|
|
extern "C" int getfdtabsize ();
|
|
extern "C" void setfdtabsize (int);
|