Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: panic with LOCKDEBUG



On Tuesday 20 May 2008 02:59:00 Geoff Wing wrote:
> On Monday 2008-05-19 17:21 +0200, Christoph_Egger%gmx.de@localhost output:
> :On Monday 19 May 2008 15:32:42 Sverre Froyen wrote:
> :> Try the patch provided by Yamamoto Takashi in
> :> http://mail-index.netbsd.org/current-users/2008/05/13/msg002424.html
> :
> :This patch does not apply cleanly.
> :yamamoto: can you provide new version, please?
>
> Read the bit where it says:
>
>       "xtraeme, simonb, tron - is it ok to revert your recent changes?",
>
> then "update" prop_array.c and prop_dictionary.c to the versions he's
> diff'ing against before applying the patch.
>
> The kernel works fine for me, though I couldn't do a full build which
> had src/sys/arch/i386/stand (*/amd64/stand for you) in it.

I updated yamt's diff to apply cleanly against -current and it works fine for 
me.

Christoph
Index: prop_array.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_array.c,v
retrieving revision 1.16
diff -u -p -r1.16 prop_array.c
--- prop_array.c        7 May 2008 10:16:41 -0000       1.16
+++ prop_array.c        20 May 2008 08:58:58 -0000
@@ -62,6 +62,10 @@ static bool  _prop_array_equals(prop_obje
                                   void **, void **,
                                   prop_object_t *, prop_object_t *);
 static void    _prop_array_equals_finish(prop_object_t, prop_object_t);
+static prop_object_iterator_t _prop_array_iterator_locked(prop_array_t);
+static prop_object_t _prop_array_iterator_next_object_locked(void *);
+static void _prop_array_iterator_reset_locked(void *);
+
 
 static const struct _prop_object_type _prop_object_type_array = {
        .pot_type               =       PROP_TYPE_ARRAY,
@@ -160,14 +164,14 @@ _prop_array_externalize(struct _prop_obj
            _prop_object_externalize_append_char(ctx, '\n') == false)
                goto out;
 
-       pi = prop_array_iterator(pa);
+       pi = _prop_array_iterator_locked(pa);
        if (pi == NULL)
                goto out;
        
        ctx->poec_depth++;
        _PROP_ASSERT(ctx->poec_depth != 0);
 
-       while ((po = prop_object_iterator_next(pi)) != NULL) {
+       while ((po = _prop_array_iterator_next_object_locked(pi)) != NULL) {
                if ((*po->po_type->pot_extern)(ctx, po) == false) {
                        prop_object_iterator_release(pi);
                        goto out;
@@ -307,16 +311,13 @@ _prop_array_expand(prop_array_t pa, unsi
 }
 
 static prop_object_t
-_prop_array_iterator_next_object(void *v)
+_prop_array_iterator_next_object_locked(void *v)
 {
        struct _prop_array_iterator *pai = v;
        prop_array_t pa = pai->pai_base.pi_obj;
        prop_object_t po = NULL;
-       bool acquired;
 
        _PROP_ASSERT(prop_object_is_array(pa));
-       acquired = _PROP_RWLOCK_TRYRDLOCK(pa->pa_rwlock);
-       _PROP_RWLOCK_OWNED(pa->pa_rwlock);
 
        if (pa->pa_version != pai->pai_base.pi_version)
                goto out;       /* array changed during iteration */
@@ -330,29 +331,47 @@ _prop_array_iterator_next_object(void *v
        pai->pai_index++;
 
  out:
-       if (acquired) {
-               _PROP_RWLOCK_UNLOCK(pa->pa_rwlock);
-       }
        return (po);
 }
 
-static void
-_prop_array_iterator_reset(void *v)
+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;
-       bool acquired;
-
+       prop_object_t po;
+  
        _PROP_ASSERT(prop_object_is_array(pa));
-       acquired = _PROP_RWLOCK_TRYRDLOCK(pa->pa_rwlock);
-       _PROP_RWLOCK_OWNED(pa->pa_rwlock);
+  
+       _PROP_RWLOCK_RDLOCK(pa->pa_rwlock);
+       po = _prop_array_iterator_next_object_locked(pai);
+       _PROP_RWLOCK_UNLOCK(pa->pa_rwlock);
+       return (po);
+}
 
+static void
+_prop_array_iterator_reset_locked(void *v)
+{
+       struct _prop_array_iterator *pai = v;
+       prop_array_t pa = pai->pai_base.pi_obj;
+  
+       _PROP_ASSERT(prop_object_is_array(pa));
+  
        pai->pai_index = 0;
        pai->pai_base.pi_version = pa->pa_version;
+}
 
-       if (acquired) {
-               _PROP_RWLOCK_UNLOCK(pa->pa_rwlock);
-       }
+static void
+_prop_array_iterator_reset(void *v)
+{
+       struct _prop_array_iterator *pai = v;
+       prop_array_t pa = pai->pai_base.pi_obj;
+
+       _PROP_ASSERT(prop_object_is_array(pa));
+
+       _PROP_RWLOCK_RDLOCK(pa->pa_rwlock);
+       _prop_array_iterator_reset_locked(pai);
+       _PROP_RWLOCK_UNLOCK(pa->pa_rwlock);
 }
 
 /*
@@ -488,13 +507,8 @@ prop_array_ensure_capacity(prop_array_t 
        return (rv);
 }
 
-/*
- * prop_array_iterator --
- *     Return an iterator for the array.  The array is retained by
- *     the iterator.
- */
-prop_object_iterator_t
-prop_array_iterator(prop_array_t pa)
+static prop_object_iterator_t
+_prop_array_iterator_locked(prop_array_t pa)
 {
        struct _prop_array_iterator *pai;
 
@@ -508,14 +522,28 @@ prop_array_iterator(prop_array_t pa)
        pai->pai_base.pi_reset = _prop_array_iterator_reset;
        prop_object_retain(pa);
        pai->pai_base.pi_obj = pa;
-       _PROP_RWLOCK_RDLOCK(pa->pa_rwlock);
-       _prop_array_iterator_reset(pai);
-       _PROP_RWLOCK_UNLOCK(pa->pa_rwlock);
+       _prop_array_iterator_reset_locked(pai);
 
        return (&pai->pai_base);
 }
 
 /*
+ * prop_array_iterator --
+ *     Return an iterator for the array. The array is retained by
+ *     the iterator.
+ */
+prop_object_iterator_t
+prop_array_iterator(prop_array_t pa)
+{
+       prop_object_iterator_t pi;
+
+       _PROP_RWLOCK_RDLOCK(pa->pa_rwlock);
+       pi = _prop_array_iterator_locked(pa);
+       _PROP_RWLOCK_UNLOCK(pa->pa_rwlock);
+       return (pi);
+}
+
+/*
  * prop_array_make_immutable --
  *     Make the array immutable.
  */
Index: prop_dictionary.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_dictionary.c,v
retrieving revision 1.28
diff -u -p -r1.28 prop_dictionary.c
--- prop_dictionary.c   7 May 2008 10:16:41 -0000       1.28
+++ prop_dictionary.c   20 May 2008 08:58:58 -0000
@@ -113,6 +113,15 @@ static bool        _prop_dictionary_equals(prop
                                        void **, void **,
                                        prop_object_t *, prop_object_t *);
 static void    _prop_dictionary_equals_finish(prop_object_t, prop_object_t);
+static prop_object_iterator_t _prop_dictionary_iterator_locked(
+                                prop_dictionary_t);
+static prop_object_t _prop_dictionary_iterator_next_object_locked(void *);
+static prop_object_t _prop_dictionary_get_keysym(prop_dictionary_t,
+                                                 prop_dictionary_keysym_t,
+                                                 bool);
+static prop_object_t _prop_dictionary_get(prop_dictionary_t, const char *,
+                                          bool);
+
 
 static const struct _prop_object_type _prop_object_type_dictionary = {
        .pot_type               =       PROP_TYPE_DICTIONARY,
@@ -410,15 +419,15 @@ _prop_dictionary_externalize(struct _pro
            _prop_object_externalize_append_char(ctx, '\n') == false)
                goto out;
 
-       pi = prop_dictionary_iterator(pd);
+       pi = _prop_dictionary_iterator_locked(pd);
        if (pi == NULL)
                goto out;
        
        ctx->poec_depth++;
        _PROP_ASSERT(ctx->poec_depth != 0);
 
-       while ((pdk = prop_object_iterator_next(pi)) != NULL) {
-               po = prop_dictionary_get_keysym(pd, pdk);
+       while ((pdk = _prop_dictionary_iterator_next_object_locked(pi)) != 
NULL) {
+               po = _prop_dictionary_get_keysym(pd, pdk, true);
                if (po == NULL ||
                    _prop_object_externalize_start_tag(ctx, "key") == false ||
                    _prop_object_externalize_append_encoded_cstring(ctx,
@@ -566,16 +575,13 @@ _prop_dictionary_expand(prop_dictionary_
 }
 
 static prop_object_t
-_prop_dictionary_iterator_next_object(void *v)
+_prop_dictionary_iterator_next_object_locked(void *v)
 {
        struct _prop_dictionary_iterator *pdi = v;
        prop_dictionary_t pd = pdi->pdi_base.pi_obj;
        prop_dictionary_keysym_t pdk = NULL;
-       bool acquired;
 
        _PROP_ASSERT(prop_object_is_dictionary(pd));
-       acquired = _PROP_RWLOCK_TRYRDLOCK(pd->pd_rwlock);
-       _PROP_RWLOCK_OWNED(pd->pd_rwlock);
 
        if (pd->pd_version != pdi->pdi_base.pi_version)
                goto out;       /* dictionary changed during iteration */
@@ -589,29 +595,47 @@ _prop_dictionary_iterator_next_object(vo
        pdi->pdi_index++;
 
  out:
-       if (acquired) {
-               _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
-       }
        return (pdk);
 }
 
-static void
-_prop_dictionary_iterator_reset(void *v)
+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;
-       bool acquired;
+       prop_dictionary_keysym_t pdk;
 
        _PROP_ASSERT(prop_object_is_dictionary(pd));
-       acquired = _PROP_RWLOCK_TRYRDLOCK(pd->pd_rwlock);
-       _PROP_RWLOCK_OWNED(pd->pd_rwlock);
+
+       _PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
+       pdk = _prop_dictionary_iterator_next_object_locked(pdi);
+       _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
+       return (pdk);
+}
+
+static void
+_prop_dictionary_iterator_reset_locked(void *v)
+{
+       struct _prop_dictionary_iterator *pdi = v;
+       prop_dictionary_t pd = pdi->pdi_base.pi_obj;
+ 
+       _PROP_ASSERT(prop_object_is_dictionary(pd));
 
        pdi->pdi_index = 0;
        pdi->pdi_base.pi_version = pd->pd_version;
+}
 
-       if (acquired) {
-               _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
-       }
+static void
+_prop_dictionary_iterator_reset(void *v)
+{
+       struct _prop_dictionary_iterator *pdi = v;
+       prop_dictionary_t pd = pdi->pdi_base.pi_obj;
+
+       _PROP_ASSERT(prop_object_is_dictionary(pd));
+
+       _PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
+       _prop_dictionary_iterator_reset_locked(pdi);
+       _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
 }
 
 /*
@@ -751,13 +775,8 @@ prop_dictionary_ensure_capacity(prop_dic
        return (rv);
 }
 
-/*
- * prop_dictionary_iterator --
- *     Return an iterator for the dictionary.  The dictionary is retained by
- *     the iterator.
- */
-prop_object_iterator_t
-prop_dictionary_iterator(prop_dictionary_t pd)
+static prop_object_iterator_t
+_prop_dictionary_iterator_locked(prop_dictionary_t pd)
 {
        struct _prop_dictionary_iterator *pdi;
 
@@ -771,14 +790,28 @@ prop_dictionary_iterator(prop_dictionary
        pdi->pdi_base.pi_reset = _prop_dictionary_iterator_reset;
        prop_object_retain(pd);
        pdi->pdi_base.pi_obj = pd;
-       _PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
-       _prop_dictionary_iterator_reset(pdi);
-       _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
+       _prop_dictionary_iterator_reset_locked(pdi);
 
        return (&pdi->pdi_base);
 }
 
 /*
+ * prop_dictionary_iterator --
+ *     Return an iterator for the dictionary.  The dictionary is retained by
+ *     the iterator.
+ */
+prop_object_iterator_t
+prop_dictionary_iterator(prop_dictionary_t pd)
+{
+       prop_object_iterator_t pi;
+ 
+       _PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
+       pi = _prop_dictionary_iterator_locked(pd);
+       _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
+       return (pi);
+}
+
+/*
  * prop_dictionary_all_keys --
  *     Return an array containing a snapshot of all of the keys
  *     in the dictionary.
@@ -848,12 +881,8 @@ _prop_dict_lookup(prop_dictionary_t pd, 
        return (NULL);
 }
 
-/*
- * prop_dictionary_get --
- *     Return the object stored with specified key.
- */
-prop_object_t
-prop_dictionary_get(prop_dictionary_t pd, const char *key)
+static prop_object_t
+_prop_dictionary_get(prop_dictionary_t pd, const char *key, bool locked)
 {
        const struct _prop_dict_entry *pde;
        prop_object_t po = NULL;
@@ -861,29 +890,54 @@ prop_dictionary_get(prop_dictionary_t pd
        if (! prop_object_is_dictionary(pd))
                return (NULL);
 
-       _PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
+       if (!locked)
+               _PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
        pde = _prop_dict_lookup(pd, key, NULL);
        if (pde != NULL) {
                _PROP_ASSERT(pde->pde_objref != NULL);
                po = pde->pde_objref;
        }
-       _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
+       if (!locked)
+               _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
        return (po);
 }
 
 /*
- * prop_dictionary_get_keysym --
- *     Return the object stored at the location encoded by the keysym.
+ * prop_dictionary_get --
+ *     Return the object stored with specified key.
  */
 prop_object_t
-prop_dictionary_get_keysym(prop_dictionary_t pd, prop_dictionary_keysym_t pdk)
+prop_dictionary_get(prop_dictionary_t pd, const char *key)
 {
+       prop_object_t po;
+ 
+       _PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
+       po = _prop_dictionary_get(pd, key, true);
+       _PROP_RWLOCK_UNLOCK(pd->pd_rwlock);
+       return (po);
+}
 
+static prop_object_t
+_prop_dictionary_get_keysym(prop_dictionary_t pd, prop_dictionary_keysym_t pdk,
+    bool locked)
+{
+ 
        if (! (prop_object_is_dictionary(pd) &&
               prop_object_is_dictionary_keysym(pdk)))
                return (NULL);
+ 
+       return (_prop_dictionary_get(pd, pdk->pdk_key, locked));
+}
+
+/*
+ * prop_dictionary_get_keysym --
+ *     Return the object stored at the location encoded by the keysym.
+ */
+prop_object_t
+prop_dictionary_get_keysym(prop_dictionary_t pd, prop_dictionary_keysym_t pdk)
+{
 
-       return (prop_dictionary_get(pd, pdk->pdk_key));
+       return (_prop_dictionary_get_keysym(pd, pdk, false));
 }
 
 /*


Home | Main Index | Thread Index | Old Index