/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#include "mpl.h"
MPL_SUPPRESS_OSX_HAS_NO_SYMBOLS_WARNING;
/* This file currently implements these as a preprocessor if/elif/else sequence.
* This has the upside of not doing #includes for .c files or (poorly
* named) .i files. It has the downside of making this file large-ish
* and a little harder to read in some cases. If this becomes
* unmanagable at some point these should be separated back out into
* header files and included as needed. [goodell@ 2009-06-24] */
/* Implementation specific function definitions (usually in the form of macros) */
#if MPL_THREAD_PACKAGE_NAME == MPL_THREAD_PACKAGE_SOLARIS
/*
* struct MPLI_thread_info
*
* Structure used to pass the user function and data to the intermediate function, MPLI_thread_start. See comment in
* MPLI_thread_start() header for more information.
*/
struct MPLI_thread_info {
MPL_thread_func_t func;
void *data;
};
void *MPLI_thread_start(void *arg);
/*
* MPL_thread_create()
*/
void MPL_thread_create(MPL_thread_func_t func, void *data, MPL_thread_id_t * idp, int *errp)
{
struct MPLI_thread_info *thread_info;
int err = MPL_THREAD_SUCCESS;
/* FIXME: faster allocation, or avoid it all together? */
thread_info =
(struct MPLI_thread_info *) MPL_malloc(sizeof(struct MPLI_thread_info), MPL_MEM_THREAD);
if (thread_info != NULL) {
thread_info->func = func;
thread_info->data = data;
err = thr_create(NULL, 0, MPLI_thread_start, thread_info, THR_DETACHED, idp);
/* FIXME: convert error to an MPL_THREAD_ERR value */
} else {
err = 1000000000;
}
if (errp != NULL) {
*errp = err;
}
}
/*
* MPLI_thread_start()
*
* Start functions in Solaris threads are expected to return a void pointer. Since our start functions do not return a value we
* must use an intermediate function to perform call to the user's start function and then return a value of NULL.
*/
void *MPLI_thread_start(void *arg)
{
struct MPLI_thread_info *thread_info = (struct MPLI_thread_info *) arg;
MPL_thread_func_t func = thread_info->func;
void *data = thread_info->data;
MPL_free(arg);
func(data);
return NULL;
}
#endif