summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Aker <brian@tangent.org>2012-08-12 13:34:01 -0400
committerBrian Aker <brian@tangent.org>2012-08-12 13:34:01 -0400
commit40353ce2b76875202b3d37ad32c645ec18933bed (patch)
tree536903736525472604e836983c6ba845dd8308c9
parent00a8f6f7d315dc3fce0b0e5a1987c8663488ae1c (diff)
downloadlibmemcached-40353ce2b76875202b3d37ad32c645ec18933bed.tar.gz
Fix snd/recv when number is higher then domain of value.
-rw-r--r--libmemcached-1.0/struct/memcached.h2
-rw-r--r--libmemcached/connect.cc20
-rw-r--r--libmemcached/csl/context.h3
-rw-r--r--tests/libmemcached-1.0/mem_functions.cc1
4 files changed, 17 insertions, 9 deletions
diff --git a/libmemcached-1.0/struct/memcached.h b/libmemcached-1.0/struct/memcached.h
index 63b07a00..624887b7 100644
--- a/libmemcached-1.0/struct/memcached.h
+++ b/libmemcached-1.0/struct/memcached.h
@@ -45,7 +45,7 @@ struct memcached_st {
bool is_purging:1;
bool is_processing_input:1;
bool is_time_for_rebuild:1;
- bool not_used:1;
+ bool is_parsing:1;
} state;
struct {
diff --git a/libmemcached/connect.cc b/libmemcached/connect.cc
index 1ace3fd8..dfe69c0b 100644
--- a/libmemcached/connect.cc
+++ b/libmemcached/connect.cc
@@ -250,27 +250,26 @@ static void set_socket_options(org::libmemcached::Instance* server)
}
#ifdef HAVE_SNDTIMEO
- if (server->root->snd_timeout)
+ if (server->root->snd_timeout > 0)
{
struct timeval waittime;
- waittime.tv_sec= 0;
- waittime.tv_usec= server->root->snd_timeout;
+ waittime.tv_sec= server->root->snd_timeout / 1000000;
+ waittime.tv_usec= server->root->snd_timeout % 1000000;
int error= setsockopt(server->fd, SOL_SOCKET, SO_SNDTIMEO,
- &waittime, (socklen_t)sizeof(struct timeval));
- (void)(error);
+ &waittime, (socklen_t)sizeof(struct timeval));
assert(error == 0);
}
#endif
#ifdef HAVE_RCVTIMEO
- if (server->root->rcv_timeout)
+ if (server->root->rcv_timeout > 0)
{
struct timeval waittime;
- waittime.tv_sec= 0;
- waittime.tv_usec= server->root->rcv_timeout;
+ waittime.tv_sec= server->root->rcv_timeout / 1000000;
+ waittime.tv_usec= server->root->rcv_timeout % 1000000;
int error= setsockopt(server->fd, SOL_SOCKET, SO_RCVTIMEO,
&waittime, (socklen_t)sizeof(struct timeval));
@@ -737,6 +736,11 @@ static memcached_return_t _memcached_connect(org::libmemcached::Instance* server
memcached_return_t memcached_connect_try(org::libmemcached::Instance* server)
{
+ if (server and server->root and server->root->state.is_parsing)
+ {
+ return MEMCACHED_SUCCESS;
+ }
+
return _memcached_connect(server, false);
}
diff --git a/libmemcached/csl/context.h b/libmemcached/csl/context.h
index 77fac219..12e028dd 100644
--- a/libmemcached/csl/context.h
+++ b/libmemcached/csl/context.h
@@ -61,6 +61,8 @@ public:
memc= memc_arg;
init_scanner();
rc= MEMCACHED_SUCCESS;
+
+ memc->state.is_parsing= true;
}
bool end()
@@ -106,6 +108,7 @@ public:
~Context()
{
destroy_scanner();
+ memc->state.is_parsing= false;
}
yytokentype previous_token;
diff --git a/tests/libmemcached-1.0/mem_functions.cc b/tests/libmemcached-1.0/mem_functions.cc
index 07603cb4..3b1701e8 100644
--- a/tests/libmemcached-1.0/mem_functions.cc
+++ b/tests/libmemcached-1.0/mem_functions.cc
@@ -4480,6 +4480,7 @@ test_return_t regression_1021819_TEST(memcached_st *original)
test_true(memc);
test_compare(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 2000000), MEMCACHED_SUCCESS);
+ test_compare(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 3000000), MEMCACHED_SUCCESS);
memcached_return_t rc;