Tested x86_64-pc-linux-gnu, committed to master.

Jonathan Wakely writes:

> On 17/12/20 15:37 -0800, Thomas Rodgers wrote:
>>From: Thomas Rodgers <trodg...@redhat.com>
>>
>>Cleans up a few things mentioned on IRC.
>>
>>Adds <barrier>
>>
>>libstdc++/ChangeLog:
>>
>>      * doc/doxygen/user.cfg.in: Add new header.
>>      * include/Makefile.am (std_headers): likewise.
>>      * include/Makefile.in: Regenerate.
>>        * include/precompiled/stdc++.h: Add new header.
>>      * include/std/barrier: New file.
>>      * include/std/version: Add __cpp_lib_barrier feature test macro.
>>      * testsuite/30_thread/barrier/1.cc: New test.
>>      * testsuite/30_thread/barrier/2.cc: Likewise.
>>      * testsuite/30_thread/barrier/arrive_and_drop.cc: Likewise.
>>      * testsuite/30_thread/barrier/arrive_and_wait.cc: Likewise.
>>      * testsuite/30_thread/barrier/arrive.cc: Likewise.
>>      * testsuite/30_thread/barrier/completion.cc: Likewise.
>>      * testsuite/30_thread/barrier/max.cc: Likewise.
>
>
>>+#ifndef _GLIBCXX_BARRIER
>>+#define _GLIBCXX_BARRIER 1
>>+
>>+#pragma GCC system_header
>>+
>>+#if __cplusplus > 201703L
>>+#include <bits/atomic_base.h>
>>+#if __cpp_lib_atomic_wait  && __cpp_aligned_new
>
> There's an extra space here before the && operator.
>
>>+#endif // __cpp_lib_atomic_wait  && __cpp_aligned_new
>
> And here.
>
>>+#endif // __cplusplus > 201703L
>>+#endif // _GLIBCXX_BARRIER
>>+
>>diff --git a/libstdc++-v3/include/std/version 
>>b/libstdc++-v3/include/std/version
>>index e4a8bed52ab..07d17433c5b 100644
>>--- a/libstdc++-v3/include/std/version
>>+++ b/libstdc++-v3/include/std/version
>>@@ -200,6 +200,9 @@
>> #if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
>> # define __cpp_lib_atomic_wait 201907L
>> #endif
>>+#if __cpp_lib_atomic_wait
>
> This needs to match the condition used in <barrier>.
>
>>+#define __cpp_lib_barrier 201907L
>>+#endif
>
> You could just put it inside the previous block where
> __cpp_lib_atomic_wait is defined:
>
> #if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
> # define __cpp_lib_atomic_wait 201907L
> # if __cpp_aligned_new
> #  define __cpp_lib_barrier 201907L
> # endif
> #endif
>
>> #define __cpp_lib_bind_front 201907L
>> #if __has_builtin(__builtin_bit_cast)
>> # define __cpp_lib_bit_cast 201806L
>>diff --git a/libstdc++-v3/testsuite/30_threads/barrier/1.cc 
>>b/libstdc++-v3/testsuite/30_threads/barrier/1.cc
>>new file mode 100644
>>index 00000000000..0b38160a58b
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/30_threads/barrier/1.cc
>>@@ -0,0 +1,27 @@
>>+// Copyright (C) 2020 Free Software Foundation, Inc.
>>+//
>>+// This file is part of the GNU ISO C++ Library.  This library is free
>>+// software; you can redistribute it and/or modify it under the
>>+// terms of the GNU General Public License as published by the
>>+// Free Software Foundation; either version 3, or (at your option)
>>+// any later version.
>>+
>>+// This library is distributed in the hope that it will be useful,
>>+// but WITHOUT ANY WARRANTY; without even the implied warranty of
>>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>+// GNU General Public License for more details.
>>+
>>+// You should have received a copy of the GNU General Public License along
>>+// with this library; see the file COPYING3.  If not see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do compile { target c++2a } }
>
> This test will fail for non-gthreads targets, because they don't
> define the macro. This needs the same condition as the similar
> 29_atomics/atomic/wait_notify/1.cc test:
>
> // { dg-require-effective-target gthreads }
>
> (which is the new way to say { dg-requires-gthread "" })
>
>>+#include <barrier>
>>+
>>+#ifndef __cpp_lib_barrier
>>+# error "Feature-test macro for barrier missing in <barrier>"
>>+#elif __cpp_lib_barrier != 201907L
>>+# error "Feature-test macro for barrier has wrong value in <barrier>"
>>+#endif
>>diff --git a/libstdc++-v3/testsuite/30_threads/barrier/2.cc 
>>b/libstdc++-v3/testsuite/30_threads/barrier/2.cc
>>new file mode 100644
>>index 00000000000..1d8d83639e0
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/30_threads/barrier/2.cc
>>@@ -0,0 +1,27 @@
>>+// Copyright (C) 2019-2020 Free Software Foundation, Inc.
>>+//
>>+// This file is part of the GNU ISO C++ Library.  This library is free
>>+// software; you can redistribute it and/or modify it under the
>>+// terms of the GNU General Public License as published by the
>>+// Free Software Foundation; either version 3, or (at your option)
>>+// any later version.
>>+
>>+// This library is distributed in the hope that it will be useful,
>>+// but WITHOUT ANY WARRANTY; without even the implied warranty of
>>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>+// GNU General Public License for more details.
>>+
>>+// You should have received a copy of the GNU General Public License along
>>+// with this library; see the file COPYING3.  If not see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do compile { target c++2a } }
>
> Same here.
>
>>+#include <version>
>>+
>>+#ifndef __cpp_lib_barrier
>>+# error "Feature-test macro for barrier missing in <version>"
>>+#elif __cpp_lib_barrier != 201907L
>>+# error "Feature-test macro for barrier has wrong value in <version>"
>>+#endif
>>diff --git a/libstdc++-v3/testsuite/30_threads/barrier/arrive.cc 
>>b/libstdc++-v3/testsuite/30_threads/barrier/arrive.cc
>>new file mode 100644
>>index 00000000000..df70587db5b
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/30_threads/barrier/arrive.cc
>>@@ -0,0 +1,48 @@
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do run { target c++2a } }
>>+// { dg-require-gthreads "" }
>>+// { dg-additional-options "-pthread" { target pthread } }
>>+
>>+// Copyright (C) 2020 Free Software Foundation, Inc.
>>+//
>>+// This file is part of the GNU ISO C++ Library.  This library is free
>>+// software; you can redistribute it and/or modify it under the
>>+// terms of the GNU General Public License as published by the
>>+// Free Software Foundation; either version 3, or (at your option)
>>+// any later version.
>>+
>>+// This library is distributed in the hope that it will be useful,
>>+// but WITHOUT ANY WARRANTY; without even the implied warranty of
>>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>+// GNU General Public License for more details.
>>+
>>+// You should have received a copy of the GNU General Public License along
>>+// with this library; see the file COPYING3.  If not see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+// This implementation is based on 
>>libcxx/test/std/thread/thread.barrier/arrive.pass.cpp
>
> Please replace "implementation" with "test" or something like that,
> since this isn't the implementation. Same for all the other tests
> taken from LLVM.
>
>>+//===----------------------------------------------------------------------===//
>>+//
>>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
>>Exceptions.
>>+// See https://llvm.org/LICENSE.txt for license information.
>>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>>+//
>>+//===----------------------------------------------------------------------===//
>>+
>>+#include <barrier>
>>+#include <thread>
>>+
>>+int main(int, char**)
>>+{
>>+  std::barrier<> b(2);
>>+
>>+  auto tok = b.arrive();
>>+  std::thread t([&](){
>>+    (void)b.arrive();
>>+  });
>>+  b.wait(std::move(tok));
>>+  t.join();
>>+
>>+  auto tok2 = b.arrive(2);
>>+  b.wait(std::move(tok2));
>>+}
>>diff --git a/libstdc++-v3/testsuite/30_threads/barrier/arrive_and_drop.cc 
>>b/libstdc++-v3/testsuite/30_threads/barrier/arrive_and_drop.cc
>>new file mode 100644
>>index 00000000000..746a8f470e3
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/30_threads/barrier/arrive_and_drop.cc
>>@@ -0,0 +1,46 @@
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do run { target c++2a } }
>>+// { dg-require-gthreads "" }
>>+// { dg-additional-options "-pthread" { target pthread } }
>>+
>>+// Copyright (C) 2020 Free Software Foundation, Inc.
>>+//
>>+// This file is part of the GNU ISO C++ Library.  This library is free
>>+// software; you can redistribute it and/or modify it under the
>>+// terms of the GNU General Public License as published by the
>>+// Free Software Foundation; either version 3, or (at your option)
>>+// any later version.
>>+
>>+// This library is distributed in the hope that it will be useful,
>>+// but WITHOUT ANY WARRANTY; without even the implied warranty of
>>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>+// GNU General Public License for more details.
>>+
>>+// You should have received a copy of the GNU General Public License along
>>+// with this library; see the file COPYING3.  If not see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+// This implementation is based on 
>>libcxx/test/std/thread/thread.barrier/arrive_and_drop.pass.cpp
>>+//===----------------------------------------------------------------------===//
>>+//
>>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
>>Exceptions.
>>+// See https://llvm.org/LICENSE.txt for license information.
>>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>>+//
>>+//===----------------------------------------------------------------------===//
>>+
>>+#include <barrier>
>>+#include <thread>
>>+
>>+int main(int, char**)
>>+{
>>+  std::barrier<> b(2);
>>+
>>+  std::thread t([&](){
>>+    b.arrive_and_drop();
>>+  });
>>+
>>+  b.arrive_and_wait();
>>+  b.arrive_and_wait();
>>+  t.join();
>>+}
>>diff --git a/libstdc++-v3/testsuite/30_threads/barrier/arrive_and_wait.cc 
>>b/libstdc++-v3/testsuite/30_threads/barrier/arrive_and_wait.cc
>>new file mode 100644
>>index 00000000000..509986f3b78
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/30_threads/barrier/arrive_and_wait.cc
>>@@ -0,0 +1,46 @@
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do run { target c++2a } }
>>+// { dg-require-gthreads "" }
>>+// { dg-additional-options "-pthread" { target pthread } }
>>+
>>+// Copyright (C) 2020 Free Software Foundation, Inc.
>>+//
>>+// This file is part of the GNU ISO C++ Library.  This library is free
>>+// software; you can redistribute it and/or modify it under the
>>+// terms of the GNU General Public License as published by the
>>+// Free Software Foundation; either version 3, or (at your option)
>>+// any later version.
>>+
>>+// This library is distributed in the hope that it will be useful,
>>+// but WITHOUT ANY WARRANTY; without even the implied warranty of
>>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>+// GNU General Public License for more details.
>>+
>>+// You should have received a copy of the GNU General Public License along
>>+// with this library; see the file COPYING3.  If not see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+// This implementation is based on 
>>libcxx/test/std/thread/thread.barrier/arrive_and_drop.pass.cpp
>
> Wrong filename?
>
>>+//===----------------------------------------------------------------------===//
>>+//
>>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
>>Exceptions.
>>+// See https://llvm.org/LICENSE.txt for license information.
>>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>>+//
>>+//===----------------------------------------------------------------------===//
>>+
>>+#include <barrier>
>>+#include <thread>
>>+
>>+int main(int, char**)
>>+{
>>+  std::barrier<> b(2);
>>+
>>+  std::thread t([&](){
>>+    for(int i = 0; i < 10; ++i)
>>+      b.arrive_and_wait();
>>+  });
>>+  for(int i = 0; i < 10; ++i)
>>+    b.arrive_and_wait();
>>+  t.join();
>>+}
>>diff --git a/libstdc++-v3/testsuite/30_threads/barrier/completion.cc 
>>b/libstdc++-v3/testsuite/30_threads/barrier/completion.cc
>>new file mode 100644
>>index 00000000000..c7997d9d7fb
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/30_threads/barrier/completion.cc
>>@@ -0,0 +1,53 @@
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do run { target c++2a } }
>>+// { dg-require-gthreads "" }
>>+// { dg-additional-options "-pthread" { target pthread } }
>>+
>>+// Copyright (C) 2020 Free Software Foundation, Inc.
>>+//
>>+// This file is part of the GNU ISO C++ Library.  This library is free
>>+// software; you can redistribute it and/or modify it under the
>>+// terms of the GNU General Public License as published by the
>>+// Free Software Foundation; either version 3, or (at your option)
>>+// any later version.
>>+
>>+// This library is distributed in the hope that it will be useful,
>>+// but WITHOUT ANY WARRANTY; without even the implied warranty of
>>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>+// GNU General Public License for more details.
>>+
>>+// You should have received a copy of the GNU General Public License along
>>+// with this library; see the file COPYING3.  If not see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+// This implementation is based on 
>>libcxx/test/std/thread/thread.barrier/completion.pass.cpp
>>+//===----------------------------------------------------------------------===//
>>+//
>>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
>>Exceptions.
>>+// See https://llvm.org/LICENSE.txt for license information.
>>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>>+//
>>+//===----------------------------------------------------------------------===//
>>+
>>+#include <barrier>
>>+#include <thread>
>>+
>>+#include <testsuite_hooks.h>
>>+
>>+int main(int, char**)
>>+{
>>+  int x = 0;
>>+  auto comp = [&] { x += 1; };
>>+  std::barrier<decltype(comp)> b(2, comp);
>>+
>>+  std::thread t([&](){
>>+      for(int i = 0; i < 10; ++i)
>>+     b.arrive_and_wait();
>>+  });
>>+
>>+  for(int i = 0; i < 10; ++i)
>>+    b.arrive_and_wait();
>>+
>>+  VERIFY( x == 10 );
>>+  t.join();
>>+}
>>diff --git a/libstdc++-v3/testsuite/30_threads/barrier/max.cc 
>>b/libstdc++-v3/testsuite/30_threads/barrier/max.cc
>>new file mode 100644
>>index 00000000000..278bc3fdd10
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/30_threads/barrier/max.cc
>>@@ -0,0 +1,40 @@
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do run { target c++2a } }
>
> This should be 'compile' not 'run'.
>
> I think I'd rather see these static_asserts put into one of the
> existing tests, so we don't pay for the overhead of another dejagnu
> test (with all its setup and target checking) just for this.
>
> Maybe in barrier/1.cc since that's not doing very much work either
> (and don't forget to move the dg-additional-options there too).
>
>>+// { dg-require-gthreads "" }
>>+// { dg-additional-options "-pthread" { target pthread } }
>>+
>>+// Copyright (C) 2020 Free Software Foundation, Inc.
>>+//
>>+// This file is part of the GNU ISO C++ Library.  This library is free
>>+// software; you can redistribute it and/or modify it under the
>>+// terms of the GNU General Public License as published by the
>>+// Free Software Foundation; either version 3, or (at your option)
>>+// any later version.
>>+
>>+// This library is distributed in the hope that it will be useful,
>>+// but WITHOUT ANY WARRANTY; without even the implied warranty of
>>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>+// GNU General Public License for more details.
>>+
>>+// You should have received a copy of the GNU General Public License along
>>+// with this library; see the file COPYING3.  If not see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+// This implementation is based on 
>>libcxx/test/std/thread/thread.barrier/max.pass.cpp
>>+//===----------------------------------------------------------------------===//
>>+//
>>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
>>Exceptions.
>>+// See https://llvm.org/LICENSE.txt for license information.
>>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>>+//
>>+//===----------------------------------------------------------------------===//
>>+
>>+#include <barrier>
>>+#include <thread>
>>+
>>+int main(int, char**)
>>+{
>>+  static_assert(std::barrier<>::max() > 0, "");
>>+  auto l = [](){};
>>+  static_assert(std::barrier<decltype(l)>::max() > 0, "");
>
> No need for the string literals here, this is C++20.
>
> OK with those changes, thanks.

Reply via email to