| Updated: October 28, 2024 | 
For more information about this program, see Kernel timeouts with pthread_join() in the Clocks, Timers, and Getting a Kick Every So Often chapter.
/*
 * tt1.c
*/
#include <stdio.h>
#include <pthread.h>
#include <inttypes.h>
#include <errno.h>
#include <sys/neutrino.h>
#define SEC_NSEC 1000000000LL // 1 billion nanoseconds in a second
void *
long_thread (void *notused)
{
    printf ("This thread runs for more than 10 seconds\n");
    sleep (20);
}
int
main (void) // ignore arguments
{
    uint64_t        timeout;
    struct sigevent event;
    int             rval;
    pthread_t       thread_id;
    // set up the event -- this can be done once
    
    // This or event.sigev_notify = SIGEV_UNBLOCK:
    SIGEV_UNBLOCK_INIT (&event);
    // create a thread
    pthread_create (&thread_id, NULL, long_thread, NULL);
    // set up for 10 second timeout
    timeout = 10LL * SEC_NSEC;
    TimerTimeout (CLOCK_MONOTONIC, _NTO_TIMEOUT_JOIN, &event, &timeout, NULL);
    rval = pthread_join (thread_id, NULL);
    if (rval == ETIMEDOUT) {
        printf ("Thread %d is still running after 10 seconds!\n",
                thread_id);
    }
    sleep (5);
    
   
    TimerTimeout (CLOCK_MONOTONIC, _NTO_TIMEOUT_JOIN, &event, &timeout, NULL);
    rval = pthread_join (thread_id, NULL);
    if (rval == ETIMEDOUT) {
        printf ("Thread %d is still running after 25 seconds (bad)!\n",
                thread_id);
    } else {
        printf ("Thread %d finished (expected!)\n", thread_id);
    }
}