An alt-stack and interrupt-handler are added to ikarus-main.c. When
an interrupt occurs, the engine_ticks is set to 1 and the interrupted field is set to 1 in the pcb.
This commit is contained in:
		
							parent
							
								
									fc609b4916
								
							
						
					
					
						commit
						7fed78fa9d
					
				
							
								
								
									
										
											BIN
										
									
								
								bin/ikarus
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								bin/ikarus
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -9,9 +9,12 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <errno.h>
 | 
					#include <errno.h>
 | 
				
			||||||
#include <gmp.h>
 | 
					#include <gmp.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int get_all_options(){
 | 
					void register_handlers();
 | 
				
			||||||
}
 | 
					void register_alt_stack();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ikpcb* the_pcb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* get_option
 | 
					/* get_option
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
| 
						 | 
					@ -127,6 +130,7 @@ int main(int argc, char** argv){
 | 
				
			||||||
    fprintf(stderr, "ERROR: bits_per_limb=%d\n", mp_bits_per_limb);
 | 
					    fprintf(stderr, "ERROR: bits_per_limb=%d\n", mp_bits_per_limb);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  ikpcb* pcb = ik_make_pcb();
 | 
					  ikpcb* pcb = ik_make_pcb();
 | 
				
			||||||
 | 
					  the_pcb = pcb;
 | 
				
			||||||
  { /* set up arg_list */
 | 
					  { /* set up arg_list */
 | 
				
			||||||
    ikp arg_list = null_object;
 | 
					    ikp arg_list = null_object;
 | 
				
			||||||
    int i = argc-1;
 | 
					    int i = argc-1;
 | 
				
			||||||
| 
						 | 
					@ -144,6 +148,8 @@ int main(int argc, char** argv){
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    pcb->arg_list = arg_list;
 | 
					    pcb->arg_list = arg_list;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  register_handlers();
 | 
				
			||||||
 | 
					  register_alt_stack();
 | 
				
			||||||
  ik_fasl_load(pcb, boot_file);
 | 
					  ik_fasl_load(pcb, boot_file);
 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
  fprintf(stderr, "collect time: %d.%03d utime, %d.%03d stime (%d collections)\n", 
 | 
					  fprintf(stderr, "collect time: %d.%03d utime, %d.%03d stime (%d collections)\n", 
 | 
				
			||||||
| 
						 | 
					@ -157,5 +163,75 @@ int main(int argc, char** argv){
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					     #include <signal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     struct  sigaction {
 | 
				
			||||||
 | 
					             union {
 | 
				
			||||||
 | 
					                     void    (*__sa_handler)(int);
 | 
				
			||||||
 | 
					                     void    (*__sa_sigaction)(int, struct __siginfo *, void *);
 | 
				
			||||||
 | 
					             } __sigaction_u;                /* signal handler */
 | 
				
			||||||
 | 
					             int     sa_flags;               /* see signal options below */
 | 
				
			||||||
 | 
					             sigset_t sa_mask;               /* signal mask to apply */
 | 
				
			||||||
 | 
					     };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     #define sa_handler      __sigaction_u.__sa_handler
 | 
				
			||||||
 | 
					     #define sa_sigaction    __sigaction_u.__sa_sigaction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     int
 | 
				
			||||||
 | 
					     sigaction(int sig, const struct sigaction * restrict act,
 | 
				
			||||||
 | 
					         struct sigaction * restrict oact);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void handler(int signo, struct __siginfo* info, ucontext_t* uap){
 | 
				
			||||||
 | 
					  the_pcb->engine_counter = 1;
 | 
				
			||||||
 | 
					  the_pcb->interrupted = 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					register_handlers(){
 | 
				
			||||||
 | 
					  struct sigaction sa;
 | 
				
			||||||
 | 
					  sa.sa_sigaction = (void(*)(int,struct __siginfo*,void*)) handler;
 | 
				
			||||||
 | 
					  sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
 | 
				
			||||||
 | 
					  sa.sa_mask = 0;
 | 
				
			||||||
 | 
					  int err = sigaction(SIGINT, &sa, 0);
 | 
				
			||||||
 | 
					  if(err){
 | 
				
			||||||
 | 
					    fprintf(stderr, "Sigaction Failed: %s\n", strerror(errno));
 | 
				
			||||||
 | 
					    exit(-1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					SYNOPSIS
 | 
				
			||||||
 | 
					     #include <sys/types.h>
 | 
				
			||||||
 | 
					     #include <signal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     struct sigaltstack {
 | 
				
			||||||
 | 
					             char   *ss_sp;
 | 
				
			||||||
 | 
					             int     ss_size;
 | 
				
			||||||
 | 
					             int     ss_flags;
 | 
				
			||||||
 | 
					     };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     int
 | 
				
			||||||
 | 
					     sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					register_alt_stack(){
 | 
				
			||||||
 | 
					  char* stk = ik_mmap(SIGSTKSZ);
 | 
				
			||||||
 | 
					  if(stk == 0){
 | 
				
			||||||
 | 
					    fprintf(stderr, "Cannot maloc an alt stack\n");
 | 
				
			||||||
 | 
					    exit(-1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  struct sigaltstack sa;
 | 
				
			||||||
 | 
					  sa.ss_sp = stk;
 | 
				
			||||||
 | 
					  sa.ss_size = SIGSTKSZ;
 | 
				
			||||||
 | 
					  sa.ss_flags = 0;
 | 
				
			||||||
 | 
					  int err = sigaltstack(&sa, 0);
 | 
				
			||||||
 | 
					  if(err){
 | 
				
			||||||
 | 
					    fprintf(stderr, "Cannot set alt stack: %s\n", strerror(errno));
 | 
				
			||||||
 | 
					    exit(-1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,8 @@ typedef struct ikpcb{
 | 
				
			||||||
  void* system_stack;                 /* offset = 24 */
 | 
					  void* system_stack;                 /* offset = 24 */
 | 
				
			||||||
  unsigned int* dirty_vector;         /* offset = 28 */
 | 
					  unsigned int* dirty_vector;         /* offset = 28 */
 | 
				
			||||||
  ikp   arg_list;                     /* offset = 32 */
 | 
					  ikp   arg_list;                     /* offset = 32 */
 | 
				
			||||||
  ikp   engine_counter;               /* offset = 36 */
 | 
					  int   engine_counter;               /* offset = 36 */
 | 
				
			||||||
 | 
					  int   interrupted;                  /* offset = 40 */
 | 
				
			||||||
  /* the rest are not used by any scheme code        */
 | 
					  /* the rest are not used by any scheme code        */
 | 
				
			||||||
  /* they only support the runtime system (gc, etc.) */
 | 
					  /* they only support the runtime system (gc, etc.) */
 | 
				
			||||||
  unsigned int* segment_vector; 
 | 
					  unsigned int* segment_vector; 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue