Ignore:
Timestamp:
Jul 20, 2018 7:21:32 AM (6 years ago)
Author:
nanang
Message:

Fix #2129: Updated pj_grp_lock_dump() to avoid infinite recursion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/lock.c

    r4992 r5829  
    557557    } 
    558558    pj_assert(cnt > 0); 
    559     pj_grp_lock_dump(glock); 
    560     return PJ_SUCCESS; 
     559    return PJ_SUCCESS; 
     560} 
     561 
     562static pj_status_t grp_lock_dec_ref_dump(pj_grp_lock_t *glock) 
     563{ 
     564    pj_status_t status; 
     565 
     566    status = grp_lock_dec_ref(glock); 
     567    if (status == PJ_SUCCESS) { 
     568        pj_grp_lock_dump(glock); 
     569    } else if (status == PJ_EGONE) { 
     570        PJ_LOG(4,(THIS_FILE, "Group lock %p destroyed.", glock)); 
     571    } 
     572 
     573    return status; 
    561574} 
    562575 
     
    600613{ 
    601614    grp_lock_ref *ref; 
     615 
     616    PJ_UNUSED_ARG(line); 
    602617 
    603618    pj_enter_critical_section(); 
     
    619634    } 
    620635 
    621     return grp_lock_dec_ref(glock); 
     636    return grp_lock_dec_ref_dump(glock); 
    622637} 
    623638#else 
     
    696711{ 
    697712#if PJ_GRP_LOCK_DEBUG 
    698     grp_lock_ref *ref = grp_lock->ref_list.next; 
     713    grp_lock_ref *ref; 
    699714    char info_buf[1000]; 
    700715    pj_str_t info; 
     
    703718    info.slen = 0; 
    704719 
    705     pj_grp_lock_acquire(grp_lock); 
     720    grp_lock_add_ref(grp_lock); 
    706721    pj_enter_critical_section(); 
    707722 
     723    ref = grp_lock->ref_list.next; 
    708724    while (ref != &grp_lock->ref_list && info.slen < sizeof(info_buf)) { 
    709725        char *start = info.ptr + info.slen; 
     
    711727        int len; 
    712728 
    713         len = pj_ansi_snprintf(start, max_len, "%s:%d ", ref->file, ref->line); 
     729        len = pj_ansi_snprintf(start, max_len, "\t%s:%d\n", ref->file, ref->line); 
    714730        if (len < 1 || len >= max_len) { 
    715731            len = strlen(ref->file); 
     
    718734 
    719735            memcpy(start, ref->file, len); 
    720             start[len++] = ' '; 
     736            start[len++] = '\n'; 
    721737        } 
    722738 
     
    734750 
    735751    pj_leave_critical_section(); 
    736     pj_grp_lock_release(grp_lock); 
    737  
    738     PJ_LOG(4,(THIS_FILE, "Group lock %p, ref_cnt=%d. Reference holders: %s", 
    739                grp_lock, pj_grp_lock_get_ref(grp_lock), info.ptr)); 
     752 
     753    PJ_LOG(4,(THIS_FILE, "Group lock %p, ref_cnt=%d. Reference holders:\n%s", 
     754               grp_lock, pj_grp_lock_get_ref(grp_lock)-1, info.ptr)); 
     755 
     756    grp_lock_dec_ref(grp_lock); 
    740757#else 
    741     PJ_UNUSED_ARG(grp_lock); 
     758    PJ_LOG(4,(THIS_FILE, "Group lock %p, ref_cnt=%d.", 
     759               grp_lock, pj_grp_lock_get_ref(grp_lock))); 
    742760#endif 
    743761} 
Note: See TracChangeset for help on using the changeset viewer.