@@ -23,16 +23,17 @@ #ifdef OF_HAIKU # include #endif -#import "thread.h" +#import "OFPlainThread.h" + #import "macros.h" static int minPrio = 0, maxPrio = 0, normalPrio = 0; -struct thread_ctx { +struct ThreadContext { void (*function)(id object); id object; const char *name; }; @@ -70,14 +71,14 @@ } static void * functionWrapper(void *data) { - struct thread_ctx *ctx = data; + struct ThreadContext *ctx = data; if (ctx->name != NULL) - of_thread_set_name(ctx->name); + OFSetThreadName(ctx->name); pthread_cleanup_push(free, data); ctx->function(ctx->object); @@ -84,11 +85,11 @@ pthread_cleanup_pop(1); return NULL; } int -of_thread_attr_init(of_thread_attr_t *attr) +OFPlainThreadAttributesInit(OFPlainThreadAttributes *attr) { int error; pthread_attr_t POSIXAttr; attr->priority = 0; @@ -107,12 +108,12 @@ return error; } int -of_thread_new(of_thread_t *thread, const char *name, void (*function)(id), - id object, const of_thread_attr_t *attr) +OFPlainThreadNew(OFPlainThread *thread, const char *name, void (*function)(id), + id object, const OFPlainThreadAttributes *attr) { int error = 0; pthread_attr_t POSIXAttr; bool POSIXAttrAvailable = true; @@ -122,23 +123,30 @@ else return error; } @try { - struct thread_ctx *ctx; + struct ThreadContext *ctx; if (attr != NULL && POSIXAttrAvailable) { +#ifndef OF_HPUX struct sched_param param; +#endif if (attr->priority < -1 || attr->priority > 1) return EINVAL; -#ifdef HAVE_PTHREAD_ATTR_SETINHERITSCHED +#ifndef OF_HPUX +# ifdef HAVE_PTHREAD_ATTR_SETINHERITSCHED if ((error = pthread_attr_setinheritsched(&POSIXAttr, PTHREAD_EXPLICIT_SCHED)) != 0) return error; -#endif +# endif + + if ((error = pthread_attr_getschedparam(&POSIXAttr, + ¶m)) != 0) + return error; if (attr->priority < 0) { param.sched_priority = minPrio + (1.0f + attr->priority) * (normalPrio - minPrio); @@ -147,10 +155,11 @@ attr->priority * (maxPrio - normalPrio); if ((error = pthread_attr_setschedparam(&POSIXAttr, ¶m)) != 0) return error; +#endif if (attr->stackSize > 0) { if ((error = pthread_attr_setstacksize( &POSIXAttr, attr->stackSize)) != 0) return error; @@ -162,11 +171,12 @@ ctx->function = function; ctx->object = object; ctx->name = name; - error = pthread_create(thread, &POSIXAttr, functionWrapper, + error = pthread_create(thread, + (POSIXAttrAvailable ? &POSIXAttr : NULL), functionWrapper, ctx); } @finally { if (POSIXAttrAvailable) pthread_attr_destroy(&POSIXAttr); } @@ -173,25 +183,25 @@ return error; } int -of_thread_join(of_thread_t thread) +OFPlainThreadJoin(OFPlainThread thread) { void *ret; return pthread_join(thread, &ret); } int -of_thread_detach(of_thread_t thread) +OFPlainThreadDetach(OFPlainThread thread) { return pthread_detach(thread); } void -of_thread_set_name(const char *name) +OFSetThreadName(const char *name) { #if defined(OF_HAIKU) rename_thread(find_thread(NULL), name); #elif defined(HAVE_PTHREAD_SET_NAME_NP) pthread_set_name_np(pthread_self(), name);