On 2015/10/07 11:52, Stuart Henderson wrote:
> monitoring-plugins has a program that checks available space on partitions.
> Before doing this it does a stat() to check that the requested directory
> exists and is accessible. In their devel tree they have moved to doing
> this stat() in a thread - commit log was "don't let check_disk hang on
> hanging file systems". However this code doesn't work for us.
> 
> I've attached a stripped-down test program based on their code that works
> as expected on Linux but fails on OpenBSD. I can always patch to use the
> non-pthread code, but I wondered if anyone has an idea what's up and
> whether the bug is theirs or ours - is pthread_kill(thread, 0) working
> as expected?
> 
> $ make thread LDFLAGS=-lpthread
> cc -O2 -pipe   -lpthread -o thread thread.c
> 
> $ ./thread
> 4
> child
> 3
> 2
> 1
> 0
> child thread did not return within 5s

oops, I added some extra bits while I was playing around, the test
program was meant to be this simpler version.
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>

void do_something();
void *child(void *);

int
main(int argc, char **argv)
{
        do_something();
}

void do_something()
{
        pthread_t stat_thread;
        int done = 0;
        int timer = 5;
        struct timespec req, rem;

        req.tv_sec = 0;
        pthread_create(&stat_thread, NULL, child, NULL);
        while (timer-- > 0) {
                printf("%u\n", timer);
                req.tv_nsec = 10000000;
                nanosleep(&req, &rem);
                if (pthread_kill(stat_thread, 0)) {
                        done = 1;
                        break;
                } else {
                        printf("e %u\n", errno);
                        req.tv_nsec = 990000000;
                        nanosleep(&req, &rem);
                }
        }
        if (done == 1) {
                pthread_join(stat_thread, NULL);
        } else {
                pthread_detach(stat_thread);
                printf("child thread did not return within 5s\n");
        }
}

void *child(void *in)
{
        printf("child\n");
}

Reply via email to