[Beignet] [PATCH] Delete the printing of dynamic statistics line.

Zhigang Gong zhigang.gong at linux.intel.com
Sun Apr 20 18:21:51 PDT 2014


LGTM, pushed, Thanks.

On Tue, Apr 08, 2014 at 10:53:40AM +0800, Yi Sun wrote:
> From: Sun, Yi <yi.sun at intel.com>
> 
> summary:
> ---------------------
>   1. Delete the printing of dynamic statistics line.
>   2. Add function to catch signals(like CTRL+C,core dumped ...),
>      if caught, reminder user the signal name.
>      core dumped example:
> ...
> displacement_map_element()    [SUCCESS]
> compiler_clod()    Interrupt signal (SIGSEGV) received.
> summary:
> ----------
>   total: 657
>   run: 297
>   pass: 271
>   fail: 26
>   pass rate: 0.960426
> 
>     Signed-off-by: Yi Sun <yi.sun at intel.com>
>     Signed-off-by: Yangwei Shui <yangweix.shui at intel.com>
> 
> diff --git a/utests/utest.cpp b/utests/utest.cpp
> index e747309..b491cae 100644
> --- a/utests/utest.cpp
> +++ b/utests/utest.cpp
> @@ -29,8 +29,14 @@
>  #include <sys/ioctl.h>
>  #include <unistd.h>
>  #include <cstring>
> +#include <stdlib.h>
> +#include <csignal>
>  
> -#define MAX_SUM_LINE 256
> +struct signalMap
> +{
> +  const char* signalName;
> +  int signalNum;
> +};
>  
>  using namespace std;
>  vector<UTest> *UTest::utestList = NULL;
> @@ -38,7 +44,7 @@ vector<UTest> *UTest::utestList = NULL;
>  RStatistics UTest::retStatistics;
>  
>  void releaseUTestList(void) { delete UTest::utestList; }
> -void runAllNoIssueAtExit(void) {
> +void runSummaryAtExit(void) {
>    // If case crashes, count it as fail, and accumulate finishrun
>    if(UTest::retStatistics.finishrun != UTest::utestList->size()) {
>      UTest::retStatistics.finishrun++;
> @@ -50,64 +56,86 @@ void runAllNoIssueAtExit(void) {
>    printf("  pass: %zu\n",UTest::retStatistics.passCount);
>    printf("  fail: %zu\n",UTest::retStatistics.failCount);
>    printf("  pass rate: %f\n",1-(float)UTest::retStatistics.failCount/(float)UTest::utestList->size());
> +
> +  releaseUTestList();
> +}
> +
> +void signalHandler( int signum )
> +{
> +  const char* name = NULL;
> +
> +  signalMap arr[] = {
> +    {"SIGILL",  SIGILL},
> +    {"SIGFPE",  SIGFPE},
> +    {"SIGABRT", SIGABRT},
> +    {"SIGBUS",  SIGBUS},
> +    {"SIGSEGV", SIGSEGV},
> +    {"SIGHUP",  SIGHUP},
> +    {"SIGINT",  SIGINT},
> +    {"SIGQUIT", SIGQUIT},
> +    {"SIGTERM", SIGTERM},
> +    {NULL,      -1}
> +  };
> +
> +  for(int i=0; arr[i].signalNum != -1 && arr[i].signalName != NULL; i++) {
> +    if(arr[i].signalNum == signum)
> +
> +      name = arr[i].signalName;
>    }
>  
> +  printf("    Interrupt signal (%s) received.", name);
> +
> +  exit(signum);
> +}
> +
> +void catch_signal(void){
> +  struct sigaction sa;
> +  int sigs[] = {
> +    SIGILL, SIGFPE, SIGABRT, SIGBUS,
> +    SIGSEGV, SIGHUP, SIGINT, SIGQUIT,
> +    SIGTERM
> +  };
> +
> +  sa.sa_handler = signalHandler;
> +  sigemptyset(&sa.sa_mask);
> +  sa.sa_flags = SA_RESETHAND;
> +
> +  for(unsigned int i = 0; i < sizeof(sigs)/sizeof(sigs[0]); ++i) {
> +    if (sigaction(sigs[i], &sa, NULL) == -1)
> +      perror("Could not set signal handler");
> +  }
> +}
> +
>  UTest::UTest(Function fn, const char *name, bool haveIssue, bool needDestroyProgram)
>         : fn(fn), name(name), haveIssue(haveIssue), needDestroyProgram(needDestroyProgram) {
>  
>    if (utestList == NULL) {
>      utestList = new vector<UTest>;
> -    atexit(releaseUTestList);
> +
> +    catch_signal();
> +    atexit(runSummaryAtExit);
>    }
>    utestList->push_back(*this);
>  }
>  
> +
>  static bool strequal(const char *s1, const char *s2) {
>    if (strcmp(s1, s2) == 0) return true;
>    return false;
>  }
>  
>  void UTest::do_run(struct UTest utest){
> -  // winsize is a struct in ioctl.h, contains terminal column number
> -  struct winsize size;
> -  char spaceList[MAX_SUM_LINE] = {0};
> -
> -  //Obtain terminal column size
> -  ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);
> -
> -  //A string contain MAX_SUM_LINE spaces, to hide the statistic line in stdout
> -  for (size_t j = 0; j < size.ws_col; j++){
> -    if ( j >= MAX_SUM_LINE - 1 )  break;
> -    spaceList[j] = ' ';
> -    spaceList[j+1] = '\0';
> -  }
> -  printf("\r%s\r%s()", spaceList, utest.name);
> +  // Print function name
> +  printf("%s()", utest.name);
> +  fflush(stdout);
>  
> -  // Run one case in utestList
> +  // Run one case in utestList, print result [SUCCESS] or [FAILED]
>    (utest.fn)();
> -
> -  // Print dynamic statistics line
> -  sprintf(spaceList, "\n [run/total: %zu/%zu]\
> -    pass: %zu; fail: %zu; pass rate: %f\r",
> -    retStatistics.finishrun+1, utestList->size(),
> -    retStatistics.passCount,
> -    retStatistics.failCount,
> -    1-(float)retStatistics.failCount/(float)utestList->size());
> -
> -  // If terminal column size lower than length of statistic line, print nothing, If not, print the statistics line
> -  if (size.ws_col > strlen(spaceList))
> -    printf("%s", spaceList);
> -  else
> -    printf("\n");
> -
> -  // Refresh console
> -  fflush(stdout);
>  }
>  
>  void UTest::run(const char *name) {
>    if (name == NULL) return;
>    if (utestList == NULL) return;
> -  atexit(runAllNoIssueAtExit);
>  
>    for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) {
>      const UTest &utest = (*utestList)[retStatistics.finishrun];
> @@ -122,7 +150,6 @@ void UTest::run(const char *name) {
>  
>  void UTest::runAll(void) {
>    if (utestList == NULL) return;
> -  atexit(runAllNoIssueAtExit);
>  
>    for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) {
>      const UTest &utest = (*utestList)[retStatistics.finishrun];
> @@ -135,7 +162,6 @@ void UTest::runAll(void) {
>  
>  void UTest::runAllNoIssue(void) {
>    if (utestList == NULL) return;
> -  atexit(runAllNoIssueAtExit);
>  
>    for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) {
>      const UTest &utest = (*utestList)[retStatistics.finishrun];
> diff --git a/utests/utest.hpp b/utests/utest.hpp
> index e6a7749..0381bfe 100644
> --- a/utests/utest.hpp
> +++ b/utests/utest.hpp
> @@ -96,12 +96,12 @@ struct UTest
>   do { \
>      try { \
>        EXPR; \
> -      std::cout << "    [SUCCESS]"; \
> +      std::cout << "    [SUCCESS]" << std::endl; \
>        UTest::retStatistics.passCount += 1; \
>      } \
>      catch (Exception e) { \
> -      std::cout << "    [FAILED]"; \
> -      std::cout << "\n   " << e.what(); \
> +      std::cout << "    [FAILED]" << std::endl; \
> +      std::cout << "    " << e.what() << std::endl; \
>        UTest::retStatistics.failCount++; \
>      } \
>    } while (0)
> @@ -110,11 +110,11 @@ struct UTest
>   do { \
>      try { \
>        EXPR; \
> -      std::cout << "    [FAILED]"; \
> +      std::cout << "    [FAILED]" << std::endl; \
>        retStatistics.failCount++; \
>      } \
>      catch (gbe::Exception e) { \
> -      std::cout << "    [SUCCESS]"; \
> +      std::cout << "    [SUCCESS]" << std::endl; \
>        retStatistics.passCount++; \
>      } \
>    } while (0)
> -- 
> 1.8.5.3
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list