July 2007
Intermediate to advanced
332 pages
10h 4m
English
This style is useful when the continuation needs to inherit much of the parent’s state and the child does not need the state. The continuation must have the same type as the parent. Example 9-5 illustrates the model.
Example 9-5. Recycling parent as continuation
task* T::execute() {
if( not recursing any further ) {
...
return NULL;
} else {
set_ref_count(k);
recycle_as_continuation();task& tk = new( allocate_child() ) T(...); tk.spawn();
task& tk-1 = new( allocate_child() ) T(...); tk-1.spawn();
...
task& t1 = new( c.allocate_child() ) T(...); t1.spawn();
return &t1;
}
}Here are the key points of the pattern:
The call to set_ref_count uses k as its argument. There is no extra 1, as there is in blocking style.
Each child task is allocated by allocate_child.
The continuation is recycled from the parent, and hence gets the parent’s state without doing copy operations.