$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: [boost] [context] review
From: Gordon Woodhull (gordon_at_[hidden])
Date: 2011-03-27 08:48:18
Hi Oliver, Vicente, all,
Here is my uneducated review of the Context library.
I would like to see the library Accepted. However, I do not have the expertise to pore over assembly instructions, nor do I know whether this is the right approach.
I would probably be just as happy with a slower safe cross-platform library built on OS support, as with the fast (dangerous?) assembly version.
I hope that people who know better, like Giovanni and Holger, will continue to help make the library more robust.
> - What is your evaluation of the design?
From a user's perspective, it seems fairly clear how to use the library.
I thought I had understood from discussion that the class is moveable, but this didn't work for me. I ended up having to wrap contexts up in shared_ptrs in order to get my example to work (attached).
I am confident that higher-level libraries will take away the ugliness that arises from both coroutines in my example having to have access to the context for the other routine.
I admire the way Oliver split and then split his library again, to make this a very manageable library for review.
> - What is your evaluation of the implementation?
I only glanced at it.
> - What is your evaluation of the documentation?
The documentation is quite spare and completely lacks examples. It needs copy-editing (I can help there).
It also seems to be out of date. For example, it states: "To get the current user-level context boost::context::current() has to be called" but I couldn't find this function at all; it seems to have been replaced with the default-constructed context<>?
> - What is your evaluation of the potential usefulness of the library?
It would be great to have teleportation (or is it time travel? ;-) in C++. I expect this will unlock many interesting paradigms in addition to coroutines & generators.
I ran into a problem recently that I thought would be nicely solved if only I had coroutines. A parallelization framework had a callback when it needed more tasks to send out, and the routine that produced tasks was a hairy loop-of-loops. Neither could have its control inverted without making a big mess.
I've attached an extreme simplification of the problem (without the callback part that made it impossible to invert control).
> - Did you try to use the library? With what compiler? Did you have any
> problems?
Yes. I used Ubuntu 9.10 (in a VM), gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8).
Since I used the review version from the vault and didn't do anything special, I think this means I used the ucontext version (how do I try fcontext? docs don't seem to explain how to choose.)
I had one problem which turned out to be a misunderstanding: I tried to construct a context with a next-context and then call it multiple times, but this crashed. In retrospect this isn't any better than a regular function call! and doesn't make much sense. But it would be good for the documentation to make it clear that a context is dead if the function returns.
> - How much effort did you put into your evaluation? A glance? A quick
> reading? In-depth study?
I spent a couple of hours reading docs and discussion, a few hours getting my example running, and an hour or two on writing this review.
> - Are you knowledgeable about the problem domain?
Color me interested but no expert.
Cheers,
Gordon