summaryrefslogtreecommitdiffstats
path: root/libmariadb/unittest/libmariadb/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmariadb/unittest/libmariadb/thread.c')
-rw-r--r--libmariadb/unittest/libmariadb/thread.c180
1 files changed, 180 insertions, 0 deletions
diff --git a/libmariadb/unittest/libmariadb/thread.c b/libmariadb/unittest/libmariadb/thread.c
new file mode 100644
index 00000000..6fae38a8
--- /dev/null
+++ b/libmariadb/unittest/libmariadb/thread.c
@@ -0,0 +1,180 @@
+/*
+*/
+
+#include "my_test.h"
+#include <ma_pthread.h>
+
+static int basic_connect(MYSQL *unused __attribute__((unused)))
+{
+ MYSQL_ROW row;
+ MYSQL_RES *res;
+ MYSQL_FIELD *field;
+ int rc;
+
+ MYSQL *my= mysql_init(NULL);
+ FAIL_IF(!my, "mysql_init() failed");
+
+ FAIL_IF(!my_test_connect(my, hostname, username, password, schema,
+ port, socketname, 0), mysql_error(my));
+
+ rc= mysql_query(my, "SELECT @@version");
+ check_mysql_rc(rc, my);
+
+ res= mysql_store_result(my);
+ FAIL_IF(!res, mysql_error(my));
+ field= mysql_fetch_fields(res);
+ FAIL_IF(!field, "Couldn't fetch fields");
+
+ while ((row= mysql_fetch_row(res)) != NULL)
+ {
+ FAIL_IF(mysql_num_fields(res) != 1, "Got the wrong number of fields");
+ }
+ FAIL_IF(mysql_errno(my), mysql_error(my));
+
+ mysql_free_result(res);
+ mysql_close(my);
+
+
+ return OK;
+}
+
+pthread_mutex_t LOCK_test;
+
+#ifndef _WIN32
+int thread_conc27(void);
+#else
+DWORD WINAPI thread_conc27(void);
+#endif
+
+#define THREAD_NUM 100
+
+/* run this test as root and increase the number of handles (ulimit -n) */
+static int test_conc_27(MYSQL *mysql)
+{
+
+ int rc;
+ int i;
+ MYSQL_ROW row;
+ MYSQL_RES *res;
+#ifndef _WIN32
+ pthread_t threads[THREAD_NUM];
+#else
+ HANDLE hthreads[THREAD_NUM];
+ DWORD threads[THREAD_NUM];
+#endif
+
+ diag("please run this test manually as root");
+ return SKIP;
+
+ rc= mysql_query(mysql, "DROP TABLE IF EXISTS t_conc27");
+ check_mysql_rc(rc, mysql);
+
+ rc= mysql_query(mysql, "CREATE TABLE t_conc27(a int)");
+ check_mysql_rc(rc, mysql);
+
+ rc= mysql_query(mysql, "INSERT INTO t_conc27 VALUES(0)");
+ check_mysql_rc(rc, mysql);
+
+ rc= mysql_query(mysql, "SET @a:=@@max_connections");
+ check_mysql_rc(rc, mysql);
+
+ rc= mysql_query(mysql, "SET GLOBAL max_connections=100000");
+ check_mysql_rc(rc, mysql);
+
+ pthread_mutex_init(&LOCK_test, NULL);
+ for (i=0; i < THREAD_NUM; i++)
+ {
+#ifndef _WIN32
+ pthread_create(&threads[i], NULL, (void *)thread_conc27, NULL);
+#else
+ hthreads[i]= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_conc27, NULL, 0, &threads[i]);
+ if (hthreads[i]==NULL)
+ diag("error while starting thread");
+#endif
+ }
+ for (i=0; i < THREAD_NUM; i++)
+ {
+#ifndef _WIN32
+ pthread_join(threads[i], NULL);
+#else
+ WaitForSingleObject(hthreads[i], INFINITE);
+#endif
+ }
+
+ pthread_mutex_destroy(&LOCK_test);
+
+ rc= mysql_query(mysql, "SET GLOBAL max_connections=@a");
+ check_mysql_rc(rc, mysql);
+
+ rc= mysql_query(mysql, "SELECT a FROM t_conc27");
+ check_mysql_rc(rc,mysql);
+
+ res= mysql_store_result(mysql);
+ FAIL_IF(!res, "invalid result");
+
+ row= mysql_fetch_row(res);
+ FAIL_IF(!row, "can't fetch row");
+
+ diag("row=%s", row[0]);
+ FAIL_IF(atoi(row[0]) != THREAD_NUM, "expected value THREAD_NUM");
+ mysql_free_result(res);
+ rc= mysql_query(mysql, "DROP TABLE t_conc27");
+ check_mysql_rc(rc,mysql);
+
+ return OK;
+}
+
+#ifndef _WIN32
+int thread_conc27(void)
+#else
+DWORD WINAPI thread_conc27(void)
+#endif
+{
+ MYSQL *mysql;
+ int rc;
+ MYSQL_RES *res;
+ mysql_thread_init();
+ mysql= mysql_init(NULL);
+ if(!my_test_connect(mysql, hostname, username, password, schema,
+ port, socketname, 0))
+ {
+ diag(">Error: %s", mysql_error(mysql));
+ mysql_close(mysql);
+ mysql_thread_end();
+ goto end;
+ }
+ pthread_mutex_lock(&LOCK_test);
+ rc= mysql_query(mysql, "UPDATE t_conc27 SET a=a+1");
+ check_mysql_rc(rc, mysql);
+ pthread_mutex_unlock(&LOCK_test);
+ check_mysql_rc(rc, mysql);
+ if ((res= mysql_store_result(mysql)))
+ mysql_free_result(res);
+ mysql_close(mysql);
+end:
+ mysql_thread_end();
+ return 0;
+}
+
+struct my_tests_st my_tests[] = {
+ {"basic_connect", basic_connect, TEST_CONNECTION_NONE, 0, NULL, NULL},
+ {"test_conc_27", test_conc_27, TEST_CONNECTION_NEW, 0, NULL, NULL},
+ {NULL, NULL, 0, 0, NULL, NULL}
+};
+
+
+int main(int argc, char **argv)
+{
+
+ mysql_library_init(0,0,NULL);
+
+ if (argc > 1)
+ get_options(argc, argv);
+
+ get_envvars();
+
+ run_tests(my_tests);
+
+ mysql_server_end();
+ return(exit_status());
+}