]> Zhao Yanbai Git Server - minix.git/commitdiff
introduce option to time assert()s
authorBen Gras <ben@minix3.org>
Thu, 23 Jun 2011 20:43:39 +0000 (22:43 +0200)
committerBen Gras <ben@minix3.org>
Fri, 24 Jun 2011 14:00:42 +0000 (16:00 +0200)
  . 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

common/include/timers.h
include/assert.h
kernel/arch/i386/exception.c
lib/libc/arch/i386/int64/div64.c

index 5b714ad5cb56a852834735e1fd1d8eb3b5bd4b12..1ecaf36aa309d891e5f30a5a1703e637b74e60f9 100644 (file)
@@ -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);        \
index 20f52d7f04aecca7f5a868657e567b7f89a69316..20445669121d04f424b653d79664051671e7d341 100644 (file)
 #include <minix/ansi.h>
 #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)
 #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 */
index 98c1edaf7aa13d966c0d99687685401069b3aecc..da1e6c8c87be7d3ca0f8eabdc346c6a94fa915a3 100644 (file)
@@ -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 */
index 4602e7c5b41bda315d38057b257d70b0e4154b0c..ad5b0064d26e3015595894b23ccfe55854922fc4 100644 (file)
@@ -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 */