static void reproduce_double_free_error(void) { libcouchbase_error_t err; struct rvbuf rv; const char *key = "test_compare_and_swap_async_", *val = "{\"bar\" => 1}"; libcouchbase_size_t nkey = strlen(key), nval = strlen(val); /* prefill the bucket */ (void)libcouchbase_set_storage_callback(session, store_callback1); err = libcouchbase_store(session, &rv, LIBCOUCHBASE_SET, key, nkey, val, nval, 0, 0, 0); assert(err == LIBCOUCHBASE_SUCCESS); io->run_event_loop(io); assert(rv.error == LIBCOUCHBASE_SUCCESS); /* run exercise * * 1. get the value and its cas * 2. atomic set new value using old cas */ (void)libcouchbase_set_storage_callback(session, store_callback2); (void)libcouchbase_set_get_callback(session, get_callback); err = libcouchbase_mget(session, &rv, 1, (const void * const *)&key, &nkey, NULL); assert(err == LIBCOUCHBASE_SUCCESS); rv.cas1 = rv.cas2 = 0; io->run_event_loop(io); assert(rv.error == LIBCOUCHBASE_SUCCESS); assert(rv.cas1 > 0); assert(rv.cas2 > 0); assert(rv.cas1 != rv.cas2); }
static apr_status_t _couchbase_reslist_get_connection(void **conn_, void *params, apr_pool_t *pool) { mapcache_cache_couchbase *cache = (mapcache_cache_couchbase*)params; libcouchbase_t *instance = apr_pcalloc(pool,sizeof(libcouchbase_t)); const char *host = cache->host; const char *username = cache->username; const char *passwd = cache->password; const char *bucket = "default"; *instance = libcouchbase_create(host, username, passwd, bucket, NULL); if (*instance == NULL) { return APR_EGENERAL; } libcouchbase_set_error_callback(*instance, _couchbase_error_callback); libcouchbase_set_get_callback(*instance, _couchbase_get_callback); libcouchbase_set_storage_callback(*instance, _couchbase_store_callback); if (libcouchbase_connect(*instance) != LIBCOUCHBASE_SUCCESS) { return APR_EGENERAL; } /* Wait for the connect to compelete */ libcouchbase_wait(*instance); *conn_ = instance; return APR_SUCCESS; }