mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
ITAGAKI Takahiro <itagaki.takahiro@oss.ntt.co.jp> added thread-safe
descriptor handling
This commit is contained in:
@ -43,3 +43,4 @@ test: thread/thread
|
||||
test: thread/thread_implicit
|
||||
test: thread/prep
|
||||
test: thread/alloc
|
||||
test: thread/descriptor
|
||||
|
@ -43,5 +43,6 @@ test: thread/thread
|
||||
test: thread/thread_implicit
|
||||
test: thread/prep
|
||||
test: thread/alloc
|
||||
test: thread/descriptor
|
||||
test: connect/test1
|
||||
|
||||
|
155
src/interfaces/ecpg/test/expected/thread-descriptor.c
Normal file
155
src/interfaces/ecpg/test/expected/thread-descriptor.c
Normal file
@ -0,0 +1,155 @@
|
||||
/* Processed by ecpg (regression mode) */
|
||||
/* These include files are added by the preprocessor */
|
||||
#include <ecpgtype.h>
|
||||
#include <ecpglib.h>
|
||||
#include <ecpgerrno.h>
|
||||
#include <sqlca.h>
|
||||
/* End of automatic include section */
|
||||
#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
|
||||
|
||||
#line 1 "descriptor.pgc"
|
||||
#ifdef WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
|
||||
#define THREADS 16
|
||||
#define REPEATS 50000
|
||||
|
||||
|
||||
#line 1 "sqlca.h"
|
||||
#ifndef POSTGRES_SQLCA_H
|
||||
#define POSTGRES_SQLCA_H
|
||||
|
||||
#ifndef PGDLLIMPORT
|
||||
#if defined(WIN32) || defined(__CYGWIN__)
|
||||
#define PGDLLIMPORT __declspec (dllimport)
|
||||
#else
|
||||
#define PGDLLIMPORT
|
||||
#endif /* __CYGWIN__ */
|
||||
#endif /* PGDLLIMPORT */
|
||||
|
||||
#define SQLERRMC_LEN 150
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
struct sqlca_t
|
||||
{
|
||||
char sqlcaid[8];
|
||||
long sqlabc;
|
||||
long sqlcode;
|
||||
struct
|
||||
{
|
||||
int sqlerrml;
|
||||
char sqlerrmc[SQLERRMC_LEN];
|
||||
} sqlerrm;
|
||||
char sqlerrp[8];
|
||||
long sqlerrd[6];
|
||||
/* Element 0: empty */
|
||||
/* 1: OID of processed tuple if applicable */
|
||||
/* 2: number of rows processed */
|
||||
/* after an INSERT, UPDATE or */
|
||||
/* DELETE statement */
|
||||
/* 3: empty */
|
||||
/* 4: empty */
|
||||
/* 5: empty */
|
||||
char sqlwarn[8];
|
||||
/* Element 0: set to 'W' if at least one other is 'W' */
|
||||
/* 1: if 'W' at least one character string */
|
||||
/* value was truncated when it was */
|
||||
/* stored into a host variable. */
|
||||
|
||||
/*
|
||||
* 2: if 'W' a (hopefully) non-fatal notice occurred
|
||||
*/ /* 3: empty */
|
||||
/* 4: empty */
|
||||
/* 5: empty */
|
||||
/* 6: empty */
|
||||
/* 7: empty */
|
||||
|
||||
char sqlstate[5];
|
||||
};
|
||||
|
||||
struct sqlca_t *ECPGget_sqlca(void);
|
||||
|
||||
#ifndef POSTGRES_ECPG_INTERNAL
|
||||
#define sqlca (*ECPGget_sqlca())
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#line 13 "descriptor.pgc"
|
||||
|
||||
/* exec sql whenever sqlerror sqlprint ; */
|
||||
#line 14 "descriptor.pgc"
|
||||
|
||||
/* exec sql whenever not found sqlprint ; */
|
||||
#line 15 "descriptor.pgc"
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
static unsigned STDCALL fn(void* arg)
|
||||
#else
|
||||
void* fn(void* arg)
|
||||
#endif
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= REPEATS; ++i)
|
||||
{
|
||||
ECPGallocate_desc(__LINE__, "mydesc");
|
||||
#line 27 "descriptor.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();
|
||||
#line 27 "descriptor.pgc"
|
||||
|
||||
ECPGdeallocate_desc(__LINE__, "mydesc");
|
||||
#line 28 "descriptor.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();
|
||||
#line 28 "descriptor.pgc"
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main (int argc, char** argv)
|
||||
{
|
||||
int i;
|
||||
#ifdef WIN32
|
||||
HANDLE threads[THREADS];
|
||||
#else
|
||||
pthread_t threads[THREADS];
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
{
|
||||
unsigned id;
|
||||
threads[i] = (HANDLE)_beginthreadex(NULL, 0, fn, NULL, 0, &id);
|
||||
}
|
||||
|
||||
WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE);
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
CloseHandle(threads[i]);
|
||||
#else
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
pthread_create(&threads[i], NULL, fn, NULL);
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
pthread_join(threads[i], NULL);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
@ -7,6 +7,7 @@ include $(top_srcdir)/$(subdir)/../Makefile.regress
|
||||
TESTS = thread_implicit thread_implicit.c \
|
||||
thread thread.c \
|
||||
prep prep.c \
|
||||
descriptor descriptor.c \
|
||||
alloc alloc.c
|
||||
|
||||
all: $(TESTS)
|
||||
|
61
src/interfaces/ecpg/test/thread/descriptor.pgc
Normal file
61
src/interfaces/ecpg/test/thread/descriptor.pgc
Normal file
@ -0,0 +1,61 @@
|
||||
#ifdef WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
|
||||
#define THREADS 16
|
||||
#define REPEATS 50000
|
||||
|
||||
EXEC SQL include sqlca;
|
||||
EXEC SQL whenever sqlerror sqlprint;
|
||||
EXEC SQL whenever not found sqlprint;
|
||||
|
||||
#ifdef WIN32
|
||||
static unsigned STDCALL fn(void* arg)
|
||||
#else
|
||||
void* fn(void* arg)
|
||||
#endif
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= REPEATS; ++i)
|
||||
{
|
||||
EXEC SQL ALLOCATE DESCRIPTOR mydesc;
|
||||
EXEC SQL DEALLOCATE DESCRIPTOR mydesc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main (int argc, char** argv)
|
||||
{
|
||||
int i;
|
||||
#ifdef WIN32
|
||||
HANDLE threads[THREADS];
|
||||
#else
|
||||
pthread_t threads[THREADS];
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
{
|
||||
unsigned id;
|
||||
threads[i] = (HANDLE)_beginthreadex(NULL, 0, fn, NULL, 0, &id);
|
||||
}
|
||||
|
||||
WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE);
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
CloseHandle(threads[i]);
|
||||
#else
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
pthread_create(&threads[i], NULL, fn, NULL);
|
||||
for (i = 0; i < THREADS; ++i)
|
||||
pthread_join(threads[i], NULL);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user