[c++0x] <future>

Jonathan Wakely jwakely.gcc@gmail.com
Thu May 14 21:35:00 GMT 2009


Here is an implementation of <future>

This is as near as possible to the current working paper, n2857:
concepts, constexpr, new allocator support and explicit conversion
operators are missing.
There are some preprocessor conditions around missing features and g++
bugs, I'll remove them from the final version, this is really just to
let people try it out or comment, as I might be unable to work on it
again until next week.

The implementation is a pretty simple one using a mutex and condition
variable (smarter versions using atomics to eliminate some locking are
possible.) Most of the code that doesn't depend on the type of
future/promise is in _Future_state_base for the shared state, or in
_Future_impl for the per-instance state.  That was done to reduce the
amount of code instantiated for every template specialisation.

As I've implemented it, you'll get a segfault if you use almost any
member function on a future/promise after a std::move.  That's
intentional: the only requirement is that they can be safely
destroyed, so I didn't add any checks for empty shared_ptr.  I'm
thinking of adding some checking for debug mode (IMHO we should be
adding debug mode support to all new components where possible.)

The tests in this patch are a bit of a hodge-podge, some use
test01/test02 functions called by main, some have the test code
directly in main()... please let me know if I need to rework them.

I've also got some python pretty printers ready for futures and
promises, which I'll be able to add once Tom T. and Phil M. commit the
python stuff from project Archer (hint hint! ;-) so gdb will give you
useful info about the state such as "promise<int> (exception ready, 3
associated futures)" or "promise<Foo&> (not ready, no associated
futures)"

All comments very welcome,

Jonathan


        * include/std/future: New.
        * src/future.cc: New.
        * include/Makefile.am: Add.
        * include/Makefile.in: Regenerate.
        * src/Makefile.am: Add.
        * src/Makefile.in: Regenerate.
        * testsuite/30_threads/packaged_task/cons/assign_neg.cc: New.
        * testsuite/30_threads/packaged_task/cons/1.cc: New.
        * testsuite/30_threads/packaged_task/cons/2.cc: New.
        * testsuite/30_threads/packaged_task/cons/copy_neg.cc: New.
        * testsuite/30_threads/packaged_task/cons/move.cc: New.
        * testsuite/30_threads/packaged_task/cons/move_assign.cc: New.
        * testsuite/30_threads/packaged_task/requirements/
        explicit_instantiation.cc: New.
        * testsuite/30_threads/packaged_task/members/invoke.cc: New.
        * testsuite/30_threads/packaged_task/members/get_future2.cc: New.
        * testsuite/30_threads/packaged_task/members/invoke2.cc: New.
        * testsuite/30_threads/packaged_task/members/boolconv.cc: New.
        * testsuite/30_threads/packaged_task/members/reset.cc: New.
        * testsuite/30_threads/packaged_task/members/reset2.cc: New.
        * testsuite/30_threads/packaged_task/members/get_future.cc: New.
        * testsuite/30_threads/packaged_task/members/swap.cc: New.
        * testsuite/30_threads/promise/cons/assign_neg.cc: New.
        * testsuite/30_threads/promise/cons/1.cc: New.
        * testsuite/30_threads/promise/cons/copy_neg.cc: New.
        * testsuite/30_threads/promise/cons/move.cc: New.
        * testsuite/30_threads/promise/cons/move_assign.cc: New.
        * testsuite/30_threads/promise/requirements/
        explicit_instantiation.cc: New.
        * testsuite/30_threads/promise/members/get_future2.cc: New.
        * testsuite/30_threads/promise/members/set_value.cc: New.
        * testsuite/30_threads/promise/members/get_future.cc: New.
        * testsuite/30_threads/promise/members/set_exception.cc: New.
        * testsuite/30_threads/promise/members/swap.cc: New.
        * testsuite/30_threads/unique_future/cons/assign_neg.cc: New.
        * testsuite/30_threads/unique_future/cons/default_neg.cc: New.
        * testsuite/30_threads/unique_future/cons/copy_neg.cc: New.
        * testsuite/30_threads/unique_future/cons/move.cc: New.
        * testsuite/30_threads/unique_future/requirements/
        explicit_instantiation.cc: New.
        * testsuite/30_threads/unique_future/members/get.cc: New.
        * testsuite/30_threads/unique_future/members/is_ready.cc: New.
        * testsuite/30_threads/unique_future/members/wait_until.cc: New.
        * testsuite/30_threads/unique_future/members/get2.cc: New.
        * testsuite/30_threads/unique_future/members/wait.cc: New.
        * testsuite/30_threads/unique_future/members/has_value.cc: New.
        * testsuite/30_threads/unique_future/members/has_exception.cc: New.
        * testsuite/30_threads/unique_future/members/wait_for.cc: New.
        * testsuite/30_threads/shared_future/cons/assign_neg.cc: New.
        * testsuite/30_threads/shared_future/cons/default_neg.cc: New.
        * testsuite/30_threads/shared_future/cons/move.cc: New.
        * testsuite/30_threads/shared_future/cons/copy.cc: New.
        * testsuite/30_threads/shared_future/requirements/
        explicit_instantiation.cc: New.
        * testsuite/30_threads/shared_future/members/get.cc: New.
        * testsuite/30_threads/shared_future/members/is_ready.cc: New.
        * testsuite/30_threads/shared_future/members/wait_until.cc: New.
        * testsuite/30_threads/shared_future/members/get2.cc: New.
        * testsuite/30_threads/shared_future/members/wait.cc: New.
        * testsuite/30_threads/shared_future/members/has_value.cc: New.
        * testsuite/30_threads/shared_future/members/has_exception.cc: New.
        * testsuite/30_threads/shared_future/members/wait_for.cc: New.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: future.patch
Type: text/x-patch
Size: 129476 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20090514/9be10f2c/attachment.bin>


More information about the Libstdc++ mailing list