Back to index

glibc  2.9
Functions
setpriority.c File Reference
#include <hurd.h>
#include <hurd/resource.h>

Go to the source code of this file.

Functions

int setpriority (enum __priority_which which, id_t who, int prio)

Function Documentation

int setpriority ( enum __priority_which  which,
id_t  who,
int  prio 
)

Definition at line 25 of file setpriority.c.

{
  error_t err;
  error_t pidloser, priloser;
  unsigned int npids, ntasks, nwin, nperm, nacces;

  error_t setonepriority (pid_t pid, struct procinfo *pi)
    {
      task_t task;
      error_t piderr = __USEPORT (PROC, __proc_pid2task (port, pid, &task));
      if (piderr == EPERM)
       ++nperm;
      if (piderr != ESRCH)
       {
         ++npids;
         if (piderr && piderr != EPERM)
           pidloser = piderr;
       }
      if (! piderr)
       {
         error_t prierr;
         ++ntasks;
#ifdef POLICY_TIMESHARE_BASE_COUNT
         {
           /* XXX This assumes timeshare policy.  */
           struct policy_timeshare_base base
             = { NICE_TO_MACH_PRIORITY (prio) };
           prierr = __task_policy (task, POLICY_TIMESHARE,
                                (policy_base_t) &base,
                                POLICY_TIMESHARE_BASE_COUNT,
                                0, 1);
         }
#else
         prierr = __task_priority (task, NICE_TO_MACH_PRIORITY (prio), 1);
#endif
         __mach_port_deallocate (__mach_task_self (), task);
         switch (prierr)
           {
           case KERN_FAILURE:
             ++nacces;
             break;
           case KERN_SUCCESS:
             ++nwin;
             break;
           case KERN_INVALID_ARGUMENT: /* Task died.  */
             --npids;
             --ntasks;
             break;
           default:
             priloser = prierr;
           }
       }
      return 0;
    }

  npids = ntasks = nwin = nperm = nacces = 0;
  pidloser = priloser = 0;
  err = _hurd_priority_which_map (which, who, setonepriority, 0);

  if (!err && npids == 0)
    /* No error, but no pids found.  */
    err = ESRCH;
  else if (nperm == npids)
    /* Got EPERM from proc_task2pid for every process.  */
    err = EPERM;
  else if (nacces == ntasks)
    /* Got KERN_FAILURE from task_priority for every task.  */
    err = EACCES;
  else if (nwin == 0)
    err = pidloser ?: priloser;

  return err ? __hurd_fail (err) : 0;
}

Here is the call graph for this function: