Merge lp:~tangent-org/libmemcached/1.0-build Build: jenkins-Libmemcached-1.0-54
authorContinuous Integration <ci@tangent.org>
Sat, 6 Oct 2012 13:07:31 +0000 (09:07 -0400)
committerContinuous Integration <ci@tangent.org>
Sat, 6 Oct 2012 13:07:31 +0000 (09:07 -0400)
.bzrignore
ChangeLog
bootstrap.sh
configure.ac
docs/memcached_result_st.rst
libmemcached-1.0/result.h
libmemcached/connect.cc
libmemcached/result.cc
m4/check_sock_cloexec.m4 [deleted file]
tests/libmemcached-1.0/mem_functions.cc

index dd7926d9bf494e86c9b031f397e0e4e8e71c0d9d..866ad77963300c1ac05e6da986d7bb82628ade4e 100644 (file)
@@ -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
index 1d9524c1d56184dbd625e7aac65b864ed424989d..6a5c44fe45ec8265d37949fb3f030cd29b376163 100644 (file)
--- 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.
index 74637a89b2a6acb6da967804de3e89ad42618d47..9c8731888fecbe3b402abb75162d361822fe9f1f 100755 (executable)
@@ -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 $@
index b8bff611b149b1d09dc10b45e484847a2908bf09..3827735a4e752892a235ba722422792133a72c33 100644 (file)
@@ -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
 
 
index 3cd9afe2bd873060ebe88a79c5de3cb3280d56f1..9b60f1872fe908bfba56c7bad1d3b0acf16147ca 100644 (file)
@@ -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.
 
index a1f0aa961e58718a756ecda4667b95fdae352e17..615957f3906420cbb204168b00ca6387b74d9be0 100644 (file)
@@ -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);
 
index 5d180d185e0208004270c707887a51499e26b91b..65be51a07f9a2c509f7dba7bc6c11043e358bc1a 100644 (file)
 #include <sys/time.h>
 
 #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);
index e7bac559d6456cc17d1bcfb890442dccf62c0a18..c3e0b452cb39d0c6291ed0292985d7676d58b176 100644 (file)
@@ -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 (file)
index 8dcd14f..0000000
+++ /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 <sys/types.h>
-#include <sys/socket.h>
-
-          ], [
-          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)
-    ])
index 2155f7f3157c1130edd81d6065f52de07be129ae..10b8468359cff8cfe88f59a04e6220e9c06dfc06 100644 (file)
@@ -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