dump.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* $Header$ */
  2. #include <assert.h>
  3. #include <alloc.h>
  4. #include "operator.h"
  5. #include "position.h"
  6. #include "tree.h"
  7. #include "message.h"
  8. #include "type.h"
  9. #include "expr.h"
  10. extern long pointer_size;
  11. extern p_tree get_from_item_list();
  12. struct dump {
  13. char *globals, *stack;
  14. struct message_hdr mglobal, mstack;
  15. struct dump *next;
  16. };
  17. static struct dump *last_dump;
  18. /* dumping and restoring of child process.
  19. */
  20. do_dump(p)
  21. p_tree p;
  22. {
  23. struct dump *d = (struct dump *) malloc(sizeof(struct dump));
  24. if (! d) {
  25. error("could not allocate enough memory");
  26. return;
  27. }
  28. if (! get_dump(&d->mglobal, &d->globals, &d->mstack, &d->stack)) {
  29. free((char *) d);
  30. return;
  31. }
  32. p->t_args[0] = (struct tree *) d;
  33. p->t_address = (t_addr) get_int(d->mglobal.m_buf+PC_OFF*pointer_size, pointer_size, T_UNSIGNED);
  34. add_to_item_list(p);
  35. d->next = last_dump;
  36. last_dump = d;
  37. }
  38. /* dumping and restoring of child process.
  39. */
  40. do_restore(p)
  41. p_tree p;
  42. {
  43. struct dump *d;
  44. if (p->t_args[0]) {
  45. p = get_from_item_list((int) p->t_args[0]->t_ival);
  46. if (!p || p->t_oper != OP_DUMP) {
  47. error("no such dump");
  48. return;
  49. }
  50. d = (struct dump *) p->t_args[0];
  51. }
  52. else d = last_dump;
  53. if (! d) {
  54. error("no dumps");
  55. return;
  56. }
  57. if (! put_dump(&d->mglobal, d->globals, &d->mstack, d->stack)) {
  58. }
  59. do_items();
  60. }
  61. free_dump(p)
  62. p_tree p;
  63. {
  64. struct dump *d = (struct dump *) p->t_args[0];
  65. free(d->globals);
  66. free(d->stack);
  67. if (d == last_dump) last_dump = d->next;
  68. else {
  69. register struct dump *d1 = last_dump;
  70. while (d1->next != d) d1 = d1->next;
  71. d1->next = d->next;
  72. }
  73. free((char *) d);
  74. }