/* This file is part of GEGL.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with GEGL; if not, see .
*
* Copyright 2018 Ell
*/
#ifndef __GEGL_PARALLEL_H__
#define __GEGL_PARALLEL_H__
G_BEGIN_DECLS
/**
* GeglParallelDistributeFunc:
* @i: the current thread index, in the range [0,@n)
* @n: the number of threads execution is distributed across
* @user_data: user data pointer
*
* Specifies the type of function passed to gegl_parallel_distribute().
*
* The function should process the @i-th part of the data, out of @n
* equal parts. @n may be less-than or equal-to the @max_n argument
* passed to gegl_parallel_distribute().
*/
typedef void (* GeglParallelDistributeFunc) (gint i,
gint n,
gpointer user_data);
/**
* GeglParallelDistributeRangeFunc:
* @offset: the current data offset
* @size: the current data size
* @user_data: user data pointer
*
* Specifies the type of function passed to
* gegl_parallel_distribute_range().
*
* The function should process @size elements of the data, starting
* at @offset.
*/
typedef void (* GeglParallelDistributeRangeFunc) (gsize offset,
gsize size,
gpointer user_data);
/**
* GeglParallelDistributeAreaFunc:
* @area: the current sub-area
* @user_data: user data pointer
*
* Specifies the type of function passed to
* gegl_parallel_distribute_area().
*
* The function should process the sub-area specified by @area.
*
*/
typedef void (* GeglParallelDistributeAreaFunc) (const GeglRectangle *area,
gpointer user_data);
/**
* gegl_parallel_distribute:
* @max_n: the maximal number of threads to use
* @func: (closure user_data) (scope call): the function to call
* @user_data: user data to pass to the function
*
* Distributes the execution of a function across multiple threads,
* by calling it with a different index on each thread.
*/
void gegl_parallel_distribute (gint max_n,
GeglParallelDistributeFunc func,
gpointer user_data);
/**
* gegl_parallel_distribute_range:
* @size: the total size of the data
* @thread_cost: the cost of using each additional thread, relative
* to the cost of processing a single data element
* @func: (closure user_data) (scope call): the function to call
* @user_data: user data to pass to the function
*
* Distributes the processing of a linear data-structure across
* multiple threads, by calling the given function with different
* sub-ranges on different threads.
*/
void gegl_parallel_distribute_range (gsize size,
gdouble thread_cost,
GeglParallelDistributeRangeFunc func,
gpointer user_data);
/**
* gegl_parallel_distribute_area:
* @area: the area to process
* @thread_cost: the cost of using each additional thread, relative
* to the cost of processing a single data element
* @split_strategy: the strategy to use for dividing the area
* @func: (closure user_data) (scope call): the function to call
* @user_data: user data to pass to the function
*
* Distributes the processing of a planar data-structure across
* multiple threads, by calling the given function with different
* sub-areas on different threads.
*/
void gegl_parallel_distribute_area (const GeglRectangle *area,
gdouble thread_cost,
GeglSplitStrategy split_strategy,
GeglParallelDistributeAreaFunc func,
gpointer user_data);
#ifdef __cplusplus
#if __cplusplus >= 201103
extern "C++"
{
template
inline void
gegl_parallel_distribute (gint max_n,
ParallelDistributeFunc func)
{
gegl_parallel_distribute (max_n,
[] (gint i,
gint n,
gpointer user_data)
{
ParallelDistributeFunc func_copy (
*(const ParallelDistributeFunc *) user_data);
func_copy (i, n);
},
&func);
}
template
inline void
gegl_parallel_distribute_range (gsize size,
gdouble thread_cost,
ParallelDistributeRangeFunc func)
{
gegl_parallel_distribute_range (size, thread_cost,
[] (gsize offset,
gsize size,
gpointer user_data)
{
ParallelDistributeRangeFunc func_copy (
*(const ParallelDistributeRangeFunc *) user_data);
func_copy (offset, size);
},
&func);
}
template
inline void
gegl_parallel_distribute_area (const GeglRectangle *area,
gdouble thread_cost,
GeglSplitStrategy split_strategy,
ParallelDistributeAreaFunc func)
{
gegl_parallel_distribute_area (area, thread_cost, split_strategy,
[] (const GeglRectangle *area,
gpointer user_data)
{
ParallelDistributeAreaFunc func_copy (
*(const ParallelDistributeAreaFunc *) user_data);
func_copy (area);
},
&func);
}
template
inline void
gegl_parallel_distribute_area (const GeglRectangle *area,
gdouble thread_cost,
ParallelDistributeAreaFunc func)
{
gegl_parallel_distribute_area (area, thread_cost, GEGL_SPLIT_STRATEGY_AUTO,
func);
}
}
#endif /* __cplusplus >= 201103 */
#endif
G_END_DECLS
#endif /* __GEGL_PARALLEL_H__ */