diff --git a/configure b/configure index 4a8f6521296..2e518c8007d 100755 --- a/configure +++ b/configure @@ -722,7 +722,6 @@ with_tcl ICU_LIBS ICU_CFLAGS with_icu -enable_thread_safety INCLUDES autodepend PKG_CONFIG_LIBDIR @@ -848,7 +847,6 @@ with_CC with_llvm enable_depend enable_cassert -enable_thread_safety with_icu with_tcl with_tclconfig @@ -1536,7 +1534,6 @@ Optional Features: --enable-tap-tests enable TAP tests (requires Perl and IPC::Run) --enable-depend turn on automatic dependency tracking --enable-cassert enable assertion checks (for debugging) - --disable-thread-safety disable thread-safety in client libraries --disable-largefile omit support for large files Optional Packages: @@ -8338,43 +8335,6 @@ $as_echo "$as_me: WARNING: *** Library directory $dir does not exist." >&2;} done 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 # @@ -11064,7 +11024,7 @@ fi done -if test "$enable_thread_safety" = yes -a "$PORTNAME" != "win32"; then : +if test "$PORTNAME" != "win32"; then : # then @@ -11723,7 +11683,7 @@ if test "x$ac_cv_header_pthread_h" = xyes; then : else as_fn_error $? " -pthread.h not found; use --disable-thread-safety to disable thread safety" "$LINENO" 5 +pthread.h not found" "$LINENO" 5 fi @@ -12407,8 +12367,7 @@ if test "$ac_res" != no; then : 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; } if ${ac_cv_search_pthread_barrier_wait+:} false; then : $as_echo_n "(cached) " >&6 @@ -12464,7 +12423,6 @@ if test "$ac_res" != no; then : fi -fi if test "$with_readline" = yes; then @@ -13349,7 +13307,7 @@ else thread_safe_libldap=no 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. # On some platforms ldap_r fails to link without PTHREAD_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 : $as_echo "#define HAVE_PTHREAD_BARRIER_WAIT 1" >>confdefs.h @@ -16392,7 +16349,6 @@ esac fi -fi if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then # Cygwin and (apparently, based on test results) Mingw both diff --git a/configure.ac b/configure.ac index 0f802f3df40..3ebe1a796dc 100644 --- a/configure.ac +++ b/configure.ac @@ -837,18 +837,6 @@ for dir in $LIBRARY_DIRS $SRCH_LIB; do done 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 # @@ -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 additional code for that, which must not be inside the if-block. AS_IF dnl knows how to do that. -AS_IF([test "$enable_thread_safety" = yes -a "$PORTNAME" != "win32"], +AS_IF([test "$PORTNAME" != "win32"], [ # then AX_PTHREAD # set thread flags @@ -1258,7 +1246,7 @@ CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$LIBS $PTHREAD_LIBS" 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]) @@ -1305,9 +1293,7 @@ AC_SEARCH_LIBS(shmget, cygipc) # *BSD: AC_SEARCH_LIBS(backtrace_symbols, execinfo) -if test "$enable_thread_safety" = yes; then - AC_SEARCH_LIBS(pthread_barrier_wait, pthread) -fi +AC_SEARCH_LIBS(pthread_barrier_wait, pthread) if test "$with_readline" = yes; then PGAC_CHECK_READLINE @@ -1434,7 +1420,7 @@ if test "$with_ldap" = yes ; then AC_CHECK_FUNC([ldap_verify_credentials], [thread_safe_libldap=yes], [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. # On some platforms ldap_r fails to link without PTHREAD_LIBS. LIBS="$_LIBS" @@ -1858,9 +1844,7 @@ AC_REPLACE_FUNCS(m4_normalize([ strnlen ])) -if test "$enable_thread_safety" = yes; then - AC_REPLACE_FUNCS(pthread_barrier_wait) -fi +AC_REPLACE_FUNCS(pthread_barrier_wait) if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then # Cygwin and (apparently, based on test results) Mingw both diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index e9d797417ad..ac8eee47c66 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1306,19 +1306,6 @@ build-postgresql: - - - - - Disable the thread-safety of client libraries. This prevents - concurrent threads in libpq and - ECPG programs from safely controlling - their private connection handles. Use this only on platforms - with deficient threading support. - - - - diff --git a/meson.build b/meson.build index 0c44f19cb9c..30473b951a1 100644 --- a/meson.build +++ b/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 ############################################################### diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 974b1dfef9e..df9f721a41a 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -202,7 +202,6 @@ enable_debug = @enable_debug@ enable_dtrace = @enable_dtrace@ enable_coverage = @enable_coverage@ enable_tap_tests = @enable_tap_tests@ -enable_thread_safety = @enable_thread_safety@ python_includespec = @python_includespec@ python_libdir = @python_libdir@ diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 320d348a0fe..087baa7d57a 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -137,7 +137,7 @@ typedef struct socket_set EnterSynchronizationBarrier((barrier), \ SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY) #define THREAD_BARRIER_DESTROY(barrier) -#elif defined(ENABLE_THREAD_SAFETY) +#else /* Use POSIX threads */ #include "port/pg_pthread.h" #define THREAD_T pthread_t @@ -153,16 +153,6 @@ typedef struct socket_set pthread_barrier_init((barrier), NULL, (n)) #define THREAD_BARRIER_WAIT(barrier) pthread_barrier_wait((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 @@ -6749,10 +6739,6 @@ main(int argc, char **argv) { 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; case 'l': benchmarking_option_set = true; @@ -7236,7 +7222,6 @@ main(int argc, char **argv) if (errno != 0) pg_fatal("could not initialize barrier: %m"); -#ifdef ENABLE_THREAD_SAFETY /* start all threads but thread 0 which is executed directly later */ for (i = 1; i < nthreads; i++) { @@ -7248,9 +7233,6 @@ main(int argc, char **argv) if (errno != 0) pg_fatal("could not create thread: %m"); } -#else - Assert(nthreads == 1); -#endif /* ENABLE_THREAD_SAFETY */ /* compute when to stop */ threads[0].create_time = pg_time_now(); @@ -7268,10 +7250,8 @@ main(int argc, char **argv) { TState *thread = &threads[i]; -#ifdef ENABLE_THREAD_SAFETY if (i > 0) THREAD_JOIN(thread->thread); -#endif /* ENABLE_THREAD_SAFETY */ for (int j = 0; j < thread->nstate; j++) if (thread->state[j].state != CSTATE_FINISHED) diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index d03f6e8de82..ee209d6d702 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -51,10 +51,6 @@ /* Define to 1 if you want National Language Support. (--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. */ #undef HAVE_APPEND_HISTORY diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c index db0bae1fe08..8afb1f0a26f 100644 --- a/src/interfaces/ecpg/ecpglib/connect.c +++ b/src/interfaces/ecpg/ecpglib/connect.c @@ -14,15 +14,12 @@ locale_t ecpg_clocale = (locale_t) 0; #endif -#ifdef ENABLE_THREAD_SAFETY static pthread_mutex_t connections_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_key_t actual_connection_key; static pthread_once_t actual_connection_key_once = PTHREAD_ONCE_INIT; -#endif static struct connection *actual_connection = NULL; static struct connection *all_connections = NULL; -#ifdef ENABLE_THREAD_SAFETY static void ecpg_actual_connection_init(void) { @@ -34,7 +31,6 @@ ecpg_pthreads_init(void) { pthread_once(&actual_connection_key_once, ecpg_actual_connection_init); } -#endif static struct connection * 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)) { -#ifdef ENABLE_THREAD_SAFETY ecpg_pthreads_init(); /* ensure actual_connection_key is valid */ ret = pthread_getspecific(actual_connection_key); @@ -56,9 +51,6 @@ ecpg_get_connection_nr(const char *connection_name) if (ret == NULL) /* no TSD connection, going for global */ ret = actual_connection; -#else - ret = actual_connection; -#endif } else { @@ -82,7 +74,6 @@ ecpg_get_connection(const char *connection_name) if ((connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0)) { -#ifdef ENABLE_THREAD_SAFETY ecpg_pthreads_init(); /* ensure actual_connection_key is valid */ ret = pthread_getspecific(actual_connection_key); @@ -95,21 +86,14 @@ ecpg_get_connection(const char *connection_name) if (ret == NULL) /* no TSD connection here either, using global */ ret = actual_connection; -#else - ret = actual_connection; -#endif } else { -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&connections_mutex); -#endif ret = ecpg_get_connection_nr(connection_name); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif } return ret; @@ -143,10 +127,8 @@ ecpg_finish(struct connection *act) con->next = act->next; } -#ifdef ENABLE_THREAD_SAFETY if (pthread_getspecific(actual_connection_key) == act) pthread_setspecific(actual_connection_key, all_connections); -#endif if (actual_connection == act) actual_connection = all_connections; @@ -212,11 +194,7 @@ ECPGsetconn(int lineno, const char *connection_name) if (!ecpg_init(con, connection_name, lineno)) return false; -#ifdef ENABLE_THREAD_SAFETY pthread_setspecific(actual_connection_key, con); -#else - actual_connection = con; -#endif 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) connection_name = "DEFAULT"; -#if ENABLE_THREAD_SAFETY ecpg_pthreads_init(); -#endif /* check if the identifier is unique */ 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 */ -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&connections_mutex); -#endif /* * ... 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); if (!ecpg_clocale) { -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif ecpg_raise(lineno, ECPG_OUT_OF_MEMORY, ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL); if (host) @@ -558,9 +530,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p this->next = all_connections; all_connections = this; -#ifdef ENABLE_THREAD_SAFETY pthread_setspecific(actual_connection_key, all_connections); -#endif actual_connection = all_connections; 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_finish(this); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif ecpg_raise(lineno, ECPG_CONNECT, ECPG_SQLSTATE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION, db); if (realname) @@ -692,9 +660,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p if (realname) ecpg_free(realname); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif this->autocommit = autocommit; @@ -716,9 +682,7 @@ ECPGdisconnect(int lineno, const char *connection_name) return false; } -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&connections_mutex); -#endif if (strcmp(connection_name, "ALL") == 0) { @@ -737,18 +701,14 @@ ECPGdisconnect(int lineno, const char *connection_name) if (!ecpg_init(con, connection_name, lineno)) { -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif return false; } else ecpg_finish(con); } -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif return true; } diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c index 883a210a812..ad279e245c4 100644 --- a/src/interfaces/ecpg/ecpglib/descriptor.c +++ b/src/interfaces/ecpg/ecpglib/descriptor.c @@ -19,7 +19,6 @@ static void descriptor_free(struct descriptor *desc); /* We manage descriptors separately for each thread. */ -#ifdef ENABLE_THREAD_SAFETY static pthread_key_t descriptor_key; static pthread_once_t descriptor_once = PTHREAD_ONCE_INIT; @@ -49,12 +48,6 @@ set_descriptors(struct descriptor *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 */ static PGresult * @@ -782,8 +775,6 @@ ECPGdeallocate_desc(int line, const char *name) return false; } -#ifdef ENABLE_THREAD_SAFETY - /* Deallocate all descriptors in the list */ static void descriptor_deallocate_all(struct descriptor *list) @@ -796,7 +787,6 @@ descriptor_deallocate_all(struct descriptor *list) list = next; } } -#endif /* ENABLE_THREAD_SAFETY */ bool ECPGallocate_desc(int line, const char *name) diff --git a/src/interfaces/ecpg/ecpglib/ecpglib_extern.h b/src/interfaces/ecpg/ecpglib/ecpglib_extern.h index 8b8f081f27c..01b4309a710 100644 --- a/src/interfaces/ecpg/ecpglib/ecpglib_extern.h +++ b/src/interfaces/ecpg/ecpglib/ecpglib_extern.h @@ -169,9 +169,7 @@ bool ecpg_get_data(const PGresult *, int, int, int, enum ECPGttype type, enum ECPGttype, char *, char *, long, long, long, enum ARRAY_TYPE, enum COMPAT_MODE, bool); -#ifdef ENABLE_THREAD_SAFETY void ecpg_pthreads_init(void); -#endif struct connection *ecpg_get_connection(const char *connection_name); char *ecpg_alloc(long size, int lineno); char *ecpg_auto_alloc(long size, int lineno); diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 93926fd4fb1..04d0b40c537 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1961,9 +1961,7 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator, return false; } -#ifdef ENABLE_THREAD_SAFETY ecpg_pthreads_init(); -#endif con = ecpg_get_connection(connection_name); diff --git a/src/interfaces/ecpg/ecpglib/memory.c b/src/interfaces/ecpg/ecpglib/memory.c index bd812510549..a83637ac758 100644 --- a/src/interfaces/ecpg/ecpglib/memory.c +++ b/src/interfaces/ecpg/ecpglib/memory.c @@ -68,7 +68,6 @@ struct auto_mem struct auto_mem *next; }; -#ifdef ENABLE_THREAD_SAFETY static pthread_key_t auto_mem_key; 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); } -#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 * ecpg_auto_alloc(long size, int lineno) diff --git a/src/interfaces/ecpg/ecpglib/misc.c b/src/interfaces/ecpg/ecpglib/misc.c index 7f75e18733e..2b78caeaf52 100644 --- a/src/interfaces/ecpg/ecpglib/misc.c +++ b/src/interfaces/ecpg/ecpglib/misc.c @@ -55,42 +55,11 @@ static struct sqlca_t sqlca_init = } }; -#ifdef ENABLE_THREAD_SAFETY static pthread_key_t sqlca_key; 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_init_mutex = PTHREAD_MUTEX_INITIALIZER; -#endif static int simple_debug = 0; static FILE *debugstream = NULL; @@ -123,7 +92,6 @@ ecpg_init(const struct connection *con, const char *connection_name, const int l return true; } -#ifdef ENABLE_THREAD_SAFETY static void ecpg_sqlca_key_destructor(void *arg) { @@ -135,12 +103,10 @@ ecpg_sqlca_key_init(void) { pthread_key_create(&sqlca_key, ecpg_sqlca_key_destructor); } -#endif struct sqlca_t * ECPGget_sqlca(void) { -#ifdef ENABLE_THREAD_SAFETY struct sqlca_t *sqlca; pthread_once(&sqlca_key_once, ecpg_sqlca_key_init); @@ -155,9 +121,6 @@ ECPGget_sqlca(void) pthread_setspecific(sqlca_key, sqlca); } return sqlca; -#else - return &sqlca; -#endif } bool @@ -240,9 +203,7 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction) void ECPGdebug(int n, FILE *dbgs) { -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&debug_init_mutex); -#endif if (n > 100) { @@ -256,9 +217,7 @@ ECPGdebug(int n, FILE *dbgs) ecpg_log("ECPGdebug: set to %d\n", simple_debug); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&debug_init_mutex); -#endif } void @@ -290,9 +249,7 @@ ecpg_log(const char *format,...) else snprintf(fmt, bufsize, "[%d]: %s", (int) getpid(), intl_format); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&debug_mutex); -#endif va_start(ap, format); vfprintf(debugstream, fmt, ap); @@ -307,9 +264,7 @@ ecpg_log(const char *format,...) fflush(debugstream); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&debug_mutex); -#endif free(fmt); } @@ -451,7 +406,6 @@ ECPGis_noind_null(enum ECPGttype type, const void *ptr) } #ifdef WIN32 -#ifdef ENABLE_THREAD_SAFETY void 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); } } -#endif /* ENABLE_THREAD_SAFETY */ #endif /* WIN32 */ #ifdef ENABLE_NLS diff --git a/src/interfaces/ecpg/include/ecpg-pthread-win32.h b/src/interfaces/ecpg/include/ecpg-pthread-win32.h index 33c897b633c..8252a178096 100644 --- a/src/interfaces/ecpg/include/ecpg-pthread-win32.h +++ b/src/interfaces/ecpg/include/ecpg-pthread-win32.h @@ -5,8 +5,6 @@ #ifndef _ECPG_PTHREAD_WIN32_H #define _ECPG_PTHREAD_WIN32_H -#ifdef ENABLE_THREAD_SAFETY - #ifndef WIN32 #include @@ -53,6 +51,5 @@ void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)); win32_pthread_once((once), (fn)); \ } while(0) #endif /* WIN32 */ -#endif /* ENABLE_THREAD_SAFETY */ #endif /* _ECPG_PTHREAD_WIN32_H */ diff --git a/src/interfaces/ecpg/include/ecpg_config.h.in b/src/interfaces/ecpg/include/ecpg_config.h.in index cbd24f11a01..5d0f448a866 100644 --- a/src/interfaces/ecpg/include/ecpg_config.h.in +++ b/src/interfaces/ecpg/include/ecpg_config.h.in @@ -1,6 +1,5 @@ -/* Define to 1 to build client libraries as thread-safe code. - * (--enable-thread-safety) */ -#undef ENABLE_THREAD_SAFETY +/* Define to 1 to build client libraries as thread-safe code. */ +#define ENABLE_THREAD_SAFETY 1 /* Define to 1 if the system has the type `int64'. */ #undef HAVE_INT64 diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h index 21a21344830..771761ffe49 100644 --- a/src/interfaces/ecpg/include/ecpglib.h +++ b/src/interfaces/ecpg/include/ecpglib.h @@ -98,9 +98,7 @@ void *ECPGget_var(int number); /* dynamic result allocation */ void ECPGfree_auto_mem(void); -#ifdef ENABLE_THREAD_SAFETY void ecpg_pthreads_init(void); -#endif #ifdef __cplusplus } diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build index 2278f0d3055..5dad643a0c4 100644 --- a/src/interfaces/ecpg/include/meson.build +++ b/src/interfaces/ecpg/include/meson.build @@ -3,7 +3,6 @@ ecpg_inc = include_directories('.') ecpg_conf_keys = [ - 'ENABLE_THREAD_SAFETY', 'HAVE_INT64', 'HAVE_LONG_INT_64', 'HAVE_LONG_LONG_INT_64', @@ -12,6 +11,8 @@ ecpg_conf_keys = [ ecpg_conf_data = configuration_data() +ecpg_conf_data.set('ENABLE_THREAD_SAFETY', 1) + foreach key : ecpg_conf_keys if cdata.has(key) ecpg_conf_data.set(key, cdata.get(key)) diff --git a/src/interfaces/ecpg/test/expected/thread-alloc.c b/src/interfaces/ecpg/test/expected/thread-alloc.c index 37ef44ed94b..3b31d27fd34 100644 --- a/src/interfaces/ecpg/test/expected/thread-alloc.c +++ b/src/interfaces/ecpg/test/expected/thread-alloc.c @@ -11,14 +11,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -101,7 +93,7 @@ struct sqlca_t *ECPGget_sqlca(void); #endif -#line 26 "alloc.pgc" +#line 18 "alloc.pgc" #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 ; */ -#line 29 "alloc.pgc" +#line 21 "alloc.pgc" /* exec sql whenever not found sqlprint ; */ -#line 30 "alloc.pgc" +#line 22 "alloc.pgc" #ifdef WIN32 @@ -134,54 +126,54 @@ static void* fn(void* arg) -#line 41 "alloc.pgc" +#line 33 "alloc.pgc" int value ; -#line 42 "alloc.pgc" +#line 34 "alloc.pgc" char name [ 100 ] ; -#line 43 "alloc.pgc" +#line 35 "alloc.pgc" char ** r = NULL ; /* exec sql end declare section */ -#line 44 "alloc.pgc" +#line 36 "alloc.pgc" value = (intptr_t) arg; sprintf(name, "Connection: %d", value); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0); -#line 49 "alloc.pgc" +#line 41 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 49 "alloc.pgc" +#line 41 "alloc.pgc" { ECPGsetcommit(__LINE__, "on", NULL); -#line 50 "alloc.pgc" +#line 42 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 50 "alloc.pgc" +#line 42 "alloc.pgc" 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, ECPGt_char,&(r),(long)0,(long)0,(1)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); -#line 53 "alloc.pgc" +#line 45 "alloc.pgc" if (sqlca.sqlcode == ECPG_NOT_FOUND) sqlprint(); -#line 53 "alloc.pgc" +#line 45 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 53 "alloc.pgc" +#line 45 "alloc.pgc" free(r); r = NULL; } { ECPGdisconnect(__LINE__, name); -#line 57 "alloc.pgc" +#line 49 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 57 "alloc.pgc" +#line 49 "alloc.pgc" return 0; @@ -215,4 +207,3 @@ int main () return 0; } -#endif diff --git a/src/interfaces/ecpg/test/expected/thread-descriptor.c b/src/interfaces/ecpg/test/expected/thread-descriptor.c index f56cc25ab02..e34f4708d13 100644 --- a/src/interfaces/ecpg/test/expected/thread-descriptor.c +++ b/src/interfaces/ecpg/test/expected/thread-descriptor.c @@ -7,7 +7,6 @@ #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) #line 1 "descriptor.pgc" -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -16,7 +15,6 @@ #else #include #endif -#endif #include #define THREADS 16 @@ -91,16 +89,16 @@ struct sqlca_t *ECPGget_sqlca(void); #endif -#line 16 "descriptor.pgc" +#line 14 "descriptor.pgc" /* exec sql whenever sqlerror sqlprint ; */ -#line 17 "descriptor.pgc" +#line 15 "descriptor.pgc" /* 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) #else static void* fn(void* arg) @@ -111,16 +109,16 @@ static void* fn(void* arg) for (i = 1; i <= REPEATS; ++i) { ECPGallocate_desc(__LINE__, "mydesc"); -#line 30 "descriptor.pgc" +#line 28 "descriptor.pgc" if (sqlca.sqlcode < 0) sqlprint(); -#line 30 "descriptor.pgc" +#line 28 "descriptor.pgc" ECPGdeallocate_desc(__LINE__, "mydesc"); -#line 31 "descriptor.pgc" +#line 29 "descriptor.pgc" if (sqlca.sqlcode < 0) sqlprint(); -#line 31 "descriptor.pgc" +#line 29 "descriptor.pgc" } @@ -129,7 +127,6 @@ if (sqlca.sqlcode < 0) sqlprint(); int main () { -#ifdef ENABLE_THREAD_SAFETY int i; #ifdef WIN32 HANDLE threads[THREADS]; @@ -153,9 +150,6 @@ int main () for (i = 0; i < THREADS; ++i) pthread_join(threads[i], NULL); #endif -#else - fn(NULL); -#endif return 0; } diff --git a/src/interfaces/ecpg/test/expected/thread-prep.c b/src/interfaces/ecpg/test/expected/thread-prep.c index 7cdf2505d3f..052e27b634f 100644 --- a/src/interfaces/ecpg/test/expected/thread-prep.c +++ b/src/interfaces/ecpg/test/expected/thread-prep.c @@ -11,14 +11,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -101,7 +93,7 @@ struct sqlca_t *ECPGget_sqlca(void); #endif -#line 26 "prep.pgc" +#line 18 "prep.pgc" #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 ; */ -#line 29 "prep.pgc" +#line 21 "prep.pgc" /* exec sql whenever not found sqlprint ; */ -#line 30 "prep.pgc" +#line 22 "prep.pgc" #ifdef WIN32 @@ -134,64 +126,64 @@ static void* fn(void* arg) -#line 41 "prep.pgc" +#line 33 "prep.pgc" int value ; -#line 42 "prep.pgc" +#line 34 "prep.pgc" char name [ 100 ] ; -#line 43 "prep.pgc" +#line 35 "prep.pgc" char query [ 256 ] = "INSERT INTO T VALUES ( ? )" ; /* exec sql end declare section */ -#line 44 "prep.pgc" +#line 36 "prep.pgc" value = (intptr_t) arg; sprintf(name, "Connection: %d", value); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0); -#line 49 "prep.pgc" +#line 41 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 49 "prep.pgc" +#line 41 "prep.pgc" { ECPGsetcommit(__LINE__, "on", NULL); -#line 50 "prep.pgc" +#line 42 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 50 "prep.pgc" +#line 42 "prep.pgc" for (i = 1; i <= REPEATS; ++i) { { ECPGprepare(__LINE__, NULL, 0, "i", query); -#line 53 "prep.pgc" +#line 45 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 53 "prep.pgc" +#line 45 "prep.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "i", ECPGt_int,&(value),(long)1,(long)1,sizeof(int), 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(); -#line 54 "prep.pgc" +#line 46 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 54 "prep.pgc" +#line 46 "prep.pgc" } { ECPGdeallocate(__LINE__, 0, NULL, "i"); -#line 56 "prep.pgc" +#line 48 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 56 "prep.pgc" +#line 48 "prep.pgc" { ECPGdisconnect(__LINE__, name); -#line 57 "prep.pgc" +#line 49 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 57 "prep.pgc" +#line 49 "prep.pgc" return 0; @@ -207,34 +199,34 @@ int main () #endif { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); -#line 71 "prep.pgc" +#line 63 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 71 "prep.pgc" +#line 63 "prep.pgc" { ECPGsetcommit(__LINE__, "on", NULL); -#line 72 "prep.pgc" +#line 64 "prep.pgc" 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); -#line 73 "prep.pgc" +#line 65 "prep.pgc" 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); -#line 74 "prep.pgc" +#line 66 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 74 "prep.pgc" +#line 66 "prep.pgc" { ECPGdisconnect(__LINE__, "CURRENT"); -#line 75 "prep.pgc" +#line 67 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 75 "prep.pgc" +#line 67 "prep.pgc" #ifdef WIN32 @@ -256,4 +248,3 @@ if (sqlca.sqlcode < 0) sqlprint();} return 0; } -#endif diff --git a/src/interfaces/ecpg/test/expected/thread-thread.c b/src/interfaces/ecpg/test/expected/thread-thread.c index 0e75c47fab2..95faa223c20 100644 --- a/src/interfaces/ecpg/test/expected/thread-thread.c +++ b/src/interfaces/ecpg/test/expected/thread-thread.c @@ -15,14 +15,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -38,7 +30,7 @@ main(void) -#line 24 "thread.pgc" +#line 16 "thread.pgc" void *test_thread(void *arg); @@ -57,10 +49,10 @@ int main() /* exec sql begin declare section */ -#line 40 "thread.pgc" +#line 32 "thread.pgc" int l_rows ; /* 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 @@ -69,22 +61,22 @@ int main() /* setup test_thread table */ { 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);} -#line 49 "thread.pgc" +#line 41 "thread.pgc" /* DROP might fail */ { 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);} -#line 55 "thread.pgc" +#line 47 "thread.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 56 "thread.pgc" +#line 48 "thread.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 57 "thread.pgc" +#line 49 "thread.pgc" /* create, and start, threads */ @@ -116,18 +108,18 @@ int main() /* and check results */ { 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, ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} -#line 88 "thread.pgc" +#line 80 "thread.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 89 "thread.pgc" +#line 81 "thread.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 90 "thread.pgc" +#line 82 "thread.pgc" if( l_rows == (nthreads * iterations) ) printf("Success.\n"); @@ -145,13 +137,13 @@ void *test_thread(void *arg) -#line 104 "thread.pgc" +#line 96 "thread.pgc" int l_i ; -#line 105 "thread.pgc" +#line 97 "thread.pgc" char l_connection [ 128 ] ; /* exec sql end declare section */ -#line 106 "thread.pgc" +#line 98 "thread.pgc" /* 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); #endif /* exec sql whenever sqlerror sqlprint ; */ -#line 114 "thread.pgc" +#line 106 "thread.pgc" { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , l_connection, 0); -#line 115 "thread.pgc" +#line 107 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 115 "thread.pgc" +#line 107 "thread.pgc" if( sqlca.sqlcode != 0 ) { @@ -175,10 +167,10 @@ if (sqlca.sqlcode < 0) sqlprint();} return NULL; } { ECPGtrans(__LINE__, l_connection, "begin"); -#line 121 "thread.pgc" +#line 113 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 121 "thread.pgc" +#line 113 "thread.pgc" /* insert into test_thread table */ @@ -189,10 +181,10 @@ if (sqlca.sqlcode < 0) sqlprint();} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); -#line 126 "thread.pgc" +#line 118 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 126 "thread.pgc" +#line 118 "thread.pgc" if( sqlca.sqlcode != 0 ) printf("%s: ERROR: insert failed!\n", l_connection); @@ -200,17 +192,16 @@ if (sqlca.sqlcode < 0) sqlprint();} /* all done */ { ECPGtrans(__LINE__, l_connection, "commit"); -#line 132 "thread.pgc" +#line 124 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 132 "thread.pgc" +#line 124 "thread.pgc" { ECPGdisconnect(__LINE__, l_connection); -#line 133 "thread.pgc" +#line 125 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 133 "thread.pgc" +#line 125 "thread.pgc" return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/ecpg/test/expected/thread-thread_implicit.c b/src/interfaces/ecpg/test/expected/thread-thread_implicit.c index 0df2794530c..7ac0297a234 100644 --- a/src/interfaces/ecpg/test/expected/thread-thread_implicit.c +++ b/src/interfaces/ecpg/test/expected/thread-thread_implicit.c @@ -15,14 +15,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -38,7 +30,7 @@ main(void) -#line 24 "thread_implicit.pgc" +#line 16 "thread_implicit.pgc" void *test_thread(void *arg); @@ -57,10 +49,10 @@ int main() /* exec sql begin declare section */ -#line 40 "thread_implicit.pgc" +#line 32 "thread_implicit.pgc" int l_rows ; /* 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 @@ -69,22 +61,22 @@ int main() /* setup test_thread table */ { 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);} -#line 49 "thread_implicit.pgc" +#line 41 "thread_implicit.pgc" /* DROP might fail */ { 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);} -#line 55 "thread_implicit.pgc" +#line 47 "thread_implicit.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 56 "thread_implicit.pgc" +#line 48 "thread_implicit.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 57 "thread_implicit.pgc" +#line 49 "thread_implicit.pgc" /* create, and start, threads */ @@ -116,18 +108,18 @@ int main() /* and check results */ { 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, ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} -#line 88 "thread_implicit.pgc" +#line 80 "thread_implicit.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 89 "thread_implicit.pgc" +#line 81 "thread_implicit.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 90 "thread_implicit.pgc" +#line 82 "thread_implicit.pgc" if( l_rows == (nthreads * iterations) ) 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 ; -#line 105 "thread_implicit.pgc" +#line 97 "thread_implicit.pgc" char l_connection [ 128 ] ; /* exec sql end declare section */ -#line 106 "thread_implicit.pgc" +#line 98 "thread_implicit.pgc" /* 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); #endif /* 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); -#line 115 "thread_implicit.pgc" +#line 107 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 115 "thread_implicit.pgc" +#line 107 "thread_implicit.pgc" if( sqlca.sqlcode != 0 ) { @@ -175,10 +167,10 @@ if (sqlca.sqlcode < 0) sqlprint();} return NULL; } { ECPGtrans(__LINE__, NULL, "begin"); -#line 121 "thread_implicit.pgc" +#line 113 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 121 "thread_implicit.pgc" +#line 113 "thread_implicit.pgc" /* insert into test_thread table */ @@ -189,10 +181,10 @@ if (sqlca.sqlcode < 0) sqlprint();} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int), 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();} -#line 126 "thread_implicit.pgc" +#line 118 "thread_implicit.pgc" if( sqlca.sqlcode != 0 ) printf("%s: ERROR: insert failed!\n", l_connection); @@ -200,17 +192,16 @@ if (sqlca.sqlcode < 0) sqlprint();} /* all done */ { ECPGtrans(__LINE__, NULL, "commit"); -#line 132 "thread_implicit.pgc" +#line 124 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 132 "thread_implicit.pgc" +#line 124 "thread_implicit.pgc" { ECPGdisconnect(__LINE__, l_connection); -#line 133 "thread_implicit.pgc" +#line 125 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 133 "thread_implicit.pgc" +#line 125 "thread_implicit.pgc" return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/ecpg/test/thread/alloc.pgc b/src/interfaces/ecpg/test/thread/alloc.pgc index c0021a737ed..d3d35493bf9 100644 --- a/src/interfaces/ecpg/test/thread/alloc.pgc +++ b/src/interfaces/ecpg/test/thread/alloc.pgc @@ -2,14 +2,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -87,4 +79,3 @@ int main () return 0; } -#endif diff --git a/src/interfaces/ecpg/test/thread/descriptor.pgc b/src/interfaces/ecpg/test/thread/descriptor.pgc index 76a7a5dff54..30bce7c87bc 100644 --- a/src/interfaces/ecpg/test/thread/descriptor.pgc +++ b/src/interfaces/ecpg/test/thread/descriptor.pgc @@ -1,4 +1,3 @@ -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -7,7 +6,6 @@ #else #include #endif -#endif #include #define THREADS 16 @@ -17,7 +15,7 @@ EXEC SQL include sqlca; EXEC SQL whenever sqlerror sqlprint; EXEC SQL whenever not found sqlprint; -#if defined(ENABLE_THREAD_SAFETY) && defined(WIN32) +#if defined(WIN32) static unsigned __stdcall fn(void* arg) #else static void* fn(void* arg) @@ -36,7 +34,6 @@ static void* fn(void* arg) int main () { -#ifdef ENABLE_THREAD_SAFETY int i; #ifdef WIN32 HANDLE threads[THREADS]; @@ -60,9 +57,6 @@ int main () for (i = 0; i < THREADS; ++i) pthread_join(threads[i], NULL); #endif -#else - fn(NULL); -#endif return 0; } diff --git a/src/interfaces/ecpg/test/thread/prep.pgc b/src/interfaces/ecpg/test/thread/prep.pgc index d7ecfd48555..f61b31ce101 100644 --- a/src/interfaces/ecpg/test/thread/prep.pgc +++ b/src/interfaces/ecpg/test/thread/prep.pgc @@ -2,14 +2,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -93,4 +85,3 @@ int main () return 0; } -#endif diff --git a/src/interfaces/ecpg/test/thread/thread.pgc b/src/interfaces/ecpg/test/thread/thread.pgc index e7d8c00af6f..b9b9ebb441d 100644 --- a/src/interfaces/ecpg/test/thread/thread.pgc +++ b/src/interfaces/ecpg/test/thread/thread.pgc @@ -6,14 +6,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -133,4 +125,3 @@ void *test_thread(void *arg) EXEC SQL DISCONNECT :l_connection; return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/ecpg/test/thread/thread_implicit.pgc b/src/interfaces/ecpg/test/thread/thread_implicit.pgc index b4cae7e1aec..ff9b12a9437 100644 --- a/src/interfaces/ecpg/test/thread/thread_implicit.pgc +++ b/src/interfaces/ecpg/test/thread/thread_implicit.pgc @@ -6,14 +6,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -133,4 +125,3 @@ void *test_thread(void *arg) EXEC SQL DISCONNECT :l_connection; return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 0919d8f32f6..46653682b03 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -69,11 +69,8 @@ endif ifeq ($(PORTNAME), win32) OBJS += \ + pthread-win32.o \ win32.o - -ifeq ($(enable_thread_safety), yes) -OBJS += pthread-win32.o -endif endif diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index a8584d2c684..837c5321aa1 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -52,13 +52,11 @@ #include #endif -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif -#endif #ifdef USE_LDAP #ifdef WIN32 @@ -7784,7 +7782,6 @@ pqGetHomeDirectory(char *buf, int bufsize) static void default_threadlock(int acquire) { -#ifdef ENABLE_THREAD_SAFETY #ifndef WIN32 static pthread_mutex_t singlethread_lock = PTHREAD_MUTEX_INITIALIZER; #else @@ -7813,7 +7810,6 @@ default_threadlock(int acquire) if (pthread_mutex_unlock(&singlethread_lock)) Assert(false); } -#endif } pgthreadlock_t diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 01f8efabbef..a868284ff87 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -3906,11 +3906,7 @@ PQisnonblocking(const PGconn *conn) int PQisthreadsafe(void) { -#ifdef ENABLE_THREAD_SAFETY return true; -#else - return false; -#endif } diff --git a/src/interfaces/libpq/fe-print.c b/src/interfaces/libpq/fe-print.c index 40620b47e94..8af15032be7 100644 --- a/src/interfaces/libpq/fe-print.c +++ b/src/interfaces/libpq/fe-print.c @@ -88,14 +88,11 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po) bool usePipe = false; char *pagerenv; -#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) +#if !defined(WIN32) sigset_t osigset; bool sigpipe_masked = false; bool sigpipe_pending; #endif -#if !defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) - pqsigfunc oldsigpipehandler = NULL; -#endif #ifdef TIOCGWINSZ struct winsize screen_size; @@ -186,12 +183,8 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po) { usePipe = true; #ifndef WIN32 -#ifdef ENABLE_THREAD_SAFETY if (pq_block_sigpipe(&osigset, &sigpipe_pending) == 0) sigpipe_masked = true; -#else - oldsigpipehandler = pqsignal(SIGPIPE, SIG_IGN); -#endif /* ENABLE_THREAD_SAFETY */ #endif /* WIN32 */ } else @@ -324,13 +317,9 @@ exit: #else pclose(fout); -#ifdef ENABLE_THREAD_SAFETY /* we can't easily verify if EPIPE occurred, so say it did */ if (sigpipe_masked) pq_reset_sigpipe(&osigset, sigpipe_pending, true); -#else - pqsignal(SIGPIPE, oldsigpipehandler); -#endif /* ENABLE_THREAD_SAFETY */ #endif /* WIN32 */ } } diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index bea71660ab8..f1192d28f26 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -44,13 +44,11 @@ #include -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif -#endif /* * 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; -#ifdef ENABLE_THREAD_SAFETY static long crypto_open_connections = 0; #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 long win32_ssl_create_mutex = 0; #endif -#endif /* ENABLE_THREAD_SAFETY */ static PQsslKeyPassHook_OpenSSL_type PQsslKeyPassHook = NULL; 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 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 * get completely confused. */ if (crypto_open_connections != 0) return; -#endif pq_init_ssl_lib = do_ssl; pq_init_crypto_lib = do_crypto; @@ -718,7 +711,7 @@ pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn, 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 * 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); } } -#endif /* ENABLE_THREAD_SAFETY && HAVE_CRYPTO_LOCK */ +#endif /* HAVE_CRYPTO_LOCK */ /* * Initialize SSL library. @@ -774,7 +767,6 @@ pq_lockingcallback(int mode, int n, const char *file, int line) int pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) { -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 /* Also see similar code in fe-connect.c, default_threadlock() */ if (ssl_config_mutex == NULL) @@ -840,7 +832,6 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) } } #endif /* HAVE_CRYPTO_LOCK */ -#endif /* ENABLE_THREAD_SAFETY */ if (!ssl_lib_initialized && do_ssl) { @@ -857,9 +848,7 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) ssl_lib_initialized = true; } -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&ssl_config_mutex); -#endif return 0; } @@ -878,7 +867,7 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) static 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() */ if (pthread_mutex_lock(&ssl_config_mutex)) return; diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c index 8069e381424..bd72a87bbba 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -35,13 +35,11 @@ #include -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif -#endif #include "fe-auth.h" #include "libpq-fe.h" @@ -56,8 +54,6 @@ #define SIGPIPE_MASKED(conn) ((conn)->sigpipe_so || (conn)->sigpipe_flag) -#ifdef ENABLE_THREAD_SAFETY - struct sigpipe_info { sigset_t oldsigmask; @@ -90,24 +86,6 @@ struct sigpipe_info pq_reset_sigpipe(&(spinfo).oldsigmask, (spinfo).sigpipe_pending, \ (spinfo).got_epipe); \ } 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 */ #define DECLARE_SIGPIPE_INFO(spinfo) @@ -524,7 +502,7 @@ PQgssEncInUse(PGconn *conn) #endif /* ENABLE_GSS */ -#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) +#if !defined(WIN32) /* * 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); } -#endif /* ENABLE_THREAD_SAFETY && !WIN32 */ +#endif /* !WIN32 */ diff --git a/src/interfaces/libpq/legacy-pqsignal.c b/src/interfaces/libpq/legacy-pqsignal.c index 790ab5a18c0..97baa86a27f 100644 --- a/src/interfaces/libpq/legacy-pqsignal.c +++ b/src/interfaces/libpq/legacy-pqsignal.c @@ -28,9 +28,7 @@ * with the semantics it had in 9.2; in particular, this has different * behavior for SIGALRM than the version in src/port/pqsignal.c. * - * libpq itself uses this only for SIGPIPE (and even then, only in - * non-ENABLE_THREAD_SAFETY builds), so the incompatibility isn't - * troublesome for internal references. + * libpq itself does not use this. */ pqsigfunc pqsignal(int signo, pqsigfunc func) diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 9d63472c35b..c745facfec3 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -31,14 +31,12 @@ #include #endif -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif #include -#endif /* include stuff common to fe and be */ #include "libpq/pqcomm.h" @@ -681,15 +679,10 @@ extern int pqPacketSend(PGconn *conn, char pack_type, const void *buf, size_t buf_len); extern bool pqGetHomeDirectory(char *buf, int bufsize); -#ifdef ENABLE_THREAD_SAFETY extern pgthreadlock_t pg_g_threadlock; #define pglock_thread() pg_g_threadlock(true) #define pgunlock_thread() pg_g_threadlock(false) -#else -#define pglock_thread() ((void) 0) -#define pgunlock_thread() ((void) 0) -#endif /* === 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_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 void pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending, bool got_epipe); diff --git a/src/makefiles/meson.build b/src/makefiles/meson.build index 13045cbd6e4..be946f7b38b 100644 --- a/src/makefiles/meson.build +++ b/src/makefiles/meson.build @@ -52,7 +52,6 @@ pgxs_kv = { 'abs_top_builddir': meson.build_root(), 'abs_top_srcdir': meson.source_root(), - 'enable_thread_safety': 'yes', 'enable_rpath': get_option('rpath') ? 'yes' : 'no', 'enable_nls': libintl.found() ? 'yes' : 'no', 'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no', diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index f09b3826ffc..1cbc857e352 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -219,7 +219,6 @@ sub GenerateFiles DLSUFFIX => '".dll"', ENABLE_GSS => $self->{options}->{gss} ? 1 : undef, ENABLE_NLS => $self->{options}->{nls} ? 1 : undef, - ENABLE_THREAD_SAFETY => 1, HAVE_APPEND_HISTORY => undef, HAVE_ASN1_STRING_GET0_DATA => undef, HAVE_ATOMICS => 1, @@ -1209,7 +1208,7 @@ sub GetFakeConfigure { my $self = shift; - my $cfg = '--enable-thread-safety'; + my $cfg = ''; $cfg .= ' --enable-cassert' if ($self->{options}->{asserts}); $cfg .= ' --enable-nls' if ($self->{options}->{nls}); $cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests}); diff --git a/src/tools/msvc/ecpg_regression.proj b/src/tools/msvc/ecpg_regression.proj index ec2760b1f6d..0ec60a275e3 100644 --- a/src/tools/msvc/ecpg_regression.proj +++ b/src/tools/msvc/ecpg_regression.proj @@ -54,7 +54,7 @@ - +