summaryrefslogtreecommitdiff
path: root/common/lib
diff options
context:
space:
mode:
authorthorpej <thorpej@NetBSD.org>2006-07-05 20:29:28 +0000
committerthorpej <thorpej@NetBSD.org>2006-07-05 20:29:28 +0000
commit2f3beab89ee14e2beba963eb7cd2b77f2c386669 (patch)
tree8a6be090f91afd81aa3a679cf6a67d8f096eac85 /common/lib
parent202456461a23ea5d9d2264fd9aadb3d8805dd4f2 (diff)
Reduce the memory footprint for prop_bool_t objects significantly, taking
adavantage of the immutability of these objects: Statically allocate a TRUE object and a FALSE object, and simply return references to those objects for create and copy operations.
Diffstat (limited to 'common/lib')
-rw-r--r--common/lib/libprop/prop_bool.c60
1 files changed, 42 insertions, 18 deletions
diff --git a/common/lib/libprop/prop_bool.c b/common/lib/libprop/prop_bool.c
index bd3504dfb63..6281184f8ff 100644
--- a/common/lib/libprop/prop_bool.c
+++ b/common/lib/libprop/prop_bool.c
@@ -1,4 +1,4 @@
-/* $NetBSD: prop_bool.c,v 1.2 2006/05/18 03:05:19 thorpej Exp $ */
+/* $NetBSD: prop_bool.c,v 1.3 2006/07/05 20:29:28 thorpej Exp $ */
/*-
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -44,7 +44,11 @@ struct _prop_bool {
boolean_t pb_value;
};
-_PROP_POOL_INIT(_prop_bool_pool, sizeof(struct _prop_bool), "propbool")
+static struct _prop_bool _prop_bool_true;
+static struct _prop_bool _prop_bool_false;
+
+_PROP_MUTEX_DECL(_prop_bool_initialized_mutex)
+static boolean_t _prop_bool_initialized;
static void _prop_bool_free(void *);
static boolean_t _prop_bool_externalize(
@@ -66,7 +70,11 @@ static void
_prop_bool_free(void *v)
{
- _PROP_POOL_PUT(_prop_bool_pool, v);
+ /*
+ * This should never happen as we "leak" our initial reference
+ * count.
+ */
+ /* XXX forced assertion failure? */
}
static boolean_t
@@ -87,19 +95,38 @@ _prop_bool_equals(void *v1, void *v2)
_PROP_ASSERT(prop_object_is_bool(b1));
_PROP_ASSERT(prop_object_is_bool(b2));
- return (b1->pb_value == b2->pb_value);
+
+ /*
+ * Since we only ever allocate one true and one false,
+ * save ourselves a couple of memory operations.
+ */
+ return (b1 == b2);
}
static prop_bool_t
-_prop_bool_alloc(void)
+_prop_bool_alloc(boolean_t val)
{
prop_bool_t pb;
- pb = _PROP_POOL_GET(_prop_bool_pool);
- if (pb != NULL) {
- _prop_object_init(&pb->pb_obj, &_prop_object_type_bool);
+ if (! _prop_bool_initialized) {
+ _PROP_MUTEX_LOCK(_prop_bool_initialized_mutex);
+ if (! _prop_bool_initialized) {
+ _prop_object_init(&_prop_bool_true.pb_obj,
+ &_prop_object_type_bool);
+ _prop_bool_true.pb_value = TRUE;
+
+ _prop_object_init(&_prop_bool_false.pb_obj,
+ &_prop_object_type_bool);
+ _prop_bool_false.pb_value = FALSE;
+
+ _prop_bool_initialized = TRUE;
+ }
+ _PROP_MUTEX_UNLOCK(_prop_bool_initialized_mutex);
}
+ pb = val ? &_prop_bool_true : &_prop_bool_false;
+ prop_object_retain(pb);
+
return (pb);
}
@@ -111,12 +138,8 @@ _prop_bool_alloc(void)
prop_bool_t
prop_bool_create(boolean_t val)
{
- prop_bool_t pb;
- pb = _prop_bool_alloc();
- if (pb != NULL)
- pb->pb_value = val;
- return (pb);
+ return (_prop_bool_alloc(val));
}
/*
@@ -126,14 +149,15 @@ prop_bool_create(boolean_t val)
prop_bool_t
prop_bool_copy(prop_bool_t opb)
{
- prop_bool_t pb;
_PROP_ASSERT(prop_object_is_bool(opb));
- pb = _prop_bool_alloc();
- if (pb != NULL)
- pb->pb_value = opb->pb_value;
- return (pb);
+ /*
+ * Because we only ever allocate one true and one false, this
+ * can be reduced to a simple retain operation.
+ */
+ prop_object_retain(opb);
+ return (opb);
}
/*