diff options
author | Christopher Faylor <me@cgf.cx> | 2001-11-03 03:32:27 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2001-11-03 03:32:27 +0000 |
commit | 243a041bd0164aa62813ac4ba5a1a02eb2db455b (patch) | |
tree | af591a485215fcd4578be09cfabe6ff75b0782fe /winsup | |
parent | 01432054cb24122d300f109d4d252a9c95835a9b (diff) | |
download | newlib-243a041bd0164aa62813ac4ba5a1a02eb2db455b.zip newlib-243a041bd0164aa62813ac4ba5a1a02eb2db455b.tar.gz newlib-243a041bd0164aa62813ac4ba5a1a02eb2db455b.tar.bz2 |
* dll_init.h (class dll_list): Reorder functions to avoid compiler "can't
inline" warnings.
* security.h (class cygsid): Ditto.
* sigproc.cc (get_proc_lock): Ditto.
* sigproc.h (class sigframe): Ditto.
* sync.h (class muto): Ditto.
* fhandler.h (fhandler_base::get_guard): Actually MAKE virtual as previously
indicated.
* pipe.cc (make_pipe): Remove extraneous set_errno.
* syscalls.cc (_open): Ditto.
* select.cc (peek_pipe): Need to check that there is still something to read
from the pipe after acquiring the mutex since another process/thread could have
eaten the input before we got to acquiring the lock. (Thanks to Nick Duffek
for this inspiration.)
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/ChangeLog | 20 | ||||
-rw-r--r-- | winsup/cygwin/dll_init.h | 12 | ||||
-rw-r--r-- | winsup/cygwin/fhandler.h | 2 | ||||
-rw-r--r-- | winsup/cygwin/pipe.cc | 6 | ||||
-rw-r--r-- | winsup/cygwin/security.h | 18 | ||||
-rw-r--r-- | winsup/cygwin/select.cc | 23 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.cc | 46 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.h | 6 | ||||
-rw-r--r-- | winsup/cygwin/sync.h | 8 | ||||
-rw-r--r-- | winsup/cygwin/syscalls.cc | 4 |
10 files changed, 87 insertions, 58 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 14d77c0..a519205 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,23 @@ +2001-11-02 Egor Duda <deo@logos-m.ru> + + * dll_init.h (class dll_list): Reorder functions to avoid compiler + "can't inline" warnings. + * security.h (class cygsid): Ditto. + * sigproc.cc (get_proc_lock): Ditto. + * sigproc.h (class sigframe): Ditto. + * sync.h (class muto): Ditto. + +2001-11-02 Christopher Faylor <cgf@redhat.com> + + * fhandler.h (fhandler_base::get_guard): Actually MAKE virtual as + previously indicated. + * pipe.cc (make_pipe): Remove extraneous set_errno. + * syscalls.cc (_open): Ditto. + * select.cc (peek_pipe): Need to check that there is still something to + read from the pipe after acquiring the mutex since another + process/thread could have eaten the input before we got to acquiring + the lock. (Thanks to Nick Duffek for this inspiration.) + 2001-11-01 Christopher Faylor <cgf@redhat.com> * fhandler.h: Change Windows 'BOOL's to c++ 'bool's for all variables. diff --git a/winsup/cygwin/dll_init.h b/winsup/cygwin/dll_init.h index a5b33d5..bc9687b 100644 --- a/winsup/cygwin/dll_init.h +++ b/winsup/cygwin/dll_init.h @@ -73,12 +73,6 @@ public: void detach (dll *); void init (); void load_after_fork (HANDLE, dll *); - dll *istart (dll_type t) - { - hold_type = t; - hold = &start; - return inext (); - } dll *inext () { while ((hold = hold->next)) @@ -86,6 +80,12 @@ public: break; return hold; } + dll *istart (dll_type t) + { + hold_type = t; + hold = &start; + return inext (); + } }; extern dll_list dlls; diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 76c3ff0..fa753cd 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -371,7 +371,7 @@ class fhandler_base rabuf = NULL; } void operator delete (void *); - HANDLE get_guard () const {return NULL;} + virtual HANDLE get_guard () const {return NULL;} }; class fhandler_socket: public fhandler_base diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc index fed1add..904dbd2 100644 --- a/winsup/cygwin/pipe.cc +++ b/winsup/cygwin/pipe.cc @@ -133,13 +133,11 @@ make_pipe (int fildes[2], unsigned int psize, int mode) int res = -1; cygheap_fdnew fdr; - if (fdr < 0) - /* saw an error */; - else + if (fdr >= 0) { cygheap_fdnew fdw (fdr, false); if (fdw < 0) - set_errno (ENMFILE); + /* out of fds? */; else if (!CreatePipe (&r, &w, sa, psize)) __seterrno (); else diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h index 95f97b8..53c94c8 100644 --- a/winsup/cygwin/security.h +++ b/winsup/cygwin/security.h @@ -39,6 +39,15 @@ class cygsid { } public: + inline operator const PSID () { return psid; } + + inline const PSID operator= (cygsid &nsid) + { return assign (nsid); } + inline const PSID operator= (const PSID nsid) + { return assign (nsid); } + inline const PSID operator= (const char *nsidstr) + { return getfromstr (nsidstr); } + inline cygsid () : psid ((PSID) sbuf) {} inline cygsid (const PSID nsid) { *this = nsid; } inline cygsid (const char *nstrsid) { *this = nstrsid; } @@ -54,13 +63,6 @@ public: char *string (char *nsidstr) const; - inline const PSID operator= (cygsid &nsid) - { return assign (nsid); } - inline const PSID operator= (const PSID nsid) - { return assign (nsid); } - inline const PSID operator= (const char *nsidstr) - { return getfromstr (nsidstr); } - inline BOOL operator== (const PSID nsid) const { if (!psid || !nsid) @@ -77,8 +79,6 @@ public: inline BOOL operator!= (const char *nsidstr) const { return !(*this == nsidstr); } - inline operator const PSID () { return psid; } - void debug_print (const char *prefix = NULL) const { char buf[256]; diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 1ba3ef3..78d1aaa 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -389,7 +389,7 @@ peek_pipe (select_record *s, int ignra) fhandler_base *fh = s->fh; HANDLE h; - HANDLE guard_mutex = s->fh->get_guard (); + HANDLE guard_mutex = fh->get_guard (); set_handle_or_return_if_not_open (h, s); /* Don't perform complicated tests if we don't need to. */ @@ -438,12 +438,23 @@ peek_pipe (select_record *s, int ignra) select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ()); n = -1; } - else if (n && guard_mutex - && WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0) + else if (n && guard_mutex) { - select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (), - guard_mutex); - n = 0; + if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0) + { + select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (), + guard_mutex); + n = 0; + } + /* Now that we have the mutex, make sure that no one else has snuck + in and grabbed the data that we originally saw. */ + if (!PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL)) + { + select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ()); + n = -1; + } + if (n <= 0) + ReleaseMutex (guard_mutex); /* Oops. We lost the race. */ } if (n < 0) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index fd5008a..fdc7a6f 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -179,6 +179,29 @@ wait_for_me () } } +/* Get the sync_proc_subproc muto to control access to + * children, zombie arrays. + * Attempt to handle case where process is exiting as we try to grab + * the mutex. + */ +static BOOL +get_proc_lock (DWORD what, DWORD val) +{ + Static int lastwhat = -1; + if (!sync_proc_subproc) + return FALSE; + if (sync_proc_subproc->acquire (WPSP)) + { + lastwhat = what; + return TRUE; + } + if (!sync_proc_subproc) + return FALSE; + system_printf ("Couldn't aquire sync_proc_subproc for(%d,%d), %E, last %d", + what, val, lastwhat); + return TRUE; +} + static BOOL __stdcall proc_can_be_signalled (_pinfo *p) { @@ -939,29 +962,6 @@ getsem (_pinfo *p, const char *str, int init, int max) return h; } -/* Get the sync_proc_subproc muto to control access to - * children, zombie arrays. - * Attempt to handle case where process is exiting as we try to grab - * the mutex. - */ -static BOOL -get_proc_lock (DWORD what, DWORD val) -{ - Static int lastwhat = -1; - if (!sync_proc_subproc) - return FALSE; - if (sync_proc_subproc->acquire (WPSP)) - { - lastwhat = what; - return TRUE; - } - if (!sync_proc_subproc) - return FALSE; - system_printf ("Couldn't aquire sync_proc_subproc for(%d,%d), %E, last %d", - what, val, lastwhat); - return TRUE; -} - /* Remove a zombie from zombies by swapping it with the last child in the list. */ static void __stdcall diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index 493078b..dc67b6b 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -73,9 +73,6 @@ public: if (!oframe) t.get_winapi_lock (); } - - sigframe (): st (NULL) {} - sigframe (sigthread &t, DWORD ebp = (DWORD) __builtin_frame_address (0)) {init (t, ebp);} inline void init (sigthread &t, DWORD ebp = (DWORD) __builtin_frame_address (0)) { if (!t.frame && t.id == GetCurrentThreadId ()) @@ -83,6 +80,9 @@ public: else st = NULL; } + + sigframe (): st (NULL) {} + sigframe (sigthread &t, DWORD ebp = (DWORD) __builtin_frame_address (0)) {init (t, ebp);} ~sigframe () { unregister (); diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h index 995d98e..a32dadb 100644 --- a/winsup/cygwin/sync.h +++ b/winsup/cygwin/sync.h @@ -22,14 +22,16 @@ class muto public: class muto *next; const char *name; + + muto() {} + /* The real constructor. */ + muto(int inh, const char *name); + void *operator new (size_t, void *p) {return p;} void *operator new (size_t) {return ::new muto; } void operator delete (void *) {;} /* can't handle allocated mutos currently */ - muto() {} - /* The real constructor. */ - muto(int inh, const char *name); ~muto (); int acquire (DWORD ms = INFINITE) __attribute__ ((regparm(1))); /* Acquire the lock. */ int release (); /* Release the lock. */ diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index b11e679..b433c3d 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -499,9 +499,7 @@ _open (const char *unix_path, int flags, ...) fhandler_base *fh; cygheap_fdnew fd; - if (fd < 0) - set_errno (ENMFILE); - else + if (fd >= 0) { path_conv pc; if (!(fh = cygheap->fdtab.build_fhandler_from_name (fd, unix_path, |