in win32/src/threadpool_win32.c [261:317]
int threadpool_schedule_work(THANDLE(THREADPOOL) threadpool, THREADPOOL_WORK_FUNCTION work_function, void* work_function_context)
{
int result;
/* Codes_SRS_THREADPOOL_WIN32_01_022: [ work_function_context shall be allowed to be NULL. ]*/
if (
/* Codes_SRS_THREADPOOL_WIN32_01_020: [ If threadpool is NULL, threadpool_schedule_work shall fail and return a non-zero value. ]*/
(threadpool == NULL) ||
/* Codes_SRS_THREADPOOL_WIN32_01_021: [ If work_function is NULL, threadpool_schedule_work shall fail and return a non-zero value. ]*/
(work_function == NULL)
)
{
LogError("Invalid arguments: THANDLE(THREADPOOL) threadpool=%p, THREADPOOL_WORK_FUNCTION work_function=%p, void* work_function_context=%p",
threadpool, work_function, work_function_context);
result = MU_FAILURE;
}
else
{
THREADPOOL* threadpool_ptr = THANDLE_GET_T(THREADPOOL)(threadpool);
/* Codes_SRS_THREADPOOL_WIN32_01_023: [ Otherwise threadpool_schedule_work shall allocate a context where work_function and context shall be saved. ]*/
WORK_ITEM_CONTEXT* work_item_context = malloc(sizeof(WORK_ITEM_CONTEXT));
if (work_item_context == NULL)
{
/* Codes_SRS_THREADPOOL_WIN32_01_024: [ If any error occurs, threadpool_schedule_work shall fail and return a non-zero value. ]*/
LogError("malloc failed");
result = MU_FAILURE;
}
else
{
work_item_context->work_function = work_function;
work_item_context->work_function_context = work_function_context;
/* Codes_SRS_THREADPOOL_WIN32_01_034: [ threadpool_schedule_work shall call CreateThreadpoolWork to schedule execution the callback while passing to it the on_work_callback function and the newly created context. ]*/
PTP_WORK ptp_work = CreateThreadpoolWork(on_work_callback, work_item_context, &threadpool_ptr->tp_environment);
if (ptp_work == NULL)
{
/* Codes_SRS_THREADPOOL_WIN32_01_024: [ If any error occurs, threadpool_schedule_work shall fail and return a non-zero value. ]*/
LogError("CreateThreadpoolWork failed");
result = MU_FAILURE;
}
else
{
/* Codes_SRS_THREADPOOL_WIN32_01_041: [ threadpool_schedule_work shall call SubmitThreadpoolWork to submit the work item for execution. ]*/
SubmitThreadpoolWork(ptp_work);
result = 0;
goto all_ok;
}
free(work_item_context);
}
}
all_ok:
return result;
}