Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Jan 1997 11:00:59 -0800
From:      "Jordan K. Hubbard" <jkh@time.cdrom.com>
To:        hackers@freebsd.org
Subject:   Jukka Ukkonen: POSIX.4 - scheduler once more (as you requested)
Message-ID:  <14120.854650859@time.cdrom.com>

next in thread | raw e-mail | index | archive | help
Any interest in this?  I'd like a few more reviewers, if possible.

------- Forwarded Message

From: jau@iki.fi (Jukka Ukkonen)
Latin-Date: Miercuri XXIX Ianuarie a.d. MCMXCVII
Organization: Private person
Phone: +358-9-6215280 (home)
Reply-To: jau@iki.fi (Jukka Ukkonen)
Content-Conversion: prohibited
X-Mailer: ELM [version 2.4 PL25+pgp]
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit


	Greetings from Helsinki,

	You said earlier that you did not dare to publish my POSIX
	sched-package before I send you the correct version once more,
	because previously I had sent you an old version.
	So, I tried to do exactly that by replying to the address in
	the From header of your message, and the message bounced back
	due to some error the reason of which I have already forgotten.

	This time the attached version of my POSIX-sched package is
	the most recent version. (I have removed the earlier test
	versions from my hard disk to avoid any more surprises with
	them.) The manual pages are still missing though as they were
	about a month ago when we last discussed this extension.


	Cheers,
		// jau
- ------
  /    Jukka A. Ukkonen,  Internet and New Media / Finnish Telecom Ltd.
 /__   M.Sc. (sw-eng & cs)                     (Phone) +358-2040-4025
   /   Internet: Jukka.Ukkonen@tele.fi           (Fax) +358-2040-2712
  /    Internet: jau@iki.fi                   (Mobile) +358-400-606671
 v     Internet: ukkonen@nic.funet.fi       (Home&Fax) +358-9-6215280


 o
  \ /
- -  X ------------------------- clip clip ------------------------------
  / \
 O

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	sched/sched.h
#	sched/sched_getparam.c
#	sched/sched_getscheduler.c
#	sched/sched_get_priority_max.c
#	sched/sched_get_priority_min.c
#	sched/sched_rr_get_interval.c
#	sched/sched_setparam.c
#	sched/sched_setscheduler.c
#	sched/Makefile
#	sched/Kernel-Sched.Diffs
#	sched/sched_yield.Diffs
#	sched/RTprio.diffs
#
echo x - sched/sched.h
sed 's/^X//' >sched/sched.h << 'END-of-sched/sched.h'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X
X#ifndef	_SCHED_H
X#define	_SCHED_H
X
X#include    <sys/types.h>
X#include    <sys/rtprio.h>
X#include    <time.h>	    /* For struct timespec */
X
X#ifndef	_POSIX_PRIORITY_SCHEDULING
X#  define   _POSIX_PRIORITY_SCHEDULING
X#endif
X
X/*
X *  FIFO and Round-Robin must really be separate, but maybe
X *  it could be possible and worthwhile to try approximate FIFO
X *  using RR with higher priorities.
X *
X *  RTP_PRIO_REALTIME with round-robin among equal priority
X *  processes at every time-quantum (= currently HZ/10) would
X *  still be only a poor substitute for fifo scheduling on
X *  systems that don't have a real fifo policy.
X *
X *  Otherwise FIFO and RR are equivalent in all respects, but
X *  RR comes with involuntary release of CPU after the time
X *  quantum has passed.
X *  FIFO knows only about voluntary release of the CPU while
X *  the process can run as long as it wishes. So, you really
X *  can hang your machine, if there is no other process with
X *  higher RT-priority (FIFO or RR) ready to kill a infinitely
X *  looping FIFO process.
X */
X
X#ifdef	RTP_PRIO_FIFO
X#  define   SCHED_FIFO	RTP_PRIO_FIFO
X#else
X#  define   SCHED_FIFO	RTP_PRIO_REALTIME
X#endif
X
X#define	SCHED_RR	RTP_PRIO_REALTIME
X#define	SCHED_TIMESHARE	RTP_PRIO_NORMAL
X#define	SCHED_IDLE	RTP_PRIO_IDLE
X#define	SCHED_OTHER	SCHED_TIMESHARE
X
X/*
X *  Hopefully someone is interested enough to add
X *  the necessary deadline logic to the kernel.
X */
X
X#ifdef	RTP_PRIO_DEADLINE
X#  define	SCHED_DEADLINE	RTP_PRIO_DEADLINE
X#endif
X
Xstruct sched_param {
X    int	    sched_type;		    /* scheduling policy */
X    int	    sched_priority;	    /* nice for time-share, else true prio */
X    int	    sched_pgprio;	    /* pg-nice for TS, else unused */
X    int	    sched_userprio;	    /* user-nice for TS, else unused */
X    struct timespec sched_deadline; /* reserved for deadline scheduling */
X    struct timespec sched_timereq;  /* reserved for deadline scheduling */
X};
X
X#endif
END-of-sched/sched.h
echo x - sched/sched_getparam.c
sed 's/^X//' >sched/sched_getparam.c << 'END-of-sched/sched_getparam.c'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X#ifndef	lint
Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%";
X#endif
X
X
X#include    <sys/types.h>
X#include    <sys/time.h>
X#include    <sys/resource.h>
X#include    <sys/rtprio.h>
X#include    <sched.h>
X#include    <errno.h>
X
Xint
Xsched_getparam (pid, param)
X    pid_t		pid;
X    struct sched_param	*param;
X{
X    struct rtprio   rtp;
X
X    if (! param) {
X	errno = EINVAL;
X	return (-1);
X    }
X
X    if (rtprio (RTP_LOOKUP, pid, &rtp) < 0)
X	return (-1);
X
X    param->sched_type = rtp.type;
X
X    if (rtp.type == RTP_PRIO_NORMAL) {
X	errno = 0;
X
X	param->sched_priority = getpriority (PRIO_PROCESS, pid);
X
X	if ((param->sched_priority == -1) && errno)
X	    return (-1);
X
X	param->sched_priority = -param->sched_priority;
X
X	errno = 0;
X
X	param->sched_pgprio = getpriority (PRIO_PGRP, pid);
X
X	if ((param->sched_pgprio == -1) && errno)
X	    return (-1);
X
X	param->sched_pgprio = -param->sched_pgprio;
X
X	errno = 0;
X
X	param->sched_userprio = getpriority (PRIO_USER, pid);
X
X	if ((param->sched_userprio == -1) && errno)
X	    return (-1);
X
X	param->sched_userprio = -param->sched_userprio;
X    }
X    else
X	param->sched_priority = RTP_PRIO_MAX - rtp.prio;
X
X    return (0);
X}
END-of-sched/sched_getparam.c
echo x - sched/sched_getscheduler.c
sed 's/^X//' >sched/sched_getscheduler.c << 'END-of-sched/sched_getscheduler.c'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X#ifndef	lint
Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%";
X#endif
X
X
X#include    <sys/types.h>
X#include    <sys/time.h>
X#include    <sys/resource.h>
X#include    <sys/rtprio.h>
X
Xint
Xsched_getscheduler (pid)
X    pid_t   pid;
X{
X    struct rtprio   rtp;
X
X    if (rtprio (RTP_LOOKUP, pid, &rtp) < 0)
X	return (-1);
X
X    return ((int) rtp.type);
X}
END-of-sched/sched_getscheduler.c
echo x - sched/sched_get_priority_max.c
sed 's/^X//' >sched/sched_get_priority_max.c << 'END-of-sched/sched_get_priority_max.c'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X#ifndef	lint
Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%";
X#endif
X
X
X#include    <sys/types.h>
X#include    <sys/time.h>
X#include    <sys/resource.h>
X#include    <sched.h>
X#include    <errno.h>
X
Xint
Xsched_get_priority_max (policy)
X    int	    policy;
X{
X    errno = 0;
X
X    switch (policy) {
X
X    case    SCHED_FIFO:
X    case    SCHED_RR:
X    case    SCHED_IDLE:
X	return (RTP_PRIO_MAX);
X
X    case    SCHED_TIMESHARE:
X	return (PRIO_MAX);
X
X    default:
X	errno = EINVAL;	    /* Here is a gotcha! Always check errno! */
X	return (-1);	    /* Whether negatives are valid is unspecified. */
X    }
X}
X
END-of-sched/sched_get_priority_max.c
echo x - sched/sched_get_priority_min.c
sed 's/^X//' >sched/sched_get_priority_min.c << 'END-of-sched/sched_get_priority_min.c'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X#ifndef	lint
Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%";
X#endif
X
X
X#include    <sys/types.h>
X#include    <sys/time.h>
X#include    <sys/resource.h>
X#include    <sched.h>
X#include    <errno.h>
X
Xint
Xsched_get_priority_max (policy)
X    int	    policy;
X{
X    errno = 0;
X
X    switch (policy) {
X
X    case    SCHED_FIFO:
X    case    SCHED_RR:
X    case    SCHED_IDLE:
X	return (RTP_PRIO_MIN);
X
X    case    SCHED_TIMESHARE:
X	return (PRIO_MIN);
X
X    default:
X	errno = EINVAL;	    /* Here is a gotcha! Always check errno! */
X	return (-1);	    /* Whether negatives are valid is unspecified. */
X    }
X}
X
END-of-sched/sched_get_priority_min.c
echo x - sched/sched_rr_get_interval.c
sed 's/^X//' >sched/sched_rr_get_interval.c << 'END-of-sched/sched_rr_get_interval.c'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X#ifndef	lint
Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%";
X#endif
X
X
X#include    <sys/param.h>
X#include    <sys/types.h>
X#include    <sys/time.h>
X#include    <sys/resource.h>
X#include    <sys/rtprio.h>
X#include    <sys/sysctl.h>
X#include    <unistd.h>
X#include    <time.h>
X#include    <sched.h>
X#include    <errno.h>
X
Xint
Xsched_rr_get_interval (pid, ts)
X    pid_t		pid;
X    struct timespec	*ts;
X{
X    struct clockinfo	cinfo;
X    struct rtprio	rtp;
X    int			sysmib[2];
X    size_t		cinfosize;
X
X    if (! ts) {
X	errno = EFAULT;
X
X	return (-1);
X    }
X
X    if (rtprio (RTP_LOOKUP, pid, &rtp) < 0)
X	return (-1);
X
X    if (rtp.type != SCHED_RR) {
X	errno = EINVAL;
X
X	return (-1);
X    }
X
X    cinfosize = sizeof (cinfo);
X
X    sysmib[0] = CTL_KERN;
X    sysmib[1] = KERN_CLOCKRATE;
X
X    if (sysctl (sysmib, 2, &cinfo, &cinfosize, NULL, 0) < 0)
X	return (-1);
X
X    ts->ts_sec = 0;
X    ts->ts_nsec = cinfo.tick * 10 * 1000;	/* really (hz / 10) */
X
X    return (0);
X}
X
X#ifdef	DEBUG_SCHED_RR_GET_INTERVAL
X
Xint
Xmain ()
X{
X    struct timespec	ts;
X
X    if (sched_rr_get_interval (getpid (), &ts) < 0) {
X	perror ("sched_rr_get_interval ()");
X	exit (-1);
X    }
X
X    printf ("ts.ts_sec = %d, ts.ts_nsec = %d\n", ts.ts_sec, ts.ts_nsec);
X
X    return (0);
X}
X
X#endif
X
END-of-sched/sched_rr_get_interval.c
echo x - sched/sched_setparam.c
sed 's/^X//' >sched/sched_setparam.c << 'END-of-sched/sched_setparam.c'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X#ifndef	lint
Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%";
X#endif
X
X
X#include    <sys/types.h>
X#include    <sys/time.h>
X#include    <sys/resource.h>
X#include    <sys/rtprio.h>
X#include    <sched.h>
X#include    <errno.h>
X
Xint
Xsched_setparam (pid, param)
X    pid_t		pid;
X    struct sched_param	*param;
X{
X    struct rtprio   rtp;
X
X    if (! param) {
X	errno = EINVAL;
X	return (-1);
X    }
X
X    if (rtprio (RTP_LOOKUP, pid, &rtp) < 0)
X	return (-1);
X
X    if (rtp.type == RTP_PRIO_NORMAL) {
X	if (setpriority (PRIO_PROCESS, pid, -param->sched_priority) < 0)
X	    return (-1);
X
X	if (setpriority (PRIO_PGRP, pid, -param->sched_pgprio) < 0)
X	    return (-1);
X
X	if (setpriority (PRIO_USER, pid, -param->sched_userprio) < 0)
X	    return (-1);
X
X	rtp.prio = 0;
X    }
X    else
X	rtp.prio = RTP_PRIO_MAX - param->sched_priority;
X
X    if (rtprio (RTP_SET, pid, &rtp) < 0)
X	return (-1);
X
X    return (0);
X}
END-of-sched/sched_setparam.c
echo x - sched/sched_setscheduler.c
sed 's/^X//' >sched/sched_setscheduler.c << 'END-of-sched/sched_setscheduler.c'
X/*
X * Copyright (c) 1995,1996 Jukka Ukkonen	<jau@jau.tmt.tele.fi>
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X *    must display the following acknowledgement:
X *      This product includes software developed by Jukka Antero Ukkonen.
X * 4. Neither the names of the authors nor the names of contributors
X *    may be used to endorse or promote products derived from this software
X *    without specific prior written permission.
X * 5. The source code must be available for anyone who wishes to have it.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X *  %W%	(Jukka Ukkonen)	%E%
X */
X
X#ifndef	lint
Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%";
X#endif
X
X
X#include    <sys/types.h>
X#include    <sys/time.h>
X#include    <sys/resource.h>
X#include    <sys/rtprio.h>
X#include    <sched.h>
X#include    <errno.h>
X
Xint
Xsched_setscheduler (pid, policy, param)
X    pid_t		pid;
X    int			policy;
X    struct sched_param	*param;
X{
X    struct rtprio   rtp;
X
X    if (! param) {
X	errno = EINVAL;
X	return (-1);
X    }
X
X    rtp.type = policy;
X
X    if (policy == RTP_PRIO_NORMAL) {
X	if (setpriority (PRIO_PROCESS, pid, -param->sched_priority) < 0)
X	    return (-1);
X
X	if (setpriority (PRIO_PGRP, pid, -param->sched_pgprio) < 0)
X	    return (-1);
X
X	if (setpriority (PRIO_USER, pid, -param->sched_userprio) < 0)
X	    return (-1);
X
X	rtp.prio = 0;
X    }	
X    else
X	rtp.prio = RTP_PRIO_MAX - param->sched_priority;
X
X    if (rtprio (RTP_SET, pid, &rtp) < 0)
X	return (-1);
X
X    return (0);
X}
END-of-sched/sched_setscheduler.c
echo x - sched/Makefile
sed 's/^X//' >sched/Makefile << 'END-of-sched/Makefile'
X
XCC	= gcc
X
X.c.o:
X	$(CC) $(CFLAGS) -c $<
X	ld -r -x $@
X	mv a.out $@
X	chmod a-x $@
X
XCINCL	= -I../include -I../ctype
X
XCFLAGS	= -O4 -fexpensive-optimizations -fpcc-struct-return -funsigned-char \
X	-D_NO_POSIX_OPAQUE_TYPES $(CDEBUG) $(CINCL)
X#CFLAGS	= $(CDEBUG) $(CINCL)
X
XSRCS 	= \
X	sched_get_priority_max.c	sched_setparam.c \
X	sched_get_priority_min.c	sched_setscheduler.c \
X	sched_getparam.c		sched_getscheduler.c \
X	sched_rr_get_interval.c
X	
XOBJS 	= \
X	sched_get_priority_max.o	sched_setparam.o \
X	sched_get_priority_min.o	sched_setscheduler.o \
X	sched_getparam.o		sched_getscheduler.o \
X	sched_rr_get_interval.o
X
Xlibsched.a: $(OBJS)
X	rm -f $@
X	ar rv $@ $(OBJS)
X	ranlib $@
X
END-of-sched/Makefile
echo x - sched/Kernel-Sched.Diffs
sed 's/^X//' >sched/Kernel-Sched.Diffs << 'END-of-sched/Kernel-Sched.Diffs'
X--- /sys/kern/kern_resource.c.orig	Tue May 30 11:05:39 1995
X+++ /sys/kern/kern_resource.c	Mon Dec 25 20:52:30 1995
X@@ -247,8 +247,11 @@
X 			/* can't set realtime priority */
X 			if (rtp.type == RTP_PRIO_REALTIME)
X 				return (EPERM);
X+			if (rtp.type == RTP_PRIO_FIFO)
X+				return (EPERM);
X 		}
X 		switch (rtp.type) {
X+		case RTP_PRIO_FIFO:
X 		case RTP_PRIO_REALTIME:
X 		case RTP_PRIO_NORMAL:
X 		case RTP_PRIO_IDLE:
X--- /sys/kern/kern_synch.c.orig	Tue May 30 11:05:44 1995
X+++ /sys/kern/kern_synch.c	Tue Dec 26 16:23:20 1995
X@@ -67,8 +67,10 @@
X roundrobin(arg)
X 	void *arg;
X {
X+	if (! curproc || curproc->p_rtprio.type != RTP_PRIO_FIFO) {
X+		need_resched();
X+	}
X 
X-	need_resched();
X 	timeout(roundrobin, NULL, hz / 10);
X }
X 
X@@ -670,7 +672,11 @@
X 		p->p_usrpri = newpriority;
X 		if (newpriority < curpriority)
X 			need_resched();
X-	} else {
X+	} else if (! curproc ||
X+		   (curproc->p_rtprio.type != RTP_PRIO_FIFO) ||
X+		   (((p->p_rtprio.type == RTP_PRIO_FIFO) ||
X+		     (p->p_rtprio.type == RTP_PRIO_REALTIME)) &&
X+		    (p->p_rtprio.prio < curproc->p_rtprio.prio))) {
X 		need_resched();
X 	}
X }
X--- /sys/sys/rtprio.h.orig	Sun Oct  2 06:45:59 1994
X+++ /sys/sys/rtprio.h	Mon Dec 25 20:48:18 1995
X@@ -42,7 +42,26 @@
X #define RTP_PRIO_REALTIME	0
X #define RTP_PRIO_NORMAL		1
X #define RTP_PRIO_IDLE		2
X+#define RTP_PRIO_FIFO		3
X 
X+/*
X+ *  RTP_PRIO_QUANTUM -- not implemented yet!
X+ *  Actually this is intended as another type
X+ *  of round-robin policy  with the ability to
X+ *  allow processes request a non-default
X+ *  time-slice or time-quantum.
X+ */
X+/* #define RTP_PRIO_QUANTUM	4 */
X+
X+/*
X+ *  RTP_PRIO_DEADLINE -- not implemented yet!
X+ */
X+/* #define RTP_PRIO_DEADLINE	5 */
X+
X+/*
X+ *  Actual priority ranges should be changed
X+ *  to cover at least some 128 to 256 steps!
X+ */
X /* priority range */
X #define RTP_PRIO_MIN		0	/* Highest priority */
X #define RTP_PRIO_MAX		31	/* Lowest priority */
X@@ -57,6 +76,10 @@
X struct rtprio {
X 	u_short type;
X 	u_short prio;
X+#if defined(RTP_PRIO_DEADLINE) || defined(RTP_PRIO_QUANTUM)
X+	struct timeval	deadline;   /* Fail if not ready to repeat. */
X+	struct timeval	quantum;    /* Min./required time slice. */
X+#endif
X };
X #endif
X 
X--- /sys/i386/i386/swtch.s.orig	Tue Dec 26 14:19:25 1995
X+++ /sys/i386/i386/swtch.s	Tue Dec 26 14:20:58 1995
X@@ -90,6 +90,9 @@
X 
X 	movzwl	P_RTPRIO_PRIO(%eax),%edx
X 
X+	cmpw	$RTP_PRIO_FIFO,P_RTPRIO_TYPE(%eax) /* fifo rt priority? */
X+	je	set_rt
X+	
X 	cmpw	$RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* realtime priority? */
X 	jne	set_id				/* must be idle priority */
X 	
X--- /sys/vm/vm_glue.c.orig	Mon Oct 16 22:43:05 1995
X+++ /sys/vm/vm_glue.c	Mon Dec 25 20:52:32 1995
X@@ -430,6 +430,9 @@
X 			/*
X 			 * do not swapout a realtime process
X 			 */
X+			if (p->p_rtprio.type == RTP_PRIO_FIFO)
X+				continue;
X+
X 			if (p->p_rtprio.type == RTP_PRIO_REALTIME)
X 				continue;
X 
X--- /usr/include/sys/rtprio.h.orig	Sun Oct  2 06:45:59 1994
X+++ /usr/include/sys/rtprio.h	Mon Dec 25 20:48:18 1995
X@@ -42,7 +42,26 @@
X #define RTP_PRIO_REALTIME	0
X #define RTP_PRIO_NORMAL		1
X #define RTP_PRIO_IDLE		2
X+#define RTP_PRIO_FIFO		3
X 
X+/*
X+ *  RTP_PRIO_QUANTUM -- not implemented yet!
X+ *  Actually this is intended as another type
X+ *  of round-robin policy  with the ability to
X+ *  allow processes request a non-default
X+ *  time-slice or time-quantum.
X+ */
X+/* #define RTP_PRIO_QUANTUM	4 */
X+
X+/*
X+ *  RTP_PRIO_DEADLINE -- not implemented yet!
X+ */
X+/* #define RTP_PRIO_DEADLINE	5 */
X+
X+/*
X+ *  Actual priority ranges should be changed
X+ *  to cover at least some 128 to 256 steps!
X+ */
X /* priority range */
X #define RTP_PRIO_MIN		0	/* Highest priority */
X #define RTP_PRIO_MAX		31	/* Lowest priority */
X@@ -57,6 +76,10 @@
X struct rtprio {
X 	u_short type;
X 	u_short prio;
X+#if defined(RTP_PRIO_DEADLINE) || defined(RTP_PRIO_QUANTUM)
X+	struct timeval	deadline;   /* Fail if not ready to repeat. */
X+	struct timeval	quantum;    /* Min./required time slice. */
X+#endif
X };
X #endif
X 
END-of-sched/Kernel-Sched.Diffs
echo x - sched/sched_yield.Diffs
sed 's/^X//' >sched/sched_yield.Diffs << 'END-of-sched/sched_yield.Diffs'
X--- /sys/kern/init_sysent.c.no_sched_yield	Wed Dec  4 23:41:55 1996
X+++ /sys/kern/init_sysent.c	Wed Dec  4 23:49:14 1996
X@@ -179,6 +179,7 @@
X int	mlock();
X int	munlock();
X int	getsid();
X+int	sched_yield();
X int	lkmnosys();
X 
X #ifdef COMPAT_43
X@@ -489,7 +490,8 @@
X 	{ 2, munlock },			/* 204 = munlock */
X 	/* { 0, nosys },		205 = nosys */
X 	{ 1, getsid },			/* 205 = getsid */
X-	{ 0, nosys },			/* 206 = nosys */
X+	/* { 0, nosys },		206 = nosys */
X+	{ 0, sched_yield },			/* 206 = sched_yield */
X 	{ 0, nosys },			/* 207 = nosys */
X 	{ 0, nosys },			/* 208 = nosys */
X 	{ 0, nosys },			/* 209 = nosys */
X--- /sys/kern/syscalls.c.no_sched_yield	Wed Dec  4 23:42:24 1996
X+++ /sys/kern/syscalls.c	Wed Dec  4 23:46:07 1996
X@@ -249,7 +249,8 @@
X 	"munlock",			/* 204 = munlock */
X 	/* "#205",			205 = nosys */
X 	"getsid",			/* 205 = getsid */
X-	"#206",			/* 206 = nosys */
X+	/* "#206",			206 = nosys */
X+	"sched_yield",			/* 206 = sched_yield */
X 	"#207",			/* 207 = nosys */
X 	"#208",			/* 208 = nosys */
X 	"#209",			/* 209 = nosys */
X--- /sys/kern/syscalls.master.no_sched_yield	Wed Dec  4 23:42:43 1996
X+++ /sys/kern/syscalls.master	Wed Dec  4 23:44:28 1996
X@@ -280,7 +280,8 @@
X 204	STD	2 BSD	munlock
X ; 205	UNIMPL	0 NOHIDE nosys
X 205	STD	1 BSD	getsid
X-206	UNIMPL	0 NOHIDE nosys
X+; 206	UNIMPL	0 NOHIDE nosys
X+206	STD	0 POSIX	sched_yield
X 207	UNIMPL	0 NOHIDE nosys
X 208	UNIMPL	0 NOHIDE nosys
X 209	UNIMPL	0 NOHIDE nosys
X--- /sys/kern/kern_synch.c.no_sched_yield	Tue Dec 24 13:12:02 1996
X+++ /sys/kern/kern_synch.c	Tue Dec 24 11:25:33 1996
X@@ -681,3 +681,20 @@
X 	}
X }
X 
X+struct sched_yield_args {
X+	void	*arg;
X+};
X+/* ARGSUSED */
X+int
X+sched_yield (p, uap, retval)
X+    struct proc		    *p;
X+    struct sched_yield_args *uap;
X+    int			    *retval;
X+{
X+    need_resched ();	/* Wild, isn't it? */
X+
X+    *retval = 0;
X+
X+    return (0);
X+}
X+
X--- /usr/include/sys/syscall.h.no_sched_yield	Tue Dec 24 13:19:56 1996
X+++ /usr/include/sys/syscall.h	Tue Dec 24 12:23:18 1996
X@@ -193,3 +193,4 @@
X #define	SYS_mlock	203
X #define	SYS_munlock	204
X #define	SYS_getsid	205
X+#define	SYS_sched_yield	206
X--- /usr/include/unistd.h.no_sched_yield	Tue Dec 24 13:18:59 1996
X+++ /usr/include/unistd.h	Tue Dec 24 12:39:59 1996
X@@ -174,6 +174,7 @@
X int	 vhangup __P((void));
X void	*valloc __P((size_t));			/* obsoleted by malloc() */
X pid_t	 vfork __P((void));
X+int	 sched_yield __P((void));
X #endif /* !_POSIX_SOURCE */
X __END_DECLS
X 
X--- /sys/sys/syscall.h.no_sched_yield	Tue Dec 24 13:22:52 1996
X+++ /sys/sys/syscall.h	Tue Dec 24 12:23:56 1996
X@@ -193,3 +193,4 @@
X #define	SYS_mlock	203
X #define	SYS_munlock	204
X #define	SYS_getsid	205
X+#define	SYS_sched_yield	206
END-of-sched/sched_yield.Diffs
echo x - sched/RTprio.diffs
sed 's/^X//' >sched/RTprio.diffs << 'END-of-sched/RTprio.diffs'
X--- /usr/src/usr.sbin/rtprio/rtprio.c.orig	Sun Oct  2 06:48:21 1994
X+++ /usr/src/usr.sbin/rtprio/rtprio.c	Tue Dec 26 11:18:20 1995
X@@ -63,6 +63,10 @@
X 
X 	if (!strcmp(p, "rtprio"))
X 		rtp.type = RTP_PRIO_REALTIME;
X+#ifdef	RTP_PRIO_FIFO
X+	else if (!strcmp(p, "rtfifoprio"))
X+		rtp.type = RTP_PRIO_FIFO;
X+#endif
X 	else if (!strcmp(p, "idprio"))
X 		rtp.type = RTP_PRIO_IDLE;
X 
X@@ -76,8 +80,13 @@
X 			perror(argv[0]);
X 			exit (1);
X 		}
X+
X 		printf("%s: ", p);
X+
X 		switch (rtp.type) {
X+		case RTP_PRIO_FIFO:
X+			printf("hard realtime fifo priority %d\n", rtp.prio);
X+			break;
X 		case RTP_PRIO_REALTIME:
X 			printf("realtime priority %d\n", rtp.prio);
X 			break;
END-of-sched/RTprio.diffs
exit


------- End of Forwarded Message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?14120.854650859>