![]() |
![]() |
![]() |
![]() |
![]() |
This version of this document is no longer maintained. For the latest documentation, see http://www.qnx.com/developers/docs. |
Control a thread
#include <sys/neutrino.h>
int ThreadCtl( int cmd,
void * data );
int ThreadCtl_r( int cmd,
void * data );
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
These kernel calls allow you to make QNX-specific changes to a thread.
The ThreadCtl() and ThreadCtl_r() functions are identical except in the way they indicate errors. See the Returns section for details.
The following calls are defined:
The function sets data to a positive or negative number, indicating the previous state of the the alignment-fault handling.
new_name_len name_buf_len name_buf[1]
The name_buf is a continuous buffer that extends the structure that contains space for max(name_buf_len, new_name_len). If new_name_len is
The current thread name (or previous name if a new name is being set) is placed as a NULL-terminated string in the buffer pointed to by name_buf. The name returned has a maximum of name_buf_len bytes. No thread name is returned if name_buf_len is zero.
![]() |
This call was defined in the QNX Neutrino Core OS 6.3.2. |
![]() |
Threads created by the calling thread inherit the _NTO_TCTL_IO status. |
![]() |
This call was defined in the QNX Neutrino Core OS 6.3.2. |
![]() |
This call was defined in the QNX Neutrino Core OS 6.3.2. |
By default, a thread's runmask is set to all ones, which allows it to run on any available processor. A value of 0x01 would, for example, force the thread to only run on the first processor.
You can use _NTO_TCTL_RUNMASK to optimize the runtime performance of your system by, for example, relegating nonrealtime threads to a specific processor. In general, this shouldn't be necessary, since the QNX realtime scheduler always preempts a lower-priority thread immediately when a higher priority thread becomes ready.
The main effect of processor locking is the effectiveness of the CPU cache, since threads can be prevented from migrating.
![]() |
Threads created by the calling thread don't inherit the specified runmask. |
![]() |
This call was defined in the QNX Neutrino Core OS 6.3.2. |
![]() |
Threads created by the calling thread aren't frozen. |
These calls don't block.
The only difference between these functions is the way they indicate errors:
#include <sys/neutrino.h>
#include <sys/syspage.h>
#include <malloc.h>
#include <stdio.h>
int
main(void)
{
int *rsizep, rsize, size_tot;
unsigned *rmaskp, *inheritp;
unsigned buf[8];
void *freep;
/*
* struct _thread_runmask is not
* uniquely sized so we construct
* our own.
*/
rsize = RMSK_SIZE(_syspage_ptr->num_cpu);
size_tot = sizeof(*rsizep);
size_tot += sizeof(*rmaskp) * rsize;
size_tot += sizeof(*inheritp) * rsize;
if (size_tot <= sizeof(buf)) {
rsizep = buf;
freep = NULL;
}
else if ((rsizep = freep = malloc(size_tot)) == NULL) {
perror("malloc");
return 1;
}
memset(rsizep, 0x00, size_tot);
*rsizep = rsize;
rmaskp = (unsigned *)(rsizep + 1);
inheritp = rmaskp + rsize;
/*
* Both masks set to 0 means get current
* values without alteration.
*/
if (ThreadCtl(_NTO_TCTL_RUNMASK_GET_AND_SET_INHERIT, rsizep) == -1) {
perror("_NTO_TCTL_RUNMASK_GET_AND_SET_INHERIT");
free(freep);
return 1;
}
/*
* Restrict our inherit mask to the last cpu, leave
* runmask unaltered.
*/
memset(rsizep, 0x00, size_tot);
*rsizep = rsize;
RMSK_SET(_syspage_ptr->num_cpu - 1, inheritp);
if (ThreadCtl(_NTO_TCTL_RUNMASK_GET_AND_SET_INHERIT, rsizep) == -1) {
perror("_NTO_TCTL_RUNMASK_GET_AND_SET_INHERIT");
free(freep);
return 1;
}
free(freep);
return 0;
}
| Safety: | |
|---|---|
| Cancellation point | No |
| Interrupt handler | No |
| Signal handler | Yes |
| Thread | Yes |
InterruptDisable(), InterruptEnable(), InterruptMask(), InterruptUnmask()
![]() |
![]() |
![]() |
![]() |