#include #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 #include #include #else #include #endif #include #define THREADS 16 #define REPEATS 50 exec sql include sqlca; exec sql include ../regression; exec sql whenever sqlerror sqlprint; exec sql whenever not found sqlprint; #ifdef WIN32 static unsigned __stdcall fn(void* arg) #else static void* fn(void* arg) #endif { int i; EXEC SQL BEGIN DECLARE SECTION; int value; char name[100]; char query[256] = "INSERT INTO T VALUES ( ? )"; EXEC SQL END DECLARE SECTION; value = (intptr_t) arg; sprintf(name, "Connection: %d", value); EXEC SQL CONNECT TO REGRESSDB1 AS :name; EXEC SQL SET AUTOCOMMIT TO ON; for (i = 1; i <= REPEATS; ++i) { EXEC SQL PREPARE I FROM :query; EXEC SQL EXECUTE I USING :value; } EXEC SQL DEALLOCATE I; EXEC SQL DISCONNECT :name; return 0; } int main () { intptr_t i; #ifdef WIN32 HANDLE threads[THREADS]; #else pthread_t threads[THREADS]; #endif EXEC SQL CONNECT TO REGRESSDB1; EXEC SQL SET AUTOCOMMIT TO ON; EXEC SQL DROP TABLE IF EXISTS T; EXEC SQL CREATE TABLE T ( i int ); EXEC SQL DISCONNECT; #ifdef WIN32 for (i = 0; i < THREADS; ++i) { unsigned id; threads[i] = (HANDLE)_beginthreadex(NULL, 0, fn, (void*)i, 0, &id); } WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE); for (i = 0; i < THREADS; ++i) CloseHandle(threads[i]); #else for (i = 0; i < THREADS; ++i) pthread_create(&threads[i], NULL, fn, (void *) i); for (i = 0; i < THREADS; ++i) pthread_join(threads[i], NULL); #endif return 0; } #endif