From d1abe646a67a43d1a8eb78b00fda545e92dc7347 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Fri, 12 Apr 2013 10:55:51 +0200 Subject: [PATCH] infra: improve tatomic debugging --- kernel/brick_atomic.h | 22 ++++++++++++---------- kernel/mars.h | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/kernel/brick_atomic.h b/kernel/brick_atomic.h index 7e6411fe..4a225a00 100644 --- a/kernel/brick_atomic.h +++ b/kernel/brick_atomic.h @@ -24,8 +24,9 @@ typedef struct tatomic { typedef struct atomic_trace { #ifdef ATOMIC_DEBUGGING - atomic_t at_count; - short at_lines[ATOMIC_MAXTRACE]; + atomic_t at_count; + short at_lines[ATOMIC_MAXTRACE]; + const char *at_sources[ATOMIC_MAXTRACE]; #endif } atomic_trace_t; @@ -34,8 +35,9 @@ typedef struct atomic_trace { #define tatomic_trace(_at, _cmd) \ ({ \ int _index = atomic_add_return(1, &(_at)->at_count) - 1; \ - if (_index >= 0 && _index < ATOMIC_MAXTRACE) { \ + if (likely(_index >= 0 && _index < ATOMIC_MAXTRACE)) { \ (_at)->at_lines[_index] = __LINE__; \ + (_at)->at_sources[_index] = __BASE_FILE__; \ } \ _cmd; \ }) @@ -45,19 +47,19 @@ typedef struct atomic_trace { int __i; \ int __max = atomic_read(&(_at)->at_count); \ _MSG("at_count = %d\n", __max); \ - if (__max > ATOMIC_MAXTRACE) \ + if (unlikely(__max > ATOMIC_MAXTRACE)) \ __max = ATOMIC_MAXTRACE; \ for (__i = 0; __i < __max; __i++) { \ - _MSG("%2d %4d\n", __i, (_at)->at_lines[__i]); \ + _MSG("%2d %s:%d\n", __i, (_at)->at_sources[__i], (_at)->at_lines[__i]); \ } \ }) -#define _CHECK_TATOMIC(_at,_atom,OP,_minval) \ +#define _CHECK_TATOMIC(_at,_atom,OP,_minval,_fixval) \ do { \ if (BRICK_CHECKING) { \ int __test = atomic_read(&(_atom)->ta_atomic); \ - if (__test OP (_minval)) { \ - atomic_set(&(_atom)->ta_atomic, _minval); \ + if (unlikely(__test OP (_minval))) { \ + atomic_set(&(_atom)->ta_atomic, _fixval); \ BRICK_ERR("%d: tatomic " #_atom " " #OP " " #_minval " (%d)\n", __LINE__, __test); \ tatomic_out(_at, BRICK_DMP); \ } \ @@ -68,13 +70,13 @@ do { \ #define tatomic_trace(_at,_cmd) _cmd -#define _CHECK_TATOMIC(_at,_atom,OP,_minval) \ +#define _CHECK_TATOMIC(_at,_atom,OP,_minval,_fixval) \ _CHECK_ATOMIC(&(_atom)->ta_atomic, OP, _minval) #endif #define CHECK_TATOMIC(_at,_atom,_minval) \ - _CHECK_TATOMIC(_at, _atom, <, _minval) + _CHECK_TATOMIC(_at, _atom, <, _minval, _minval) #define tatomic_inc(at,a) tatomic_trace(at, atomic_inc(&(a)->ta_atomic)) #define tatomic_dec(at,a) tatomic_trace(at, atomic_dec(&(a)->ta_atomic)) diff --git a/kernel/mars.h b/kernel/mars.h index 0e73c73e..6c146c15 100644 --- a/kernel/mars.h +++ b/kernel/mars.h @@ -143,7 +143,7 @@ struct mref_object { if (unlikely(BRICK_CHECKING && (mref)->ref_initialized)) { \ MARS_ERR("mref %p is already initialized\n", (mref)); \ } \ - _CHECK_TATOMIC(&(mref)->ref_at, &(mref)->ref_count, !=, 0); \ + _CHECK_TATOMIC(&(mref)->ref_at, &(mref)->ref_count, !=, 0, 0); \ (mref)->ref_initialized = true; \ tatomic_inc(&(mref)->ref_at, &(mref)->ref_count); \ })