Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ieee_handler(3M) — Sun WorkShop 3.0.1

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

sigvec(2)

abort(3)

sigfpe(3)

signal(3)

IEEE_HANDLER(3M)  —  MATHEMATICAL LIBRARY

NAME

ieee_handler − IEEE exception trap handler function

SYNOPSIS

#include <sunmath.h>

int ieee_handler(const char ∗action, const char ∗exception, sigfpe_handler_type hdl);

DESCRIPTION

This function provides easy exception handling to exploit ANSI/IEEE Std 754-1985 arithmetic in a C program.  The first two arguments are pointers to strings.  For efficiency, results arising from invalid arguments and invalid combinations are undefined. 

There are three types of action : “get”, “set”, and “clear”.  There are five types of exception :

“inexact”

“division” ... division by zero exception

“underflow”

“overflow”

“invalid”

“all” ... all five exceptions above

“common” ... invalid, overflow, and division exceptions

Note: “all” and “common” only make sense with “set” or “clear”. 

hdl contains the address of a signal-handling routine.  <floatingpoint.h> defines sigfpe_handler_type . 

“get” will return the location of the current handler routine for exception cast to an int.  “set” will set the routine pointed at by hdl to be the handler routine and at the same time enable the trap on exception, except when hdl == SIGFPE_DEFAULT or SIGFPE_IGNORE; then ieee_handler() will disable the trap on exception. When hdl == SIGFPE_ABORT, any trap on exception will dump core using abort(3).  “clear” “all” disables trapping on all five exceptions. 

Two steps are required to intercept an IEEE-related SIGFPE code with ieee_handler:

1) Set up a handler with ieee_handler. 

2) Perform a floating-point operation that generates the intended IEEE exception. 

ieee_handler() also adjusts floating-point hardware mode bits affecting IEEE trapping.  For “clear”, “set” SIGFPE_DEFAULT, or “set” SIGFPE_IGNORE, the hardware trap is disabled.  For any other “set”, the hardware trap is enabled. 

SIGFPE signals can be handled using sigaction(2) sigvec(2), signal(3), sigfpe(3), or ieee_handler(3M). 
 
In a particular program, to avoid confusion, use only one of these interfaces to handle SIGFPE signals. 
 

DIAGNOSTICS

ieee_handler() normally returns 0 for “set”; 1 will be returned if the action is not available (for instance, not supported in hardware).  For “get”, the address of the current handler is returned, cast to an int. 

EXAMPLE

A user-specified signal handler might look like this:

void
sample_handler(int s, int code, struct sigcontext ∗scp, char ∗addr) {
/∗
∗ Sample user-written sigfpe code handler.
∗ Prints a message and aborts.
∗ struct sigcontext is defined in <signal.h>.
∗/
printf("ieee exception code %x occurred at pc %X\n",
code, scp->sc_pc);
abort();
}

and it might be set up like this:

extern void sample_handler(int, int, struct sigcontext ∗, char ∗);
void
main(void) {
sigfpe_handler_type hdl, old_handler1, old_handler2;
/∗
 ∗ save current overflow and invalid handlers
 ∗/
old_handler1 = (sigfpe_handler_type) ieee_handler("get","overflow",old_handler1);
old_handler2 = (sigfpe_handler_type) ieee_handler("get","invalid", old_handler2);
/∗
 ∗ set new overflow handler to sample_handler() and set new
 ∗ invalid handler to SIGFPE_ABORT (abort on invalid)
 ∗/
hdl = (sigfpe_handler_type) sample_handler;
if(ieee_handler("set","overflow",hdl) != 0)
printf("ieee_handler can’t set overflow \n");
if(ieee_handler("set","invalid",SIGFPE_ABORT) != 0)
printf("ieee_handler can’t set invalid \n");
...
/∗
 ∗ restore old overflow and invalid handlers
 ∗/
ieee_handler("set","overflow", old_handler1);
ieee_handler("set","invalid", old_handler2);
}

SEE ALSO

sigvec(2), abort(3), sigfpe(3), signal(3)

Sun Release 4.1  —  Last change: 22 Jul 1994

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026