mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
61 lines
1.3 KiB
C
61 lines
1.3 KiB
C
|
|
/* Do stupid things with semaphores, and check that Thrcheck doesn't
|
|
fall over and does report errors appropriately. If nothing else
|
|
this just checks that the relevant functions are getting
|
|
intercepted. */
|
|
|
|
/* This is pretty lame, because making the sem_ functions fail is
|
|
difficult. Not sure it's really worth having. */
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <pthread.h>
|
|
#include "safe-semaphore.h"
|
|
#include <string.h>
|
|
void start_watchdog ( void );
|
|
int main ( void )
|
|
{
|
|
int r __attribute__((unused));
|
|
sem_t s1;
|
|
start_watchdog();
|
|
/* Do sem_init with huge initial count */
|
|
r= sem_init(&s1, 0, ~0);
|
|
|
|
/* initialise properly */
|
|
r= sem_init(&s1, 0, 0);
|
|
|
|
/* in glibc, sem_destroy is a no-op; making it fail is
|
|
impossible. */
|
|
|
|
/* Do 'wait' on a bogus semaphore. This should fail, but on glibc
|
|
it succeeds. */
|
|
memset(&s1, 0x55, sizeof(s1));
|
|
r= sem_wait(&s1); /* assert(r != 0); */
|
|
#if defined(VGO_solaris)
|
|
assert(r != 0);
|
|
#endif
|
|
|
|
/* this only fails with glibc 2.7 and later. */
|
|
r= sem_post(&s1);
|
|
|
|
sem_destroy(&s1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void* watchdog ( void* v )
|
|
{
|
|
sleep(10);
|
|
fprintf(stderr, "watchdog timer expired - not a good sign\n");
|
|
exit(0);
|
|
}
|
|
|
|
void start_watchdog ( void )
|
|
{
|
|
pthread_t t;
|
|
int r;
|
|
r= pthread_create(&t, NULL, watchdog, NULL);
|
|
assert(!r);
|
|
}
|