1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MWL#192: Non-blocking client API for libmysqlclient.

All client functions that can block on I/O have alternate _start() and
_cont() versions that do not block but return control back to the
application, which can then issue I/O wait in its own fashion and later
call back into the library to continue the operation.

Works behind the scenes by spawning a co-routine/fiber to run the
blocking operation and suspend it while waiting for I/O. This
co-routine/fiber use is invisible to applications.

For i368/x86_64 on GCC, uses very fast assembler co-routine support. On
Windows uses native Win32 Fibers. Falls back to POSIX ucontext on other
platforms. Assembler routines for more platforms are relatively easy to
add by extending mysys/my_context.c, eg. similar to the Lua lcoco
library.

For testing, mysqltest and mysql_client_test are extended with the
option --non-blocking-api. This causes the programs to use the
non-blocking API for database access. mysql-test-run.pl has a similar
option --non-blocking-api that uses this, as well as additional
testcases.

An example program tests/async_queries.c is included that uses the new
non-blocking API with libevent to show how, in a single-threaded
program, to issue many queries in parallel against a database.


client/async_example.c:
  Fix const warning
  ******
  Fix bug with wrong timeout value for poll().
include/Makefile.am:
  Fix missing include for `make dist`
include/mysql.h:
  Add prototypes for all non-blocking API calls.
include/mysql.h.pp:
  Add prototypes for all non-blocking API calls.
mysys/my_context.c:
  Fix type warning for makecontext() function pointer argument.
sql-common/mysql_async.c:
  Fix crashes in the non-blocking API for functions that can take MYSQL argument
  that is NULL.
tests/Makefile.am:
  Add header file to `make dist`
tests/mysql_client_test.c:
  Replace blocking calls with wrappers around the non-blocking calls, used in
  mysql_client_test to test the new non-blocking API.
tests/nonblock-wrappers.h:
  Replace blocking calls with wrappers around the non-blocking calls, used in
  mysql_client_test to test the new non-blocking API.
This commit is contained in:
unknown
2011-09-20 12:49:25 +02:00
parent 1a344b87e4
commit a5b881594d
41 changed files with 4389 additions and 38 deletions

View File

@@ -404,6 +404,27 @@ static CODE_STATE *code_state(void)
return cs;
}
void
dbug_swap_code_state(void **code_state_store)
{
CODE_STATE *cs, **cs_ptr;
if (!(cs_ptr= (CODE_STATE**) my_thread_var_dbug()))
return;
cs= *cs_ptr;
*cs_ptr= *code_state_store;
*code_state_store= cs;
}
void dbug_free_code_state(void **code_state_store)
{
if (*code_state_store)
{
free(*code_state_store);
*code_state_store= NULL;
}
}
#else /* !THREAD */
static CODE_STATE static_code_state=
@@ -424,6 +445,35 @@ static CODE_STATE *code_state(void)
return &static_code_state;
}
void
dbug_swap_code_state(void **code_state_store)
{
CODE_STATE temp, *cs;
if (!(cs= *code_state_store))
{
cs= (CODE_STATE *)DbugMalloc(sizeof(*cs));
cs->process= db_process ? db_process : "dbug";
cs->func="?func";
cs->file="?file";
cs->stack=&init_settings;
*code_state_store= cs;
}
memcpy(&temp, cs, sizeof(*cs));
memcpy(cs, &static_code_state, sizeof(*cs));
memcpy(&static_code_state, &temp, sizeof(*cs));
}
void
dbug_free_code_state(void **code_state_store)
{
if (*code_state_store)
{
free(*code_state_store);
*code_state_store= NULL;
}
}
#define pthread_mutex_lock(A) {}
#define pthread_mutex_unlock(A) {}
#endif