libc/winsup/cygwin/delqueue.cc
Christopher Faylor b0e82b74fb * Makefile.in: Add cygheap.o.
* child_info.h: Add specific exec class.
* cygheap.h: New file.  Contains declarations for cygwin heap.
* cygheap.cc: New file.  Implements cygwin heap functions.
* dcrt0.cc (quoted): Simplify due to new method for passing arguments between
cygwin programs.
(alloc_stack_hard_way): Attempt to handle overlapped stack.
(dll_crt0_1): Move child_info processing here.  Accomodate new method for
passing arguments between cygwin programs.  Initialize cygwin heap.  Establish
__argc and __argv variables.
(_dll_crt0): Move most of child_info processing to dll_crt0_1.
(cygwin_dll_init): Remove duplication.
* dtable.cc (dtable::extend): Allocate dtable using cygwin heap.
(dtable::build_fhandler): Ditto for fhandler type being constructed.
(dtable::dup_worker): Free new fhandler from cygwin heap on error.
(dtable::select_*): Don't assume that this == fdtab.
(dtable::linearize_fd_array): Delete.
(dtable::delinearize_fd_array): Delete.
(dtable::fixup_after_exec): New file.
(dtable::vfork_child_dup): Use cygwin heap.
(dtable::vfork_parent_restore): Ditto.
* dtable.h: Remove obsolete methods.  Add new method.
* environ.cc (posify): Eliminate already_posix parameter and logic.
(envsize): New function.
(_addenv): Use envsize.
(environ_init): Accept an argument pointing to an existing environment list.
If supplied, allocate space for this in the the program's heap.
* fhandler.cc (fhandler_base::operator =): Move here from fhandler.h.  Use
cygwin heap to allocate filenames.
(fhandler_base::set_name): Allocate/free names from cygwin heap.
(fhandler_base::linearize): Delete.
(fhandler_base::de_linearize): Delete.
(fhandler_base::operator delete): Free from cygwin heap.
(fhandler_base::~fhandler_base): Ditto.
* fhandler.h: Accomodate elimination of *linearize and other changes above.
* fhandler_console.cc (fhandler_console::fixup_after_exec): Rename from
de_linearize.
* heap.h: New file.
* fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Use cygwin heap for
name.  fhandler_tty::fixup_after_exec): Rename from de_linearize.
* fork.cc (fork): Call cygheap_fixup_in_child.
* heap.cc: Use declarations in heap.h.
* malloc.cc: Sprinkle assertions throughout to catch attempts to free/realloc
something from the cygwin heap.
* path.cc: Throughout, eliminate use of per-thread cache for cwd.  Use cwd_*
functions rather than cwd_* variables to access cwd_win32 and cwd_posix.
(cwd_win32): New function.
(cwd_posix): New function.
(cwd_hash): New function.
(cwd_fixup_after_exec): New function.
* path.h: Accomodate path.cc changes.
* pinfo.cc (pinfo_init): Accept a pointer to an environment table.  Pass this
to environ_init.  Eliminate old 'title' tests.
* pinfo.h: Accomodate above change in argument.
* spawn.cc (struct av): New method for building argv list.
(av::unshift): New method.
(spawn_guts): Allocate everything that the child process needs in the cygwin
heap and pass a pointer to this to the child.  Build argv list using new
method.  Eliminate delinearize stuff.
* thread.h: Eliminate _cwd_win32 and _cwd_posix buffers.
* winsup.h: Eliminate obsolete functions.  Add envsize() declaration.
2000-09-03 04:16:35 +00:00

102 lines
2.6 KiB
C++

/* delqueue.cc
Copyright 1996, 1998 Cygnus Solutions.
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. */
#include "winsup.h"
/* FIXME: this delqueue module is very flawed and should be rewritten.
First, having an array of a fixed size for keeping track of the
unlinked but not yet deleted files is bad. Second, some programs
will unlink files and then create a new one in the same location
and this behavior is not supported in the current code. Probably
we should find a move/rename function that will work on open files,
and move delqueue files to some special location or some such
hack... */
void
delqueue_list::init ()
{
empty = 1;
memset(inuse, 0, MAX_DELQUEUES_PENDING);
}
void
delqueue_list::queue_file (const char *dosname)
{
char temp[MAX_PATH], *end;
GetFullPathName (dosname, sizeof (temp), temp, &end);
/* Note about race conditions: The only time we get to this point is
when a delete fails because someone's holding the descriptor open.
In those cases, other programs will be unable to delete the file
also, so any entries referring to that file will not be removed
from the queue while we're here. */
if (!empty)
{
/* check for duplicates */
for (int i=0; i < MAX_DELQUEUES_PENDING; i++)
if (inuse[i] && strcmp(name[i], temp) == 0)
return;
}
for (int i = 0; i < MAX_DELQUEUES_PENDING; i++)
if (!inuse[i])
{
/* set the name first, in case someone else is running the
queue they'll get a valid name */
strcpy(name[i], temp);
inuse[i] = 1;
empty = 0;
debug_printf ("adding '%s' to queue %d", temp, i);
return;
}
system_printf ("Out of queue slots");
}
void
delqueue_list::process_queue ()
{
if (empty)
return;
/* We set empty to 1 here, rather than later, to avoid a race
condition - some other program might queue up a file while we're
processing, and it will zero out empty also. */
empty = 1; /* but might get set to zero again, below */
syscall_printf ("Running delqueue");
for (int i = 0; i < MAX_DELQUEUES_PENDING; i++)
if (inuse[i])
{
if (DeleteFileA (name[i]))
{
syscall_printf ("Deleted %s", name[i]);
inuse[i] = 0;
}
else
{
int res = GetLastError ();
empty = 0;
if (res == ERROR_SHARING_VIOLATION ||
(os_being_run != winNT && res == ERROR_ACCESS_DENIED))
{
/* File still inuse, that's ok */
syscall_printf ("Still using %s", name[i]);
}
else
{
syscall_printf ("Hmm, don't know what to do with '%s', %E", name[i]);
inuse[i] = 0;
}
}
}
}