X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=test%2Ftest_shared_ptr.c;fp=test%2Ftest_shared_ptr.c;h=cff3ee0b52001222102959579381806d0d069263;hp=0000000000000000000000000000000000000000;hb=24a138f8cd6c4c2c47d5c8d9b8efd7b19173b600;hpb=acb4c79e77bc112eabfa1f6a82f58cda507f4427 diff --git a/test/test_shared_ptr.c b/test/test_shared_ptr.c new file mode 100644 index 0000000..cff3ee0 --- /dev/null +++ b/test/test_shared_ptr.c @@ -0,0 +1,96 @@ +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2010 Index Data + * See the file LICENSE for details. + */ + +/** + * \file test_shared_ptr.c + * \brief test shared pointer + */ + +#if HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include + +#define YAZ_SHPTR_TYPE(type) \ + struct type##_shptr \ + { \ + type ptr; \ + int ref; \ + YAZ_MUTEX mutex; \ + }; \ + typedef struct type##_shptr *type##_shptr_t; + +#define YAZ_SHPTR_INIT(p,n) { \ + p = xmalloc(sizeof(*p)); \ + p->ptr = n; \ + p->ref = 1; \ + p->mutex = 0; \ + yaz_mutex_create(&p->mutex); \ + } + +#define YAZ_SHPTR_INC(p) { \ + yaz_mutex_enter(p->mutex); \ + p->ref++; \ + yaz_mutex_leave(p->mutex); \ + } + +#define YAZ_SHPTR_DEC(p, destroy) { \ + yaz_mutex_enter(p->mutex); \ + if (--p->ref == 0) { \ + yaz_mutex_leave(p->mutex); \ + destroy(p->ptr); \ + yaz_mutex_destroy(&p->mutex); \ + xfree(p); \ + p = 0; \ + } else { \ + yaz_mutex_leave(p->mutex); \ + } \ + } + +YAZ_SHPTR_TYPE(WRBUF) + +static void test(void) +{ + WRBUF w = wrbuf_alloc(); + + WRBUF_shptr_t t = 0; + + YAZ_SHPTR_INIT(t, w); + YAZ_CHECK(t); + + YAZ_SHPTR_INC(t); + YAZ_CHECK(t); + + YAZ_SHPTR_DEC(t, wrbuf_destroy); + YAZ_CHECK(t); + + YAZ_SHPTR_DEC(t, wrbuf_destroy); + YAZ_CHECK(!t); +} + +int main (int argc, char **argv) +{ + YAZ_CHECK_INIT(argc, argv); + test(); + YAZ_CHECK_TERM; +} + + +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +