# HG changeset patch # User Francisco J Ballesteros # Date 1330096589 -3600 # Node ID 9d88846ae23b2463252b1b8aef48f968edb7e34d # Parent 1386cdce4771d4e0666ac42d115068e0c30ddda4 error: more debug help and stack resizing R=nixiedev CC=nix-dev http://codereview.appspot.com/5695053 diff -r 1386cdce4771 -r 9d88846ae23b sys/include/error.h --- a/sys/include/error.h Fri Feb 24 11:02:36 2012 +0100 +++ b/sys/include/error.h Fri Feb 24 16:16:29 2012 +0100 @@ -14,6 +14,7 @@ void errinit(int stack); void noerror(void); +int nerrors(void); void error(char* msg, ...); #define catcherror() setjmp((*__ep)->label[(*__ep)->nerr++]) extern Error** __ep; diff -r 1386cdce4771 -r 9d88846ae23b sys/man/2/error --- a/sys/man/2/error Fri Feb 24 11:02:36 2012 +0100 +++ b/sys/man/2/error Fri Feb 24 16:16:29 2012 +0100 @@ -19,6 +19,9 @@ .br .B void catcherror(void) +.br +.B +int nerrors(void) .SH DESCRIPTION These routiles are tools for error handling. .IR catcherror , @@ -46,6 +49,10 @@ function in the kernel. .I Error raises an error. If the argument is nil, the error string is unaltered. See the example. +.PP +.I Nerrors +returns the number of recovery points kept in the error stack. Useful to +perform debug checks to see if the stack depth is what it should be. .SH SOURCE .B /sys/src/liberror .SH EXAMPLE diff -r 1386cdce4771 -r 9d88846ae23b sys/src/liberror/error.c --- a/sys/src/liberror/error.c Fri Feb 24 11:02:36 2012 +0100 +++ b/sys/src/liberror/error.c Fri Feb 24 16:16:29 2012 +0100 @@ -18,11 +18,26 @@ e->nlabel = stack; } +int +nerrors(void) +{ + return (*__ep)->nerr; +} + void noerror(void) { - if((*__ep)->nerr > (*__ep)->nlabel - 3) - sysfatal("error stack about to overflow"); + Error *e; + + e = *__ep; + if(e->nerr > e->nlabel - 3){ + fprint(2, "error stack about to overflow. resizing"); + e->nlabel *= 2; + (*__ep) = realloc(e, sizeof(Error) + + sizeof(e->label)*(e->nlabel-1)); + if(*__ep == nil) + sysfatal("can't resize error stack: no memory"); + } if((*__ep)->nerr-- == 0) sysfatal("noerror w/o catcherror"); }