* debug.cc (mark_closed): Rename from debug_mark_closed and make static.

(setclexec_pid): New function for marking saved handle as close-on-exec.
(delete_handle): New function.
(debug_fixup_after_fork): New function.
* debug.h: Declare new functions, remove obsolete ones.
* fork.cc (debug_fixup_after_fork): Call to cleanup close-on-exec handles.
* fhandler.cc (fhandler_disk_file::close): Minor reorg.
(fhandler_base::set_inheritance): Set flag appropriately for debugging when
close-on-exec so forked process can delete closed handles.
* tty.h (open_output_mutex): Eliminate unneeded argument.
(open_input_mutex): Ditto.
* fhandler_tty.cc (fhandler_tty_slave::open): reflect open_*_mutex argument
changes.
* fhandler.h (fhandler_socket): Make saw_shutdown_* functions type bool.
* tty.cc (tty::get_event): Eliminate unneeded argument.
(tty::common_init): Reflect change to get_event.  Events should always be
inherited.
This commit is contained in:
Christopher Faylor
2001-09-01 05:17:34 +00:00
parent a26a4cdbe0
commit e62ac9e869
9 changed files with 95 additions and 44 deletions

View File

@ -179,13 +179,14 @@ typedef struct _h
const char *name;
const char *func;
int ln;
DWORD clexec_pid;
struct _h *next;
} handle_list;
static NO_COPY handle_list starth = {0, NULL, NULL, NULL, 0, NULL};
static NO_COPY handle_list starth = {0, NULL, NULL, NULL, 0, 0, NULL};
static NO_COPY handle_list *endh = NULL;
static handle_list NO_COPY freeh[1000] = {{0, NULL, NULL, NULL, 0, NULL}};
static handle_list NO_COPY freeh[1000] = {{0, NULL, NULL, NULL, 0, 0, NULL}};
#define NFREEH (sizeof (freeh) / sizeof (freeh[0]))
static muto NO_COPY *debug_lock = NULL;
@ -196,6 +197,8 @@ static muto NO_COPY *debug_lock = NULL;
#define unlock_debug() \
do {if (debug_lock) debug_lock->release (); } while (0)
static bool __stdcall mark_closed (const char *, int, HANDLE, const char *, BOOL);
void
debug_init ()
{
@ -217,6 +220,14 @@ out:
return hl;
}
void
setclexec_pid (HANDLE h, bool setit)
{
handle_list *hl = find_handle (h);
if (hl)
hl->clexec_pid = setit ? GetCurrentProcessId () : 0;
}
/* Create a new handle record */
static handle_list * __stdcall
newh ()
@ -275,8 +286,28 @@ out:
unlock_debug ();
}
bool __stdcall
debug_mark_closed (const char *func, int ln, HANDLE h, const char *name, BOOL force)
static void __stdcall
delete_handle (handle_list *hl)
{
handle_list *hnuke = hl->next;
hl->next = hl->next->next;
if (hnuke->allocated)
free (hnuke);
else
memset (hnuke, 0, sizeof (*hnuke));
}
void
debug_fixup_after_fork ()
{
handle_list *hl;
for (hl = &starth; hl->next != NULL; hl = hl->next)
if (hl->next->clexec_pid)
delete_handle (hl);
}
static bool __stdcall
mark_closed (const char *func, int ln, HANDLE h, const char *name, BOOL force)
{
handle_list *hl;
lock_debug ();
@ -299,14 +330,7 @@ debug_mark_closed (const char *func, int ln, HANDLE h, const char *name, BOOL fo
}
if (hl)
{
handle_list *hnuke = hl->next;
hl->next = hl->next->next;
if (hnuke->allocated)
free (hnuke);
else
memset (hnuke, 0, sizeof (*hnuke));
}
delete_handle (hl);
unlock_debug ();
return TRUE;
@ -320,7 +344,7 @@ close_handle (const char *func, int ln, HANDLE h, const char *name, BOOL force)
BOOL ret;
lock_debug ();
if (!debug_mark_closed (func, ln, h, name, force))
if (!mark_closed (func, ln, h, name, force))
return FALSE;
ret = CloseHandle (h);