in daemon/src/daemon.cpp [114:169]
std::pair<int, void*> create_pthread( void* ( *func )(void*), const char* pthread_arg,
ssize_t stack_size )
{
pthread_attr_t attr;
int status;
const int num_threads = 1;
if ( func == nullptr || pthread_arg == nullptr )
{
return std::make_pair( EXIT_FAILURE, nullptr );
}
/* Initialize thread creation attributes. */
status = pthread_attr_init( &attr );
if ( status != 0 )
{
handle_error_en( status, "pthread_attr_init" );
return std::make_pair( EXIT_FAILURE, nullptr );
}
if ( stack_size > 0 )
{
status = pthread_attr_setstacksize( &attr, stack_size );
if ( status != 0 )
{
handle_error_en( status, "pthread_attr_setstacksize" );
return std::make_pair( EXIT_FAILURE, nullptr );
}
}
/* Allocate memory for pthread_create() arguments. */
struct thread_info* tinfo = (thread_info*)calloc( num_threads, sizeof( *tinfo ) );
if ( tinfo == NULL )
{
handle_error( "calloc" );
return std::make_pair( EXIT_FAILURE, nullptr );
}
tinfo->argv_string = (char*)pthread_arg;
status = pthread_create( &tinfo->thread_id, &attr, func, tinfo );
if ( status != 0 )
{
handle_error_en( status, "pthread_create" );
return std::make_pair( EXIT_FAILURE, nullptr );
}
/* Destroy the thread attributes object, since it is no longer needed. */
status = pthread_attr_destroy( &attr );
if ( status != 0 )
{
handle_error_en( status, "pthread_attr_destroy" );
return std::make_pair( EXIT_FAILURE, nullptr );
}
return std::make_pair( EXIT_SUCCESS, tinfo );
}