From: K. F. <kfr...@gm...> - 2011-09-21 00:57:58
|
Hello List! I wanted to give some quick feedback. I tried out Ruben's mingw-w64 personal build that implements std::thread, and it works great. I downloaded the 64-bit 4.7.0 version: x86_64-w64-mingw32-gcc-4.7.0-stdthread_rubenvb.7z unzipped it, and tried it out with some std::thread test programs. (I am running on 64-bit windows 7 and g++ reports its version as "g++ (GCC) 4.7.0 20110829 (experimental)".) I compiled everything thus: g++ -static -std=c++0x -o std_thread_test_xxx std_thread_test_xxx.cpp I set the static (per Ruben's instruction) and the std=c++0x flags. (I didn't try anything fancy -- any optimizations or the like.) Everything worked, as far as I can tell. My programs test the following features: thread creation and joins mutexes condition variables timed mutex waits timed waits on condition variables async and passing an exception back to a future and I ran a parallel_accumulate algorithm posted by Anthony Williams. (It needed some minor tweaks to compile with the subset of c++0x I had when I first experimented it.) The mutex and condition-variable tests, in particular, were run with tens of threads and were designed to create some contention to look for race conditions and deadlocks. (I also goosed up Williams's parallel_accumulate to run with fifty threads.) The main weakness in my tests is that even though I ran with lots of threads, I am running on a two-core machine. So I do get two active threads running concurrently, but the tests are not as aggressive as they would be if I had more processors. (The tests also use some of the other new c++0x features, but mostly just the convenience stuff and nothing particularly outlandish.) So... Hats off to Ruben for a great step forward! Thanks for making this available to us all. Best regards. K. Frank |
From: Ruben V. B. <van...@gm...> - 2011-09-21 06:37:57
|
Op 21 sep. 2011 02:58 schreef "K. Frank" <kfr...@gm...> het volgende: > > Hello List! > > I wanted to give some quick feedback. I tried out Ruben's mingw-w64 > personal build that implements std::thread, and it works great. > > I downloaded the 64-bit 4.7.0 version: > > x86_64-w64-mingw32-gcc-4.7.0-stdthread_rubenvb.7z > > unzipped it, and tried it out with some std::thread test programs. > (I am running on 64-bit windows 7 and g++ reports its version as > "g++ (GCC) 4.7.0 20110829 (experimental)".) > > I compiled everything thus: > > g++ -static -std=c++0x -o std_thread_test_xxx std_thread_test_xxx.cpp > > I set the static (per Ruben's instruction) and the std=c++0x flags. > (I didn't try anything fancy -- any optimizations or the like.) > > Everything worked, as far as I can tell. > > My programs test the following features: > > thread creation and joins > mutexes > condition variables > timed mutex waits > timed waits on condition variables > async and passing an exception back to a future > > and I ran a parallel_accumulate algorithm posted by Anthony Williams. > (It needed some minor tweaks to compile with the subset of c++0x I > had when I first experimented it.) > > The mutex and condition-variable tests, in particular, were run with tens > of threads and were designed to create some contention to look for race > conditions and deadlocks. (I also goosed up Williams's parallel_accumulate > to run with fifty threads.) > > The main weakness in my tests is that even though I ran with lots of > threads, I am running on a two-core machine. So I do get two active > threads running concurrently, but the tests are not as aggressive as > they would be if I had more processors. > > (The tests also use some of the other new c++0x features, but mostly > just the convenience stuff and nothing particularly outlandish.) > > So... > > Hats off to Ruben for a great step forward! Thanks for making this > available to us all. The work is really all Kai and JonY! I'm just the messenger :-) Thanks for the rather deep testing, we appreciate it, and the result of course ;-) Ruben > > > Best regards. > > > K. Frank > > ------------------------------------------------------------------------------ > All the data continuously generated in your IT infrastructure contains a > definitive record of customers, application performance, security > threats, fraudulent activity and more. Splunk takes this data and makes > sense of it. Business sense. IT sense. Common sense. > http://p.sf.net/sfu/splunk-d2dcopy1 > _______________________________________________ > Mingw-w64-public mailing list > Min...@li... > https://lists.sourceforge.net/lists/listinfo/mingw-w64-public |
From: xunxun <xun...@gm...> - 2011-09-21 08:55:03
|
diff -ruNa old/gcc/config/i386/mingw32.h build/gcc/config/i386/mingw32.h --- old/gcc/config/i386/mingw32.h 2010-09-30 02:55:44 +0800 +++ build/gcc/config/i386/mingw32.h 2011-09-03 23:15:08 +0800 @@ -114,7 +114,7 @@ #define REAL_LIBGCC_SPEC \ "%{mthreads:-lmingwthrd} -lmingw32 \ "SHARED_LIBGCC_SPEC" \ - -lgcc \ + -lgcc -lpthread \ -lmoldname -lmingwex -lmsvcrt" #undef STARTFILE_SPEC @@ -169,7 +169,8 @@ /* mingw32 uses the -mthreads option to enable thread support. */ #undef GOMP_SELF_SPECS -#define GOMP_SELF_SPECS "%{fopenmp: -mthreads}" +#define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: " \ + "-mthreads -lpthread}" /* mingw32 atexit function is safe to use in shared libraries. Use it to register C++ static destructors. */ diff -ruNa old/libstdc++-v3/acinclude.m4 build/libstdc++-v3/acinclude.m4 --- old/libstdc++-v3/acinclude.m4 2011-03-08 08:04:06 +0800 +++ build/libstdc++-v3/acinclude.m4 2011-09-03 23:28:45 +0800 @@ -1697,7 +1697,9 @@ m4_pushdef([n_syserr], [1])dnl m4_foreach([syserr], [EOWNERDEAD, ENOTRECOVERABLE, ENOLINK, EPROTO, ENODATA, ENOSR, ENOSTR, ETIME, EBADMSG, ECANCELED, - EOVERFLOW, ENOTSUP, EIDRM, ETXTBSY], + EOVERFLOW, ENOTSUP, EIDRM, ETXTBSY, + ECHILD, ENOSPC, EPERM, + ETIMEDOUT, EWOULDBLOCK], [m4_pushdef([SYSERR], m4_toupper(syserr))dnl AC_MSG_CHECKING([for syserr]) AC_CACHE_VAL([glibcxx_cv_system_error[]n_syserr], [ diff -ruNa old/libstdc++-v3/config/os/mingw32/error_constants.h build/libstdc++-v3/config/os/mingw32/error_constants.h --- old/libstdc++-v3/config/os/mingw32/error_constants.h 2011-01-31 06:39:36 +0800 +++ build/libstdc++-v3/config/os/mingw32/error_constants.h 2011-09-04 00:38:25 +0800 @@ -79,13 +79,17 @@ // network_reset = ENETRESET, // network_unreachable = ENETUNREACH, // no_buffer_space = ENOBUFS, -// no_child_process = ECHILD, +#ifdef _GLIBCXX_HAVE_ECHILD + no_child_process = ECHILD, +#endif // no_link = ENOLINK, no_lock_available = ENOLCK, // no_message_available = ENODATA, // no_message = ENOMSG, // no_protocol_option = ENOPROTOOPT, -// no_space_on_device = ENOSPC, +#ifdef _GLIBCXX_HAVE_ENOSPC + no_space_on_device = ENOSPC, +#endif // no_stream_resources = ENOSR, no_such_device_or_address = ENXIO, no_such_device = ENODEV, @@ -96,12 +100,18 @@ // not_a_stream = ENOSTR, // not_connected = ENOTCONN, not_enough_memory = ENOMEM, -// not_supported = ENOTSUP, +#ifdef _GLIBCXX_HAVE_ENOTSUP + not_supported = ENOTSUP, +#endif // operation_canceled = ECANCELED, // operation_in_progress = EINPROGRESS, -// operation_not_permitted = EPERM, +#ifdef _GLIBCXX_HAVE_EPERM + operation_not_permitted = EPERM, +#endif // operation_not_supported = EOPNOTSUPP, -// operation_would_block = EWOULDBLOCK, +#ifdef _GLIBCXX_HAVE_EWOULDBLOCK + operation_would_block = EWOULDBLOCK, +#endif // owner_dead = EOWNERDEAD, permission_denied = EACCES, // protocol_error = EPROTO, @@ -113,12 +123,16 @@ // state_not_recoverable = ENOTRECOVERABLE, // stream_timeout = ETIME, // text_file_busy = ETXTBSY, -// timed_out = ETIMEDOUT, +#ifdef _GLIBCXX_HAVE_ETIMEDOUT + timed_out = ETIMEDOUT, +#endif too_many_files_open_in_system = ENFILE, too_many_files_open = EMFILE, - too_many_links = EMLINK + too_many_links = EMLINK, // too_many_symbolic_link_levels = ELOOP, - // value_too_large = EOVERFLOW, +#ifdef _GLIBCXX_HAVE_EOVERFLOW + value_too_large = EOVERFLOW, +#endif // wrong_protocol_type = EPROTOTYPE }; diff -ruNa old/libstdc++-v3/config.h.in build/libstdc++-v3/config.h.in --- old/libstdc++-v3/config.h.in 2010-07-27 18:36:50 +0800 +++ build/libstdc++-v3/config.h.in 2011-09-03 23:22:02 +0800 @@ -60,6 +60,9 @@ /* Define if ECANCELED exists. */ #undef HAVE_ECANCELED +/* Define if ECHILD exists. */ +#undef HAVE_ECHILD + /* Define if EIDRM exists. */ #undef HAVE_EIDRM @@ -72,6 +75,9 @@ /* Define if ENOLINK exists. */ #undef HAVE_ENOLINK +/* Define if ENOSPC exists. */ +#undef HAVE_ENOSPC + /* Define if ENOSR exists. */ #undef HAVE_ENOSR @@ -90,15 +96,24 @@ /* Define if EOWNERDEAD exists. */ #undef HAVE_EOWNERDEAD +/* Define if EPERM exists. */ +#undef HAVE_EPERM + /* Define if EPROTO exists. */ #undef HAVE_EPROTO /* Define if ETIME exists. */ #undef HAVE_ETIME +/* Define if ETIMEDOUT exists. */ +#undef HAVE_ETIMEDOUT + /* Define if ETXTBSY exists. */ #undef HAVE_ETXTBSY +/* Define if EWOULDBLOCK exists. */ +#undef HAVE_EWOULDBLOCK + /* Define to 1 if you have the <execinfo.h> header file. */ #undef HAVE_EXECINFO_H diff -ruNa old/libstdc++-v3/configure build/libstdc++-v3/configure --- old/libstdc++-v3/configure 2011-05-26 08:15:58 +0800 +++ build/libstdc++-v3/configure 2011-09-03 23:19:08 +0800 @@ -17629,6 +17629,173 @@ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ECHILD" >&5 +$as_echo_n "checking for ECHILD... " >&6; } +if test "${glibcxx_cv_system_error15+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <errno.h> +int +main () +{ +int i = ECHILD; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_system_error15=yes +else + glibcxx_cv_system_error15=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error15" >&5 +$as_echo "$glibcxx_cv_system_error15" >&6; } +if test x"$glibcxx_cv_system_error15" = x"yes"; then + +$as_echo "#define HAVE_ECHILD 1" >>confdefs.h + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOSPC" >&5 +$as_echo_n "checking for ENOSPC... " >&6; } +if test "${glibcxx_cv_system_error16+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <errno.h> +int +main () +{ +int i = ENOSPC; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_system_error16=yes +else + glibcxx_cv_system_error16=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error16" >&5 +$as_echo "$glibcxx_cv_system_error16" >&6; } +if test x"$glibcxx_cv_system_error16" = x"yes"; then + +$as_echo "#define HAVE_ENOSPC 1" >>confdefs.h + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EPERM" >&5 +$as_echo_n "checking for EPERM... " >&6; } +if test "${glibcxx_cv_system_error17+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <errno.h> +int +main () +{ +int i = EPERM; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_system_error17=yes +else + glibcxx_cv_system_error17=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error17" >&5 +$as_echo "$glibcxx_cv_system_error17" >&6; } +if test x"$glibcxx_cv_system_error17" = x"yes"; then + +$as_echo "#define HAVE_EPERM 1" >>confdefs.h + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ETIMEDOUT" >&5 +$as_echo_n "checking for ETIMEDOUT... " >&6; } +if test "${glibcxx_cv_system_error18+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <errno.h> +int +main () +{ +int i = ETIMEDOUT; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_system_error18=yes +else + glibcxx_cv_system_error18=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error18" >&5 +$as_echo "$glibcxx_cv_system_error18" >&6; } +if test x"$glibcxx_cv_system_error18" = x"yes"; then + +$as_echo "#define HAVE_ETIMEDOUT 1" >>confdefs.h + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EWOULDBLOCK" >&5 +$as_echo_n "checking for EWOULDBLOCK... " >&6; } +if test "${glibcxx_cv_system_error19+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <errno.h> +int +main () +{ +int i = EWOULDBLOCK; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_system_error19=yes +else + glibcxx_cv_system_error19=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error19" >&5 +$as_echo "$glibcxx_cv_system_error19" >&6; } +if test x"$glibcxx_cv_system_error19" = x"yes"; then + +$as_echo "#define HAVE_EWOULDBLOCK 1" >>confdefs.h + +fi + + # For the streamoff typedef. |
From: Ruben V. B. <van...@gm...> - 2011-09-21 10:43:17
|
2011/9/21 xunxun <xun...@gm...> > Hi, Ruben > > If you back port the std::thread to gcc4.6, you can use the patch. > Thanks for the patch, but I had already located the official commits, which I cherry-picked into the 4.6 branch instead. > > ps: may you follow the binutils bug issue PR 12762 ( > http://sourceware.org/bugzilla/show_bug.cgi?id=12762 )? > > I can't find the smallest testcase. > Sorry, I don't understand what you're trying to say here. Ruben |
From: xunxun <xun...@gm...> - 2011-09-22 13:05:31
|
Hi, Ruben 于 2011/9/21 18:43, Ruben Van Boxem 写道: > > > ps: may you follow the binutils bug issue PR 12762 ( > http://sourceware.org/bugzilla/show_bug.cgi?id=12762 )? > > I can't find the smallest testcase. > > > Sorry, I don't understand what you're trying to say here. > > Ruben I mean can you debug the ld using my testcase in binutils bug PR 12762 ( http://sourceware.org/bugzilla/show_bug.cgi?id=12762 ). I don't know why I can't debug ld when break some breakpoint , because I encounted some memory excess error. At present, I think the code in the cofflink.c is something wrong: if (ps->flags & SEC_EXCLUDE) (*finfo->info->callbacks->einfo) (_("%X`%s' referenced in section `%A' of %B: " "defined in discarded section `%A' of %B\n"), h->root.root.string, o, input_bfd, ps, ps->owner); This can cause ld return value FALSE. But I don't know where its return value is. This issue can cause some code can't be built with "-flto -fuse-linker-plugin". Thanks. -- Best Regards, xunxun |
From: Ruben V. B. <van...@gm...> - 2011-09-22 13:11:04
|
2011/9/22 xunxun <xun...@gm...> > Hi, Ruben > > 于 2011/9/21 18:43, Ruben Van Boxem 写道: > > > >> >> ps: may you follow the binutils bug issue PR 12762 ( >> http://sourceware.org/bugzilla/show_bug.cgi?id=12762 )? >> >> I can't find the smallest testcase. >> > > Sorry, I don't understand what you're trying to say here. > > Ruben > > I mean can you debug the ld using my testcase in binutils bug PR 12762 ( > http://sourceware.org/bugzilla/show_bug.cgi?id=12762 ). > > I don't know why I can't debug ld when break some breakpoint , because I > encounted some memory excess error. > > At present, I think the code in the cofflink.c is something wrong: > if (ps->flags & SEC_EXCLUDE) > (*finfo->info->callbacks->einfo) > (_("%X`%s' referenced in section `%A' of %B: " > "defined in discarded section `%A' of %B\n"), > h->root.root.string, o, input_bfd, ps, ps->owner); > > This can cause ld return value FALSE. > But I don't know where its return value is. > > This issue can cause some code can't be built with "-flto > -fuse-linker-plugin". > I'm sorry, but I'm not that good at debugging binutils. It's all magic going on as far as I'm concerned. Ruben. PS: why do you use -fuse-linker-plugin anyway? Isn't "-flto" alone enough? > > Thanks. > > -- > Best Regards, > xunxun > > |
From: xunxun <xun...@gm...> - 2011-09-22 13:13:22
|
于 2011/9/22 21:10, Ruben Van Boxem 写道: > why do you use -fuse-linker-plugin anyway? Isn't "-flto" alone enough? No. Only -flto can't use static lib's LTO information, but -flto-linker-plugin does. -- Best Regards, xunxun |