diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 | 
| commit | 7b15ed9ef455b6b66c6b376898a88aef5d6a9970 (patch) | |
| tree | 3ef530baa80cdf29436ba981f5783be6b4d2202b /src/pkg/runtime/linux/arm/signal.c | |
| parent | 50104cc32a498f7517a51c8dc93106c51c7a54b4 (diff) | |
| download | golang-7b15ed9ef455b6b66c6b376898a88aef5d6a9970.tar.gz | |
Imported Upstream version 2011.04.13upstream/2011.04.13
Diffstat (limited to 'src/pkg/runtime/linux/arm/signal.c')
| -rw-r--r-- | src/pkg/runtime/linux/arm/signal.c | 59 | 
1 files changed, 46 insertions, 13 deletions
| diff --git a/src/pkg/runtime/linux/arm/signal.c b/src/pkg/runtime/linux/arm/signal.c index 843c40b68..05c6b0261 100644 --- a/src/pkg/runtime/linux/arm/signal.c +++ b/src/pkg/runtime/linux/arm/signal.c @@ -58,6 +58,11 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp)  	uc = context;  	r = &uc->uc_mcontext; +	if(sig == SIGPROF) { +		runtime·sigprof((uint8*)r->arm_pc, (uint8*)r->arm_sp, (uint8*)r->arm_lr, gp); +		return; +	} +  	if(gp != nil && (runtime·sigtab[sig].flags & SigPanic)) {  		// Make it look like a call to the signal func.  		// Have to pass arguments out of band since @@ -119,31 +124,59 @@ runtime·signalstack(byte *p, int32 n)  	runtime·sigaltstack(&st, nil);  } +static void +sigaction(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) +{ +	Sigaction sa; + +	runtime·memclr((byte*)&sa, sizeof sa); +	sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER; +	if(restart) +		sa.sa_flags |= SA_RESTART; +	sa.sa_mask = ~0ULL; +	sa.sa_restorer = (void*)runtime·sigreturn; +	if(fn == runtime·sighandler) +		fn = (void*)runtime·sigtramp; +	sa.sa_handler = fn; +	runtime·rt_sigaction(i, &sa, nil, 8); +} +  void  runtime·initsig(int32 queue)  { -	static Sigaction sa; +	int32 i; +	void *fn;  	runtime·siginit(); -	int32 i; -	sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER; -	sa.sa_mask.sig[0] = 0xFFFFFFFF; -	sa.sa_mask.sig[1] = 0xFFFFFFFF; -	sa.sa_restorer = (void*)runtime·sigreturn;  	for(i = 0; i<NSIG; i++) {  		if(runtime·sigtab[i].flags) {  			if((runtime·sigtab[i].flags & SigQueue) != queue)  				continue;  			if(runtime·sigtab[i].flags & (SigCatch | SigQueue)) -				sa.sa_handler = (void*)runtime·sigtramp; +				fn = runtime·sighandler;  			else -				sa.sa_handler = (void*)runtime·sigignore; -			if(runtime·sigtab[i].flags & SigRestart) -				sa.sa_flags |= SA_RESTART; -			else -				sa.sa_flags &= ~SA_RESTART; -			runtime·rt_sigaction(i, &sa, nil, 8); +				fn = runtime·sigignore; +			sigaction(i, fn, (runtime·sigtab[i].flags & SigRestart) != 0);  		}  	}  } + +void +runtime·resetcpuprofiler(int32 hz) +{ +	Itimerval it; +	 +	runtime·memclr((byte*)&it, sizeof it); +	if(hz == 0) { +		runtime·setitimer(ITIMER_PROF, &it, nil); +		sigaction(SIGPROF, SIG_IGN, true); +	} else { +		sigaction(SIGPROF, runtime·sighandler, true); +		it.it_interval.tv_sec = 0; +		it.it_interval.tv_usec = 1000000 / hz; +		it.it_value = it.it_interval; +		runtime·setitimer(ITIMER_PROF, &it, nil); +	} +	m->profilehz = hz; +} | 
