diff options
author | Christopher Faylor <me@cgf.cx> | 2010-03-12 23:13:48 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2010-03-12 23:13:48 +0000 |
commit | 084ea5108e86738a09288268b186541b0c23920a (patch) | |
tree | 93ad21c3c750fe12e7792ff8679b87888992dc3d /winsup | |
parent | 36960dec3721fccc8eb931787a2656cf715bfc39 (diff) | |
download | newlib-084ea5108e86738a09288268b186541b0c23920a.zip newlib-084ea5108e86738a09288268b186541b0c23920a.tar.gz newlib-084ea5108e86738a09288268b186541b0c23920a.tar.bz2 |
Throughout change all calls of low_priority_sleep (0) to yield ().
* miscfuncs.cc (yield): Rename from low_priority_sleep. Remove all of the
logic which called Sleep() and just use SwitchToThread.
* miscfuncs.h (yield): Rename from low_priority_sleep.
(SLEEP_0_STAY_LOW): Delete unused define.
* shared.cc (memory_init): Move heap_init() call directly after shared memory
initialization to more closely mimic long-standing program flow.
* tty.cc (tty_list::terminate): Replace call to low_priority_sleep with Sleep.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/ChangeLog | 12 | ||||
-rw-r--r-- | winsup/cygwin/autoload.cc | 4 | ||||
-rw-r--r-- | winsup/cygwin/cygthread.cc | 10 | ||||
-rw-r--r-- | winsup/cygwin/dcrt0.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/exceptions.cc | 4 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_fifo.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_proc.cc | 2 | ||||
-rwxr-xr-x | winsup/cygwin/gendef | 15 | ||||
-rw-r--r-- | winsup/cygwin/miscfuncs.cc | 40 | ||||
-rw-r--r-- | winsup/cygwin/miscfuncs.h | 3 | ||||
-rw-r--r-- | winsup/cygwin/net.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/pinfo.cc | 6 | ||||
-rw-r--r-- | winsup/cygwin/sched.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/shared.cc | 8 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.cc | 4 | ||||
-rw-r--r-- | winsup/cygwin/sync.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/thread.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/tty.cc | 2 |
18 files changed, 48 insertions, 74 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index f7f1f50..e476c7e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2010-03-12 Christopher Faylor <me+cygwin@cgf.cx> + + Throughout change all calls of low_priority_sleep (0) to yield (). + * miscfuncs.cc (yield): Rename from low_priority_sleep. Remove all of + the logic which called Sleep() and just use SwitchToThread. + * miscfuncs.h (yield): Rename from low_priority_sleep. + (SLEEP_0_STAY_LOW): Delete unused define. + * shared.cc (memory_init): Move heap_init() call directly after shared + memory initialization to more closely mimic long-standing program flow. + * tty.cc (tty_list::terminate): Replace call to low_priority_sleep with + Sleep. + 2010-03-10 Christopher Faylor <me.cygwin@cgf.cx> * shared.cc (memory_init): Fix comment. Fix indentation. diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc index eb16961..f5bdade 100644 --- a/winsup/cygwin/autoload.cc +++ b/winsup/cygwin/autoload.cc @@ -216,7 +216,7 @@ std_dll_init () do { InterlockedDecrement (&dll->here); - low_priority_sleep (0); + yield (); } while (InterlockedIncrement (&dll->here)); else if (!dll->handle) @@ -259,7 +259,7 @@ wsock_init () while (InterlockedIncrement (&here)) { InterlockedDecrement (&here); - low_priority_sleep (0); + yield (); } if (!wsock_started) diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc index b0aea36..e747a2d 100644 --- a/winsup/cygwin/cygthread.cc +++ b/winsup/cygwin/cygthread.cc @@ -41,7 +41,7 @@ cygthread::callfunc (bool issimplestub) { /* Wait for main thread to assign 'h' */ while (!h) - low_priority_sleep (0); + yield (); if (ev) CloseHandle (ev); ev = h; @@ -196,7 +196,7 @@ cygthread::cygthread (LPTHREAD_START_ROUTINE start, size_t n, void *param, if (ev) ResetEvent (ev); while (!thread_sync) - low_priority_sleep (0); + yield (); SetEvent (thread_sync); thread_printf ("activated name '%s', thread_sync %p for thread %p", name, thread_sync, id); htobe = h; @@ -217,7 +217,7 @@ cygthread::cygthread (LPTHREAD_START_ROUTINE start, size_t n, void *param, if (n) { while (!ev) - low_priority_sleep (0); + yield (); WaitForSingleObject (ev, INFINITE); ResetEvent (ev); } @@ -256,7 +256,7 @@ cygthread::operator HANDLE () { while (!ev) - low_priority_sleep (0); + yield (); return ev; } @@ -287,7 +287,7 @@ cygthread::terminate_thread () bool terminated = true; debug_printf ("thread '%s', id %p, inuse %d, stack_ptr %p", __name, id, inuse, stack_ptr); while (inuse && !stack_ptr) - low_priority_sleep (0); + yield (); if (!inuse) goto force_notterminated; diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index f85f297..5cee9f8 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -557,7 +557,7 @@ get_cygwin_startup_info () { res->ready (false); for (unsigned i = 0; !being_debugged () && i < 10000; i++) - low_priority_sleep (0); + yield (); strace.hello (); } break; diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index c416edc..39b56ea 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -440,7 +440,7 @@ try_to_debug (bool waitloop) return dbg; SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE); while (!being_debugged ()) - low_priority_sleep (0); + yield (); Sleep (2000); } @@ -901,7 +901,7 @@ setup_handler (int sig, void *handler, struct sigaction& siga, _cygtls *tls) break; sigproc_printf ("couldn't interrupt. trying again."); - low_priority_sleep (0); + yield (); } out: diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index d24c731..b4a78d4 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -46,7 +46,7 @@ fhandler_fifo::open_nonserver (const char *npname, unsigned low_flags, if (h != INVALID_HANDLE_VALUE || GetLastError () != ERROR_PIPE_NOT_CONNECTED) return h; if (&_my_tls != _main_tls) - low_priority_sleep (0); + yield (); else if (WaitForSingleObject (signal_arrived, 0) == WAIT_OBJECT_0) { set_errno (EINTR); diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc index bfbf64d..de55797 100644 --- a/winsup/cygwin/fhandler_proc.cc +++ b/winsup/cygwin/fhandler_proc.cc @@ -616,7 +616,7 @@ format_proc_cpuinfo (void *, char *&destbuf) debug_printf ("SetThreadAffinityMask failed %E"); // I'm not sure whether the thread changes processor immediately // and I'm not sure whether this function will cause the thread to be rescheduled - low_priority_sleep (0); + yield (); bool has_cpuid = false; diff --git a/winsup/cygwin/gendef b/winsup/cygwin/gendef index 9c17010..8899e85 100755 --- a/winsup/cygwin/gendef +++ b/winsup/cygwin/gendef @@ -126,8 +126,7 @@ __sigfe: movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock testl %eax,%eax # it will be zero jz 2f # if so - xorl %eax,%eax # nope. It was not zero - call _low_priority_sleep # should be a short-time thing, so + call _yield # should be a short-time thing, so jmp 1b # sleep and loop 2: movl \$4,%eax # have the lock, now increment the xadd %eax,$tls::stackptr(%ebx) # stack pointer and get pointer @@ -151,8 +150,7 @@ __sigbe: # return here after cygwin syscall movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock testl %eax,%eax # it will be zero jz 2f # if so - xorl %eax,%eax # nope. not zero - call _low_priority_sleep # sleep + call _yield # sleep jmp 1b # and loop 2: movl \$-4,%eax # now decrement aux stack xadd %eax,$tls::stackptr(%ebx) # and get pointer @@ -177,8 +175,7 @@ _sigreturn: movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock testl %eax,%eax # it will be zero jz 2f # if so - xorl %eax,%eax # nope. not zero - call _low_priority_sleep # sleep + call _yield # sleep jmp 1b # and loop 2: popl %edx # saved errno testl %edx,%edx # Is it < 0 @@ -258,8 +255,7 @@ __ZN7_cygtls4lockEv: lock xchgl %eax,$tls::pstacklock(%ebx) testl %eax,%eax jz 2f - xorl %eax,%eax - call _low_priority_sleep + call _yield jmp 1b 2: popl %ebx ret @@ -283,8 +279,7 @@ stabilize_sig_stack: movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock testl %eax,%eax jz 2f - xorl %eax,%eax - call _low_priority_sleep + call _yield jmp 1b 2: cmpl \$0,$tls::sig(%ebx) jz 3f diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc index 29b8159..c7099dc 100644 --- a/winsup/cygwin/miscfuncs.cc +++ b/winsup/cygwin/miscfuncs.cc @@ -228,43 +228,11 @@ check_iovec (const struct iovec *iov, int iovcnt, bool forwrite) return (ssize_t) tot; } -extern "C" int -low_priority_sleep (DWORD secs) +void +yield () { - HANDLE thisthread = GetCurrentThread (); - int curr_prio = GetThreadPriority (thisthread); - bool staylow; - if (secs != INFINITE) - staylow = false; - else - { - secs = 0; - staylow = true; - } - - if (!secs) - { - for (int i = 0; i < 3; i++) - SwitchToThread (); - } - else - { - int new_prio; - if (GetCurrentThreadId () == cygthread::main_thread_id) - new_prio = THREAD_PRIORITY_LOWEST; - else - new_prio = GetThreadPriority (hMainThread); - - if (curr_prio != new_prio) - /* Force any threads in normal priority to be scheduled */ - SetThreadPriority (thisthread, new_prio); - Sleep (secs); - - if (!staylow && curr_prio != new_prio) - SetThreadPriority (thisthread, curr_prio); - } - - return curr_prio; + for (int i = 0; i < 3; i++) + SwitchToThread (); } /* Get a default value for the nice factor. When changing these values, diff --git a/winsup/cygwin/miscfuncs.h b/winsup/cygwin/miscfuncs.h index 489f8b7..1dcb924 100644 --- a/winsup/cygwin/miscfuncs.h +++ b/winsup/cygwin/miscfuncs.h @@ -18,8 +18,7 @@ bool __stdcall create_pipe (PHANDLE, PHANDLE, LPSECURITY_ATTRIBUTES, DWORD) __attribute__ ((regparm (3))); #define CreatePipe create_pipe -extern "C" int low_priority_sleep (DWORD) __attribute__ ((regparm (1))); -#define SLEEP_0_STAY_LOW INFINITE +extern "C" void yield (); void backslashify (const char *, char *, bool); void slashify (const char *, char *, bool); diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index ac83d4e..ad1735f 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -2775,7 +2775,7 @@ cygwin_bindresvport_sa (int fd, struct sockaddr *sa) for (int i = 0; i < NUM_PORTS; i++) { while ((myport = InterlockedExchange (&cygwin_shared->last_used_bindresvport, -1)) == -1) - low_priority_sleep (0); + yield (); if (myport == 0 || --myport < PORT_LOW) myport = PORT_HIGH; InterlockedExchange (&cygwin_shared->last_used_bindresvport, myport); diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index af081ba..cdc801d 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -258,7 +258,7 @@ pinfo::init (pid_t n, DWORD flag, HANDLE h0) mapaddr = NULL; } debug_printf ("MapViewOfFileEx h0 %p, i %d failed, %E", h0, i); - low_priority_sleep (0); + yield (); continue; } @@ -313,7 +313,7 @@ pinfo::init (pid_t n, DWORD flag, HANDLE h0) loop: release (); if (h0) - low_priority_sleep (0); + yield (); } if (h) @@ -978,7 +978,7 @@ _pinfo::sync_proc_pipe () { if (wr_proc_pipe && wr_proc_pipe != INVALID_HANDLE_VALUE) while (wr_proc_pipe_owner != GetCurrentProcessId ()) - low_priority_sleep (0); + yield (); } /* function to send a "signal" to the parent when something interesting happens diff --git a/winsup/cygwin/sched.cc b/winsup/cygwin/sched.cc index 08f9683..eae493b 100644 --- a/winsup/cygwin/sched.cc +++ b/winsup/cygwin/sched.cc @@ -483,7 +483,7 @@ sched_setscheduler (pid_t pid, int policy, int sched_yield () { - low_priority_sleep (0); + yield (); return 0; } } diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc index 4a24892..fcca6f4 100644 --- a/winsup/cygwin/shared.cc +++ b/winsup/cygwin/shared.cc @@ -318,7 +318,7 @@ user_shared_initialize () else { while (!user_shared->cb) - low_priority_sleep (0); // Should be hit only very very rarely + yield (); // Should be hit only very very rarely if (user_shared->version != sversion) multiple_cygwin_problem ("user shared memory version", user_shared->version, sversion); else if (user_shared->cb != sizeof (*user_shared)) @@ -423,7 +423,7 @@ memory_init (bool init_cygheap) LONG smi = InterlockedExchange (&shared_mem_inited, -1); if (smi < 0) { - low_priority_sleep (0); + yield (); continue; } @@ -431,12 +431,13 @@ memory_init (bool init_cygheap) /* Initialize installation root dir */ init_installation_root (); - /* Installation root dir has been globally initialized */ cygwin_shared = (shared_info *) open_shared (L"shared", CYGWIN_VERSION_SHARED_DATA, cygwin_shared_h, sizeof (*cygwin_shared), SH_CYGWIN_SHARED); + heap_init (); + if (!smi) { cygwin_shared->initialize (); @@ -451,7 +452,6 @@ memory_init (bool init_cygheap) InterlockedExchange (&shared_mem_inited, smi); break; } - heap_init (); user_shared_create (false); } diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index e940ebe..9408b0c 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -583,7 +583,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) HANDLE dupsig; DWORD dwProcessId; for (int i = 0; !p->sendsig && i < 10000; i++) - low_priority_sleep (0); + yield (); if (p->sendsig) { dupsig = p->sendsig; @@ -1011,7 +1011,7 @@ remove_proc (int ci) the proc_waiter thread has already done this by the time we get here. */ while (!procs[nprocs].waiter_ready) - low_priority_sleep (0); + yield (); procs[ci] = procs[nprocs]; } return 0; diff --git a/winsup/cygwin/sync.cc b/winsup/cygwin/sync.cc index 8fa0d93..b62c6bc 100644 --- a/winsup/cygwin/sync.cc +++ b/winsup/cygwin/sync.cc @@ -36,7 +36,7 @@ muto::init (const char *s) char *already_exists = (char *) InterlockedExchangePointer (&name, s); if (already_exists) while (!bruteforce) - low_priority_sleep (0); + yield (); else { waiters = -1; diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 20eb95d..5681aad 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -456,7 +456,7 @@ pthread::create (void *(*func) (void *), pthread_attr *newattr, { postcreate (); while (!cygtls) - low_priority_sleep (0); + yield (); } retval = magic; mutex.unlock (); diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc index 624805f..e701810 100644 --- a/winsup/cygwin/tty.cc +++ b/winsup/cygwin/tty.cc @@ -160,7 +160,7 @@ tty_list::terminate () i = 0; } - low_priority_sleep (200); + Sleep (200); } lock_ttys here (); |