#include "threaded_internal.h"
void _cmsThrScheduler(struct _cmstransform_struct* CMMcargo,
const void* InputBuffer,
void* OutputBuffer,
cmsUInt32Number PixelsPerLine,
cmsUInt32Number LineCount,
const cmsStride* Stride)
{
cmsContext ContextID = cmsGetTransformContextID(CMMcargo);
_cmsTransform2Fn worker = _cmsGetTransformWorker(CMMcargo);
cmsInt32Number MaxWorkers = _cmsGetTransformMaxWorkers(CMMcargo);
_cmsWorkSlice master;
_cmsWorkSlice* slices;
cmsStride FixedStride = *Stride;
cmsHANDLE* handles;
cmsUInt32Number nSlices = _cmsThrCountSlices(CMMcargo, MaxWorkers, PixelsPerLine, LineCount, &FixedStride);
if (nSlices <= 1) {
worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride);
return;
}
master.CMMcargo = CMMcargo;
master.InputBuffer = InputBuffer;
master.OutputBuffer = OutputBuffer;
master.PixelsPerLine = PixelsPerLine;
master.LineCount = LineCount;
master.Stride = &FixedStride;
slices = (_cmsWorkSlice*)_cmsCalloc(ContextID, nSlices, sizeof(_cmsWorkSlice));
handles = (cmsHANDLE*) _cmsCalloc(ContextID, nSlices, sizeof(cmsHANDLE));
if (slices == NULL || handles == NULL)
{
if (slices) _cmsFree(ContextID, slices);
if (handles) _cmsFree(ContextID, handles);
worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride);
return;
}
if (_cmsThrSplitWork(&master, nSlices, slices))
{
cmsUInt32Number i;
for (i = 1; i < nSlices; i++)
{
handles[i] = _cmsThrCreateWorker(ContextID, worker, &slices[i]);
}
worker(CMMcargo, slices[0].InputBuffer, slices[0].OutputBuffer,
slices[0].PixelsPerLine, slices[0].LineCount, slices[0].Stride);
for (i = 1; i < nSlices; i++)
{
_cmsThrJoinWorker(ContextID, handles[i]);
}
}
else
{
worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride);
}
_cmsFree(ContextID, slices);
_cmsFree(ContextID, handles);
}