From: Ben Gras Date: Thu, 23 Jun 2011 20:43:39 +0000 (+0200) Subject: introduce option to time assert()s X-Git-Tag: v3.2.0~523 X-Git-Url: http://zhaoyanbai.com/repos/Bv9ARM.ch07.html?a=commitdiff_plain;h=e785381d4db68f890f68145309ba0a63bf1a0922;p=minix.git introduce option to time assert()s . remove a few asserts in the kernel and 64bi library that are not compatible with the timing code . change the TIME_BLOCKS code a little to work in-kernel --- diff --git a/common/include/timers.h b/common/include/timers.h index 5b714ad5c..1ecaf36aa 100644 --- a/common/include/timers.h +++ b/common/include/timers.h @@ -64,12 +64,11 @@ _PROTOTYPE( clock_t tmrs_settimer, (timer_t **tmrs, timer_t *tp, clock_t exp_time, tmr_func_t watchdog, clock_t *new_head) ); #define PRINT_STATS(cum_spenttime, cum_instances) { \ - if(ex64hi(cum_spenttime)) { printf(" ???\n"); } \ - printf("%s:%d,%lu,%lu,%lu,%d.%04d%%\n", \ - __FILE__, __LINE__, cum_instances, \ - div64u(cum_spenttime, cum_instances), \ - ex64lo(cum_spenttime), \ - perc/10000, perc%10000); \ + if(ex64hi(cum_spenttime)) { util_stacktrace(); printf(" ( ??? %lu %lu)\n", \ + ex64hi(cum_spenttime), ex64lo(cum_spenttime)); } \ + printf("%s:%d,%lu,%lu\n", \ + __FILE__, __LINE__, cum_instances, \ + ex64lo(cum_spenttime)); \ } #define RESET_STATS(starttime, cum_instances, cum_spenttime, cum_starttime) { \ @@ -83,7 +82,6 @@ _PROTOTYPE( clock_t tmrs_settimer, (timer_t **tmrs, timer_t *tp, static int _cum_instances; \ u64_t _next_cum_spent, _starttime, _endtime, _dt, _cum_dt; \ u32_t _dt_micros; \ - int perc; \ read_tsc_64(&_starttime); \ do { timed_code_block } while(0); \ read_tsc_64(&_endtime); \ @@ -99,7 +97,6 @@ _PROTOTYPE( clock_t tmrs_settimer, (timer_t **tmrs, timer_t *tp, _cum_spenttime = add64(_cum_spenttime, _dt); \ _cum_instances++; \ _cum_dt = sub64(_endtime, _cum_starttime); \ - perc=ex64lo(div64(mul64(_cum_spenttime,make64(1000000,0)), _cum_dt)); \ if(cmp64(_cum_dt, make64(0, 120)) > 0) { \ PRINT_STATS(_cum_spenttime, _cum_instances); \ RESET_STATS(_starttime, _cum_instances, _cum_spenttime, _cum_starttime); \ diff --git a/include/assert.h b/include/assert.h index 20f52d7f0..204456691 100644 --- a/include/assert.h +++ b/include/assert.h @@ -19,6 +19,12 @@ #include #endif +#if TIME_ASSERTS +#define _ASSERT_EVALUATE(st) do { TIME_BLOCK(st); } while(0) +#else +#define _ASSERT_EVALUATE(st) do { st } while(0) +#endif + #ifdef NDEBUG /* Debugging disabled -- do not evaluate assertions. */ #define assert(expr) ((void) 0) @@ -29,10 +35,11 @@ #define __xstr(x) __makestr(x) _PROTOTYPE( void __bad_assertion, (const char *_mess) ); -#define assert(expr) ((expr)? (void)0 : \ - __bad_assertion("Assertion \"" #expr \ - "\" failed, file " __xstr(__FILE__) \ - ", line " __xstr(__LINE__) "\n")) +#define assert(expr) do { int _av; \ + _ASSERT_EVALUATE(_av = !!(expr);); \ + if(!_av) { \ + __bad_assertion("Assertion \"" #expr "\" failed, file " __xstr(__FILE__) ", line " __xstr(__LINE__) "\n"); \ + } } while(0) #else #define assert(expr) ((void) ((expr) ? 0 : __assert( __FILE__, __LINE__))) #endif /* _ANSI */ diff --git a/kernel/arch/i386/exception.c b/kernel/arch/i386/exception.c index 98c1edaf7..da1e6c8c8 100644 --- a/kernel/arch/i386/exception.c +++ b/kernel/arch/i386/exception.c @@ -24,8 +24,6 @@ PRIVATE void pagefault( struct proc *pr, message m_pagefault; int err; - assert(frame); - pagefaultcr2 = read_cr2(); #if 0 @@ -33,10 +31,6 @@ PRIVATE void pagefault( struct proc *pr, pr->p_endpoint, pagefaultcr2, pr->p_seg.p_cr3, read_cr3()); #endif - if(pr->p_seg.p_cr3) { - assert(pr->p_seg.p_cr3 == read_cr3()); - } - in_physcopy = (frame->eip > (vir_bytes) phys_copy) && (frame->eip < (vir_bytes) phys_copy_fault); @@ -81,8 +75,6 @@ PRIVATE void pagefault( struct proc *pr, } /* Don't schedule this process until pagefault is handled. */ - assert(pr->p_seg.p_cr3 == read_cr3()); - assert(!RTS_ISSET(pr, RTS_PAGEFAULT)); RTS_SET(pr, RTS_PAGEFAULT); /* tell Vm about the pagefault */ diff --git a/lib/libc/arch/i386/int64/div64.c b/lib/libc/arch/i386/int64/div64.c index 4602e7c5b..ad5b0064d 100644 --- a/lib/libc/arch/i386/int64/div64.c +++ b/lib/libc/arch/i386/int64/div64.c @@ -26,11 +26,6 @@ static u64_t divrem64(u64_t *i, u64_t j) u64_t result = { 0, 0 }; unsigned shift; - assert(i); - - /* this function is not suitable for small divisors */ - assert(ex64hi(j) != 0); - /* as long as i >= j we work on reducing i */ while (cmp64(*i, j) >= 0) { /* shift to obtain the 32 most significant bits */