88 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Header$ */
 | 
						|
 | 
						|
#include <assert.h>
 | 
						|
#include <alloc.h>
 | 
						|
 | 
						|
#include "operator.h"
 | 
						|
#include "position.h"
 | 
						|
#include "tree.h"
 | 
						|
#include "message.h"
 | 
						|
#include "type.h"
 | 
						|
#include "expr.h"
 | 
						|
 | 
						|
extern long	pointer_size;
 | 
						|
extern p_tree	get_from_item_list();
 | 
						|
 | 
						|
struct dump {
 | 
						|
  char	*globals, *stack;
 | 
						|
  struct message_hdr mglobal, mstack;
 | 
						|
  struct dump *next;
 | 
						|
};
 | 
						|
 | 
						|
static struct dump	*last_dump;
 | 
						|
 | 
						|
/* dumping and restoring of child process.
 | 
						|
*/
 | 
						|
do_dump(p)
 | 
						|
  p_tree	p;
 | 
						|
{
 | 
						|
  struct dump *d = (struct dump *) malloc(sizeof(struct dump));
 | 
						|
 | 
						|
  if (! d) {
 | 
						|
	error("could not allocate enough memory");
 | 
						|
	return;
 | 
						|
  }
 | 
						|
  if (! get_dump(&d->mglobal, &d->globals, &d->mstack, &d->stack)) {
 | 
						|
	free((char *) d);
 | 
						|
	return;
 | 
						|
  }
 | 
						|
  p->t_args[0] = (struct tree *) d;
 | 
						|
  p->t_address = (t_addr) get_int(d->mglobal.m_buf+PC_OFF*pointer_size, pointer_size, T_UNSIGNED);
 | 
						|
  add_to_item_list(p);
 | 
						|
  d->next = last_dump;
 | 
						|
  last_dump = d;
 | 
						|
}
 | 
						|
 | 
						|
/* dumping and restoring of child process.
 | 
						|
*/
 | 
						|
do_restore(p)
 | 
						|
  p_tree	p;
 | 
						|
{
 | 
						|
  struct dump *d;
 | 
						|
  
 | 
						|
  if (p->t_args[0]) { 
 | 
						|
	p = get_from_item_list((int) p->t_args[0]->t_ival);
 | 
						|
  	if (!p || p->t_oper != OP_DUMP) {
 | 
						|
		error("no such dump");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
  	d = (struct dump *) p->t_args[0];
 | 
						|
  }
 | 
						|
  else	d = last_dump;
 | 
						|
 | 
						|
  if (! d) {
 | 
						|
	error("no dumps");
 | 
						|
	return;
 | 
						|
  }
 | 
						|
 | 
						|
  if (! put_dump(&d->mglobal, d->globals, &d->mstack, d->stack)) {
 | 
						|
  }
 | 
						|
  do_items();
 | 
						|
}
 | 
						|
 | 
						|
free_dump(p)
 | 
						|
  p_tree	p;
 | 
						|
{
 | 
						|
  struct dump *d = (struct dump *) p->t_args[0];
 | 
						|
 | 
						|
  free(d->globals);
 | 
						|
  free(d->stack);
 | 
						|
  if (d == last_dump) last_dump = d->next;
 | 
						|
  else {
 | 
						|
	register struct dump *d1 = last_dump;
 | 
						|
 | 
						|
	while (d1->next != d) d1 = d1->next;
 | 
						|
	d1->next = d->next;
 | 
						|
  }
 | 
						|
  free((char *) d);
 | 
						|
}
 |