use Nice;       # load the Nice.pm module



tie $his_speed, 'Nice', getppid();

tie $my_speed,  'Nice', $$;

*****

$speed = $his_speed;

*****

$speed = (tied $his_speed)->FETCH():

*****

$myobj = tie $my_speed, 'Nice', $$;

$speed = $my_speed;       # through the implicit interface

$speed = $myobj->FETCH(); # same thing, explicitly

*****

package Nice;

use Carp;            # Propagates error messages nicely.

use BSD::Resource;   # Use these hooks into the OS.

use strict;          # Enforce some discipline on ourselves,

use vars '$DEBUG';   # but exempt $DEBUG from discipline,

*****

sub TIESCALAR {

    my $class = shift;

    my $pid   = shift;



    $pid ||= $$;              # arg of 0 defaults to my process



    if ($pid =~ /\D/) {

        carp "Nice::TIESCALAR got non-numeric pid $pid" if $^W;

        return undef;

    }



    unless (kill 0, $pid) {   # EPERM or ERSCH, no doubt

        carp "Nice::TIESCALAR got bad pid $pid: $!" if $^W;

        return undef;

    }



    return bless \$pid, $class;

}

*****

$pid = $pid || $$;      # set if not set

*****

sub FETCH {

    my $self = shift;       # ref to scalar



    confess "wrong type" unless ref $self;

    croak "too many arguments" if @_;



    my $nicety;

    local $! = 0;           # preserve errno

    $nicety = getpriority(PRIO_PROCESS, $$self);

    if ($!) { croak "getpriority failed: $!" }

    return $nicety;

}

*****

sub STORE {

    my $self = shift;

    my $new_nicety = shift;



    confess "wrong type" unless ref $self;

    croak "too many arguments" if @_;



    if ($new_nicety < PRIO_MIN) {

        carp sprintf

          "WARNING: priority %d less than minimum system priority %d",

              $new_nicety, PRIO_MIN if $^W;

        $new_nicety = PRIO_MIN;

    }



    if ($new_nicety > PRIO_MAX) {

        carp sprintf

          "WARNING: priority %d greater than maximum system priority %d",

              $new_nicety, PRIO_MAX if $^W;

        $new_nicety = PRIO_MAX;

    }



    unless (defined setpriority(PRIO_PROCESS, $$self, $new_nicety)) {

        confess "setpriority failed: $!";

    }

    return $new_nicety;

}

*****

sub DESTROY {

    my $self = shift;

    confess "wrong type" unless ref $self;

    carp "[ Nice::DESTROY pid $$self ]" if $DEBUG;

}

