home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / mainloop.C < prev    next >
C/C++ Source or Header  |  1998-11-29  |  3KB  |  97 lines

  1. // $Id: mainloop.C,v 1.5 1998/11/29 10:43:45 zeller Exp $ -*- C++ -*-
  2. // DDD main event loop
  3.  
  4. // Copyright (C) 1998 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char mainloop_rcsid[] = 
  30.     "$Id: mainloop.C,v 1.5 1998/11/29 10:43:45 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "mainloop.h"
  37. #include "exit.h"
  38. #include "status.h"
  39. #include "ddd.h"
  40. #include "AppData.h"
  41.  
  42. #include <setjmp.h>
  43.  
  44. // Resume after fatal errors
  45. bool main_loop_entered = false;
  46.  
  47. static jmp_buf main_loop_env;
  48.  
  49. // DDD main loop.  This is placed in a separate module to avoid
  50. // warnings about longjmp() clobbering local variables.
  51. void ddd_main_loop()
  52. {
  53.     main_loop_entered = false;
  54.     static int sig = 0;
  55.     if ((sig = setjmp(main_loop_env)) != 0)
  56.     {
  57.     // Got a fatal signal
  58.     main_loop_entered = false;
  59.     ddd_show_signal(sig);
  60.     reset_status_lock();
  61.  
  62.     if (sig < 0)
  63.     {
  64.         // We had a core dump
  65.         if (app_data.debug_core_dumps)
  66.         DDDDebugCB(gdb_w, XtPointer(True), 0);
  67.         report_core(dddlog);
  68.     }
  69.  
  70.     // Bring X in a consistent state
  71.     XUngrabPointer(XtDisplay(gdb_w), CurrentTime);
  72.     XUngrabKeyboard(XtDisplay(gdb_w), CurrentTime);
  73.     XUngrabServer(XtDisplay(gdb_w));
  74.  
  75.     // Enable maintenance menu
  76.     if (!app_data.maintenance)
  77.     {
  78.         app_data.maintenance = true;
  79.         update_options();
  80.     }
  81.     }
  82.  
  83.     // Set `main_loop_entered' to true as soon 
  84.     // as DDD becomes idle again.
  85.     XtAppAddWorkProc(XtWidgetToApplicationContext(gdb_w), ddd_setup_done, 0);
  86.  
  87.     // Main Loop
  88.     for (;;)
  89.     process_next_event();
  90. }
  91.  
  92. // Return to DDD main loop, using longjmp()
  93. void goto_main_loop(int sig)
  94. {
  95.     longjmp(main_loop_env, sig);
  96. }
  97.