Updated with Twitter's memcached_server_error() function.
authorBrian Aker <brian@gir.tangent.org>
Wed, 15 Jul 2009 10:09:06 +0000 (03:09 -0700)
committerBrian Aker <brian@gir.tangent.org>
Wed, 15 Jul 2009 10:09:06 +0000 (03:09 -0700)
78 files changed:
ChangeLog
Makefile.am
clients/Makefile.am
clients/memcp.c
clients/memstat.c
clients/utilities.c
clients/utilities.h
config/autorun.sh
configure.ac
docs/Makefile.am
docs/memcached_memory_allocators.pod
docs/memcached_server_st.pod
docs/memcached_user_data.pod
libmemcached/Makefile.am
libmemcached/common.h
libmemcached/libmemcached_probes.d
libmemcached/memcached.h
libmemcached/memcached.hh
libmemcached/memcached_allocators.c
libmemcached/memcached_auto.c
libmemcached/memcached_behavior.c
libmemcached/memcached_callback.c
libmemcached/memcached_constants.h
libmemcached/memcached_delete.c
libmemcached/memcached_dump.c
libmemcached/memcached_get.c
libmemcached/memcached_get.h
libmemcached/memcached_hash.c
libmemcached/memcached_internal.h
libmemcached/memcached_io.h
libmemcached/memcached_key.c
libmemcached/memcached_parse.c
libmemcached/memcached_pool.h
libmemcached/memcached_response.c
libmemcached/memcached_result.c
libmemcached/memcached_result.h
libmemcached/memcached_server.c
libmemcached/memcached_server.h
libmemcached/memcached_stats.c
libmemcached/memcached_storage.c
libmemcached/memcached_storage.h
libmemcached/memcached_strerror.c
libmemcached/memcached_string.c
libmemcached/memcached_string.h
libmemcached/memcached_util.h
libmemcached/memcached_version.c
libmemcached/memcached_watchpoint.h
libmemcached/visibility.h [new file with mode: 0644]
libmemcachedutil/memcached_pool.c
m4/64bit.m4 [deleted file]
m4/ac_cxx_compile_stdcxx_0x.m4 [new file with mode: 0644]
m4/ac_cxx_header_stdcxx_98.m4 [new file with mode: 0644]
m4/check_gcc_version.m4 [deleted file]
m4/dtrace.m4 [deleted file]
m4/extensions.m4
m4/memcached.m4
m4/pandora_64bit.m4 [new file with mode: 0644]
m4/pandora_canonical.m4 [new file with mode: 0644]
m4/pandora_check_compiler_version.m4 [new file with mode: 0644]
m4/pandora_check_cxx_standard.m4 [new file with mode: 0644]
m4/pandora_enable_dtrace.m4 [new file with mode: 0644]
m4/pandora_ensure_gcc_version.m4 [new file with mode: 0644]
m4/pandora_header_assert.m4 [new file with mode: 0644]
m4/pandora_libtool.m4 [new file with mode: 0644]
m4/pandora_optimize.m4 [new file with mode: 0644]
m4/pandora_shared_ptr.m4 [new file with mode: 0644]
m4/pandora_vc_build.m4 [new file with mode: 0644]
m4/pandora_warnings.m4 [new file with mode: 0644]
m4/visibility.m4 [new file with mode: 0644]
tests/Makefile.am
tests/atomsmasher.c
tests/function.c
tests/ketama_test_cases.h
tests/output.res
tests/plus.cpp
tests/server.c
tests/test.h
tests/udp.c

index a972319da5ac2e425337c349758243155a8cc3f1..950364b99b05eeeafa7044245a5a9f2bf7859127 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+  * Added Twitter's memcached_server_error() functions.
+  * Fix for OSX compiles in development builds.
+  * Updated C++ interface.
+
+0.31 Fri Jul 10 09:02:50 PDT 2009
+  * Added support or HA via replication.
+  * malloc() removed for server key usage.
+  * Update build system.
   * Added support for memcached_set_memory_allocators().
   * Fixed bug in configure.ac for have_htoll.
 
index 2ec3051406c6831c2f6230aa605e45f35f934353..672ac763adbafe7dd8c0fb7f87a4f7c98326c1bc 100644 (file)
@@ -1,6 +1,6 @@
 ACLOCAL_AMFLAGS = -I m4
 
-SUBDIRS = docs libmemcached libmemcachedutil tests support clients
+SUBDIRS = docs libmemcached libmemcachedutil support clients tests
 EXTRA_dist = README.FIRST
 
 check-local: test-no-outputdiff
index 9cb343182c722aecc5d5306a4382b4afee62b725..244c80d3b9e5a01b7759e581b5acce77841b2e1a 100644 (file)
@@ -1,4 +1,4 @@
-LDADDS = $(top_builddir)/libmemcached/libmemcached.la
+LDADDS = $(top_builddir)/libmemcached/libmemcached.la libutilities.la
 
 bin_PROGRAMS = memcat memdump memcp memstat memrm memflush memslap memerror
 
@@ -7,37 +7,43 @@ noinst_HEADERS = client_options.h \
                generator.h \
                execute.h 
 
-memcat_SOURCES = memcat.c utilities.c
+noinst_LTLIBRARIES= libutilities.la libgenexec.la
+
+libutilities_la_SOURCES= utilities.c
+libgenexec_la_SOURCES= generator.c execute.c
+
+memcat_SOURCES = memcat.c
 memcat_LDADD = $(LDADDS)
 memcat_LDFLAGS = -rpath $(pkglibdir)
 
-memcp_SOURCES = memcp.c utilities.c
+memcp_SOURCES = memcp.c
 memcp_LDADD = $(LDADDS)
 memcp_LDFLAGS = -rpath $(pkglibdir)
 
-memdump_SOURCES = memdump.c utilities.c
+memdump_SOURCES = memdump.c
 memdump_LDADD = $(LDADDS)
 memdump_LDFLAGS = -rpath $(pkglibdir)
 
-memstat_SOURCES = memstat.c utilities.c
+memstat_SOURCES = memstat.c
 memstat_LDADD = $(LDADDS)
 memstat_LDFLAGS = -rpath $(pkglibdir)
 
-memrm_SOURCES = memrm.c utilities.c
+memrm_SOURCES = memrm.c
 memrm_LDADD = $(LDADDS)
 memrm_LDFLAGS = -rpath $(pkglibdir)
 
-memflush_SOURCES = memflush.c utilities.c
+memflush_SOURCES = memflush.c
 memflush_LDADD = $(LDADDS)
 memflush_LDFLAGS = -rpath $(pkglibdir)
 
-memerror_SOURCES = memerror.c utilities.c
+memerror_SOURCES = memerror.c
 memerror_LDADD = $(LDADDS)
 memerror_LDFLAGS = -rpath $(pkglibdir)
 
-memslap_SOURCES = memslap.c utilities.c generator.c execute.c
-memslap_LDADD = $(LDADDS) -lpthread
-memslap_LDFLAGS = -rpath $(pkglibdir)
+memslap_SOURCES = memslap.c
+memslap_CFLAGS = $(AM_CFLAGS) $(PTHREAD_CFLAGS)
+memslap_LDADD = $(LDADDS) $(PTHREAD_LIBS) libgenexec.la
+memslap_LDFLAGS = $(AM_LDFLAGS) -rpath $(pkglibdir)
 
 test-start-server:
        memflush --servers=localhost
index d6864b1ad2dd18405419bb121cf779dafcdf25c8..778beaf783c10298201666453d86ed34ea698ba0 100644 (file)
@@ -91,7 +91,7 @@ int main(int argc, char *argv[])
 
     if (opt_verbose) 
     {
-      static char *opstr[] = { "set", "add", "replace" };
+      static const char *opstr[] = { "set", "add", "replace" };
       printf("op: %s\nsource file: %s\nlength: %zu\n"
             "key: %s\nflags: %x\nexpires: %llu\n",
             opstr[opt_method - OPT_SET], argv[optind], (size_t)sbuf.st_size,
index 817b9f6d1191d30cf2f2ae72aa65366b6a02e228..27c34a41c2caf4ad048c3bb4f8320cfe5950142a 100644 (file)
@@ -19,9 +19,9 @@
 
 /* Prototypes */
 static void options_parse(int argc, char *argv[]);
-static void run_analyzer(memcached_st *memc, memcached_stat_st *stat,
+static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat,
                          memcached_server_st *server_list);
-static void print_server_listing(memcached_st *memc, memcached_stat_st *stat,
+static void print_server_listing(memcached_st *memc, memcached_stat_st *memc_stat,
                                  memcached_server_st *server_list);
 static void print_analysis_report(memcached_st *memc,
                                   memcached_analysis_st *report,
index 6551684db003f26c0497c80d149d0da1f6f04b3e..9ad6edcf90789310dea7d3c4da3abcc8dbb45ac1 100644 (file)
@@ -16,13 +16,13 @@ long int timedif(struct timeval a, struct timeval b)
   return s + us;
 }
 
-void version_command(char *command_name)
+void version_command(const char *command_name)
 {
   printf("%s v%u.%u\n", command_name, 1, 0);
   exit(0);
 }
 
-static char *lookup_help(memcached_options option)
+static const char *lookup_help(memcached_options option)
 {
   switch (option)
   {
@@ -54,7 +54,7 @@ static char *lookup_help(memcached_options option)
   return "forgot to document this function :)";
 }
 
-void help_command(char *command_name, char *description,
+void help_command(const char *command_name, const char *description,
                   const struct option *long_options,
                   memcached_programs_help_st *options __attribute__((unused)))
 {
@@ -66,7 +66,7 @@ void help_command(char *command_name, char *description,
 
   for (x= 0; long_options[x].name; x++) 
   {
-    char *help_message;
+    const char *help_message;
 
     printf("\t --%s%c\n", long_options[x].name, 
            long_options[x].has_arg ? '=' : ' ');  
index ea0be2ea42234ab55ea7b09c3b320e939001ee79..af6706135b84a19232b4162ee1e542d0d0188f3f 100644 (file)
@@ -23,8 +23,8 @@ struct memcached_programs_help_st
 char *strdup_cleanup(const char *str);
 void cleanup(void);
 long int timedif(struct timeval a, struct timeval b);
-void version_command(char *command_name);
-void help_command(char *command_name, char *description,
+void version_command(const char *command_name);
+void help_command(const char *command_name, const char *description,
                   const struct option *long_options,
                   memcached_programs_help_st *options);
 void process_hash_option(memcached_st *memc, char *opt_hash);
index fdf58deab1caf5e40e91b4f7dbf4b8985bde8393..2e0d839f779d6ab50b5bc3195d64b37a81f5bd3b 100755 (executable)
-#!/usr/bin/env bash
+#!/bin/sh
 # Taken from lighthttpd server (BSD). Thanks Jan!
 # Run this to generate all the initial makefiles, etc.
 
 die() { echo "$@"; exit 1; }
 
-# LIBTOOLIZE=${LIBTOOLIZE:-libtoolize}
+# --force means overwrite ltmain.sh script if it already exists 
 LIBTOOLIZE_FLAGS=" --automake --copy --force"
-# ACLOCAL=${ACLOCAL:-aclocal}
-ACLOCAL_FLAGS="-I m4"
-# AUTOHEADER=${AUTOHEADER:-autoheader}
-# AUTOMAKE=${AUTOMAKE:-automake}
+# --add-missing instructs automake to install missing auxiliary files
+# and --force to overwrite them if they already exist
 AUTOMAKE_FLAGS="--add-missing --copy --force"
-# AUTOCONF=${AUTOCONF:-autoconf}
+ACLOCAL_FLAGS="-I m4"
 
 ARGV0=$0
 ARGS="$@"
 
-
 run() {
        echo "$ARGV0: running \`$@' $ARGS"
        $@ $ARGS
 }
 
-## jump out if one of the programs returns 'false'
-set -e
+# Try to locate a program by using which, and verify that the file is an
+# executable
+locate_binary() {
+  for f in $@
+  do
+    file=`which $f 2>/dev/null | grep -v '^no '`
+    if test -n "$file" -a -x "$file"; then
+      echo $file
+      return 0
+    fi
+  done
+
+  echo "" 
+  return 1
+}
 
-## We do not currently support glibtoolize
+# Try to detect the supported binaries if the user didn't
+# override that by pushing the environment variable
 if test x$LIBTOOLIZE = x; then
-  if test \! "x`which glibtoolize 2> /dev/null | grep -v '^no'`" = x; then
-    LIBTOOLIZE=glibtoolize
-  elif test \! "x`which libtoolize-1.5 2> /dev/null | grep -v '^no'`" = x; then
-    LIBTOOLIZE=libtoolize-1.5
-  elif test \! "x`which libtoolize 2> /dev/null | grep -v '^no'`" = x; then
-    LIBTOOLIZE=libtoolize
-  else 
-    echo "libtoolize 1.5.x wasn't found, exiting"; exit 0
+  LIBTOOLIZE=`locate_binary glibtoolize libtoolize-1.5 libtoolize`
+  if test x$LIBTOOLIZE = x; then
+    die "Did not find a supported libtoolize"
   fi
 fi
 
-## suse has aclocal and aclocal-1.9
 if test x$ACLOCAL = x; then
-  if test \! "x`which aclocal-1.10 2> /dev/null | grep -v '^no'`" = x; then
-    ACLOCAL=aclocal-1.10
-  elif test \! "x`which aclocal-1.9 2> /dev/null | grep -v '^no'`" = x; then
-    ACLOCAL=aclocal-1.9
-  elif test \! "x`which aclocal19 2> /dev/null | grep -v '^no'`" = x; then
-    ACLOCAL=aclocal19
-  elif test \! "x`which aclocal 2> /dev/null | grep -v '^no'`" = x; then
-    ACLOCAL=aclocal
-  else 
-    echo "automake 1.9.x (aclocal) wasn't found, exiting"; exit 0
+  ACLOCAL=`locate_binary aclocal-1.10 aclocal-1.9 aclocal19 aclocal`
+  if test x$ACLOCAL = x; then
+    die "Did not find a supported aclocal"
   fi
 fi
 
 if test x$AUTOMAKE = x; then
-  if test \! "x`which automake-1.10 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOMAKE=automake-1.10
-  elif test \! "x`which automake-1.9 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOMAKE=automake-1.9
-  elif test \! "x`which automake19 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOMAKE=automake19
-  elif test \! "x`which automake 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOMAKE=automake
-  else 
-    echo "automake 1.9.x wasn't found, exiting"; exit 0
+  AUTOMAKE=`locate_binary automake-1.10 automake-1.9 automake19 automake`
+  if test x$AUTOMAKE = x; then
+    die "Did not find a supported automake"
   fi
 fi
 
-
-## macosx has autoconf-2.59 and autoconf-2.60
 if test x$AUTOCONF = x; then
-  if test \! "x`which autoconf-2.59 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOCONF=autoconf-2.59
-  elif test \! "x`which autoconf259 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOCONF=autoconf259
-  elif test \! "x`which autoconf 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOCONF=autoconf
-  else 
-    echo "autoconf 2.59+ wasn't found, exiting"; exit 0
+  AUTOCONF=`locate_binary autoconf-2.59 autoconf259 autoconf`
+  if test x$AUTOCONF = x; then
+    die "Did not find a supported autoconf"
   fi
 fi
 
 if test x$AUTOHEADER = x; then
-  if test \! "x`which autoheader-2.59 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOHEADER=autoheader-2.59
-  elif test \! "x`which autoheader259 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOHEADER=autoheader259
-  elif test \! "x`which autoheader 2> /dev/null | grep -v '^no'`" = x; then
-    AUTOHEADER=autoheader
-  else 
-    echo "autoconf 2.59+ (autoheader) wasn't found, exiting"; exit 0
+  AUTOHEADER=`locate_binary autoheader-2.59 autoheader259 autoheader`
+  if test x$AUTOHEADER = x; then
+    die "Did not find a supported autoheader"
   fi
 fi
 
-
-# --force means overwrite ltmain.sh script if it already exists 
 run $LIBTOOLIZE $LIBTOOLIZE_FLAGS || die "Can't execute libtoolize"
-
 run $ACLOCAL $ACLOCAL_FLAGS || die "Can't execute aclocal"
 run $AUTOHEADER || die "Can't execute autoheader"
-
-# --add-missing instructs automake to install missing auxiliary files
-# and --force to overwrite them if they already exist
 run $AUTOMAKE $AUTOMAKE_FLAGS  || die "Can't execute automake"
 run $AUTOCONF || die "Can't execute autoconf"
 
-echo -n "Automade with: "
-$AUTOMAKE --version | head -1
-echo -n "Configured with: "
-$AUTOCONF --version | head -1
-
+echo "---"
+echo "Configured with the following tools:"
+echo "  * `$LIBTOOLIZE --version | head -1`"
+echo "  * `$ACLOCAL --version | head -1`"
+echo "  * `$AUTOHEADER --version | head -1`"
+echo "  * `$AUTOMAKE --version | head -1`"
+echo "  * `$AUTOCONF --version | head -1`"
+echo "---"
index 44102861f29fa2f61dfb45ecaa7032fa9e5cff13..7b14a248b0e0a9fe0d826c5300b5686243aec7bb 100644 (file)
@@ -1,17 +1,19 @@
 # libmemcached 
-# Copyright (C) 2008 Brian Aker
+# Copyright (C) 2008 Brian Aker, Monty Taylor
 # All rights reserved.
 #
 # Use and distribution licensed under the BSD license.  See
 # the COPYING file in this directory for full text.
 
 AC_PREREQ(2.59)
-AC_INIT([libmemcached],[0.30],[http://tangent.org/552/libmemcached.html])
+AC_INIT([libmemcached],[0.31],[http://tangent.org/552/libmemcached.html])
 AC_CONFIG_SRCDIR([libmemcached/memcached.c])
 AC_CONFIG_AUX_DIR(config)
-AM_CONFIG_HEADER(libmemcached/libmemcached_config.h)
+AM_CONFIG_HEADER([config.h])
 AC_CONFIG_MACRO_DIR([m4])
 
+PANDORA_CANONICAL_TARGET
+
 #shared library versioning
 MEMCACHED_LIBRARY_VERSION=2:0:0
 #                         | | |
@@ -28,66 +30,6 @@ AC_SUBST(MEMCACHED_LIBRARY_VERSION)
 MEMCACHEDUTIL_LIBRARY_VERSION=0:0:0
 AC_SUBST(MEMCACHEDUTIL_LIBRARY_VERSION)
 
-# Setting CFLAGS here prevents AC_CANONICAL_TARGET from injecting them
-SAVE_CFLAGS=${CFLAGS}
-SAVE_CXXFLAGS=${CXXFLAGS}
-CFLAGS=
-CXXFLAGS=
-
-AC_CANONICAL_TARGET
-
-CFLAGS=${SAVE_CFLAGS}
-CXXFLAGS=${SAVE_CXXFLAGS}
-
-AM_INIT_AUTOMAKE([-Wall -Werror nostdinc subdir-objects])
-
-if test "x${enable_dependency_tracking}" = "x"
-then
-  enable_dependency_tracking=yes
-fi
-
-if test -d "${srcdir}/.bzr"
-then
-  building_from_bzr=yes
-else
-  building_from_bzr=no
-fi
-
-AC_PROG_CXX
-
-ACX_USE_SYSTEM_EXTENSIONS
-
-AC_PROG_CPP
-AM_PROG_CC_C_O
-
-FORCE_MAC_GCC42
-dnl Once we can use a modern autoconf, we can use this
-dnl AC_PROG_CC_C99
-
-AC_C_BIGENDIAN
-AC_C_CONST
-AC_HEADER_TIME
-AC_TYPE_SIZE_T
-AC_FUNC_MALLOC
-AC_FUNC_REALLOC
-
-AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
-
-# We use libtool
-AC_PROG_LIBTOOL
-
-AC_MSG_CHECKING("C Compiler version")
-if test "$GCC" = "yes"
-then
-  CC_VERSION=`$CC --version | sed 1q`
-elif test "$SUNCC" = "yes"
-then
-  CC_VERSION=`$CC -V 2>&1 | sed 1q`
-else
-  CC_VERSION=""
-fi
-AC_MSG_RESULT("$CC_VERSION")
-AC_SUBST(CC_VERSION)
 
 # libmemcached versioning when linked with GNU ld.
 if test "$lt_cv_prog_gnu_ld" = "yes"
@@ -98,40 +40,6 @@ fi
 AC_SUBST(LD_VERSION_SCRIPT)
 AC_SUBST(LD_UTIL_VERSION_SCRIPT)
 
-# Build optimized or debug version ?
-# First check for gcc and g++
-if test "$GCC" = "yes"
-then
-
-  dnl Once we can use a modern autoconf, we can replace the std=gnu99 here
-  dnl with using AC_CC_STD_C99 above
-  CC="${CC} -std=gnu99"
-
-  CFLAGS="-ggdb3 ${CFLAGS}"
-  CXXFLAGS="-ggdb3 ${CXXFLAGS}"
-
-  DEBUG_CFLAGS="-O0"
-  DEBUG_CXXFLAGS="-O0"
-
-  OPTIMIZE_CFLAGS="-O3"
-  OPTIMIZE_CXXFLAGS="-O3"
-fi
-if test "x$SUNCC" = "xyes"
-then
-  dnl Once we can use a modern autoconf, we can replace the -xc99=all here
-  dnl with using AC_CC_STD_C99 above
-  CC="${CC} -xc99=all"
-
-  CFLAGS="-g -mt ${CFLAGS}"
-  CXXFLAGS="-xlang=c99 -g -mt -compat=5 -library=stlport4 -template=no%extdef ${CXXFLAGS}"
-
-  OPTIMIZE_FLAGS="-xO4 -xlibmil -xdepend -xbuiltin"
-  OPTIMIZE_CFLAGS="${OPTIMIZE_FLAGS} -Xa -xstrconst"
-  OPTIMIZE_CXXFLAGS="${OPTIMIZE_FLAGS}"
-
-fi
-
-ENABLE_64BIT
 
 #--------------------------------------------------------------------
 # Check for libpthread
@@ -166,7 +74,6 @@ AC_SEARCH_LIBS(floorf, m)
 dnl Specialty checks
 DETECT_BYTEORDER
 ENABLE_UTILLIB
-ENABLE_DTRACE
 SETSOCKOPT_SANITY
 ENABLE_HSIEH_HASH
 REQUIRE_POD2MAN
@@ -174,206 +81,6 @@ PROTOCOL_BINARY_TEST
 WITH_MEMCACHED
 ENABLE_DEPRECATED
 
-dnl TODO: Remove this define once we are using 2.61 across the board.
-# AX_HEADER_ASSERT
-# ----------------
-# Check whether to enable assertions.
-AC_DEFUN([AX_HEADER_ASSERT],
-[
-  AC_MSG_CHECKING([whether to enable assertions])
-  AC_ARG_ENABLE([assert],
-    [AS_HELP_STRING([--disable-assert],
-       [Turn off assertions])],
-    [ac_cv_assert="no"],
-    [ac_cv_assert="yes"])
-  AC_MSG_RESULT([$ac_cv_assert])
-])
-AX_HEADER_ASSERT
-
-
-AC_ARG_WITH([debug],
-    [AS_HELP_STRING([--with-debug],
-       [Add debug code/turns off optimizations (yes|no) @<:@default=no@:>@])],
-    [with_debug=$withval],
-    [with_debug=no])
-if test "$with_debug" = "yes"
-then
-  # Debugging. No optimization.
-  CFLAGS="${DEBUG_CFLAGS} -DDEBUG ${CFLAGS}"
-  CXXFLAGS="${DEBUG_CXXFLAGS} -DDEBUG ${CXXFLAGS}"
-else
-  # Optimized version. No debug
-  CFLAGS="${OPTIMIZE_CFLAGS} ${CFLAGS}"
-  CXXFLAGS="${OPTIMIZE_CXXFLAGS} ${CXXFLAGS}"
-fi
-
-AC_ARG_ENABLE([profiling],
-    [AS_HELP_STRING([--enable-profiling],
-       [Toggle profiling @<:@default=off@:>@])],
-    [ac_profiling="$enableval"],
-    [ac_profiling="no"])
-
-AC_ARG_ENABLE([coverage],
-    [AS_HELP_STRING([--enable-coverage],
-       [Toggle coverage @<:@default=off@:>@])],
-    [ac_coverage="$enableval"],
-    [ac_coverage="no"])
-
-if test "$GCC" = "yes"
-then
-
-  AC_CACHE_CHECK([whether it is safe to use -fdiagnostics-show-option],
-    [ac_cv_safe_to_use_fdiagnostics_show_option_],
-    [save_CFLAGS="$CFLAGS"
-     CFLAGS="-fdiagnostics-show-option ${CFLAGS}"
-     AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([],[])],
-       [ac_cv_safe_to_use_fdiagnostics_show_option_=yes],
-       [ac_cv_safe_to_use_fdiagnostics_show_option_=no])
-     CFLAGS="$save_CFLAGS"])
-
-  AS_IF([test "$ac_cv_safe_to_use_fdiagnostics_show_option_" = "yes"],
-        [
-          F_DIAGNOSTICS_SHOW_OPTION="-fdiagnostics-show-option"
-        ])
-
-  AC_CACHE_CHECK([whether it is safe to use -Wconversion],
-    [ac_cv_safe_to_use_wconversion_],
-    [save_CFLAGS="$CFLAGS"
-     CFLAGS="-Werror -Wconversion ${CFLAGS}"
-     AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([[
-#include <stdbool.h>
-void foo(bool a)
-{
-  (void)a;
-}
-       ]],[[
-foo(0);
-       ]])],
-       [ac_cv_safe_to_use_wconversion_=yes],
-       [ac_cv_safe_to_use_wconversion_=no])
-     CFLAGS="$save_CFLAGS"])
-
-  AS_IF([test "$ac_cv_safe_to_use_wconversion_" = "yes"],
-    [W_CONVERSION="-Wconversion"
-    AC_CACHE_CHECK([whether it is safe to use -Wconversion with htons],
-      [ac_cv_safe_to_use_Wconversion_],
-      [save_CFLAGS="$CFLAGS"
-       CFLAGS="-Werror -Wconversion ${CFLAGS}"
-       AC_COMPILE_IFELSE(
-         [AC_LANG_PROGRAM(
-           [[
-#include <netinet/in.h>
-           ]],[[
-uint16_t x= htons(80);
-           ]])],
-         [ac_cv_safe_to_use_Wconversion_=yes],
-         [ac_cv_safe_to_use_Wconversion_=no])
-       CFLAGS="$save_CFLAGS"])
-
-    AS_IF([test "$ac_cv_safe_to_use_Wconversion_" = "no"],
-          [
-            NO_CONVERSION="-Wno-conversion"
-          ])
-    ])
-
-  AS_IF([test "$ac_profiling" = "yes"],
-        [CC_PROFILING="-pg"])
-
-  AS_IF([test "$ac_coverage" = "yes"],
-        [CC_COVERAGE="-fprofile-arcs -ftest-coverage"])
-
-  AS_IF([test "$building_from_bzr" = "yes"],
-        [W_FAIL="-Werror"])
-
-  BASE_WARNINGS="-pedantic -Wall -Wextra ${W_FAIL} -Wundef -Wshadow -Wmissing-declarations -Wstrict-aliasing -Wformat=2 ${F_DIAGNOSTICS_SHOW_OPTION} ${W_CONVERSION}"
-  CC_WARNINGS="${BASE_WARNINGS} -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wswitch-default -Wswitch-enum -Wcast-align"
-  CXX_WARNINGS="${BASE_WARNINGS} -Woverloaded-virtual -Wnon-virtual-dtor -Wctor-dtor-privacy -Wold-style-cast -Weffc++ -Wno-long-long"
-
-  AC_CACHE_CHECK([whether it is safe to use -Wlogical-op],
-    [ac_cv_safe_to_use_Wlogical_op_],
-    [save_CFLAGS="$CFLAGS"
-     CFLAGS="-Wlogical-op"
-     AC_COMPILE_IFELSE([
-       AC_LANG_PROGRAM(
-       [[
-#include <stdio>
-       ]], [[]])
-    ],
-    [ac_cv_safe_to_use_Wlogical_op_=yes],
-    [ac_cv_safe_to_use_Wlogical_op_=no])
-  CFLAGS="$save_CFLAGS"])
-  AS_IF([test "$ac_cv_safe_to_use_Wlogical_op_" = "yes"],
-        [CC_WARNINGS="${CC_WARNINGS} -Wlogical-op"])
-
-  AC_CACHE_CHECK([whether it is safe to use -Wredundant-decls from C++],
-    [ac_cv_safe_to_use_Wredundant_decls_],
-    [AC_LANG_PUSH(C++)
-     save_CXXFLAGS="${CXXFLAGS}"
-     CXXFLAGS="${CXXFLAGS} ${W_FAIL} -Wredundant-decls"
-     AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([
-template <typename E> struct C { void foo(); };
-template <typename E> void C<E>::foo() { }
-template <> void C<int>::foo();
-          AC_INCLUDES_DEFAULT])],
-        [ac_cv_safe_to_use_Wredundant_decls_=yes],
-        [ac_cv_safe_to_use_Wredundant_decls_=no])
-      CXXFLAGS="${save_CXXFLAGS}"
-      AC_LANG_POP()])
-  AS_IF([test "$ac_cv_safe_to_use_Wredundant_decls_" = "yes"],
-        [CXX_WARNINGS="${CXX_WARNINGS} -Wredundant-decls"],
-        [CXX_WARNINGS="${CXX_WARNINGS} -Wno-redundant-decls"])
-
-  NO_REDUNDANT_DECLS="-Wno-redundant-decls"
-fi
-if test "$SUNCC" = "yes"
-then
-
-  AS_IF([test "$ac_profiling" = "yes"],
-        [CC_PROFILING="-xinstrument=datarace"])
-
-  AS_IF([test "$building_from_bzr" = "yes"],
-        [W_FAIL="-errwarn=%all"])
-
-  AC_CACHE_CHECK([whether E_PASTE_RESULT_NOT_TOKEN is usable],
-    [ac_cv_paste_result],
-    [
-      save_CFLAGS="${CFLAGS}"
-      CFLAGS="-errwarn=%all -erroff=E_PASTE_RESULT_NOT_TOKEN ${CFLAGS}"
-      AC_COMPILE_IFELSE(
-        [AC_LANG_PROGRAM([
-          AC_INCLUDES_DEFAULT
-        ],[
-          int x= 0;])],
-        [ac_cv_paste_result=yes],
-        [ac_cv_paste_result=no])
-      CFLAGS="${save_CFLAGS}"
-    ])
-  AS_IF([test $ac_cv_paste_result = yes],
-    [W_PASTE_RESULT=",E_PASTE_RESULT_NOT_TOKEN"])
-
-
-  CC_WARNINGS="-v -errtags=yes ${W_FAIL} -erroff=E_INTEGER_OVERFLOW_DETECTED${W_PASTE_RESULT}"
-  CXX_WARNINGS="+w +w2 -xwe -xport64 -errtags=yes ${W_FAIL}"
-fi
-
-AC_SUBST(NO_CONVERSION)
-AC_SUBST(NO_REDUNDANT_DECLS)
-
-AM_CPPFLAGS="-I\$(top_srcdir) -I\$(top_builddir) ${CPPFLAGS}"
-AM_CFLAGS="${CC_WARNINGS} ${CC_PROFILING} ${CC_COVERAGE} ${CFLAGS}"
-AM_CXXFLAGS="${CXX_WARNING} ${CC_PROFILING} ${CC_COVERAGE} ${CXXFLAGS}"
-
-AC_SUBST([AM_CPPFLAGS])
-AC_SUBST([AM_CFLAGS])
-AC_SUBST([AM_CXXFLAGS])
-
-dnl We've collected the flags in AM_*FLAGS now, so blank these.
-CFLAGS=""
-CXXFLAGS=""
-CPPFLAGS=""
 
 AC_CONFIG_FILES([
   Makefile
@@ -399,7 +106,7 @@ echo "   * Host CPU:                  $host_cpu"
 echo "   * C Compiler:                $CC_VERSION"
 echo "   * Assertions enabled:        $ac_cv_assert"
 echo "   * Debug enabled:             $with_debug"
-echo "   * Warnings as failure:       $building_from_bzr"
+echo "   * Warnings as failure:       $ac_cv_warnings_as_errors"
 echo ""
 echo "---"
 
index 79be5cceafb1822bbc88361e817c06aef7522d8d..598eaf06f726f48c28a886901365e1952f76d839 100644 (file)
@@ -33,7 +33,7 @@ EXTRA_DIST = libmemcached.pod\
         memcached_analyze.pod\
         memcached_generate_hash_value.pod\
         memcached_memory_allocators.pod\
-        memory_user_data.pod
+        memcached_user_data.pod
 
 man_MANS = libmemcached.3\
        libmemcached_examples.3\
index 5d6d00ae6cce0a8aac99e256937d0432385c4629..72fb1259484990e3b88993430c9b8917c2acdab9 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-memcached_set_memory_allocators, memcached_get_memory_allocators
+memcached_set_memory_allocators, memcached_get_memory_allocators - Manage memory allocator functions
 
 =head1 LIBRARY
 
index 0e6e7067f5507df7e609a51d52439ed6f16ec58c..08ff77851079778657eb8420e575d04c8e0f975c 100644 (file)
@@ -23,6 +23,10 @@ C Client Library for memcached (libmemcached, -lmemcached)
 
   memcached_server_st *memcached_servers_parse (const char *server_strings);
 
+  const char *memcached_server_error(memcached_server_st *ptr);
+
+  void memcached_server_error_reset(memcached_server_st *ptr);
+
 =head1 DESCRIPTION
 
 libmemcached(3) operates on a list of hosts which are stored in
@@ -44,6 +48,12 @@ command line applications, and parse it to an array of memcached_server_st.
 The example is "localhost, foo:555, foo, bar". All hosts except foo:555 will
 be set to the default port, while that host will have a port of 555.
 
+memcached_server_error() can be used to look at the text of the last error 
+message sent by the server to to the client. Use memcached_server_error_reset() 
+to reset the message (this does not currently free up the memory associated
+with the message).
+
+
 =head1 RETURN
 
 Varies, see particular functions.
index d5161a1d677b58052c432bd588561a401edd5715..66a25d11afddf942015186be1a50424ce8f774d0 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-memcached_set_user_data, memcached_get_user_data
+memcached_set_user_data, memcached_get_user_data - Manage user specific data
 
 =head1 LIBRARY
 
index 98edb8bbc44a4adaaed52158301261b1ec1234df..8e5c8feac1c89f2c801cd8afccadf839da47eee5 100644 (file)
@@ -1,21 +1,18 @@
 EXTRA_DIST = libmemcached_probes.d memcached/README.txt libmemcached.ver \
              memcached_configure.h.in
 
-BUILT_SOURCES= @DTRACE_HEADER@
-
 EXTRA_HEADERS = 
-DTRACE =                @DTRACE@
-DTRACEFLAGS =           @DTRACEFLAGS@
+BUILT_SOURCES= 
 
 noinst_HEADERS = libmemcached_probes.h \
-                 libmemcached_config.h \
-                memcached_io.h \
+                 memcached_io.h \
                  memcached_internal.h \
                  common.h \
-                 memcached/protocol_binary.h @DTRACE_HEADER@
+                 memcached/protocol_binary.h
 
 pkginclude_HEADERS= memcached.h \
                    memcached.hh \
+                    memcached_configure.h \
                    memcached_constants.h \
                    memcached_get.h \
                    memcached_result.h \
@@ -23,13 +20,18 @@ pkginclude_HEADERS= memcached.h \
                    memcached_storage.h \
                    memcached_string.h \
                    memcached_types.h \
-                   memcached_watchpoint.h
+                   memcached_watchpoint.h \
+                   visibility.h
+
 
 if BUILD_LIBMEMCACHEDUTIL
 pkginclude_HEADERS+= memcached_util.h memcached_pool.h
 endif
 
 lib_LTLIBRARIES = libmemcached.la
+noinst_LTLIBRARIES = libmemcachedcallbacks.la
+libmemcachedcallbacks_la_CFLAGS = ${AM_CFLAGS} ${NO_STRICT_ALIASING}
+libmemcachedcallbacks_la_SOURCES = memcached_callback.c
 
 libmemcached_la_CFLAGS= ${AM_CFLAGS} ${NO_CONVERSION}
 libmemcached_la_SOURCES = crc.c \
@@ -37,7 +39,6 @@ libmemcached_la_SOURCES = crc.c \
                          memcached_auto.c \
                          memcached_analyze.c \
                          memcached_behavior.c \
-                         memcached_callback.c \
                          memcached_connect.c \
                          memcached_delete.c \
                          memcached_do.c \
@@ -67,6 +68,7 @@ libmemcached_la_SOURCES = crc.c \
                          jenkins_hash.c \
                           memcached_allocators.c
 
+
 if INCLUDE_HSIEH_SRC
 libmemcached_la_SOURCES += hsieh_hash.c
 endif
@@ -75,23 +77,25 @@ if BUILD_BYTEORDER
 libmemcached_la_SOURCES += byteorder.c
 endif
 
-DEFS += -DMEMCACHED_INTERNAL
-libmemcached_la_DEPENDENCIES = @DTRACE_OBJ@
-libmemcached_la_LIBADD = @DTRACE_OBJ@ $(LIBM)
+libmemcached_la_DEPENDENCIES= libmemcachedcallbacks.la
+libmemcached_la_LIBADD= $(LIBM) libmemcachedcallbacks.la
 libmemcached_la_LDFLAGS = -version-info $(MEMCACHED_LIBRARY_VERSION) $(LD_VERSION_SCRIPT) $(LIBM)
 
-dtrace_probes.h: libmemcached_probes.d
-       $(DTRACE) $(DTRACEFLAGS) -o dtrace_probes.tmp -h -s libmemcached_probes.d
-       sed "s/#include <unistd.h>//g" dtrace_probes.tmp > dtrace_probes.h
-       rm dtrace_probes.tmp
+if HAVE_DTRACE
+BUILT_SOURCES+= dtrace_probes.h
+libmemcached_la_SOURCES += libmemcached_probes.d
+endif
+
+if DTRACE_NEEDS_OBJECTS
+libmemcached_la_DEPENDENCIES += libmemcached_probes.o
+endif
 
+SUFFIXES= .d
 
-# So libtool doesn't support dtrace, but just copy one of the existing
-# lo-file and replace the file name ;-) 
-libmemcached_probes.lo: libmemcached_probes.o
-       sed "s,jenkins_hash,libmemcached_probes,g" jenkins_hash.lo > libmemcached_probes.lo
+dtrace_probes.h: libmemcached_probes.d
+       $(DTRACE) $(DTRACEFLAGS) -h -o dtrace_probes.h -s libmemcached_probes.d
 
-libmemcached_probes.o: $(libmemcached_la_OBJECTS)
-       $(DTRACE) $(DTRACEFLAGS) -o .libs/libmemcached_probes.o -G -s libmemcached_probes.d `grep pic_object *.lo | cut -f 2 -d\' | grep -v non_pic_object`
+libmemcached_probes.o: libmemcached_probes.d $(libmemcached_la_OBJECTS)
+       $(DTRACE) $(DTRACEFLAGS) -o .libs/libmemcached_probes.o -G -s libmemcached_probes.d `grep '^pic_object' *.lo | cut -f 2 -d\'`
        $(DTRACE) $(DTRACEFLAGS) -o libmemcached_probes.o -G -s libmemcached_probes.d `grep non_pic_object *.lo | cut -f 2 -d\' `
 
index 10b434f133fcf7df7b6d4f497e24b47f61d86f37..7942b27a34011bf96d18887779754a6f78c47866 100644 (file)
@@ -2,10 +2,10 @@
   Common include file for libmemached
 */
 
-#ifndef __COMMON_H__
-#define __COMMON_H__
+#ifndef LIBMEMCACHED_COMMON_H
+#define LIBMEMCACHED_COMMON_H
 
-#include "libmemcached/libmemcached_config.h"
+#include "config.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #include <sys/un.h>
 #include <netinet/tcp.h>
-
-
-#include "libmemcached/memcached.h"
-#include "libmemcached/memcached_io.h"
-
-#include "libmemcached/memcached/protocol_binary.h"
-
 #ifdef TIME_WITH_SYS_TIME
 # include <sys/time.h>
 # include <time.h>
 # endif
 #endif
 
+/* Define this here, which will turn on the visibilty controls while we're
+ * building libmemcached.
+ */
+#define BUILDING_LIBMEMCACHED 1
+
+
+#include "libmemcached/memcached.h"
+#include "libmemcached/memcached_watchpoint.h"
+
+/* These are private not to be installed headers */
+#include "libmemcached/memcached_io.h"
+#include "libmemcached/memcached_internal.h"
+#include "libmemcached/libmemcached_probes.h"
+#include "libmemcached/memcached/protocol_binary.h"
+
+/* string value */
+struct memcached_continuum_item_st {
+  uint32_t index;
+  uint32_t value;
+};
 
 
 #if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
@@ -54,7 +67,6 @@
 #define unlikely(x)     if(__builtin_expect((x), 0))
 #endif
 
-#include "libmemcached_probes.h"
 
 #define MEMCACHED_BLOCK_SIZE 1024
 #define MEMCACHED_DEFAULT_COMMAND_SIZE 350
@@ -84,46 +96,60 @@ typedef enum {
 } memcached_flags;
 
 /* Hashing algo */
+
+LIBMEMCACHED_LOCAL
 void md5_signature(const unsigned char *key, unsigned int length, unsigned char *result);
+LIBMEMCACHED_LOCAL
 uint32_t hash_crc32(const char *data,
                     size_t data_len);
 #ifdef HAVE_HSIEH_HASH
+LIBMEMCACHED_LOCAL
 uint32_t hsieh_hash(const char *key, size_t key_length);
 #endif
+LIBMEMCACHED_LOCAL
 uint32_t murmur_hash(const char *key, size_t key_length);
+LIBMEMCACHED_LOCAL
 uint32_t jenkins_hash(const void *key, size_t length, uint32_t initval);
 
+LIBMEMCACHED_LOCAL
 memcached_return memcached_connect(memcached_server_st *ptr);
+LIBMEMCACHED_LOCAL
 memcached_return memcached_response(memcached_server_st *ptr,
                                     char *buffer, size_t buffer_length,
                                     memcached_result_st *result);
+LIBMEMCACHED_LOCAL
 void memcached_quit_server(memcached_server_st *ptr, uint8_t io_death);
 
 #define memcached_server_response_increment(A) (A)->cursor_active++
 #define memcached_server_response_decrement(A) (A)->cursor_active--
 #define memcached_server_response_reset(A) (A)->cursor_active=0
 
+LIBMEMCACHED_LOCAL
 memcached_return memcached_do(memcached_server_st *ptr, const void *commmand,
                               size_t command_length, uint8_t with_flush);
-memcached_return memcached_version(memcached_st *ptr);
+LIBMEMCACHED_LOCAL
 memcached_return value_fetch(memcached_server_st *ptr,
                              char *buffer,
                              memcached_result_st *result);
+LIBMEMCACHED_LOCAL
 void server_list_free(memcached_st *ptr, memcached_server_st *servers);
 
-memcached_return memcached_key_test(char **keys, size_t *key_length,
+LIBMEMCACHED_LOCAL
+memcached_return memcached_key_test(const char **keys, size_t *key_length,
                                     unsigned int number_of_keys);
 
-memcached_return run_distribution(memcached_st *ptr);
 
+LIBMEMCACHED_LOCAL
 uint32_t generate_hash(memcached_st *ptr, const char *key, size_t key_length);
-memcached_return memcached_server_remove(memcached_server_st *st_ptr);
 
 #ifndef HAVE_HTONLL
+LIBMEMCACHED_LOCAL
 extern uint64_t ntohll(uint64_t);
+LIBMEMCACHED_LOCAL
 extern uint64_t htonll(uint64_t);
 #endif
 
+LIBMEMCACHED_LOCAL
 memcached_return memcached_purge(memcached_server_st *ptr);
 
 static inline memcached_return memcached_validate_key_length(size_t key_length, 
@@ -145,4 +171,4 @@ static inline memcached_return memcached_validate_key_length(size_t key_length,
   return MEMCACHED_SUCCESS;
 }
 
-#endif /* __COMMON_H__ */
+#endif /* LIBMEMCACHED_COMMON_H */
index ae68e34cce28ce2d1e08f5af881bd29e5727e16d..1163b524f049b5f9e103eb9cb7543694a99afc9f 100644 (file)
@@ -1,6 +1,10 @@
 provider libmemcached {
        probe memcached_delete_start();
        probe memcached_delete_end();
+       probe memcached_increment_with_initial_start();
+       probe memcached_increment_with_initial_end();
+       probe memcached_decrement_with_initial_start();
+       probe memcached_decrement_with_initial_end();
        probe memcached_increment_start();
        probe memcached_increment_end();
        probe memcached_decrement_start();
index 9ac0df70e42b585ba4a3425b5ce578128c560004..c3b436bf2ff721481d5e1bf41de99f01d433ced4 100644 (file)
 #include <sys/types.h>
 #include <netinet/in.h>
 
-#ifdef MEMCACHED_INTERNAL
-#include <libmemcached/libmemcached_config.h>
-#endif
+#include <libmemcached/visibility.h>
 #include <libmemcached/memcached_configure.h>
 #include <libmemcached/memcached_constants.h>
 #include <libmemcached/memcached_types.h>
-#include <libmemcached/memcached_watchpoint.h>
 #include <libmemcached/memcached_get.h>
 #include <libmemcached/memcached_server.h>
 #include <libmemcached/memcached_string.h>
 #include <libmemcached/memcached_result.h>
+#include <libmemcached/memcached_storage.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/* These are Private and should not be used by applications */
 #define MEMCACHED_VERSION_STRING_LENGTH 24
-
-/* string value */
-struct memcached_continuum_item_st {
-  uint32_t index;
-  uint32_t value;
-};
-
-#define LIBMEMCACHED_VERSION_STRING "0.30"
+#define LIBMEMCACHED_VERSION_STRING "0.31"
 
 struct memcached_analysis_st {
   uint32_t average_item_size;
@@ -124,24 +114,35 @@ struct memcached_st {
   uint32_t number_of_replicas;
 };
 
+LIBMEMCACHED_API
+memcached_return memcached_version(memcached_st *ptr);
 
 /* Public API */
+
+LIBMEMCACHED_API
 const char * memcached_lib_version(void);
 
+LIBMEMCACHED_API
 memcached_st *memcached_create(memcached_st *ptr);
+LIBMEMCACHED_API
 void memcached_free(memcached_st *ptr);
+LIBMEMCACHED_API
 memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr);
 
+LIBMEMCACHED_API
 memcached_return memcached_delete(memcached_st *ptr, const char *key, size_t key_length,
                                   time_t expiration);
+LIBMEMCACHED_API
 memcached_return memcached_increment(memcached_st *ptr, 
                                      const char *key, size_t key_length,
                                      uint32_t offset,
                                      uint64_t *value);
+LIBMEMCACHED_API
 memcached_return memcached_decrement(memcached_st *ptr, 
                                      const char *key, size_t key_length,
                                      uint32_t offset,
                                      uint64_t *value);
+LIBMEMCACHED_API
 memcached_return memcached_increment_with_initial(memcached_st *ptr,
                                                   const char *key,
                                                   size_t key_length,
@@ -149,6 +150,7 @@ memcached_return memcached_increment_with_initial(memcached_st *ptr,
                                                   uint64_t initial,
                                                   time_t expiration,
                                                   uint64_t *value);
+LIBMEMCACHED_API
 memcached_return memcached_decrement_with_initial(memcached_st *ptr,
                                                   const char *key,
                                                   size_t key_length,
@@ -156,106 +158,138 @@ memcached_return memcached_decrement_with_initial(memcached_st *ptr,
                                                   uint64_t initial,
                                                   time_t expiration,
                                                   uint64_t *value);
+LIBMEMCACHED_API
 void memcached_stat_free(memcached_st *, memcached_stat_st *);
+LIBMEMCACHED_API
 memcached_stat_st *memcached_stat(memcached_st *ptr, char *args, memcached_return *error);
-memcached_return memcached_stat_servername(memcached_stat_st *stat, char *args, 
+LIBMEMCACHED_API
+memcached_return memcached_stat_servername(memcached_stat_st *memc_stat, char *args, 
                                            char *hostname, unsigned int port);
+LIBMEMCACHED_API
 memcached_return memcached_flush(memcached_st *ptr, time_t expiration);
+LIBMEMCACHED_API
 memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity);
+LIBMEMCACHED_API
 void memcached_quit(memcached_st *ptr);
-char *memcached_strerror(memcached_st *ptr, memcached_return rc);
+LIBMEMCACHED_API
+const char *memcached_strerror(memcached_st *ptr, memcached_return rc);
+LIBMEMCACHED_API
 memcached_return memcached_behavior_set(memcached_st *ptr, memcached_behavior flag, uint64_t data);
+LIBMEMCACHED_API
 uint64_t memcached_behavior_get(memcached_st *ptr, memcached_behavior flag);
 
 /* The two public hash bits */
+LIBMEMCACHED_API
 uint32_t memcached_generate_hash_value(const char *key, size_t key_length, memcached_hash hash_algorithm);
+LIBMEMCACHED_API
 uint32_t memcached_generate_hash(memcached_st *ptr, const char *key, size_t key_length);
 
+LIBMEMCACHED_API
 memcached_return memcached_flush_buffers(memcached_st *mem);
 
 /* Server Public functions */
 
+LIBMEMCACHED_API
 memcached_return memcached_server_add_udp(memcached_st *ptr, 
                                           const char *hostname,
                                           unsigned int port);
+LIBMEMCACHED_API
 memcached_return memcached_server_add_unix_socket(memcached_st *ptr, 
                                                   const char *filename);
+LIBMEMCACHED_API
 memcached_return memcached_server_add(memcached_st *ptr, const char *hostname, 
                                       unsigned int port);
 
+LIBMEMCACHED_API
 memcached_return memcached_server_add_udp_with_weight(memcached_st *ptr, 
                                                       const char *hostname,
                                                       unsigned int port,
                                                       uint32_t weight);
+LIBMEMCACHED_API
 memcached_return memcached_server_add_unix_socket_with_weight(memcached_st *ptr, 
                                                               const char *filename,
                                                               uint32_t weight);
+LIBMEMCACHED_API
 memcached_return memcached_server_add_with_weight(memcached_st *ptr, const char *hostname, 
                                                   unsigned int port,
                                                   uint32_t weight);
+LIBMEMCACHED_API
 void memcached_server_list_free(memcached_server_st *ptr);
+LIBMEMCACHED_API
 memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *list);
 
+LIBMEMCACHED_API
 memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, 
                                                   const char *hostname, 
                                                   unsigned int port, 
                                                   memcached_return *error);
+LIBMEMCACHED_API
 memcached_server_st *memcached_server_list_append_with_weight(memcached_server_st *ptr, 
                                                               const char *hostname, 
                                                               unsigned int port, 
                                                               uint32_t weight,
                                                               memcached_return *error);
+LIBMEMCACHED_API
 unsigned int memcached_server_list_count(memcached_server_st *ptr);
+LIBMEMCACHED_API
 memcached_server_st *memcached_servers_parse(const char *server_strings);
 
-char *memcached_stat_get_value(memcached_st *ptr, memcached_stat_st *stat, 
+LIBMEMCACHED_API
+char *memcached_stat_get_value(memcached_st *ptr, memcached_stat_st *memc_stat, 
                                const char *key, memcached_return *error);
-char ** memcached_stat_get_keys(memcached_st *ptr, memcached_stat_st *stat, 
+LIBMEMCACHED_API
+char ** memcached_stat_get_keys(memcached_st *ptr, memcached_stat_st *memc_stat, 
                                 memcached_return *error);
 
+LIBMEMCACHED_API
 memcached_return memcached_delete_by_key(memcached_st *ptr, 
                                          const char *master_key, size_t master_key_length,
                                          const char *key, size_t key_length,
                                          time_t expiration);
 
+LIBMEMCACHED_API
 memcached_return memcached_fetch_execute(memcached_st *ptr, 
                                              memcached_execute_function *callback,
                                              void *context,
                                              unsigned int number_of_callbacks);
 
+LIBMEMCACHED_API
 memcached_return memcached_callback_set(memcached_st *ptr, 
                                         memcached_callback flag, 
                                         void *data);
+LIBMEMCACHED_API
 void *memcached_callback_get(memcached_st *ptr, 
                              memcached_callback flag,
                              memcached_return *error);
 
+LIBMEMCACHED_API
 memcached_return memcached_dump(memcached_st *ptr, memcached_dump_func *function, void *context, uint32_t number_of_callbacks);
 
 
+LIBMEMCACHED_API
 memcached_return memcached_set_memory_allocators(memcached_st *ptr,
                                                  memcached_malloc_function mem_malloc,
                                                  memcached_free_function mem_free,
                                                  memcached_realloc_function mem_realloc,
                                                  memcached_calloc_function mem_calloc);
 
+LIBMEMCACHED_API
 void memcached_get_memory_allocators(memcached_st *ptr,
                                      memcached_malloc_function *mem_malloc,
                                      memcached_free_function *mem_free,
                                      memcached_realloc_function *mem_realloc,
                                      memcached_calloc_function *mem_calloc);
 
+LIBMEMCACHED_API
 void *memcached_get_user_data(memcached_st *ptr);
+LIBMEMCACHED_API
 void *memcached_set_user_data(memcached_st *ptr, void *data);
 
+LIBMEMCACHED_API
+memcached_return run_distribution(memcached_st *ptr);
 #ifdef __cplusplus
 }
 #endif
 
-#include <libmemcached/memcached_storage.h>
-
-#ifdef MEMCACHED_INTERNAL
-#include <libmemcached/memcached_internal.h>
-#endif
 
 #endif /* __MEMCACHED_H__ */
index 01b95f6b66bbd4758abb45f84bbdf0ff3e9ad29f..52ce4105d9ef7a6471816f43719e19c0fb928e02 100644 (file)
-#include "libmemcached/memcached.h"
-#include <string.h>
-#include <stdio.h>
+#include <libmemcached/memcached.h>
+
+#include <string>
+#include <vector>
 
 class Memcached
 {
-  memcached_st memc;
-  memcached_result_st result;
-
 public:
 
-  Memcached() : memc(), result()
+  Memcached() 
+    : 
+      memc(),
+      result()
   {
     memcached_create(&memc);
   }
 
-  Memcached(memcached_st *clone) : memc(), result()
+  Memcached(memcached_st *clone) 
+    : 
+      memc(),
+      result()
   {
     memcached_clone(&memc, clone);
   }
-  char *fetch (char *key, size_t *key_length, size_t *value_length)
+
+  ~Memcached()
   {
-    uint32_t flags;
-    memcached_return rc;
+    memcached_free(&memc);
+  }
 
-    return memcached_fetch(&memc, key, key_length,
-                    value_length, &flags, &rc);
+  bool fetch(std::string &key, 
+             std::string &ret_val,
+             size_t *key_length, 
+             size_t *value_length,
+             uint32_t *flags,
+             memcached_return *rc)
+  {
+    char ret_key[MEMCACHED_MAX_KEY];
+    char *value= memcached_fetch(&memc, ret_key, key_length,
+                                 value_length, flags, rc);
+    if (value)
+    {
+      ret_val.assign(value);
+      key.assign(ret_key);
+      return true;
+    }
+    return false;
   }
-  char *get(const char *key, size_t *value_length)
+
+  std::string get(const std::string &key, size_t *value_length) 
   {
     uint32_t flags;
     memcached_return rc;
+    std::string ret_val;
 
-    return memcached_get(&memc, key, strlen(key),
-                         value_length, &flags, &rc);
+    char *value= memcached_get(&memc, key.c_str(), key.length(),
+                               value_length, &flags, &rc);
+    if (value)
+    {
+      ret_val.assign(value);
+    }
+    return ret_val;
   }
 
-  char *get_by_key(const char *master_key, const char *key, 
-                   size_t *value_length)
+  std::string get_by_key(const std::string &master_key, 
+                         const std::string &key, 
+                         size_t *value_length)
   {
     uint32_t flags;
     memcached_return rc;
+    std::string ret_val;
 
-    return memcached_get_by_key(&memc, master_key, strlen(master_key), 
-                                key, strlen(key),
-                                value_length, &flags, &rc);
+    char *value= memcached_get_by_key(&memc, master_key.c_str(), master_key.length(), 
+                                      key.c_str(), key.length(),
+                                      value_length, &flags, &rc);
+    if (value)
+    {
+      ret_val.assign(value);
+    }
+    return ret_val;
   }
 
-  memcached_return mget(char **keys, size_t *key_length, 
-                        unsigned int number_of_keys)
+  bool mget(std::vector<std::string> &keys)
   {
+    std::vector<const char *> real_keys;
+    std::vector<size_t> key_len;
+    /*
+     * Construct an array which will contain the length
+     * of each of the strings in the input vector. Also, to
+     * interface with the memcached C API, we need to convert
+     * the vector of std::string's to a vector of char *.
+     */
+    real_keys.reserve(keys.size());
+    key_len.reserve(keys.size());
+
+    std::vector<std::string>::iterator it= keys.begin();
+
+    while (it != keys.end())
+    {
+      real_keys.push_back(const_cast<char *>((*it).c_str()));
+      key_len.push_back((*it).length());
+      ++it;
+    }
+
+    /*
+     * If the std::vector of keys is empty then we cannot 
+     * call memcached_mget as we will get undefined behavior.
+     */
+    if (!real_keys.empty())
+    {
+      memcached_return rc= memcached_mget(&memc, &real_keys[0], &key_len[0], 
+                                          static_cast<unsigned int>(real_keys.size()));
+      return (rc == MEMCACHED_SUCCESS);
+    }
 
-    return memcached_mget(&memc, keys, key_length, number_of_keys);
+    return false;
   }
 
-  memcached_return set(const char *key, const char *value, size_t value_length)
+  bool set(const std::string &key, 
+           const std::string &value,
+           time_t expiration,
+           uint32_t flags)
   {
-    return memcached_set(&memc, key, strlen(key),
-                         value, value_length,
-                         time_t(0), uint32_t(0));
+    memcached_return rc= memcached_set(&memc, 
+                                       key.c_str(), key.length(),
+                                       value.c_str(), value.length(),
+                                       expiration, flags);
+    return (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
   }
 
-  memcached_return set_by_key(const char *master_key, const char *key, 
-                              const char *value, size_t value_length)
+  bool set_all(std::vector<std::string> &keys,
+               std::vector<std::string> &values,
+               time_t expiration,
+               uint32_t flags)
   {
-    return memcached_set_by_key(&memc, master_key, strlen(master_key),
-                         key, strlen(key),
-                         value, value_length,
-                         time_t(0),
-                         uint32_t(0) );
+    if (keys.size() != values.size())
+    {
+      return false;
+    }
+    bool retval= true;
+    std::vector<std::string>::iterator key_it= keys.begin();
+    std::vector<std::string>::iterator val_it= values.begin();
+    while (key_it != keys.end())
+    {
+      retval= set((*key_it), (*val_it), expiration, flags);
+      if (retval == false)
+      {
+        return retval;
+      }
+      ++key_it;
+      ++val_it;
+    }
+    return retval;
   }
-  memcached_return
-    increment(const char *key, unsigned int offset, uint64_t *value)
+
+  bool set_by_key(const std::string &master_key, 
+                  const std::string &key, 
+                  const std::string &value,
+                  time_t expiration,
+                  uint32_t flags)
   {
-    return memcached_increment(&memc, key, strlen(key),
-                         offset, value);
+    memcached_return rc= memcached_set_by_key(&memc, master_key.c_str(), 
+                                              master_key.length(),
+                                              key.c_str(), key.length(),
+                                              value.c_str(), value.length(),
+                                              expiration,
+                                              flags);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return
-    decrement(const char *key, unsigned int offset, uint64_t *value)
+
+  bool increment(const std::string &key, unsigned int offset, uint64_t *value)
+  {
+    memcached_return rc= memcached_increment(&memc, key.c_str(), key.length(),
+                                             offset, value);
+    return (rc == MEMCACHED_SUCCESS);
+  }
+
+  bool decrement(const std::string &key, unsigned int offset, uint64_t *value)
   {
-    return memcached_decrement(&memc, key, strlen(key),
-                         offset, value);
+    memcached_return rc= memcached_decrement(&memc, key.c_str(), 
+                                             key.length(),
+                                             offset, value);
+    return (rc == MEMCACHED_SUCCESS);
   }
 
 
-  memcached_return add(const char *key, const char *value, size_t value_length)
+  bool add(const std::string &key, const std::string &value)
   {
-    return memcached_add(&memc, key, strlen(key), value, value_length, 0, 0);
+    memcached_return rc= memcached_add(&memc, key.c_str(), key.length(), 
+                                       value.c_str(), value.length(), 0, 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return add_by_key(const char *master_key, const char *key, 
-                              const char *value, size_t value_length)
+
+  bool add_by_key(const std::string &master_key, 
+                  const std::string &key, 
+                  const std::string &value)
   {
-    return memcached_add_by_key(&memc, master_key, strlen(master_key),
-                                key, strlen(key),
-                                value, value_length,
-                                0, 0);
+    memcached_return rc= memcached_add_by_key(&memc, 
+                                              master_key.c_str(),
+                                              master_key.length(),
+                                              key.c_str(),
+                                              key.length(),
+                                              value.c_str(), 
+                                              value.length(),
+                                              0, 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
 
-  memcached_return replace(const char *key, const char *value, 
-                           size_t value_length)
+  bool replace(const std::string &key, const std::string &value)
   {
-    return memcached_replace(&memc, key, strlen(key),
-                     value, value_length,
-                     0, 0);
+    memcached_return rc= memcached_replace(&memc, key.c_str(), key.length(),
+                                           value.c_str(), value.length(),
+                                           0, 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return replace_by_key(const char *master_key, const char *key, 
-                                  const char *value, size_t value_length)
+
+  bool replace_by_key(const std::string &master_key, 
+                      const std::string &key, 
+                      const std::string &value)
   {
-    return memcached_replace_by_key(&memc, master_key, strlen(master_key),
-                                    key, strlen(key),
-                                    value, value_length, 0, 0);
+    memcached_return rc= memcached_replace_by_key(&memc, 
+                                                  master_key.c_str(), 
+                                                  master_key.length(),
+                                                  key.c_str(), 
+                                                  key.length(),
+                                                  value.c_str(), 
+                                                  value.length(), 
+                                                  0, 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
 
-  memcached_return prepend(const char *key, const char *value, 
-                           size_t value_length)
+  bool prepend(const std::string &key, const std::string &value)
   {
-    return memcached_prepend(&memc, key, strlen(key),
-                    value, value_length, 0, 0);
+    memcached_return rc= memcached_prepend(&memc, key.c_str(), key.length(),
+                                           value.c_str(), value.length(), 0, 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return prepend_by_key(const char *master_key, const char *key, 
-                                  const char *value, size_t value_length)
+
+  bool prepend_by_key(const std::string &master_key, 
+                      const std::string &key, 
+                      const std::string &value)
   {
-    return memcached_prepend_by_key(&memc, master_key, strlen(master_key),
-                                    key, strlen(key),
-                                    value, value_length,
-                                    0,
-                                    0);
+    memcached_return rc= memcached_prepend_by_key(&memc, 
+                                                  master_key.c_str(), 
+                                                  master_key.length(),
+                                                  key.c_str(), 
+                                                  key.length(),
+                                                  value.c_str(), 
+                                                  value.length(),
+                                                  0,
+                                                  0);
+    return (rc == MEMCACHED_SUCCESS);
   }
 
-  memcached_return  append(const char *key, const char *value, 
-                           size_t value_length)
+  bool append(const std::string &key, const std::string &value)
   {
-    return memcached_append(&memc, key, strlen(key),
-                    value, value_length, 0, 0);
+    memcached_return rc= memcached_append(&memc, 
+                                          key.c_str(), 
+                                          key.length(),
+                                          value.c_str(), 
+                                          value.length(), 
+                                          0, 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return  append_by_key(const char *master_key, const char *key, 
-                                  const char *value, size_t value_length)
+
+  bool append_by_key(const std::string &master_key, 
+                     const std::string &key, 
+                     const std::string &value)
   {
-    return memcached_append_by_key(&memc,
-                                   master_key, strlen(master_key),
-                                   key, strlen(key),
-                                   value, value_length, 0, 0);
+    memcached_return rc= memcached_append_by_key(&memc,
+                                                 master_key.c_str(), 
+                                                 master_key.length(),
+                                                 key.c_str(), 
+                                                 key.length(),
+                                                 value.c_str(), 
+                                                 value.length(), 
+                                                 0, 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return  cas(const char *key, const char *value, 
-                        size_t value_length, uint64_t cas)
+
+  bool cas(const std::string &key, 
+           const std::string &value, 
+           uint64_t cas_arg)
   {
-    return memcached_cas(&memc, key, strlen(key),
-                    value, value_length, 0, 0, cas);
+    memcached_return rc= memcached_cas(&memc, key.c_str(), key.length(),
+                                       value.c_str(), value.length(), 
+                                       0, 0, cas_arg);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return  cas_by_key(const char *master_key, const char *key, 
-                               const char *value, size_t value_length, 
-                               uint64_t cas)
+
+  bool cas_by_key(const std::string &master_key, 
+                  const std::string &key, 
+                  const std::string &value, 
+                  uint64_t cas_arg)
   {
-    return memcached_cas_by_key(&memc,
-                                master_key, strlen(master_key),
-                                key, strlen(key),
-                                value, value_length,
-                                0, 0, cas);
+    memcached_return rc= memcached_cas_by_key(&memc,
+                                              master_key.c_str(), 
+                                              master_key.length(),
+                                              key.c_str(), 
+                                              key.length(),
+                                              value.c_str(), 
+                                              value.length(),
+                                              0, 0, cas_arg);
+    return (rc == MEMCACHED_SUCCESS);
   }
+
   // using 'remove' vs. 'delete' since 'delete' is a keyword 
-  memcached_return remove(const char *key)
+  bool remove(const std::string &key)
   {
-    return memcached_delete (&memc, key, strlen(key), 0);
+    memcached_return rc= memcached_delete(&memc, key.c_str(), key.length(), 0);
+    return (rc == MEMCACHED_SUCCESS);
+  }
 
+  bool delete_by_key(const std::string &master_key, 
+                     const std::string &key)
+  {
+    memcached_return rc= memcached_delete_by_key(&memc, 
+                                                 master_key.c_str(), 
+                                                 master_key.length(),
+                                                 key.c_str(), 
+                                                 key.length(), 
+                                                 0);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  memcached_return delete_by_key(const char *master_key, const char *key)
+
+  bool flush(time_t expiration)
   {
-    return memcached_delete_by_key(&memc, master_key, strlen(master_key),
-                           key, strlen(key), 0);
+    memcached_return rc= memcached_flush(&memc, expiration);
+    return (rc == MEMCACHED_SUCCESS);
   }
-  ~Memcached()
+
+  bool fetch_execute(memcached_execute_function *callback,
+                     void *context,
+                     unsigned int num_of_callbacks)
   {
-    memcached_free(&memc);
+    memcached_return rc= memcached_fetch_execute(&memc,
+                                                 callback,
+                                                 context,
+                                                 num_of_callbacks);
+    return (rc == MEMCACHED_SUCCESS);
   }
+
+  const std::string lib_version() const
+  {
+    const char *ver= memcached_lib_version();
+    const std::string version(ver);
+    return version;
+  }
+
+private:
+  memcached_st memc;
+  memcached_result_st result;
 };
index 3192f9e9f5ff6fe9b87cb0324352bf47a04714c0..bf57e3570b5f645de3c7937a696e427e678aa3ab 100644 (file)
@@ -1,24 +1,24 @@
 #include "common.h"
 
-void libmemcached_free(memcached_st *ptr __attribute__((unused)), void *mem)
+void libmemcached_free(memcached_st *ptr, void *mem)
 {
+  (void) ptr;
   free(mem);
 }
 
-void *libmemcached_malloc(memcached_st *ptr __attribute__((unused)), 
-                          size_t size)
+void *libmemcached_malloc(memcached_st *ptr, size_t size)
 {
+  (void) ptr;
   return malloc(size);
 }
 
-void *libmemcached_realloc(memcached_st *ptr __attribute__((unused)), 
-                           void *mem, size_t size)
+void *libmemcached_realloc(memcached_st *ptr, void *mem, size_t size)
 {
+  (void) ptr;
   return realloc(mem, size);
 }
 
-void *libmemcached_calloc(memcached_st *ptr __attribute__((unused)), 
-                           size_t nelem, size_t size)
+void *libmemcached_calloc(memcached_st *ptr, size_t nelem, size_t size)
 {
   if (ptr->call_malloc != libmemcached_malloc)
   {
index 2cb810db19f9df6ae844a6aecbf5938129fe6551..176cbcc908e3c3179beb73e2845d773662210891 100644 (file)
@@ -15,7 +15,7 @@ static memcached_return memcached_auto(memcached_st *ptr,
   unlikely (ptr->hosts == NULL || ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
-  if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
+  if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
     return MEMCACHED_BAD_KEY_PROVIDED;
 
   server_key= memcached_generate_hash(ptr, key, key_length);
index 3634dce83a214e3e9a632197e5752d02a646a3d0..aa80f8c209ba25090e014b8d75f282b8c5f787ab 100644 (file)
@@ -172,7 +172,7 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
 uint64_t memcached_behavior_get(memcached_st *ptr, 
                                 memcached_behavior flag)
 {
-  memcached_flags temp_flag= 0;
+  memcached_flags temp_flag= MEM_NO_BLOCK;
 
   switch (flag)
   {
index 3433585cec331ed323e204bd48ce396f4f94a9a8..ea59f84453749356ecd01de10190fedaf99234ea 100644 (file)
@@ -21,7 +21,7 @@ memcached_return memcached_callback_set(memcached_st *ptr,
       {
         size_t key_length= strlen(key);
 
-        if (memcached_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
+        if (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
         {
           return MEMCACHED_BAD_KEY_PROVIDED;
         }
index 5d0e31d0c3f352aa0d45f5d29b67bbd4e4503381..3bb157c50a02e90627b7fa5164c37b039e6f091e 100644 (file)
@@ -9,10 +9,6 @@
 #ifndef __MEMCACHED_CONSTANTS_H__
 #define __MEMCACHED_CONSTANTS_H__
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Public defines */
 #define MEMCACHED_DEFAULT_PORT 11211
 #define MEMCACHED_MAX_KEY 251 /* We add one to have it null terminated */
@@ -143,8 +139,4 @@ typedef enum {
   MEMCACHED_CONNECTION_UNIX_SOCKET
 } memcached_connection;
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* __MEMCACHED_CONSTANTS_H__ */
index 5e2a0132338aa8a5ce9c9ab394d2ec620a29be21..978ec29c1aaa183a2c2c8d4e8551a526bdafb056 100644 (file)
@@ -143,7 +143,9 @@ static inline memcached_return binary_delete(memcached_st *ptr,
       if ((memcached_do(server, (const char*)request.bytes, 
                         sizeof(request.bytes), 0) != MEMCACHED_SUCCESS) ||
           (memcached_io_write(server, key, key_length, flush) == -1))
-         memcached_io_reset(server);
+        memcached_io_reset(server);
+      else
+        memcached_server_response_decrement(server);
     }
   }
 
index 4899df56feafbea3eae51209d0c97b69f02a0cc3..88fec3a8d1daeb19cc5e4f097cc4cb428f229f5f 100644 (file)
@@ -9,7 +9,7 @@
 #include "common.h"
 static memcached_return ascii_dump(memcached_st *ptr, memcached_dump_func *callback, void *context, uint32_t number_of_callbacks)
 {
-  memcached_return rc;
+  memcached_return rc= 0;
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   size_t send_length;
   uint32_t server_key;
index e91db4cf363854f3aa363691c23ece90b274c8ac..b7e900053027f1c72fd7c98b77fe11d74007727a 100644 (file)
@@ -37,7 +37,7 @@ char *memcached_get_by_key(memcached_st *ptr,
   *error= memcached_mget_by_key(ptr, 
                                 master_key, 
                                 master_key_length, 
-                                (char **)&key, &key_length, 1);
+                                (const char **)&key, &key_length, 1);
 
   value= memcached_fetch(ptr, NULL, NULL, 
                          value_length, flags, error);
@@ -102,7 +102,7 @@ char *memcached_get_by_key(memcached_st *ptr,
 }
 
 memcached_return memcached_mget(memcached_st *ptr, 
-                                char **keys, size_t *key_length, 
+                                const char **keys, size_t *key_length, 
                                 unsigned int number_of_keys)
 {
   return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys);
@@ -111,19 +111,19 @@ memcached_return memcached_mget(memcached_st *ptr,
 static memcached_return binary_mget_by_key(memcached_st *ptr,
                                            unsigned int master_server_key,
                                            bool is_master_key_set,
-                                           char **keys, size_t *key_length,
+                                           const char **keys, size_t *key_length,
                                            unsigned int number_of_keys);
 
 memcached_return memcached_mget_by_key(memcached_st *ptr, 
                                        const char *master_key, 
                                        size_t master_key_length,
-                                       char **keys, 
+                                       const char **keys, 
                                        size_t *key_length, 
                                        unsigned int number_of_keys)
 {
   unsigned int x;
   memcached_return rc= MEMCACHED_NOTFOUND;
-  char *get_command= "get ";
+  const char *get_command= "get ";
   uint8_t get_command_length= 4;
   unsigned int master_server_key= (unsigned int)-1; /* 0 is a valid server id! */
   bool is_master_key_set= false;
@@ -145,7 +145,7 @@ memcached_return memcached_mget_by_key(memcached_st *ptr,
 
   if (master_key && master_key_length)
   {
-    if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((char **)&master_key, &master_key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
+    if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&master_key, &master_key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
       return MEMCACHED_BAD_KEY_PROVIDED;
     master_server_key= memcached_generate_hash(ptr, master_key, master_key_length);
     is_master_key_set= true;
@@ -259,7 +259,7 @@ memcached_return memcached_mget_by_key(memcached_st *ptr,
 static memcached_return simple_binary_mget(memcached_st *ptr,
                                            unsigned int master_server_key,
                                            bool is_master_key_set,
-                                           char **keys, size_t *key_length, 
+                                           const char **keys, size_t *key_length, 
                                            unsigned int number_of_keys)
 {
   memcached_return rc= MEMCACHED_NOTFOUND;
@@ -360,7 +360,7 @@ static memcached_return simple_binary_mget(memcached_st *ptr,
 
 static memcached_return replication_binary_mget(memcached_st *ptr,
                                              uint32_t* hash, bool* dead_servers,
-                                             char **keys, size_t *key_length,
+                                             const char **keys, size_t *key_length,
                                              unsigned int number_of_keys)
 {
   memcached_return rc= MEMCACHED_NOTFOUND;
@@ -459,7 +459,7 @@ static memcached_return replication_binary_mget(memcached_st *ptr,
 static memcached_return binary_mget_by_key(memcached_st *ptr,
                                            unsigned int master_server_key,
                                            bool is_master_key_set,
-                                           char **keys, size_t *key_length,
+                                           const char **keys, size_t *key_length,
                                            unsigned int number_of_keys)
 {
   memcached_return rc;
index 5535f34530bf2731b9a7c601f678d469c6d54e9d..7044442798ee5f2334323053f0d786e968a5d41a 100644 (file)
@@ -14,16 +14,19 @@ extern "C" {
 #endif
 
 /* Public defines */
+LIBMEMCACHED_API
 char *memcached_get(memcached_st *ptr, 
                     const char *key, size_t key_length,
                     size_t *value_length, 
                     uint32_t *flags,
                     memcached_return *error);
 
+LIBMEMCACHED_API
 memcached_return memcached_mget(memcached_st *ptr, 
-                                char **keys, size_t *key_length, 
+                                const char **keys, size_t *key_length, 
                                 unsigned int number_of_keys);
 
+LIBMEMCACHED_API
 char *memcached_get_by_key(memcached_st *ptr, 
                            const char *master_key, size_t master_key_length, 
                            const char *key, size_t key_length, 
@@ -31,18 +34,21 @@ char *memcached_get_by_key(memcached_st *ptr,
                            uint32_t *flags,
                            memcached_return *error);
 
+LIBMEMCACHED_API
 memcached_return memcached_mget_by_key(memcached_st *ptr, 
                                        const char *master_key, size_t 
                                        master_key_length,
-                                       char **keys, 
+                                       const char **keys, 
                                        size_t *key_length, 
                                        unsigned int number_of_keys);
 
+LIBMEMCACHED_API
 char *memcached_fetch(memcached_st *ptr, 
                       char *key, size_t *key_length, 
                       size_t *value_length, uint32_t *flags, 
                       memcached_return *error);
 
+LIBMEMCACHED_API
 memcached_result_st *memcached_fetch_result(memcached_st *ptr, 
                                             memcached_result_st *result,
                                             memcached_return *error);
index 5deb5c755f2708c353756125b31c43ac35b28a8b..e3249c0624774f0d2b343a27e719153e36dd0a45 100644 (file)
@@ -170,12 +170,15 @@ uint32_t memcached_generate_hash(memcached_st *ptr, const char *key, size_t key_
 
   if (ptr->flags & MEM_HASH_WITH_PREFIX_KEY)
   {
-    int temp_len= ptr->prefix_key_length + key_length;
-    char *temp= (char *)malloc(temp_len);
+    size_t temp_length= ptr->prefix_key_length + key_length;
+    char temp[temp_length];
+
+    if (temp_length > MEMCACHED_MAX_KEY -1)
+      return 0;
+
     strncpy(temp, ptr->prefix_key, ptr->prefix_key_length);
     strncpy(temp + ptr->prefix_key_length, key, key_length);
-    hash= generate_hash(ptr, temp, temp_len);
-    free(temp);
+    hash= generate_hash(ptr, temp, temp_length);
   }
   else
   {
index 086915aa9394b7b1f4a3498a9284d534c115943c..52fb4c1f90989332e459e2a041a05e2118fa9d20 100644 (file)
@@ -5,22 +5,27 @@
  * Author: Trond Norbye
  */
 
-#if !defined(MEMCACHED_INTERNAL_H) && defined(MEMCACHED_INTERNAL)
-#define MEMCACHED_INTERNAL_H
+#ifndef LIBMEMCACHED_MEMCACHED_INTERNAL_H
+#define LIBMEMCACHED_MEMCACHED_INTERNAL_H
+
+#if defined(BUILDING_LIBMEMCACHED)
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-void libmemcached_free(memcached_st *ptr __attribute__((unused)), void *mem);
-void *libmemcached_malloc(memcached_st *ptr __attribute__((unused)), 
-                          const size_t size);
-void *libmemcached_realloc(memcached_st *ptr __attribute__((unused)), 
-                           void *mem, const size_t size);
-void *libmemcached_calloc(memcached_st *ptr __attribute__((unused)),
-                           size_t nelem, size_t size);
+LIBMEMCACHED_LOCAL
+void libmemcached_free(memcached_st *ptr, void *mem);
+LIBMEMCACHED_LOCAL
+void *libmemcached_malloc(memcached_st *ptr, const size_t size);
+LIBMEMCACHED_LOCAL
+void *libmemcached_realloc(memcached_st *ptr, void *mem, const size_t size);
+LIBMEMCACHED_LOCAL
+void *libmemcached_calloc(memcached_st *ptr, size_t nelem, size_t size);
+
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* MEMCACHED_INTERNAL_H */
+#endif /* BUILDING_LIBMEMCACHED */
+#endif /* LIBMEMCACHED_MEMCACHED_INTERNAL_H */
index 6bcf871b9854c6371c95c85317bddc21541ad85c..da253955d156db2c5b35458f894f0803076cf635 100644 (file)
@@ -1,8 +1,17 @@
-/* Server IO, Not public! */
-#include "libmemcached/memcached.h"
+/*
+ * Summary: Server IO, Not public!
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Brian Aker
+ */
+
+#ifndef LIBMEMCACHED_MEMCACHED_IO_H
+#define LIBMEMCACHED_MEMCACHED_IO_H
 
-#ifndef __MEMCACHED_IO_H__
-#define __MEMCACHED_IO_H__
+#if defined(BUILDING_LIBMEMCACHED)
+
+#include "libmemcached/memcached.h"
 
 #define MAX_UDP_DATAGRAM_LENGTH 1400
 #define UDP_DATAGRAM_HEADER_LENGTH 8
@@ -46,4 +55,5 @@ memcached_return memcached_io_init_udp_header(memcached_server_st *ptr,
 
 memcached_server_st *memcached_io_get_readable_server(memcached_st *memc);
 
-#endif /* __MEMCACHED_IO_H__ */
+#endif /* BUILDING_LIBMEMCACHED */
+#endif /* LIBMEMCACHED_MEMCACHED_IO_H */
index bbbd940dbee3c0add01ea38a9fdd69c8517afd7f..c992c338c7248a688197691db0024895b9d708d7 100644 (file)
@@ -1,6 +1,6 @@
 #include "common.h"
 
-memcached_return memcached_key_test(char **keys, size_t *key_length, 
+memcached_return memcached_key_test(const char **keys, size_t *key_length, 
                                     unsigned int number_of_keys)
 {
   uint32_t x;
index 62896dea4d65072fe859250982d038078d57624f..ca1a08e61e0401f0b7749fdff6598f804acff4f4 100644 (file)
@@ -5,7 +5,6 @@
   Frankly its too damn useful not to be here though.
 */
 
-#include "libmemcached/memcached.h"
 #include "common.h"
 
 memcached_server_st *memcached_servers_parse(const char *server_strings)
index 90e4c5ad514cd9a415ad8a57e22df6d4760bf35b..7efe65e9e9674835c0c77db08bbd26bd082146a0 100644 (file)
@@ -17,12 +17,17 @@ extern "C" {
 
 struct memcached_pool_st;
 typedef struct memcached_pool_st memcached_pool_st;
+
+LIBMEMCACHED_API
 memcached_pool_st *memcached_pool_create(memcached_st* mmc, uint32_t initial, 
                                          uint32_t max);
+LIBMEMCACHED_API
 memcached_st* memcached_pool_destroy(memcached_pool_st* pool);
+LIBMEMCACHED_API
 memcached_st* memcached_pool_pop(memcached_pool_st* pool,
                                  bool block,
                                  memcached_return* rc);
+LIBMEMCACHED_API
 memcached_return memcached_pool_push(memcached_pool_st* pool, 
                                      memcached_st* mmc);
 
index 6cb39df62eed4daeff53722d74cf559f5abc6423..ba0691b504a39590c67184d830e2c1753222cec4 100644 (file)
@@ -237,13 +237,30 @@ static memcached_return textual_read_one_response(memcached_server_st *ptr,
         memcached_server_response_increment(ptr);
         return MEMCACHED_STAT;
       }
-      else if (buffer[1] == 'E')
+      else if (buffer[1] == 'E') /* SERVER_ERROR */ 
        {
-         /* SERVER_ERROR */ 
+          char *rel_ptr;
          char *startptr= buffer + 13, *endptr= startptr;
+
          while (*endptr != '\r' && *endptr != '\n') endptr++;
-         if (ptr->cached_server_error) ptr->root->call_free(ptr->root, ptr->cached_server_error);
-         ptr->cached_server_error= ptr->root->call_malloc(ptr->root, endptr - startptr + 1);
+
+          /* 
+            Yes, we could make this "efficent" but to do that we would need
+            to maintain more state for the size of the buffer. Why waste
+            memory in the struct, which is important, for something that
+            rarely should happen?
+          */
+         rel_ptr= (char *)ptr->root->call_realloc(ptr->root, ptr->cached_server_error, endptr - startptr + 1);
+
+          if (rel_ptr == NULL)
+          {
+            /* If we happened to have some memory, we just null it since we don't know the size */
+            if (ptr->cached_server_error)
+              ptr->cached_server_error[0]= 0;
+            return MEMCACHED_SERVER_ERROR;
+          }
+         ptr->cached_server_error= rel_ptr;
+
          memcpy(ptr->cached_server_error, startptr, endptr - startptr);
          ptr->cached_server_error[endptr - startptr]= 0;
          return MEMCACHED_SERVER_ERROR;
index 1462b89c3ef42e446162e44842931800bfbfcba7..0d77130db58857a437089073e513afef97f00f47 100644 (file)
@@ -40,7 +40,7 @@ void memcached_result_reset(memcached_result_st *ptr)
 /*
   NOTE turn into macro
 */
-memcached_return memcached_result_set_value(memcached_result_st *ptr, char *value, size_t length)
+memcached_return memcached_result_set_value(memcached_result_st *ptr, const char *value, size_t length)
 {
   return memcached_string_append(&ptr->value, value, length);
 }
index 155a7abb093c1958768549cd228485e5d341f5d8..e7ce012b3884e814e50b065c496b00b00c0e91b6 100644 (file)
@@ -26,8 +26,11 @@ struct memcached_result_st {
 };
 
 /* Result Struct */
+LIBMEMCACHED_API
 void memcached_result_free(memcached_result_st *result);
+LIBMEMCACHED_API
 void memcached_result_reset(memcached_result_st *ptr);
+LIBMEMCACHED_API
 memcached_result_st *memcached_result_create(memcached_st *ptr, 
                                              memcached_result_st *result);
 #define memcached_result_key_value(A) (A)->key
@@ -37,12 +40,15 @@ memcached_result_st *memcached_result_create(memcached_st *ptr,
 #define memcached_result_value(A) memcached_string_value((A)->value)
 #define memcached_result_length(A) memcached_string_length((A)->value)
 #else
+LIBMEMCACHED_API
 char *memcached_result_value(memcached_result_st *ptr);
+LIBMEMCACHED_API
 size_t memcached_result_length(memcached_result_st *ptr);
 #endif
 #define memcached_result_flags(A) (A)->flags
 #define memcached_result_cas(A) (A)->cas
-memcached_return memcached_result_set_value(memcached_result_st *ptr, char *value, size_t length);
+LIBMEMCACHED_API
+memcached_return memcached_result_set_value(memcached_result_st *ptr, const char *value, size_t length);
 #define memcached_result_set_flags(A,B) (A)->flags=(B)
 #define memcached_result_set_expiration(A,B) (A)->expiration=(B)
 
index 2359611e0f73d2b490904017fea54aab7a14456c..7b9c2117bff972b893f17eca23e1d0ae05b4aaf9 100644 (file)
@@ -54,16 +54,10 @@ void memcached_server_free(memcached_server_st *ptr)
   memcached_quit_server(ptr, 0);
 
   if (ptr->cached_server_error)
-  {
     free(ptr->cached_server_error);
-    ptr->cached_server_error= NULL;
-  }
 
   if (ptr->address_info)
-  {
     freeaddrinfo(ptr->address_info);
-    ptr->address_info= NULL;
-  }
 
   if (ptr->is_allocated)
     ptr->root->call_free(ptr->root, ptr);
@@ -76,7 +70,7 @@ void memcached_server_free(memcached_server_st *ptr)
 */
 memcached_server_st *memcached_server_clone(memcached_server_st *clone, memcached_server_st *ptr)
 {
-  memcached_server_st *rv = NULL;
+  memcached_server_st *rv= NULL;
 
   /* We just do a normal create if ptr is missing */
   if (ptr == NULL)
@@ -136,7 +130,7 @@ memcached_server_st *memcached_server_by_key(memcached_st *ptr,  const char *key
     return NULL;
   }
 
-  if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
+  if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
   {
     *error= MEMCACHED_BAD_KEY_PROVIDED;
     return NULL;
@@ -147,3 +141,16 @@ memcached_server_st *memcached_server_by_key(memcached_st *ptr,  const char *key
   return memcached_server_clone(NULL, &ptr->hosts[server_key]);
 
 }
+
+const char *memcached_server_error(memcached_server_st *ptr)
+{
+  if (ptr)
+    return ptr->cached_server_error;
+  else 
+    return NULL;
+}
+
+void memcached_server_error_reset(memcached_server_st *ptr)
+{
+  ptr->cached_server_error[0]= 0;
+}
index cffc5e8077e6de3d77213d2e2a9e09ad657b7792..ec1014a61b1aa85f955305e676dcca3c35acae88 100644 (file)
@@ -21,7 +21,6 @@ struct memcached_server_st {
   unsigned int port;
   int cached_errno;
   int fd;
-  char *cached_server_error;
   uint32_t io_bytes_sent; /* # bytes sent since last read */
   uint32_t server_failure_counter;
   uint32_t weight;
@@ -30,6 +29,7 @@ struct memcached_server_st {
   uint8_t minor_version;
   memcached_connection type;
   char *read_ptr;
+  char *cached_server_error;
   size_t read_buffer_length;
   size_t read_data_length;
   size_t write_buffer_offset;
@@ -48,26 +48,43 @@ struct memcached_server_st {
 #define memcached_server_list(A) (A)->hosts
 #define memcached_server_response_count(A) (A)->cursor_active
 
+LIBMEMCACHED_API
 memcached_return memcached_server_cursor(memcached_st *ptr, 
                                          memcached_server_function *callback,
                                          void *context,
                                          unsigned int number_of_callbacks);
 
+LIBMEMCACHED_API
 memcached_server_st *memcached_server_by_key(memcached_st *ptr,  const char *key, 
                                              size_t key_length, memcached_return *error);
 
+LIBMEMCACHED_API
+const char *memcached_server_error(memcached_server_st *ptr);
+
+LIBMEMCACHED_API
+void memcached_server_error_reset(memcached_server_st *ptr);
+
 /* These should not currently be used by end users */
+/* TODO: Is the above comment valid? If so, how can we unit test these if they
+ * aren't exported. If not, we should remove the comment */
+LIBMEMCACHED_API
 memcached_server_st *memcached_server_create(memcached_st *memc, memcached_server_st *ptr);
 
+LIBMEMCACHED_API
 memcached_server_st *memcached_server_create_with(memcached_st *memc, memcached_server_st *host, 
                                                   const char *hostname, unsigned int port, 
                                                   uint32_t weight, memcached_connection type);
 
+LIBMEMCACHED_API
 void memcached_server_free(memcached_server_st *ptr);
+LIBMEMCACHED_API
 memcached_server_st *memcached_server_clone(memcached_server_st *clone, memcached_server_st *ptr);
-memcached_analysis_st *memcached_analyze(memcached_st *memc, memcached_stat_st *stat,
+LIBMEMCACHED_API
+memcached_analysis_st *memcached_analyze(memcached_st *memc, memcached_stat_st *memc_stat,
                                          memcached_return *error);
 
+LIBMEMCACHED_API
+memcached_return memcached_server_remove(memcached_server_st *st_ptr);
 
 #ifdef __cplusplus
 }
index c7e1197b5dd8f64444711d11c913bbc2ce139a98..e64ca550bd143d10689c591a3d675a900b26341a 100644 (file)
@@ -3,7 +3,7 @@
 
 #include "common.h"
 
-static char *memcached_stat_keys[] = {
+static const char *memcached_stat_keys[] = {
   "pid",
   "uptime",
   "time",
index b950dc92f45e8bebc02a052636533019714987d5..e10f85f0e0597b977663da098d90f64fd6af0c87 100644 (file)
@@ -19,7 +19,7 @@ typedef enum {
 } memcached_storage_action;
 
 /* Inline this */
-static char *storage_op_string(memcached_storage_action verb)
+static const char *storage_op_string(memcached_storage_action verb)
 {
   switch (verb)
   {
@@ -79,7 +79,7 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   unlikely (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
-  if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
+  if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
     return MEMCACHED_BAD_KEY_PROVIDED;
 
   if (ptr->flags & MEM_BINARY_PROTOCOL)
@@ -491,7 +491,9 @@ static memcached_return memcached_send_binary(memcached_st *ptr,
                         send_length, 0) != MEMCACHED_SUCCESS) ||
           (memcached_io_write(srv, key, key_length, 0) == -1) ||
           (memcached_io_write(srv, value, value_length, flush) == -1))
-        memcached_io_reset(server);
+        memcached_io_reset(srv);
+      else
+        memcached_server_response_decrement(srv);
     }
   }
 
index 25adc983431b54521111d2e781d1813415a4ca5f..834401a69e75fd7d3caa2c94ffddbf1d69505677 100644 (file)
@@ -9,33 +9,41 @@
 #ifndef __MEMCACHED_STORAGE_H__
 #define __MEMCACHED_STORAGE_H__
 
+#include "libmemcached/memcached_types.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* All of the functions for adding data to the server */
+LIBMEMCACHED_API
 memcached_return memcached_set(memcached_st *ptr, const char *key, size_t key_length, 
                                const char *value, size_t value_length, 
                                time_t expiration,
                                uint32_t  flags);
+LIBMEMCACHED_API
 memcached_return memcached_add(memcached_st *ptr, const char *key, size_t key_length,
                                const char *value, size_t value_length, 
                                time_t expiration,
                                uint32_t  flags);
+LIBMEMCACHED_API
 memcached_return memcached_replace(memcached_st *ptr, const char *key, size_t key_length,
                                    const char *value, size_t value_length, 
                                    time_t expiration,
                                    uint32_t  flags);
+LIBMEMCACHED_API
 memcached_return memcached_append(memcached_st *ptr, 
                                   const char *key, size_t key_length,
                                   const char *value, size_t value_length, 
                                   time_t expiration,
                                   uint32_t flags);
+LIBMEMCACHED_API
 memcached_return memcached_prepend(memcached_st *ptr, 
                                    const char *key, size_t key_length,
                                    const char *value, size_t value_length, 
                                    time_t expiration,
                                    uint32_t flags);
+LIBMEMCACHED_API
 memcached_return memcached_cas(memcached_st *ptr, 
                                const char *key, size_t key_length,
                                const char *value, size_t value_length, 
@@ -43,6 +51,7 @@ memcached_return memcached_cas(memcached_st *ptr,
                                uint32_t flags,
                                uint64_t cas);
 
+LIBMEMCACHED_API
 memcached_return memcached_set_by_key(memcached_st *ptr, 
                                       const char *master_key, size_t master_key_length, 
                                       const char *key, size_t key_length, 
@@ -50,6 +59,7 @@ memcached_return memcached_set_by_key(memcached_st *ptr,
                                       time_t expiration,
                                       uint32_t flags);
 
+LIBMEMCACHED_API
 memcached_return memcached_add_by_key(memcached_st *ptr, 
                                       const char *master_key, size_t master_key_length,
                                       const char *key, size_t key_length,
@@ -57,6 +67,7 @@ memcached_return memcached_add_by_key(memcached_st *ptr,
                                       time_t expiration,
                                       uint32_t flags);
 
+LIBMEMCACHED_API
 memcached_return memcached_replace_by_key(memcached_st *ptr, 
                                           const char *master_key, size_t master_key_length,
                                           const char *key, size_t key_length,
@@ -64,6 +75,7 @@ memcached_return memcached_replace_by_key(memcached_st *ptr,
                                           time_t expiration,
                                           uint32_t flags);
 
+LIBMEMCACHED_API
 memcached_return memcached_prepend_by_key(memcached_st *ptr, 
                                           const char *master_key, size_t master_key_length,
                                           const char *key, size_t key_length,
@@ -71,6 +83,7 @@ memcached_return memcached_prepend_by_key(memcached_st *ptr,
                                           time_t expiration,
                                           uint32_t flags);
 
+LIBMEMCACHED_API
 memcached_return memcached_append_by_key(memcached_st *ptr, 
                                          const char *master_key, size_t master_key_length,
                                          const char *key, size_t key_length,
@@ -78,6 +91,7 @@ memcached_return memcached_append_by_key(memcached_st *ptr,
                                          time_t expiration,
                                          uint32_t flags);
 
+LIBMEMCACHED_API
 memcached_return memcached_cas_by_key(memcached_st *ptr, 
                                       const char *master_key, size_t master_key_length,
                                       const char *key, size_t key_length,
index 47afdbda396bdaafac606e1c7566ebd5175f564c..8b75edd40be73ceb72488fef6ecfcbafe7b0b0b1 100644 (file)
@@ -1,6 +1,6 @@
 #include "common.h"
 
-char *memcached_strerror(memcached_st *ptr __attribute__((unused)), memcached_return rc)
+const char *memcached_strerror(memcached_st *ptr __attribute__((unused)), memcached_return rc)
 {
   switch (rc)
   {
index c190997b9d3a9273436e310e645805e722db9ac0..5b9e9281620e3e063bce34597e14765c0c397041 100644 (file)
@@ -79,7 +79,7 @@ memcached_return memcached_string_append_character(memcached_string_st *string,
 }
 
 memcached_return memcached_string_append(memcached_string_st *string,
-                                         char *value, size_t length)
+                                         const char *value, size_t length)
 {
   memcached_return rc;
 
index 58d109d2ef67aac5d2e96fe9aa09f061669cd6bc..bed142811c217e51e72d9f881cc7b00876eb6f3f 100644 (file)
@@ -27,16 +27,23 @@ struct memcached_string_st {
 #define memcached_string_size(A) (A)->current_size
 #define memcached_string_value(A) (A)->string
 
+LIBMEMCACHED_API
 memcached_string_st *memcached_string_create(memcached_st *ptr,
                                              memcached_string_st *string,
                                              size_t initial_size);
+LIBMEMCACHED_API
 memcached_return memcached_string_check(memcached_string_st *string, size_t need);
+LIBMEMCACHED_API
 char *memcached_string_c_copy(memcached_string_st *string);
+LIBMEMCACHED_API
 memcached_return memcached_string_append_character(memcached_string_st *string,
                                                    char character);
+LIBMEMCACHED_API
 memcached_return memcached_string_append(memcached_string_st *string,
-                                         char *value, size_t length);
+                                         const char *value, size_t length);
+LIBMEMCACHED_API
 memcached_return memcached_string_reset(memcached_string_st *string);
+LIBMEMCACHED_API
 void memcached_string_free(memcached_string_st *string);
 
 #ifdef __cplusplus
index ec8afa80ecf49717d05ab969a3be93dfeec98975..65732c87f438919738c9cfd170b4a19da11a7650 100644 (file)
 #ifndef MEMCACHED_UTIL_H
 #define MEMCACHED_UTIL_H
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #include <libmemcached/memcached_pool.h>
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* MEMCACHED_UTIL_H */
index 30bcb1bd28554638681c45618036cd93d3b71048..9c070eaf2ec744339b3cb499050cacbf359cba3d 100644 (file)
@@ -26,7 +26,7 @@ static inline memcached_return memcached_version_textual(memcached_st *ptr)
   memcached_return rc;
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   char *response_ptr;
-  char *command= "version\r\n";
+  const char *command= "version\r\n";
 
   send_length= strlen(command);
 
index ab479f17fe50a1bd7311adf3fce93f446dd2dba9..dc8045aa0d029a187ff04b263f3c111c7c96d81a 100644 (file)
@@ -6,15 +6,12 @@
  * Author: Brian Aker
  */
 
-#ifndef __MEMCACHED_WATCHPOINT_H__
-#define __MEMCACHED_WATCHPOINT_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
+#ifndef LIBMEMCACHED_MEMCACHED_WATCHPOINT_H
+#define LIBMEMCACHED_MEMCACHED_WATCHPOINT_H
 
 /* Some personal debugging functions */
-#if defined(MEMCACHED_INTERNAL) && defined(DEBUG)
+#if defined(DEBUG)
+
 #include <assert.h>
 
 #define WATCHPOINT fprintf(stderr, "\nWATCHPOINT %s:%d (%s)\n", __FILE__, __LINE__,__func__);fflush(stdout);
@@ -36,10 +33,6 @@ extern "C" {
 #define WATCHPOINT_ASSERT_PRINT(A,B,C)
 #define WATCHPOINT_ASSERT(A)
 
-#endif /* MEMCACHED_INTERNAL && DEBUG */
-
-#ifdef __cplusplus
-}
-#endif
+#endif /* DEBUG */
 
-#endif /* __MEMCACHED_WATCHPOINT_H__ */
+#endif /* LIBMEMCACHED_MEMCACHED_WATCHPOINT_H */
diff --git a/libmemcached/visibility.h b/libmemcached/visibility.h
new file mode 100644 (file)
index 0000000..9405a88
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Summary: interface for memcached server
+ * Description: visibitliy macros for libmemcached
+ *
+ * Use and distribution licensed under the BSD license.  See
+ * the COPYING file in this directory for full text.
+ * 
+ * Author: Monty Taylor
+ */
+
+/**
+ * @file
+ * @brief Visibility control macros
+ */
+
+#ifndef __LIBMEMCACHED_VISIBILITY_H
+#define __LIBMEMCACHED_VISIBILITY_H
+
+/**
+ *
+ * LIBMEMCACHED_API is used for the public API symbols. It either DLL imports or
+ * DLL exports (or does nothing for static build).
+ *
+ * LIBMEMCACHED_LOCAL is used for non-api symbols.
+ */
+
+#if defined(BUILDING_LIBMEMCACHED)
+# if defined(HAVE_VISIBILITY) && HAVE_VISIBILITY
+#  define LIBMEMCACHED_API __attribute__ ((visibility("default")))
+#  define LIBMEMCACHED_LOCAL  __attribute__ ((visibility("hidden")))
+# elif defined (__SUNPRO_C) && (__SUNPRO_C >= 0x550)
+#  define LIBMEMCACHED_API __global
+#  define LIBMEMCACHED_LOCAL __hidden
+# elif defined(_MSC_VER)
+#  define LIBMEMCACHED_API extern __declspec(dllexport) 
+#  define LIBMEMCACHED_LOCAL
+# else
+#  define LIBMEMCACHED_API
+#  define LIBMEMCACHED_LOCAL
+# endif /* defined(HAVE_VISIBILITY) */
+#else  /* defined(BUILDING_LIBMEMCACHED) */
+# if defined(_MSC_VER)
+#  define LIBMEMCACHED_API extern __declspec(dllimport) 
+#  define LIBMEMCACHED_LOCAL
+# else
+#  define LIBMEMCACHED_API
+#  define LIBMEMCACHED_LOCAL
+# endif /* defined(_MSC_VER) */
+#endif /* defined(BUILDING_LIBMEMCACHED) */
+
+#endif /* __LIBMEMCACHED_VISIBILITY_H */
index a1fc8c30ee3dbafac00da6471341763ac8cb9c75..708b7ce2a793ffa930336eb7102f119d99846cbb 100644 (file)
@@ -1,5 +1,7 @@
 #include "libmemcached/common.h"
 #include "libmemcached/memcached_pool.h"
+
+#include <errno.h>
 #include <pthread.h>
 
 struct memcached_pool_st 
diff --git a/m4/64bit.m4 b/m4/64bit.m4
deleted file mode 100644 (file)
index eeecf52..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-dnl ---------------------------------------------------------------------------
-dnl Macro: ENABLE_64BIT
-dnl ---------------------------------------------------------------------------
-AC_DEFUN([ENABLE_64BIT],[
-
-  AC_CHECK_PROGS(ISAINFO, [isainfo], [no])
-  AS_IF([test "x$ISAINFO" != "xno"],
-        [isainfo_b=`${ISAINFO} -b`],
-        [isainfo_b="x"])
-
-  AS_IF([test "$isainfo_b" != "x"],
-        [AC_ARG_ENABLE([64bit],
-             [AS_HELP_STRING([--disable-64bit],
-                [Build 64 bit binary @<:@default=on@:>@])],
-             [ac_enable_64bit="$enableval"],
-             [ac_enable_64bit="yes"])])
-
-  AS_IF([test "x$ac_enable_64bit" = "xyes"],[
-         if test "x$libdir" = "x\${exec_prefix}/lib" ; then
-           # The user hasn't overridden the default libdir, so we'll 
-           # the dir suffix to match solaris 32/64-bit policy
-           isainfo_k=`${ISAINFO} -k` 
-           libdir="${libdir}/${isainfo_k}"
-         fi
-         CFLAGS="-m64 $CFLAGS"
-         CXXFLAGS="-m64 $CXXFLAGS"
-         if test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes"
-         then
-            CFLAGS="-xmemalign=8s $CFLAGS"
-            CXXFLAGS="-xmemalign=8s $CXXFLAGS"
-         fi
-       ])
-])
-dnl ---------------------------------------------------------------------------
-dnl End Macro: ENABLE_64BIT
-dnl ---------------------------------------------------------------------------
diff --git a/m4/ac_cxx_compile_stdcxx_0x.m4 b/m4/ac_cxx_compile_stdcxx_0x.m4
new file mode 100644 (file)
index 0000000..ada4172
--- /dev/null
@@ -0,0 +1,103 @@
+# ===========================================================================
+#        http://autoconf-archive.cryp.to/ac_cxx_compile_stdcxx_0x.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AC_CXX_COMPILE_STDCXX_0X
+#
+# DESCRIPTION
+#
+#   Check for baseline language coverage in the compiler for the C++0x
+#   standard.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.
+
+AC_DEFUN([AC_CXX_COMPILE_STDCXX_0X], [
+  AC_CACHE_CHECK(if g++ supports C++0x features without additional flags,
+  ac_cv_cxx_compile_cxx0x_native,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  AC_TRY_COMPILE([
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = c;],,
+  ac_cv_cxx_compile_cxx0x_native=yes, ac_cv_cxx_compile_cxx0x_native=no)
+  AC_LANG_RESTORE
+  ])
+
+  AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x,
+  ac_cv_cxx_compile_cxx0x_cxx,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -std=c++0x"
+  AC_TRY_COMPILE([
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = c;],,
+  ac_cv_cxx_compile_cxx0x_cxx=yes, ac_cv_cxx_compile_cxx0x_cxx=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+
+  AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x,
+  ac_cv_cxx_compile_cxx0x_gxx,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -std=gnu++0x"
+  AC_TRY_COMPILE([
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = c;],,
+  ac_cv_cxx_compile_cxx0x_gxx=yes, ac_cv_cxx_compile_cxx0x_gxx=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+
+  if test "$ac_cv_cxx_compile_cxx0x_native" = yes ||
+     test "$ac_cv_cxx_compile_cxx0x_cxx" = yes ||
+     test "$ac_cv_cxx_compile_cxx0x_gxx" = yes; then
+    AC_DEFINE(HAVE_STDCXX_0X,,[Define if g++ supports C++0x features. ])
+  fi
+])
diff --git a/m4/ac_cxx_header_stdcxx_98.m4 b/m4/ac_cxx_header_stdcxx_98.m4
new file mode 100644 (file)
index 0000000..67e4c97
--- /dev/null
@@ -0,0 +1,67 @@
+dnl Copyright © 2008 Benjamin Kosnik <bkoz@redhat.com>
+
+dnl Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved.
+
+
+AC_DEFUN([AC_CXX_HEADER_STDCXX_98], [
+  AC_CACHE_CHECK(for ISO C++ 98 include files,
+  ac_cv_cxx_stdcxx_98,
+  [AC_LANG_PUSH(C++)
+  AC_TRY_COMPILE([
+    #include <cassert>
+    #include <cctype>
+    #include <cerrno>
+    #include <cfloat>
+    #include <ciso646>
+    #include <climits>
+    #include <clocale>
+    #include <cmath>
+    #include <csetjmp>
+    #include <csignal>
+    #include <cstdarg>
+    #include <cstddef>
+    #include <cstdio>
+    #include <cstdlib>
+    #include <cstring>
+    #include <ctime>
+
+    #include <algorithm>
+    #include <bitset>
+    #include <complex>
+    #include <deque>
+    #include <exception>
+    #include <fstream>
+    #include <functional>
+    #include <iomanip>
+    #include <ios>
+    #include <iosfwd>
+    #include <iostream>
+    #include <istream>
+    #include <iterator>
+    #include <limits>
+    #include <list>
+    #include <locale>
+    #include <map>
+    #include <memory>
+    #include <new>
+    #include <numeric>
+    #include <ostream>
+    #include <queue>
+    #include <set>
+    #include <sstream>
+    #include <stack>
+    #include <stdexcept>
+    #include <streambuf>
+    #include <string>
+    #include <typeinfo>
+    #include <utility>
+    #include <valarray>
+    #include <vector>
+  ],,
+  ac_cv_cxx_stdcxx_98=yes, ac_cv_cxx_stdcxx_98=no)
+  AC_LANG_POP()
+  ])
+  if test "$ac_cv_cxx_stdcxx_98" = yes; then
+    AC_DEFINE(STDCXX_98_HEADERS,,[Define if ISO C++ 1998 header files are present. ])
+  fi
+])
diff --git a/m4/check_gcc_version.m4 b/m4/check_gcc_version.m4
deleted file mode 100644 (file)
index e38e300..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-AC_DEFUN([FORCE_MAC_GCC42],
-  [AS_IF([test "$GCC" = "yes"],[
-    dnl If you're on a Mac, and you didn't ask for a specific compiler
-    dnl You're gonna get 4.2.
-    AS_IF([test "$host_vendor" = "apple" -a "x${ac_cv_env_CC_set}" = "x"],[
-      AS_IF([test -f /usr/bin/gcc-4.2],
-        [
-          CPP="/usr/bin/gcc-4.2 -E"
-          CC=/usr/bin/gcc-4.2
-          CXX=/usr/bin/g++-4.2
-        ])
-    ])
-  ])
-])
-
-AC_DEFUN([CHECK_GCC_VERSION],[
-  AC_REQUIRE([FORCE_MAC_GCC42])
-  AC_CACHE_CHECK([if GCC is recent enough], [ac_cv_gcc_recent],
-    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-#if !defined(__GNUC__) || (__GNUC__ < 4) || ((__GNUC__ >= 4) && (__GNUC_MINOR__ < 1))
-# error GCC is Too Old!
-#endif
-      ]])],
-      [ac_cv_gcc_recent=yes],
-      [ac_cv_gcc_recent=no])])
-  AS_IF([test "$ac_cv_gcc_recent" = "no" -a "$host_vendor" = "apple"],
-    AC_MSG_ERROR([Your version of GCC is too old. At least version 4.2 is required on OSX. You may need to install a version of XCode >= 3.1.2]))
-  AS_IF([test "$drizzle_cv_gcc_recent" = "no"],
-    AC_MSG_ERROR([Your version of GCC is too old. At least version 4.1 is required]))
-])
diff --git a/m4/dtrace.m4 b/m4/dtrace.m4
deleted file mode 100644 (file)
index 274a661..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-dnl ---------------------------------------------------------------------------
-dnl Macro: ENABLE_DTRACE
-dnl ---------------------------------------------------------------------------
-AC_DEFUN([ENABLE_DTRACE],[
-  AC_ARG_ENABLE([dtrace],
-    [AS_HELP_STRING([--enable-dtrace],
-       [Build with support for the DTRACE. @<:@default=off@:>@])],
-    [ac_cv_enable_dtrace="yes"],
-    [ac_cv_enable_dtrace="no"])
-
-  if test "$ac_cv_enable_dtrace" = "yes"
-  then
-    AC_PATH_PROG([DTRACE], [dtrace], "no", [/usr/sbin:$PATH])
-    if test "x$DTRACE" != "xno"; then
-      AC_DEFINE([HAVE_DTRACE], [1], [Enables DTRACE Support])
-      DTRACE_HEADER=dtrace_probes.h
-
-      # DTrace on MacOSX does not use -G option
-      $DTRACE -G -o conftest.$$ -s libmemcached/libmemcached_probes.d 2>/dev/zero
-      if test $? -eq 0
-      then
-        DTRACE_OBJ=libmemcached_probes.lo
-        rm conftest.$$
-      fi
-
-      ac_cv_enable_dtrace="yes"
-      AC_SUBST(HAVE_DTRACE)
-    else
-      AC_MSG_ERROR([Need dtrace binary and OS support.])
-    fi
-  fi
-
-  AC_SUBST(DTRACEFLAGS)
-  AC_SUBST(DTRACE_HEADER)
-  AC_SUBST(DTRACE_OBJ)
-  AM_CONDITIONAL([HAVE_DTRACE], [ test "$ac_cv_enable_dtrace" = "yes" ])
-])
-dnl ---------------------------------------------------------------------------
-dnl End Macro: ENABLE_DTRACE
-dnl ---------------------------------------------------------------------------
index 2824fa09127b04036e00089b7a6bd176c9b86bf9..611fcfdbc402350d9f3e7fdc6f10c5a7a748e5e0 100644 (file)
@@ -20,7 +20,7 @@
 # AC_DEFINE.  The goal here is to define all known feature-enabling
 # macros, then, if reports of conflicts are made, disable macros that
 # cause problems on some platforms (such as __EXTENSIONS__).
-AC_DEFUN([ACX_USE_SYSTEM_EXTENSIONS],
+AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS],
 [AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
 AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
 
index 0efa589d7bfc8caf80cccd2d0414fe450509b77f..b5bc304ebdd2eae38bcc0634b1a914d07f2f13c6 100644 (file)
@@ -8,12 +8,22 @@ AC_DEFUN([WITH_MEMCACHED],
   # just ignore the user if --without-memcached is passed.. it is
   # only used by make test
   AS_IF([test "x$withval" = "xno"],
-    [ac_cv_with_memcached=memcached])
-
-  AC_PATH_PROG([MEMC_BINARY], [$ac_cv_with_memcached], "no")
-
-  AS_IF([test "x$MEMC_BINARY" = "xno"],
-        AC_MSG_ERROR(["could not find memcached binary"]))
+    [
+      ac_cv_with_memcached=memcached
+      MEMC_BINARY=memcached
+    ],
+    [
+       AS_IF([test -f "$withval"],
+         [
+           ac_cv_with_memcached=$withval
+           MEMC_BINARY=$withval
+         ], 
+         [
+           AC_PATH_PROG([MEMC_BINARY], [$ac_cv_with_memcached], "no")
+           AS_IF([test "x$MEMC_BINARY" = "xno"],
+             AC_MSG_ERROR(["could not find memcached binary"]))
+         ])
+    ])
 
   AC_DEFINE_UNQUOTED([MEMCACHED_BINARY], "$MEMC_BINARY", 
             [Name of the memcached binary used in make test])
diff --git a/m4/pandora_64bit.m4 b/m4/pandora_64bit.m4
new file mode 100644 (file)
index 0000000..44ec4c0
--- /dev/null
@@ -0,0 +1,53 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl ---------------------------------------------------------------------------
+dnl Macro: PANDORA_64BIT
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([PANDORA_64BIT],[
+
+  AC_ARG_ENABLE([64bit],[
+    AS_HELP_STRING([--disable-64bit],
+      [Build 64 bit binary @<:@default=on@:>@])],
+             [ac_enable_64bit="$enableval"],
+             [ac_enable_64bit="yes"])
+
+  AC_CHECK_PROGS(ISAINFO, [isainfo], [no])
+  AS_IF([test "x$ISAINFO" != "xno"],
+        [isainfo_b=`${ISAINFO} -b`],
+        [isainfo_b="x"])
+
+  AS_IF([test "$isainfo_b" != "x"],[
+
+    isainfo_k=`${ISAINFO} -k` 
+    DTRACEFLAGS="${DTRACEFLAGS} -${isainfo_k}"
+
+    AS_IF([test "x${ac_cv_env_CPPFLAGS_set}" = "x"],[
+      CPPFLAGS="-I/usr/local ${CPPFLAGS}"
+    ])
+
+    AS_IF([test "x${ac_cv_env_LDFLAGS_set}" = "x"],[
+      LDFLAGS="-L/usr/local/lib/${isainfo_k} ${LDFLAGS}"
+    ])
+
+    AS_IF([test "x$ac_enable_64bit" = "xyes"],[
+      AS_IF([test "x$libdir" = "x\${exec_prefix}/lib"],[
+       dnl The user hasn't overridden the default libdir, so we'll 
+       dnl the dir suffix to match solaris 32/64-bit policy
+       libdir="${libdir}/${isainfo_k}"
+      ])
+
+      CPPFLAGS="-m64 ${CPPFLAGS}"
+      LDFLAGS="-m64 ${LDFLAGS}"
+      AS_IF([test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes"],[
+        AM_CFLAGS="-xmemalign=8s ${AM_CFLAGS}"
+        AM_CXXFLAGS="-xmemalign=8s ${AM_CXXFLAGS}"
+      ])
+    ])
+  ])
+])
+dnl ---------------------------------------------------------------------------
+dnl End Macro: PANDORA_64BIT
+dnl ---------------------------------------------------------------------------
diff --git a/m4/pandora_canonical.m4 b/m4/pandora_canonical.m4
new file mode 100644 (file)
index 0000000..fc77522
--- /dev/null
@@ -0,0 +1,149 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Which version of the canonical setup we're using
+AC_DEFUN([PANDORA_CANONICAL_VERSION],[0.13])
+
+AC_DEFUN([PANDORA_FORCE_DEPEND_TRACKING],[
+  dnl Force dependency tracking on for Sun Studio builds
+  AS_IF([test "x${enable_dependency_tracking}" = "x"],[
+    enable_dependency_tracking=yes
+  ])
+])
+
+dnl The standard setup for how we build Pandora projects
+AC_DEFUN([PANDORA_CANONICAL_TARGET],[
+  AC_REQUIRE([PANDORA_FORCE_DEPEND_TRACKING])
+  ifdef([m4_define],,[define([m4_define],   defn([define]))])
+  ifdef([m4_undefine],,[define([m4_undefine],   defn([undefine]))])
+  m4_define([PCT_ALL_ARGS],[$*])
+  m4_define([PCT_USE_GNULIB],[no])
+  m4_define([PCT_REQUIRE_CXX],[no])
+  m4_define([PCT_IGNORE_SHARED_PTR],[no])
+  m4_define([PCT_FORCE_GCC42],[no])
+  m4_foreach([pct_arg],[$*],[
+    m4_case(pct_arg,
+      [use-gnulib], [
+        m4_undefine([PCT_USE_GNULIB])
+        m4_define([PCT_USE_GNULIB],[yes])
+      ],
+      [require-cxx], [
+        m4_undefine([PCT_REQUIRE_CXX])
+        m4_define([PCT_REQUIRE_CXX],[yes])
+      ],
+      [ignore-shared-ptr], [
+        m4_undefine([PCT_IGNORE_SHARED_PTR])
+        m4_define([PCT_IGNORE_SHARED_PTR],[yes])
+      ],
+      [force-gcc42], [
+        m4_undefine([PCT_FORCE_GCC42])
+        m4_define([PCT_FORCE_GCC42],[yes])
+    ])
+  ])
+
+  # We need to prevent canonical target
+  # from injecting -O2 into CFLAGS - but we won't modify anything if we have
+  # set CFLAGS on the command line, since that should take ultimate precedence
+  AS_IF([test "x${ac_cv_env_CFLAGS_set}" = "x"],
+        [CFLAGS=""])
+  AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"],
+        [CXXFLAGS=""])
+  
+  AC_CANONICAL_TARGET
+  
+  AM_INIT_AUTOMAKE(-Wall -Werror nostdinc subdir-objects)
+
+  m4_if(PCT_USE_GNULIB,yes,[ gl_EARLY ])
+  
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([PANDORA_MAC_GCC42])
+
+  dnl Once we can use a modern autoconf, we can use this
+  dnl AC_PROG_CC_C99
+  AC_PROG_CXX
+  AC_PROG_CPP
+  AM_PROG_CC_C_O
+
+  gl_USE_SYSTEM_EXTENSIONS
+  m4_if(PCT_FORCE_GCC42, [yes], [
+    AS_IF([test "$GCC" = "yes"], PANDORA_ENSURE_GCC_VERSION)
+  ])
+  
+
+  PANDORA_LIBTOOL
+
+  dnl autoconf doesn't automatically provide a fail-if-no-C++ macro
+  dnl so we check c++98 features and fail if we don't have them, mainly
+  dnl for that reason
+  PANDORA_CHECK_CXX_STANDARD
+  m4_if(PCT_REQUIRE_CXX, [yes], [
+    AS_IF([test "$ac_cv_cxx_stdcxx_98" = "no"],[
+      AC_MSG_ERROR([No working C++ Compiler has been found. ${PACKAGE} requires a C++ compiler that can handle C++98])
+    ])
+  ])
+  
+  PANDORA_SHARED_PTR
+  m4_if(PCT_IGNORE_SHARED_PTR, [no], [
+    AS_IF([test "$ac_cv_shared_ptr_namespace" = "missing"],[
+      AC_MSG_WARN([a usable shared_ptr implementation was not found. Let someone know what your platform is.])
+    ])
+  ])
+  
+  m4_if(PCT_USE_GNULIB, [yes], [gl_INIT])
+
+  AC_C_BIGENDIAN
+  AC_C_CONST
+  AC_C_INLINE
+  AC_C_VOLATILE
+
+  AC_HEADER_TIME
+  AC_TYPE_SIZE_T
+  AC_FUNC_MALLOC
+  AC_FUNC_REALLOC
+  
+
+  AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
+
+  AC_SYS_LARGEFILE
+
+
+  PANDORA_CHECK_C_VERSION
+  PANDORA_CHECK_CXX_VERSION
+
+  PANDORA_OPTIMIZE
+  PANDORA_64BIT
+
+  dnl We need to inject error into the cflags to test if visibility works or not
+  save_CFLAGS="${CFLAGS}"
+  CFLAGS="${CFLAGS} -Werror"
+  gl_VISIBILITY
+  CFLAGS="${save_CFLAGS}"
+
+  PANDORA_HEADER_ASSERT
+
+  PANDORA_WARNINGS(PCT_ALL_ARGS)
+
+  PANDORA_ENABLE_DTRACE
+
+  AC_CHECK_PROGS([DOXYGEN], [doxygen])
+  AC_CHECK_PROGS([PERL], [perl])
+
+  AS_IF([test "x${gl_LIBOBJS}" != "x"],[
+    AS_IF([test "$GCC" = "yes"],[
+      AM_CPPFLAGS="-isystem \$(top_srcdir)/gnulib -isystem \$(top_builddir)/gnulib ${AM_CPPFLAGS}"
+    ],[
+    AM_CPPFLAGS="-I\$(top_srcdir)/gnulib -I\$(top_builddir)/gnulib ${AM_CPPFLAGS}"
+    ])
+  ])
+
+  AM_CPPFLAGS="-I\${top_srcdir} -I\${top_builddir} ${AM_CPPFLAGS}"
+  AM_CFLAGS="${AM_CFLAGS} ${CC_WARNINGS} ${CC_PROFILING} ${CC_COVERAGE}"
+  AM_CXXFLAGS="${AM_CXXFLAGS} ${CXX_WARNINGS} ${CC_PROFILING} ${CC_COVERAGE}"
+
+  AC_SUBST([AM_CFLAGS])
+  AC_SUBST([AM_CXXFLAGS])
+  AC_SUBST([AM_CPPFLAGS])
+
+])
diff --git a/m4/pandora_check_compiler_version.m4 b/m4/pandora_check_compiler_version.m4
new file mode 100644 (file)
index 0000000..ab7c671
--- /dev/null
@@ -0,0 +1,37 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+
+AC_DEFUN([PANDORA_CHECK_C_VERSION],[
+
+  dnl Print version of C compiler
+  AC_MSG_CHECKING("C Compiler version--$GCC")
+  AS_IF([test "$GCC" = "yes"],[
+    CC_VERSION=`$CC --version | sed 1q`
+  ],[AS_IF([test "$SUNCC" = "yes"],[
+      CC_VERSION=`$CC -V 2>&1 | sed 1q`
+    ],[
+      CC_VERSION=""
+    ])
+  ])
+  AC_MSG_RESULT("$CC_VERSION")
+  AC_SUBST(CC_VERSION)
+])
+
+
+AC_DEFUN([PANDORA_CHECK_CXX_VERSION], [
+  dnl Print version of CXX compiler
+  AC_MSG_CHECKING("C++ Compiler version")
+  AS_IF([test "$GCC" = "yes"],[
+    CXX_VERSION=`$CXX --version | sed 1q`
+  ],[AS_IF([test "$SUNCC" = "yes"],[
+      CXX_VERSION=`$CXX -V 2>&1 | sed 1q`
+    ],[
+    CXX_VERSION=""
+    ])
+  ])
+  AC_MSG_RESULT("$CXX_VERSION")
+  AC_SUBST(CXX_VERSION)
+])
diff --git a/m4/pandora_check_cxx_standard.m4 b/m4/pandora_check_cxx_standard.m4
new file mode 100644 (file)
index 0000000..d4189ea
--- /dev/null
@@ -0,0 +1,16 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([PANDORA_CHECK_CXX_STANDARD],[
+  AC_REQUIRE([AC_CXX_COMPILE_STDCXX_0X])
+  AS_IF([test "$GCC" = "yes"],
+        [AS_IF([test "$ac_cv_cxx_compile_cxx0x_native" = "yes"],[],
+               [AS_IF([test "$ac_cv_cxx_compile_cxx0x_gxx" = "yes"],
+                      [CXXFLAGS="-std=gnu++0x ${CXXFLAGS}"],
+                      [CXXFLAGS="-std=gnu++98"])
+               ])
+        ])
+  AC_CXX_HEADER_STDCXX_98
+])
diff --git a/m4/pandora_enable_dtrace.m4 b/m4/pandora_enable_dtrace.m4
new file mode 100644 (file)
index 0000000..e1f82da
--- /dev/null
@@ -0,0 +1,41 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl ---------------------------------------------------------------------------
+dnl Macro: PANDORA_ENABLE_DTRACE
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([PANDORA_ENABLE_DTRACE],[
+  AC_ARG_ENABLE([dtrace],
+    [AS_HELP_STRING([--enable-dtrace],
+            [Build with support for the DTRACE. @<:@default=off@:>@])],
+    [ac_cv_enable_dtrace="yes"],
+    [ac_cv_enable_dtrace="no"])
+
+  AS_IF([test "$ac_cv_enable_dtrace" = "yes"],[
+    AC_CHECK_PROGS([DTRACE], [dtrace])
+    AS_IF([test "x$ac_cv_prog_DTRACE" = "xdtrace"],[
+      AC_DEFINE([HAVE_DTRACE], [1], [Enables DTRACE Support])
+      dnl DTrace on MacOSX does not use -G option
+      cat >conftest.d <<_ACEOF
+provider Example {
+  probe increment(int);
+};
+_ACEOF
+      $DTRACE -G -o conftest.d.o -s conftest.d 2>/dev/zero
+      AS_IF([test $? -eq 0],[ac_cv_dtrace_needs_objects=yes])
+      rm -f conftest.d.o conftest.d
+
+      AC_SUBST(DTRACEFLAGS) dnl TODO: test for -G on OSX
+      ac_cv_have_dtrace=yes
+    ])])
+
+AM_CONDITIONAL([HAVE_DTRACE], [test "x$ac_cv_have_dtrace" = "xyes"])
+AM_CONDITIONAL([DTRACE_NEEDS_OBJECTS],
+               [test "x$ac_cv_dtrace_needs_objects" = "xyes"])
+
+])
+dnl ---------------------------------------------------------------------------
+dnl End Macro: PANDORA_ENABLE_DTRACE
+dnl ---------------------------------------------------------------------------
diff --git a/m4/pandora_ensure_gcc_version.m4 b/m4/pandora_ensure_gcc_version.m4
new file mode 100644 (file)
index 0000000..608a552
--- /dev/null
@@ -0,0 +1,36 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl If the user is on a Mac and didn't ask for a specific compiler
+dnl You're gonna get 4.2.
+AC_DEFUN([PANDORA_MAC_GCC42],
+  [AS_IF([test "$GCC" = "yes"],[
+    AS_IF([test "$host_vendor" = "apple" -a "x${ac_cv_env_CC_set}" = "x"],[
+      AS_IF([test -f /usr/bin/gcc-4.2],
+        [
+          CPP="/usr/bin/gcc-4.2 -E"
+          CC=/usr/bin/gcc-4.2
+          CXX=/usr/bin/g++-4.2
+        ])
+    ])
+  ])
+])
+
+dnl 
+AC_DEFUN([PANDORA_ENSURE_GCC_VERSION],[
+  AC_REQUIRE([PANDORA_MAC_GCC42])
+  AC_CACHE_CHECK([if GCC is recent enough], [ac_cv_gcc_recent],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if !defined(__GNUC__) || (__GNUC__ < 4) || ((__GNUC__ >= 4) && (__GNUC_MINOR__ < 1))
+# error GCC is Too Old!
+#endif
+      ]])],
+      [ac_cv_gcc_recent=yes],
+      [ac_cv_gcc_recent=no])])
+  AS_IF([test "$ac_cv_gcc_recent" = "no" -a "$host_vendor" = "apple"],
+    AC_MSG_ERROR([Your version of GCC is too old. At least version 4.2 is required on OSX. You may need to install a version of XCode >= 3.1.2]))
+  AS_IF([test "$ac_cv_gcc_recent" = "no"],
+    AC_MSG_ERROR([Your version of GCC is too old. At least version 4.1 is required]))
+])
diff --git a/m4/pandora_header_assert.m4 b/m4/pandora_header_assert.m4
new file mode 100644 (file)
index 0000000..eb5d15b
--- /dev/null
@@ -0,0 +1,23 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl PANDORA_HEADER_ASSERT
+dnl ----------------
+dnl Check whether to enable assertions.
+AC_DEFUN([PANDORA_HEADER_ASSERT],
+[
+  AC_MSG_CHECKING([whether to enable assertions])
+  AC_ARG_ENABLE([assert],
+    [AS_HELP_STRING([--disable-assert],
+       [Turn off assertions])],
+    [ac_cv_assert="no"],
+    [ac_cv_assert="yes"])
+  AC_MSG_RESULT([$ac_cv_assert])
+
+  AS_IF([test "$ac_cv_assert" = "yes"], 
+    [AC_CHECK_HEADERS(assert.h)],
+    [AC_DEFINE(NDEBUG, 1, [Define to 1 if assertions should be disabled.])])
+])
+
diff --git a/m4/pandora_libtool.m4 b/m4/pandora_libtool.m4
new file mode 100644 (file)
index 0000000..b9e461c
--- /dev/null
@@ -0,0 +1,15 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([PANDORA_LIBTOOL],[
+  AC_REQUIRE([AC_PROG_LIBTOOL])
+  dnl By requiring AC_PROG_LIBTOOL, we should force the macro system to read
+  dnl libtool.m4, where in 2.2 AC_PROG_LIBTOOL is an alias for LT_INIT
+  dnl Then, if we're on 2.2, we should have LT_LANG, so we'll call it.
+  m4_ifdef([LT_LANG],[
+    LT_LANG(C)
+    LT_LANG(C++)
+  ])
+])
diff --git a/m4/pandora_optimize.m4 b/m4/pandora_optimize.m4
new file mode 100644 (file)
index 0000000..f38d9bb
--- /dev/null
@@ -0,0 +1,65 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([PANDORA_OPTIMIZE],[
+  dnl Build optimized or debug version ?
+  dnl First check for gcc and g++
+  AS_IF([test "$GCC" = "yes"],[
+
+    dnl The following is required for portable results of floating point 
+    dnl calculations on PowerPC. The same must also be done for IA-64, but 
+    dnl this options is missing in the IA-64 gcc backend.
+    case "$target_cpu" in
+      *ppc* | *powerpc*)
+        AM_CFLAGS="-mno-fused-madd ${AM_CFLAGS}"
+        AM_CXXFLAGS="-mno-fused-madd ${AM_CXXFLAGS}"
+      ;;
+    esac
+
+    dnl Once we can use a modern autoconf, we can replace the std=gnu99 here
+    dnl with using AC_CC_STD_C99 above
+    CC="${CC} -std=gnu99"
+
+    AM_CPPFLAGS="-ggdb3 ${AM_CPPFLAGS}"
+
+    DEBUG_CFLAGS="-O0"
+    DEBUG_CXXFLAGS="-O0"
+
+    OPTIMIZE_CFLAGS="-O3"
+    OPTIMIZE_CXXFLAGS="-O3"
+  ])
+  AS_IF([test "$SUNCC" = "yes"],[
+    dnl Once we can use a modern autoconf, we can replace the -xc99=all here
+    dnl with using AC_CC_STD_C99 above
+    CC="${CC} -xc99=all"
+    CXX="${CXX} -xlang=c99"
+
+    AM_CFLAGS="-g -mt -xstrconst -Xa ${AM_CFLAGS}"
+    AM_CXXFLAGS="-mt -compat=5 -library=stlport4 -template=no%extdef ${AM_CXXFLAGS}"
+
+    DEBUG_CXXFLAGS="-g"
+
+    dnl TODO: Make a test for -xO4 usability here
+    OPTIMIZE_FLAGS="-xO3 -xlibmil -xdepend -xbuiltin"
+    OPTIMIZE_CFLAGS="${OPTIMIZE_FLAGS}"
+    OPTIMIZE_CXXFLAGS="-g0 ${OPTIMIZE_FLAGS}"
+
+  ])
+
+  AC_ARG_WITH([debug],
+    [AS_HELP_STRING([--with-debug],
+       [Add debug code/turns off optimizations (yes|no) @<:@default=no@:>@])],
+    [with_debug=$withval],
+    [with_debug=no])
+  AS_IF([test "$with_debug" = "yes"],[
+    # Debugging. No optimization.
+    AM_CFLAGS="${AM_CFLAGS} ${DEBUG_CFLAGS} -DDEBUG"
+    AM_CXXFLAGS="${AM_CXXFLAGS} ${DEBUG_CXXFLAGS} -DDEBUG"
+  ],[
+    # Optimized version. No debug
+    AM_CFLAGS="${AM_CFLAGS} ${OPTIMIZE_CFLAGS}"
+    AM_CXXFLAGS="${AM_CXXFLAGS} ${OPTIMIZE_CXXFLAGS}"
+  ])
+])
diff --git a/m4/pandora_shared_ptr.m4 b/m4/pandora_shared_ptr.m4
new file mode 100644 (file)
index 0000000..70185ad
--- /dev/null
@@ -0,0 +1,56 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl We check two things: where is the memory include file, and in what
+dnl namespace does shared_ptr reside.
+dnl We include AC_COMPILE_IFELSE for all the combinations we've seen in the
+dnl wild:
+dnl 
+dnl  GCC 4.3: namespace: std::  #include <memory>
+dnl  GCC 4.2: namespace: tr1::  #include <tr1/memory>
+dnl  GCC 4.2: namespace: boost::  #include <boost/shared_ptr.hpp>
+dnl
+dnl We define one of HAVE_HAVE_TR1_SHARED_PTR or HAVE_BOOST_SHARED_PTR
+dnl depending on location, and SHARED_PTR_NAMESPACE to be the namespace in
+dnl which shared_ptr is defined.
+dnl 
+
+AC_DEFUN([PANDORA_SHARED_PTR],[
+  AC_REQUIRE([PANDORA_CHECK_CXX_STANDARD])
+  AC_LANG_PUSH(C++)
+  AC_CHECK_HEADERS(memory tr1/memory boost/shared_ptr.hpp)
+  AC_CACHE_CHECK([the location of shared_ptr header file],
+    [ac_cv_shared_ptr_h],[
+      for namespace in std tr1 std::tr1 boost
+      do
+        AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM([[
+#if defined(HAVE_MEMORY)
+# include <memory>
+#endif
+#if defined(HAVE_TR1_MEMORY)
+# include <tr1/memory>
+#endif
+#if defined(HAVE_BOOST_SHARED_PTR_HPP)
+# include <boost/shared_ptr.hpp>
+#endif
+#include <string>
+
+using $namespace::shared_ptr;
+using namespace std;
+            ]],[[
+shared_ptr<string> test_ptr(new string("test string"));
+            ]])],
+            [
+              ac_cv_shared_ptr_namespace="${namespace}"
+              break
+            ],[ac_cv_shared_ptr_namespace=missing])
+       done
+  ])
+  AC_DEFINE_UNQUOTED([SHARED_PTR_NAMESPACE],
+                     ${ac_cv_shared_ptr_namespace},
+                     [The namespace in which SHARED_PTR can be found])
+  AC_LANG_POP()
+])
diff --git a/m4/pandora_vc_build.m4 b/m4/pandora_vc_build.m4
new file mode 100644 (file)
index 0000000..ada6ccf
--- /dev/null
@@ -0,0 +1,32 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([PANDORA_BUILDING_FROM_VC],[
+
+  ac_cv_building_from_vc=no
+
+  AS_IF([test -d "${srcdir}/.bzr"],[
+    ac_cv_building_from_bzr=yes
+    ac_cv_building_from_vc=yes
+    ],[
+    ac_cv_building_from_bzr=no
+  ])
+
+  AS_IF([test -d "${srcdir}/.svn"],[
+    ac_cv_building_from_svn=yes
+    ac_cv_building_from_vc=yes
+    ],[
+    ac_cv_building_from_svn=no
+  ])
+
+  AS_IF([test -d "${srcdir}/.hg"],[
+    ac_cv_building_from_hg=yes
+    ac_cv_building_from_vc=yes
+    ],[
+    ac_cv_building_from_hg=no
+  ])
+
+])
+  
diff --git a/m4/pandora_warnings.m4 b/m4/pandora_warnings.m4
new file mode 100644 (file)
index 0000000..81795a5
--- /dev/null
@@ -0,0 +1,251 @@
+dnl  Copyright (C) 2009 Sun Microsystems
+dnl This file is free software; Sun Microsystems
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl AC_PANDORA_WARNINGS([less-warnings|warnings-always-on])
+dnl   less-warnings turn on a limited set of warnings
+dnl   warnings-always-on always set warnings=error regardless of tarball/vc
+
+dnl @TODO: remove less-warnings option as soon as Drizzle is clean enough to
+dnl        allow it
+AC_DEFUN([PANDORA_WARNINGS],[
+  m4_define([PW_LESS_WARNINGS],[no])
+  m4_define([PW_WARN_ALWAYS_ON],[no])
+  ifdef([m4_define],,[define([m4_define],   defn([define]))])
+  ifdef([m4_undefine],,[define([m4_undefine],   defn([undefine]))])
+  m4_foreach([pw_arg],[$*],[
+    m4_case(pw_arg,
+      [less-warnings],[
+        m4_undefine([PW_LESS_WARNINGS])
+        m4_define([PW_LESS_WARNINGS],[yes])
+      ],
+      [warnings-always-on],[
+        m4_undefine([PW_WARN_ALWAYS_ON])
+        m4_define([PW_WARN_ALWAYS_ON],[yes])
+    ]) 
+  ])
+
+  AC_REQUIRE([PANDORA_BUILDING_FROM_VC])
+  m4_if(PW_WARN_ALWAYS_ON, [yes],
+    [ac_cv_warnings_as_errors=yes],
+    AS_IF([test "$ac_cv_building_from_vc" = "yes"],
+          [ac_cv_warnings_as_errors=yes],
+          [ac_cv_warnings_as_errors=no]))
+
+  AC_ARG_ENABLE([profiling],
+      [AS_HELP_STRING([--enable-profiling],
+         [Toggle profiling @<:@default=off@:>@])],
+      [ac_profiling="$enableval"],
+      [ac_profiling="no"])
+
+  AC_ARG_ENABLE([coverage],
+      [AS_HELP_STRING([--enable-coverage],
+         [Toggle coverage @<:@default=off@:>@])],
+      [ac_coverage="$enableval"],
+      [ac_coverage="no"])
+
+  AS_IF([test "$GCC" = "yes"],[
+
+    AS_IF([test "$ac_profiling" = "yes"],[
+      CC_PROFILING="-pg"
+      save_LIBS="${LIBS}"
+      LIBS=""
+      AC_CHECK_LIB(c_p, read)
+      LIBC_P="${LIBS}"
+      LIBS="${save_LIBS}"
+      AC_SUBST(LIBC_P)
+    ],[
+      CC_PROFILING=" "
+    ])
+
+    AS_IF([test "$ac_coverage" = "yes"],
+          [CC_COVERAGE="-fprofile-arcs -ftest-coverage"])
+        
+    AS_IF([test "$ac_cv_warnings_as_errors" = "yes"],
+          [W_FAIL="-Werror"])
+
+    AC_CACHE_CHECK([whether it is safe to use -fdiagnostics-show-option],
+      [ac_cv_safe_to_use_fdiagnostics_show_option_],
+      [save_CFLAGS="$CFLAGS"
+       CFLAGS="-fdiagnostics-show-option ${AM_CFLAGS} ${CFLAGS}"
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([],[])],
+         [ac_cv_safe_to_use_fdiagnostics_show_option_=yes],
+         [ac_cv_safe_to_use_fdiagnostics_show_option_=no])
+       CFLAGS="$save_CFLAGS"])
+
+    AS_IF([test "$ac_cv_safe_to_use_fdiagnostics_show_option_" = "yes"],
+          [
+            F_DIAGNOSTICS_SHOW_OPTION="-fdiagnostics-show-option"
+          ])
+
+    AC_CACHE_CHECK([whether it is safe to use -Wconversion],
+      [ac_cv_safe_to_use_wconversion_],
+      [save_CFLAGS="$CFLAGS"
+       dnl Use -Werror here instead of ${W_FAIL} so that we don't spew
+       dnl conversion warnings to all the tarball folks
+       CFLAGS="-Wconversion -Werror -pedantic ${AM_CFLAGS} ${CFLAGS}"
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([[
+#include <stdbool.h>
+void foo(bool a)
+{
+  (void)a;
+}
+         ]],[[
+foo(0);
+         ]])],
+         [ac_cv_safe_to_use_wconversion_=yes],
+         [ac_cv_safe_to_use_wconversion_=no])
+       CFLAGS="$save_CFLAGS"])
+
+    AS_IF([test "$ac_cv_safe_to_use_wconversion_" = "yes"],
+      [W_CONVERSION="-Wconversion"
+      AC_CACHE_CHECK([whether it is safe to use -Wconversion with htons],
+        [ac_cv_safe_to_use_Wconversion_],
+        [save_CFLAGS="$CFLAGS"
+         dnl Use -Werror here instead of ${W_FAIL} so that we don't spew
+         dnl conversion warnings to all the tarball folks
+         CFLAGS="-Wconversion -Werror -pedantic ${AM_CFLAGS} ${CFLAGS}"
+         AC_COMPILE_IFELSE(
+           [AC_LANG_PROGRAM(
+             [[
+#include <netinet/in.h>
+             ]],[[
+uint16_t x= htons(80);
+             ]])],
+           [ac_cv_safe_to_use_Wconversion_=yes],
+           [ac_cv_safe_to_use_Wconversion_=no])
+         CFLAGS="$save_CFLAGS"])
+
+      AS_IF([test "$ac_cv_safe_to_use_Wconversion_" = "no"],
+            [NO_CONVERSION="-Wno-conversion"])
+    ])
+
+    NO_STRICT_ALIASING="-fno-strict-aliasing -Wno-strict-aliasing"
+    NO_SHADOW="-Wno-shadow"
+
+    m4_if(PW_LESS_WARNINGS,[no],[
+      BASE_WARNINGS_FULL="-Wformat=2 ${W_CONVERSION} -Wstrict-aliasing"
+      CC_WARNINGS_FULL="-Wswitch-default -Wswitch-enum -Wwrite-strings"
+      CXX_WARNINGS_FULL="-Weffc++ -Wold-style-cast"
+    ],[
+      BASE_WARNINGS_FULL="-Wformat ${NO_STRICT_ALIASING}"
+    ])
+
+    AS_IF([test "${ac_cv_assert}" = "no"],
+          [NO_UNUSED="-Wno-unused-variable -Wno-unused-parameter"])
+
+    BASE_WARNINGS="${W_FAIL} -pedantic -Wall -Wextra -Wundef -Wshadow ${NO_UNUSED} ${F_DIAGNOSTICS_SHOW_OPTION} ${CFLAG_VISIBILITY} ${BASE_WARNINGS_FULL}"
+    CC_WARNINGS="${BASE_WARNINGS} -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wmissing-declarations -Wcast-align ${CC_WARNINGS_FULL}"
+    CXX_WARNINGS="${BASE_WARNINGS} -Woverloaded-virtual -Wnon-virtual-dtor -Wctor-dtor-privacy -Wno-long-long ${CXX_WARNINGS_FULL}"
+
+    AC_CACHE_CHECK([whether it is safe to use -Wmissing-declarations from C++],
+      [ac_cv_safe_to_use_Wmissing_declarations_],
+      [AC_LANG_PUSH(C++)
+       save_CXXFLAGS="$CXXFLAGS"
+       CXXFLAGS="-Werror -pedantic -Wmissing-declarations ${AM_CXXFLAGS}"
+       AC_COMPILE_IFELSE([
+         AC_LANG_PROGRAM(
+         [[
+#include <stdio.h>
+         ]], [[]])
+      ],
+      [ac_cv_safe_to_use_Wmissing_declarations_=yes],
+      [ac_cv_safe_to_use_Wmissing_declarations_=no])
+      CXXFLAGS="$save_CXXFLAGS"
+      AC_LANG_POP()
+    ])
+    AS_IF([test "$ac_cv_safe_to_use_Wmissing_declarations_" = "yes"],
+          [CXX_WARNINGS="${CXX_WARNINGS} -Wmissing-declarations"])
+
+    AC_CACHE_CHECK([whether it is safe to use -Wlogical-op],
+      [ac_cv_safe_to_use_Wlogical_op_],
+      [save_CFLAGS="$CFLAGS"
+       CFLAGS="${W_FAIL} -pedantic -Wlogical-op ${AM_CFLAGS} ${CFLAGS}"
+       AC_COMPILE_IFELSE([
+         AC_LANG_PROGRAM(
+         [[
+#include <stdio.h>
+         ]], [[]])
+      ],
+      [ac_cv_safe_to_use_Wlogical_op_=yes],
+      [ac_cv_safe_to_use_Wlogical_op_=no])
+    CFLAGS="$save_CFLAGS"])
+    AS_IF([test "$ac_cv_safe_to_use_Wlogical_op_" = "yes"],
+          [CC_WARNINGS="${CC_WARNINGS} -Wlogical-op"])
+
+    AC_CACHE_CHECK([whether it is safe to use -Wredundant-decls from C++],
+      [ac_cv_safe_to_use_Wredundant_decls_],
+      [AC_LANG_PUSH(C++)
+       save_CXXFLAGS="${CXXFLAGS}"
+       CXXFLAGS="${W_FAIL} -pedantic -Wredundant-decls ${AM_CXXFLAGS}"
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([
+template <typename E> struct C { void foo(); };
+template <typename E> void C<E>::foo() { }
+template <> void C<int>::foo();
+          AC_INCLUDES_DEFAULT])],
+          [ac_cv_safe_to_use_Wredundant_decls_=yes],
+          [ac_cv_safe_to_use_Wredundant_decls_=no])
+        CXXFLAGS="${save_CXXFLAGS}"
+        AC_LANG_POP()])
+    AS_IF([test "$ac_cv_safe_to_use_Wredundant_decls_" = "yes"],
+          [CXX_WARNINGS="${CXX_WARNINGS} -Wredundant-decls"],
+          [CXX_WARNINGS="${CXX_WARNINGS} -Wno-redundant-decls"])
+
+    NO_REDUNDANT_DECLS="-Wno-redundant-decls"
+    PROTOSKIP_WARNINGS="-Wno-effc++ -Wno-shadow"
+    
+  ])
+
+  AS_IF([test "$SUNCC" = "yes"],[
+
+    AS_IF([test "$ac_profiling" = "yes"],
+          [CC_PROFILING="-xinstrument=datarace"])
+
+    AS_IF([test "$ac_cv_warnings_as_errors" = "yes"],
+          [W_FAIL="-errwarn=%all"])
+
+    AC_CACHE_CHECK([whether E_PASTE_RESULT_NOT_TOKEN is usable],
+      [ac_cv_paste_result],
+      [
+        save_CFLAGS="${CFLAGS}"
+        CFLAGS="-errwarn=%all -erroff=E_PASTE_RESULT_NOT_TOKEN ${CFLAGS}"
+        AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM([
+            AC_INCLUDES_DEFAULT
+          ],[
+            int x= 0;])],
+          [ac_cv_paste_result=yes],
+          [ac_cv_paste_result=no])
+        CFLAGS="${save_CFLAGS}"
+      ])
+    AS_IF([test $ac_cv_paste_result = yes],
+      [W_PASTE_RESULT=",E_PASTE_RESULT_NOT_TOKEN"])
+
+
+    m4_if(PW_LESS_WARNINGS, [no],[
+      CC_WARNINGS_FULL="-erroff=E_INTEGER_OVERFLOW_DETECTED${W_PASTE_RESULT}"
+    ],[
+      CC_WARNINGS_FULL="-erroff=E_ATTRIBUTE_NOT_VAR"
+      CXX_WARNINGS_FULL="-erroff=attrskipunsup,doubunder,reftotemp,inllargeuse,truncwarn1,signextwarn,inllargeint"
+    ])
+
+    CC_WARNINGS="-v -errtags=yes ${W_FAIL} ${CC_WARNINGS_FULL}"
+    CXX_WARNINGS="+w +w2 -xwe -xport64 -errtags=yes ${CXX_WARNINGS_FULL} ${W_FAIL}"
+    PROTOSKIP_WARNINGS="-erroff=attrskipunsup,doubunder,reftotemp,wbadinitl,identexpected,inllargeuse,truncwarn1,signextwarn"
+    NO_UNREACHED="-erroff=E_STATEMENT_NOT_REACHED"
+
+  ])
+
+  AC_SUBST(NO_CONVERSION)
+  AC_SUBST(NO_REDUNDANT_DECLS)
+  AC_SUBST(NO_UNREACHED)
+  AC_SUBST(NO_SHADOW)
+  AC_SUBST(NO_STRICT_ALIASING)
+  AC_SUBST(PROTOSKIP_WARNINGS)
+
+])
diff --git a/m4/visibility.m4 b/m4/visibility.m4
new file mode 100644 (file)
index 0000000..70bca56
--- /dev/null
@@ -0,0 +1,52 @@
+# visibility.m4 serial 2 (gettext-0.18)
+dnl Copyright (C) 2005, 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl MacOS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+    AC_MSG_CHECKING([for simple visibility declarations])
+    AC_CACHE_VAL([gl_cv_cc_visibility], [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -fvisibility=hidden"
+      AC_TRY_COMPILE(
+        [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+         extern __attribute__((__visibility__("default"))) int exportedvar;
+         extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+         extern __attribute__((__visibility__("default"))) int exportedfunc (void);],
+        [],
+        [gl_cv_cc_visibility=yes],
+        [gl_cv_cc_visibility=no])
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_visibility])
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+  AC_SUBST([CFLAG_VISIBILITY])
+  AC_SUBST([HAVE_VISIBILITY])
+  AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+    [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
index 70437c2ed3e26763110ef36381cead2ef45e3fd2..5f3afcb26452b4050d91bee6d8c9b2e4c402fa5d 100644 (file)
@@ -20,22 +20,26 @@ LIBS =
 
 noinst_HEADERS = test.h server.h ketama_test_cases.h
 noinst_PROGRAMS = testapp testplus udptest atomsmasher startservers
+noinst_LTLIBRARIES= libserver.la libtest.la
 
-testapp_CFLAGS= ${AM_CFLAGS} ${NO_CONVERSION}
-testapp_SOURCES = test.c function.c server.c ../clients/generator.c ../clients/execute.c
-testapp_LDADD = $(LDADDS)
+libserver_la_SOURCES= server.c
+libtest_la_SOURCES= test.c
 
-testplus_SOURCES = test.c plus.cpp server.c
-testplus_LDADD = $(LDADDS)
+testapp_CFLAGS= $(AM_CFLAGS) $(NO_CONVERSION) $(NO_STRICT_ALIASING)
+testapp_SOURCES = function.c
+testapp_LDADD = $(LDADDS) $(top_builddir)/clients/libgenexec.la libtest.la libserver.la
 
-udptest_SOURCES = test.c udp.c server.c
-udptest_LDADD = $(LDADDS)
+testplus_SOURCES = plus.cpp
+testplus_LDADD = $(LDADDS) libtest.la libserver.la
 
-atomsmasher_SOURCES = test.c atomsmasher.c server.c ../clients/generator.c ../clients/execute.c
-atomsmasher_LDADD = $(LDADDS)
+udptest_SOURCES = udp.c
+udptest_LDADD = $(LDADDS) libtest.la libserver.la
 
-startservers_SOURCES = start.c server.c
-startservers_LDADD = $(LDADDS)
+atomsmasher_SOURCES = atomsmasher.c
+atomsmasher_LDADD = $(LDADDS) $(top_builddir)/clients/libgenexec.la libtest.la libserver.la 
+
+startservers_SOURCES = start.c
+startservers_LDADD = $(LDADDS) libserver.la
 
 record:
        ./testapp > output.res
@@ -91,7 +95,7 @@ helgrind:
        libtool --mode=execute valgrind --tool=helgrind  testapp
 
 helgrind-slap:
-       libtool --mode=execute valgrind --tool=helgrind  ../clients/memslap --server=localhost --concurrency=30
+       libtool --mode=execute valgrind --tool=helgrind  ${top_builddir}/clients/memslap --server=localhost --concurrency=30
 
 test-no-outputdiff: testapp
        ./testapp > /dev/null
index 65a31dd4404f09344fcb999ada6e8b0f11c9eea1..3b4879df4bef1c1c260935867fbfbae4ad42f94f 100644 (file)
@@ -156,8 +156,8 @@ static memcached_return enable_consistent(memcached_st *memc)
 static test_return add_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "when we sanitize";
+  const char *key= "foo";
+  const char *value= "when we sanitize";
   unsigned long long setting_value;
 
   setting_value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
@@ -173,7 +173,7 @@ static test_return add_test(memcached_st *memc)
 
   /* Too many broken OS'es have broken loopback in async, so we can't be sure of the result */
   if (setting_value)
-    assert(rc == MEMCACHED_NOTSTORED || MEMCACHED_STORED);
+    assert(rc == MEMCACHED_NOTSTORED || rc == MEMCACHED_STORED);
   else
     assert(rc == MEMCACHED_NOTSTORED);
 
index 8728ccd421dd124993cd35f10b3c98c38a4dd542..b9e7d303efdbfa121fe44e357dc9b0f1b837a1e2 100644 (file)
@@ -1,6 +1,7 @@
 /*
   Sample test application.
 */
+
 #include "libmemcached/common.h"
 
 #include <assert.h>
@@ -37,7 +38,7 @@
 static uint32_t global_count;
 
 static pairs_st *global_pairs;
-static char *global_keys[GLOBAL_COUNT];
+static const char *global_keys[GLOBAL_COUNT];
 static size_t global_keys_length[GLOBAL_COUNT];
 
 static test_return  init_test(memcached_st *not_used __attribute__((unused)))
@@ -298,8 +299,8 @@ static test_return  error_test(memcached_st *memc)
 static test_return  set_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "when we sanitize";
+  const char *key= "foo";
+  const char *value= "when we sanitize";
 
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
@@ -312,8 +313,9 @@ static test_return  set_test(memcached_st *memc)
 static test_return  append_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "fig";
-  char *value= "we";
+  const char *key= "fig";
+  const char *in_value= "we";
+  char *out_value= NULL;
   size_t value_length;
   uint32_t flags;
 
@@ -321,7 +323,7 @@ static test_return  append_test(memcached_st *memc)
   assert(rc == MEMCACHED_SUCCESS);
 
   rc= memcached_set(memc, key, strlen(key), 
-                    value, strlen(value),
+                    in_value, strlen(in_value),
                     (time_t)0, (uint32_t)0);
   assert(rc == MEMCACHED_SUCCESS);
 
@@ -335,12 +337,12 @@ static test_return  append_test(memcached_st *memc)
                        (time_t)0, (uint32_t)0);
   assert(rc == MEMCACHED_SUCCESS);
 
-  value= memcached_get(memc, key, strlen(key),
+  out_value= memcached_get(memc, key, strlen(key),
                        &value_length, &flags, &rc);
-  assert(!memcmp(value, "we the people", strlen("we the people")));
+  assert(!memcmp(out_value, "we the people", strlen("we the people")));
   assert(strlen("we the people") == value_length);
   assert(rc == MEMCACHED_SUCCESS);
-  free(value);
+  free(out_value);
 
   return 0;
 }
@@ -348,7 +350,7 @@ static test_return  append_test(memcached_st *memc)
 static test_return  append_binary_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "numbers";
+  const char *key= "numbers";
   unsigned int *store_ptr;
   unsigned int store_list[] = { 23, 56, 499, 98, 32847, 0 };
   char *value;
@@ -394,9 +396,9 @@ static test_return  append_binary_test(memcached_st *memc)
 static test_return  cas2_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"fudge", "son", "food"};
+  const char *keys[]= {"fudge", "son", "food"};
   size_t key_length[]= {5, 3, 4};
-  char *value= "we the people";
+  const char *value= "we the people";
   size_t value_length= strlen("we the people");
   unsigned int x;
   memcached_result_st results_obj;
@@ -424,7 +426,7 @@ static test_return  cas2_test(memcached_st *memc)
   assert(results);
   assert(results->cas);
   assert(rc == MEMCACHED_SUCCESS);
-  WATCHPOINT_ASSERT(memcached_result_cas(results));
+  assert(memcached_result_cas(results));
 
   assert(!memcmp(value, "we the people", strlen("we the people")));
   assert(strlen("we the people") == value_length);
@@ -441,7 +443,7 @@ static test_return  cas_test(memcached_st *memc)
   const char *key= "fun";
   size_t key_length= strlen(key);
   const char *value= "we the people";
-  char* keys[2] = { (char*)key, NULL };
+  const char* keys[2] = { key, NULL };
   size_t keylengths[2] = { strlen(key), 0 };
   size_t value_length= strlen(value);
   const char *value2= "change the value";
@@ -468,7 +470,7 @@ static test_return  cas_test(memcached_st *memc)
   results= memcached_fetch_result(memc, &results_obj, &rc);
   assert(results);
   assert(rc == MEMCACHED_SUCCESS);
-  WATCHPOINT_ASSERT(memcached_result_cas(results));
+  assert(memcached_result_cas(results));
   assert(!memcmp(value, memcached_result_value(results), value_length));
   assert(strlen(memcached_result_value(results)) == value_length);
   assert(rc == MEMCACHED_SUCCESS);
@@ -498,8 +500,9 @@ static test_return  cas_test(memcached_st *memc)
 static test_return  prepend_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "fig";
-  char *value= "people";
+  const char *key= "fig";
+  const char *value= "people";
+  char *out_value= NULL;
   size_t value_length;
   uint32_t flags;
 
@@ -521,12 +524,12 @@ static test_return  prepend_test(memcached_st *memc)
                        (time_t)0, (uint32_t)0);
   assert(rc == MEMCACHED_SUCCESS);
 
-  value= memcached_get(memc, key, strlen(key),
+  out_value= memcached_get(memc, key, strlen(key),
                        &value_length, &flags, &rc);
-  assert(!memcmp(value, "we the people", strlen("we the people")));
+  assert(!memcmp(out_value, "we the people", strlen("we the people")));
   assert(strlen("we the people") == value_length);
   assert(rc == MEMCACHED_SUCCESS);
-  free(value);
+  free(out_value);
 
   return 0;
 }
@@ -538,8 +541,8 @@ static test_return  prepend_test(memcached_st *memc)
 static test_return  add_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "when we sanitize";
+  const char *key= "foo";
+  const char *value= "when we sanitize";
   unsigned long long setting_value;
 
   setting_value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
@@ -586,9 +589,9 @@ static test_return  add_wrapper(memcached_st *memc)
 static test_return  replace_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "when we sanitize";
-  char *original= "first we insert some data";
+  const char *key= "foo";
+  const char *value= "when we sanitize";
+  const char *original= "first we insert some data";
 
   rc= memcached_set(memc, key, strlen(key), 
                     original, strlen(original),
@@ -606,8 +609,8 @@ static test_return  replace_test(memcached_st *memc)
 static test_return  delete_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "when we sanitize";
+  const char *key= "foo";
+  const char *value= "when we sanitize";
 
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
@@ -641,19 +644,19 @@ static memcached_return  server_function(memcached_st *ptr __attribute__((unused
 
 static test_return  memcached_server_cursor_test(memcached_st *memc)
 {
-  char *context= "foo bad";
+  char context[8];
+  strcpy(context, "foo bad");
   memcached_server_function callbacks[1];
 
   callbacks[0]= server_function;
   memcached_server_cursor(memc, callbacks, context,  1);
-
   return 0;
 }
 
 static test_return  bad_key_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo bad";
+  const char *key= "foo bad";
   char *string;
   size_t string_length;
   uint32_t flags;
@@ -686,7 +689,7 @@ static test_return  bad_key_test(memcached_st *memc)
     assert(!string);
 
     /* Test multi key for bad keys */
-    char *keys[] = { "GoodKey", "Bad Key", "NotMine" };
+    const char *keys[] = { "GoodKey", "Bad Key", "NotMine" };
     size_t key_lengths[] = { 7, 7, 7 };
     set= 1;
     rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
@@ -755,7 +758,7 @@ static memcached_return  read_through_trigger(memcached_st *memc __attribute__((
 static test_return  read_through(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
+  const char *key= "foo";
   char *string;
   size_t string_length;
   uint32_t flags;
@@ -816,7 +819,7 @@ static test_return  delete_through(memcached_st *memc)
 static test_return  get_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
+  const char *key= "foo";
   char *string;
   size_t string_length;
   uint32_t flags;
@@ -837,8 +840,8 @@ static test_return  get_test(memcached_st *memc)
 static test_return  get_test2(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "when we sanitize";
+  const char *key= "foo";
+  const char *value= "when we sanitize";
   char *string;
   size_t string_length;
   uint32_t flags;
@@ -864,8 +867,8 @@ static test_return  get_test2(memcached_st *memc)
 static test_return  set_test2(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "train in the brain";
+  const char *key= "foo";
+  const char *value= "train in the brain";
   size_t value_length= strlen(value);
   unsigned int x;
 
@@ -914,7 +917,7 @@ static test_return  set_test3(memcached_st *memc)
 static test_return  get_test3(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
+  const char *key= "foo";
   char *value;
   size_t value_length= 8191;
   char *string;
@@ -950,7 +953,7 @@ static test_return  get_test3(memcached_st *memc)
 static test_return  get_test4(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
+  const char *key= "foo";
   char *value;
   size_t value_length= 8191;
   char *string;
@@ -997,7 +1000,7 @@ static test_return get_test5(memcached_st *memc)
   ** Request the same key twice, to ensure that we hash to the same server
   ** (so that we have multiple response values queued up) ;-)
   */
-  char *keys[]= { "key", "key" };
+  const char *keys[]= { "key", "key" };
   size_t lengths[]= { 3, 3 };
   uint32_t flags;
   size_t rlen;
@@ -1047,8 +1050,8 @@ static test_return  increment_test(memcached_st *memc)
 {
   uint64_t new_number;
   memcached_return rc;
-  char *key= "number";
-  char *value= "0";
+  const char *key= "number";
+  const char *value= "0";
 
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
@@ -1074,7 +1077,7 @@ static test_return  increment_with_initial_test(memcached_st *memc)
   {
     uint64_t new_number;
     memcached_return rc;
-    char *key= "number";
+    const char *key= "number";
     uint64_t initial= 0;
 
     rc= memcached_increment_with_initial(memc, key, strlen(key),
@@ -1094,8 +1097,8 @@ static test_return  decrement_test(memcached_st *memc)
 {
   uint64_t new_number;
   memcached_return rc;
-  char *key= "number";
-  char *value= "3";
+  const char *key= "number";
+  const char *value= "3";
 
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
@@ -1121,7 +1124,7 @@ static test_return  decrement_with_initial_test(memcached_st *memc)
   {
     uint64_t new_number;
     memcached_return rc;
-    char *key= "number";
+    const char *key= "number";
     uint64_t initial= 3;
 
     rc= memcached_decrement_with_initial(memc, key, strlen(key),
@@ -1140,8 +1143,8 @@ static test_return  decrement_with_initial_test(memcached_st *memc)
 static test_return  quit_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "fudge";
-  char *value= "sanford and sun";
+  const char *key= "fudge";
+  const char *value= "sanford and sun";
 
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
@@ -1160,7 +1163,7 @@ static test_return  quit_test(memcached_st *memc)
 static test_return  mget_result_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"fudge", "son", "food"};
+  const char *keys[]= {"fudge", "son", "food"};
   size_t key_length[]= {5, 3, 4};
   unsigned int x;
 
@@ -1217,7 +1220,7 @@ static test_return  mget_result_test(memcached_st *memc)
 static test_return  mget_result_alloc_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"fudge", "son", "food"};
+  const char *keys[]= {"fudge", "son", "food"};
   size_t key_length[]= {5, 3, 4};
   unsigned int x;
 
@@ -1279,7 +1282,7 @@ static memcached_return callback_counter(memcached_st *ptr __attribute__((unused
 static test_return  mget_result_function(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"fudge", "son", "food"};
+  const char *keys[]= {"fudge", "son", "food"};
   size_t key_length[]= {5, 3, 4};
   unsigned int x;
   unsigned int counter;
@@ -1310,7 +1313,7 @@ static test_return  mget_result_function(memcached_st *memc)
 static test_return  mget_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"fudge", "son", "food"};
+  const char *keys[]= {"fudge", "son", "food"};
   size_t key_length[]= {5, 3, 4};
   unsigned int x;
   uint32_t flags;
@@ -1647,8 +1650,7 @@ static test_return  user_supplied_bug2(memcached_st *memc)
         errors++;
       else
       {
-        WATCHPOINT_ERROR(rc);
-        assert(0);
+        assert(rc);
       }
 
       continue;
@@ -1695,7 +1697,7 @@ static test_return  user_supplied_bug3(memcached_st *memc)
     key_lengths[x]= strlen(keys[x]);
   }
 
-  rc= memcached_mget(memc, keys, key_lengths, KEY_COUNT);
+  rc= memcached_mget(memc, (const char **)keys, key_lengths, KEY_COUNT);
   assert(rc == MEMCACHED_SUCCESS);
 
   /* Turn this into a help function */
@@ -1726,7 +1728,7 @@ static test_return  user_supplied_bug3(memcached_st *memc)
 static test_return  user_supplied_bug4(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"fudge", "son", "food"};
+  const char *keys[]= {"fudge", "son", "food"};
   size_t key_length[]= {5, 3, 4};
   unsigned int x;
   uint32_t flags;
@@ -1789,7 +1791,7 @@ static test_return  user_supplied_bug4(memcached_st *memc)
 static test_return  user_supplied_bug5(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
+  const char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
   size_t key_length[]=  {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
   char return_key[MEMCACHED_MAX_KEY];
   size_t return_key_length;
@@ -1847,7 +1849,7 @@ static test_return  user_supplied_bug5(memcached_st *memc)
 static test_return  user_supplied_bug6(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
+  const char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
   size_t key_length[]=  {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
   char return_key[MEMCACHED_MAX_KEY];
   size_t return_key_length;
@@ -1916,7 +1918,7 @@ static test_return  user_supplied_bug8(memcached_st *memc __attribute__((unused)
   memcached_st *memc_clone;
 
   memcached_server_st *servers;
-  char *server_list= "memcache1.memcache.bk.sapo.pt:11211, memcache1.memcache.bk.sapo.pt:11212, memcache1.memcache.bk.sapo.pt:11213, memcache1.memcache.bk.sapo.pt:11214, memcache2.memcache.bk.sapo.pt:11211, memcache2.memcache.bk.sapo.pt:11212, memcache2.memcache.bk.sapo.pt:11213, memcache2.memcache.bk.sapo.pt:11214";
+  const char *server_list= "memcache1.memcache.bk.sapo.pt:11211, memcache1.memcache.bk.sapo.pt:11212, memcache1.memcache.bk.sapo.pt:11213, memcache1.memcache.bk.sapo.pt:11214, memcache2.memcache.bk.sapo.pt:11211, memcache2.memcache.bk.sapo.pt:11212, memcache2.memcache.bk.sapo.pt:11213, memcache2.memcache.bk.sapo.pt:11214";
 
   servers= memcached_servers_parse(server_list);
   assert(servers);
@@ -1943,8 +1945,8 @@ static test_return  user_supplied_bug8(memcached_st *memc __attribute__((unused)
 static test_return  user_supplied_bug7(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys= "036790384900";
-  size_t key_length=  strlen("036790384900");
+  const char *keys= "036790384900";
+  size_t key_length=  strlen(keys);
   char return_key[MEMCACHED_MAX_KEY];
   size_t return_key_length;
   char *value;
@@ -1987,7 +1989,7 @@ static test_return  user_supplied_bug7(memcached_st *memc)
 static test_return  user_supplied_bug9(memcached_st *memc)
 {
   memcached_return rc;
-  char *keys[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
+  const char *keys[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
   size_t key_length[3];
   unsigned int x;
   uint32_t flags;
@@ -2031,7 +2033,7 @@ static test_return  user_supplied_bug9(memcached_st *memc)
 /* We are testing with aggressive timeout to get failures */
 static test_return  user_supplied_bug10(memcached_st *memc)
 {
-  char *key= "foo";
+  const char *key= "foo";
   char *value;
   size_t value_length= 512;
   unsigned int x;
@@ -2074,7 +2076,7 @@ static test_return  user_supplied_bug10(memcached_st *memc)
 */
 static test_return  user_supplied_bug11(memcached_st *memc)
 {
-  char *key= "foo";
+  const char *key= "foo";
   char *value;
   size_t value_length= 512;
   unsigned int x;
@@ -2199,7 +2201,7 @@ static test_return  user_supplied_bug14(memcached_st *memc)
   size_t setter= 1;
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
   memcached_return rc;
-  char *key= "foo";
+  const char *key= "foo";
   char *value;
   size_t value_length= 18000;
   char *string;
@@ -2243,7 +2245,7 @@ static test_return  user_supplied_bug15(memcached_st *memc)
 {
   uint32_t x;
   memcached_return rc;
-  char *key= "mykey";
+  const char *key= "mykey";
   char *value;
   size_t length;
   uint32_t flags;
@@ -2280,7 +2282,7 @@ static test_return  user_supplied_bug15(memcached_st *memc)
 static test_return  user_supplied_bug16(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "mykey";
+  const char *key= "mykey";
   char *value;
   size_t length;
   uint32_t flags;
@@ -2306,8 +2308,8 @@ static test_return  user_supplied_bug16(memcached_st *memc)
 static test_return  user_supplied_bug17(memcached_st *memc)
 {
     memcached_return rc;
-    char *key= "豆瓣";
-    char *value="我们在炎热抑郁的夏天无法停止豆瓣";
+    const char *key= "豆瓣";
+    const char *value="我们在炎热抑郁的夏天无法停止豆瓣";
     char *value2;
     size_t length;
     uint32_t flags;
@@ -2358,9 +2360,9 @@ static test_return user_supplied_bug20(memcached_st *memc)
 {
   memcached_return status;
   memcached_result_st *result, result_obj;
-  char *key = "abc";
+  const char *key = "abc";
   size_t key_len = strlen("abc");
-  char *value = "foobar";
+  const char *value = "foobar";
   size_t value_len = strlen(value);
 
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
@@ -3070,6 +3072,16 @@ static memcached_return pre_replication(memcached_st *memc)
   return rc;
 }
 
+static memcached_return pre_replication_noblock(memcached_st *memc)
+{
+  memcached_return rc= MEMCACHED_FAILURE;
+  if (pre_replication(memc) == MEMCACHED_SUCCESS && 
+      pre_nonblock(memc) == MEMCACHED_SUCCESS)
+    rc= MEMCACHED_SUCCESS;
+
+  return rc;
+}
+
 static void my_free(memcached_st *ptr __attribute__((unused)), void *mem)
 {
   free(mem);
@@ -3129,7 +3141,9 @@ static memcached_return set_prefix(memcached_st *memc)
 
   /* Set to Zero, and then Set to something too large */
   {
-    char *long_key;
+    char long_key[255];
+    memset(long_key, 0, 255);
+
     rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, NULL);
     assert(rc == MEMCACHED_SUCCESS);
 
@@ -3139,13 +3153,13 @@ static memcached_return set_prefix(memcached_st *memc)
 
     /* Test a long key for failure */
     /* TODO, extend test to determine based on setting, what result should be */
-    long_key= "Thisismorethentheallottednumberofcharacters";
+    strcpy(long_key, "Thisismorethentheallottednumberofcharacters");
     rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
     //assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
     assert(rc == MEMCACHED_SUCCESS);
 
     /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
-    long_key= "This is more then the allotted number of characters";
+    strcpy(long_key, "This is more then the allotted number of characters");
     rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
     assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
 
@@ -3153,7 +3167,7 @@ static memcached_return set_prefix(memcached_st *memc)
     rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 1);
     assert(rc == MEMCACHED_SUCCESS);
 
-    long_key= "dog cat";
+    strcpy(long_key, "dog cat");
     rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
     assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
   }
@@ -3419,7 +3433,7 @@ static test_return noreply_test(memcached_st *memc)
   /* Try setting an illegal cas value (should not return an error to
    * the caller (because we don't expect a return message from the server)
    */
-  char* keys[]= {"0"};
+  const char* keys[]= {"0"};
   size_t lengths[]= {1};
   size_t length;
   uint32_t flags;
@@ -3576,12 +3590,27 @@ static test_return connection_pool_test(memcached_st *memc)
 static test_return replication_set_test(memcached_st *memc)
 {
   memcached_return rc;
-  memcached_st *clone= memcached_clone(NULL, memc);
-  memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0);
+  memcached_st *memc_clone= memcached_clone(NULL, memc);
+  memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0);
 
   rc= memcached_set(memc, "bubba", 5, "0", 1, 0, 0);
   assert(rc == MEMCACHED_SUCCESS);
 
+  /*
+  ** We are using the quiet commands to store the replicas, so we need
+  ** to ensure that all of them are processed before we can continue.
+  ** In the test we go directly from storing the object to trying to
+  ** receive the object from all of the different servers, so we
+  ** could end up in a race condition (the memcached server hasn't yet
+  ** processed the quiet command from the replication set when it process
+  ** the request from the other client (created by the clone)). As a
+  ** workaround for that we call memcached_quit to send the quit command
+  ** to the server and wait for the response ;-) If you use the test code
+  ** as an example for your own code, please note that you shouldn't need
+  ** to do this ;-)
+  */ 
+  memcached_quit(memc);
+
   /*
   ** "bubba" should now be stored on all of our servers. We don't have an
   ** easy to use API to address each individual server, so I'll just iterate
@@ -3593,14 +3622,14 @@ static test_return replication_set_test(memcached_st *memc)
     char key[2]= { [0]= (char)x };
     size_t len;
     uint32_t flags;
-    char *val= memcached_get_by_key(clone, key, 1, "bubba", 5, 
+    char *val= memcached_get_by_key(memc_clone, key, 1, "bubba", 5, 
                                     &len, &flags, &rc);
     assert(rc == MEMCACHED_SUCCESS);
     assert(val != NULL);
     free(val);
   }
 
-  memcached_free(clone);
+  memcached_free(memc_clone);
 
   return TEST_SUCCESS;
 }
@@ -3616,22 +3645,22 @@ static test_return replication_get_test(memcached_st *memc)
    */
   for (uint32_t host= 0; host < memc->number_of_hosts; ++host) 
   {
-    memcached_st *clone= memcached_clone(NULL, memc);
-    clone->hosts[host].port= 0;
+    memcached_st *memc_clone= memcached_clone(NULL, memc);
+    memc_clone->hosts[host].port= 0;
 
     for (int x= 'a'; x <= 'z'; ++x)
     {
       char key[2]= { [0]= (char)x };
       size_t len;
       uint32_t flags;
-      char *val= memcached_get_by_key(clone, key, 1, "bubba", 5, 
+      char *val= memcached_get_by_key(memc_clone, key, 1, "bubba", 5, 
                                       &len, &flags, &rc);
       assert(rc == MEMCACHED_SUCCESS);
       assert(val != NULL);
       free(val);
     }
 
-    memcached_free(clone);
+    memcached_free(memc_clone);
   }
 
   return TEST_SUCCESS;
@@ -3640,10 +3669,10 @@ static test_return replication_get_test(memcached_st *memc)
 static test_return replication_mget_test(memcached_st *memc)
 {
   memcached_return rc;
-  memcached_st *clone= memcached_clone(NULL, memc);
-  memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0);
+  memcached_st *memc_clone= memcached_clone(NULL, memc);
+  memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0);
 
-  char *keys[]= { "bubba", "key1", "key2", "key3" };
+  const char *keys[]= { "bubba", "key1", "key2", "key3" };
   size_t len[]= { 5, 4, 4, 4 };
 
   for (int x=0; x< 4; ++x)
@@ -3652,20 +3681,35 @@ static test_return replication_mget_test(memcached_st *memc)
     assert(rc == MEMCACHED_SUCCESS);
   }
 
+  /*
+  ** We are using the quiet commands to store the replicas, so we need
+  ** to ensure that all of them are processed before we can continue.
+  ** In the test we go directly from storing the object to trying to
+  ** receive the object from all of the different servers, so we
+  ** could end up in a race condition (the memcached server hasn't yet
+  ** processed the quiet command from the replication set when it process
+  ** the request from the other client (created by the clone)). As a
+  ** workaround for that we call memcached_quit to send the quit command
+  ** to the server and wait for the response ;-) If you use the test code
+  ** as an example for your own code, please note that you shouldn't need
+  ** to do this ;-)
+  */ 
+  memcached_quit(memc);
+
   /*
    * Don't do the following in your code. I am abusing the internal details
    * within the library, and this is not a supported interface.
    * This is to verify correct behavior in the library
    */
   memcached_result_st result_obj;
-  for (uint32_t host= 0; host < clone->number_of_hosts; host++) 
+  for (uint32_t host= 0; host < memc_clone->number_of_hosts; host++) 
   {
     memcached_st *new_clone= memcached_clone(NULL, memc);
     new_clone->hosts[host].port= 0;
 
     for (int x= 'a'; x <= 'z'; ++x)
     {
-      char key[2]= { [0]= (char)x };
+      const char key[2]= { [0]= (const char)x };
 
       rc= memcached_mget_by_key(new_clone, key, 1, keys, len, 4);
       assert(rc == MEMCACHED_SUCCESS);
@@ -3691,13 +3735,13 @@ static test_return replication_mget_test(memcached_st *memc)
 static test_return replication_delete_test(memcached_st *memc)
 {
   memcached_return rc;
-  memcached_st *clone= memcached_clone(NULL, memc);
+  memcached_st *memc_clone= memcached_clone(NULL, memc);
   /* Delete the items from all of the servers except 1 */
   uint64_t repl= memcached_behavior_get(memc,
                                         MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS);
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, --repl);
 
-  char *keys[]= { "bubba", "key1", "key2", "key3" };
+  const char *keys[]= { "bubba", "key1", "key2", "key3" };
   size_t len[]= { 5, 4, 4, 4 };
 
   for (int x=0; x< 4; ++x)
@@ -3714,26 +3758,26 @@ static test_return replication_delete_test(memcached_st *memc)
   uint32_t hash= memcached_generate_hash(memc, keys[0], len[0]);
   for (uint32_t x= 0; x < (repl + 1); ++x) 
   {
-    clone->hosts[hash].port= 0;
-    if (++hash == clone->number_of_hosts)
+    memc_clone->hosts[hash].port= 0;
+    if (++hash == memc_clone->number_of_hosts)
       hash= 0;
   }
 
   memcached_result_st result_obj;
-  for (uint32_t host= 0; host < clone->number_of_hosts; ++host) 
+  for (uint32_t host= 0; host < memc_clone->number_of_hosts; ++host) 
   {
     for (int x= 'a'; x <= 'z'; ++x)
     {
-      char key[2]= { [0]= (char)x };
+      const char key[2]= { [0]= (const char)x };
 
-      rc= memcached_mget_by_key(clone, key, 1, keys, len, 4);
+      rc= memcached_mget_by_key(memc_clone, key, 1, keys, len, 4);
       assert(rc == MEMCACHED_SUCCESS);
 
-      memcached_result_st *results= memcached_result_create(clone, &result_obj);
+      memcached_result_st *results= memcached_result_create(memc_clone, &result_obj);
       assert(results);
 
       int hits= 0;
-      while ((results= memcached_fetch_result(clone, &result_obj, &rc)) != NULL)
+      while ((results= memcached_fetch_result(memc_clone, &result_obj, &rc)) != NULL)
       {
         ++hits;
       }
@@ -3741,7 +3785,7 @@ static test_return replication_delete_test(memcached_st *memc)
       memcached_result_free(&result_obj);
     }
   }
-  memcached_free(clone);
+  memcached_free(memc_clone);
 
   return TEST_SUCCESS;
 }
@@ -3867,8 +3911,8 @@ static test_return udp_set_test(memcached_st *memc)
   for (x= 0; x < num_iters;x++)
   {
     memcached_return rc;
-    char *key= "foo";
-    char *value= "when we sanitize";
+    const char *key= "foo";
+    const char *value= "when we sanitize";
     uint16_t *expected_ids= get_udp_request_ids(memc);
     unsigned int server_key= memcached_generate_hash(memc,key,strlen(key));
     size_t init_offset= memc->hosts[server_key].write_buffer_offset;
@@ -3907,7 +3951,7 @@ static test_return udp_buffered_set_test(memcached_st *memc)
 static test_return udp_set_too_big_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "bar";
+  const char *key= "bar";
   char value[MAX_UDP_DATAGRAM_LENGTH];
   uint16_t *expected_ids= get_udp_request_ids(memc);
   rc= memcached_set(memc, key, strlen(key),
@@ -3924,7 +3968,7 @@ static test_return udp_delete_test(memcached_st *memc)
   for (x= 0; x < num_iters;x++)
   {
     memcached_return rc;
-    char *key= "foo";
+    const char *key= "foo";
     uint16_t *expected_ids=get_udp_request_ids(memc);
     unsigned int server_key= memcached_generate_hash(memc, key, strlen(key));
     size_t init_offset= memc->hosts[server_key].write_buffer_offset;
@@ -3986,8 +4030,8 @@ static test_return udp_flush_test(memcached_st *memc)
 static test_return udp_incr_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "incr";
-  char *value= "1";
+  const char *key= "incr";
+  const char *value= "1";
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint32_t)0);
@@ -4005,8 +4049,8 @@ static test_return udp_incr_test(memcached_st *memc)
 static test_return udp_decr_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "decr";
-  char *value= "1";
+  const char *key= "decr";
+  const char *value= "1";
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint32_t)0);
@@ -4046,7 +4090,7 @@ static test_return udp_version_test(memcached_st *memc)
 static test_return udp_get_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
+  const char *key= "foo";
   size_t vlen;
   uint16_t *expected_ids = get_udp_request_ids(memc);
   char *val= memcached_get(memc, key, strlen(key), &vlen, (uint32_t)0, &rc);
@@ -4090,7 +4134,7 @@ static test_return hsieh_avaibility_test (memcached_st *memc)
   return TEST_SUCCESS;
 }
 
-static char *list[]=
+static const char *list[]=
 {
   "apple",
   "beat",
@@ -4123,12 +4167,14 @@ static char *list[]=
 static test_return md5_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= {  3195025439, 2556848621, 3724893440, 3332385401, 245758794, 2550894432, 
-                        121710495, 3053817768, 1250994555, 1862072655, 2631955953, 2951528551, 
-                        1451250070, 2820856945, 2060845566, 3646985608, 2138080750, 217675895, 
-                        2230934345, 1234361223, 3968582726, 2455685270, 1293568479, 199067604, 
-                        2042482093 };
+  const char **ptr;
+  uint32_t values[]= {  3195025439U, 2556848621U, 3724893440U, 3332385401U,
+                        245758794U, 2550894432U, 121710495U, 3053817768U,
+                        1250994555U, 1862072655U, 2631955953U, 2951528551U, 
+                        1451250070U, 2820856945U, 2060845566U, 3646985608U,
+                        2138080750U, 217675895U, 2230934345U, 1234361223U,
+                        3968582726U, 2455685270U, 1293568479U, 199067604U, 
+                        2042482093U };
 
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
@@ -4145,10 +4191,11 @@ static test_return md5_run (memcached_st *memc __attribute__((unused)))
 static test_return crc_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= {  10542, 22009, 14526, 19510, 19432, 10199, 20634, 9369, 11511, 10362,
-                        7893, 31289, 11313, 9354, 7621, 30628, 15218, 25967, 2695, 9380, 
-                        17300, 28156, 9192, 20484, 16925 };
+  const char **ptr;
+  uint32_t values[]= {  10542U, 22009U, 14526U, 19510U, 19432U, 10199U, 20634U,
+                        9369U, 11511U, 10362U, 7893U, 31289U, 11313U, 9354U,
+                        7621U, 30628U, 15218U, 25967U, 2695U, 9380U, 
+                        17300U, 28156U, 9192U, 20484U, 16925U };
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
   {
@@ -4164,12 +4211,14 @@ static test_return crc_run (memcached_st *memc __attribute__((unused)))
 static test_return fnv1_64_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= {  473199127, 4148981457, 3971873300, 3257986707, 1722477987, 2991193800, 
-                        4147007314, 3633179701, 1805162104, 3503289120, 3395702895, 3325073042,
-                        2345265314, 3340346032, 2722964135, 1173398992, 2815549194, 2562818319,
-                        224996066, 2680194749, 3035305390, 246890365, 2395624193, 4145193337,
-                        1801941682 };
+  const char **ptr;
+  uint32_t values[]= {  473199127U, 4148981457U, 3971873300U, 3257986707U, 
+                        1722477987U, 2991193800U, 4147007314U, 3633179701U, 
+                        1805162104U, 3503289120U, 3395702895U, 3325073042U,
+                        2345265314U, 3340346032U, 2722964135U, 1173398992U,
+                        2815549194U, 2562818319U, 224996066U, 2680194749U, 
+                        3035305390U, 246890365U, 2395624193U, 4145193337U,
+                        1801941682U };
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
   {
@@ -4185,12 +4234,14 @@ static test_return fnv1_64_run (memcached_st *memc __attribute__((unused)))
 static test_return fnv1a_64_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= {  1488911807, 2500855813, 1510099634, 1390325195, 3647689787, 3241528582,
-                        1669328060, 2604311949, 734810122, 1516407546, 560948863, 1767346780,
-                        561034892, 4156330026, 3716417003, 3475297030, 1518272172, 227211583,
-                        3938128828, 126112909, 3043416448, 3131561933, 1328739897, 2455664041,
-                        2272238452 }; 
+  const char **ptr;
+  uint32_t values[]= {  1488911807U, 2500855813U, 1510099634U, 1390325195U, 
+                        3647689787U, 3241528582U, 1669328060U, 2604311949U, 
+                        734810122U, 1516407546U, 560948863U, 1767346780U,
+                        561034892U, 4156330026U, 3716417003U, 3475297030U,
+                        1518272172U, 227211583U, 3938128828U, 126112909U, 
+                        3043416448U, 3131561933U, 1328739897U, 2455664041U,
+                        2272238452U }; 
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
   {
@@ -4206,11 +4257,14 @@ static test_return fnv1a_64_run (memcached_st *memc __attribute__((unused)))
 static test_return fnv1_32_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= {  67176023, 1190179409, 2043204404, 3221866419, 2567703427, 3787535528, 4147287986,
-                        3500475733, 344481048, 3865235296, 2181839183, 119581266, 510234242, 4248244304,
-                        1362796839, 103389328, 1449620010, 182962511, 3554262370, 3206747549, 1551306158,
-                        4127558461, 1889140833, 2774173721, 1180552018 };
+  const char **ptr;
+  uint32_t values[]= {  67176023U, 1190179409U, 2043204404U, 3221866419U, 
+                        2567703427U, 3787535528U, 4147287986U, 3500475733U,
+                        344481048U, 3865235296U, 2181839183U, 119581266U, 
+                        510234242U, 4248244304U, 1362796839U, 103389328U,
+                        1449620010U, 182962511U, 3554262370U, 3206747549U,
+                        1551306158U, 4127558461U, 1889140833U, 2774173721U,
+                        1180552018U };
 
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
@@ -4227,11 +4281,14 @@ static test_return fnv1_32_run (memcached_st *memc __attribute__((unused)))
 static test_return fnv1a_32_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= {  280767167, 2421315013, 3072375666, 855001899, 459261019, 3521085446, 18738364,
-                        1625305005, 2162232970, 777243802, 3323728671, 132336572, 3654473228, 260679466,
-                        1169454059, 2698319462, 1062177260, 235516991, 2218399068, 405302637, 1128467232,
-                        3579622413, 2138539289, 96429129, 2877453236 };
+  const char **ptr;
+  uint32_t values[]= {  280767167U, 2421315013U, 3072375666U, 855001899U,
+                        459261019U, 3521085446U, 18738364U, 1625305005U,
+                        2162232970U, 777243802U, 3323728671U, 132336572U,
+                        3654473228U, 260679466U, 1169454059U, 2698319462U,
+                        1062177260U, 235516991U, 2218399068U, 405302637U,
+                        1128467232U, 3579622413U, 2138539289U, 96429129U,
+                        2877453236U };
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
   {
@@ -4247,7 +4304,7 @@ static test_return fnv1a_32_run (memcached_st *memc __attribute__((unused)))
 static test_return hsieh_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
+  const char **ptr;
 #ifdef HAVE_HSIEH_HASH
   uint32_t values[]= {  3738850110, 3636226060, 3821074029, 3489929160, 3485772682, 80540287,
                         1805464076, 1895033657, 409795758, 979934958, 3634096985, 1284445480,
@@ -4272,12 +4329,14 @@ static test_return hsieh_run (memcached_st *memc __attribute__((unused)))
 static test_return murmur_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= { 473199127, 4148981457, 3971873300, 3257986707, 1722477987, 2991193800,
-                        4147007314, 3633179701, 1805162104, 3503289120, 3395702895, 3325073042,
-                        2345265314, 3340346032, 2722964135, 1173398992, 2815549194, 2562818319,
-                        224996066, 2680194749, 3035305390, 246890365, 2395624193, 4145193337,
-                        1801941682 };
+  const char **ptr;
+  uint32_t values[]= { 473199127U, 4148981457U, 3971873300U, 3257986707U,
+                       1722477987U, 2991193800U, 4147007314U, 3633179701U,
+                       1805162104U, 3503289120U, 3395702895U, 3325073042U,
+                       2345265314U, 3340346032U, 2722964135U, 1173398992U,
+                       2815549194U, 2562818319U, 224996066U, 2680194749U,
+                       3035305390U, 246890365U, 2395624193U, 4145193337U,
+                       1801941682U };
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
   {
@@ -4293,12 +4352,14 @@ static test_return murmur_run (memcached_st *memc __attribute__((unused)))
 static test_return jenkins_run (memcached_st *memc __attribute__((unused)))
 {
   uint32_t x;
-  char **ptr;
-  uint32_t values[]= {  1442444624, 4253821186, 1885058256, 2120131735, 3261968576, 3515188778,
-                        4232909173, 4288625128, 1812047395, 3689182164, 2502979932, 1214050606,
-                        2415988847, 1494268927, 1025545760, 3920481083, 4153263658, 3824871822,
-                        3072759809, 798622255, 3065432577, 1453328165, 2691550971, 3408888387,
-                        2629893356 };
+  const char **ptr;
+  uint32_t values[]= {  1442444624U, 4253821186U, 1885058256U, 2120131735U,
+                        3261968576U, 3515188778U, 4232909173U, 4288625128U,
+                        1812047395U, 3689182164U, 2502979932U, 1214050606U,
+                        2415988847U, 1494268927U, 1025545760U, 3920481083U,
+                        4153263658U, 3824871822U, 3072759809U, 798622255U,
+                        3065432577U, 1453328165U, 2691550971U, 3408888387U,
+                        2629893356U };
 
 
   for (ptr= list, x= 0; *ptr; ptr++, x++)
@@ -4571,6 +4632,7 @@ collection_st collection[] ={
   {"consistent_ketama_weighted", pre_behavior_ketama_weighted, 0, consistent_weighted_tests},
   {"test_hashes", 0, 0, hash_tests},
   {"replication", pre_replication, 0, replication_tests},
+  {"replication_noblock", pre_replication_noblock, 0, replication_tests},
   {0, 0, 0, 0}
 };
 
index 2c13b6718f07d26dd7fcdf666a7048383b1b9a1a..a0d72b083b3ff3b1099fc801077a29d364ed7d3b 100644 (file)
@@ -1,8 +1,8 @@
 typedef struct {
-    char *key;
+    const char *key;
     unsigned long hash1;
     unsigned long hash2;
-    char *server;
+    const char *server;
 } TestCase;
 
 static TestCase test_cases[99] = {
index c2a6e946ef78dfa0666232dcda4d54a374fd3cae..3a2ed00e85ff2ffe79f49fe6b248e698dd379d6b 100644 (file)
@@ -634,3 +634,40 @@ Error 33 -> A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE
 Error 34 -> THE HOST TRANSPORT PROTOCOL DOES NOT MATCH THAT OF THE CLIENT
 Error 35 -> SERVER IS MARKED DEAD
 Error 36 -> ENCOUNTERED AN UNKNOWN STAT KEY
+Error 0 -> SUCCESS
+Error 1 -> FAILURE
+Error 2 -> HOSTNAME LOOKUP FAILURE
+Error 3 -> CONNECTION FAILURE
+Error 4 -> CONNECTION BIND FAILURE
+Error 5 -> WRITE FAILURE
+Error 6 -> READ FAILURE
+Error 7 -> UNKNOWN READ FAILURE
+Error 8 -> PROTOCOL ERROR
+Error 9 -> CLIENT ERROR
+Error 10 -> SERVER ERROR
+Error 11 -> CONNECTION SOCKET CREATE FAILURE
+Error 12 -> CONNECTION DATA EXISTS
+Error 13 -> CONNECTION DATA DOES NOT EXIST
+Error 14 -> NOT STORED
+Error 15 -> STORED
+Error 16 -> NOT FOUND
+Error 17 -> MEMORY ALLOCATION FAILURE
+Error 18 -> PARTIAL READ
+Error 19 -> SOME ERRORS WERE REPORTED
+Error 20 -> NO SERVERS DEFINED
+Error 21 -> SERVER END
+Error 22 -> SERVER DELETE
+Error 23 -> SERVER VALUE
+Error 24 -> STAT VALUE
+Error 25 -> ITEM VALUE
+Error 26 -> SYSTEM ERROR
+Error 27 -> COULD NOT OPEN UNIX SOCKET
+Error 28 -> ACTION NOT SUPPORTED
+Error 29 -> A KEY LENGTH OF ZERO WAS PROVIDED
+Error 30 -> FETCH WAS NOT COMPLETED
+Error 31 -> A TIMEOUT OCCURRED
+Error 32 -> ACTION QUEUED
+Error 33 -> A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE
+Error 34 -> THE HOST TRANSPORT PROTOCOL DOES NOT MATCH THAT OF THE CLIENT
+Error 35 -> SERVER IS MARKED DEAD
+Error 36 -> ENCOUNTERED AN UNKNOWN STAT KEY
index 4a3789b93a741c427b4b541f79c1f1314b3fb197..23b5cf17adde8255143e87dc4837d83d8734ffa1 100644 (file)
 
 #include "test.h"
 
+#include <string>
+
+using namespace std;
+
 extern "C" {
-   test_return basic_test(memcached_st *memc);
-   uint8_t increment_test(memcached_st *memc);
-   test_return basic_master_key_test(memcached_st *memc);
    void *world_create(void);
    void world_destroy(void *p);
 }
 
-test_return basic_test(memcached_st *memc)
+static test_return basic_test(memcached_st *memc)
 {
   Memcached foo(memc);
-  const char *value_set= "This is some data";
-  char *value;
+  const string value_set("This is some data");
+  string value;
   size_t value_length;
 
-  foo.set("mine", value_set, strlen(value_set));
+  foo.set("mine", value_set, 0, 0);
   value= foo.get("mine", &value_length);
 
-  assert((memcmp(value, value_set, value_length) == 0));
+  assert((memcmp(value.c_str(), value_set.c_str(), value_length) == 0));
 
   return TEST_SUCCESS;
 }
 
-uint8_t increment_test(memcached_st *memc)
+static test_return increment_test(memcached_st *memc)
 {
   Memcached mcach(memc);
-  memcached_return rc;
-  const char *key= "inctest";
-  const char *inc_value= "1";
-  char *ret_value;
+  bool rc;
+  const string key("inctest");
+  const string inc_value("1");
+  string ret_value;
   uint64_t int_inc_value;
   uint64_t int_ret_value;
   size_t value_length;
 
-  mcach.set(key, inc_value, strlen(inc_value));
+  mcach.set(key, inc_value, 0, 0);
   ret_value= mcach.get(key, &value_length);
-  printf("\nretvalue %s\n",ret_value);
-  int_inc_value= atoi(inc_value);
-  int_ret_value= atoi(ret_value);
+  printf("\nretvalue %s\n",ret_value.c_str());
+  int_inc_value= uint64_t(atol(inc_value.c_str()));
+  int_ret_value= uint64_t(atol(ret_value.c_str()));
   assert(int_ret_value == int_inc_value); 
 
   rc= mcach.increment(key, 1, &int_ret_value);
-  assert(rc == MEMCACHED_SUCCESS);
+  assert(rc == true);
   assert(int_ret_value == 2);
 
   rc= mcach.increment(key, 1, &int_ret_value);
-  assert(rc == MEMCACHED_SUCCESS);
+  assert(rc == true);
   assert(int_ret_value == 3);
 
   rc= mcach.increment(key, 5, &int_ret_value);
-  assert(rc == MEMCACHED_SUCCESS);
+  assert(rc == true);
   assert(int_ret_value == 8);
 
-  return 0;
+  return TEST_SUCCESS;
 }
 
-test_return basic_master_key_test(memcached_st *memc)
+static test_return basic_master_key_test(memcached_st *memc)
 {
-   Memcached foo(memc);
-  const char *value_set= "Data for server A";
-  const char *master_key_a= "server-a";
-  const char *master_key_b= "server-b";
-  const char *key= "xyz";
-  char *value;
+  Memcached foo(memc);
+  const string value_set("Data for server A");
+  const string master_key_a("server-a");
+  const string master_key_b("server-b");
+  const string key("xyz");
+  string value;
   size_t value_length;
 
-  foo.set_by_key(master_key_a, key, value_set, strlen(value_set));
+  foo.set_by_key(master_key_a, key, value_set, 0, 0);
   value= foo.get_by_key(master_key_a, key, &value_length);
 
-  assert((memcmp(value, value_set, value_length) == 0));
+  assert((memcmp(value.c_str(), value_set.c_str(), value_length) == 0));
 
   value= foo.get_by_key(master_key_b, key, &value_length);
-  assert((memcmp(value, value_set, value_length) == 0));
+  assert((memcmp(value.c_str(), value_set.c_str(), value_length) == 0));
+
+  return TEST_SUCCESS;
+}
+
+/* Count the results */
+static memcached_return callback_counter(memcached_st *ptr __attribute__((unused)), 
+                                     memcached_result_st *result __attribute__((unused)), 
+                                     void *context)
+{
+  unsigned int *counter= static_cast<unsigned int *>(context);
+
+  *counter= *counter + 1;
+
+  return MEMCACHED_SUCCESS;
+}
+
+static test_return mget_result_function(memcached_st *memc)
+{
+  Memcached mc(memc);
+  bool rc;
+  string key1("fudge");
+  string key2("son");
+  string key3("food");
+  vector<string> keys;
+  keys.reserve(3);
+  keys.push_back(key1);
+  keys.push_back(key2);
+  keys.push_back(key3);
+  unsigned int counter;
+  memcached_execute_function callbacks[1];
+
+  /* We need to empty the server before we continue the test */
+  rc= mc.flush(0);
+  rc= mc.set_all(keys, keys, 50, 9);
+  assert(rc == true);
+
+  rc= mc.mget(keys);
+  assert(rc == true);
+
+  callbacks[0]= &callback_counter;
+  counter= 0;
+  rc= mc.fetch_execute(callbacks, static_cast<void *>(&counter), 1); 
+
+  assert(counter == 3);
 
   return TEST_SUCCESS;
 }
 
+static test_return mget_test(memcached_st *memc)
+{
+  Memcached mc(memc);
+  bool rc;
+  memcached_return mc_rc;
+  vector<string> keys;
+  keys.reserve(3);
+  keys.push_back("fudge");
+  keys.push_back("son");
+  keys.push_back("food");
+  uint32_t flags;
+
+  string return_key;
+  size_t return_key_length;
+  string return_value;
+  size_t return_value_length;
+
+  /* We need to empty the server before we continue the test */
+  rc= mc.flush(0);
+  assert(rc == true);
+
+  rc= mc.mget(keys);
+  assert(rc == true);
+
+  while (mc.fetch(return_key, return_value, &return_key_length, 
+                  &return_value_length, &flags, &mc_rc))
+  {
+    assert(return_value.length() != 0);
+  }
+  assert(return_value_length == 0);
+  assert(mc_rc == MEMCACHED_END);
+
+  rc= mc.set_all(keys, keys, 50, 9);
+  assert(rc == true);
+
+  rc= mc.mget(keys);
+  assert(rc == true);
+
+  while ((mc.fetch(return_key, return_value, &return_key_length, 
+                   &return_value_length, &flags, &mc_rc)))
+  {
+    assert(return_value.length() != 0);
+    assert(mc_rc == MEMCACHED_SUCCESS);
+    assert(return_key_length == return_value_length);
+    assert(!memcmp(return_value.c_str(), return_key.c_str(), return_value_length));
+  }
+
+  return TEST_SUCCESS;
+}
 
 test_st tests[] ={
-  {"basic", 0, basic_test },
-  {"basic_master_key", 0, basic_master_key_test },
+  { "basic", 0, basic_test },
+  { "basic_master_key", 0, basic_master_key_test },
+  { "increment_test", 0, increment_test },
+  { "mget", 1, mget_test },
+  { "mget_result_function", 1, mget_result_function },
   {0, 0, 0}
 };
 
index e06fbd57e0d66cab5f91544c0b3080f5deb33bee..f0926695133571f946ccfcad05a1f06dc11a5326 100644 (file)
@@ -4,7 +4,7 @@
 
 #define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT+10 
 
-#include "libmemcached/libmemcached_config.h"
+#include "config.h"
 
 #include <stdio.h>
 #include <stdlib.h>
index 63b75ef0fdb105e9d65770ee7063e5971ba56f14..d0e089ddfcfa42f5b3d62762162ac64e360aa91f 100644 (file)
@@ -6,7 +6,7 @@ extern "C" {
 #endif
 
 #include <libmemcached/memcached.h>
-#include "../libmemcached/common.h"
+#include <stdio.h>
 
 typedef struct world_st world_st;
 typedef struct collection_st collection_st;
index 4c7050e213846b6bd5eac0a465ea7902a998117f..2fc178f07f15bfe9833c7967994467957b92b910 100644 (file)
@@ -22,8 +22,8 @@ void world_destroy(void *p);
 test_return set_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "foo";
-  char *value= "when we sanitize";
+  const char *key= "foo";
+  const char *value= "when we sanitize";
 
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),