-
Notifications
You must be signed in to change notification settings - Fork 4
Experiments with using C-level co-routines for implementing a non-blocking API on top of libmysqlclient
License
knielsen/libmysql-coroutine
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Experiments with using C-level co-routines (like Posix swapcontext()) to get non-blocking operation from libmysqlclient. ----------------------------------------------------------------------- Here is a small example of suggested non-blocking API: static void wait_for_mysql(MYSQL *mysql, int status) { struct pollfd pfd; p.fd= mysql_get_socket_fd(&mysql); p.events= (status & MYSQL_WAIT_READ ? POLLIN : 0) | (status & MYSQL_WAIT_WRITE ? POLLOUT : 0); poll(&pfd, 1, 0); } status= mysql_real_connect_start(&ret, &mysql, "localhost", "test", "testpass", "test", 0, NULL, 0); while (status) { wait_for_mysql(&mysql, status); status= mysql_real_connect_cont(&ret, &mysql); } status= mysql_real_query_start(&err, &mysql, SL("SHOW STATUS")); while (status) { wait_for_mysql(&mysql, status); status= mysql_real_query_cont(&err, &mysql); } status= mysql_fetch_row_start(&row, res); while (status) { wait_for_mysql(&mysql, status); status= mysql_fetch_row_cont(&row, res); } Idea is that if a call R=foo(...) can block, we introduce two more calls S=foo_start(&R, ...) S=foo_cont(&R, ...) S (status) returns 0 is the call is done; then R is set to the return value from the non-blocking call. When S returns non-zero, then the call is blocking on some condition; individual bits in S say what we are waiting for, eg. MYSQL_WAIT_READ or MYSQL_WAIT_WRITE.
About
Experiments with using C-level co-routines for implementing a non-blocking API on top of libmysqlclient
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published