diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-12-04 06:57:51 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-12-04 06:57:51 -0800 |
commit | aa279b849e8a4c5fc4eb3429ac38f71f81704b2d (patch) | |
tree | 6f434fa3137d25cd437d10c876c2878e72c78464 /eval.c | |
parent | 4a8722ce9fcbb66abe2bd304e5a4bad03d842821 (diff) | |
download | txr-aa279b849e8a4c5fc4eb3429ac38f71f81704b2d.tar.gz txr-aa279b849e8a4c5fc4eb3429ac38f71f81704b2d.tar.bz2 txr-aa279b849e8a4c5fc4eb3429ac38f71f81704b2d.zip |
prof: deal with overflowing mem counters.
* eval.c (op_prof): Deal with the cases when alloc_bytes_t
value cannot be converted to a val in a single call to
unum.
* lib.h (SIZEOF_ALLOC_BYTES_T): New macro.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 19 |
1 files changed, 17 insertions, 2 deletions
@@ -2696,9 +2696,24 @@ static val op_prof(val form, val env) alloc_bytes_t start_mlbytes = malloc_bytes; alloc_bytes_t start_gcbytes = gc_bytes; val result = eval_progn(rest(form), env, form); + alloc_bytes_t delta_mlbytes = malloc_bytes - start_mlbytes; + alloc_bytes_t delta_gcbytes = gc_bytes - start_gcbytes; +#if SIZEOF_ALLOC_BYTES_T > SIZEOF_PTR + val dmb = if3(delta_mlbytes <= (alloc_bytes_t) INT_PTR_MAX, + unum(delta_mlbytes), + logior(ash(unum(delta_mlbytes >> 32), num_fast(32)), + unum(delta_mlbytes & 0xFFFFFFFF))); + val dgc = if3(delta_gcbytes <= (alloc_bytes_t) INT_PTR_MAX, + unum(delta_gcbytes), + logior(ash(unum(delta_gcbytes >> 32), num_fast(32)), + unum(delta_gcbytes & 0xFFFFFFFF))); +#else + val dmb = unum(delta_mlbytes); + val dgc = unum(delta_gcbytes); +#endif + return list(result, - num(malloc_bytes - start_mlbytes), - num(gc_bytes - start_gcbytes), + dmb, dgc, trunc(mul(num(clock() - start_time), num_fast(1000)), num_fast(CLOCKS_PER_SEC)), nao); } |