* fhandler.cc (fhandler_base::fork_fixup): Don't protect handle.
* dlfcn.cc: Fix to confirm to coding standards. Reorganize includes throughout to accomodate new cygheap.h usage. * cygheap.h (cygheap_fdmanip): New class: simplifies locking and retrieval of fds from cygheap->fdtab. (cygheap_fdget): Ditto. (cygheap_fdnew): Ditto. * fcntl.cc (_fcntl): Use new method to lock fdtab and retrieve info. * ioctl.cc (ioctl): Ditto. * mmap.cc (mmap): Ditto. * net.cc: Ditto, throughout. * passwd.cc (getpass): Ditto. * path.cc (fchdir): Ditto. * pipe.cc (make_pipe): Ditto. * sec_acl.cc (facl): Ditto. * syscalls.cc: Ditto, throughout. * termios.cc: Ditto, throughout.
This commit is contained in:
@ -176,6 +176,79 @@ struct init_cygheap
|
||||
extern init_cygheap *cygheap;
|
||||
extern void *cygheap_max;
|
||||
|
||||
class cygheap_fdmanip
|
||||
{
|
||||
protected:
|
||||
int fd;
|
||||
fhandler_base **fh;
|
||||
bool locked;
|
||||
public:
|
||||
cygheap_fdmanip () {}
|
||||
virtual ~cygheap_fdmanip ()
|
||||
{
|
||||
if (locked)
|
||||
ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdmanip");
|
||||
}
|
||||
void release ()
|
||||
{
|
||||
cygheap->fdtab.release (fd);
|
||||
}
|
||||
operator int &() {return fd;}
|
||||
operator fhandler_base* &() {return *fh;}
|
||||
void operator = (fhandler_base *fh) {*this->fh = fh;}
|
||||
fhandler_base *operator -> () const {return *fh;}
|
||||
};
|
||||
|
||||
class cygheap_fdnew : public cygheap_fdmanip
|
||||
{
|
||||
public:
|
||||
cygheap_fdnew (int seed_fd = -1, bool lockit = true)
|
||||
{
|
||||
if (lockit)
|
||||
SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdnew");
|
||||
if (seed_fd < 0)
|
||||
fd = cygheap->fdtab.find_unused_handle ();
|
||||
else
|
||||
fd = cygheap->fdtab.find_unused_handle (seed_fd + 1);
|
||||
if (fd >= 0)
|
||||
{
|
||||
locked = lockit;
|
||||
fh = cygheap->fdtab + fd;
|
||||
}
|
||||
else
|
||||
{
|
||||
set_errno (EMFILE);
|
||||
if (lockit)
|
||||
ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdnew");
|
||||
locked = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class cygheap_fdget : public cygheap_fdmanip
|
||||
{
|
||||
public:
|
||||
cygheap_fdget (int fd, bool lockit = false)
|
||||
{
|
||||
if (lockit)
|
||||
SetResourceLock (LOCK_FD_LIST, READ_LOCK, "cygheap_fdget");
|
||||
if (fd >= 0 && fd < (int) cygheap->fdtab.size
|
||||
&& *(fh = cygheap->fdtab + fd) != NULL)
|
||||
{
|
||||
this->fd = fd;
|
||||
locked = lockit;
|
||||
}
|
||||
else
|
||||
{
|
||||
this->fd = -1;
|
||||
set_errno (EBADF);
|
||||
if (lockit)
|
||||
ReleaseResourceLock (LOCK_FD_LIST, READ_LOCK, "cygheap_fdget");
|
||||
locked = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class child_info;
|
||||
void *__stdcall cygheap_setup_for_child (child_info *ci, bool dup_later) __attribute__ ((regparm(2)));
|
||||
void __stdcall cygheap_setup_for_child_cleanup (void *, child_info *, bool) __attribute__ ((regparm(3)));
|
||||
|
Reference in New Issue
Block a user