NdbErrHnd.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:15k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #if defined NDB_OSE || defined NDB_SOFTOSE
  14. #include <NdbOut.hpp>
  15. #include <ndb_types.h>
  16. #include "ose.h"
  17. #include "ose_err.h"
  18. #include "osetypes.h"
  19. #define BUFSIZE 100
  20. typedef struct {
  21.   char header1[BUFSIZE];
  22.   char header2[BUFSIZE];
  23.   char error_code_line[BUFSIZE];
  24.   char subcode_line[BUFSIZE];
  25.   char product_line[BUFSIZE];
  26.   char header_file_line[BUFSIZE];
  27.   char extra_line[BUFSIZE];
  28.   char user_called_line[BUFSIZE];
  29.   char current_process_id_line[BUFSIZE];
  30.   char current_process_name_line[BUFSIZE];
  31.   char file_line[BUFSIZE];
  32.   char line_line[BUFSIZE];
  33.   char err_hnd_file[BUFSIZE];
  34. } Error_message;
  35. char assert_line[BUFSIZE];
  36. char unknown_signal_line[BUFSIZE];
  37. char signal_number_line[BUFSIZE];
  38. char sender_line[BUFSIZE];
  39. char receiver_line[BUFSIZE];
  40. extern "C" OSBOOLEAN ndb_err_hnd(bool user_called, 
  41.  Uint32 error_code,
  42.  Uint32 extra)
  43. {
  44.   static  Error_message error_message;
  45.   bool error_handled;
  46.   Uint32  subcode;
  47.   
  48.   char* subcode_mnemonic;
  49.   char* product_name;
  50.   char* file_name; 
  51.   
  52.   /*The subcode (bit 16 - 30) is extracted from error_code */
  53.   subcode = (error_code & 0x7fff0000) >> 16;
  54.   
  55.   if (user_called) {
  56.     switch (subcode) {
  57.     case 0x0050 :
  58.       subcode_mnemonic= "OSE_PRH_PLS";
  59.       product_name=     "Program Loader";
  60.       file_name =       "prherr.h";
  61.       break;
  62.     case 0x0051 :
  63.       subcode_mnemonic = "OSE_PRH_START_PRH";
  64.       product_name=      "start_prh";
  65.       file_name= "       start_prh.c";
  66.       break;
  67.     case 0x0052 :
  68.       subcode_mnemonic= "OSE_PRH_ASF";
  69.       product_name=     "Archive Server";
  70.       file_name =       "prherr.h";
  71.       break;
  72.     case 0x0058 :
  73.     case 0x4058 :
  74.     case 0x3fff :
  75.     case 0x8058 :
  76.       subcode_mnemonic= "OSE_MMS_EBASE";
  77.       product_name=     "MMS";
  78.       file_name=        "mms_err.h";
  79.       break;
  80.       /*Link Handler G3***************************************/
  81.     case 0x0060 :
  82.     case 0x8060 :
  83.       subcode_mnemonic= "OSE_GLH_EBASE";
  84.       product_name=     "General Link Handler";
  85.       file_name=        "glherr.h";
  86.       break;
  87.     case 0x0064 :
  88.     case 0x8064 : 
  89.       subcode_mnemonic= "OSE_GPL_EBASE";
  90.       product_name=     "General Protocol Link Handler";
  91.       file_name=        "gplerr.h";
  92.       break;
  93.     case 0x0066 :
  94.     case 0x8066 :
  95.       subcode_mnemonic= "OSE_UDPPDR_EBASE";
  96.       product_name=     "UDP driver for GPL";
  97.       file_name=        "udppdrerr.h";
  98.       break;
  99.     case 0x0067 :
  100.     case 0x8067 :
  101.       subcode_mnemonic= "OSE_SERPDR_EBASE";
  102.       product_name=     "Serial driver for GPL";
  103.       file_name=        "serpdrerr.h";
  104.       break;
  105.     case 0x0068 :
  106.     case 0x8068 :
  107.       subcode_mnemonic= "OSE_ETHPDR_EBASE";
  108.       product_name=     "Ethernet driver for GPL";
  109.       file_name=        "ethpdrerr.h";
  110.       break;
  111.       /*Link handler G4***************************************/
  112.     case 0x0061 :
  113.       subcode_mnemonic= "OSE_OTL_EBASE";
  114.       product_name=     "OSE Transport Layer";
  115.       file_name=        "otlerr.h";
  116.       break;
  117.     case 0x0062 :
  118.       subcode_mnemonic= "OSE_LALUDP_EBASE";
  119.       product_name=     "Link Adaption Layer for UDP";
  120.       file_name=        "header file unknown";
  121.       break;
  122.       /*Internet Utilities************************************/
  123.     case 0x0069 :
  124.       subcode_mnemonic= "OSE_TFTPD";
  125.       product_name=     "TFTP server";
  126.       file_name=        "inetutilerr.h";
  127.       break;
  128.     case 0x006a :
  129.       subcode_mnemonic= "OSE_TELUDPD";
  130.       product_name=     "TELNET/UDP server";
  131.       file_name=        "inetutilerr.h";
  132.       break;
  133.     case 0x006b :
  134.       subcode_mnemonic= "OSE_FTPD";
  135.       product_name=     "FTP server";
  136.       file_name=        "inetutilerr.h";
  137.       break;
  138.     case 0x006c :
  139.       subcode_mnemonic= "OSE_TELNETD";
  140.       product_name=     "TELNET server";
  141.       file_name=        "inetutilerr.h";
  142.       break;
  143.     case 0x006d :
  144.       subcode_mnemonic= "OSE_SURFER";
  145.       product_name=     "OSE System Surfer";
  146.       file_name=        "inetutilerr.h";
  147.       break;
  148.     case 0x006e :
  149.       subcode_mnemonic= "OSE_BOOTP";
  150.       product_name=     "BOOTP client";
  151.       file_name=        "inetutilerr.h";
  152.       break;
  153.     case 0x006f :
  154.       switch((error_code & 0x0000f000)){
  155.       case 0x00000000 :
  156.         subcode_mnemonic= "OSE_RES";
  157.         product_name=     "DNS resolver";
  158.         file_name=        "inetutilerr.h";   
  159.         break;
  160.       case 0x00001000 :
  161.         subcode_mnemonic= "OSE_DHCPC";
  162.         product_name=     "DHCP client";
  163.         file_name=        "inetutilerr.h";
  164.         break;
  165.       case 0x00002000 :
  166.         subcode_mnemonic= "OSE_FTP";
  167.         product_name=     "FTP client";
  168.         file_name=        "inetutilerr.h";
  169.         break;
  170.       default :
  171.         subcode_mnemonic= "Unknown error";
  172.         product_name=     "unknown product";
  173.         file_name =       "header file unknown";
  174.         break;
  175.       }
  176.       break;
  177.     case 0x00c2 :
  178.       subcode_mnemonic= "OSE_DNS";
  179.       product_name=     "DNS server";
  180.       file_name=        "dns_err.h";
  181.       break;
  182.       /*INET**************************/
  183.     case 0x0070 :
  184.       subcode_mnemonic= "INET_ERRBASE";
  185.       product_name=     "Internet Protocols (INET)";
  186.       file_name=        "ineterr.h";
  187.       break;
  188.     case 0x0071 :
  189.       subcode_mnemonic= "WEBS_ERRBASE";
  190.       product_name=     "Web Server (WEBS)";
  191.       file_name=        "webserr.h";
  192.       break;
  193.     case 0x0072 :
  194.       subcode_mnemonic= "SNMP";
  195.       product_name=     "SNMP";
  196.       file_name=        "header file unknown";
  197.       break;
  198.     case 0x0073 :
  199.       subcode_mnemonic= "STP_BRIDGE";
  200.       product_name=     "STP bridge";
  201.       file_name=        "header file unknown";
  202.       break;
  203.     case 0x0200 :
  204.     case 0x0201 :
  205.     case 0x0202 :
  206.     case 0x0203 :
  207.     case 0x0204 :
  208.     case 0x0205 :
  209.     case 0x0206 :
  210.     case 0x0207 :
  211.     case 0x0208 :
  212.     case 0x0209 :
  213.     case 0x020a :
  214.     case 0x020b :
  215.     case 0x020c :
  216.     case 0x020d :
  217.     case 0x020e :
  218.     case 0x020f :
  219.       subcode_mnemonic = "INETINIT_ERR_BASE";
  220.       product_name =     "INET";
  221.       file_name =        "startinet.c";
  222.       break;
  223.       /*Miscellanous******************************************/
  224.     case 0x0082 :
  225.       subcode_mnemonic= "OSE_HEAP_EBASE";
  226.       product_name=     "Heap Manager";
  227.       file_name=        "heap_err.h";
  228.       break;
  229.     case 0x0088 :
  230.       subcode_mnemonic= "OSE_BSP";
  231.       product_name=     "Board Support Package";
  232.       file_name=        "bsperr.h";
  233.       break;
  234.     case 0x008a :
  235.       subcode_mnemonic= "OSE_TOSV_EBASE";
  236.       product_name=     "Time Out Server";
  237.       file_name=        "tosverr.h";
  238.       break;
  239.     case 0x008b :
  240.       subcode_mnemonic= "OSE_RTC_EBASE";
  241.       product_name=     "Real Time Clock";
  242.       file_name=        "rtcerr.h";
  243.       break;
  244.     case 0x008d :
  245.     case 0x808d :
  246.       subcode_mnemonic= "OSENS_ERR_BASE";
  247.       product_name=     "Name Server";
  248.       file_name=        "osens_err.h";
  249.       break;
  250.     case 0x008e :
  251.       subcode_mnemonic= "PMD_ERR_BASE";
  252.       product_name=     "Post Mortem Dump";
  253.       file_name=        "pmderr.h";
  254.       break;
  255.       /*Embedded File System***********************************/
  256.     case 0x0090 :
  257.       subcode_mnemonic= "OSE_EFS_COMMON";
  258.       product_name=     "EFS common";
  259.       file_name=        "efs_err.h";
  260.       break;
  261.     case 0x0091 :
  262.       subcode_mnemonic= "OSE_EFS_FLIB";
  263.       product_name=     "EFS function library";
  264.       file_name=        "efs_err.h";
  265.       break;
  266.     case 0x0092 :
  267.       subcode_mnemonic= "OSE_EFS_SERDD";
  268.       product_name=     "EFS serdd";
  269.       file_name=        "efs_err.h";
  270.       break;
  271.     case 0x0093 :
  272.       subcode_mnemonic= "OSE_EFS_SHELL";
  273.       product_name=     "OSE shell";
  274.       file_name=        "efs_err.h";
  275.       break;
  276.     case 0x0094 :
  277.       subcode_mnemonic= "OSE_EFS_STARTEFS";
  278.       product_name=     "EFS startefs.c";
  279.       file_name=        "efs_err.h";
  280.       break;
  281.       /*Debugger related***************************************/
  282.     case 0x00a0 :
  283.       subcode_mnemonic= "DBGSERVER_ERR_BASE";
  284.       product_name=     "Debug server for Illuminator";
  285.       file_name=        "degservererr.h";
  286.       break;
  287.     case 0x00b2 :
  288.       subcode_mnemonic= "OSE_MDM";
  289.       product_name=     "Multi INDRT monitor";
  290.       file_name=        "header file unknown";
  291.       break;
  292.       /*Miscellanous*******************************************/
  293.     case 0x00c0 :
  294.       subcode_mnemonic= "OSE_POTS_EBASE";
  295.       product_name=     "POTS tutorial example";
  296.       file_name=        "pots_err.h";
  297.       break;
  298.     case 0x00c1 :
  299.       subcode_mnemonic= "OSE_PTH_ECODE_BASE";
  300.       product_name=     "Pthreads";
  301.       file_name=        "pthread_err.h";
  302.       break;
  303.     case 0x00c3 :
  304.       subcode_mnemonic= "OSE_NTP_EBASE";
  305.       product_name=     "OSE NTP/SNTP";
  306.       file_name=        "ntp_err.h";
  307.       break;
  308.     case 0x00c4 :
  309.       subcode_mnemonic= "TRILLIUM_BASE";
  310.       product_name=     "Trillium OSE port";
  311.       file_name=        "sk_ss.c";
  312.       break;
  313.     case 0x00c5 :
  314.       subcode_mnemonic= "OSE_OSECPP_EBASE";
  315.       product_name=     "C++ Support with libosecpp.a";
  316.       file_name=        "cpp_err.h";
  317.       break;
  318.     case 0x00c6 :
  319.       subcode_mnemonic= "OSE_RIP_ERR_BASE";
  320.       product_name=     "OSE RIP";
  321.       file_name=        "oserip.h";
  322.       break;
  323.       /*Unknown error_code*************************************/
  324.     default :
  325.       subcode_mnemonic= "Unknown error";
  326.       product_name=     "unknown product";
  327.       file_name =       "header file unknown";
  328.       break;
  329.     }
  330.   } else {
  331.     /* user_called = 0, i.e. reported by the kernel */
  332.     subcode_mnemonic= "OSE_KRN";
  333.     product_name=     "Kernel";
  334.     file_name =       "ose_err.h";
  335.   }
  336.   BaseString::snprintf(error_message.header1,
  337.             BUFSIZE,
  338.             "This is the OSE Example System Error handlerrn");
  339.   
  340.   BaseString::snprintf(error_message.err_hnd_file,
  341.             BUFSIZE,
  342.             "located in: " __FILE__ "rn");
  343.   
  344.   BaseString::snprintf(error_message.header2,
  345.             BUFSIZE,
  346.             "An Error has been reported:rn");
  347.   
  348.   if (user_called == (OSBOOLEAN) 0 ) {
  349.     BaseString::snprintf(error_message.user_called_line,
  350.              BUFSIZE,
  351.              "user_called:      0x%x (Error detected by the kernel)rn",
  352.              user_called);
  353.   }
  354.   else {
  355.     BaseString::snprintf(error_message.user_called_line,
  356.              BUFSIZE,
  357.              "user_called:      0x%x (Error detected by an application)rn",
  358.              user_called);
  359.   }
  360.   
  361.   BaseString::snprintf(error_message.error_code_line,
  362.             BUFSIZE,
  363.             "error code:       0x%08xrn",
  364.             error_code);
  365.   
  366.   BaseString::snprintf(error_message.subcode_line,
  367.             BUFSIZE,
  368.             "   subcode:       %s (0x%08x)rn",
  369.             subcode_mnemonic,
  370.             ( subcode << 16));
  371.   
  372.   BaseString::snprintf(error_message.product_line,
  373.             BUFSIZE,
  374.             "   product:       %srn",
  375.             product_name);
  376.   
  377.   BaseString::snprintf(error_message.header_file_line,
  378.             BUFSIZE,
  379.             "   header file:   %srn",
  380.             file_name);
  381.   
  382.   BaseString::snprintf(error_message.extra_line,
  383.             BUFSIZE,
  384.             "extra:            0x%08xrn",
  385.             extra);
  386.     
  387.   if (error_code != OSE_ENO_KERN_SPACE || user_called){
  388.     struct OS_pcb *pcb = get_pcb(current_process());
  389.     const char *process_name = &pcb->strings[pcb->name];
  390.       
  391.     BaseString::snprintf(error_message.current_process_id_line,
  392.              BUFSIZE,
  393.              "Current Process:  0x%08xrn",
  394.              current_process());
  395.       
  396.     BaseString::snprintf(error_message.current_process_name_line,
  397.              BUFSIZE,
  398.              "Process Name:     %srn",
  399.              process_name);
  400.       
  401.     BaseString::snprintf(error_message.file_line,
  402.              BUFSIZE,
  403.              "File:             %srn",
  404.              &pcb->strings[pcb->file]);
  405.       
  406.     BaseString::snprintf(error_message.line_line,
  407.              BUFSIZE,
  408.              "Line:             %drn",
  409.              pcb->line);
  410.       
  411.     free_buf((union SIGNAL **)&pcb);
  412.   }
  413.   if ( !(((error_code & OSE_EFATAL_MASK) != 0) && (user_called == 0))){
  414.     /* If the error is reported by the kernel and the fatal flag is set,
  415.      * dbgprintf can't be trusted */
  416.     ndbout << error_message.header1;
  417.     ndbout << error_message.err_hnd_file;
  418.     ndbout << error_message.header2;
  419.     ndbout << error_message.user_called_line;
  420.     ndbout << error_message.error_code_line;
  421.     ndbout << error_message.subcode_line;
  422.     ndbout << error_message.product_line;
  423.     ndbout << error_message.header_file_line;
  424.     ndbout << error_message.extra_line;
  425.     ndbout << error_message.current_process_id_line;
  426.     ndbout << error_message.current_process_name_line;
  427.     ndbout << error_message.file_line;
  428.     ndbout << error_message.line_line;
  429.     ndbout << endl;
  430.   }
  431.   
  432.   if(user_called){
  433.     switch (error_code) {
  434.       /* Check for assertion failure (see oseassert.h and assert.c). */
  435.     case (OSERRCODE) 0xffffffff:
  436.       {
  437.         if(extra != 0){
  438.           char *expr = ((char **)extra)[0];
  439.           char *file = ((char **)extra)[1];
  440.           unsigned line = ((unsigned *)extra)[2];
  441.           BaseString::snprintf(assert_line, BUFSIZE, "Assertion Failed: %s:%u: %srn", file, line, expr);
  442.           ndbout << assert_line;
  443.         }
  444.       }
  445.       /* Check for unknown signal */
  446.     case (OSERRCODE) 0xfffffffe:
  447.       {
  448.         union SIGNAL *sig = (union SIGNAL *)extra;
  449.         SIGSELECT signo = *(SIGSELECT*)sig;
  450.         PROCESS rcv_ = current_process();
  451.         PROCESS snd_ = sender(&sig);
  452.         struct OS_pcb *rcv = get_pcb(rcv_);
  453.         const char *rcv_name = &rcv->strings[rcv->name];
  454.         struct OS_pcb *snd = get_pcb(snd_);
  455.         const char *snd_name = &snd->strings[snd->name];
  456.         BaseString::snprintf(unknown_signal_line, BUFSIZE, 
  457.                  "Unknown Signal Receivedrn");
  458.         BaseString::snprintf(unknown_signal_line, BUFSIZE, 
  459.                  "Signal Number: 0x%08lxrn", signo);
  460.         BaseString::snprintf(unknown_signal_line, BUFSIZE, 
  461.                  "Sending Process: 0x%08lx (%s))rn", snd_, snd_name);
  462.         BaseString::snprintf(unknown_signal_line, BUFSIZE, 
  463.                  "Receiving Process: 0x%08lx (%s))rn", rcv_, rcv_name);
  464.         free_buf((union SIGNAL **)&rcv);
  465.         free_buf((union SIGNAL **)&snd);          }
  466.       ndbout << unknown_signal_line;
  467.       ndbout << signal_number_line;
  468.       ndbout << sender_line;
  469.       ndbout << receiver_line;
  470.     } /* switch */
  471.   } /* if */
  472.   /* Zero means the error has not been fixed by the error handler. */
  473.   error_handled = 0; 
  474.   return error_handled;  
  475. }
  476. #endif