Delay's in Threads in 4.25?

What would be the best way to implement
a thread safe delay routine in 4.25?

Thanks.

“Tom” <pwc@ag-signs.com> wrote in message news:atb3oa$nu7$1@inn.qnx.com

What would be the best way to implement
a thread safe delay routine in 4.25?

Word of caution, if you need help to figure this out, using threads under
QNX4 is probably not for you. Threads under QNX4 are very touchy. But then
again sometime a good challenge is refreshing :wink:

Here is a good start: Function to use instead of delay() is tdelay()

////////////////////////////////////////////////////////////////////////////
///
//
// MODULE: delay
//
// provides thread safe equivalent of QNX delay()
// This is acheive by creating one timer per unique pid.
//
//
//
/////////////////////
//
// TODO
//

//--------------------------------------------------------------------------

//— INCLUDE FILE (Kept sorted
please)----------------------------------------
//--------------------------------------------------------------------------

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/proxy.h>
#include <sys/kernel.h>


#include “include/delay.h”

//--------------------------------------------------------------------------

//—
DEFINITIONS--------------------------------------------------------------
//--------------------------------------------------------------------------

#define NB_TIMER 5

typedef struct delay_timer_s {
pid_t pid; // for what thread
int timer; // id of the timer
pid_t proxy; // proxy use to trigger
} delay_timer_t;

//--------------------------------------------------------------------------

//—
DECLARATIONS-------------------------------------------------------------
//--------------------------------------------------------------------------

static delay_timer_t dt[NB_TIMER]; // could/should be dynamic
static int nb_dt=0;

//--------------------------------------------------------------------------

//— EXTERN (Kept sorted
please)----------------------------------------------
//--------------------------------------------------------------------------

//--------------------------------------------------------------------------

//— FUNCTION (from Bottom to Top, and/or
sorted)-----------------------------
//--------------------------------------------------------------------------

static delay_timer_t *get_delay_timer_info( pid_t pid ) {

int i;

for(i=0; i< nb_dt; i++ ) {
if ( dt_.pid == pid )
return &dt;
}

return NULL;

}
// This function should be protected by semaphore

static delay_timer_t *create_delay_timer( pid_t pid ) {

struct sigevent event;

if ( nb_dt >= NB_TIMER )
return NULL;

dt[nb_dt].proxy = qnx_proxy_attach ( 0,0,0, -1 );
if ( dt[nb_dt].proxy == -1 )
return NULL;

event.sigev_signo = -dt[nb_dt].proxy;
dt[nb_dt].timer = timer_create ( CLOCK_REALTIME, &event );
if ( dt[nb_dt].timer == -1 ) {
(void) qnx_proxy_detach( dt[nb_dt].proxy );
return NULL;
}

dt[nb_dt].pid = pid;

return &dt[nb_dt++];

}


static int setup_delay_timer( delay_timer_t *p, unsigned int msec ) {

struct itimerspec timer;

timer.it_value.tv_sec = (long)(msec/1000);
timer.it_value.tv_nsec = (msec % 1000) * 1000000L;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_nsec = 0;
return timer_settime( p->timer, 0, &timer, NULL );


}

int tdelay( unsigned int millisec ) {

delay_timer_t *p;
pid_t pid;

pid = getpid();

p = get_delay_timer_info( pid );

if ( !p ) {
p = create_delay_timer( pid );
if ( !p ) {
return -1;
}
}

if ( !setup_delay_timer( p, millisec ) ) {
if ( Receive( p->proxy, 0, 0) == -1 )
return -1;
else
return 0;
}

return -1;


}_


Thanks.

Thanks! Just what I need.

Tom.
“Mario Charest” postmaster@127.0.0.1 wrote in message
news:atb53h$pe6$1@inn.qnx.com

“Tom” <> pwc@ag-signs.com> > wrote in message news:atb3oa$nu7$> 1@inn.qnx.com> …
What would be the best way to implement
a thread safe delay routine in 4.25?

Word of caution, if you need help to figure this out, using threads under
QNX4 is probably not for you. Threads under QNX4 are very touchy. But
then
again sometime a good challenge is refreshing > :wink:

Here is a good start: Function to use instead of delay() is tdelay()


////////////////////////////////////////////////////////////////////////////
///
//
// MODULE: delay
//
// provides thread safe equivalent of QNX delay()
// This is acheive by creating one timer per unique pid.
//
//
//
/////////////////////
//
// TODO
//


//--------------------------------------------------------------------------

//— INCLUDE FILE (Kept sorted
please)----------------------------------------

//--------------------------------------------------------------------------

#include <stdio.h
#include <signal.h
#include <stdlib.h
#include <time.h
#include <unistd.h
#include <sys/proxy.h
#include <sys/kernel.h


#include “include/delay.h”


//--------------------------------------------------------------------------

//—
DEFINITIONS--------------------------------------------------------------

//--------------------------------------------------------------------------

#define NB_TIMER 5

typedef struct delay_timer_s {
pid_t pid; // for what thread
int timer; // id of the timer
pid_t proxy; // proxy use to trigger
} delay_timer_t;


//--------------------------------------------------------------------------

//—
DECLARATIONS-------------------------------------------------------------

//--------------------------------------------------------------------------

static delay_timer_t dt[NB_TIMER]; // could/should be dynamic
static int nb_dt=0;


//--------------------------------------------------------------------------

//— EXTERN (Kept sorted
please)----------------------------------------------

//--------------------------------------------------------------------------



//--------------------------------------------------------------------------

//— FUNCTION (from Bottom to Top, and/or
sorted)-----------------------------

//--------------------------------------------------------------------------

static delay_timer_t *get_delay_timer_info( pid_t pid ) {

int i;

for(i=0; i< nb_dt; i++ ) {
if ( dt> .pid == pid )
return &dt> ;
}

return NULL;

}
// This function should be protected by semaphore

static delay_timer_t *create_delay_timer( pid_t pid ) {

struct sigevent event;

if ( nb_dt >= NB_TIMER )
return NULL;

dt[nb_dt].proxy = qnx_proxy_attach ( 0,0,0, -1 );
if ( dt[nb_dt].proxy == -1 )
return NULL;

event.sigev_signo = -dt[nb_dt].proxy;
dt[nb_dt].timer = timer_create ( CLOCK_REALTIME, &event );
if ( dt[nb_dt].timer == -1 ) {
(void) qnx_proxy_detach( dt[nb_dt].proxy );
return NULL;
}

dt[nb_dt].pid = pid;

return &dt[nb_dt++];

}


static int setup_delay_timer( delay_timer_t *p, unsigned int msec ) {

struct itimerspec timer;

timer.it_value.tv_sec = (long)(msec/1000);
timer.it_value.tv_nsec = (msec % 1000) * 1000000L;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_nsec = 0;
return timer_settime( p->timer, 0, &timer, NULL );


}

int tdelay( unsigned int millisec ) {

delay_timer_t *p;
pid_t pid;

pid = getpid();

p = get_delay_timer_info( pid );

if ( !p ) {
p = create_delay_timer( pid );
if ( !p ) {
return -1;
}
}

if ( !setup_delay_timer( p, millisec ) ) {
if ( Receive( p->proxy, 0, 0) == -1 )
return -1;
else
return 0;
}

return -1;


}



Thanks.

\