std::shared_ptr<__future_base::_State_base> __state;
if ((__policy & launch::async) == launch::async)
{
- __state = __future_base::_S_make_async_state(std::__bind_simple(
- std::forward<_Fn>(__fn), std::forward<_Args>(__args)...));
+ __try
+ {
+ __state = __future_base::_S_make_async_state(std::__bind_simple(
+ std::forward<_Fn>(__fn), std::forward<_Args>(__args)...));
+ }
+#if __cpp_exceptions
+ catch(const system_error& __e)
+ {
+ if (__e.code() != errc::resource_unavailable_try_again
+ || (__policy & launch::deferred) != launch::deferred)
+ throw;
+ }
+#endif
}
- else
+ if (!__state)
{
__state = __future_base::_S_make_deferred_state(std::__bind_simple(
std::forward<_Fn>(__fn), std::forward<_Args>(__args)...));
--- /dev/null
+// { dg-do run { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-rtems* *-*-darwin* powerpc-ibm-aix* } }
+// { dg-options " -std=gnu++11 -pthread" { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* powerpc-ibm-aix* } }
+// { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
+// { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
+// { dg-require-cstdint "" }
+// { dg-require-gthreads "" }
+// { dg-require-atomic-builtins "" }
+
+// Copyright (C) 2010-2015 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/>.
+
+
+#include <future>
+#include <testsuite_hooks.h>
+
+struct Chucky
+{
+ Chucky() : copied(false) { }
+
+ Chucky(const Chucky& other) : copied(true)
+ {
+ if (other.copied)
+ return;
+ other.copied = true;
+ using namespace std;
+ // Throw on first DECAY_COPY to simulate inability to start a new thread.
+ throw system_error(make_error_code(errc::resource_unavailable_try_again));
+ }
+
+ void operator()() const { }
+
+ mutable bool copied;
+};
+
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ using namespace std;
+
+ future<void> f = async(Chucky{});
+ VERIFY( f.wait_for(chrono::seconds(100)) == future_status::deferred );
+
+ bool caught = false;
+ try {
+ f = async(launch::async, Chucky{});
+ } catch (const system_error&) {
+ caught = true;
+ }
+ VERIFY( caught );
+}
+
+int main()
+{
+ test01();
+}