📄 pthread.inl
字号:
/* pthread.inl,v 1.6 2001/10/04 16:07:15 joeh Exp -*- C -*-
* =============================================================================
*
* = LIBRARY
* pace
*
* = FILENAME
* pace/vxworks/pthread.inl
*
* = AUTHOR
* Joe Hoffert. The *VAST* majority of the pthread code for VxWorks
* has been supplied by Hughes Network Systems via Braeton Taylor.
*
*
* ============================================================================= */
#include "pace/unistd.h"
#include "pace/stdio.h"
/*
* PACE - POSIX Functions
*/
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_atfork (
# if defined (PACE_HAS_CPLUSPLUS)
pace_atfork_pf prepare,
pace_atfork_pf parent,
pace_atfork_pf child
# else /* ! PACE_HAS_CPLUSPLUS */
void (*prepare) (),
void (*parent) (),
void (*child) ()
# endif /* PACE_HAS_CPLUSPLUS */
)
{
PACE_TRACE("pace_pthread_atfork");
/*
* In VxWorks, there is only one process.
*/
PACE_ERRNO_NO_SUPPORT_RETURN (-1);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_destroy (pace_pthread_attr_t * attr)
{
PACE_TRACE("pace_pthread_attr_destroy");
/*
* Free memory allocated to the attributes object.
*/
if ((*attr) == 0)
return ERROR;
free ((char *) *attr);
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_getdetachstate (const pace_pthread_attr_t * attr,
int * detachstate)
{
PACE_TRACE("pace_pthread_attr_getdetachstate");
*detachstate = (*attr)->dstate;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_getinheritsched (const pace_pthread_attr_t * attr,
int * inheritsched)
{
PACE_TRACE("pace_pthread_attr_getinheritsched");
/*
* Get the priority inheritence of the thread attribute structure.
* Only PTHREAD_EXPLICIT_SCHED is returned.
*/
*inheritsched = PTHREAD_EXPLICIT_SCHED;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_getschedparam (const pace_pthread_attr_t * attr,
pace_sched_param * param)
{
PACE_TRACE("pace_pthread_attr_getschedparam");
param->sched_priority = (*attr)->schedule.sched_priority;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_getschedpolicy (const pace_pthread_attr_t * attr,
int * policy)
{
PACE_TRACE("pace_pthread_attr_getschedpolicy");
/*
* VxWorks only supports SCHED_FIFO.
*/
*policy = SCHED_FIFO;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_getscope (const pace_pthread_attr_t * attr,
int * contentionscope)
{
PACE_TRACE("pace_pthread_attr_getscope");
/*
* Since all VxWorks tasks are system wide scope,
* no support for the scope except for PTHREAD_SCOPE_SYSTEM
*/
*contentionscope = PTHREAD_SCOPE_SYSTEM;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_getstackaddr (const pace_pthread_attr_t * attr,
void ** stackaddr)
{
PACE_TRACE("pace_pthread_attr_getstackaddr");
/*
* VxWorks has no support for stack address getting
*/
return ERROR;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_getstacksize (const pace_pthread_attr_t * attr,
size_t * stacksize)
{
PACE_TRACE("pace_pthread_attr_getstacksize");
if (*attr == 0)
return ERROR;
*stacksize = (*attr)->stacksize;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_init (pace_pthread_attr_t * attr)
{
PACE_TRACE("pace_pthread_attr_init");
return pthread_attr_init(attr);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_setdetachstate (pace_pthread_attr_t * attr,
int detachstate)
{
PACE_TRACE("pace_pthread_attr_setdetachstate");
return pthread_attr_setdetachstate (attr, detachstate);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_setinheritsched (pace_pthread_attr_t * attr,
int inheritsched)
{
PACE_TRACE("pace_pthread_attr_setinheritsched");
/*
* For VxWorks, no inheritance of priority between the spawning task
* and the spawned task. Only PTHREAD_EXPLICIT_SCHED is supported.
*/
if (inheritsched == PTHREAD_EXPLICIT_SCHED)
{
return OK;
}
return ERROR;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_setschedparam (pace_pthread_attr_t * attr,
const pace_sched_param * param)
{
PACE_TRACE("pace_pthread_attr_setschedparam");
return pthread_attr_setschedparam (attr, param);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_setschedpolicy (pace_pthread_attr_t * attr,
int policy)
{
PACE_TRACE("pace_pthread_attr_setschedpolicy");
/*
* In VxWorks, the schedule policy is set in system scope,
* the whole system is running with one single scheduler, and
* is always pre-emptive priority based. The system wide
* scheduler can only be changed by kernelTimeSlice()
*
* To maintain the RTOS characteristics, only SCHED_FIFO is
* supported.
*/
if (policy != SCHED_FIFO)
return ERROR;
else
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_setscope (pace_pthread_attr_t * attr,
int contentionscope)
{
PACE_TRACE("pace_pthread_attr_setscope");
/*
* Since all VxWorks tasks are system wide scope,
* no support for the scope except for PTHREAD_SCOPE_SYSTEM
*/
if (contentionscope != PTHREAD_SCOPE_SYSTEM)
return ERROR;
else
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_setstackaddr (pace_pthread_attr_t * attr,
void * stackaddr)
{
PACE_TRACE("pace_pthread_attr_setstackaddr");
/*
* VxWorks does not support stack address setting.
*/
return ERROR;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_attr_setstacksize (pace_pthread_attr_t * attr,
size_t stacksize)
{
PACE_TRACE("pace_pthread_attr_setstacksize");
/*
* Default size will be assigned if the stacksize is 0
*/
if (*attr == 0) return ERROR;
if (stacksize != 0)
(*attr)->stacksize = stacksize;
else
(*attr)->stacksize = PTHREAD_DEFAULT_STACK_SIZE;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_cancel (pace_pthread_t thread)
{
PACE_TRACE("pace_pthread_cancel");
return pthread_cancel (thread);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_cond_broadcast (pace_pthread_cond_t * cond)
{
PACE_TRACE("pace_pthread_cond_broadcast");
/*
* This call unblocks all the threads that are blocked
* on the specified condition variable cond.
*/
return semFlush(*cond);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_cond_destroy (pace_pthread_cond_t * cond)
{
PACE_TRACE("pace_pthread_cond_destroy");
if (*cond != NULL)
return semDelete(*cond);
return EINVAL;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_cond_init (pace_pthread_cond_t * cond,
const pace_pthread_condattr_t * attr)
{
PACE_TRACE("pace_pthread_cond_init");
*cond = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
if (*cond == NULL)
return ERROR;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_cond_signal (pace_pthread_cond_t * cond)
{
PACE_TRACE("pace_pthread_cond_signal");
return semGive(*cond);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_cond_timedwait (pace_pthread_cond_t * cond,
pace_pthread_mutex_t * mutex,
const pace_timespec * abstime)
{
PACE_TRACE("pace_pthread_cond_timedwait");
return pthread_cond_timedwait(cond,
mutex,
abstime);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_cond_wait (pace_pthread_cond_t * cond,
pace_pthread_mutex_t * mutex)
{
PACE_TRACE("pace_pthread_cond_wait");
return pthread_cond_wait(cond,
mutex);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_condattr_destroy (pace_pthread_condattr_t * attr)
{
PACE_TRACE("pace_pthread_condattr_destroy");
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_condattr_getpshared (const pace_pthread_condattr_t * attr,
int * pshared)
{
PACE_TRACE("pace_pthread_condattr_getpshared");
/*
* All the resources in present VxWorks are shared system wide.
*/
*pshared = PTHREAD_PROCESS_SHARED;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_condattr_init (pace_pthread_condattr_t * attr)
{
PACE_TRACE("pace_pthread_condattr_init");
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_condattr_setpshared (pace_pthread_condattr_t * attr,
int pshared)
{
PACE_TRACE("pace_pthread_condattr_setpshared");
/*
* All the resources in present VxWorks are shared system wide.
*/
if (pshared != PTHREAD_PROCESS_SHARED)
return ERROR;
return OK;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
PACE_INLINE
int
pace_pthread_create (pace_pthread_t * thread,
const pace_pthread_attr_t * attr,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -