diff options
author | Christopher Faylor <me@cgf.cx> | 2011-07-30 20:50:23 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2011-07-30 20:50:23 +0000 |
commit | 53ad6f1394aa625e4b75a29e010651e22770e367 (patch) | |
tree | 55b4385d09ada46d2b4966c726f946c444544504 | |
parent | f7e198a665edf1b4d553be353999b4e1b7075c3a (diff) | |
download | newlib-53ad6f1394aa625e4b75a29e010651e22770e367.zip newlib-53ad6f1394aa625e4b75a29e010651e22770e367.tar.gz newlib-53ad6f1394aa625e4b75a29e010651e22770e367.tar.bz2 |
* cygthread.cc (cygthread::async_create): Define new function.
* cygthread.h (cygthread::create): Use correct regparm.
(cygthread::standalone): Delete from class and from all constructors.
(cygthread::cygthread): Use three only arguments for detached threads, and
start the thread via QueueUserAPC/async_create.
* dcrt0.cc (dll_crt0_0): Remove handling for wincap.has_buggy_thread_startup.
(dll_crt0_1): Ditto.
* wincap.cc: Ditto throughout.
* wincap.h: Ditto.
-rw-r--r-- | winsup/cygwin/ChangeLog | 13 | ||||
-rw-r--r-- | winsup/cygwin/cygthread.cc | 11 | ||||
-rw-r--r-- | winsup/cygwin/cygthread.h | 26 | ||||
-rw-r--r-- | winsup/cygwin/dcrt0.cc | 5 | ||||
-rw-r--r-- | winsup/cygwin/wincap.cc | 10 | ||||
-rw-r--r-- | winsup/cygwin/wincap.h | 2 |
6 files changed, 37 insertions, 30 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 66d44fd..e9ff293 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,18 @@ 2011-07-30 Christopher Faylor <me.cygwin2011@cgf.cx> + * cygthread.cc (cygthread::async_create): Define new function. + * cygthread.h (cygthread::create): Use correct regparm. + (cygthread::standalone): Delete from class and from all constructors. + (cygthread::cygthread): Use three only arguments for detached threads, + and start the thread via QueueUserAPC/async_create. + * dcrt0.cc (dll_crt0_0): Remove handling for + wincap.has_buggy_thread_startup. + (dll_crt0_1): Ditto. + * wincap.cc: Ditto throughout. + * wincap.h: Ditto. + +2011-07-30 Christopher Faylor <me.cygwin2011@cgf.cx> + * fhandler.h (fhandler_base_overlapped::size): Declare/define size() function for consistency. (fhandler_termios::size): Ditto. diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc index ef8a4d5..50a265b 100644 --- a/winsup/cygwin/cygthread.cc +++ b/winsup/cygwin/cygthread.cc @@ -186,6 +186,17 @@ out: return info; } +/* This function is called via QueueUserAPC. Apparently creating threads + asynchronously is a huge performance win on Win64. */ +void CALLBACK +cygthread::async_create (ULONG_PTR arg) +{ + cygthread *that = (cygthread *) arg; + that->create (); + ::SetThreadPriority (that->h, THREAD_PRIORITY_HIGHEST); + that->zap_h (); +} + void cygthread::create () { diff --git a/winsup/cygwin/cygthread.h b/winsup/cygwin/cygthread.h index 7f38692..9950873 100644 --- a/winsup/cygwin/cygthread.h +++ b/winsup/cygwin/cygthread.h @@ -31,8 +31,8 @@ class cygthread bool is_freerange; static bool exiting; HANDLE notify_detached; - bool standalone; - void create () __attribute__ ((regparm(2))); + void create () __attribute__ ((regparm (1))); + static void CALLBACK async_create (ULONG_PTR); public: bool terminate_thread (); static DWORD WINAPI stub (VOID *); @@ -44,33 +44,27 @@ class cygthread void release (bool); cygthread (LPTHREAD_START_ROUTINE start, unsigned n, LPVOID param, const char *name, HANDLE notify = NULL) : __name (name), func (start), arglen (n), arg (param), - notify_detached (notify), standalone (false) + notify_detached (notify) { create (); } - cygthread (LPVOID_THREAD_START_ROUTINE start, LPVOID param, const char *name, HANDLE notify = NULL) + cygthread (LPVOID_THREAD_START_ROUTINE start, LPVOID param, const char *name) : __name (name), func ((LPTHREAD_START_ROUTINE) start), arglen (0), - arg (param), notify_detached (notify), standalone (true) + arg (param), notify_detached (NULL) { - create (); - /* This is a neverending/high-priority thread */ - ::SetThreadPriority (h, THREAD_PRIORITY_HIGHEST); - zap_h (); + QueueUserAPC (async_create, GetCurrentThread (), (ULONG_PTR) this); } cygthread (LPTHREAD_START_ROUTINE start, LPVOID param, const char *name, HANDLE notify = NULL) : __name (name), func (start), arglen (0), arg (param), - notify_detached (notify), standalone (false) + notify_detached (notify) { create (); } - cygthread (LPVOID_THREAD_START_ROUTINE start, unsigned n, LPVOID param, const char *name, HANDLE notify = NULL) + cygthread (LPVOID_THREAD_START_ROUTINE start, unsigned n, LPVOID param, const char *name) : __name (name), func ((LPTHREAD_START_ROUTINE) start), arglen (n), - arg (param), notify_detached (notify), standalone (true) + arg (param), notify_detached (NULL) { - create (); - /* This is a neverending/high-priority thread */ - ::SetThreadPriority (h, THREAD_PRIORITY_HIGHEST); - zap_h (); + QueueUserAPC (async_create, GetCurrentThread (), (ULONG_PTR) this); } cygthread () {}; static void init (); diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 017faa6..32a5bc1 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -709,7 +709,7 @@ dll_crt0_0 () /* Initialize signal processing here, early, in the hopes that the creation of a thread early in the process will cause more predictability in memory layout for the main thread. */ - if (!wincap.has_buggy_thread_startup () && !dynamically_loaded) + if (!dynamically_loaded) sigproc_init (); debug_printf ("finished dll_crt0_0 initialization"); @@ -724,8 +724,9 @@ dll_crt0_1 (void *) { extern void initial_setlocale (); - if (wincap.has_buggy_thread_startup () || dynamically_loaded) + if (dynamically_loaded) sigproc_init (); + check_sanity_and_sync (user_data); /* Initialize malloc and then call user_shared_initialize since it relies diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc index 2a848b4..25acbf3 100644 --- a/winsup/cygwin/wincap.cc +++ b/winsup/cygwin/wincap.cc @@ -47,7 +47,6 @@ wincaps wincap_2000 __attribute__((section (".cygwin_dll_common"), shared)) = { has_broken_alloc_console:false, has_always_all_codepages:false, has_localenames:false, - has_buggy_thread_startup:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:false, @@ -78,7 +77,6 @@ wincaps wincap_2000sp4 __attribute__((section (".cygwin_dll_common"), shared)) = has_broken_alloc_console:false, has_always_all_codepages:false, has_localenames:false, - has_buggy_thread_startup:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:false, @@ -109,7 +107,6 @@ wincaps wincap_xp __attribute__((section (".cygwin_dll_common"), shared)) = { has_broken_alloc_console:false, has_always_all_codepages:false, has_localenames:false, - has_buggy_thread_startup:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:true, @@ -140,7 +137,6 @@ wincaps wincap_xpsp1 __attribute__((section (".cygwin_dll_common"), shared)) = { has_broken_alloc_console:false, has_always_all_codepages:false, has_localenames:false, - has_buggy_thread_startup:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:true, @@ -171,7 +167,6 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = { has_broken_alloc_console:false, has_always_all_codepages:false, has_localenames:false, - has_buggy_thread_startup:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:true, @@ -202,7 +197,6 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = { has_broken_alloc_console:false, has_always_all_codepages:false, has_localenames:false, - has_buggy_thread_startup:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:true, @@ -233,7 +227,6 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = { has_broken_alloc_console:false, has_always_all_codepages:true, has_localenames:true, - has_buggy_thread_startup:true, has_fast_cwd:true, has_restricted_raw_disk_access:true, use_dont_resolve_hack:false, @@ -264,7 +257,6 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = { has_broken_alloc_console:true, has_always_all_codepages:true, has_localenames:true, - has_buggy_thread_startup:false, has_fast_cwd:true, has_restricted_raw_disk_access:true, use_dont_resolve_hack:false, @@ -358,8 +350,6 @@ wincapc::init () ((wincaps *)caps)->has_restricted_stack_args = false; } - if (!wow64) - ((wincaps *) caps)->has_buggy_thread_startup = false; __small_sprintf (osnam, "NT-%d.%d", version.dwMajorVersion, version.dwMinorVersion); } diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h index 7738d1f..eab78fd 100644 --- a/winsup/cygwin/wincap.h +++ b/winsup/cygwin/wincap.h @@ -37,7 +37,6 @@ struct wincaps unsigned has_broken_alloc_console : 1; unsigned has_always_all_codepages : 1; unsigned has_localenames : 1; - unsigned has_buggy_thread_startup : 1; unsigned has_fast_cwd : 1; unsigned has_restricted_raw_disk_access : 1; unsigned use_dont_resolve_hack : 1; @@ -87,7 +86,6 @@ public: bool IMPLEMENT (has_broken_alloc_console) bool IMPLEMENT (has_always_all_codepages) bool IMPLEMENT (has_localenames) - bool IMPLEMENT (has_buggy_thread_startup) bool IMPLEMENT (has_fast_cwd) bool IMPLEMENT (has_restricted_raw_disk_access) bool IMPLEMENT (use_dont_resolve_hack) |