#include <deal.II/base/template_constraints.h>
#include <deal.II/base/std_cxx1x/function.h>
#include <deal.II/base/std_cxx1x/bind.h>
+#include <deal.II/base/thread_local_storage.h>
#ifdef DEAL_II_WITH_THREADS
# include <deal.II/base/thread_management.h>
*/
typedef
std_cxx1x::tuple<std::vector<Iterator>,
- ScratchData *,
- std::vector<CopyData>,
+ Threads::ThreadLocalStorage<ScratchData>*,
+ std::vector<CopyData>,
unsigned int>
ItemType;
tbb::filter (/*is_serial=*/true),
remaining_iterator_range (begin, end),
ring_buffer (buffer_size),
+ thread_local_scratch(sample_scratch_data),
n_emitted_items (0),
chunk_size (chunk_size)
{
tasks += Threads::new_task (&IteratorRangeToItemStream::init_buffer_elements,
*this,
i,
- std_cxx1x::cref(sample_scratch_data),
std_cxx1x::cref(sample_copy_data));
tasks.join_all ();
}
- /**
- * Destructor.
- */
- ~IteratorRangeToItemStream ()
- {
- for (unsigned int i=0; i<ring_buffer.size(); ++i)
- delete std_cxx1x::get<1>(ring_buffer[i]);
- }
-
/**
* Create a item and return a
* pointer to it.
std::vector<ItemType> ring_buffer;
/**
+ * Scratch data object. Each thread will
+ * have its own local copy.
+ */
+ Threads::ThreadLocalStorage<ScratchData> thread_local_scratch;
+
+ /**
* Counter for the number of emitted
* items. Each item may consist of up
* to chunk_size iterator elements.
* the ring buffer.
*/
void init_buffer_elements (const unsigned int element,
- const ScratchData &sample_scratch_data,
const CopyData &sample_copy_data)
{
Assert (std_cxx1x::get<1>(ring_buffer[element]) == 0,
std_cxx1x::get<0>(ring_buffer[element])
.resize (chunk_size, remaining_iterator_range.second);
std_cxx1x::get<1>(ring_buffer[element])
- = new ScratchData(sample_scratch_data);
+ = &thread_local_scratch;
std_cxx1x::get<2>(ring_buffer[element])
.resize (chunk_size, sample_copy_data);
}
try
{
worker (std_cxx1x::get<0>(*current_item)[i],
- *std_cxx1x::get<1>(*current_item),
+ std_cxx1x::get<1>(*current_item)->get(),
std_cxx1x::get<2>(*current_item)[i]);
}
catch (const std::exception &exc)