Imported portableproplib-0.6.4.
This commit is contained in:
parent
a3f2898ea6
commit
cafbca06e7
4
3RDPARTY
4
3RDPARTY
@ -17,5 +17,5 @@ internal use in the code:
|
||||
|
||||
- libfetch-2.34 from NetBSD (pkgsrc/net/libfetch): lib/fetch
|
||||
|
||||
- portableproplib-0.6.3 (lib/portableproplib) from
|
||||
http://code.google.com/p/portableproplib
|
||||
- portableproplib-0.6.4 (lib/portableproplib) from
|
||||
https://github.com/xtraeme/portableproplib
|
||||
|
2
NEWS
2
NEWS
@ -1,5 +1,7 @@
|
||||
xbps-0.37 (???):
|
||||
|
||||
* Imported portable proplib 0.6.4 from https://github.com/xtraeme/portableproplib.
|
||||
|
||||
* Fixed a new issue with virtual packages, if a pkg provides a virtual package
|
||||
that is already installed but with lesser version, do not update to it
|
||||
unnecessarily (in some cases results in a crash).
|
||||
|
@ -15,7 +15,7 @@ LIBPROP_OBJS += portableproplib/prop_array_util.o portableproplib/prop_number.o
|
||||
LIBPROP_OBJS += portableproplib/prop_dictionary_util.o portableproplib/prop_zlib.o
|
||||
LIBPROP_OBJS += portableproplib/prop_data.o
|
||||
LIBPROP_CPPFLAGS = -D_GNU_SOURCE
|
||||
LIBPROP_CFLAGS = -Wno-old-style-definition -Wno-cast-qual -Wno-unused-parameter
|
||||
LIBPROP_CFLAGS = -Wno-old-style-definition -Wno-cast-qual -Wno-unused-parameter -Wno-unused-but-set-variable
|
||||
LIBPROP_CFLAGS += -fvisibility=hidden
|
||||
|
||||
# libfetch
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_array.c,v 1.20 2008/08/11 05:54:21 christos Exp $ */
|
||||
/* $NetBSD: prop_array.c,v 1.21 2012/07/27 09:10:59 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006, 2007 The NetBSD Foundation, Inc.
|
||||
@ -29,8 +29,9 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <prop/prop_array.h>
|
||||
#include "prop_object_impl.h"
|
||||
#include <prop/prop_array.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
struct _prop_array {
|
||||
@ -107,8 +108,6 @@ _prop_array_free(prop_stack_t stack, prop_object_t *obj)
|
||||
|
||||
return (_PROP_OBJECT_FREE_DONE);
|
||||
}
|
||||
if (pa->pa_array == NULL)
|
||||
return _PROP_OBJECT_FREE_DONE;
|
||||
|
||||
po = pa->pa_array[pa->pa_count - 1];
|
||||
_PROP_ASSERT(po != NULL);
|
||||
@ -337,7 +336,7 @@ static prop_object_t
|
||||
_prop_array_iterator_next_object(void *v)
|
||||
{
|
||||
struct _prop_array_iterator *pai = v;
|
||||
prop_array_t pa = pai->pai_base.pi_obj;
|
||||
prop_array_t pa _PROP_ARG_UNUSED = pai->pai_base.pi_obj;
|
||||
prop_object_t po;
|
||||
|
||||
_PROP_ASSERT(prop_object_is_array(pa));
|
||||
@ -364,7 +363,7 @@ static void
|
||||
_prop_array_iterator_reset(void *v)
|
||||
{
|
||||
struct _prop_array_iterator *pai = v;
|
||||
prop_array_t pa = pai->pai_base.pi_obj;
|
||||
prop_array_t pa _PROP_ARG_UNUSED = pai->pai_base.pi_obj;
|
||||
|
||||
_PROP_ASSERT(prop_object_is_array(pa));
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_array_util.c,v 1.2 2008/09/11 13:15:13 haad Exp $ */
|
||||
/* $NetBSD: prop_array_util.c,v 1.4 2012/07/27 09:10:59 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006 The NetBSD Foundation, Inc.
|
||||
@ -38,8 +38,8 @@
|
||||
* exactly what we're doing here.
|
||||
*/
|
||||
|
||||
#include "prop_object_impl.h" /* hide kernel vs. not-kernel vs. standalone */
|
||||
#include <prop/proplib.h>
|
||||
#include "prop_object_impl.h"
|
||||
|
||||
bool
|
||||
prop_array_get_bool(prop_array_t array,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_dictionary.c,v 1.37 2011/04/20 19:40:00 martin Exp $ */
|
||||
/* $NetBSD: prop_dictionary.c,v 1.39 2013/10/18 18:26:20 martin Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006, 2007 The NetBSD Foundation, Inc.
|
||||
@ -29,10 +29,10 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "prop_object_impl.h"
|
||||
#include <prop/prop_array.h>
|
||||
#include <prop/prop_dictionary.h>
|
||||
#include <prop/prop_string.h>
|
||||
#include "prop_object_impl.h"
|
||||
#include "prop_rb_impl.h"
|
||||
|
||||
#include <errno.h>
|
||||
@ -169,7 +169,7 @@ struct _prop_dictionary_iterator {
|
||||
|
||||
static int
|
||||
/*ARGSUSED*/
|
||||
_prop_dict_keysym_rb_compare_nodes(void *ctx,
|
||||
_prop_dict_keysym_rb_compare_nodes(void *ctx _PROP_ARG_UNUSED,
|
||||
const void *n1, const void *n2)
|
||||
{
|
||||
const struct _prop_dictionary_keysym *pdk1 = n1;
|
||||
@ -180,7 +180,7 @@ _prop_dict_keysym_rb_compare_nodes(void *ctx,
|
||||
|
||||
static int
|
||||
/*ARGSUSED*/
|
||||
_prop_dict_keysym_rb_compare_key(void *ctx,
|
||||
_prop_dict_keysym_rb_compare_key(void *ctx _PROP_ARG_UNUSED,
|
||||
const void *n, const void *v)
|
||||
{
|
||||
const struct _prop_dictionary_keysym *pdk = n;
|
||||
@ -278,10 +278,7 @@ _prop_dict_keysym_equals(prop_object_t v1, prop_object_t v2,
|
||||
static prop_dictionary_keysym_t
|
||||
_prop_dict_keysym_alloc(const char *key)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
prop_dictionary_keysym_t rpdk;
|
||||
#endif
|
||||
prop_dictionary_keysym_t opdk, pdk;
|
||||
prop_dictionary_keysym_t opdk, pdk, rpdk;
|
||||
size_t size;
|
||||
|
||||
_PROP_ONCE_RUN(_prop_dict_init_once, _prop_dict_init);
|
||||
@ -334,12 +331,10 @@ _prop_dict_keysym_alloc(const char *key)
|
||||
_prop_dict_keysym_put(pdk);
|
||||
return (opdk);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
rpdk = _prop_rb_tree_insert_node(&_prop_dict_keysym_tree, pdk);
|
||||
_PROP_ASSERT(rpdk == pdk);
|
||||
#endif
|
||||
_PROP_MUTEX_UNLOCK(_prop_dict_keysym_tree_mutex);
|
||||
return (pdk);
|
||||
return (rpdk);
|
||||
}
|
||||
|
||||
static _prop_object_free_rv_t
|
||||
@ -364,8 +359,6 @@ _prop_dictionary_free(prop_stack_t stack, prop_object_t *obj)
|
||||
|
||||
return (_PROP_OBJECT_FREE_DONE);
|
||||
}
|
||||
if (pd->pd_array == NULL)
|
||||
return _PROP_OBJECT_FREE_DONE;
|
||||
|
||||
po = pd->pd_array[pd->pd_count - 1].pde_objref;
|
||||
_PROP_ASSERT(po != NULL);
|
||||
@ -631,7 +624,7 @@ static prop_object_t
|
||||
_prop_dictionary_iterator_next_object(void *v)
|
||||
{
|
||||
struct _prop_dictionary_iterator *pdi = v;
|
||||
prop_dictionary_t pd = pdi->pdi_base.pi_obj;
|
||||
prop_dictionary_t pd _PROP_ARG_UNUSED = pdi->pdi_base.pi_obj;
|
||||
prop_dictionary_keysym_t pdk;
|
||||
|
||||
_PROP_ASSERT(prop_object_is_dictionary(pd));
|
||||
@ -658,7 +651,7 @@ static void
|
||||
_prop_dictionary_iterator_reset(void *v)
|
||||
{
|
||||
struct _prop_dictionary_iterator *pdi = v;
|
||||
prop_dictionary_t pd = pdi->pdi_base.pi_obj;
|
||||
prop_dictionary_t pd _PROP_ARG_UNUSED = pdi->pdi_base.pi_obj;
|
||||
|
||||
_PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
|
||||
_prop_dictionary_iterator_reset_locked(pdi);
|
||||
@ -1391,8 +1384,7 @@ prop_dictionary_externalize_to_file(prop_dictionary_t dict, const char *fname)
|
||||
xml = prop_dictionary_externalize(dict);
|
||||
if (xml == NULL)
|
||||
return (false);
|
||||
rv = _prop_object_externalize_write_file(fname, xml, strlen(xml),
|
||||
false);
|
||||
rv = _prop_object_externalize_write_file(fname, xml, strlen(xml), false);
|
||||
if (rv == false)
|
||||
save_errno = errno;
|
||||
_PROP_FREE(xml, M_TEMP);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_ingest.c,v 1.3 2008/04/28 20:22:53 martin Exp $ */
|
||||
/* $NetBSD: prop_ingest.c,v 1.4 2012/07/27 09:10:59 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006 The NetBSD Foundation, Inc.
|
||||
@ -29,8 +29,8 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <prop/proplib.h>
|
||||
#include "prop_object_impl.h"
|
||||
#include <prop/proplib.h>
|
||||
|
||||
struct _prop_ingest_context {
|
||||
prop_ingest_error_t pic_error;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_number.c,v 1.23 2010/09/24 22:51:52 rmind Exp $ */
|
||||
/* $NetBSD: prop_number.c,v 1.26 2014/03/26 18:12:46 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006 The NetBSD Foundation, Inc.
|
||||
@ -112,7 +112,7 @@ _prop_number_compare_values(const struct _prop_number_value *pnv1,
|
||||
|
||||
static int
|
||||
/*ARGSUSED*/
|
||||
_prop_number_rb_compare_nodes(void *ctx,
|
||||
_prop_number_rb_compare_nodes(void *ctx _PROP_ARG_UNUSED,
|
||||
const void *n1, const void *n2)
|
||||
{
|
||||
const struct _prop_number *pn1 = n1;
|
||||
@ -123,7 +123,8 @@ _prop_number_rb_compare_nodes(void *ctx,
|
||||
|
||||
static int
|
||||
/*ARGSUSED*/
|
||||
_prop_number_rb_compare_key(void *ctx, const void *n, const void *v)
|
||||
_prop_number_rb_compare_key(void *ctx _PROP_ARG_UNUSED,
|
||||
const void *n, const void *v)
|
||||
{
|
||||
const struct _prop_number *pn = n;
|
||||
const struct _prop_number_value *pnv = v;
|
||||
@ -187,15 +188,15 @@ _prop_number_externalize(struct _prop_object_externalize_context *ctx,
|
||||
char tmpstr[32];
|
||||
|
||||
/*
|
||||
* For the record:
|
||||
* the original NetBSD implementation used hexadecimal for unsigned
|
||||
* numbers, but in the portable proplib we changed it to be human
|
||||
* readable (base 10).
|
||||
* For unsigned numbers, we output in hex. For signed numbers,
|
||||
* we output in decimal.
|
||||
*/
|
||||
if (pn->pn_value.pnv_is_unsigned)
|
||||
sprintf(tmpstr, "%" PRIu64, pn->pn_value.pnv_unsigned);
|
||||
snprintf(tmpstr, sizeof(tmpstr), "%" PRIu64,
|
||||
pn->pn_value.pnv_unsigned);
|
||||
else
|
||||
sprintf(tmpstr, "%" PRIi64, pn->pn_value.pnv_signed);
|
||||
snprintf(tmpstr, sizeof(tmpstr), "%" PRIi64,
|
||||
pn->pn_value.pnv_signed);
|
||||
|
||||
if (_prop_object_externalize_start_tag(ctx, "integer") == false ||
|
||||
_prop_object_externalize_append_cstring(ctx, tmpstr) == false ||
|
||||
@ -264,10 +265,7 @@ _prop_number_equals(prop_object_t v1, prop_object_t v2,
|
||||
static prop_number_t
|
||||
_prop_number_alloc(const struct _prop_number_value *pnv)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
prop_number_t rpn;
|
||||
#endif
|
||||
prop_number_t opn, pn;
|
||||
prop_number_t opn, pn, rpn;
|
||||
|
||||
_PROP_ONCE_RUN(_prop_number_init_once, _prop_number_init);
|
||||
|
||||
@ -308,12 +306,10 @@ _prop_number_alloc(const struct _prop_number_value *pnv)
|
||||
_PROP_POOL_PUT(_prop_number_pool, pn);
|
||||
return (opn);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
rpn = _prop_rb_tree_insert_node(&_prop_number_tree, pn);
|
||||
_PROP_ASSERT(rpn == pn);
|
||||
#endif
|
||||
_PROP_MUTEX_UNLOCK(_prop_number_tree_mutex);
|
||||
return (pn);
|
||||
return (rpn);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_object.c,v 1.23 2008/11/30 00:17:07 haad Exp $ */
|
||||
/* $NetBSD: prop_object.c,v 1.29 2013/10/18 18:26:20 martin Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006, 2007 The NetBSD Foundation, Inc.
|
||||
@ -29,10 +29,16 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "compat.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <prop/prop_object.h>
|
||||
#include "prop_object_impl.h"
|
||||
#include <prop/prop_object.h>
|
||||
|
||||
#ifdef _PROP_NEED_REFCNT_MTX
|
||||
static pthread_mutex_t _prop_refcnt_mtx = PTHREAD_MUTEX_INITIALIZER;
|
||||
#endif /* _PROP_NEED_REFCNT_MTX */
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
@ -40,7 +46,6 @@
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
/*
|
||||
@ -63,7 +68,7 @@ _prop_object_init(struct _prop_object *po, const struct _prop_object_type *pot)
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
void
|
||||
_prop_object_fini(struct _prop_object *po)
|
||||
_prop_object_fini(struct _prop_object *po _PROP_ARG_UNUSED)
|
||||
{
|
||||
/* Nothing to do, currently. */
|
||||
}
|
||||
@ -252,10 +257,8 @@ _prop_object_externalize_footer(struct _prop_object_externalize_context *ctx)
|
||||
{
|
||||
|
||||
if (_prop_object_externalize_end_tag(ctx, "plist") == false ||
|
||||
_prop_object_externalize_append_char(ctx, '\0') == false) {
|
||||
free(ctx->poec_buf);
|
||||
_prop_object_externalize_append_char(ctx, '\0') == false)
|
||||
return (false);
|
||||
}
|
||||
|
||||
return (true);
|
||||
}
|
||||
@ -602,7 +605,7 @@ match_start:
|
||||
poi->poi_taglen))
|
||||
break;
|
||||
}
|
||||
if (poi == NULL) {
|
||||
if ((poi == NULL) || (poi->poi_tag == NULL)) {
|
||||
while (_prop_stack_pop(&stack, &obj, &iter, &data, NULL)) {
|
||||
iter_func = (prop_object_internalizer_continue_t)iter;
|
||||
(*iter_func)(&stack, &obj, ctx, data, NULL);
|
||||
@ -831,11 +834,14 @@ _prop_object_externalize_write_file(const char *fname, const char *xml,
|
||||
* and create the temporary file.
|
||||
*/
|
||||
_prop_object_externalize_file_dirname(fname, tname);
|
||||
|
||||
if (strlcat(tname, "/.plistXXXXXX", sizeof(tname)) >= sizeof(tname)) {
|
||||
#define PLISTTMP "/.plistXXXXXX"
|
||||
if (strlen(tname) + strlen(PLISTTMP) >= sizeof(tname)) {
|
||||
errno = ENAMETOOLONG;
|
||||
return (false);
|
||||
}
|
||||
strcat(tname, PLISTTMP);
|
||||
#undef PLISTTMP
|
||||
|
||||
if ((fd = mkstemp(tname)) == -1)
|
||||
return (false);
|
||||
|
||||
@ -869,6 +875,7 @@ _prop_object_externalize_write_file(const char *fname, const char *xml,
|
||||
(void)gzclose(gzf);
|
||||
else
|
||||
(void)close(fd);
|
||||
|
||||
fd = -1;
|
||||
|
||||
if (rename(tname, fname) == -1)
|
||||
@ -970,24 +977,6 @@ _prop_object_internalize_unmap_file(
|
||||
_PROP_FREE(mf, M_TEMP);
|
||||
}
|
||||
|
||||
/*
|
||||
* Retain / release serialization --
|
||||
*
|
||||
* Eventually we would like to use atomic operations. But until we have
|
||||
* an MI API for them that is common to userland and the kernel, we will
|
||||
* use a lock instead.
|
||||
*
|
||||
* We use a single global mutex for all serialization. In the kernel, because
|
||||
* we are still under a biglock, this will basically never contend (properties
|
||||
* cannot be manipulated at interrupt level). In userland, this will cost
|
||||
* nothing for single-threaded programs. For multi-threaded programs, there
|
||||
* could be contention, but it probably won't cost that much unless the program
|
||||
* makes heavy use of property lists.
|
||||
*/
|
||||
_PROP_MUTEX_DECL_STATIC(_prop_refcnt_mutex)
|
||||
#define _PROP_REFCNT_LOCK() _PROP_MUTEX_LOCK(_prop_refcnt_mutex)
|
||||
#define _PROP_REFCNT_UNLOCK() _PROP_MUTEX_UNLOCK(_prop_refcnt_mutex)
|
||||
|
||||
/*
|
||||
* prop_object_retain --
|
||||
* Increment the reference count on an object.
|
||||
@ -995,18 +984,11 @@ _PROP_MUTEX_DECL_STATIC(_prop_refcnt_mutex)
|
||||
void
|
||||
prop_object_retain(prop_object_t obj)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
uint32_t ocnt;
|
||||
#endif
|
||||
struct _prop_object *po = obj;
|
||||
uint32_t ncnt _PROP_ARG_UNUSED;
|
||||
|
||||
_PROP_REFCNT_LOCK();
|
||||
po->po_refcnt++;
|
||||
#ifdef DEBUG
|
||||
ocnt = po->po_refcnt;
|
||||
_PROP_ASSERT(ocnt != 0xffffffffU);
|
||||
#endif
|
||||
_PROP_REFCNT_UNLOCK();
|
||||
_PROP_ATOMIC_INC32_NV(&po->po_refcnt, ncnt);
|
||||
_PROP_ASSERT(ncnt != 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1036,11 +1018,11 @@ prop_object_release_emergency(prop_object_t obj)
|
||||
/* Save pointerto unlock function */
|
||||
unlock = po->po_type->pot_unlock;
|
||||
|
||||
_PROP_REFCNT_LOCK();
|
||||
ocnt = po->po_refcnt--;
|
||||
_PROP_REFCNT_UNLOCK();
|
||||
|
||||
/* Dance a bit to make sure we always get the non-racy ocnt */
|
||||
_PROP_ATOMIC_DEC32_NV(&po->po_refcnt, ocnt);
|
||||
ocnt++;
|
||||
_PROP_ASSERT(ocnt != 0);
|
||||
|
||||
if (ocnt != 1) {
|
||||
if (unlock != NULL)
|
||||
unlock();
|
||||
@ -1059,9 +1041,7 @@ prop_object_release_emergency(prop_object_t obj)
|
||||
unlock();
|
||||
|
||||
parent = po;
|
||||
_PROP_REFCNT_LOCK();
|
||||
++po->po_refcnt;
|
||||
_PROP_REFCNT_UNLOCK();
|
||||
_PROP_ATOMIC_INC32(&po->po_refcnt);
|
||||
}
|
||||
_PROP_ASSERT(parent);
|
||||
/* One object was just freed. */
|
||||
@ -1098,11 +1078,10 @@ prop_object_release(prop_object_t obj)
|
||||
/* Save pointer to object unlock function */
|
||||
unlock = po->po_type->pot_unlock;
|
||||
|
||||
_PROP_REFCNT_LOCK();
|
||||
ocnt = po->po_refcnt--;
|
||||
_PROP_REFCNT_UNLOCK();
|
||||
|
||||
_PROP_ATOMIC_DEC32_NV(&po->po_refcnt, ocnt);
|
||||
ocnt++;
|
||||
_PROP_ASSERT(ocnt != 0);
|
||||
|
||||
if (ocnt != 1) {
|
||||
ret = 0;
|
||||
if (unlock != NULL)
|
||||
@ -1118,9 +1097,7 @@ prop_object_release(prop_object_t obj)
|
||||
if (ret == _PROP_OBJECT_FREE_DONE)
|
||||
break;
|
||||
|
||||
_PROP_REFCNT_LOCK();
|
||||
++po->po_refcnt;
|
||||
_PROP_REFCNT_UNLOCK();
|
||||
_PROP_ATOMIC_INC32(&po->po_refcnt);
|
||||
} while (ret == _PROP_OBJECT_FREE_RECURSE);
|
||||
if (ret == _PROP_OBJECT_FREE_FAILED)
|
||||
prop_object_release_emergency(obj);
|
||||
@ -1187,6 +1164,7 @@ prop_object_equals_with_error(prop_object_t obj1, prop_object_t obj2,
|
||||
&stored_pointer1, &stored_pointer2))
|
||||
return true;
|
||||
po1 = obj1;
|
||||
po2 = obj2;
|
||||
goto continue_subtree;
|
||||
}
|
||||
_PROP_ASSERT(ret == _PROP_OBJECT_EQUALS_RECURSE);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_object_impl.h,v 1.30 2009/09/13 18:45:10 pooka Exp $ */
|
||||
/* $NetBSD: prop_object_impl.h,v 1.31 2012/07/27 09:10:59 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006 The NetBSD Foundation, Inc.
|
||||
@ -224,6 +224,15 @@ struct _prop_object_iterator {
|
||||
uint32_t pi_version;
|
||||
};
|
||||
|
||||
#define _PROP_NOTHREAD_ONCE_DECL(x) static bool x = false;
|
||||
#define _PROP_NOTHREAD_ONCE_RUN(x,f) \
|
||||
do { \
|
||||
if ((x) == false) { \
|
||||
f(); \
|
||||
x = true; \
|
||||
} \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
/*
|
||||
* proplib in user space...
|
||||
*/
|
||||
@ -246,6 +255,8 @@ struct _prop_object_iterator {
|
||||
|
||||
#define _PROP_POOL_INIT(p, s, d) static const size_t p = s;
|
||||
|
||||
#define _PROP_MALLOC_DEFINE(t, s, l) /* nothing */
|
||||
|
||||
/*
|
||||
* Use pthread mutexes everywhere else.
|
||||
*/
|
||||
@ -266,4 +277,39 @@ struct _prop_object_iterator {
|
||||
static pthread_once_t x = PTHREAD_ONCE_INIT;
|
||||
#define _PROP_ONCE_RUN(x,f) pthread_once(&(x),(void(*)(void))f)
|
||||
|
||||
#define _PROP_NEED_REFCNT_MTX
|
||||
|
||||
#define _PROP_ATOMIC_INC32(x) \
|
||||
do { \
|
||||
pthread_mutex_lock(&_prop_refcnt_mtx); \
|
||||
(*(x))++; \
|
||||
pthread_mutex_unlock(&_prop_refcnt_mtx); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define _PROP_ATOMIC_DEC32(x) \
|
||||
do { \
|
||||
pthread_mutex_lock(&_prop_refcnt_mtx); \
|
||||
(*(x))--; \
|
||||
pthread_mutex_unlock(&_prop_refcnt_mtx); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define _PROP_ATOMIC_INC32_NV(x, v) \
|
||||
do { \
|
||||
pthread_mutex_lock(&_prop_refcnt_mtx); \
|
||||
v = ++(*(x)); \
|
||||
pthread_mutex_unlock(&_prop_refcnt_mtx); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define _PROP_ATOMIC_DEC32_NV(x, v) \
|
||||
do { \
|
||||
pthread_mutex_lock(&_prop_refcnt_mtx); \
|
||||
v = --(*(x)); \
|
||||
pthread_mutex_unlock(&_prop_refcnt_mtx); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
/*
|
||||
* Language features.
|
||||
*/
|
||||
#define _PROP_ARG_UNUSED /* delete */
|
||||
|
||||
#endif /* _PROPLIB_PROP_OBJECT_IMPL_H_ */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prop_string.c,v 1.11 2008/08/03 04:00:12 thorpej Exp $ */
|
||||
/* $NetBSD: prop_string.c,v 1.12 2014/03/26 18:12:46 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2006 The NetBSD Foundation, Inc.
|
||||
@ -337,7 +337,7 @@ prop_string_append(prop_string_t dst, prop_string_t src)
|
||||
cp = _PROP_MALLOC(len + 1, M_PROP_STRING);
|
||||
if (cp == NULL)
|
||||
return (false);
|
||||
sprintf(cp, "%s%s", prop_string_contents(dst),
|
||||
snprintf(cp, len + 1, "%s%s", prop_string_contents(dst),
|
||||
prop_string_contents(src));
|
||||
ocp = dst->ps_mutable;
|
||||
dst->ps_mutable = cp;
|
||||
@ -371,7 +371,7 @@ prop_string_append_cstring(prop_string_t dst, const char *src)
|
||||
cp = _PROP_MALLOC(len + 1, M_PROP_STRING);
|
||||
if (cp == NULL)
|
||||
return (false);
|
||||
sprintf(cp, "%s%s", prop_string_contents(dst), src);
|
||||
snprintf(cp, len + 1, "%s%s", prop_string_contents(dst), src);
|
||||
ocp = dst->ps_mutable;
|
||||
dst->ps_mutable = cp;
|
||||
dst->ps_size = len;
|
||||
|
@ -69,7 +69,7 @@ rb_tree_init(struct rb_tree *rbt, const rb_tree_ops_t *ops)
|
||||
{
|
||||
|
||||
rbt->rbt_ops = ops;
|
||||
*((const struct rb_node **)&rbt->rbt_root) = RB_SENTINEL_NODE;
|
||||
rbt->rbt_root = RB_SENTINEL_NODE;
|
||||
RB_TAILQ_INIT(&rbt->rbt_nodes);
|
||||
#ifndef RBSMALL
|
||||
rbt->rbt_minmax[RB_DIR_LEFT] = rbt->rbt_root; /* minimum node */
|
||||
|
Loading…
Reference in New Issue
Block a user