summaryrefslogtreecommitdiff
path: root/vio/viosocket.c
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@montyprogram.com>2012-02-27 19:32:44 +0100
committerVladislav Vaintroub <wlad@montyprogram.com>2012-02-27 19:32:44 +0100
commit62dcaf8c2911572d730ba5e617a7c3cbbf86b22a (patch)
treedd1e73c8a65fd1570c4594870bb0e8afd2d271f6 /vio/viosocket.c
parent58c3e32dbdd43e8635c0320fcf5cc744e354fc65 (diff)
parent3ebb4b883370da9528b7482b8ba4ed9521f07553 (diff)
downloadmariadb-git-62dcaf8c2911572d730ba5e617a7c3cbbf86b22a.tar.gz
merge 5.5
Diffstat (limited to 'vio/viosocket.c')
-rw-r--r--vio/viosocket.c48
1 files changed, 43 insertions, 5 deletions
diff --git a/vio/viosocket.c b/vio/viosocket.c
index e656d1809e4..05cb8bc16d4 100644
--- a/vio/viosocket.c
+++ b/vio/viosocket.c
@@ -24,6 +24,8 @@
*/
#include "vio_priv.h"
+#include "my_context.h"
+#include <mysql_async.h>
#ifdef FIONREAD_IN_SYS_FILIO
# include <sys/filio.h>
@@ -44,12 +46,26 @@ size_t vio_read(Vio * vio, uchar* buf, size_t size)
/* Ensure nobody uses vio_read_buff and vio_read simultaneously */
DBUG_ASSERT(vio->read_end == vio->read_pos);
+ if (vio->async_context && vio->async_context->active)
+ r= my_recv_async(vio->async_context, vio->sd, buf, size, vio->read_timeout);
+ else
+ {
+ if (vio->async_context)
+ {
+ /*
+ If switching from non-blocking to blocking API usage, set the socket
+ back to blocking mode.
+ */
+ my_bool old_mode;
+ vio_blocking(vio, TRUE, &old_mode);
+ }
#ifdef __WIN__
- r = recv(vio->sd, buf, size,0);
+ r = recv(vio->sd, buf, size,0);
#else
- errno=0; /* For linux */
- r = read(vio->sd, buf, size);
+ errno=0; /* For linux */
+ r = read(vio->sd, buf, size);
#endif /* __WIN__ */
+ }
#ifndef DBUG_OFF
if (r == (size_t) -1)
{
@@ -116,11 +132,26 @@ size_t vio_write(Vio * vio, const uchar* buf, size_t size)
DBUG_ENTER("vio_write");
DBUG_PRINT("enter", ("sd: %d buf: 0x%lx size: %u", vio->sd, (long) buf,
(uint) size));
+ if (vio->async_context && vio->async_context->active)
+ r= my_send_async(vio->async_context, vio->sd, buf, size,
+ vio->write_timeout);
+ else
+ {
+ if (vio->async_context)
+ {
+ /*
+ If switching from non-blocking to blocking API usage, set the socket
+ back to blocking mode.
+ */
+ my_bool old_mode;
+ vio_blocking(vio, TRUE, &old_mode);
+ }
#ifdef __WIN__
- r = send(vio->sd, buf, size,0);
+ r = send(vio->sd, buf, size,0);
#else
- r = write(vio->sd, buf, size);
+ r = write(vio->sd, buf, size);
#endif /* __WIN__ */
+ }
#ifndef DBUG_OFF
if (r == (size_t) -1)
{
@@ -689,6 +720,8 @@ my_bool vio_poll_read(Vio *vio, uint timeout)
{
my_socket sd= vio->sd;
DBUG_ENTER("vio_poll_read");
+ if (vio->async_context && vio->async_context->active)
+ DBUG_RETURN(my_poll_read_async(vio->async_context, timeout));
#ifdef HAVE_OPENSSL
if (vio->type == VIO_TYPE_SSL)
sd= SSL_get_fd((SSL*) vio->ssl_arg);
@@ -777,6 +810,11 @@ void vio_timeout(Vio *vio, uint which, uint timeout)
thr_alarm or just run without read/write timeout(s)
*/
#endif
+ /* Make timeout values available for async operations. */
+ if (which)
+ vio->write_timeout= timeout;
+ else
+ vio->read_timeout= timeout;
}