test_soap1 test_soap2 test_odrstack test_log_thread test_xmlquery test_pquery \
test_comstack test_filepath test_record_conv test_retrieval test_tpath \
test_timing test_query_charset test_oid test_icu test_match_glob \
- test_rpn2cql test_json test_xml_include test_file_glob
+ test_rpn2cql test_json test_xml_include test_file_glob test_shared_ptr
check_SCRIPTS = tstmarc.sh tstmarccol.sh tstcql2xcql.sh tstcql2pqf.sh tsticu.sh
test_json_SOURCES = test_json.c
test_xml_include_SOURCES = test_xml_include.c
test_file_glob_SOURCES = test_file_glob.c
+test_shared_ptr_SOURCES = test_shared_ptr.c
--- /dev/null
+/* 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 <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/mutex.h>
+#include <yaz/wrbuf.h>
+#include <yaz/test.h>
+
+#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
+ */
+