📄 pthread.c
字号:
*/
memcpy ((void *)(*attr), (void *)pthread_attr_default,
sizeof(struct _PTHREAD_ATTR));
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_attr_setdetachstate (pace_pthread_attr_t * attr,
int detachstate)
{
PACE_TRACE("pthread_attr_setdetachstate");
if ((detachstate != PTHREAD_CREATE_DETACHED) ||
(detachstate != PTHREAD_CREATE_JOINABLE))
{
(*attr)->dstate = PTHREAD_CREATE_DETACHED;
return ERROR;
}
(*attr)->dstate = detachstate;
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_attr_setschedparam (pace_pthread_attr_t * attr,
const pace_sched_param * param)
{
PACE_TRACE("pthread_attr_setschedparam");
/* range check */
if (param->sched_priority > SCHED_RR_HIGH_PRI ||
param->sched_priority < SCHED_RR_LOW_PRI )
{
return ERROR;
}
(*attr)->schedule.sched_priority = param->sched_priority;
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_cancel (pace_pthread_t thread)
{
PACE_TRACE("pthread_cancel");
/*
* In VxWorks, to cancel a thread is to delete a task.
*/
if (!pacevx_pthread_verify(thread))
return ESRCH;
if (taskIdVerify(thread->tid) == ERROR) /* already exit, never happen */
return ERROR;
if (thread->stateflag == PTHREAD_CANCEL_DISABLE)
return ERROR;
else
return (taskDelete(thread->tid));
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_getschedparam (pace_pthread_t thread,
int * policy,
pace_sched_param * param)
{
PACE_TRACE("pthread_getschedparam");
if (thread == 0)
return ERROR;
*policy = sched_getscheduler(thread->tid);
if (sched_getparam(thread->tid, param) == OK)
{
/* convert VxWorks priority to POSIX priority */
param->sched_priority = SCHED_FIFO_HIGH_PRI - param->sched_priority;
return OK;
}
return ERROR;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
void *
pthread_getspecific (pace_pthread_key_t key)
{
pace_pthread_t pthread;
PACE_TRACE("pthread_getspecific");
if (!pacevx_pthread_key_validate(key))
return NULL;
if ((pthread = pace_pthread_self()) != NULL)
{
return pthread->keyvaluelist[key];
}
return NULL;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_mutex_init (pace_pthread_mutex_t * mutex,
const pace_pthread_mutexattr_t * attr)
{
/*
* Initialises the mutex referenced by mutex with attributes
* specified by attr. If attr is NULL, the default mutex
* attributes are used.
*/
/* Make SEM_Q_FIFO the default since this is what ACE does (and
* ACE works) plus this is supposedly the default for VxWorks.
*/
int options = SEM_Q_FIFO;
PACE_TRACE("pthread_mutex_init");
if (attr != NULL)
{
switch ((*attr)->protocol)
{
case PTHREAD_PRIO_INHERIT:
/* POSIX's PTHREAD_PRIO_INHERIT maps to VxWorks' SEM_INVERSION_SAFE.
* However, this doesn't seem to be supported (at least on 5.3.1).
* Return an error.
*/
return ERROR;
break;
case PTHREAD_PRIO_PROTECT:
/* VxWorks does not support this functionality.
* Return an error.
*/
return ERROR;
break;
case PTHREAD_PRIO_NONE:
options = SEM_Q_FIFO;
break;
default:
perror("Invalid POSIX protocol specified");
return ERROR;
break;
}
}
*mutex = semMCreate(options);
if (*mutex == NULL) {
return ERROR;
}
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_mutex_lock (pace_pthread_mutex_t * mutex)
{
STATUS status;
int errornumber;
PACE_TRACE("pthread_mutex_lock");
status = semTake(*mutex, WAIT_FOREVER);
if (status == OK)
{
return OK;
}
else
{
errornumber = errnoGet();
if (errornumber == S_objLib_OBJ_ID_ERROR)
return EINVAL;
return ERROR;
}
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_mutex_trylock (pace_pthread_mutex_t * mutex)
{
STATUS status;
int errornumber;
PACE_TRACE("pthread_mutex_trylock");
status = semTake(*mutex, NO_WAIT);
if (status == OK)
return OK;
else
{
errornumber = errnoGet();
if (errornumber == S_objLib_OBJ_ID_ERROR)
return EINVAL;
if (errornumber == S_objLib_OBJ_UNAVAILABLE)
return EBUSY;
return ERROR;
}
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_mutex_unlock (pace_pthread_mutex_t * mutex)
{
STATUS status;
int errornumber;
PACE_TRACE("pthread_mutex_unlock");
status = semGive(*mutex);
if (status == OK)
return OK;
else
{
errornumber = errnoGet();
if (errornumber == S_semLib_INVALID_OPERATION)
return EPERM;
return ERROR;
}
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_mutexattr_setprotocol (pace_pthread_mutexattr_t * attr,
int protocol)
{
PACE_TRACE("pthread_mutexattr_setprotocol");
/*
* Does not support PTHREAD_PRIO_PROTECT for VxWorks
*/
if ((protocol == PTHREAD_PRIO_NONE) ||
(protocol == PTHREAD_PRIO_INHERIT ))
{
(*attr)->protocol = protocol;
return OK;
}
return ERROR;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_mutexattr_init (pace_pthread_mutexattr_t * attr)
{
/*
* Initializes a mutex attributes object attr with the
* default value for all of the attributes
*/
pace_pthread_mutexattr_t pattr;
PACE_TRACE("pthread_mutexattr_init");
pattr = (pace_pthread_mutexattr_t) malloc(sizeof(struct _PTHREAD_MUX_ATTR));
if (pattr == NULL)
return ERROR;
/* POSIX's PTHREAD_PRIO_INHERIT maps to VxWorks' SEM_INVERSION_SAFE.
* However, this doesn't seem to be supported (at least on 5.3.1).
* Set PTHREAD_PRIO_NONE as the default since the only other choice
* is PTHREAD_PRIO_PROTECT which VxWorks doesn't support.
pattr->protocol = PTHREAD_PRIO_INHERIT;
*/
pattr->protocol = PTHREAD_PRIO_NONE;
pattr->shared = PTHREAD_PROCESS_SHARED;
pattr->type = PTHREAD_MUTEX_DEFAULT;
*attr = pattr;
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_mutexattr_setpshared (pace_pthread_mutexattr_t * attr,
int pshared)
{
PACE_TRACE("pthread_mutexattr_setpshared");
/*
* Only supports PTHREAD_PROCESS_SHARED
*/
if (attr == 0) return EINVAL;
if (pshared != PTHREAD_PROCESS_SHARED)
return ERROR;
else
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_setcancelstate (int state, int * oldstate)
{
int key;
pace_pthread_t pthread;
PACE_TRACE("pthread_setcancelstate");
if ((state != PTHREAD_CANCEL_ENABLE) &&
(state != PTHREAD_CANCEL_DISABLE))
{
return ERROR;
}
if ((pthread = pace_pthread_self()) == NULL)
return ERROR;
key = intLock();
*oldstate = pthread->stateflag;
pthread->stateflag = state;
intUnlock(key);
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_setcanceltype (int type, int * oldtype)
{
/*
* Only asychronouse type is supported
*/
pace_pthread_t pthread;
PACE_TRACE("pthread_setcanceltype");
if (type != PTHREAD_CANCEL_ASYNCHRONOUS)
return ERROR;
if ((pthread = pace_pthread_self()) == NULL)
return ERROR;
*oldtype = pthread->canceltype;
return OK;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_setschedparam (pace_pthread_t thread,
int policy,
const pace_sched_param * param)
{
/*
* Only priority can be changed.
*/
struct sched_param sparam;
PACE_TRACE("pthread_setschedparam");
if (thread == 0)
return ERROR;
if (policy != sched_getscheduler(thread->tid))
return ERROR;
/* convert POSIX priority to VxWorks priority */
sparam.sched_priority = SCHED_FIFO_HIGH_PRI - param->sched_priority;
return (sched_setparam(thread->tid, &sparam));
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_setspecific (pace_pthread_key_t key, const void * value)
{
pace_pthread_t pthread;
PACE_TRACE("pthread_setspecific");
if (!pacevx_pthread_key_validate(key))
return ERROR;
if ((pthread = pace_pthread_self()) != NULL)
{
pthread->keyvaluelist[key] = PACE_NONCONST_ARG_CAST(void *) value;
return OK;
}
return ERROR;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
pthread_sigmask (int how,
const sigset_t * set,
sigset_t * oset)
{
PACE_TRACE("pthread_sigmask");
switch (how)
{
case SIG_BLOCK:
case SIG_UNBLOCK:
{
/* get the old mask */
*oset = sigsetmask (*set);
/* create a new mask: the following assumes that sigset_t is 4 bytes,
* which it is on VxWorks 5.2, so bit operations are done simply . . .
*/
sigsetmask (how == SIG_BLOCK ? (*oset |= *set) : (*oset &= ~*set));
break;
}
case SIG_SETMASK:
*oset = sigsetmask (*set);
break;
default:
return -1;
}
return 0;
}
#endif /* PACE_HAS_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
pace_pthread_t
pthread_self ()
{
WIND_TCB *pTcb;
PACE_TRACE("pthread_self");
if ((pTcb = taskTcb(taskIdSelf())) == NULL)
return (pace_pthread_t)NULL;
return (pace_pthread_t)(pTcb->_USER_SPARE4);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -