http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h 
b/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h
deleted file mode 100644
index 5c06bbf..0000000
--- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef ZOOKEEPER_LOCK_H_
-#define ZOOKEEPER_LOCK_H_
-
-#include <zookeeper.h>
-#include <pthread.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/**
- * \brief the call back function called on status change of lock
- * 
- * the call back funtion is called with a rc of 0 if lock is acquired and 
- * with an rc of 1 if the lock is released
- * \param rc the value to let us know if its locked or unlocked
- * \param cbdata the callback data that we passed when initializing 
- * the zookeeper lock.
- */
-
-typedef void (* zkr_lock_completion) (int rc, void* cbdata);
-
-/** 
- * \file zoo_lock.h
- * \brief zookeeper recipe for locking and leader election.
- * this api implements a writelock on a given path in zookeeper.
- * this api can also be used for leader election.
- */
-
-struct zkr_lock_mutex {
-    zhandle_t *zh;
-    char *path;
-    struct ACL_vector *acl;
-    char *id;
-    void *cbdata;
-    zkr_lock_completion completion;
-    pthread_mutex_t pmutex;
-    int isOwner;
-    char* ownerid;
-};
-
-typedef struct zkr_lock_mutex zkr_lock_mutex_t;
-
-
-/**
- * \brief initializing a zookeeper lock.
- *
- * this method instantiates the zookeeper mutex lock.
- * \param mutex the mutex to initialize
- * \param zh the zookeeper handle to use
- * \param path the path in zookeeper to use for locking
- * \param acl the acls to use in zookeeper.
- * \return return 0 if successful.
- */
-ZOOAPI int zkr_lock_init(zkr_lock_mutex_t *mutex, zhandle_t* zh, 
-                      char* path, struct ACL_vector *acl);
-
-/**
- * \brief initializing a zookeeper lock.
- *
- *
- * this method instantiates the zookeeper mutex lock with
- * a completion function.
- * 
- * \param mutex the mutex to initialize
- * \param zh the zookeeper handle to use
- * \param path the path in zookeeper to use for locking
- * \param acl the acls to use in zookeeper.
- * \param completion the callback thats called when lock 
- * is acquired and released.
- * \param cbdata the callback method is called with data
- * \return return 0 if successful.
- */
-ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh,
-                      char* path, struct ACL_vector *acl, 
-                      zkr_lock_completion completion, void* cbdata);
-
-/**
- * \brief lock the zookeeper mutex
- *
- * this method tries locking the mutex
- * \param mutex the zookeeper mutex
- * \return return 0 if there is no error. check 
- * with zkr_lock_isowner() if you have the lock
- */
-ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex);
-
-/**
- * \brief unlock the zookeeper mutex
- *
- * this method unlocks the zookeeper mutex
- * \param mutex the zookeeper mutex
- * \return return 0 if there is not error in executing unlock.
- * else returns non zero
- */
-ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex);
-
-/**
- * \brief set the callback function for zookeeper mutex
- * 
- * this method sets the callback for zookeeper mutex
- * \param mutex the zookeeper mutex
- * \param callback the call back completion function
- */
-ZOOAPI void zkr_lock_setcallback(zkr_lock_mutex_t *mutex, 
-                           zkr_lock_completion completion);
-
-/**
- * \brief get the callback function for zookeeper mutex
- *
- * this method gets the callback funtion for zookeeper mutex
- * \param mutex the zookeeper mutex
- * \return the lock completion function
- */
-ZOOAPI zkr_lock_completion zkr_lock_getcallback(zkr_lock_mutex_t *mutex);
-
-/**
- * \brief destroy the mutex 
- * this method free the mutex
- * \param mutex destroy the zookepeer lock.
- * \return return 0 if destroyed.
- */
-ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex);
-
-/**
- * \brief return the parent path this mutex is using
- * this method returns the parent path
- * \param mutex the mutex
- * \return return the parent path
- */
-ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex);
-
-/**
- * \brief return if this mutex is owner of the lock
- * this method returns if its owner or not
- * \param mutex the mutex
- * \return return true if is owner and false if not
- */
-ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex);
-
-/**
- * \brief return the id for this mutex
- * this mutex retunrns the id string 
- * \param mutex the mutex
- * \return the id for this mutex
- */
-ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex);
-
-#ifdef __cplusplus
-}
-#endif
-#endif  //ZOOKEEPER_LOCK_H_

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c 
b/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c
deleted file mode 100644
index 74a115f..0000000
--- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifdef DLL_EXPORT
-#define USE_STATIC_LIB
-#endif
-
-#if defined(__CYGWIN__)
-#define USE_IPV6
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <zookeeper_log.h>
-#include <time.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <limits.h>
-#include <zoo_lock.h>
-#include <stdbool.h>
-#ifdef HAVE_SYS_UTSNAME_H
-#include <sys/utsname.h>
-#endif
-
-#ifdef HAVE_GETPWUID_R
-#include <pwd.h>
-#endif
-
-#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;}
-
- 
-ZOOAPI int zkr_lock_init(zkr_lock_mutex_t* mutex, zhandle_t* zh,
-                      char* path, struct ACL_vector *acl) {
-    mutex->zh = zh;
-    mutex->path = path;
-    mutex->acl = acl;
-    mutex->completion = NULL;
-    mutex->cbdata = NULL;
-    mutex->id = NULL;
-    mutex->ownerid = NULL;
-    mutex->isOwner = 0;
-    pthread_mutex_init(&(mutex->pmutex), NULL);
-    return 0;
-}
-
-ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh,
-                         char *path, struct ACL_vector *acl,
-                         zkr_lock_completion completion, void* cbdata) {
-    mutex->zh = zh;
-    mutex->path = path;
-    mutex->acl = acl;
-    mutex->completion = completion;
-    mutex->cbdata = cbdata;
-    mutex->isOwner = 0;
-    mutex->ownerid = NULL;
-    mutex->id = NULL;
-    pthread_mutex_init(&(mutex->pmutex), NULL);
-    return 0;
-}
-
-/**
- * unlock the mutex
- */
-ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex) {
-    pthread_mutex_lock(&(mutex->pmutex));
-    zhandle_t *zh = mutex->zh;
-    if (mutex->id != NULL) {
-        int len = strlen(mutex->path) + strlen(mutex->id) + 2;
-        char buf[len];
-        sprintf(buf, "%s/%s", mutex->path, mutex->id);
-        int ret = 0;
-        int count = 0;
-        struct timespec ts;
-        ts.tv_sec = 0;
-        ts.tv_nsec = (.5)*1000000;
-        ret = ZCONNECTIONLOSS;
-        while (ret == ZCONNECTIONLOSS && (count < 3)) {
-            ret = zoo_delete(zh, buf, -1);
-            if (ret == ZCONNECTIONLOSS) {
-                LOG_DEBUG(LOGCALLBACK(zh), ("connectionloss while deleting the 
node"));
-                nanosleep(&ts, 0);
-                count++;
-            }
-        }
-        if (ret == ZOK || ret == ZNONODE) {
-            zkr_lock_completion completion = mutex->completion;
-            if (completion != NULL) {
-                completion(1, mutex->cbdata);
-            }
-
-            free(mutex->id);
-            mutex->id = NULL;
-            pthread_mutex_unlock(&(mutex->pmutex));
-            return 0;
-        }
-        LOG_WARN(LOGCALLBACK(zh), ("not able to connect to server - giving 
up"));
-        pthread_mutex_unlock(&(mutex->pmutex));
-        return ZCONNECTIONLOSS;
-    }
-    pthread_mutex_unlock(&(mutex->pmutex));
-    return ZSYSTEMERROR;
-}
-
-static void free_String_vector(struct String_vector *v) {
-    if (v->data) {
-        int32_t i;
-        for (i=0; i<v->count; i++) {
-            free(v->data[i]);
-        }
-        free(v->data);
-        v->data = 0;
-    }
-}
-
-static int vstrcmp(const void* str1, const void* str2) {
-    const char **a = (const char**)str1;
-    const char **b = (const char**) str2;
-    return strcmp(strrchr(*a, '-')+1, strrchr(*b, '-')+1); 
-} 
-
-static void sort_children(struct String_vector *vector) {
-    qsort( vector->data, vector->count, sizeof(char*), &vstrcmp);
-}
-        
-static char* child_floor(char **sorted_data, int len, char *element) {
-    char* ret = NULL;
-    int i =0;
-    for (i=0; i < len; i++) {
-        if (strcmp(sorted_data[i], element) < 0) {
-            ret = sorted_data[i];
-        }
-    }
-    return ret;
-}
-
-static void lock_watcher_fn(zhandle_t* zh, int type, int state,
-                            const char* path, void *watcherCtx) {
-    //callback that we registered 
-    //should be called
-    zkr_lock_lock((zkr_lock_mutex_t*) watcherCtx);
-}
-
-/**
- * get the last name of the path
- */
-static char* getName(char* str) {
-    char* name = strrchr(str, '/');
-    if (name == NULL) 
-        return NULL;
-    return strdup(name + 1);
-}
-
-/**
- * just a method to retry get children
- */
-static int retry_getchildren(zhandle_t *zh, char* path, struct String_vector 
*vector, 
-                             struct timespec *ts, int retry) {
-    int ret = ZCONNECTIONLOSS;
-    int count = 0;
-    while (ret == ZCONNECTIONLOSS && count < retry) {
-        ret = zoo_get_children(zh, path, 0, vector);
-        if (ret == ZCONNECTIONLOSS) {
-            LOG_DEBUG(LOGCALLBACK(zh), ("connection loss to the server"));
-            nanosleep(ts, 0);
-            count++;
-        }
-    }
-    return ret;
-}
-
-/** see if our node already exists
- * if it does then we dup the name and 
- * return it
- */
-static char* lookupnode(struct String_vector *vector, char *prefix) {
-    char *ret = NULL;
-    if (vector->data) {
-        int i = 0;
-        for (i = 0; i < vector->count; i++) {
-            char* child = vector->data[i];
-            if (strncmp(prefix, child, strlen(prefix)) == 0) {
-                ret = strdup(child);
-                break;
-            }
-        }
-    }
-    return ret;
-}
-
-/** retry zoo_wexists
- */
-static int retry_zoowexists(zhandle_t *zh, char* path, watcher_fn watcher, 
void* ctx,
-                            struct Stat *stat, struct timespec *ts, int retry) 
{
-    int ret = ZCONNECTIONLOSS;
-    int count = 0;
-    while (ret == ZCONNECTIONLOSS && count < retry) {
-        ret = zoo_wexists(zh, path, watcher, ctx, stat);
-        if (ret == ZCONNECTIONLOSS) {
-            LOG_DEBUG(LOGCALLBACK(zh), ("connectionloss while setting watch on 
my predecessor"));
-            nanosleep(ts, 0);
-            count++;
-        }
-    }
-    return ret;
-}
-                        
-/**
- * the main code that does the zookeeper leader 
- * election. this code creates its own ephemeral 
- * node on the given path and sees if its the first
- * one on the list and claims to be a leader if and only
- * if its the first one of children in the paretn path
- */
-static int zkr_lock_operation(zkr_lock_mutex_t *mutex, struct timespec *ts) {
-    zhandle_t *zh = mutex->zh;
-    char *path = mutex->path;
-    char *id = mutex->id;
-    struct Stat stat;
-    char* owner_id = NULL;
-    int retry = 3;
-    do {
-        const clientid_t *cid = zoo_client_id(zh);
-        // get the session id
-        int64_t session = cid->client_id;
-        char prefix[30];
-        int ret = 0;
-#if defined(__x86_64__)
-        snprintf(prefix, 30, "x-%016lx-", session);
-#else 
-        snprintf(prefix, 30, "x-%016llx-", session);
-#endif
-        struct String_vector vectorst;
-        vectorst.data = NULL;
-        vectorst.count = 0;
-        ret = ZCONNECTIONLOSS;
-        ret = retry_getchildren(zh, path, &vectorst, ts, retry);
-        if (ret != ZOK)
-            return ret;
-        struct String_vector *vector = &vectorst;
-        mutex->id = lookupnode(vector, prefix);
-        free_String_vector(vector);
-        if (mutex->id == NULL) {
-            int len = strlen(path) + strlen(prefix) + 2;
-            char buf[len];
-            char retbuf[len+20];
-            snprintf(buf, len, "%s/%s", path, prefix);
-            ret = ZCONNECTIONLOSS;
-            ret = zoo_create(zh, buf, NULL, 0,  mutex->acl, 
-                             ZOO_EPHEMERAL|ZOO_SEQUENCE, retbuf, (len+20));
-            
-            // do not want to retry the create since 
-            // we would end up creating more than one child
-            if (ret != ZOK) {
-                LOG_WARN(LOGCALLBACK(zh), ("could not create zoo node %s", 
buf));
-                return ret;
-            }
-            mutex->id = getName(retbuf);
-        }
-        
-        if (mutex->id != NULL) {
-            ret = ZCONNECTIONLOSS;
-            ret = retry_getchildren(zh, path, vector, ts, retry);
-            if (ret != ZOK) {
-                LOG_WARN(LOGCALLBACK(zh), ("could not connect to server"));
-                return ret;
-            }
-            //sort this list
-            sort_children(vector);
-            owner_id = vector->data[0];
-            mutex->ownerid = strdup(owner_id);
-            id = mutex->id;
-            char* lessthanme = child_floor(vector->data, vector->count, id);
-            if (lessthanme != NULL) {
-                int flen = strlen(mutex->path) + strlen(lessthanme) + 2;
-                char last_child[flen];
-                sprintf(last_child, "%s/%s",mutex->path, lessthanme);
-                ret = ZCONNECTIONLOSS;
-                ret = retry_zoowexists(zh, last_child, &lock_watcher_fn, 
mutex, 
-                                       &stat, ts, retry);
-                // cannot watch my predecessor i am giving up
-                // we need to be able to watch the predecessor 
-                // since if we do not become a leader the others 
-                // will keep waiting
-                if (ret != ZOK) {
-                    free_String_vector(vector);
-                    LOG_WARN(LOGCALLBACK(zh), ("unable to watch my 
predecessor"));
-                    ret = zkr_lock_unlock(mutex);
-                    while (ret == 0) {
-                        //we have to give up our leadership
-                        // since we cannot watch out predecessor
-                        ret = zkr_lock_unlock(mutex);
-                    }
-                    return ret;
-                }
-                // we are not the owner of the lock
-                mutex->isOwner = 0;
-            }
-            else {
-                // this is the case when we are the owner 
-                // of the lock
-                if (strcmp(mutex->id, owner_id) == 0) {
-                    LOG_DEBUG(LOGCALLBACK(zh), ("got the zoo lock owner - %s", 
mutex->id));
-                    mutex->isOwner = 1;
-                    if (mutex->completion != NULL) {
-                        mutex->completion(0, mutex->cbdata);
-                    }
-                    return ZOK;
-                }
-            }
-            free_String_vector(vector);
-            return ZOK;
-        }
-    } while (mutex->id == NULL);
-    return ZOK;
-}
-
-ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex) {
-    pthread_mutex_lock(&(mutex->pmutex));
-    zhandle_t *zh = mutex->zh;
-    char *path = mutex->path;
-    struct Stat stat;
-    int exists = zoo_exists(zh, path, 0, &stat);
-    int count = 0;
-    struct timespec ts;
-    ts.tv_sec = 0;
-    ts.tv_nsec = (.5)*1000000;
-    // retry to see if the path exists and 
-    // and create if the path does not exist
-    while ((exists == ZCONNECTIONLOSS || exists == ZNONODE) && (count <4)) {
-        count++;
-        // retry the operation
-        if (exists == ZCONNECTIONLOSS) 
-            exists = zoo_exists(zh, path, 0, &stat);
-        else if (exists == ZNONODE) 
-            exists = zoo_create(zh, path, NULL, 0, mutex->acl, 0, NULL, 0);
-        nanosleep(&ts, 0);
-          
-    }
-
-    // need to check if we cannot still access the server 
-    int check_retry = ZCONNECTIONLOSS;
-    count = 0;
-    while (check_retry != ZOK && count <4) {
-        check_retry = zkr_lock_operation(mutex, &ts);
-        if (check_retry != ZOK) {
-            nanosleep(&ts, 0);
-            count++;
-        }
-    }
-    pthread_mutex_unlock(&(mutex->pmutex));
-    return zkr_lock_isowner(mutex);
-}
-
-                    
-ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex) {
-    return mutex->path;
-}
-
-ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex) {
-    return (mutex->id != NULL && mutex->ownerid != NULL 
-            && (strcmp(mutex->id, mutex->ownerid) == 0));
-}
-
-ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex) {
-    return mutex->ownerid;
-}
-
-ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex) {
-    if (mutex->id) 
-        free(mutex->id);
-    mutex->path = NULL;
-    mutex->acl = NULL;
-    mutex->completion = NULL;
-    pthread_mutex_destroy(&(mutex->pmutex));
-    mutex->isOwner = 0;
-    if (mutex->ownerid) 
-        free(mutex->ownerid);
-    return 0;
-}
-

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc 
b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc
deleted file mode 100644
index 2cc56cf..0000000
--- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <stdlib.h>
-#include <sys/select.h>
-#include <cppunit/TestAssert.h>
-
-
-using namespace std;
-
-#include <cstring>
-#include <list>
-
-#include <zookeeper.h>
-#include <zoo_lock.h>
-
-static void yield(zhandle_t *zh, int i)
-{
-    sleep(i);
-}
-
-typedef struct evt {
-    string path;
-    int type;
-} evt_t;
-
-typedef struct watchCtx {
-private:
-    list<evt_t> events;
-public:
-    bool connected;
-    zhandle_t *zh;
-    
-    watchCtx() {
-        connected = false;
-        zh = 0;
-    }
-    ~watchCtx() {
-        if (zh) {
-            zookeeper_close(zh);
-            zh = 0;
-        }
-    }
-
-    evt_t getEvent() {
-        evt_t evt;
-        evt = events.front();
-        events.pop_front();
-        return evt;
-    }
-
-    int countEvents() {
-        int count;
-        count = events.size();
-        return count;
-    }
-
-    void putEvent(evt_t evt) {
-        events.push_back(evt);
-    }
-
-    bool waitForConnected(zhandle_t *zh) {
-        time_t expires = time(0) + 10;
-        while(!connected && time(0) < expires) {
-            yield(zh, 1);
-        }
-        return connected;
-    }
-    bool waitForDisconnected(zhandle_t *zh) {
-        time_t expires = time(0) + 15;
-        while(connected && time(0) < expires) {
-            yield(zh, 1);
-        }
-        return !connected;
-    }
-} watchctx_t; 
-
-class Zookeeper_locktest : public CPPUNIT_NS::TestFixture
-{
-    CPPUNIT_TEST_SUITE(Zookeeper_locktest);
-    CPPUNIT_TEST(testlock);
-    CPPUNIT_TEST_SUITE_END();
-
-    static void watcher(zhandle_t *, int type, int state, const char 
*path,void*v){
-        watchctx_t *ctx = (watchctx_t*)v;
-
-        if (state == ZOO_CONNECTED_STATE) {
-            ctx->connected = true;
-        } else {
-            ctx->connected = false;
-        }
-        if (type != ZOO_SESSION_EVENT) {
-            evt_t evt;
-            evt.path = path;
-            evt.type = type;
-            ctx->putEvent(evt);
-        }
-    }
-
-    static const char hostPorts[];
-
-    const char *getHostPorts() {
-        return hostPorts;
-    }
-
-    zhandle_t *createClient(watchctx_t *ctx) {
-        zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0,
-                                       ctx, 0);
-        ctx->zh = zk;
-        sleep(1);
-        return zk;
-    }
-    
-public:
-
-#define ZKSERVER_CMD "./tests/zkServer.sh"
-
-    void setUp()
-    {
-        char cmd[1024];
-        sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts());
-        CPPUNIT_ASSERT(system(cmd) == 0);
-    }
-    
-
-    void startServer() {
-        char cmd[1024];
-        sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts());
-        CPPUNIT_ASSERT(system(cmd) == 0);
-    }
-
-    void stopServer() {
-        tearDown();
-    }
-
-    void tearDown()
-    {
-        char cmd[1024];
-        sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts());
-        CPPUNIT_ASSERT(system(cmd) == 0);
-    }
-    
-
-    void testlock()
-    {
-        watchctx_t ctx;
-        int rc;
-        struct Stat stat;
-        char buf[1024];
-        int blen;
-        struct String_vector strings;
-        const char *testName;
-        zkr_lock_mutex_t mutexes[3];
-        int count = 3;
-        int i = 0;
-        char* path = "/test-lock";
-        for (i=0; i< 3; i++) {
-            zhandle_t *zh = createClient(&ctx);
-            zkr_lock_init(&mutexes[i], zh, path, &ZOO_OPEN_ACL_UNSAFE);
-            zkr_lock_lock(&mutexes[i]);
-        }
-        sleep(30);
-        zkr_lock_mutex leader = mutexes[0];
-        zkr_lock_mutex mutex;
-        int ret = strcmp(leader.id, leader.ownerid);
-        CPPUNIT_ASSERT(ret == 0);
-        for(i=1; i < count; i++) {
-            mutex = mutexes[i];
-            CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0);
-        } 
-        zkr_lock_unlock(&leader);
-        sleep(30);
-        zkr_lock_mutex secondleader = mutexes[1];
-        CPPUNIT_ASSERT(strcmp(secondleader.id , secondleader.ownerid) == 0);
-        for (i=2; i<count; i++) {
-            mutex = mutexes[i];
-            CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0);
-        }
-    }
-
-};
-
-const char Zookeeper_locktest::hostPorts[] = "127.0.0.1:22181";
-CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_locktest);

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestDriver.cc
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestDriver.cc 
b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestDriver.cc
deleted file mode 100644
index 2b818f4..0000000
--- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestDriver.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <string>
-#include <cppunit/TestRunner.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-#include <cppunit/TextTestProgressListener.h>
-#include <cppunit/BriefTestProgressListener.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <stdexcept>
-#include <cppunit/Exception.h>
-#include <cppunit/TestFailure.h>
-#include <cppunit/XmlOutputter.h>
-#include <fstream>
-
-#include "Util.h"
-
-using namespace std;
-
-CPPUNIT_NS_BEGIN
-
-class EclipseOutputter: public CompilerOutputter
-{
-public:
-  EclipseOutputter(TestResultCollector *result,ostream &stream):
-        CompilerOutputter(result,stream,"%p:%l: "),stream_(stream)
-    {
-    }
-    virtual void printFailedTestName( TestFailure *failure ){}
-    virtual void printFailureMessage( TestFailure *failure )
-    {
-      stream_<<": ";
-      Message msg = failure->thrownException()->message();
-      stream_<< msg.shortDescription();
-
-      string text;
-      for(int i=0; i<msg.detailCount();i++){
-          text+=msg.detailAt(i);
-          if(i+1!=msg.detailCount())
-              text+=", ";
-      }
-      if(text.length()!=0)
-          stream_ <<" ["<<text<<"]";
-      stream_<<"\n";
-    }
-    ostream& stream_;
-};
-
-CPPUNIT_NS_END
-
-int main( int argc, char* argv[] ) { 
-   // if command line contains "-ide" then this is the post build check
-   // => the output must be in the compiler error format.
-   //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]);
-   globalTestConfig.addConfigFromCmdLine(argc,argv);
-
-   // Create the event manager and test controller
-   CPPUNIT_NS::TestResult controller;
-   // Add a listener that colllects test result
-   CPPUNIT_NS::TestResultCollector result;
-   controller.addListener( &result );
-   
-   // Add a listener that print dots as tests run.
-   // CPPUNIT_NS::TextTestProgressListener progress;
-   CPPUNIT_NS::BriefTestProgressListener progress;
-   controller.addListener( &progress );
- 
-   CPPUNIT_NS::TestRunner runner;
-   runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
- 
-   try
-   {
-     cout << "Running "  <<  globalTestConfig.getTestName();
-     runner.run( controller, globalTestConfig.getTestName());
-     cout<<endl;
-
-     // Print test in a compiler compatible format.
-     CPPUNIT_NS::EclipseOutputter outputter( &result,cout);
-     outputter.write(); 
-
- // Uncomment this for XML output
-#ifdef ENABLE_XML_OUTPUT
-     std::ofstream file( "tests.xml" );
-     CPPUNIT_NS::XmlOutputter xml( &result, file );
-     xml.setStyleSheet( "report.xsl" );
-     xml.write();
-     file.close();
-#endif
-   }
-   catch ( std::invalid_argument &e )  // Test path not resolved
-   {
-     cout<<"\nERROR: "<<e.what()<<endl;
-     return 0;
-   }
-
-   return result.wasSuccessful() ? 0 : 1;
- }

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.cc
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.cc 
b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.cc
deleted file mode 100644
index 26a9a09..0000000
--- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Util.h"
-
-const std::string EMPTY_STRING;
-
-TestConfig globalTestConfig;
-
-void millisleep(int ms){
-    timespec ts;
-    ts.tv_sec=ms/1000;
-    ts.tv_nsec=(ms%1000)*1000000; // to nanoseconds
-    nanosleep(&ts,0);
-}

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.h
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.h 
b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.h
deleted file mode 100644
index 95f5420..0000000
--- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef UTIL_H_
-#define UTIL_H_
-
-#include <map>
-#include <vector>
-#include <string>
-
-// number of elements in array
-#define COUNTOF(array) sizeof(array)/sizeof(array[0])
-
-#define DECLARE_WRAPPER(ret,sym,sig) \
-    extern "C" ret __real_##sym sig; \
-    extern "C" ret __wrap_##sym sig
-
-#define CALL_REAL(sym,params) \
-    __real_##sym params
-
-// must include "src/zookeeper_log.h" to be able to use this macro
-#define TEST_TRACE(x) \
-    log_message(3,__LINE__,__func__,format_log_message x)
-
-extern const std::string EMPTY_STRING;
-
-// 
*****************************************************************************
-// A bit of wizardry to get to the bare type from a reference or a pointer 
-// to the type
-template <class T>
-struct TypeOp {
-    typedef T BareT;
-    typedef T ArgT;
-};
-
-// partial specialization for reference types
-template <class T>
-struct TypeOp<T&>{
-    typedef T& ArgT;
-    typedef typename TypeOp<T>::BareT BareT;
-};
-
-// partial specialization for pointers
-template <class T>
-struct TypeOp<T*>{
-    typedef T* ArgT;
-    typedef typename TypeOp<T>::BareT BareT;
-};
-
-// 
*****************************************************************************
-// Container utilities
-
-template <class K, class V>
-void putValue(std::map<K,V>& map,const K& k, const V& v){
-    typedef std::map<K,V> Map;
-    typename Map::const_iterator it=map.find(k);
-    if(it==map.end())
-        map.insert(typename Map::value_type(k,v));
-    else
-        map[k]=v;
-}
-
-template <class K, class V>
-bool getValue(const std::map<K,V>& map,const K& k,V& v){
-    typedef std::map<K,V> Map;
-    typename Map::const_iterator it=map.find(k);
-    if(it==map.end())
-        return false;
-    v=it->second;
-    return true;
-}
-
-// 
*****************************************************************************
-// misc utils
-
-// millisecond sleep
-void millisleep(int ms);
-// evaluate given predicate until it returns true or the timeout 
-// (in millis) has expired
-template<class Predicate>
-int ensureCondition(const Predicate& p,int timeout){
-    int elapsed=0;
-    while(!p() && elapsed<timeout){
-        millisleep(2);
-        elapsed+=2;
-    }
-    return elapsed;
-};
-
-// 
*****************************************************************************
-// test global configuration data 
-class TestConfig{
-    typedef std::vector<std::string> CmdLineOptList;
-public:
-    typedef CmdLineOptList::const_iterator const_iterator;
-    TestConfig(){}
-    ~TestConfig(){}
-    void addConfigFromCmdLine(int argc, char* argv[]){
-        if(argc>=2)
-            testName_=argv[1];
-        for(int i=2; i<argc;++i)
-            cmdOpts_.push_back(argv[i]);
-    }
-    const_iterator getExtraOptBegin() const {return cmdOpts_.begin();}
-    const_iterator getExtraOptEnd() const {return cmdOpts_.end();}
-    size_t getExtraOptCount() const {
-        return cmdOpts_.size();
-    }
-    const std::string& getTestName() const {
-        return testName_=="all"?EMPTY_STRING:testName_;
-    }
-private:
-    CmdLineOptList cmdOpts_;
-    std::string testName_;
-};
-
-extern TestConfig globalTestConfig;
-
-#endif /*UTIL_H_*/

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/zkServer.sh
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/zkServer.sh 
b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/zkServer.sh
deleted file mode 100755
index a22fd30..0000000
--- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/zkServer.sh
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-if [ "x$1" == "x" ]
-then
-       echo "USAGE: $0 startClean|start|stop hostPorts"
-       exit 2
-fi
-
-if [ "x$1" == "xstartClean" ]
-then
-       rm -rf /tmp/zkdata
-fi
-
-# Make sure nothing is left over from before
-if [ -r "/tmp/zk.pid" ]
-then
-pid=`cat /tmp/zk.pid`
-kill -9 $pid
-rm -f /tmp/zk.pid
-fi
-
-base_dir="../../../../.."
-
-CLASSPATH="$CLASSPATH:${base_dir}/build/classes"
-CLASSPATH="$CLASSPATH:${base_dir}/conf"
-
-for f in "${base_dir}"/zookeeper-*.jar
-do
-    CLASSPATH="$CLASSPATH:$f"
-done
-
-for i in "${base_dir}"/build/lib/*.jar
-do
-    CLASSPATH="$CLASSPATH:$i"
-done
-
-for i in "${base_dir}"/src/java/lib/*.jar
-do
-    CLASSPATH="$CLASSPATH:$i"
-done
-
-CLASSPATH="$CLASSPATH:${CLOVER_HOME}/lib/clover.jar"
-
-case $1 in
-start|startClean)
-       mkdir -p /tmp/zkdata
-       java -cp $CLASSPATH org.apache.zookeeper.server.ZooKeeperServerMain 
22181 /tmp/zkdata &> /tmp/zk.log &
-        echo $! > /tmp/zk.pid
-        sleep 5
-       ;;
-stop)
-       # Already killed above
-       ;;
-*)
-       echo "Unknown command " + $1
-       exit 2
-esac
-

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java
----------------------------------------------------------------------
diff --git 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java
 
b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java
deleted file mode 100644
index 1c21ad6..0000000
--- 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.zookeeper.recipes.lock;
-
-/**
- * This class has two methods which are call
- * back methods when a lock is acquired and 
- * when the lock is released.
- *
- */
-public interface LockListener {
-    /**
-     * call back called when the lock 
-     * is acquired
-     */
-    public void lockAcquired();
-    
-    /**
-     * call back called when the lock is 
-     * released.
-     */
-    public void lockReleased();
-}

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java
----------------------------------------------------------------------
diff --git 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java
 
b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java
deleted file mode 100644
index 4efdb85..0000000
--- 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.zookeeper.recipes.lock;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.ZooDefs;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.data.ACL;
-import org.apache.zookeeper.data.Stat;
-import org.apache.zookeeper.recipes.lock.ZooKeeperOperation;
-
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * A base class for protocol implementations which provides a number of higher 
- * level helper methods for working with ZooKeeper along with retrying 
synchronous
- *  operations if the connection to ZooKeeper closes such as 
- *  {@link #retryOperation(ZooKeeperOperation)}
- *
- */
-class ProtocolSupport {
-    private static final Logger LOG = 
LoggerFactory.getLogger(ProtocolSupport.class);
-
-    protected final ZooKeeper zookeeper;
-    private AtomicBoolean closed = new AtomicBoolean(false);
-    private long retryDelay = 500L;
-    private int retryCount = 10;
-    private List<ACL> acl = ZooDefs.Ids.OPEN_ACL_UNSAFE;
-
-    public ProtocolSupport(ZooKeeper zookeeper) {
-        this.zookeeper = zookeeper;
-    }
-
-    /**
-     * Closes this strategy and releases any ZooKeeper resources; but keeps the
-     *  ZooKeeper instance open
-     */
-    public void close() {
-        if (closed.compareAndSet(false, true)) {
-            doClose();
-        }
-    }
-    
-    /**
-     * return zookeeper client instance
-     * @return zookeeper client instance
-     */
-    public ZooKeeper getZookeeper() {
-        return zookeeper;
-    }
-
-    /**
-     * return the acl its using
-     * @return the acl.
-     */
-    public List<ACL> getAcl() {
-        return acl;
-    }
-
-    /**
-     * set the acl 
-     * @param acl the acl to set to
-     */
-    public void setAcl(List<ACL> acl) {
-        this.acl = acl;
-    }
-
-    /**
-     * get the retry delay in milliseconds
-     * @return the retry delay
-     */
-    public long getRetryDelay() {
-        return retryDelay;
-    }
-
-    /**
-     * Sets the time waited between retry delays
-     * @param retryDelay the retry delay
-     */
-    public void setRetryDelay(long retryDelay) {
-        this.retryDelay = retryDelay;
-    }
-
-    /**
-     * Allow derived classes to perform 
-     * some custom closing operations to release resources
-     */
-    protected void doClose() {
-    }
-
-
-    /**
-     * Perform the given operation, retrying if the connection fails
-     * @return object. it needs to be cast to the callee's expected 
-     * return type.
-     */
-    protected Object retryOperation(ZooKeeperOperation operation) 
-        throws KeeperException, InterruptedException {
-        KeeperException exception = null;
-        for (int i = 0; i < retryCount; i++) {
-            try {
-                return operation.execute();
-            } catch (KeeperException.SessionExpiredException e) {
-                LOG.warn("Session expired for: " + zookeeper + " so 
reconnecting due to: " + e, e);
-                throw e;
-            } catch (KeeperException.ConnectionLossException e) {
-                if (exception == null) {
-                    exception = e;
-                }
-                LOG.debug("Attempt " + i + " failed with connection loss so " +
-                               "attempting to reconnect: " + e, e);
-                retryDelay(i);
-            }
-        }
-        throw exception;
-    }
-
-    /**
-     * Ensures that the given path exists with no data, the current
-     * ACL and no flags
-     * @param path
-     */
-    protected void ensurePathExists(String path) {
-        ensureExists(path, null, acl, CreateMode.PERSISTENT);
-    }
-
-    /**
-     * Ensures that the given path exists with the given data, ACL and flags
-     * @param path
-     * @param acl
-     * @param flags
-     */
-    protected void ensureExists(final String path, final byte[] data,
-            final List<ACL> acl, final CreateMode flags) {
-        try {
-            retryOperation(new ZooKeeperOperation() {
-                public boolean execute() throws KeeperException, 
InterruptedException {
-                    Stat stat = zookeeper.exists(path, false);
-                    if (stat != null) {
-                        return true;
-                    }
-                    zookeeper.create(path, data, acl, flags);
-                    return true;
-                }
-            });
-        } catch (KeeperException e) {
-            LOG.warn("Caught: " + e, e);
-        } catch (InterruptedException e) {
-            LOG.warn("Caught: " + e, e);
-        }
-    }
-
-    /**
-     * Returns true if this protocol has been closed
-     * @return true if this protocol is closed
-     */
-    protected boolean isClosed() {
-        return closed.get();
-    }
-
-    /**
-     * Performs a retry delay if this is not the first attempt
-     * @param attemptCount the number of the attempts performed so far
-     */
-    protected void retryDelay(int attemptCount) {
-        if (attemptCount > 0) {
-            try {
-                Thread.sleep(attemptCount * retryDelay);
-            } catch (InterruptedException e) {
-                LOG.debug("Failed to sleep: " + e, e);
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java
----------------------------------------------------------------------
diff --git 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java
 
b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java
deleted file mode 100644
index 5caebee..0000000
--- 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.zookeeper.recipes.lock;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.data.ACL;
-import org.apache.zookeeper.data.Stat;
-
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * A <a href="package.html">protocol to implement an exclusive
- *  write lock or to elect a leader</a>. <p/> You invoke {@link #lock()} to 
- *  start the process of grabbing the lock; you may get the lock then or it 
may be 
- *  some time later. <p/> You can register a listener so that you are invoked 
- *  when you get the lock; otherwise you can ask if you have the lock
- *  by calling {@link #isOwner()}
- *
- */
-public class WriteLock extends ProtocolSupport {
-    private static final Logger LOG = LoggerFactory.getLogger(WriteLock.class);
-
-    private final String dir;
-    private String id;
-    private ZNodeName idName;
-    private String ownerId;
-    private String lastChildId;
-    private byte[] data = {0x12, 0x34};
-    private LockListener callback;
-    private LockZooKeeperOperation zop;
-    
-    /**
-     * zookeeper contructor for writelock
-     * @param zookeeper zookeeper client instance
-     * @param dir the parent path you want to use for locking
-     * @param acls the acls that you want to use for all the paths, 
-     * if null world read/write is used.
-     */
-    public WriteLock(ZooKeeper zookeeper, String dir, List<ACL> acl) {
-        super(zookeeper);
-        this.dir = dir;
-        if (acl != null) {
-            setAcl(acl);
-        }
-        this.zop = new LockZooKeeperOperation();
-    }
-    
-    /**
-     * zookeeper contructor for writelock with callback
-     * @param zookeeper the zookeeper client instance
-     * @param dir the parent path you want to use for locking
-     * @param acl the acls that you want to use for all the paths
-     * @param callback the call back instance
-     */
-    public WriteLock(ZooKeeper zookeeper, String dir, List<ACL> acl, 
-            LockListener callback) {
-        this(zookeeper, dir, acl);
-        this.callback = callback;
-    }
-
-    /**
-     * return the current locklistener
-     * @return the locklistener
-     */
-    public LockListener getLockListener() {
-        return this.callback;
-    }
-    
-    /**
-     * register a different call back listener
-     * @param callback the call back instance
-     */
-    public void setLockListener(LockListener callback) {
-        this.callback = callback;
-    }
-
-    /**
-     * Removes the lock or associated znode if 
-     * you no longer require the lock. this also 
-     * removes your request in the queue for locking
-     * in case you do not already hold the lock.
-     * @throws RuntimeException throws a runtime exception
-     * if it cannot connect to zookeeper.
-     */
-    public synchronized void unlock() throws RuntimeException {
-        
-        if (!isClosed() && id != null) {
-            // we don't need to retry this operation in the case of failure
-            // as ZK will remove ephemeral files and we don't wanna hang
-            // this process when closing if we cannot reconnect to ZK
-            try {
-                
-                ZooKeeperOperation zopdel = new ZooKeeperOperation() {
-                    public boolean execute() throws KeeperException,
-                        InterruptedException {
-                        zookeeper.delete(id, -1);   
-                        return Boolean.TRUE;
-                    }
-                };
-                zopdel.execute();
-            } catch (InterruptedException e) {
-                LOG.warn("Caught: " + e, e);
-                //set that we have been interrupted.
-               Thread.currentThread().interrupt();
-            } catch (KeeperException.NoNodeException e) {
-                // do nothing
-            } catch (KeeperException e) {
-                LOG.warn("Caught: " + e, e);
-                throw (RuntimeException) new RuntimeException(e.getMessage()).
-                    initCause(e);
-            }
-            finally {
-                if (callback != null) {
-                    callback.lockReleased();
-                }
-                id = null;
-            }
-        }
-    }
-    
-    /** 
-     * the watcher called on  
-     * getting watch while watching 
-     * my predecessor
-     */
-    private class LockWatcher implements Watcher {
-        public void process(WatchedEvent event) {
-            // lets either become the leader or watch the new/updated node
-            LOG.debug("Watcher fired on path: " + event.getPath() + " state: " 
+ 
-                    event.getState() + " type " + event.getType());
-            try {
-                lock();
-            } catch (Exception e) {
-                LOG.warn("Failed to acquire lock: " + e, e);
-            }
-        }
-    }
-    
-    /**
-     * a zoookeeper operation that is mainly responsible
-     * for all the magic required for locking.
-     */
-    private  class LockZooKeeperOperation implements ZooKeeperOperation {
-        
-        /** find if we have been created earler if not create our node
-         * 
-         * @param prefix the prefix node
-         * @param zookeeper teh zookeeper client
-         * @param dir the dir paretn
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-        private void findPrefixInChildren(String prefix, ZooKeeper zookeeper, 
String dir) 
-            throws KeeperException, InterruptedException {
-            List<String> names = zookeeper.getChildren(dir, false);
-            for (String name : names) {
-                if (name.startsWith(prefix)) {
-                    id = name;
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("Found id created last time: " + id);
-                    }
-                    break;
-                }
-            }
-            if (id == null) {
-                id = zookeeper.create(dir + "/" + prefix, data, 
-                        getAcl(), EPHEMERAL_SEQUENTIAL);
-
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("Created id: " + id);
-                }
-            }
-
-        }
-        
-        /**
-         * the command that is run and retried for actually 
-         * obtaining the lock
-         * @return if the command was successful or not
-         */
-        public boolean execute() throws KeeperException, InterruptedException {
-            do {
-                if (id == null) {
-                    long sessionId = zookeeper.getSessionId();
-                    String prefix = "x-" + sessionId + "-";
-                    // lets try look up the current ID if we failed 
-                    // in the middle of creating the znode
-                    findPrefixInChildren(prefix, zookeeper, dir);
-                    idName = new ZNodeName(id);
-                }
-                if (id != null) {
-                    List<String> names = zookeeper.getChildren(dir, false);
-                    if (names.isEmpty()) {
-                        LOG.warn("No children in: " + dir + " when we've just 
" +
-                        "created one! Lets recreate it...");
-                        // lets force the recreation of the id
-                        id = null;
-                    } else {
-                        // lets sort them explicitly (though they do seem to 
come back in order ususally :)
-                        SortedSet<ZNodeName> sortedNames = new 
TreeSet<ZNodeName>();
-                        for (String name : names) {
-                            sortedNames.add(new ZNodeName(dir + "/" + name));
-                        }
-                        ownerId = sortedNames.first().getName();
-                        SortedSet<ZNodeName> lessThanMe = 
sortedNames.headSet(idName);
-                        if (!lessThanMe.isEmpty()) {
-                            ZNodeName lastChildName = lessThanMe.last();
-                            lastChildId = lastChildName.getName();
-                            if (LOG.isDebugEnabled()) {
-                                LOG.debug("watching less than me node: " + 
lastChildId);
-                            }
-                            Stat stat = zookeeper.exists(lastChildId, new 
LockWatcher());
-                            if (stat != null) {
-                                return Boolean.FALSE;
-                            } else {
-                                LOG.warn("Could not find the" +
-                                               " stats for less than me: " + 
lastChildName.getName());
-                            }
-                        } else {
-                            if (isOwner()) {
-                                if (callback != null) {
-                                    callback.lockAcquired();
-                                }
-                                return Boolean.TRUE;
-                            }
-                        }
-                    }
-                }
-            }
-            while (id == null);
-            return Boolean.FALSE;
-        }
-    };
-
-    /**
-     * Attempts to acquire the exclusive write lock returning whether or not 
it was
-     * acquired. Note that the exclusive lock may be acquired some time later 
after
-     * this method has been invoked due to the current lock owner going away.
-     */
-    public synchronized boolean lock() throws KeeperException, 
InterruptedException {
-        if (isClosed()) {
-            return false;
-        }
-        ensurePathExists(dir);
-
-        return (Boolean) retryOperation(zop);
-    }
-
-    /**
-     * return the parent dir for lock
-     * @return the parent dir used for locks.
-     */
-    public String getDir() {
-        return dir;
-    }
-
-    /**
-     * Returns true if this node is the owner of the
-     *  lock (or the leader)
-     */
-    public boolean isOwner() {
-        return id != null && ownerId != null && id.equals(ownerId);
-    }
-
-    /**
-     * return the id for this lock
-     * @return the id for this lock
-     */
-    public String getId() {
-       return this.id;
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java
----------------------------------------------------------------------
diff --git 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java
 
b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java
deleted file mode 100644
index 2e32e59..0000000
--- 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.zookeeper.recipes.lock;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents an ephemeral znode name which has an ordered sequence number
- * and can be sorted in order
- *
- */
-class ZNodeName implements Comparable<ZNodeName> {
-    private final String name;
-    private String prefix;
-    private int sequence = -1;
-    private static final Logger LOG = LoggerFactory.getLogger(ZNodeName.class);
-    
-    public ZNodeName(String name) {
-        if (name == null) {
-            throw new NullPointerException("id cannot be null");
-        }
-        this.name = name;
-        this.prefix = name;
-        int idx = name.lastIndexOf('-');
-        if (idx >= 0) {
-            this.prefix = name.substring(0, idx);
-            try {
-                this.sequence = Integer.parseInt(name.substring(idx + 1));
-                // If an exception occurred we misdetected a sequence suffix,
-                // so return -1.
-            } catch (NumberFormatException e) {
-                LOG.info("Number format exception for " + idx, e);
-            } catch (ArrayIndexOutOfBoundsException e) {
-               LOG.info("Array out of bounds for " + idx, e);
-            }
-        }
-    }
-
-    @Override
-    public String toString() {
-        return name.toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ZNodeName sequence = (ZNodeName) o;
-
-        if (!name.equals(sequence.name)) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return name.hashCode() + 37;
-    }
-
-    /**
-     * Compare znodes based on their sequence number
-     * @param that other znode to compare to
-     * @return the difference between their sequence numbers: a positive value 
if this
-     *         znode has a larger sequence number, 0 if they have the same 
sequence number
-     *         or a negative number if this znode has a lower sequence number
-     */
-    public int compareTo(ZNodeName that) {
-        int answer = this.sequence - that.sequence;
-        if (answer == 0) {
-            return this.prefix.compareTo(that.prefix);
-        }
-        return answer;
-    }
-
-    /**
-     * Returns the name of the znode
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the sequence number
-     */
-    public int getZNodeName() {
-        return sequence;
-    }
-
-    /**
-     * Returns the text prefix before the sequence number
-     */
-    public String getPrefix() {
-        return prefix;
-    }
-}

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java
----------------------------------------------------------------------
diff --git 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java
 
b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java
deleted file mode 100644
index 54317ed..0000000
--- 
a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.zookeeper.recipes.lock;
-
-import org.apache.zookeeper.KeeperException;
-
-/**
- * A callback object which can be used for implementing retry-able operations 
in the 
- * {@link org.apache.zookeeper.recipes.lock.ProtocolSupport} class
- *
- */
-public interface ZooKeeperOperation {
-    
-    /**
-     * Performs the operation - which may be involved multiple times if the 
connection
-     * to ZooKeeper closes during this operation
-     *
-     * @return the result of the operation or null
-     * @throws KeeperException
-     * @throws InterruptedException
-     */
-    public boolean execute() throws KeeperException, InterruptedException;
-}

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL 
b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL
new file mode 100644
index 0000000..5458714
--- /dev/null
+++ b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL
@@ -0,0 +1,234 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006 Free Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about.  Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
+
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE 
b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2584625c/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am 
b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am
new file mode 100644
index 0000000..9b36b43
--- /dev/null
+++ b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include $(top_srcdir)/aminclude.am
+
+AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include 
-I${ZOOKEEPER_PATH}/generated \
+  -I$(top_srcdir)/include -I/usr/include 
+AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\
+  -I${top_srcdir}/include -I/usr/include
+EXTRA_DIST = LICENSE
+lib_LTLIBRARIES = libzoolock.la
+libzoolock_la_SOURCES = src/zoo_lock.c include/zoo_lock.h
+libzoolock_la_CPPFLAGS = -DDLOPEN_MODULE
+libzoolock_la_LDFLAGS = -version-info 0:1:0
+
+#run the tests now
+
+TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc 
+
+
+check_PROGRAMS = zklocktest
+nodist_zklocktest_SOURCES = ${TEST_SOURCES}
+zklocktest_LDADD =  ${ZOOKEEPER_LD} libzoolock.la -lpthread  ${CPPUNIT_LIBS}
+zklocktest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS}
+
+run-check: check
+       ./zklocktest ${TEST_OPTIONS}
+
+clean-local: clean-check
+       ${RM} ${DX_CLEANFILES}
+
+clean-check:
+       ${RM} ${nodist_zklocktest_OBJECTS} 

Reply via email to