mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Add test for thread-safe errno to thread test program.
This commit is contained in:
@ -6,7 +6,7 @@
|
|||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/tools/thread/thread_test.c,v 1.7 2004/02/11 21:44:06 momjian Exp $
|
* $PostgreSQL: pgsql/src/tools/thread/thread_test.c,v 1.8 2004/03/27 23:02:44 momjian Exp $
|
||||||
*
|
*
|
||||||
* This program tests to see if your standard libc functions use
|
* This program tests to see if your standard libc functions use
|
||||||
* pthread_setspecific()/pthread_getspecific() to be thread-safe.
|
* pthread_setspecific()/pthread_getspecific() to be thread-safe.
|
||||||
@ -29,10 +29,15 @@
|
|||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
void func_call_1(void);
|
void func_call_1(void);
|
||||||
void func_call_2(void);
|
void func_call_2(void);
|
||||||
|
|
||||||
|
int errno1_set = 0;
|
||||||
|
int errno2_set = 0;
|
||||||
|
|
||||||
char *strerror_p1;
|
char *strerror_p1;
|
||||||
char *strerror_p2;
|
char *strerror_p2;
|
||||||
|
|
||||||
@ -42,6 +47,9 @@ struct passwd *passwd_p2;
|
|||||||
struct hostent *hostent_p1;
|
struct hostent *hostent_p1;
|
||||||
struct hostent *hostent_p2;
|
struct hostent *hostent_p2;
|
||||||
|
|
||||||
|
pthread_mutex_t singlethread_lock1 = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
pthread_mutex_t singlethread_lock2 = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
pthread_t thread1,
|
pthread_t thread1,
|
||||||
@ -84,7 +92,30 @@ defines to your template/$port file before compiling this program.\n\n"
|
|||||||
|
|
||||||
void func_call_1(void) {
|
void func_call_1(void) {
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
|
if (open("/tmp/thread_test.1", O_RDWR | O_CREAT, 0600) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Could not create file in /tmp, exiting\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (open("/tmp/thread_test.1", O_RDWR | O_CREAT | O_EXCL, 0600) >= 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Could not generate failure for create file in /tmp, exiting\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* wait for other thread to set errno */
|
||||||
|
errno1_set = 1;
|
||||||
|
while (errno2_set == 0)
|
||||||
|
/* loop */;
|
||||||
|
if (errno != EEXIST)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "errno not thread-safe; exiting\n");
|
||||||
|
unlink("/tmp/thread_test.1");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
unlink("/tmp/thread_test.1");
|
||||||
|
|
||||||
strerror_p1 = strerror(EACCES);
|
strerror_p1 = strerror(EACCES);
|
||||||
/*
|
/*
|
||||||
* If strerror() uses sys_errlist, the pointer might change for different
|
* If strerror() uses sys_errlist, the pointer might change for different
|
||||||
@ -112,6 +143,23 @@ void func_call_1(void) {
|
|||||||
void func_call_2(void) {
|
void func_call_2(void) {
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
|
unlink("/tmp/thread_test.2");
|
||||||
|
if (open("/tmp/thread_test.2", O_RDONLY, 0600) >= 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Read-only open succeeded without create, exiting\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* wait for other thread to set errno */
|
||||||
|
errno2_set = 1;
|
||||||
|
while (errno1_set == 0)
|
||||||
|
/* loop */;
|
||||||
|
if (errno != ENOENT)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "errno not thread-safe; exiting\n");
|
||||||
|
unlink("/tmp/thread_test.A");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
strerror_p2 = strerror(EINVAL);
|
strerror_p2 = strerror(EINVAL);
|
||||||
/*
|
/*
|
||||||
* If strerror() uses sys_errlist, the pointer might change for different
|
* If strerror() uses sys_errlist, the pointer might change for different
|
||||||
|
Reference in New Issue
Block a user