Remove --disable-thread-safety and related code.

All supported computers have either POSIX or Windows threads, and we no
longer have any automated testing of --disable-thread-safety.  We define
a vestigial ENABLE_THREAD_SAFETY macro to 1 in ecpg_config.h in case it
is useful, but we no longer test it anywhere in PostgreSQL code, and
associated dead code paths are removed.

The Meson and perl-based Windows build scripts never had an equivalent
build option.

Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Discussion: https://postgr.es/m/CA%2BhUKGLtmexrpMtxBRLCVePqV_dtWG-ZsEbyPrYc%2BNBB2TkNsw%40mail.gmail.com
This commit is contained in:
Thomas Munro 2023-07-12 06:20:37 +12:00
parent 11f3669409
commit 68a4b58eca
38 changed files with 137 additions and 509 deletions

54
configure vendored
View File

@ -722,7 +722,6 @@ with_tcl
ICU_LIBS ICU_LIBS
ICU_CFLAGS ICU_CFLAGS
with_icu with_icu
enable_thread_safety
INCLUDES INCLUDES
autodepend autodepend
PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR
@ -848,7 +847,6 @@ with_CC
with_llvm with_llvm
enable_depend enable_depend
enable_cassert enable_cassert
enable_thread_safety
with_icu with_icu
with_tcl with_tcl
with_tclconfig with_tclconfig
@ -1536,7 +1534,6 @@ Optional Features:
--enable-tap-tests enable TAP tests (requires Perl and IPC::Run) --enable-tap-tests enable TAP tests (requires Perl and IPC::Run)
--enable-depend turn on automatic dependency tracking --enable-depend turn on automatic dependency tracking
--enable-cassert enable assertion checks (for debugging) --enable-cassert enable assertion checks (for debugging)
--disable-thread-safety disable thread-safety in client libraries
--disable-largefile omit support for large files --disable-largefile omit support for large files
Optional Packages: Optional Packages:
@ -8338,43 +8335,6 @@ $as_echo "$as_me: WARNING: *** Library directory $dir does not exist." >&2;}
done done
IFS=$ac_save_IFS IFS=$ac_save_IFS
#
# Enable thread-safe client libraries
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking allow thread-safe client libraries" >&5
$as_echo_n "checking allow thread-safe client libraries... " >&6; }
# Check whether --enable-thread-safety was given.
if test "${enable_thread_safety+set}" = set; then :
enableval=$enable_thread_safety;
case $enableval in
yes)
:
;;
no)
:
;;
*)
as_fn_error $? "no argument expected for --enable-thread-safety option" "$LINENO" 5
;;
esac
else
enable_thread_safety=yes
fi
if test "$enable_thread_safety" = yes; then
$as_echo "#define ENABLE_THREAD_SAFETY 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_thread_safety" >&5
$as_echo "$enable_thread_safety" >&6; }
# #
# ICU # ICU
# #
@ -11064,7 +11024,7 @@ fi
done done
if test "$enable_thread_safety" = yes -a "$PORTNAME" != "win32"; then : if test "$PORTNAME" != "win32"; then :
# then # then
@ -11723,7 +11683,7 @@ if test "x$ac_cv_header_pthread_h" = xyes; then :
else else
as_fn_error $? " as_fn_error $? "
pthread.h not found; use --disable-thread-safety to disable thread safety" "$LINENO" 5 pthread.h not found" "$LINENO" 5
fi fi
@ -12407,8 +12367,7 @@ if test "$ac_res" != no; then :
fi fi
if test "$enable_thread_safety" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_barrier_wait" >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_barrier_wait" >&5
$as_echo_n "checking for library containing pthread_barrier_wait... " >&6; } $as_echo_n "checking for library containing pthread_barrier_wait... " >&6; }
if ${ac_cv_search_pthread_barrier_wait+:} false; then : if ${ac_cv_search_pthread_barrier_wait+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
@ -12464,7 +12423,6 @@ if test "$ac_res" != no; then :
fi fi
fi
if test "$with_readline" = yes; then if test "$with_readline" = yes; then
@ -13349,7 +13307,7 @@ else
thread_safe_libldap=no thread_safe_libldap=no
fi fi
if test "$enable_thread_safety" = yes -a "$thread_safe_libldap" = no; then if test "$thread_safe_libldap" = no; then
# Use ldap_r for FE if available, else assume ldap is thread-safe. # Use ldap_r for FE if available, else assume ldap is thread-safe.
# On some platforms ldap_r fails to link without PTHREAD_LIBS. # On some platforms ldap_r fails to link without PTHREAD_LIBS.
LIBS="$_LIBS" LIBS="$_LIBS"
@ -16377,8 +16335,7 @@ fi
if test "$enable_thread_safety" = yes; then ac_fn_c_check_func "$LINENO" "pthread_barrier_wait" "ac_cv_func_pthread_barrier_wait"
ac_fn_c_check_func "$LINENO" "pthread_barrier_wait" "ac_cv_func_pthread_barrier_wait"
if test "x$ac_cv_func_pthread_barrier_wait" = xyes; then : if test "x$ac_cv_func_pthread_barrier_wait" = xyes; then :
$as_echo "#define HAVE_PTHREAD_BARRIER_WAIT 1" >>confdefs.h $as_echo "#define HAVE_PTHREAD_BARRIER_WAIT 1" >>confdefs.h
@ -16392,7 +16349,6 @@ esac
fi fi
fi
if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then
# Cygwin and (apparently, based on test results) Mingw both # Cygwin and (apparently, based on test results) Mingw both

View File

@ -837,18 +837,6 @@ for dir in $LIBRARY_DIRS $SRCH_LIB; do
done done
IFS=$ac_save_IFS IFS=$ac_save_IFS
#
# Enable thread-safe client libraries
#
AC_MSG_CHECKING([allow thread-safe client libraries])
PGAC_ARG_BOOL(enable, thread-safety, yes, [disable thread-safety in client libraries])
if test "$enable_thread_safety" = yes; then
AC_DEFINE([ENABLE_THREAD_SAFETY], 1,
[Define to 1 to build client libraries as thread-safe code. (--enable-thread-safety)])
fi
AC_MSG_RESULT([$enable_thread_safety])
AC_SUBST(enable_thread_safety)
# #
# ICU # ICU
# #
@ -1243,7 +1231,7 @@ dnl note: We have to use AS_IF here rather than plain if. The AC_CHECK_HEADER
dnl invocation below is the first one in the script, and autoconf generates dnl invocation below is the first one in the script, and autoconf generates
dnl additional code for that, which must not be inside the if-block. AS_IF dnl additional code for that, which must not be inside the if-block. AS_IF
dnl knows how to do that. dnl knows how to do that.
AS_IF([test "$enable_thread_safety" = yes -a "$PORTNAME" != "win32"], AS_IF([test "$PORTNAME" != "win32"],
[ # then [ # then
AX_PTHREAD # set thread flags AX_PTHREAD # set thread flags
@ -1258,7 +1246,7 @@ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$LIBS $PTHREAD_LIBS" LIBS="$LIBS $PTHREAD_LIBS"
AC_CHECK_HEADER(pthread.h, [], [AC_MSG_ERROR([ AC_CHECK_HEADER(pthread.h, [], [AC_MSG_ERROR([
pthread.h not found; use --disable-thread-safety to disable thread safety])]) pthread.h not found])])
AC_CHECK_FUNCS([strerror_r]) AC_CHECK_FUNCS([strerror_r])
@ -1305,9 +1293,7 @@ AC_SEARCH_LIBS(shmget, cygipc)
# *BSD: # *BSD:
AC_SEARCH_LIBS(backtrace_symbols, execinfo) AC_SEARCH_LIBS(backtrace_symbols, execinfo)
if test "$enable_thread_safety" = yes; then AC_SEARCH_LIBS(pthread_barrier_wait, pthread)
AC_SEARCH_LIBS(pthread_barrier_wait, pthread)
fi
if test "$with_readline" = yes; then if test "$with_readline" = yes; then
PGAC_CHECK_READLINE PGAC_CHECK_READLINE
@ -1434,7 +1420,7 @@ if test "$with_ldap" = yes ; then
AC_CHECK_FUNC([ldap_verify_credentials], AC_CHECK_FUNC([ldap_verify_credentials],
[thread_safe_libldap=yes], [thread_safe_libldap=yes],
[thread_safe_libldap=no]) [thread_safe_libldap=no])
if test "$enable_thread_safety" = yes -a "$thread_safe_libldap" = no; then if test "$thread_safe_libldap" = no; then
# Use ldap_r for FE if available, else assume ldap is thread-safe. # Use ldap_r for FE if available, else assume ldap is thread-safe.
# On some platforms ldap_r fails to link without PTHREAD_LIBS. # On some platforms ldap_r fails to link without PTHREAD_LIBS.
LIBS="$_LIBS" LIBS="$_LIBS"
@ -1858,9 +1844,7 @@ AC_REPLACE_FUNCS(m4_normalize([
strnlen strnlen
])) ]))
if test "$enable_thread_safety" = yes; then AC_REPLACE_FUNCS(pthread_barrier_wait)
AC_REPLACE_FUNCS(pthread_barrier_wait)
fi
if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then
# Cygwin and (apparently, based on test results) Mingw both # Cygwin and (apparently, based on test results) Mingw both

View File

@ -1306,19 +1306,6 @@ build-postgresql:
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry id="configure-option-disable-thread-safety">
<term><option>--disable-thread-safety</option></term>
<listitem>
<para>
Disable the thread-safety of client libraries. This prevents
concurrent threads in <application>libpq</application> and
<application>ECPG</application> programs from safely controlling
their private connection handles. Use this only on platforms
with deficient threading support.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
</sect3> </sect3>

View File

@ -2508,17 +2508,6 @@ cdata.set_quoted('PG_VERSION_STR',
) )
###############################################################
# Threading
###############################################################
# XXX: About to rely on thread safety in the autoconf build, so not worth
# implementing a fallback.
cdata.set('ENABLE_THREAD_SAFETY', 1)
############################################################### ###############################################################
# NLS / Gettext # NLS / Gettext
############################################################### ###############################################################

View File

@ -202,7 +202,6 @@ enable_debug = @enable_debug@
enable_dtrace = @enable_dtrace@ enable_dtrace = @enable_dtrace@
enable_coverage = @enable_coverage@ enable_coverage = @enable_coverage@
enable_tap_tests = @enable_tap_tests@ enable_tap_tests = @enable_tap_tests@
enable_thread_safety = @enable_thread_safety@
python_includespec = @python_includespec@ python_includespec = @python_includespec@
python_libdir = @python_libdir@ python_libdir = @python_libdir@

View File

@ -137,7 +137,7 @@ typedef struct socket_set
EnterSynchronizationBarrier((barrier), \ EnterSynchronizationBarrier((barrier), \
SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY) SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY)
#define THREAD_BARRIER_DESTROY(barrier) #define THREAD_BARRIER_DESTROY(barrier)
#elif defined(ENABLE_THREAD_SAFETY) #else
/* Use POSIX threads */ /* Use POSIX threads */
#include "port/pg_pthread.h" #include "port/pg_pthread.h"
#define THREAD_T pthread_t #define THREAD_T pthread_t
@ -153,16 +153,6 @@ typedef struct socket_set
pthread_barrier_init((barrier), NULL, (n)) pthread_barrier_init((barrier), NULL, (n))
#define THREAD_BARRIER_WAIT(barrier) pthread_barrier_wait((barrier)) #define THREAD_BARRIER_WAIT(barrier) pthread_barrier_wait((barrier))
#define THREAD_BARRIER_DESTROY(barrier) pthread_barrier_destroy((barrier)) #define THREAD_BARRIER_DESTROY(barrier) pthread_barrier_destroy((barrier))
#else
/* No threads implementation, use none (-j 1) */
#define THREAD_T void *
#define THREAD_FUNC_RETURN_TYPE void *
#define THREAD_FUNC_RETURN return NULL
#define THREAD_FUNC_CC
#define THREAD_BARRIER_T int
#define THREAD_BARRIER_INIT(barrier, n) (*(barrier) = 0)
#define THREAD_BARRIER_WAIT(barrier)
#define THREAD_BARRIER_DESTROY(barrier)
#endif #endif
@ -6749,10 +6739,6 @@ main(int argc, char **argv)
{ {
exit(1); exit(1);
} }
#ifndef ENABLE_THREAD_SAFETY
if (nthreads != 1)
pg_fatal("threads are not supported on this platform; use -j1");
#endif /* !ENABLE_THREAD_SAFETY */
break; break;
case 'l': case 'l':
benchmarking_option_set = true; benchmarking_option_set = true;
@ -7236,7 +7222,6 @@ main(int argc, char **argv)
if (errno != 0) if (errno != 0)
pg_fatal("could not initialize barrier: %m"); pg_fatal("could not initialize barrier: %m");
#ifdef ENABLE_THREAD_SAFETY
/* start all threads but thread 0 which is executed directly later */ /* start all threads but thread 0 which is executed directly later */
for (i = 1; i < nthreads; i++) for (i = 1; i < nthreads; i++)
{ {
@ -7248,9 +7233,6 @@ main(int argc, char **argv)
if (errno != 0) if (errno != 0)
pg_fatal("could not create thread: %m"); pg_fatal("could not create thread: %m");
} }
#else
Assert(nthreads == 1);
#endif /* ENABLE_THREAD_SAFETY */
/* compute when to stop */ /* compute when to stop */
threads[0].create_time = pg_time_now(); threads[0].create_time = pg_time_now();
@ -7268,10 +7250,8 @@ main(int argc, char **argv)
{ {
TState *thread = &threads[i]; TState *thread = &threads[i];
#ifdef ENABLE_THREAD_SAFETY
if (i > 0) if (i > 0)
THREAD_JOIN(thread->thread); THREAD_JOIN(thread->thread);
#endif /* ENABLE_THREAD_SAFETY */
for (int j = 0; j < thread->nstate; j++) for (int j = 0; j < thread->nstate; j++)
if (thread->state[j].state != CSTATE_FINISHED) if (thread->state[j].state != CSTATE_FINISHED)

View File

@ -51,10 +51,6 @@
/* Define to 1 if you want National Language Support. (--enable-nls) */ /* Define to 1 if you want National Language Support. (--enable-nls) */
#undef ENABLE_NLS #undef ENABLE_NLS
/* Define to 1 to build client libraries as thread-safe code.
(--enable-thread-safety) */
#undef ENABLE_THREAD_SAFETY
/* Define to 1 if you have the `append_history' function. */ /* Define to 1 if you have the `append_history' function. */
#undef HAVE_APPEND_HISTORY #undef HAVE_APPEND_HISTORY

View File

@ -14,15 +14,12 @@
locale_t ecpg_clocale = (locale_t) 0; locale_t ecpg_clocale = (locale_t) 0;
#endif #endif
#ifdef ENABLE_THREAD_SAFETY
static pthread_mutex_t connections_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t connections_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_key_t actual_connection_key; static pthread_key_t actual_connection_key;
static pthread_once_t actual_connection_key_once = PTHREAD_ONCE_INIT; static pthread_once_t actual_connection_key_once = PTHREAD_ONCE_INIT;
#endif
static struct connection *actual_connection = NULL; static struct connection *actual_connection = NULL;
static struct connection *all_connections = NULL; static struct connection *all_connections = NULL;
#ifdef ENABLE_THREAD_SAFETY
static void static void
ecpg_actual_connection_init(void) ecpg_actual_connection_init(void)
{ {
@ -34,7 +31,6 @@ ecpg_pthreads_init(void)
{ {
pthread_once(&actual_connection_key_once, ecpg_actual_connection_init); pthread_once(&actual_connection_key_once, ecpg_actual_connection_init);
} }
#endif
static struct connection * static struct connection *
ecpg_get_connection_nr(const char *connection_name) ecpg_get_connection_nr(const char *connection_name)
@ -43,7 +39,6 @@ ecpg_get_connection_nr(const char *connection_name)
if ((connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0)) if ((connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0))
{ {
#ifdef ENABLE_THREAD_SAFETY
ecpg_pthreads_init(); /* ensure actual_connection_key is valid */ ecpg_pthreads_init(); /* ensure actual_connection_key is valid */
ret = pthread_getspecific(actual_connection_key); ret = pthread_getspecific(actual_connection_key);
@ -56,9 +51,6 @@ ecpg_get_connection_nr(const char *connection_name)
if (ret == NULL) if (ret == NULL)
/* no TSD connection, going for global */ /* no TSD connection, going for global */
ret = actual_connection; ret = actual_connection;
#else
ret = actual_connection;
#endif
} }
else else
{ {
@ -82,7 +74,6 @@ ecpg_get_connection(const char *connection_name)
if ((connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0)) if ((connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0))
{ {
#ifdef ENABLE_THREAD_SAFETY
ecpg_pthreads_init(); /* ensure actual_connection_key is valid */ ecpg_pthreads_init(); /* ensure actual_connection_key is valid */
ret = pthread_getspecific(actual_connection_key); ret = pthread_getspecific(actual_connection_key);
@ -95,21 +86,14 @@ ecpg_get_connection(const char *connection_name)
if (ret == NULL) if (ret == NULL)
/* no TSD connection here either, using global */ /* no TSD connection here either, using global */
ret = actual_connection; ret = actual_connection;
#else
ret = actual_connection;
#endif
} }
else else
{ {
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_lock(&connections_mutex); pthread_mutex_lock(&connections_mutex);
#endif
ret = ecpg_get_connection_nr(connection_name); ret = ecpg_get_connection_nr(connection_name);
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&connections_mutex); pthread_mutex_unlock(&connections_mutex);
#endif
} }
return ret; return ret;
@ -143,10 +127,8 @@ ecpg_finish(struct connection *act)
con->next = act->next; con->next = act->next;
} }
#ifdef ENABLE_THREAD_SAFETY
if (pthread_getspecific(actual_connection_key) == act) if (pthread_getspecific(actual_connection_key) == act)
pthread_setspecific(actual_connection_key, all_connections); pthread_setspecific(actual_connection_key, all_connections);
#endif
if (actual_connection == act) if (actual_connection == act)
actual_connection = all_connections; actual_connection = all_connections;
@ -212,11 +194,7 @@ ECPGsetconn(int lineno, const char *connection_name)
if (!ecpg_init(con, connection_name, lineno)) if (!ecpg_init(con, connection_name, lineno))
return false; return false;
#ifdef ENABLE_THREAD_SAFETY
pthread_setspecific(actual_connection_key, con); pthread_setspecific(actual_connection_key, con);
#else
actual_connection = con;
#endif
return true; return true;
} }
@ -326,9 +304,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
if (dbname == NULL && connection_name == NULL) if (dbname == NULL && connection_name == NULL)
connection_name = "DEFAULT"; connection_name = "DEFAULT";
#if ENABLE_THREAD_SAFETY
ecpg_pthreads_init(); ecpg_pthreads_init();
#endif
/* check if the identifier is unique */ /* check if the identifier is unique */
if (ecpg_get_connection(connection_name)) if (ecpg_get_connection(connection_name))
@ -505,9 +481,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
} }
/* add connection to our list */ /* add connection to our list */
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_lock(&connections_mutex); pthread_mutex_lock(&connections_mutex);
#endif
/* /*
* ... but first, make certain we have created ecpg_clocale. Rely on * ... but first, make certain we have created ecpg_clocale. Rely on
@ -519,9 +493,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
ecpg_clocale = newlocale(LC_NUMERIC_MASK, "C", (locale_t) 0); ecpg_clocale = newlocale(LC_NUMERIC_MASK, "C", (locale_t) 0);
if (!ecpg_clocale) if (!ecpg_clocale)
{ {
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&connections_mutex); pthread_mutex_unlock(&connections_mutex);
#endif
ecpg_raise(lineno, ECPG_OUT_OF_MEMORY, ecpg_raise(lineno, ECPG_OUT_OF_MEMORY,
ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL); ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL);
if (host) if (host)
@ -558,9 +530,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
this->next = all_connections; this->next = all_connections;
all_connections = this; all_connections = this;
#ifdef ENABLE_THREAD_SAFETY
pthread_setspecific(actual_connection_key, all_connections); pthread_setspecific(actual_connection_key, all_connections);
#endif
actual_connection = all_connections; actual_connection = all_connections;
ecpg_log("ECPGconnect: opening database %s on %s port %s %s%s %s%s\n", ecpg_log("ECPGconnect: opening database %s on %s port %s %s%s %s%s\n",
@ -678,9 +648,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
ecpg_log("ECPGconnect: %s", errmsg); ecpg_log("ECPGconnect: %s", errmsg);
ecpg_finish(this); ecpg_finish(this);
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&connections_mutex); pthread_mutex_unlock(&connections_mutex);
#endif
ecpg_raise(lineno, ECPG_CONNECT, ECPG_SQLSTATE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION, db); ecpg_raise(lineno, ECPG_CONNECT, ECPG_SQLSTATE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION, db);
if (realname) if (realname)
@ -692,9 +660,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
if (realname) if (realname)
ecpg_free(realname); ecpg_free(realname);
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&connections_mutex); pthread_mutex_unlock(&connections_mutex);
#endif
this->autocommit = autocommit; this->autocommit = autocommit;
@ -716,9 +682,7 @@ ECPGdisconnect(int lineno, const char *connection_name)
return false; return false;
} }
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_lock(&connections_mutex); pthread_mutex_lock(&connections_mutex);
#endif
if (strcmp(connection_name, "ALL") == 0) if (strcmp(connection_name, "ALL") == 0)
{ {
@ -737,18 +701,14 @@ ECPGdisconnect(int lineno, const char *connection_name)
if (!ecpg_init(con, connection_name, lineno)) if (!ecpg_init(con, connection_name, lineno))
{ {
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&connections_mutex); pthread_mutex_unlock(&connections_mutex);
#endif
return false; return false;
} }
else else
ecpg_finish(con); ecpg_finish(con);
} }
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&connections_mutex); pthread_mutex_unlock(&connections_mutex);
#endif
return true; return true;
} }

View File

@ -19,7 +19,6 @@
static void descriptor_free(struct descriptor *desc); static void descriptor_free(struct descriptor *desc);
/* We manage descriptors separately for each thread. */ /* We manage descriptors separately for each thread. */
#ifdef ENABLE_THREAD_SAFETY
static pthread_key_t descriptor_key; static pthread_key_t descriptor_key;
static pthread_once_t descriptor_once = PTHREAD_ONCE_INIT; static pthread_once_t descriptor_once = PTHREAD_ONCE_INIT;
@ -49,12 +48,6 @@ set_descriptors(struct descriptor *value)
{ {
pthread_setspecific(descriptor_key, value); pthread_setspecific(descriptor_key, value);
} }
#else
static struct descriptor *all_descriptors = NULL;
#define get_descriptors() (all_descriptors)
#define set_descriptors(value) do { all_descriptors = (value); } while(0)
#endif
/* old internal convenience function that might go away later */ /* old internal convenience function that might go away later */
static PGresult * static PGresult *
@ -782,8 +775,6 @@ ECPGdeallocate_desc(int line, const char *name)
return false; return false;
} }
#ifdef ENABLE_THREAD_SAFETY
/* Deallocate all descriptors in the list */ /* Deallocate all descriptors in the list */
static void static void
descriptor_deallocate_all(struct descriptor *list) descriptor_deallocate_all(struct descriptor *list)
@ -796,7 +787,6 @@ descriptor_deallocate_all(struct descriptor *list)
list = next; list = next;
} }
} }
#endif /* ENABLE_THREAD_SAFETY */
bool bool
ECPGallocate_desc(int line, const char *name) ECPGallocate_desc(int line, const char *name)

View File

@ -169,9 +169,7 @@ bool ecpg_get_data(const PGresult *, int, int, int, enum ECPGttype type,
enum ECPGttype, char *, char *, long, long, long, enum ECPGttype, char *, char *, long, long, long,
enum ARRAY_TYPE, enum COMPAT_MODE, bool); enum ARRAY_TYPE, enum COMPAT_MODE, bool);
#ifdef ENABLE_THREAD_SAFETY
void ecpg_pthreads_init(void); void ecpg_pthreads_init(void);
#endif
struct connection *ecpg_get_connection(const char *connection_name); struct connection *ecpg_get_connection(const char *connection_name);
char *ecpg_alloc(long size, int lineno); char *ecpg_alloc(long size, int lineno);
char *ecpg_auto_alloc(long size, int lineno); char *ecpg_auto_alloc(long size, int lineno);

View File

@ -1961,9 +1961,7 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator,
return false; return false;
} }
#ifdef ENABLE_THREAD_SAFETY
ecpg_pthreads_init(); ecpg_pthreads_init();
#endif
con = ecpg_get_connection(connection_name); con = ecpg_get_connection(connection_name);

View File

@ -68,7 +68,6 @@ struct auto_mem
struct auto_mem *next; struct auto_mem *next;
}; };
#ifdef ENABLE_THREAD_SAFETY
static pthread_key_t auto_mem_key; static pthread_key_t auto_mem_key;
static pthread_once_t auto_mem_once = PTHREAD_ONCE_INIT; static pthread_once_t auto_mem_once = PTHREAD_ONCE_INIT;
@ -97,12 +96,6 @@ set_auto_allocs(struct auto_mem *am)
{ {
pthread_setspecific(auto_mem_key, am); pthread_setspecific(auto_mem_key, am);
} }
#else
static struct auto_mem *auto_allocs = NULL;
#define get_auto_allocs() (auto_allocs)
#define set_auto_allocs(am) do { auto_allocs = (am); } while(0)
#endif
char * char *
ecpg_auto_alloc(long size, int lineno) ecpg_auto_alloc(long size, int lineno)

View File

@ -55,42 +55,11 @@ static struct sqlca_t sqlca_init =
} }
}; };
#ifdef ENABLE_THREAD_SAFETY
static pthread_key_t sqlca_key; static pthread_key_t sqlca_key;
static pthread_once_t sqlca_key_once = PTHREAD_ONCE_INIT; static pthread_once_t sqlca_key_once = PTHREAD_ONCE_INIT;
#else
static struct sqlca_t sqlca =
{
{
'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '
},
sizeof(struct sqlca_t),
0,
{
0,
{
0
}
},
{
'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '
},
{
0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0
},
{
'0', '0', '0', '0', '0'
}
};
#endif
#ifdef ENABLE_THREAD_SAFETY
static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t debug_init_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t debug_init_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
static int simple_debug = 0; static int simple_debug = 0;
static FILE *debugstream = NULL; static FILE *debugstream = NULL;
@ -123,7 +92,6 @@ ecpg_init(const struct connection *con, const char *connection_name, const int l
return true; return true;
} }
#ifdef ENABLE_THREAD_SAFETY
static void static void
ecpg_sqlca_key_destructor(void *arg) ecpg_sqlca_key_destructor(void *arg)
{ {
@ -135,12 +103,10 @@ ecpg_sqlca_key_init(void)
{ {
pthread_key_create(&sqlca_key, ecpg_sqlca_key_destructor); pthread_key_create(&sqlca_key, ecpg_sqlca_key_destructor);
} }
#endif
struct sqlca_t * struct sqlca_t *
ECPGget_sqlca(void) ECPGget_sqlca(void)
{ {
#ifdef ENABLE_THREAD_SAFETY
struct sqlca_t *sqlca; struct sqlca_t *sqlca;
pthread_once(&sqlca_key_once, ecpg_sqlca_key_init); pthread_once(&sqlca_key_once, ecpg_sqlca_key_init);
@ -155,9 +121,6 @@ ECPGget_sqlca(void)
pthread_setspecific(sqlca_key, sqlca); pthread_setspecific(sqlca_key, sqlca);
} }
return sqlca; return sqlca;
#else
return &sqlca;
#endif
} }
bool bool
@ -240,9 +203,7 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
void void
ECPGdebug(int n, FILE *dbgs) ECPGdebug(int n, FILE *dbgs)
{ {
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_lock(&debug_init_mutex); pthread_mutex_lock(&debug_init_mutex);
#endif
if (n > 100) if (n > 100)
{ {
@ -256,9 +217,7 @@ ECPGdebug(int n, FILE *dbgs)
ecpg_log("ECPGdebug: set to %d\n", simple_debug); ecpg_log("ECPGdebug: set to %d\n", simple_debug);
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&debug_init_mutex); pthread_mutex_unlock(&debug_init_mutex);
#endif
} }
void void
@ -290,9 +249,7 @@ ecpg_log(const char *format,...)
else else
snprintf(fmt, bufsize, "[%d]: %s", (int) getpid(), intl_format); snprintf(fmt, bufsize, "[%d]: %s", (int) getpid(), intl_format);
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_lock(&debug_mutex); pthread_mutex_lock(&debug_mutex);
#endif
va_start(ap, format); va_start(ap, format);
vfprintf(debugstream, fmt, ap); vfprintf(debugstream, fmt, ap);
@ -307,9 +264,7 @@ ecpg_log(const char *format,...)
fflush(debugstream); fflush(debugstream);
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&debug_mutex); pthread_mutex_unlock(&debug_mutex);
#endif
free(fmt); free(fmt);
} }
@ -451,7 +406,6 @@ ECPGis_noind_null(enum ECPGttype type, const void *ptr)
} }
#ifdef WIN32 #ifdef WIN32
#ifdef ENABLE_THREAD_SAFETY
void void
win32_pthread_mutex(volatile pthread_mutex_t *mutex) win32_pthread_mutex(volatile pthread_mutex_t *mutex)
@ -482,7 +436,6 @@ win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void))
pthread_mutex_unlock(&win32_pthread_once_lock); pthread_mutex_unlock(&win32_pthread_once_lock);
} }
} }
#endif /* ENABLE_THREAD_SAFETY */
#endif /* WIN32 */ #endif /* WIN32 */
#ifdef ENABLE_NLS #ifdef ENABLE_NLS

View File

@ -5,8 +5,6 @@
#ifndef _ECPG_PTHREAD_WIN32_H #ifndef _ECPG_PTHREAD_WIN32_H
#define _ECPG_PTHREAD_WIN32_H #define _ECPG_PTHREAD_WIN32_H
#ifdef ENABLE_THREAD_SAFETY
#ifndef WIN32 #ifndef WIN32
#include <pthread.h> #include <pthread.h>
@ -53,6 +51,5 @@ void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void));
win32_pthread_once((once), (fn)); \ win32_pthread_once((once), (fn)); \
} while(0) } while(0)
#endif /* WIN32 */ #endif /* WIN32 */
#endif /* ENABLE_THREAD_SAFETY */
#endif /* _ECPG_PTHREAD_WIN32_H */ #endif /* _ECPG_PTHREAD_WIN32_H */

View File

@ -1,6 +1,5 @@
/* Define to 1 to build client libraries as thread-safe code. /* Define to 1 to build client libraries as thread-safe code. */
* (--enable-thread-safety) */ #define ENABLE_THREAD_SAFETY 1
#undef ENABLE_THREAD_SAFETY
/* Define to 1 if the system has the type `int64'. */ /* Define to 1 if the system has the type `int64'. */
#undef HAVE_INT64 #undef HAVE_INT64

View File

@ -98,9 +98,7 @@ void *ECPGget_var(int number);
/* dynamic result allocation */ /* dynamic result allocation */
void ECPGfree_auto_mem(void); void ECPGfree_auto_mem(void);
#ifdef ENABLE_THREAD_SAFETY
void ecpg_pthreads_init(void); void ecpg_pthreads_init(void);
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -3,7 +3,6 @@
ecpg_inc = include_directories('.') ecpg_inc = include_directories('.')
ecpg_conf_keys = [ ecpg_conf_keys = [
'ENABLE_THREAD_SAFETY',
'HAVE_INT64', 'HAVE_INT64',
'HAVE_LONG_INT_64', 'HAVE_LONG_INT_64',
'HAVE_LONG_LONG_INT_64', 'HAVE_LONG_LONG_INT_64',
@ -12,6 +11,8 @@ ecpg_conf_keys = [
ecpg_conf_data = configuration_data() ecpg_conf_data = configuration_data()
ecpg_conf_data.set('ENABLE_THREAD_SAFETY', 1)
foreach key : ecpg_conf_keys foreach key : ecpg_conf_keys
if cdata.has(key) if cdata.has(key)
ecpg_conf_data.set(key, cdata.get(key)) ecpg_conf_data.set(key, cdata.get(key))

View File

@ -11,14 +11,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifdef WIN32 #ifdef WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -101,7 +93,7 @@ struct sqlca_t *ECPGget_sqlca(void);
#endif #endif
#line 26 "alloc.pgc" #line 18 "alloc.pgc"
#line 1 "regression.h" #line 1 "regression.h"
@ -111,14 +103,14 @@ struct sqlca_t *ECPGget_sqlca(void);
#line 27 "alloc.pgc" #line 19 "alloc.pgc"
/* exec sql whenever sqlerror sqlprint ; */ /* exec sql whenever sqlerror sqlprint ; */
#line 29 "alloc.pgc" #line 21 "alloc.pgc"
/* exec sql whenever not found sqlprint ; */ /* exec sql whenever not found sqlprint ; */
#line 30 "alloc.pgc" #line 22 "alloc.pgc"
#ifdef WIN32 #ifdef WIN32
@ -134,54 +126,54 @@ static void* fn(void* arg)
#line 41 "alloc.pgc" #line 33 "alloc.pgc"
int value ; int value ;
#line 42 "alloc.pgc" #line 34 "alloc.pgc"
char name [ 100 ] ; char name [ 100 ] ;
#line 43 "alloc.pgc" #line 35 "alloc.pgc"
char ** r = NULL ; char ** r = NULL ;
/* exec sql end declare section */ /* exec sql end declare section */
#line 44 "alloc.pgc" #line 36 "alloc.pgc"
value = (intptr_t) arg; value = (intptr_t) arg;
sprintf(name, "Connection: %d", value); sprintf(name, "Connection: %d", value);
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0);
#line 49 "alloc.pgc" #line 41 "alloc.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 49 "alloc.pgc" #line 41 "alloc.pgc"
{ ECPGsetcommit(__LINE__, "on", NULL); { ECPGsetcommit(__LINE__, "on", NULL);
#line 50 "alloc.pgc" #line 42 "alloc.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 50 "alloc.pgc" #line 42 "alloc.pgc"
for (i = 1; i <= REPEATS; ++i) for (i = 1; i <= REPEATS; ++i)
{ {
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select relname from pg_class where relname = 'pg_class'", ECPGt_EOIT, { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select relname from pg_class where relname = 'pg_class'", ECPGt_EOIT,
ECPGt_char,&(r),(long)0,(long)0,(1)*sizeof(char), ECPGt_char,&(r),(long)0,(long)0,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 53 "alloc.pgc" #line 45 "alloc.pgc"
if (sqlca.sqlcode == ECPG_NOT_FOUND) sqlprint(); if (sqlca.sqlcode == ECPG_NOT_FOUND) sqlprint();
#line 53 "alloc.pgc" #line 45 "alloc.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 53 "alloc.pgc" #line 45 "alloc.pgc"
free(r); free(r);
r = NULL; r = NULL;
} }
{ ECPGdisconnect(__LINE__, name); { ECPGdisconnect(__LINE__, name);
#line 57 "alloc.pgc" #line 49 "alloc.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 57 "alloc.pgc" #line 49 "alloc.pgc"
return 0; return 0;
@ -215,4 +207,3 @@ int main ()
return 0; return 0;
} }
#endif

View File

@ -7,7 +7,6 @@
#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
#line 1 "descriptor.pgc" #line 1 "descriptor.pgc"
#ifdef ENABLE_THREAD_SAFETY
#ifdef WIN32 #ifdef WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -16,7 +15,6 @@
#else #else
#include <pthread.h> #include <pthread.h>
#endif #endif
#endif
#include <stdio.h> #include <stdio.h>
#define THREADS 16 #define THREADS 16
@ -91,16 +89,16 @@ struct sqlca_t *ECPGget_sqlca(void);
#endif #endif
#line 16 "descriptor.pgc" #line 14 "descriptor.pgc"
/* exec sql whenever sqlerror sqlprint ; */ /* exec sql whenever sqlerror sqlprint ; */
#line 17 "descriptor.pgc" #line 15 "descriptor.pgc"
/* exec sql whenever not found sqlprint ; */ /* exec sql whenever not found sqlprint ; */
#line 18 "descriptor.pgc" #line 16 "descriptor.pgc"
#if defined(ENABLE_THREAD_SAFETY) && defined(WIN32) #if defined(WIN32)
static unsigned __stdcall fn(void* arg) static unsigned __stdcall fn(void* arg)
#else #else
static void* fn(void* arg) static void* fn(void* arg)
@ -111,16 +109,16 @@ static void* fn(void* arg)
for (i = 1; i <= REPEATS; ++i) for (i = 1; i <= REPEATS; ++i)
{ {
ECPGallocate_desc(__LINE__, "mydesc"); ECPGallocate_desc(__LINE__, "mydesc");
#line 30 "descriptor.pgc" #line 28 "descriptor.pgc"
if (sqlca.sqlcode < 0) sqlprint(); if (sqlca.sqlcode < 0) sqlprint();
#line 30 "descriptor.pgc" #line 28 "descriptor.pgc"
ECPGdeallocate_desc(__LINE__, "mydesc"); ECPGdeallocate_desc(__LINE__, "mydesc");
#line 31 "descriptor.pgc" #line 29 "descriptor.pgc"
if (sqlca.sqlcode < 0) sqlprint(); if (sqlca.sqlcode < 0) sqlprint();
#line 31 "descriptor.pgc" #line 29 "descriptor.pgc"
} }
@ -129,7 +127,6 @@ if (sqlca.sqlcode < 0) sqlprint();
int main () int main ()
{ {
#ifdef ENABLE_THREAD_SAFETY
int i; int i;
#ifdef WIN32 #ifdef WIN32
HANDLE threads[THREADS]; HANDLE threads[THREADS];
@ -153,9 +150,6 @@ int main ()
for (i = 0; i < THREADS; ++i) for (i = 0; i < THREADS; ++i)
pthread_join(threads[i], NULL); pthread_join(threads[i], NULL);
#endif #endif
#else
fn(NULL);
#endif
return 0; return 0;
} }

View File

@ -11,14 +11,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifdef WIN32 #ifdef WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -101,7 +93,7 @@ struct sqlca_t *ECPGget_sqlca(void);
#endif #endif
#line 26 "prep.pgc" #line 18 "prep.pgc"
#line 1 "regression.h" #line 1 "regression.h"
@ -111,14 +103,14 @@ struct sqlca_t *ECPGget_sqlca(void);
#line 27 "prep.pgc" #line 19 "prep.pgc"
/* exec sql whenever sqlerror sqlprint ; */ /* exec sql whenever sqlerror sqlprint ; */
#line 29 "prep.pgc" #line 21 "prep.pgc"
/* exec sql whenever not found sqlprint ; */ /* exec sql whenever not found sqlprint ; */
#line 30 "prep.pgc" #line 22 "prep.pgc"
#ifdef WIN32 #ifdef WIN32
@ -134,64 +126,64 @@ static void* fn(void* arg)
#line 41 "prep.pgc" #line 33 "prep.pgc"
int value ; int value ;
#line 42 "prep.pgc" #line 34 "prep.pgc"
char name [ 100 ] ; char name [ 100 ] ;
#line 43 "prep.pgc" #line 35 "prep.pgc"
char query [ 256 ] = "INSERT INTO T VALUES ( ? )" ; char query [ 256 ] = "INSERT INTO T VALUES ( ? )" ;
/* exec sql end declare section */ /* exec sql end declare section */
#line 44 "prep.pgc" #line 36 "prep.pgc"
value = (intptr_t) arg; value = (intptr_t) arg;
sprintf(name, "Connection: %d", value); sprintf(name, "Connection: %d", value);
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0);
#line 49 "prep.pgc" #line 41 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 49 "prep.pgc" #line 41 "prep.pgc"
{ ECPGsetcommit(__LINE__, "on", NULL); { ECPGsetcommit(__LINE__, "on", NULL);
#line 50 "prep.pgc" #line 42 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 50 "prep.pgc" #line 42 "prep.pgc"
for (i = 1; i <= REPEATS; ++i) for (i = 1; i <= REPEATS; ++i)
{ {
{ ECPGprepare(__LINE__, NULL, 0, "i", query); { ECPGprepare(__LINE__, NULL, 0, "i", query);
#line 53 "prep.pgc" #line 45 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 53 "prep.pgc" #line 45 "prep.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "i", { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "i",
ECPGt_int,&(value),(long)1,(long)1,sizeof(int), ECPGt_int,&(value),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 54 "prep.pgc" #line 46 "prep.pgc"
if (sqlca.sqlcode == ECPG_NOT_FOUND) sqlprint(); if (sqlca.sqlcode == ECPG_NOT_FOUND) sqlprint();
#line 54 "prep.pgc" #line 46 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 54 "prep.pgc" #line 46 "prep.pgc"
} }
{ ECPGdeallocate(__LINE__, 0, NULL, "i"); { ECPGdeallocate(__LINE__, 0, NULL, "i");
#line 56 "prep.pgc" #line 48 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 56 "prep.pgc" #line 48 "prep.pgc"
{ ECPGdisconnect(__LINE__, name); { ECPGdisconnect(__LINE__, name);
#line 57 "prep.pgc" #line 49 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 57 "prep.pgc" #line 49 "prep.pgc"
return 0; return 0;
@ -207,34 +199,34 @@ int main ()
#endif #endif
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0);
#line 71 "prep.pgc" #line 63 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 71 "prep.pgc" #line 63 "prep.pgc"
{ ECPGsetcommit(__LINE__, "on", NULL); { ECPGsetcommit(__LINE__, "on", NULL);
#line 72 "prep.pgc" #line 64 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "prep.pgc" #line 64 "prep.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table if exists T", ECPGt_EOIT, ECPGt_EORT); { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table if exists T", ECPGt_EOIT, ECPGt_EORT);
#line 73 "prep.pgc" #line 65 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 73 "prep.pgc" #line 65 "prep.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table T ( i int )", ECPGt_EOIT, ECPGt_EORT); { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table T ( i int )", ECPGt_EOIT, ECPGt_EORT);
#line 74 "prep.pgc" #line 66 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 74 "prep.pgc" #line 66 "prep.pgc"
{ ECPGdisconnect(__LINE__, "CURRENT"); { ECPGdisconnect(__LINE__, "CURRENT");
#line 75 "prep.pgc" #line 67 "prep.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 75 "prep.pgc" #line 67 "prep.pgc"
#ifdef WIN32 #ifdef WIN32
@ -256,4 +248,3 @@ if (sqlca.sqlcode < 0) sqlprint();}
return 0; return 0;
} }
#endif

View File

@ -15,14 +15,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifndef WIN32 #ifndef WIN32
#include <pthread.h> #include <pthread.h>
#else #else
@ -38,7 +30,7 @@ main(void)
#line 24 "thread.pgc" #line 16 "thread.pgc"
void *test_thread(void *arg); void *test_thread(void *arg);
@ -57,10 +49,10 @@ int main()
/* exec sql begin declare section */ /* exec sql begin declare section */
#line 40 "thread.pgc" #line 32 "thread.pgc"
int l_rows ; int l_rows ;
/* exec sql end declare section */ /* exec sql end declare section */
#line 41 "thread.pgc" #line 33 "thread.pgc"
/* Do not switch on debug output for regression tests. The threads get executed in /* Do not switch on debug output for regression tests. The threads get executed in
@ -69,22 +61,22 @@ int main()
/* setup test_thread table */ /* setup test_thread table */
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); }
#line 48 "thread.pgc" #line 40 "thread.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table test_thread", ECPGt_EOIT, ECPGt_EORT);} { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table test_thread", ECPGt_EOIT, ECPGt_EORT);}
#line 49 "thread.pgc" #line 41 "thread.pgc"
/* DROP might fail */ /* DROP might fail */
{ ECPGtrans(__LINE__, NULL, "commit");} { ECPGtrans(__LINE__, NULL, "commit");}
#line 50 "thread.pgc" #line 42 "thread.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test_thread ( tstamp timestamp not null default cast ( timeofday ( ) as timestamp ) , thread text not null , iteration integer not null , primary key ( thread , iteration ) )", ECPGt_EOIT, ECPGt_EORT);} { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test_thread ( tstamp timestamp not null default cast ( timeofday ( ) as timestamp ) , thread text not null , iteration integer not null , primary key ( thread , iteration ) )", ECPGt_EOIT, ECPGt_EORT);}
#line 55 "thread.pgc" #line 47 "thread.pgc"
{ ECPGtrans(__LINE__, NULL, "commit");} { ECPGtrans(__LINE__, NULL, "commit");}
#line 56 "thread.pgc" #line 48 "thread.pgc"
{ ECPGdisconnect(__LINE__, "CURRENT");} { ECPGdisconnect(__LINE__, "CURRENT");}
#line 57 "thread.pgc" #line 49 "thread.pgc"
/* create, and start, threads */ /* create, and start, threads */
@ -116,18 +108,18 @@ int main()
/* and check results */ /* and check results */
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); }
#line 87 "thread.pgc" #line 79 "thread.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count ( * ) from test_thread", ECPGt_EOIT, { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count ( * ) from test_thread", ECPGt_EOIT,
ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int), ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
#line 88 "thread.pgc" #line 80 "thread.pgc"
{ ECPGtrans(__LINE__, NULL, "commit");} { ECPGtrans(__LINE__, NULL, "commit");}
#line 89 "thread.pgc" #line 81 "thread.pgc"
{ ECPGdisconnect(__LINE__, "CURRENT");} { ECPGdisconnect(__LINE__, "CURRENT");}
#line 90 "thread.pgc" #line 82 "thread.pgc"
if( l_rows == (nthreads * iterations) ) if( l_rows == (nthreads * iterations) )
printf("Success.\n"); printf("Success.\n");
@ -145,13 +137,13 @@ void *test_thread(void *arg)
#line 104 "thread.pgc" #line 96 "thread.pgc"
int l_i ; int l_i ;
#line 105 "thread.pgc" #line 97 "thread.pgc"
char l_connection [ 128 ] ; char l_connection [ 128 ] ;
/* exec sql end declare section */ /* exec sql end declare section */
#line 106 "thread.pgc" #line 98 "thread.pgc"
/* build up connection name, and connect to database */ /* build up connection name, and connect to database */
@ -161,13 +153,13 @@ void *test_thread(void *arg)
_snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum); _snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum);
#endif #endif
/* exec sql whenever sqlerror sqlprint ; */ /* exec sql whenever sqlerror sqlprint ; */
#line 114 "thread.pgc" #line 106 "thread.pgc"
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , l_connection, 0); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , l_connection, 0);
#line 115 "thread.pgc" #line 107 "thread.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 115 "thread.pgc" #line 107 "thread.pgc"
if( sqlca.sqlcode != 0 ) if( sqlca.sqlcode != 0 )
{ {
@ -175,10 +167,10 @@ if (sqlca.sqlcode < 0) sqlprint();}
return NULL; return NULL;
} }
{ ECPGtrans(__LINE__, l_connection, "begin"); { ECPGtrans(__LINE__, l_connection, "begin");
#line 121 "thread.pgc" #line 113 "thread.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 121 "thread.pgc" #line 113 "thread.pgc"
/* insert into test_thread table */ /* insert into test_thread table */
@ -189,10 +181,10 @@ if (sqlca.sqlcode < 0) sqlprint();}
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int), ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 126 "thread.pgc" #line 118 "thread.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 126 "thread.pgc" #line 118 "thread.pgc"
if( sqlca.sqlcode != 0 ) if( sqlca.sqlcode != 0 )
printf("%s: ERROR: insert failed!\n", l_connection); printf("%s: ERROR: insert failed!\n", l_connection);
@ -200,17 +192,16 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* all done */ /* all done */
{ ECPGtrans(__LINE__, l_connection, "commit"); { ECPGtrans(__LINE__, l_connection, "commit");
#line 132 "thread.pgc" #line 124 "thread.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 132 "thread.pgc" #line 124 "thread.pgc"
{ ECPGdisconnect(__LINE__, l_connection); { ECPGdisconnect(__LINE__, l_connection);
#line 133 "thread.pgc" #line 125 "thread.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 133 "thread.pgc" #line 125 "thread.pgc"
return NULL; return NULL;
} }
#endif /* ENABLE_THREAD_SAFETY */

View File

@ -15,14 +15,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifndef WIN32 #ifndef WIN32
#include <pthread.h> #include <pthread.h>
#else #else
@ -38,7 +30,7 @@ main(void)
#line 24 "thread_implicit.pgc" #line 16 "thread_implicit.pgc"
void *test_thread(void *arg); void *test_thread(void *arg);
@ -57,10 +49,10 @@ int main()
/* exec sql begin declare section */ /* exec sql begin declare section */
#line 40 "thread_implicit.pgc" #line 32 "thread_implicit.pgc"
int l_rows ; int l_rows ;
/* exec sql end declare section */ /* exec sql end declare section */
#line 41 "thread_implicit.pgc" #line 33 "thread_implicit.pgc"
/* Do not switch on debug output for regression tests. The threads get executed in /* Do not switch on debug output for regression tests. The threads get executed in
@ -69,22 +61,22 @@ int main()
/* setup test_thread table */ /* setup test_thread table */
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); }
#line 48 "thread_implicit.pgc" #line 40 "thread_implicit.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table test_thread", ECPGt_EOIT, ECPGt_EORT);} { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table test_thread", ECPGt_EOIT, ECPGt_EORT);}
#line 49 "thread_implicit.pgc" #line 41 "thread_implicit.pgc"
/* DROP might fail */ /* DROP might fail */
{ ECPGtrans(__LINE__, NULL, "commit");} { ECPGtrans(__LINE__, NULL, "commit");}
#line 50 "thread_implicit.pgc" #line 42 "thread_implicit.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test_thread ( tstamp timestamp not null default cast ( timeofday ( ) as timestamp ) , thread text not null , iteration integer not null , primary key ( thread , iteration ) )", ECPGt_EOIT, ECPGt_EORT);} { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test_thread ( tstamp timestamp not null default cast ( timeofday ( ) as timestamp ) , thread text not null , iteration integer not null , primary key ( thread , iteration ) )", ECPGt_EOIT, ECPGt_EORT);}
#line 55 "thread_implicit.pgc" #line 47 "thread_implicit.pgc"
{ ECPGtrans(__LINE__, NULL, "commit");} { ECPGtrans(__LINE__, NULL, "commit");}
#line 56 "thread_implicit.pgc" #line 48 "thread_implicit.pgc"
{ ECPGdisconnect(__LINE__, "CURRENT");} { ECPGdisconnect(__LINE__, "CURRENT");}
#line 57 "thread_implicit.pgc" #line 49 "thread_implicit.pgc"
/* create, and start, threads */ /* create, and start, threads */
@ -116,18 +108,18 @@ int main()
/* and check results */ /* and check results */
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); }
#line 87 "thread_implicit.pgc" #line 79 "thread_implicit.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count ( * ) from test_thread", ECPGt_EOIT, { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count ( * ) from test_thread", ECPGt_EOIT,
ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int), ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
#line 88 "thread_implicit.pgc" #line 80 "thread_implicit.pgc"
{ ECPGtrans(__LINE__, NULL, "commit");} { ECPGtrans(__LINE__, NULL, "commit");}
#line 89 "thread_implicit.pgc" #line 81 "thread_implicit.pgc"
{ ECPGdisconnect(__LINE__, "CURRENT");} { ECPGdisconnect(__LINE__, "CURRENT");}
#line 90 "thread_implicit.pgc" #line 82 "thread_implicit.pgc"
if( l_rows == (nthreads * iterations) ) if( l_rows == (nthreads * iterations) )
printf("Success.\n"); printf("Success.\n");
@ -145,13 +137,13 @@ void *test_thread(void *arg)
#line 104 "thread_implicit.pgc" #line 96 "thread_implicit.pgc"
int l_i ; int l_i ;
#line 105 "thread_implicit.pgc" #line 97 "thread_implicit.pgc"
char l_connection [ 128 ] ; char l_connection [ 128 ] ;
/* exec sql end declare section */ /* exec sql end declare section */
#line 106 "thread_implicit.pgc" #line 98 "thread_implicit.pgc"
/* build up connection name, and connect to database */ /* build up connection name, and connect to database */
@ -161,13 +153,13 @@ void *test_thread(void *arg)
_snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum); _snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum);
#endif #endif
/* exec sql whenever sqlerror sqlprint ; */ /* exec sql whenever sqlerror sqlprint ; */
#line 114 "thread_implicit.pgc" #line 106 "thread_implicit.pgc"
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , l_connection, 0); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , l_connection, 0);
#line 115 "thread_implicit.pgc" #line 107 "thread_implicit.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 115 "thread_implicit.pgc" #line 107 "thread_implicit.pgc"
if( sqlca.sqlcode != 0 ) if( sqlca.sqlcode != 0 )
{ {
@ -175,10 +167,10 @@ if (sqlca.sqlcode < 0) sqlprint();}
return NULL; return NULL;
} }
{ ECPGtrans(__LINE__, NULL, "begin"); { ECPGtrans(__LINE__, NULL, "begin");
#line 121 "thread_implicit.pgc" #line 113 "thread_implicit.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 121 "thread_implicit.pgc" #line 113 "thread_implicit.pgc"
/* insert into test_thread table */ /* insert into test_thread table */
@ -189,10 +181,10 @@ if (sqlca.sqlcode < 0) sqlprint();}
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int), ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 126 "thread_implicit.pgc" #line 118 "thread_implicit.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 126 "thread_implicit.pgc" #line 118 "thread_implicit.pgc"
if( sqlca.sqlcode != 0 ) if( sqlca.sqlcode != 0 )
printf("%s: ERROR: insert failed!\n", l_connection); printf("%s: ERROR: insert failed!\n", l_connection);
@ -200,17 +192,16 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* all done */ /* all done */
{ ECPGtrans(__LINE__, NULL, "commit"); { ECPGtrans(__LINE__, NULL, "commit");
#line 132 "thread_implicit.pgc" #line 124 "thread_implicit.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 132 "thread_implicit.pgc" #line 124 "thread_implicit.pgc"
{ ECPGdisconnect(__LINE__, l_connection); { ECPGdisconnect(__LINE__, l_connection);
#line 133 "thread_implicit.pgc" #line 125 "thread_implicit.pgc"
if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();}
#line 133 "thread_implicit.pgc" #line 125 "thread_implicit.pgc"
return NULL; return NULL;
} }
#endif /* ENABLE_THREAD_SAFETY */

View File

@ -2,14 +2,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifdef WIN32 #ifdef WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -87,4 +79,3 @@ int main ()
return 0; return 0;
} }
#endif

View File

@ -1,4 +1,3 @@
#ifdef ENABLE_THREAD_SAFETY
#ifdef WIN32 #ifdef WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -7,7 +6,6 @@
#else #else
#include <pthread.h> #include <pthread.h>
#endif #endif
#endif
#include <stdio.h> #include <stdio.h>
#define THREADS 16 #define THREADS 16
@ -17,7 +15,7 @@ EXEC SQL include sqlca;
EXEC SQL whenever sqlerror sqlprint; EXEC SQL whenever sqlerror sqlprint;
EXEC SQL whenever not found sqlprint; EXEC SQL whenever not found sqlprint;
#if defined(ENABLE_THREAD_SAFETY) && defined(WIN32) #if defined(WIN32)
static unsigned __stdcall fn(void* arg) static unsigned __stdcall fn(void* arg)
#else #else
static void* fn(void* arg) static void* fn(void* arg)
@ -36,7 +34,6 @@ static void* fn(void* arg)
int main () int main ()
{ {
#ifdef ENABLE_THREAD_SAFETY
int i; int i;
#ifdef WIN32 #ifdef WIN32
HANDLE threads[THREADS]; HANDLE threads[THREADS];
@ -60,9 +57,6 @@ int main ()
for (i = 0; i < THREADS; ++i) for (i = 0; i < THREADS; ++i)
pthread_join(threads[i], NULL); pthread_join(threads[i], NULL);
#endif #endif
#else
fn(NULL);
#endif
return 0; return 0;
} }

View File

@ -2,14 +2,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifdef WIN32 #ifdef WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -93,4 +85,3 @@ int main ()
return 0; return 0;
} }
#endif

View File

@ -6,14 +6,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifndef WIN32 #ifndef WIN32
#include <pthread.h> #include <pthread.h>
#else #else
@ -133,4 +125,3 @@ void *test_thread(void *arg)
EXEC SQL DISCONNECT :l_connection; EXEC SQL DISCONNECT :l_connection;
return NULL; return NULL;
} }
#endif /* ENABLE_THREAD_SAFETY */

View File

@ -6,14 +6,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "ecpg_config.h" #include "ecpg_config.h"
#ifndef ENABLE_THREAD_SAFETY
int
main(void)
{
printf("No threading enabled.\n");
return 0;
}
#else
#ifndef WIN32 #ifndef WIN32
#include <pthread.h> #include <pthread.h>
#else #else
@ -133,4 +125,3 @@ void *test_thread(void *arg)
EXEC SQL DISCONNECT :l_connection; EXEC SQL DISCONNECT :l_connection;
return NULL; return NULL;
} }
#endif /* ENABLE_THREAD_SAFETY */

View File

@ -69,11 +69,8 @@ endif
ifeq ($(PORTNAME), win32) ifeq ($(PORTNAME), win32)
OBJS += \ OBJS += \
pthread-win32.o \
win32.o win32.o
ifeq ($(enable_thread_safety), yes)
OBJS += pthread-win32.o
endif
endif endif

View File

@ -52,13 +52,11 @@
#include <netinet/tcp.h> #include <netinet/tcp.h>
#endif #endif
#ifdef ENABLE_THREAD_SAFETY
#ifdef WIN32 #ifdef WIN32
#include "pthread-win32.h" #include "pthread-win32.h"
#else #else
#include <pthread.h> #include <pthread.h>
#endif #endif
#endif
#ifdef USE_LDAP #ifdef USE_LDAP
#ifdef WIN32 #ifdef WIN32
@ -7784,7 +7782,6 @@ pqGetHomeDirectory(char *buf, int bufsize)
static void static void
default_threadlock(int acquire) default_threadlock(int acquire)
{ {
#ifdef ENABLE_THREAD_SAFETY
#ifndef WIN32 #ifndef WIN32
static pthread_mutex_t singlethread_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t singlethread_lock = PTHREAD_MUTEX_INITIALIZER;
#else #else
@ -7813,7 +7810,6 @@ default_threadlock(int acquire)
if (pthread_mutex_unlock(&singlethread_lock)) if (pthread_mutex_unlock(&singlethread_lock))
Assert(false); Assert(false);
} }
#endif
} }
pgthreadlock_t pgthreadlock_t

View File

@ -3906,11 +3906,7 @@ PQisnonblocking(const PGconn *conn)
int int
PQisthreadsafe(void) PQisthreadsafe(void)
{ {
#ifdef ENABLE_THREAD_SAFETY
return true; return true;
#else
return false;
#endif
} }

View File

@ -88,14 +88,11 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
bool usePipe = false; bool usePipe = false;
char *pagerenv; char *pagerenv;
#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) #if !defined(WIN32)
sigset_t osigset; sigset_t osigset;
bool sigpipe_masked = false; bool sigpipe_masked = false;
bool sigpipe_pending; bool sigpipe_pending;
#endif #endif
#if !defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
pqsigfunc oldsigpipehandler = NULL;
#endif
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
struct winsize screen_size; struct winsize screen_size;
@ -186,12 +183,8 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
{ {
usePipe = true; usePipe = true;
#ifndef WIN32 #ifndef WIN32
#ifdef ENABLE_THREAD_SAFETY
if (pq_block_sigpipe(&osigset, &sigpipe_pending) == 0) if (pq_block_sigpipe(&osigset, &sigpipe_pending) == 0)
sigpipe_masked = true; sigpipe_masked = true;
#else
oldsigpipehandler = pqsignal(SIGPIPE, SIG_IGN);
#endif /* ENABLE_THREAD_SAFETY */
#endif /* WIN32 */ #endif /* WIN32 */
} }
else else
@ -324,13 +317,9 @@ exit:
#else #else
pclose(fout); pclose(fout);
#ifdef ENABLE_THREAD_SAFETY
/* we can't easily verify if EPIPE occurred, so say it did */ /* we can't easily verify if EPIPE occurred, so say it did */
if (sigpipe_masked) if (sigpipe_masked)
pq_reset_sigpipe(&osigset, sigpipe_pending, true); pq_reset_sigpipe(&osigset, sigpipe_pending, true);
#else
pqsignal(SIGPIPE, oldsigpipehandler);
#endif /* ENABLE_THREAD_SAFETY */
#endif /* WIN32 */ #endif /* WIN32 */
} }
} }

View File

@ -44,13 +44,11 @@
#include <sys/stat.h> #include <sys/stat.h>
#ifdef ENABLE_THREAD_SAFETY
#ifdef WIN32 #ifdef WIN32
#include "pthread-win32.h" #include "pthread-win32.h"
#else #else
#include <pthread.h> #include <pthread.h>
#endif #endif
#endif
/* /*
* These SSL-related #includes must come after all system-provided headers. * These SSL-related #includes must come after all system-provided headers.
@ -91,7 +89,6 @@ static bool pq_init_crypto_lib = true;
static bool ssl_lib_initialized = false; static bool ssl_lib_initialized = false;
#ifdef ENABLE_THREAD_SAFETY
static long crypto_open_connections = 0; static long crypto_open_connections = 0;
#ifndef WIN32 #ifndef WIN32
@ -100,7 +97,6 @@ static pthread_mutex_t ssl_config_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t ssl_config_mutex = NULL; static pthread_mutex_t ssl_config_mutex = NULL;
static long win32_ssl_create_mutex = 0; static long win32_ssl_create_mutex = 0;
#endif #endif
#endif /* ENABLE_THREAD_SAFETY */
static PQsslKeyPassHook_OpenSSL_type PQsslKeyPassHook = NULL; static PQsslKeyPassHook_OpenSSL_type PQsslKeyPassHook = NULL;
static int ssl_protocol_version_to_openssl(const char *protocol); static int ssl_protocol_version_to_openssl(const char *protocol);
@ -112,15 +108,12 @@ static int ssl_protocol_version_to_openssl(const char *protocol);
void void
pgtls_init_library(bool do_ssl, int do_crypto) pgtls_init_library(bool do_ssl, int do_crypto)
{ {
#ifdef ENABLE_THREAD_SAFETY
/* /*
* Disallow changing the flags while we have open connections, else we'd * Disallow changing the flags while we have open connections, else we'd
* get completely confused. * get completely confused.
*/ */
if (crypto_open_connections != 0) if (crypto_open_connections != 0)
return; return;
#endif
pq_init_ssl_lib = do_ssl; pq_init_ssl_lib = do_ssl;
pq_init_crypto_lib = do_crypto; pq_init_crypto_lib = do_crypto;
@ -718,7 +711,7 @@ pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn,
return rc; return rc;
} }
#if defined(ENABLE_THREAD_SAFETY) && defined(HAVE_CRYPTO_LOCK) #if defined(HAVE_CRYPTO_LOCK)
/* /*
* Callback functions for OpenSSL internal locking. (OpenSSL 1.1.0 * Callback functions for OpenSSL internal locking. (OpenSSL 1.1.0
* does its own locking, and doesn't need these anymore. The * does its own locking, and doesn't need these anymore. The
@ -759,7 +752,7 @@ pq_lockingcallback(int mode, int n, const char *file, int line)
Assert(false); Assert(false);
} }
} }
#endif /* ENABLE_THREAD_SAFETY && HAVE_CRYPTO_LOCK */ #endif /* HAVE_CRYPTO_LOCK */
/* /*
* Initialize SSL library. * Initialize SSL library.
@ -774,7 +767,6 @@ pq_lockingcallback(int mode, int n, const char *file, int line)
int int
pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto)
{ {
#ifdef ENABLE_THREAD_SAFETY
#ifdef WIN32 #ifdef WIN32
/* Also see similar code in fe-connect.c, default_threadlock() */ /* Also see similar code in fe-connect.c, default_threadlock() */
if (ssl_config_mutex == NULL) if (ssl_config_mutex == NULL)
@ -840,7 +832,6 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto)
} }
} }
#endif /* HAVE_CRYPTO_LOCK */ #endif /* HAVE_CRYPTO_LOCK */
#endif /* ENABLE_THREAD_SAFETY */
if (!ssl_lib_initialized && do_ssl) if (!ssl_lib_initialized && do_ssl)
{ {
@ -857,9 +848,7 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto)
ssl_lib_initialized = true; ssl_lib_initialized = true;
} }
#ifdef ENABLE_THREAD_SAFETY
pthread_mutex_unlock(&ssl_config_mutex); pthread_mutex_unlock(&ssl_config_mutex);
#endif
return 0; return 0;
} }
@ -878,7 +867,7 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto)
static void static void
destroy_ssl_system(void) destroy_ssl_system(void)
{ {
#if defined(ENABLE_THREAD_SAFETY) && defined(HAVE_CRYPTO_LOCK) #if defined(HAVE_CRYPTO_LOCK)
/* Mutex is created in pgtls_init() */ /* Mutex is created in pgtls_init() */
if (pthread_mutex_lock(&ssl_config_mutex)) if (pthread_mutex_lock(&ssl_config_mutex))
return; return;

View File

@ -35,13 +35,11 @@
#include <sys/stat.h> #include <sys/stat.h>
#ifdef ENABLE_THREAD_SAFETY
#ifdef WIN32 #ifdef WIN32
#include "pthread-win32.h" #include "pthread-win32.h"
#else #else
#include <pthread.h> #include <pthread.h>
#endif #endif
#endif
#include "fe-auth.h" #include "fe-auth.h"
#include "libpq-fe.h" #include "libpq-fe.h"
@ -56,8 +54,6 @@
#define SIGPIPE_MASKED(conn) ((conn)->sigpipe_so || (conn)->sigpipe_flag) #define SIGPIPE_MASKED(conn) ((conn)->sigpipe_so || (conn)->sigpipe_flag)
#ifdef ENABLE_THREAD_SAFETY
struct sigpipe_info struct sigpipe_info
{ {
sigset_t oldsigmask; sigset_t oldsigmask;
@ -90,24 +86,6 @@ struct sigpipe_info
pq_reset_sigpipe(&(spinfo).oldsigmask, (spinfo).sigpipe_pending, \ pq_reset_sigpipe(&(spinfo).oldsigmask, (spinfo).sigpipe_pending, \
(spinfo).got_epipe); \ (spinfo).got_epipe); \
} while (0) } while (0)
#else /* !ENABLE_THREAD_SAFETY */
#define DECLARE_SIGPIPE_INFO(spinfo) pqsigfunc spinfo = NULL
#define DISABLE_SIGPIPE(conn, spinfo, failaction) \
do { \
if (!SIGPIPE_MASKED(conn)) \
spinfo = pqsignal(SIGPIPE, SIG_IGN); \
} while (0)
#define REMEMBER_EPIPE(spinfo, cond)
#define RESTORE_SIGPIPE(conn, spinfo) \
do { \
if (!SIGPIPE_MASKED(conn)) \
pqsignal(SIGPIPE, spinfo); \
} while (0)
#endif /* ENABLE_THREAD_SAFETY */
#else /* WIN32 */ #else /* WIN32 */
#define DECLARE_SIGPIPE_INFO(spinfo) #define DECLARE_SIGPIPE_INFO(spinfo)
@ -524,7 +502,7 @@ PQgssEncInUse(PGconn *conn)
#endif /* ENABLE_GSS */ #endif /* ENABLE_GSS */
#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) #if !defined(WIN32)
/* /*
* Block SIGPIPE for this thread. This prevents send()/write() from exiting * Block SIGPIPE for this thread. This prevents send()/write() from exiting
@ -608,4 +586,4 @@ pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending, bool got_epipe)
SOCK_ERRNO_SET(save_errno); SOCK_ERRNO_SET(save_errno);
} }
#endif /* ENABLE_THREAD_SAFETY && !WIN32 */ #endif /* !WIN32 */

View File

@ -28,9 +28,7 @@
* with the semantics it had in 9.2; in particular, this has different * with the semantics it had in 9.2; in particular, this has different
* behavior for SIGALRM than the version in src/port/pqsignal.c. * behavior for SIGALRM than the version in src/port/pqsignal.c.
* *
* libpq itself uses this only for SIGPIPE (and even then, only in * libpq itself does not use this.
* non-ENABLE_THREAD_SAFETY builds), so the incompatibility isn't
* troublesome for internal references.
*/ */
pqsigfunc pqsigfunc
pqsignal(int signo, pqsigfunc func) pqsignal(int signo, pqsigfunc func)

View File

@ -31,14 +31,12 @@
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#ifdef ENABLE_THREAD_SAFETY
#ifdef WIN32 #ifdef WIN32
#include "pthread-win32.h" #include "pthread-win32.h"
#else #else
#include <pthread.h> #include <pthread.h>
#endif #endif
#include <signal.h> #include <signal.h>
#endif
/* include stuff common to fe and be */ /* include stuff common to fe and be */
#include "libpq/pqcomm.h" #include "libpq/pqcomm.h"
@ -681,15 +679,10 @@ extern int pqPacketSend(PGconn *conn, char pack_type,
const void *buf, size_t buf_len); const void *buf, size_t buf_len);
extern bool pqGetHomeDirectory(char *buf, int bufsize); extern bool pqGetHomeDirectory(char *buf, int bufsize);
#ifdef ENABLE_THREAD_SAFETY
extern pgthreadlock_t pg_g_threadlock; extern pgthreadlock_t pg_g_threadlock;
#define pglock_thread() pg_g_threadlock(true) #define pglock_thread() pg_g_threadlock(true)
#define pgunlock_thread() pg_g_threadlock(false) #define pgunlock_thread() pg_g_threadlock(false)
#else
#define pglock_thread() ((void) 0)
#define pgunlock_thread() ((void) 0)
#endif
/* === in fe-exec.c === */ /* === in fe-exec.c === */
@ -765,7 +758,7 @@ extern ssize_t pqsecure_write(PGconn *, const void *ptr, size_t len);
extern ssize_t pqsecure_raw_read(PGconn *, void *ptr, size_t len); extern ssize_t pqsecure_raw_read(PGconn *, void *ptr, size_t len);
extern ssize_t pqsecure_raw_write(PGconn *, const void *ptr, size_t len); extern ssize_t pqsecure_raw_write(PGconn *, const void *ptr, size_t len);
#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) #if !defined(WIN32)
extern int pq_block_sigpipe(sigset_t *osigset, bool *sigpipe_pending); extern int pq_block_sigpipe(sigset_t *osigset, bool *sigpipe_pending);
extern void pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending, extern void pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending,
bool got_epipe); bool got_epipe);

View File

@ -52,7 +52,6 @@ pgxs_kv = {
'abs_top_builddir': meson.build_root(), 'abs_top_builddir': meson.build_root(),
'abs_top_srcdir': meson.source_root(), 'abs_top_srcdir': meson.source_root(),
'enable_thread_safety': 'yes',
'enable_rpath': get_option('rpath') ? 'yes' : 'no', 'enable_rpath': get_option('rpath') ? 'yes' : 'no',
'enable_nls': libintl.found() ? 'yes' : 'no', 'enable_nls': libintl.found() ? 'yes' : 'no',
'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no', 'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no',

View File

@ -219,7 +219,6 @@ sub GenerateFiles
DLSUFFIX => '".dll"', DLSUFFIX => '".dll"',
ENABLE_GSS => $self->{options}->{gss} ? 1 : undef, ENABLE_GSS => $self->{options}->{gss} ? 1 : undef,
ENABLE_NLS => $self->{options}->{nls} ? 1 : undef, ENABLE_NLS => $self->{options}->{nls} ? 1 : undef,
ENABLE_THREAD_SAFETY => 1,
HAVE_APPEND_HISTORY => undef, HAVE_APPEND_HISTORY => undef,
HAVE_ASN1_STRING_GET0_DATA => undef, HAVE_ASN1_STRING_GET0_DATA => undef,
HAVE_ATOMICS => 1, HAVE_ATOMICS => 1,
@ -1209,7 +1208,7 @@ sub GetFakeConfigure
{ {
my $self = shift; my $self = shift;
my $cfg = '--enable-thread-safety'; my $cfg = '';
$cfg .= ' --enable-cassert' if ($self->{options}->{asserts}); $cfg .= ' --enable-cassert' if ($self->{options}->{asserts});
$cfg .= ' --enable-nls' if ($self->{options}->{nls}); $cfg .= ' --enable-nls' if ($self->{options}->{nls});
$cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests}); $cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests});

View File

@ -54,7 +54,7 @@
<!-- Run ECPG and the Visual C++ compiler on the files. Don't bother with dependency check between the steps --> <!-- Run ECPG and the Visual C++ compiler on the files. Don't bother with dependency check between the steps -->
<Exec WorkingDirectory="%(Pgc.RelativeDir)" Command="$(OUTDIR)ecpg\ecpg -I ../../include --regression $(ECPGPARAM) -o %(Pgc.Filename).c %(Pgc.Filename).pgc" /> <Exec WorkingDirectory="%(Pgc.RelativeDir)" Command="$(OUTDIR)ecpg\ecpg -I ../../include --regression $(ECPGPARAM) -o %(Pgc.Filename).c %(Pgc.Filename).pgc" />
<Exec WorkingDirectory="%(Pgc.RelativeDir)" Command="cl /nologo %(Pgc.FileName).c /TC /MD$(DEBUGLIB) /DENABLE_THREAD_SAFETY /DWIN32 /I. /I..\..\include /I..\..\..\libpq /I..\..\..\..\include /link /defaultlib:$(OUTDIR)libecpg\libecpg.lib /defaultlib:$(OUTDIR)libecpg_compat\libecpg_compat.lib /defaultlib:$(OUTDIR)libpgtypes\libpgtypes.lib" /> <Exec WorkingDirectory="%(Pgc.RelativeDir)" Command="cl /nologo %(Pgc.FileName).c /TC /MD$(DEBUGLIB) /DWIN32 /I. /I..\..\include /I..\..\..\libpq /I..\..\..\..\include /link /defaultlib:$(OUTDIR)libecpg\libecpg.lib /defaultlib:$(OUTDIR)libecpg_compat\libecpg_compat.lib /defaultlib:$(OUTDIR)libpgtypes\libpgtypes.lib" />
</Target> </Target>
<!-- Clean up all output files --> <!-- Clean up all output files -->