DosGetPrty

From EDM2
Jump to: navigation, search

This call gets the priority of the initial thread of execution for any process, or any thread in the current process.

Syntax

DosGetPrty (Scope, Priority, ID)

Parameters

Scope (USHORT) - input
Scope of priority request. Used to define the scope of the request.
0 - Thread 1 (the initial thread of execution) of the indicated process.
2 - Any thread of the current process.
Priority (PUSHORT) - output
Address of the base priority of the thread identified by ID. The high-order byte of this word is set equal to the priority class. The low-order byte is set equal to the priority level.
ID (USHORT) - input 
A process ID (scope = 0) or a thread ID (scope = 2). If this operand is equal to 0, the current process or thread is assumed.

Return Code

rc (USHORT) - return
Return code descriptions are:
  • 0 NO_ERROR
  • 303 ERROR_INVALID_PROCID
  • 308 ERROR_INVALID_SCOPE
  • 309 ERROR_INVALID_THREADID

Remarks

If scope = 0 (process) the priority of the first thread of a process is returned. If that thread has terminated, the ERROR_INVALID_THREAD_ID error code is returned.

A thread's priority is changed by issuing DosSetPrty. A process can change the priority of all the threads of any process whose process ID is known to the thread. It can also change the priority of another thread in its process, or all the threads of the current or a child process, as well as all its descendants.

DosGetPID and DosGetPPID are useful for obtaining process and thread IDs. DosGetPID gets the ID of the current thread, the process ID of its current process, or the process ID of the parent process of the current process. DosGetPPID gets the parent process ID of any specified process.

Bindings

C

#define INCL_DOSPROCESS

USHORT  rc = DosGetPrty(Scope, Priority, ID);

USHORT  Scope;         /* Indicate scope of query */
PUSHORT Priority;      /* Address to put priority (returned) */
USHORT  ID;            /* Process or thread ID */

USHORT  rc;            /* return code */

MASM

EXTRN  DosGetPrty:FAR
INCL_DOSPROCESS     EQU 1

PUSH   WORD    Scope         ;Indicate scope of query
PUSH@  WORD    Priority      ;Priority (returned)
PUSH   WORD    ID            ;Process or thread ID
CALL   DosGetPrty

Returns WORD

Example

The following example illustrates how to obtain the priority of a thread and how to change the priority. The main thread creates Thread2 and allows it to begin executing. Thread2 iterates through a loop that prints a line and then sleeps, relinquishing its time slice to the main thread. After one or two iterations by Thread2, the main thread obtains Thread2's priority information and prints it. It then raises Thread2's priority to fixed-high, and increments the level by ten. Since Thread2 is now at a high priority, it immediately finishes its remaining iterations before relinquishing control on a long sleep; at this point, the main thread re-examines Thread2's priority and reports its new priority level. In this example, it is helpful to understand how the DosSleep calls are used either to relinquish control of the processor, or to keep a thread alive (see DosTimerAsync or DosTimerStart for alternatives to DosSleep).

#define INCL_DOSPROCESS

#include <os2.h>

#define  PRTYC_FIXEDHIGH   4         /* Priority class: fixed-high */
#define  PRTY_DELTA        10        /* Priority delta: increase by 10 */
#define  SEGSIZE           4000      /* Number of bytes requested in segment */
#define  ALLOCFLAGS        0         /* Segment allocation flags - no sharing */
#define  SLEEPSHORT        0L        /* Sleep interval - 5 milliseconds */
#define  SLEEPLONG         20L       /* Sleep interval - 75 milliseconds */
#define  RETURN_CODE       0         /* Return code for DosExit() */

VOID APIENTRY Thread2()
{
  USHORT     i;

  /* Loop with four iterations */
  for(i=1; i<5; i++)
  {
    printf("In Thread2, i is now %d\n", i);

    /** Sleep to relinquish time slice to main thread **/
    DosSleep(SLEEPSHORT);          /* Sleep interval */
  }
  DosExit(EXIT_THREAD,             /* Action code - end a thread */
          RETURN_CODE);            /* Return code */
}

main()
{
  USHORT     Priority;            /* Thread priority */
  USHORT     Class;               /* Priority class */
  USHORT     Level;               /* Priority level */
  SEL        ThreadStackSel;      /* Segment selector for thread stack */
  PBYTE      StackEnd;            /* Ptr. to end of thread stack */
  USHORT     rc;

  /* Allocate segment for thread stack; this is better than just */
  /* declaring an array of bytes to use as a stack.  Make pointer eos. */

  rc = DosAllocSeg(SEGSIZE,            /* Number of bytes requested */
                   &ThreadStackSel,    /* Segment selector (returned) */
                   ALLOCFLAGS);        /* Allocation flags */
  StackEnd = MAKEP(ThreadStackSel, SEGSIZE-1);

  /* Start Thread2 */
  if(!(DosCreateThread((PFNTHREAD) Thread2,    /* Thread address */
                       &ThreadID,              /* Thread ID (returned) */
                       StackEnd)))             /* End of thread stack */
    printf("Thread2 created.\n");

  /** Sleep to allow Thread2 to execute **/
  if(!(DosSleep(SLEEPLONG)))                       /* Sleep interval */
    printf("Slept a little to let Thread2 execute.\n");

  /** Obtain Thread2's priority information and report it **/
  if(!(rc=DosGetPrty(PRTYS_THREAD,          /* Scope - single thread */
                     &Priority,             /* Address to put priority */
                     ThreadID)))                  /* ID - thread ID */
  {
    /* Extract priority class and level information */
    Class = HIBYTE(Priority);
    Level = LOBYTE(Priority);
    printf("Thread2: ID is %d, Priority Class is %d and Level is %d\n",
           ThreadID, Class, Level);
  }
  /** Raise Thread2's priority **/
  if(!(rc=DosSetPrty(PRTYS_THREAD,         /* Scope - single thread */
                     PRTYC_FIXEDHIGH,      /* Prty class - fixed-high */
                     PRTY_DELTA,           /* Prty delta - increase by 10 */
                     ThreadID)))           /* ID - thread ID */
  {
    /* Obtain Thread2' new priority information and report it */
    rc=DosGetPrty(PRTYS_THREAD,            /* Scope - single thread */
                  &Priority,               /* Address to put priority */
                  ThreadID);               /* ID - thread ID */

    /* Extract priority class and level information */
    Class = HIBYTE(Priority);
    Level = LOBYTE(Priority);
    printf("Thread2: ID is %d, New Priority Class is %d and Level is %d\n",
           ThreadID, Class, Level);
  }
}