From: Continuous Integration Date: Sat, 6 Oct 2012 13:07:31 +0000 (-0400) Subject: Merge lp:~tangent-org/libmemcached/1.0-build Build: jenkins-Libmemcached-1.0-54 X-Git-Tag: 1.0.13~11 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=3946da421f695bdc5eda65f70ab8f7a4e1786586;hp=5b4562fb7d21aeccdd0ce21e86e4efd1ade9c778;p=awesomized%2Flibmemcached Merge lp:~tangent-org/libmemcached/1.0-build Build: jenkins-Libmemcached-1.0-54 --- diff --git a/.bzrignore b/.bzrignore index dd7926d9..866ad779 100644 --- a/.bzrignore +++ b/.bzrignore @@ -34,6 +34,7 @@ TAGS aclocal.m4 autom4te.cache autoscan.log +build-aux/ clients/memaslap clients/memcapable clients/memcat @@ -95,12 +96,16 @@ libtest/unittest libtest/version.h libtest/wait libtool +m4/.git m4/libtool.m4 m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 +man/*.1 +man/*.3 +man/*.8 memcached/.git memcached/.gitignore memcached/memcached @@ -150,7 +155,3 @@ tests/testudp tests/var/ tmp_chroot unittests/unittests -m4/.git -man/*.1 -man/*.3 -man/*.8 diff --git a/ChangeLog b/ChangeLog index 1d9524c1..6a5c44fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +1.0.12 +* Added memcached_result_take_value(). + 1.0.11 Sun Sep 16 20:32:13 EDT 2012 * Removed custom version of memcached. * Updated hardening rules. diff --git a/bootstrap.sh b/bootstrap.sh index 74637a89..9c873188 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -281,7 +281,32 @@ run() { $@ $ARGS } +parse_command_line_options() { + + if ! options=$(getopt -o c --long configure -n 'bootstrap' -- "$@"); then + exit 1 + fi + + eval set -- "$options" + + while [ $# -gt 0 ]; do + case $1 in + -c | --configure ) + CONFIGURE_OPTION="yes" ; shift;; + -- ) + shift; break;; + -* ) + echo "$0: error - unrecognized option $1" 1>&2; exit 1;; + *) + break;; + esac + done +} + + + bootstrap() { + parse_command_line_options $@ determine_target_platform if [ -d .git ]; then @@ -345,6 +370,10 @@ bootstrap() { run $AUTORECONF $AUTORECONF_FLAGS || die "Cannot execute $AUTORECONF $AUTORECONF_FLAGS" configure_target_platform + + if [ "$CONFIGURE_OPTION" == "yes" ]; then + exit + fi # Backwards compatibility if [ -n "$VALGRIND" ]; then @@ -382,8 +411,9 @@ bootstrap() { export -n VCS_CHECKOUT export -n PLATFORM export -n TARGET_PLATFORM +CONFIGURE_OPTION=no VCS_CHECKOUT= PLATFORM=unknown TARGET_PLATFORM=unknown -bootstrap +bootstrap $@ diff --git a/configure.ac b/configure.ac index b8bff611..3827735a 100644 --- a/configure.ac +++ b/configure.ac @@ -255,9 +255,6 @@ AX_CHECK_LIBRARY([LIBEVENT], [event.h], [event], [AC_MSG_WARN([Unable to find libevent])]) AM_CONDITIONAL(HAVE_LIBEVENT, test "x${ax_cv_have_LIBEVENT}" = "xyes") -AX_CHECK_SOCK_CLOEXEC([AC_DEFINE([HAVE_SOCK_CLOEXEC], [1], [Check for SOCK_CLOEXEC.])], - [AC_DEFINE([HAVE_SOCK_CLOEXEC], [0], [Check for SOCK_CLOEXEC.])]) - AX_UUID_GENERATE_TIME_SAFE diff --git a/docs/memcached_result_st.rst b/docs/memcached_result_st.rst index 3cd9afe2..9b60f187 100644 --- a/docs/memcached_result_st.rst +++ b/docs/memcached_result_st.rst @@ -20,6 +20,8 @@ SYNOPSIS .. c:function:: const char *memcached_result_value (memcached_result_st *ptr) +.. c:function:: char *memcached_result_take_value (memcached_result_st *ptr) + .. c:function:: size_t memcached_result_length (const memcached_result_st *ptr) .. c:function:: uint32_t memcached_result_flags (const memcached_result_st *result) @@ -67,6 +69,11 @@ the current result object. :c:func:`memcached_result_value` returns the result value associated with the current result object. +:c:func:`memcached_result_take_value` returns and hands over the result value +associated with the current result object. You must call free() to release this +value, unless you have made use of a custom allocator. Use of a custom +allocator requires that you create your own custom free() to release it. + :c:func:`memcached_result_length` returns the result length associated with the current result object. diff --git a/libmemcached-1.0/result.h b/libmemcached-1.0/result.h index a1f0aa96..615957f3 100644 --- a/libmemcached-1.0/result.h +++ b/libmemcached-1.0/result.h @@ -63,6 +63,9 @@ size_t memcached_result_key_length(const memcached_result_st *self); LIBMEMCACHED_API const char *memcached_result_value(const memcached_result_st *self); +LIBMEMCACHED_API +char *memcached_result_take_value(memcached_result_st *self); + LIBMEMCACHED_API size_t memcached_result_length(const memcached_result_st *self); diff --git a/libmemcached/connect.cc b/libmemcached/connect.cc index 5d180d18..65be51a0 100644 --- a/libmemcached/connect.cc +++ b/libmemcached/connect.cc @@ -43,7 +43,15 @@ #include #ifndef SOCK_CLOEXEC -#define SOCK_CLOEXEC 0 +# define SOCK_CLOEXEC 0 +#endif + +#ifndef SOCK_NONBLOCK +# define SOCK_NONBLOCK 0 +#endif + +#ifndef FD_CLOEXEC +# define FD_CLOEXEC 0 #endif static memcached_return_t connect_poll(org::libmemcached::Instance* server) @@ -245,28 +253,31 @@ static inline void set_socket_nonblocking(org::libmemcached::Instance* server) #else int flags; - do - { - flags= fcntl(server->fd, F_GETFL, 0); - } while (flags == -1 && (errno == EINTR || errno == EAGAIN)); - - if (flags == -1) - { - memcached_set_errno(*server, errno, NULL); - } - else if ((flags & O_NONBLOCK) == 0) + if (SOCK_NONBLOCK == 0) { - int rval; - do { - rval= fcntl(server->fd, F_SETFL, flags | O_NONBLOCK); - } while (rval == -1 && (errno == EINTR or errno == EAGAIN)); + flags= fcntl(server->fd, F_GETFL, 0); + } while (flags == -1 && (errno == EINTR || errno == EAGAIN)); - if (rval == -1) + if (flags == -1) { memcached_set_errno(*server, errno, NULL); } + else if ((flags & O_NONBLOCK) == 0) + { + int rval; + + do + { + rval= fcntl(server->fd, F_SETFL, flags | O_NONBLOCK); + } while (rval == -1 && (errno == EINTR or errno == EAGAIN)); + + if (rval == -1) + { + memcached_set_errno(*server, errno, NULL); + } + } } #endif } @@ -386,7 +397,6 @@ static void set_socket_options(org::libmemcached::Instance* server) assert(error == 0); } - /* libmemcached will always use nonblocking IO to avoid write deadlocks */ set_socket_nonblocking(server); } @@ -396,7 +406,18 @@ static memcached_return_t unix_socket_connect(org::libmemcached::Instance* serve #ifndef WIN32 WATCHPOINT_ASSERT(server->fd == INVALID_SOCKET); - if ((server->fd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + int type= SOCK_STREAM; + if (SOCK_CLOEXEC) + { + type|= SOCK_CLOEXEC; + } + + if (SOCK_NONBLOCK) + { + type|= SOCK_NONBLOCK; + } + + if ((server->fd= socket(AF_UNIX, type, 0)) < 0) { memcached_set_errno(*server, errno, NULL); return MEMCACHED_CONNECTION_FAILURE; @@ -481,11 +502,16 @@ static memcached_return_t network_connect(org::libmemcached::Instance* server) } int type= server->address_info_next->ai_socktype; - if (HAVE_SOCK_CLOEXEC) + if (SOCK_CLOEXEC) { type|= SOCK_CLOEXEC; } + if (SOCK_NONBLOCK) + { + type|= SOCK_NONBLOCK; + } + if ((server->fd= socket(server->address_info_next->ai_family, type, server->address_info_next->ai_protocol)) < 0) @@ -493,15 +519,17 @@ static memcached_return_t network_connect(org::libmemcached::Instance* server) return memcached_set_errno(*server, get_socket_errno(), NULL); } - if (HAVE_SOCK_CLOEXEC == 0) + // If SOCK_CLOEXEC exists then we don't need to call the following + if (SOCK_CLOEXEC == 0) { -#ifdef FD_CLOEXEC - int rval; - do + if (FD_CLOEXEC) { - rval= fcntl (server->fd, F_SETFD, FD_CLOEXEC); - } while (rval == -1 && (errno == EINTR or errno == EAGAIN)); -#endif + int rval; + do + { + rval= fcntl (server->fd, F_SETFD, FD_CLOEXEC); + } while (rval == -1 && (errno == EINTR or errno == EAGAIN)); + } } set_socket_options(server); diff --git a/libmemcached/result.cc b/libmemcached/result.cc index e7bac559..c3e0b452 100644 --- a/libmemcached/result.cc +++ b/libmemcached/result.cc @@ -162,6 +162,12 @@ size_t memcached_result_length(const memcached_result_st *self) return memcached_string_length(sptr); } +char *memcached_result_take_value(memcached_result_st *self) +{ + memcached_string_st *sptr= &self->value; + return memcached_string_take_value(sptr); +} + uint32_t memcached_result_flags(const memcached_result_st *self) { return self->item_flags; diff --git a/m4/check_sock_cloexec.m4 b/m4/check_sock_cloexec.m4 deleted file mode 100644 index 8dcd14f5..00000000 --- a/m4/check_sock_cloexec.m4 +++ /dev/null @@ -1,27 +0,0 @@ -# Author? -# AX_CHECK_SOCK_CLOEXEC([action-if-found], [action-if-not-found]) -# - -#serial 2 - -AC_DEFUN([AX_CHECK_SOCK_CLOEXEC], [ - AC_CACHE_CHECK([whether SOCK_CLOEXEC is supported], [ax_cv_sock_cloexec], [ - AC_LANG_PUSH([C]) - AC_RUN_IFELSE([ - AC_LANG_PROGRAM([ - - /* SOCK_CLOEXEC test */ -#include -#include - - ], [ - int s= socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); - return (s == -1); - ])], - [ax_cv_sock_cloexec=yes], - [ax_cv_sock_cloexec=no], - [AC_MSG_WARN([test program execution failed])]) - ]) - - AS_IF([test x"ax_cv_sock_cloexec" = xyes], [AC_MSG_RESULT([yes]) ; $1], AC_MSG_RESULT([no]) ; $2) - ]) diff --git a/tests/libmemcached-1.0/mem_functions.cc b/tests/libmemcached-1.0/mem_functions.cc index 2155f7f3..10b84683 100644 --- a/tests/libmemcached-1.0/mem_functions.cc +++ b/tests/libmemcached-1.0/mem_functions.cc @@ -4683,6 +4683,10 @@ test_return_t regression_994772_TEST(memcached_st* memc) uint64_t cas_value= memcached_result_cas(results); test_true(cas_value); + char* take_value= memcached_result_take_value(results); + test_strcmp(__func__, take_value); + free(take_value); + memcached_result_free(results); // Bad cas value, sanity check