[asterisk-commits] russell: branch russell/iax_refcount r80293 - in /team/russell/iax_refcount: ...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Aug 22 12:20:42 CDT 2007
Author: russell
Date: Wed Aug 22 12:20:42 2007
New Revision: 80293
URL: http://svn.digium.com/view/asterisk?view=rev&rev=80293
Log:
Note that you can't hold the object lock when decreasing its reference count.
Also tweak some formatting and comments
Modified:
team/russell/iax_refcount/include/asterisk/astobj2.h
team/russell/iax_refcount/main/astobj2.c
Modified: team/russell/iax_refcount/include/asterisk/astobj2.h
URL: http://svn.digium.com/view/asterisk/team/russell/iax_refcount/include/asterisk/astobj2.h?view=diff&rev=80293&r1=80292&r2=80293
==============================================================================
--- team/russell/iax_refcount/include/asterisk/astobj2.h (original)
+++ team/russell/iax_refcount/include/asterisk/astobj2.h Wed Aug 22 12:20:42 2007
@@ -171,8 +171,13 @@
*
* Increase/decrease the reference counter according
* the value of delta.
+ *
* If the refcount goes to zero, the object is destroyed.
- * \note: if we know the pointer to an object, it is because we
+ *
+ * \note The object must not be locked by the caller of this function, as
+ * it is invalid to try to unlock it after releasing the reference.
+ *
+ * \note if we know the pointer to an object, it is because we
* have a reference count to it, so the only case when the object
* can go away is when we release our reference, and it is
* the last one in existence.
Modified: team/russell/iax_refcount/main/astobj2.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax_refcount/main/astobj2.c?view=diff&rev=80293&r1=80292&r2=80293
==============================================================================
--- team/russell/iax_refcount/main/astobj2.c (original)
+++ team/russell/iax_refcount/main/astobj2.c Wed Aug 22 12:20:42 2007
@@ -71,7 +71,8 @@
#else
#include <execinfo.h> /* for backtrace */
-void ao2_bt(void) {
+void ao2_bt(void)
+{
int c, i;
#define N1 20
void *addresses[N1];
@@ -99,9 +100,9 @@
return NULL;
}
- p = (struct astobj2 *)((char *)(user_data) - sizeof(struct astobj2));
+ p = (struct astobj2 *) ( (char *) user_data - sizeof(struct astobj2));
if (AO2_MAGIC != (p->priv_data.magic) ) {
- ast_verbose("----!!!!!--------- bad magic number 0x%x for %p\n", p->priv_data.magic, p);
+ ast_log(LOG_ERROR, "bad magic number 0x%x for %p\n", p->priv_data.magic, p);
p = NULL;
}
@@ -118,6 +119,7 @@
{
struct astobj2 *p = INTERNAL_OBJ(user_data);
if (p == NULL)
+ if (!p)
return -1;
ast_atomic_fetchadd_int(&ao2.total_locked, 1);
return ast_mutex_lock( &p->priv_data.lock );
@@ -137,9 +139,6 @@
*/
int ao2_ref(void *user_data, const int delta)
{
-#if 0
- ast_log(LOG_NOTICE, "Reference counter changed by %i\n", delta);
-#endif
int current_value;
int ret;
struct astobj2 *obj = INTERNAL_OBJ(user_data);
@@ -155,7 +154,7 @@
ret = ast_atomic_fetchadd_int( &obj->priv_data.ref_counter, delta );
ast_atomic_fetchadd_int(&ao2.total_refs, delta);
current_value = ret + delta;
- // ast_log(LOG_NOTICE, "refcount %d on object %p\n", current_value, user_data);
+
/* this case must never happen */
if (current_value < 0) {
ast_log(LOG_ERROR, "refcount %d on object %p\n", current_value, user_data);
@@ -163,18 +162,14 @@
}
if (current_value <= 0) { /* last reference, destroy the object */
- // ast_log(LOG_NOTICE, "refcount %d on object %p, we destroy the object\n", current_value, user_data);
-
if (obj->priv_data.destructor_fn != NULL)
obj->priv_data.destructor_fn(user_data);
- /* XXX should check if locked ? */
ast_mutex_destroy(&obj->priv_data.lock);
ast_atomic_fetchadd_int(&ao2.total_mem, - obj->priv_data.data_size);
/* for safety, zero-out the astobj2 header and also the
* first word of the user-data, which we make sure is always
- * allocated.
- */
+ * allocated. */
bzero(obj, sizeof(struct astobj2 *) + sizeof(void *) );
free(obj);
ast_atomic_fetchadd_int(&ao2.total_objects, -1);
@@ -192,16 +187,14 @@
/* allocation */
struct astobj2 *obj;
- // ast_verbose("ao2_alloc %d\n", data_size);
if (data_size < sizeof(void *))
data_size = sizeof(void *);
- obj = ast_calloc( 1, sizeof(struct astobj2) + data_size );
+ obj = ast_calloc(1, sizeof(*obj) + data_size);
if (obj == NULL)
return NULL;
- /* init */
ast_mutex_init(&obj->priv_data.lock);
obj->priv_data.magic = AO2_MAGIC;
obj->priv_data.data_size = data_size;
@@ -255,9 +248,14 @@
struct bucket buckets[0];
};
-/* it is convenient to have a hash function that always returns 0.
+/*!
+ * \brief always zero hash function
+ *
+ * it is convenient to have a hash function that always returns 0.
* This is basically used when we want to have a container that is
* a simple linked list.
+ *
+ * \returns 0
*/
static int hash_zero(const void *user_obj, const int flags)
{
More information about the asterisk-commits
mailing list