home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / gcc / ixemulsrc.lha / ixemul / library / setpriority.c < prev    next >
C/C++ Source or Header  |  1996-12-11  |  2KB  |  80 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  setpriority.c,v 1.1.1.1 1994/04/04 04:30:34 amiga Exp
  20.  *
  21.  *  setpriority.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:34  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.1  1992/05/14  19:55:40  mwild
  26.  *  Initial revision
  27.  *
  28.  */
  29.  
  30. #define _KERNEL
  31. #include "ixemul.h"
  32. #include "kprintf.h"
  33.  
  34. /* REMARK: all priorities are negated, since on the Amiga, lower
  35.  * priorities mean less power, not more power.. */
  36.  
  37. int
  38. setpriority(int which, int who, int prio)
  39. {
  40.   if (prio < PRIO_MIN) prio = PRIO_MIN;
  41.   else if (prio > PRIO_MAX) prio = PRIO_MAX;
  42.  
  43.   if (who < PRIO_PROCESS || who > PRIO_USER)
  44.     {
  45.       errno = EINVAL;
  46.       KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  47.       return -1;
  48.     }
  49.  
  50.   if (which == PRIO_USER || who == 0)
  51.     {
  52.       struct Task *myself = (struct Task *)FindTask(0);
  53.       /* in this case I ignore the 'which' argument, and just set
  54.        * my own Priority */
  55.       SetTaskPri(myself, -prio);
  56.       return 0;
  57.     }
  58.  
  59.   /* so we look for processes. I ignore a difference between processes
  60.    * and process-groups.. */
  61.  
  62.   /* try to validate, that the given pid is really a task-pointer */
  63.   /* a pointer has to be word-aligned */
  64.   if (!(who & 1))
  65.     {
  66.       struct Task *task = (struct Task *)who;
  67.       /* it must have a node-type of either NT_PROCESS or NT_TASK */
  68.       if (task->tc_Node.ln_Type == NT_PROCESS ||
  69.           task->tc_Node.ln_Type == NT_TASK)
  70.     {
  71.       /* so we have to believe, this is really a task */
  72.       SetTaskPri(task, -prio);
  73.       return 0;
  74.     }
  75.     }
  76.   errno = ESRCH;
  77.   KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  78.   return -1;
  79. }
  80.