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:
parent
11f3669409
commit
68a4b58eca
|
@ -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
|
||||||
|
|
26
configure.ac
26
configure.ac
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
11
meson.build
11
meson.build
|
@ -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
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
|
@ -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@
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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 */
|
|
||||||
|
|
|
@ -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 */
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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 */
|
|
||||||
|
|
|
@ -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 */
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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});
|
||||||
|
|
|
@ -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 -->
|
||||||
|
|
Loading…
Reference in New Issue