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
#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)
{
struct timespec xeq, xem;
xeq.tv_nsec = 9590000000;
printf("child1\n");
nanosleep(&xeq, &xem);
printf("child2\n");
}