Appendix B. System Interfaces


28273   NAME
28274              posix_spawn,  posix_spawnp ”spawn  a  process  ( ADVANCED  REALTIME )


28275   SYNOPSIS

 28276 SPN  #include <spawn.h>  28277  int posix_spawn (pid_t *restrict  pid  , const char *restrict  path  ,  28278  const posix_spawn_file_actions_t *  file_actions,   28279  const posix_spawnattr_t *restrict  attrp  ,  28280  char *const  argv  [restrict], char *const  envp  [restrict]);  28281  int posix_spawnp (pid_t *restrict  pid  , const char *restrict  file  ,  28282  const posix_spawn_file_actions_t *  file_actions,   28283  const posix_spawnattr_t *restrict  attrp  ,  28284  char *const  argv  [restrict], char * const  envp  [restrict]);  28285 


28286   DESCRIPTION
28287              The   posix_spawn ()  and   posix_spawnp ()  functions  shall  create  a  new  process  (child  process)  from
28288              the  specified  process  image.  The  new  process  image  shall  be   constructed  from  a  regular
28289              executable  file  called  the  new  process  image  file.

28290              When  a  C  program  is  executed  as  the  result  of  this  call,  it  shall  be  entered  as  a  C-language
28291              function  call  as   follows :

28292              int  main  (int   argc ,  char  *   argv []);

28293              where   argc  is  the  argument  count  and   argv  is  an  array  of  character  pointers  to  the  arguments
28294               themselves .  In  addition,  the  following  variable:

28295              extern  char  **environ;

28296              shall  be   initialized  as  a  pointer  to  an  array  of  character  pointers  to  the  environment  strings.

28297              The  argument   argv  is  an  array  of  character  pointers  to  null- terminated  strings.  The  last  member
28298              of  this  array  shall  be  a  null  pointer  and  is  not  counted  in   argc .  These  strings   constitute  the
28299              argument  list  available  to  the  new  process  image.  The  value  in   argv [0]  should  point  to  a  filename
28300              that  is  associated  with  the  process  image  being  started  by  the   posix_spawn ()  or   posix_spawnp ()
28301              function.

28302              The  argument   envp  is  an  array  of  character  pointers  to  null-terminated  strings.  These  strings
28303              constitute  the  environment  for  the  new  process  image.  The  environment  array  is  terminated  by  a
28304              null  pointer.

28305              The  number  of  bytes  available  for  the  child  process'  combined  argument  and  environment  lists
28306              is  {ARG_MAX}.  The  implementation  shall  specify  in  the  system  documentation  (see  the  Base
28307              Definitions  volume  of  IEEE  Std  1003.1-2001,  Chapter  2,  Conformance)  whether  any  list
28308              overhead,  such  as  length  words,  null  terminators,  pointers,  or  alignment  bytes,  is  included  in
28309              this  total.

28310              The   path  argument  to   posix_spawn ()  is  a  pathname  that  identifies  the  new  process  image  file  to
28311              execute.

28312              The   file  parameter  to   posix_spawnp ()  shall  be  used  to  construct  a  pathname  that  identifies  the
28313              new  process  image  file.  If  the   file  parameter  contains  a  slash  character,  the   file  parameter  shall  be
28314              used  as  the  pathname  for  the  new  process  image  file.   Otherwise ,  the  path  prefix  for  this  file  shall
28315              be  obtained  by  a  search  of  the  directories  passed  as  the  environment  variable   PATH  (see  the  Base
28316              Definitions  volume  of  IEEE  Std  1003.1-2001,  Chapter  8,  Environment   Variables ).  If  this
28317              environment  variable  is  not  defined,  the  results  of  the  search  are  implementation-defined.

28318              If   file_actions  is  a  null  pointer,  then  file  descriptors  open  in  the  calling  process  shall   remain   open
28319              in  the  child  process,  except  for  those  whose  close-on-   exec  flag  FD_CLOEXEC  is  set  (see   fcntl ().
28320              For  those  file  descriptors  that  remain  open,  all  attributes  of  the  corresponding  open  file
28321              descriptions,  including  file  locks  (see   fcntl ()),  shall  remain  unchanged.

28322              If   file_actions  is  not  NULL,  then  the  file  descriptors  open  in  the  child  process  shall  be  those  open
28323              in  the  calling  process  as  modified  by  the  spawn  file  actions  object  pointed  to  by   file_actions  and
28324              the  FD_CLOEXEC  flag  of  each  remaining  open  file  descriptor  after  the  spawn  file  actions  have
28325              been   processed .  The  effective  order  of  processing  the  spawn  file  actions  shall  be:

28326                1.  The  set  of  open  file  descriptors  for  the  child  process  shall  initially  be  the  same  set  as  is
28327                    open  for  the  calling  process.  All  attributes  of  the  corresponding  open  file  descriptions,
28328                    including  file  locks  (see   fcntl ()),  shall  remain  unchanged.
28329                2.  The  signal  mask,  signal  default  actions,  and  the  effective   user  and   group  IDs  for  the  child
28330                    process  shall  be  changed  as  specified  in  the  attributes  object  referenced  by   attrp .
28331                3.  The  file  actions  specified  by  the  spawn  file  actions  object  shall  be  performed  in  the  order  in
28332                    which  they  were  added  to  the  spawn  file  actions  object.
28333                4.  Any  file  descriptor  that  has  its  FD_CLOEXEC  flag  set  (see   fcntl ())  shall  be  closed.

28334              The   posix_spawnattr_t  spawn  attributes  object  type  is  defined  in  < spawn.h>.  It  shall  contain  at
28335              least  the  attributes  defined  below.

28336              If  the  POSIX_SPAWN_SETPGROUP  flag  is  set  in  the   spawn-flags  attribute  of  the  object
28337              referenced  by   attrp ,  and  the   spawn-pgroup  attribute  of  the  same  object  is   non-zero ,  then  the
28338              child's  process  group  shall  be  as  specified  in  the   spawn-pgroup  attribute  of  the  object  referenced
28339              by   attrp .

28340              As  a  special  case,  if  the  POSIX_SPAWN_SETPGROUP  flag  is  set  in  the   spawn-flags  attribute  of
28341              the  object  referenced  by   attrp ,  and  the   spawn-pgroup  attribute  of  the  same  object  is  set  to  zero,
28342              then  the  child  shall  be  in  a  new  process  group  with  a  process  group  ID  equal  to  its  process  ID.

28343              If  the  POSIX_SPAWN_SETPGROUP  flag  is  not  set  in  the   spawn-flags  attribute  of  the  object
28344              referenced  by   attrp ,  the  new  child  process  shall  inherit  the  parent's  process  group.

28345  PS         If  the  POSIX_SPAWN_SETSCHEDPARAM  flag  is  set  in  the   spawn-flags  attribute  of  the  object
28346               referenced  by   attrp ,  but  POSIX_SPAWN_SETSCHEDULER  is  not  set,  the  new  process  image
28347               shall  initially  have  the  scheduling  policy  of  the  calling  process  with  the  scheduling  parameters
28348               specified  in  the   spawn-schedparam  attribute  of  the  object  referenced  by   attrp .

28349               If  the  POSIX_SPAWN_SETSCHEDULER  flag  is  set  in  the   spawn-flags  attribute  of  the  object
28350               referenced  by   attrp  (regardless  of  the  setting  of  the  POSIX_SPAWN_SETSCHEDPARAM  flag),
28351               the  new  process  image  shall  initially  have  the  scheduling  policy  specified  in  the   spawn -
28352               schedpolicy  attribute  of  the  object  referenced  by   attrp  and  the  scheduling  parameters  specified  in
28353               the   spawn-schedparam  attribute  of  the  same  object.

28354              The  POSIX_SPAWN_RESETIDS  flag  in  the   spawn-flags  attribute  of  the  object  referenced  by   attrp
28355              governs  the  effective  user  ID  of  the  child  process.  If  this  flag  is  not  set,  the  child  process  shall
28356              inherit  the  parent  process'  effective  user  ID.  If  this  flag  is  set,  the  child  process'  effective  user  ID
28357              shall  be  reset  to  the  parent's  real  user  ID.  In  either  case,  if  the  set-user-ID  mode  bit  of  the  new
28358              process  image  file  is  set,  the  effective  user  ID  of  the  child  process  shall  become  that  file's  owner
28359              ID  before  the  new  process  image  begins  execution.

28360              The  POSIX_SPAWN_RESETIDS  flag  in  the   spawn-flags  attribute  of  the  object  referenced  by   attrp
28361              also  governs  the  effective  group  ID  of  the  child  process.  If  this  flag  is  not  set,  the  child  process
28362              shall  inherit  the  parent  process'  effective  group  ID.  If  this  flag  is  set,  the  child  process'  effective
28363              group  ID  shall  be  reset  to  the  parent's  real  group  ID.  In  either  case,  if  the  set-group-ID  mode  bit
28364              of  the  new  process  image  file  is  set,  the  effective  group  ID  of  the  child  process  shall  become  that
28365              file's  group  ID  before  the  new  process  image  begins  execution.

28366              If  the  POSIX_SPAWN_SETSIGMASK  flag  is  set  in  the   spawn-flags  attribute  of  the  object
28367              referenced  by   attrp ,  the  child  process  shall  initially  have  the  signal  mask  specified  in  the   spawn -
28368               sigmask  attribute  of  the  object  referenced  by   attrp .

28369              If  the  POSIX_SPAWN_SETSIGDEF  flag  is  set  in  the   spawn-flags  attribute  of  the  object  referenced
28370              by   attrp ,  the  signals  specified  in  the   spawn-sigdefault  attribute  of  the  same  object  shall  be  set  to
28371              their  default  actions  in  the  child  process.  Signals  set  to  the  default  action  in  the  parent  process
28372              shall  be  set  to  the  default  action  in  the  child  process.

28373              Signals  set  to  be  caught  by  the  calling  process  shall  be  set  to  the  default  action  in  the  child
28374              process.

28375              Except  for  SIGCHLD,  signals  set  to  be  ignored  by  the  calling  process  image  shall  be  set  to  be
28376              ignored  by  the  child  process,  unless  otherwise  specified  by  the  POSIX_SPAWN_SETSIGDEF  flag
28377              being  set  in  the   spawn-flags  attribute  of  the  object  referenced  by   attrp  and  the  signals  being
28378              indicated  in  the   spawn-sigdefault  attribute  of  the  object  referenced  by   attrp .

28379              If  the  SIGCHLD  signal  is  set  to  be  ignored  by  the  calling  process,  it  is  unspecified  whether  the
28380              SIGCHLD  signal  is  set  to  be  ignored  or  to  the  default  action  in  the  child  process,  unless
28381              otherwise  specified  by  the  POSIX_SPAWN_SETSIGDEF  flag  being  set  in  the   spawn_flags
28382              attribute  of  the  object  referenced  by   attrp  and  the  SIGCHLD  signal  being  indicated  in  the
28383               spawn_sigdefault  attribute  of  the  object  referenced  by   attrp .

28384              If  the  value  of  the   attrp  pointer  is  NULL,  then  the  default  values  are  used.

28385              All  process  attributes,  other  than  those  influenced  by  the  attributes  set  in  the  object  referenced
28386              by   attrp  as  specified  above  or  by  the  file  descriptor  manipulations  specified  in   file_actions,  shall
28387              appear  in  the  new  process  image  as  though   fork ()  had  been  called  to  create  a  child  process  and
28388              then  a  member  of  the   exec  family  of  functions  had  been  called  by  the  child  process  to  execute  the
28389              new  process  image.

28390  THR       It  is  implementation-defined  whether  the  fork  handlers  are  run  when   posix_spawn ()  or
28391               posix_spawnp ()  is  called.


28392   RETURN  VALUE
28393              Upon  successful  completion,   posix_spawn ()  and   posix_spawnp ()  shall  return  the  process  ID  of  the
28394              child  process  to  the  parent  process,  in  the  variable  pointed  to  by  a  non-NULL   pid  argument,  and
28395              shall  return  zero  as  the  function  return  value.  Otherwise,  no  child  process  shall  be  created,  the
28396              value  stored  into  the  variable  pointed  to  by  a  non-NULL   pid  is  unspecified,  and  an  error  number
28397              shall  be  returned  as  the  function  return  value  to   indicate  the  error.  If  the   pid  argument  is  a  null
28398              pointer,  the  process  ID  of  the  child  is  not  returned  to  the  caller.


28399   ERRORS
28400              The   posix_spawn ()  and   posix_spawnp ()  functions  may  fail  if:

28401              [EINVAL]                    The  value  specified  by   file_actions  or   attrp  is  invalid.

28402              If  this  error  occurs  after  the  calling  process  successfully  returns  from  the   posix_spawn ()  or
28403               posix_spawnp ()  function,  the  child  process  may  exit  with  exit  status  127.

28404              If   posix_spawn ()  or   posix_spawnp ()  fail  for  any  of  the  reasons  that  would  cause   fork ()  or  one  of
28405              the   exec  family  of  functions  to  fail,  an  error  value  shall  be  returned  as  described  by   fork ()  and
28406               exec ,  respectively  (or,  if  the  error  occurs  after  the  calling  process  successfully  returns,  the  child
28407              process  shall  exit  with  exit  status  127).

28408              If  POSIX_SPAWN_SETPGROUP  is  set  in  the   spawn-flags  attribute  of  the  object  referenced  by
28409               attrp ,  and   posix_spawn ()  or   posix_spawnp ()  fails  while  changing  the  child's  process  group,  an
28410              error  value  shall  be  returned  as  described  by   setpgid ()  (or,  if  the  error  occurs  after  the  calling
28411              process  successfully  returns,  the  child  process  shall  exit  with  exit  status  127).

28412  PS         If  POSIX_SPAWN_SETSCHEDPARAM  is  set  and  POSIX_SPAWN_SETSCHEDULER  is  not  set
28413               in  the   spawn-flags  attribute  of  the  object  referenced  by   attrp ,  then  if   posix_spawn ()  or
28414               posix_spawnp ()  fails  for  any  of  the  reasons  that  would  cause   sched_setparam ()  to  fail,  an  error
28415               value  shall  be  returned  as  described  by   sched_setparam ()  (or,  if  the  error  occurs  after  the  calling
28416               process  successfully  returns,  the  child  process  shall  exit  with  exit  status  127).

28417               If  POSIX_SPAWN_SETSCHEDULER  is  set  in  the   spawn-flags  attribute  of  the  object  referenced  by
28418               attrp ,  and  if   posix_spawn ()  or   posix_spawnp ()  fails  for  any  of  the  reasons  that  would  cause
28419               sched_setscheduler ()  to  fail,  an  error  value  shall  be  returned  as  described  by   sched_setscheduler ()
28420               (or,  if  the  error  occurs  after  the  calling  process  successfully  returns,  the  child  process  shall  exit
28421               with  exit  status  127).

28422              If  the   file_actions  argument  is  not  NULL,  and  specifies  any   close,  dup2 ,  or   open  actions  to  be
28423              performed,  and  if   posix_spawn ()  or   posix_spawnp ()  fails  for  any  of  the  reasons  that  would  cause
28424               close (),   dup2 (),  or   open ()  to  fail,  an  error  value  shall  be  returned  as  described  by   close (),   dup2 (),
28425              and   open (),  respectively  (or,  if  the  error  occurs  after  the  calling  process  successfully  returns,  the
28426              child  process  shall  exit  with  exit  status  127).  An  open  file  action  may,  by  itself,  result  in  any  of
28427              the  errors  described  by   close ()  or   dup2 (),  in  addition  to  those  described  by   open ().


28428   EXAMPLES
28429              None.


28430   APPLICATION  USAGE
28431              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all   implementations .


28432   RATIONALE
28433              The   posix_spawn ()  function  and  its  close  relation   posix_spawnp ()  have  been  introduced  to
28434               overcome  the  following  perceived  difficulties  with   fork ():  the   fork ()  function  is  difficult  or
28435               impossible  to  implement  without  swapping  or  dynamic  address  translation.

28436                  Swapping  is   generally  too  slow  for  a  realtime  environment.
28437                  Dynamic  address  translation  is  not  available  everywhere  that  POSIX  might  be  useful.
28438                  Processes  are  too  useful  to  simply  option  out  of  POSIX  whenever  it  must  run  without
28439                address  translation  or  other  MMU  services.

28440              Thus,  POSIX  needs  process  creation  and  file  execution  primitives  that  can  be   efficiently
28441              implemented  without  address  translation  or  other  MMU  services.

28442              The   posix_spawn ()  function  is  implementable  as  a  library  routine,  but  both   posix_spawn ()  and
28443               posix_spawnp ()  are  designed  as  kernel  operations.  Also,  although  they  may  be  an  efficient
28444              replacement  for  many   fork ()/   exec  pairs,  their  goal  is  to  provide  useful  process  creation
28445              primitives  for  systems  that  have  difficulty  with   fork (),  not  to  provide  drop-in   replacements  for
28446               fork ()/   exec .

28447              This  view  of  the  role  of   posix_spawn ()  and   posix_spawnp ()  influenced  the  design  of  their  API.  It
28448              does  not  attempt  to  provide  the  full  functionality  of   fork ()/   exec  in  which  arbitrary   user-specified
28449              operations  of  any   sort  are  permitted  between  the  creation  of  the  child  process  and  the  execution
28450              of  the  new  process  image;  any  attempt  to  reach  that  level  would  need  to  provide  a  programming
28451              language  as  parameters.  Instead,   posix_spawn ()  and   posix_spawnp ()  are  process  creation
28452              primitives  like  the   Start_Process  and   Start_Process_Search  Ada  language  bindings  package
28453               POSIX_Process_Primitives  and  also  like  those  in  many  operating  systems  that  are  not  UNIX
28454              systems,  but  with  some  POSIX-specific  additions.

28455              To  achieve  its  coverage  goals,   posix_spawn ()  and   posix_spawnp ()  have  control  of  six  types  of
28456              inheritance:  file  descriptors,  process  group  ID,  user  and  group  ID,  signal  mask,  scheduling,  and
28457              whether  each  signal  ignored  in  the  parent  will  remain  ignored  in  the  child,  or  be  reset  to  its
28458              default  action  in  the  child.

28459              Control  of  file  descriptors  is  required  to  allow  an  independently  written  child  process  image  to
28460              access  data  streams  opened  by  and  even  generated  or  read  by  the  parent  process  without  being
28461               specifically  coded  to  know  which  parent  files  and  file  descriptors  are  to  be  used.  Control  of  the
28462              process  group  ID  is  required  to  control  how  the  child  process'  job  control   relates  to  that  of  the
28463              parent.

28464              Control  of  the  signal  mask  and  signal  defaulting  is  sufficient  to  support  the  implementation  of
28465               system ().  Although  support  for   system ()  is  not  explicitly  one  of  the  goals  for   posix_spawn ()  and
28466               posix_spawnp (),  it  is  covered  under  the  "at  least  50%"  coverage  goal.

28467              The   intention  is  that  the  normal  file  descriptor  inheritance  across   fork (),  the   subsequent  effect  of
28468              the  specified  spawn  file  actions,  and  the  normal  file  descriptor  inheritance  across  one  of  the   exec
28469              family  of  functions  should  fully  specify  open  file  inheritance.  The  implementation  need  make  no
28470              decisions  regarding  the  set  of  open  file  descriptors  when  the  child  process  image  begins
28471              execution,  those  decisions  having  already  been  made  by  the  caller  and   expressed  as  the  set  of
28472              open  file  descriptors  and  their  FD_CLOEXEC  flags  at  the  time  of  the  call  and  the  spawn  file
28473              actions  object  specified  in  the  call.  We  have  been  assured  that  in  cases  where  the  POSIX
28474               Start_Process  Ada  primitives  have  been  implemented  in  a  library,  this  method  of  controlling  file
28475              descriptor  inheritance  may  be  implemented  very  easily.

28476              We  can  identify  several  problems  with   posix_spawn ()  and   posix_spawnp (),  but  there  does  not
28477              appear  to  be  a  solution  that  introduces  fewer  problems.  Environment  modification  for  child
28478              process  attributes  not  specifiable  via  the   attrp  or   file_actions  arguments  must  be  done  in  the
28479              parent  process,  and  since  the  parent  generally  wants  to  save  its  context,  it  is  more  costly  than
28480              similar  functionality  with   fork ()/   exec .  It  is  also  complicated  to  modify  the  environment  of  a
28481              multi-threaded  process  temporarily,  since  all  threads  must  agree  when  it  is  safe  for  the
28482              environment  to  be  changed.  However,  this  cost  is  only   borne  by  those  invocations  of
28483               posix_spawn ()  and   posix_spawnp ()  that  use  the  additional  functionality.  Since   extensive
28484              modifications  are  not  the  usual  case,  and  are  particularly   unlikely  in  time-critical  code,  keeping
28485              much  of  the  environment  control  out  of   posix_spawn ()  and   posix_spawnp ()  is  appropriate  design.

28486              The   posix_spawn ()  and   posix_spawnp ()  functions  do  not  have  all  the  power  of   fork ()/   exec .  This  is
28487              to  be  expected.  The   fork ()  function  is  a  wonderfully  powerful  operation.  We  do  not  expect  to
28488              duplicate  its  functionality  in  a  simple,  fast  function  with  no  special  hardware  requirements.  It  is
28489              worth  noting  that   posix_spawn ()  and   posix_spawnp ()  are  very  similar  to  the  process  creation
28490              operations  on  many  operating  systems  that  are  not  UNIX  systems.


28491   Requirements

28492              The  requirements  for   posix_spawn ()  and   posix_spawnp ()  are:
28493                  They  must  be  implementable  without  an  MMU  or  unusual  hardware.
28494                  They  must  be  compatible  with  existing  POSIX  standards.
28495              Additional  goals  are:
28496                  They  should  be  efficiently  implementable.
28497                  They  should  be  able  to  replace  at  least  50%  of  typical  executions  of   fork ().
28498                  A  system  with   posix_spawn ()  and   posix_spawnp ()  and  without   fork ()  should  be  useful,  at  least
28499                    for  realtime  applications.
28500                  A  system  with   fork ()  and  the   exec  family  should  be  able  to  implement   posix_spawn ()  and
28501                     posix_spawnp ()  as  library  routines.


28502   Two-Syntax
28503              POSIX   exec  has  several  calling  sequences  with  approximately  the  same  functionality.  These
28504              appear  to  be  required  for  compatibility  with  existing  practice.  Since  the  existing  practice  for  the
28505               posix_spawn* ()  functions  is  otherwise  substantially  unlike  POSIX,  we  feel  that  simplicity
28506              outweighs  compatibility.  There  are,  therefore,  only  two   names  for  the   posix_spawn* ()  functions.

28507              The  parameter  list  does  not   differ  between   posix_spawn ()  and   posix_spawnp ();   posix_spawnp ()
28508              interprets  the  second  parameter  more  elaborately  than   posix_spawn ().


28509   Compatibility  with  POSIX.5  (Ada)

28510              The   Start_Process  and   Start_Process_Search  procedures  from  the   POSIX_Process_Primitives
28511              package  from  the  Ada  language  binding  to  POSIX.1  encapsulate   fork ()  and   exec  functionality  in  a
28512              manner  similar  to  that  of   posix_spawn ()  and   posix_spawnp ().  Originally,  in  keeping  with  our
28513              simplicity  goal,  the  standard  developers  had  limited  the  capabilities  of   posix_spawn ()  and
28514               posix_spawnp ()  to  a  subset  of  the  capabilities  of   Start_Process  and   Start_Process_Search;  certain
28515              non-default  capabilities  were  not  supported.  However,  based  on  suggestions  by  the  ballot  group
28516              to  improve  file  descriptor  mapping  or  drop  it,  and  on  the  advice  of  an  Ada  Language  Bindings
28517              working  group  member,  the  standard  developers  decided  that   posix_spawn ()  and   posix_spawnp ()
28518              should  be  sufficiently  powerful  to  implement   Start_Process  and   Start_Process_Search.  The
28519              rationale  is  that  if  the  Ada  language  binding  to  such  a  primitive  had  already  been  approved  as
28520              an  IEEE  standard,  there  can  be  little  justification  for  not  approving  the  functionally-equivalent
28521               parts  of  a  C  binding.  The  only  three  capabilities  provided  by   posix_spawn ()  and   posix_spawnp ()
28522              that  are  not  provided  by   Start_Process  and   Start_Process_Search  are   optionally  specifying  the
28523              child's  process  group  ID,  the  set  of  signals  to  be  reset  to  default  signal  handling  in  the  child
28524              process,  and  the  child's  scheduling  policy  and  parameters.


28525              For  the  Ada  language  binding  for   Start_Process  to  be  implemented  with   posix_spawn (),  that
28526              binding  would  need  to  explicitly  pass  an  empty  signal  mask  and  the  parent's  environment  to
28527               posix_spawn ()  whenever  the  caller  of   Start_Process  allowed  these  arguments  to  default,  since
28528               posix_spawn ()  does  not  provide  such  defaults.  The  ability  of   Start_Process  to  mask  user-specified
28529              signals  during  its  execution  is  functionally  unique  to  the  Ada  language  binding  and  must  be
28530              dealt  with  in  the  binding  separately  from  the  call  to   posix_spawn ().


28531   Process  Group

28532              The  process  group  inheritance  field  can  be  used  to  join  the  child  process  with  an  existing  process
28533              group.  By  assigning  a  value  of  zero  to  the   spawn-pgroup  attribute  of  the  object  referenced  by
28534               attrp ,  the   setpgid ()  mechanism  will  place  the  child  process  in  a  new  process  group.


28535   Threads

28536              Without  the   posix_spawn ()  and   posix_spawnp ()  functions,  systems  without  address  translation
28537              can  still  use  threads  to  give  an  abstraction  of  concurrency.  In  many  cases,  thread  creation
28538              suffices,  but  it  is  not  always  a  good  substitute.  The   posix_spawn ()  and   posix_spawnp ()  functions
28539              are  considerably  "heavier"  than  thread  creation.  Processes  have  several  important  attributes  that
28540              threads  do  not.  Even  without  address  translation,  a  process  may  have  base-and-bound  memory
28541              protection.  Each  process  has  a  process  environment  including  security  attributes  and  file
28542              capabilities,  and  powerful  scheduling  attributes.  Processes  abstract  the  behavior  of  non-
28543              uniform-memory-architecture  multi-processors  better  than  threads,  and  they  are  more
28544               convenient  to  use  for  activities  that  are  not  closely  linked.

28545              The   posix_spawn ()  and   posix_spawnp ()  functions  may  not  bring  support  for  multiple  processes  to
28546              every  configuration.  Process  creation  is  not  the  only  piece  of  operating  system  support  required
28547              to  support  multiple  processes.  The  total  cost  of  support  for  multiple  processes  may  be  quite  high
28548              in  some  circumstances.  Existing  practice  shows  that  support  for  multiple  processes  is
28549              uncommon  and  threads  are  common  among  "tiny   kernels ".  There  should,  therefore,  probably
28550              continue  to  be  AEPs  for  operating  systems  with  only  one  process.


28551   Asynchronous  Error  Notification

28552              A  library  implementation  of   posix_spawn ()  or   posix_spawnp ()  may  not  be  able  to  detect  all
28553              possible  errors  before  it  forks  the  child  process.  IEEE  Std  1003.1-2001  provides  for  an  error
28554              indication  returned  from  a  child  process  which  could  not  successfully  complete  the  spawn
28555              operation  via  a  special  exit  status  which  may  be   detected  using  the  status  value  returned  by
28556               wait ()  and   waitpid ().

28557              The   stat_val  interface  and  the  macros  used  to  interpret  it  are  not  well  suited  to  the  purpose  of
28558              returning  API  errors,  but  they  are  the  only  path  available  to  a  library  implementation.  Thus,  an
28559              implementation  may  cause  the  child  process  to  exit  with  exit  status  127  for  any  error  detected
28560              during  the  spawn  process  after  the   posix_spawn ()  or   posix_spawnp ()  function  has  successfully
28561              returned.

28562              The  standard  developers  had  proposed  using  two  additional  macros  to  interpret   stat_val.  The
28563              first,  WIFSPAWNFAIL,  would  have  detected  a  status  that  indicated  that  the  child  exited  because
28564              of  an  error  detected  during  the   posix_spawn ()  or   posix_spawnp ()  operations  rather  than  during
28565              actual  execution  of  the  child  process  image;  the  second,  WSPAWNERRNO,  would  have
28566              extracted  the  error  value  if  WIFSPAWNFAIL  indicated  a  failure.  Unfortunately,  the  ballot  group
28567              strongly  opposed  this  because  it  would  make  a  library  implementation  of   posix_spawn ()  or
28568               posix_spawnp ()  dependent  on  kernel  modifications  to   waitpid ()  to  be  able  to  embed  special
28569              information  in   stat_val  to  indicate  a  spawn  failure.

28570              The  8  bits  of  child  process  exit  status  that  are   guaranteed  by  IEEE  Std  1003.1-2001  to  be
28571              accessible  to  the  waiting  parent  process  are  insufficient  to  disambiguate  a  spawn  error  from  any
28572              other  kind  of  error  that  may  be  returned  by  an  arbitrary  process  image.  No  other  bits  of  the  exit
28573              status  are  required  to  be  visible  in   stat_val,  so  these  macros  could  not  be   strictly  implemented  at
28574              the  library  level.  Reserving  an  exit  status  of  127  for  such  spawn  errors  is  consistent  with  the  use
28575              of  this  value  by   system ()  and   popen ()  to  signal  failures  in  these  operations  that  occur  after  the
28576              function  has  returned  but  before  a  shell  is  able  to  execute.  The  exit  status  of  127  does  not
28577              uniquely  identify  this  class  of  error,  nor  does  it  provide  any  detailed  information  on  the  nature
28578              of  the  failure.  Note  that  a  kernel  implementation  of   posix_spawn ()  or   posix_spawnp ()  is  permitted
28579              (and  encouraged)  to  return  any  possible  error  as  the  function  value,  thus  providing  more
28580              detailed  failure  information  to  the  parent  process.

28581              Thus,  no  special  macros  are  available  to  isolate  asynchronous   posix_spawn ()  or   posix_spawnp ()
28582              errors.  Instead,  errors  detected  by  the   posix_spawn ()  or   posix_spawnp ()  operations  in  the  context
28583              of  the  child  process  before  the  new  process  image  executes  are   reported  by  setting  the  child's
28584              exit  status  to  127.  The  calling  process  may  use  the  WIFEXITED  and  WEXITSTATUS  macros  on
28585              the   stat_val  stored  by  the   wait ()  or   waitpid ()  functions  to  detect  spawn  failures  to  the  extent  that
28586              other  status  values  with  which  the  child  process  image  may  exit  (before  the  parent  can
28587              conclusively  determine  that  the  child  process  image  has  begun  execution)  are  distinct  from  exit
28588              status  127.


28589   FUTURE  DIRECTIONS
28590              None.


28591   SEE  ALSO
28592               alarm (),   chmod (),   close (),   dup (),   exec ,   exit (),   fcntl (),   fork (),   kill (),   open (),
28593               posix_spawn_file_actions_addclose (),   posix_spawn_file_actions_adddup2 (),
28594               posix_spawn_file_actions_addopen (),   posix_spawn_file_actions_destroy (),  <REFERENCE
28595              UNDEFINED>(posix_spawn_file_actions_init),   posix_spawnattr_destroy (),   posix_spawnattr_init (),
28596               posix_spawnattr_getsigdefault (),   posix_spawnattr_getflags (),   posix_spawnattr_getpgroup (),
28597               posix_spawnattr_getschedparam (),   posix_spawnattr_getschedpolicy (),   posix_spawnattr_getsigmask (),
28598               posix_spawnattr_setsigdefault (),   posix_spawnattr_setflags (),   posix_spawnattr_setpgroup (),
28599               posix_spawnattr_setschedparam (),   posix_spawnattr_setschedpolicy (),   posix_spawnattr_setsigmask (),
28600               sched_setparam (),   sched_setscheduler (),   setpgid (),   setuid (),   stat (),   times (),   wait (),  the  Base
28601              Definitions  volume  of  IEEE  Std  1003.1-2001,  < spawn.h>


28602   CHANGE  HISTORY
28603              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.

28604              IEEE  PASC  Interpretation  1003.1  #103  is  applied,  noting  that  the  signal  default  actions  are
28605              changed  as  well  as  the  signal  mask  in  step  2.

28606              IEEE  PASC  Interpretation  1003.1  #132  is  applied.


28607   NAME
28608              posix_spawn_file_actions_addclose,  posix_spawn_file_actions_addopen   ”  add  close  or  open
28609              action  to  spawn  file  actions  object   (ADVANCED  REALTIME)


28610   SYNOPSIS

 28611 SPN  #include <spawn.h>  28612  int posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *  28613   file_actions,  int  fildes  );  28614  int posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *  28615  restrict  file_actions,  int  fildes,   28616  const char *restrict  path,  int  oflag,  mode_t  mode  );  


28617


28618   DESCRIPTION
28619              These  functions  shall  add  or  delete  a  close  or  open  action  to  a  spawn  file  actions  object.

28620              A  spawn  file  actions  object  is  of  type   posix_spawn_file_actions_t  (defined  in  < spawn.h>)  and  is
28621              used  to  specify  a  series  of  actions  to  be  performed  by  a   posix_spawn ()  or   posix_spawnp ()
28622              operation  in  order  to   arrive  at  the  set  of  open  file  descriptors  for  the  child  process  given  the  set  of
28623              open  file  descriptors  of  the  parent.  IEEE  Std  1003.1-2001  does  not  define  comparison  or
28624              assignment  operators  for  the  type   posix_spawn_file_actions_t.

28625              A  spawn  file  actions  object,  when  passed  to   posix_spawn ()  or   posix_spawnp (),  shall  specify  how
28626              the  set  of  open  file  descriptors  in  the  calling  process  is  transformed  into  a  set  of   potentially  open
28627              file  descriptors  for  the  spawned  process.  This  transformation  shall  be  as  if  the  specified  sequence
28628              of  actions  was  performed  exactly  once,  in  the  context  of  the  spawned  process  (prior  to  execution
28629              of  the  new  process  image),  in  the  order  in  which  the  actions  were  added  to  the  object;
28630              additionally,  when  the  new  process  image  is  executed,  any  file  descriptor  (from  this  new  set)
28631              which  has  its  FD_CLOEXEC  flag  set  shall  be  closed  (see   posix_spawn ()).

28632              The   posix_spawn_file_actions_addclose ()  function  shall  add  a   close  action  to  the  object  referenced
28633              by   file_actions  that  shall  cause  the  file  descriptor   fildes  to  be  closed  (as  if   close ( fildes )  had  been
28634              called)  when  a  new  process  is  spawned  using  this  file  actions  object.

28635              The   posix_spawn_file_actions_addopen ()  function  shall  add  an   open  action  to  the  object  referenced
28636              by   file_actions  that  shall  cause  the  file  named  by   path  to  be  opened  (as  if   open ( path,  oflag,  mode )
28637              had  been  called,  and  the  returned  file  descriptor,  if  not   fildes ,  had  been  changed  to   fildes )  when  a
28638              new  process  is  spawned  using  this  file  actions  object.  If   fildes  was  already  an  open  file  descriptor,
28639              it  shall  be  closed  before  the  new  file  is  opened.

28640              The  string  described  by   path  shall  be   copied  by  the   posix_spawn_file_actions_addopen ()  function.


28641   RETURN  VALUE
28642              Upon  successful  completion,  these  functions  shall  return  zero;  otherwise,  an  error  number  shall
28643              be  returned  to  indicate  the  error.


28644   ERRORS
28645              These  functions  shall  fail  if:

28646              [EBADF]                      The  value  specified  by   fildes  is  negative  or  greater  than  or  equal  to
28647                                                  {OPEN_MAX}.

28648              These  functions  may  fail  if:

28649              [EINVAL]                    The  value  specified  by   file_actions  is  invalid.
28650              [ENOMEM]                  Insufficient  memory  exists  to  add  to  the  spawn  file  actions  object.

28651              It  shall  not  be   considered  an  error  for  the   fildes  argument  passed  to  these  functions  to  specify  a
28652              file  descriptor  for  which  the  specified  operation  could  not  be  performed  at  the  time  of  the  call.
28653              Any  such  error  will  be  detected  when  the  associated  file  actions  object  is  later  used  during  a
28654               posix_spawn ()  or   posix_spawnp ()  operation.


28655   EXAMPLES
28656              None.


28657   APPLICATION  USAGE
28658              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all  implementations.


28659   RATIONALE
28660              A  spawn  file  actions  object  may  be  initialized  to  contain  an  ordered  sequence  of   close (),   dup2 (),
28661              and   open ()  operations  to  be  used  by   posix_spawn ()  or   posix_spawnp ()  to  arrive  at  the  set  of  open
28662              file  descriptors  inherited  by  the  spawned  process  from  the  set  of  open  file  descriptors  in  the
28663              parent  at  the  time  of  the   posix_spawn ()  or   posix_spawnp ()  call.  It  had  been  suggested  that  the
28664               close ()  and   dup2 ()  operations  alone  are  sufficient  to  rearrange  file  descriptors,  and  that  files
28665              which  need  to  be  opened  for  use  by  the  spawned  process  can  be  handled  either  by  having  the
28666              calling  process  open  them  before  the   posix_spawn ()  or   posix_spawnp ()  call  (and  close  them  after),
28667              or  by  passing  filenames  to  the  spawned  process  (in   argv )  so  that  it  may  open  them  itself.  The
28668              standard  developers  recommend  that  applications  use  one  of  these  two   methods  when  practical,
28669              since  detailed  error  status  on  a  failed  open  operation  is  always  available  to  the  application  this
28670              way.  However,  the  standard  developers  feel  that  allowing  a  spawn  file  actions  object  to  specify
28671              open  operations  is  still  appropriate  because:

28672                1.  It  is  consistent  with  equivalent  POSIX.5  (Ada)  functionality.
28673                2.  It  supports  the  I/O  redirection  paradigm  commonly  employed  by  POSIX  programs
28674                    designed  to  be  invoked  from  a  shell.  When  such  a  program  is  the  child  process,  it  may  not
28675                    be  designed  to  open  files  on  its  own.
28676                3.  It  allows  file  opens  that  might  otherwise  fail  or   violate  file  ownership/access  rights  if
28677                    executed  by  the  parent  process.

28678              Regarding  2.  above,  note  that  the  spawn  open  file  action  provides  to   posix_spawn ()  and
28679               posix_spawnp ()  the  same  capability  that  the  shell  redirection  operators  provide  to   system (),  only
28680              without  the   intervening  execution  of  a  shell;  for  example:

 28681       system ("myprog <file1 3<file2"); 


28682              Regarding  3.  above,  note  that  if  the  calling  process  needs  to  open  one  or  more  files  for  access  by
28683              the  spawned  process,  but  has  insufficient  spare  file  descriptors,  then  the  open  action  is  necessary
28684              to  allow  the   open ()  to  occur  in  the  context  of  the  child  process  after  other  file  descriptors  have
28685              been  closed  (that  must  remain  open  in  the  parent).

28686              Additionally,  if  a  parent  is  executed  from  a  file  having  a  "set-user-id"  mode  bit  set  and  the
28687              POSIX_SPAWN_RESETIDS  flag  is  set  in  the  spawn  attributes,  a  file  created  within  the  parent
28688              process  will  (possibly  incorrectly)  have  the  parent's  effective  user  ID  as  its  owner,  whereas  a  file
28689              created  via  an   open ()  action  during   posix_spawn ()  or   posix_spawnp ()  will  have  the  parent's  real
28690              ID  as  its  owner;  and  an  open  by  the  parent  process  may  successfully  open  a  file  to  which  the  real
28691              user  should  not  have  access  or  fail  to  open  a  file  to  which  the  real  user  should  have  access.


28692   File  Descriptor  Mapping

28693              The  standard  developers  had  originally  proposed  using  an  array  which  specified  the  mapping  of
28694              child  file  descriptors  back  to  those  of  the  parent.  It  was  pointed  out  by  the  ballot  group  that  it  is
28695              not  possible  to  reshuffle  file  descriptors  arbitrarily  in  a  library  implementation  of   posix_spawn ()
28696              or   posix_spawnp ()  without  provision  for  one  or  more  spare  file  descriptor  entries  (which  simply
28697              may  not  be  available).  Such  an  array  requires  that  an  implementation  develop  a  complex
28698              strategy  to  achieve  the  desired  mapping  without  inadvertently  closing  the  wrong  file  descriptor
28699              at  the  wrong  time.

28700              It  was  noted  by  a  member  of  the  Ada  Language  Bindings  working  group  that  the  approved  Ada
28701              Language   Start_Process  family  of  POSIX  process  primitives  use  a  caller-specified  set  of  file
28702              actions  to  alter  the  normal   fork ()/   exec  semantics  for  inheritance  of  file  descriptors  in  a  very
28703              flexible  way,  yet  no  such  problems  exist  because  the   burden  of  determining  how  to  achieve  the
28704              final  file  descriptor  mapping  is  completely  on  the  application.  Furthermore,  although  the  file
28705              actions  interface  appears  frightening  at  first  glance,  it  is  actually  quite  simple  to  implement  in
28706              either  a  library  or  the  kernel.


28707   FUTURE  DIRECTIONS
28708              None.


28709   SEE  ALSO
28710               close (),   dup (),   open (),   posix_spawn (),   posix_spawn_file_actions_adddup2 (),
28711               posix_spawn_file_actions_destroy (),   posix_spawnp (),  the  Base  Definitions  volume  of
28712              IEEE  Std  1003.1-2001,  < spawn.h>


28713   CHANGE  HISTORY
28714              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.
28715              IEEE  PASC  Interpretation  1003.1  #105  is  applied,  adding  a  note  to  the  DESCRIPTION  that  the
28716              string  pointed  to  by   path  is  copied  by  the   posix_spawn_file_actions_addopen ()  function.


28717   NAME
28718              posix_spawn_file_actions_adddup2   ”  add  dup2  action  to  spawn  file  actions  object
28719               (ADVANCED  REALTIME)


28720   SYNOPSIS

 28721 SPN  #include <spawn.h>  28722  int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *  28723   file_actions,  int  fildes,  int  newfildes  );  


28724


28725   DESCRIPTION
28726              The   posix_spawn_file_actions_adddup2 ()  function  shall  add  a   dup2 ()  action  to  the  object
28727              referenced  by   file_actions  that  shall  cause  the  file  descriptor   fildes  to  be   duplicated  as   newfildes  (as
28728              if   dup2 ( fildes,  newfildes )  had  been  called)  when  a  new  process  is  spawned  using  this  file  actions
28729              object.

28730              A  spawn  file  actions  object  is  as  defined  in   posix_spawn_file_actions_addclose ().


28731   RETURN  VALUE
28732              Upon  successful  completion,  the   posix_spawn_file_actions_adddup2 ()  function  shall  return  zero;
28733              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


28734   ERRORS
28735              The   posix_spawn_file_actions_adddup2 ()  function  shall  fail  if:
28736              [EBADF]                  The  value  specified  by   fildes  or   newfildes  is  negative  or  greater  than  or  equal  to
28737                                              {OPEN_MAX}.
28738              [ENOMEM]                Insufficient  memory  exists  to  add  to  the  spawn  file  actions  object.

28739              The   posix_spawn_file_actions_adddup2 ()  function  may  fail  if:

28740              [EINVAL]                The  value  specified  by   file_actions  is  invalid.

28741              It  shall  not  be  considered  an  error  for  the   fildes  argument  passed  to  the
28742               posix_spawn_file_actions_adddup2 ()  function  to  specify  a  file  descriptor  for  which  the  specified
28743              operation  could  not  be  performed  at  the  time  of  the  call.  Any  such  error  will  be  detected  when
28744              the  associated  file  actions  object  is  later  used  during  a   posix_spawn ()  or   posix_spawnp ()
28745              operation.


28746   EXAMPLES
28747              None.


28748   APPLICATION  USAGE
28749              The   posix_spawn_file_actions_adddup2 ()  function  is  part  of  the  Spawn  option  and  need  not  be
28750              provided  on  all  implementations.


28751   RATIONALE
28752              Refer  to  the  RATIONALE  in   posix_spawn_file_actions_addclose ().


28753   FUTURE  DIRECTIONS
28754              None.


28755   SEE  ALSO
28756               dup (),   posix_spawn (),   posix_spawn_file_actions_addclose (),   posix_spawn_file_actions_destroy (),
28757               posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < spawn.h>


28758   CHANGE  HISTORY
28759              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.

28760              IEEE  PASC  Interpretation  1003.1  #104  is  applied,  noting  that  the  [EBADF]  error  can  apply  to  the
28761               newfildes  argument  in  addition  to   fildes .


28773   NAME
28774              posix_spawn_file_actions_destroy,  posix_spawn_file_actions_init   ”  destroy  and  initialize
28775              spawn  file  actions  object  ( ADVANCED  REALTIME )


28776   SYNOPSIS

 28777 SPN  #include <spawn.h>  28778  int posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *  28779   file_actions);   28780  int posix_spawn_file_actions_init (posix_spawn_file_actions_t *  28781   file_actions);   


28782


28783   DESCRIPTION
28784              The   posix_spawn_file_actions_destroy ()  function  shall  destroy  the  object  referenced  by   file_actions;
28785              the  object  becomes,  in  effect,   uninitialized .  An  implementation  may  cause
28786               posix_spawn_file_actions_destroy ()  to  set  the  object  referenced  by   file_actions  to  an  invalid  value.  A
28787               destroyed  spawn  file  actions  object  can  be  reinitialized  using   posix_spawn_file_actions_init ();  the
28788              results  of  otherwise  referencing  the  object  after  it  has  been  destroyed  are  undefined.

28789              The   posix_spawn_file_actions_init ()  function  shall  initialize  the  object  referenced  by   file_actions  to
28790              contain  no  file  actions  for   posix_spawn ()  or   posix_spawnp ()  to  perform.

28791              A  spawn  file  actions  object  is  as  defined  in   posix_spawn_file_actions_addclose ().
28792              The  effect  of  initializing  an  already  initialized  spawn  file  actions  object  is  undefined.


28793   RETURN  VALUE
28794              Upon  successful  completion,  these  functions  shall  return  zero;  otherwise,  an  error  number  shall
28795              be  returned  to  indicate  the  error.


28796   ERRORS
28797              The   posix_spawn_file_actions_init ()  function  shall  fail  if:

28798              [ENOMEM]                Insufficient  memory  exists  to  initialize  the  spawn  file  actions  object.
28799              The   posix_spawn_file_actions_destroy ()  function  may  fail  if:

28800              [EINVAL]                The  value  specified  by   file_actions  is  invalid.


28801   EXAMPLES
28802              None.


28803   APPLICATION  USAGE
28804              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all  implementations.


28805   RATIONALE
28806              Refer  to  the  RATIONALE  in   posix_spawn_file_actions_addclose ().


28807   FUTURE  DIRECTIONS
28808              None.


28809   SEE  ALSO
28810               posix_spawn (),   posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < spawn.h>


28811   CHANGE  HISTORY
28812              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.

28813              In  the  SYNOPSIS,  the  inclusion  of  < sys/types.h>  is  no  longer  required.


28814   NAME
28815              posix_spawnattr_destroy,  posix_spawnattr_init ”destroy  and  initialize  spawn  attributes  object
28816              ( ADVANCED  REALTIME )


28817   SYNOPSIS

 28818 SPN  #include <spawn.h>  28819  int posix_spawnattr_destroy (posix_spawnattr_t *  attr  );  28820  int posix_spawnattr_init (posix_spawnattr_t *  attr  );  


28821


28822   DESCRIPTION
28823              The   posix_spawnattr_destroy ()  function  shall  destroy  a  spawn  attributes  object.  A  destroyed   attr
28824              attributes  object  can  be  reinitialized  using   posix_spawnattr_init ();  the  results  of  otherwise
28825              referencing  the  object  after  it  has  been  destroyed  are  undefined.  An  implementation  may  cause
28826               posix_spawnattr_destroy ()  to  set  the  object  referenced  by   attr  to  an  invalid  value.

28827              The   posix_spawnattr_init ()  function  shall  initialize  a  spawn  attributes  object   attr  with  the  default
28828              value  for  all  of  the  individual  attributes  used  by  the  implementation.  Results  are  undefined  if
28829               posix_spawnattr_init ()  is  called  specifying  an  already  initialized   attr  attributes  object.

28830              A  spawn  attributes  object  is  of  type   posix_spawnattr_t  (defined  in  < spawn.h>)  and  is  used  to
28831              specify  the  inheritance  of  process  attributes  across  a  spawn  operation.  IEEE  Std  1003.1-2001  does
28832              not  define  comparison  or  assignment  operators  for  the  type   posix_spawnattr_t.

28833              Each  implementation  shall  document  the  individual  attributes  it  uses  and  their  default  values
28834              unless  these  values  are  defined  by  IEEE  Std  1003.1-2001.  Attributes  not  defined  by
28835              IEEE  Std  1003.1-2001,  their  default  values,  and  the  names  of  the  associated  functions  to  get  and
28836              set  those  attribute  values  are  implementation-defined.

28837              The  resulting  spawn  attributes  object  (possibly  modified  by  setting  individual  attribute  values),
28838              is  used  to  modify  the  behavior  of   posix_spawn ()  or   posix_spawnp ().  After  a  spawn  attributes
28839              object  has  been  used  to  spawn  a  process  by  a  call  to  a   posix_spawn ()  or   posix_spawnp (),  any
28840              function   affecting  the  attributes  object  (including  destruction)  shall  not  affect  any  process  that
28841              has  been  spawned  in  this  way.


28842   RETURN  VALUE
28843              Upon  successful  completion,   posix_spawnattr_destroy ()  and   posix_spawnattr_init ()  shall  return
28844              zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


28845   ERRORS
28846              The   posix_spawnattr_init ()  function  shall  fail  if:

28847              [ENOMEM]                Insufficient  memory  exists  to  initialize  the  spawn  attributes  object.

28848              The   posix_spawnattr_destroy ()  function  may  fail  if:

28849              [EINVAL]                The  value  specified  by  attr  is  invalid.


28850   EXAMPLES
28851              None.


28852   APPLICATION  USAGE
28853              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all  implementations.


28854   RATIONALE
28855              The  original  spawn  interface  proposed  in  IEEE  Std  1003.1-2001  defined  the  attributes  that  specify
28856              the  inheritance  of  process  attributes  across  a  spawn  operation  as  a  structure.  In  order  to  be  able
28857              to  separate  optional  individual  attributes  under  their  appropriate  options  (that  is,  the   spawn-
28858               schedparam  and   spawn-schedpolicy  attributes  depending  upon  the  Process  Scheduling  option),  and
28859              also  for  extensibility  and  consistency  with  the   newer  POSIX  interfaces,  the  attributes  interface
28860              has  been  changed  to  an   opaque  data  type.  This  interface  now  consists  of  the  type
28861               posix_spawnattr_t,  representing  a  spawn  attributes  object,  together  with  associated  functions  to
28862              initialize  or  destroy  the  attributes  object,  and  to  set  or  get  each  individual  attribute.  Although  the
28863              new  object-oriented  interface  is  more  verbose  than  the  original  structure,  it  is  simple  to  use,
28864              more  extensible,  and  easy  to  implement.


28865   FUTURE  DIRECTIONS
28866              None.


28867   SEE  ALSO
28868               posix_spawn (),   posix_spawnattr_getsigdefault (),   posix_spawnattr_getflags (),
28869               posix_spawnattr_getpgroup (),   posix_spawnattr_getschedparam (),   posix_spawnattr_getschedpolicy (),
28870               posix_spawnattr_getsigmask (),   posix_spawnattr_setsigdefault (),   posix_spawnattr_setflags (),
28871               posix_spawnattr_setpgroup (),   posix_spawnattr_setsigmask (),   posix_spawnattr_setschedpolicy (),
28872               posix_spawnattr_setschedparam (),   posix_spawnp (),  the  Base  Definitions  volume  of
28873              IEEE  Std  1003.1-2001,  < spawn.h>


28874   CHANGE  HISTORY
28875              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.

28876              IEEE  PASC  Interpretation  1003.1  #106  is  applied,  noting  that  the  effect  of  initializing  an  already
28877              initialized  spawn  attributes  option  is  undefined.


28878   NAME
28879              posix_spawnattr_getflags,  posix_spawnattr_setflags   ”  get  and  set  the  spawn-flags  attribute  of  a
28880              spawn  attributes  object   (ADVANCED  REALTIME)


28881   SYNOPSIS

 28882 SPN  #include <spawn.h>  28883  int posix_spawnattr_getflags (const posix_spawnattr_t *restrict  attr,   28884  short *restrict  flags  );  28885  int posix_spawnattr_setflags (posix_spawnattr_t *  attr,  short  flags  );  


28886


28887   DESCRIPTION
28888              The   posix_spawnattr_getflags ()  function  shall  obtain  the  value  of  the   spawn-flags  attribute  from
28889              the  attributes  object  referenced  by   attr .

28890              The   posix_spawnattr_setflags ()  function  shall  set  the   spawn-flags  attribute  in  an  initialized
28891              attributes  object  referenced  by   attr .

28892              The   spawn-flags  attribute  is  used  to  indicate  which  process  attributes  are  to  be  changed  in  the
28893              new  process  image  when  invoking   posix_spawn ()  or   posix_spawnp ().  It  is  the  bitwise-inclusive
28894              OR  of  zero  or  more  of  the  following  flags:

28895              POSIX_SPAWN_RESETIDS
28896              POSIX_SPAWN_SETPGROUP
28897              POSIX_SPAWN_SETSIGDEF
28898              POSIX_SPAWN_SETSIGMASK
28899  PS         POSIX_SPAWN_SETSCHEDPARAM
28900               POSIX_SPAWN_SETSCHEDULER
28901

28902              These  flags  are  defined  in  < spawn.h>.  The  default  value  of  this  attribute  shall  be  as  if  no  flags
28903              were  set.


28904   RETURN  VALUE
28905              Upon  successful  completion,   posix_spawnattr_getflags ()  shall  return  zero  and  store  the  value  of
28906              the   spawn-flags  attribute  of   attr  into  the  object  referenced  by  the   flags  parameter;  otherwise,  an
28907              error  number  shall  be  returned  to  indicate  the  error.

28908              Upon  successful  completion,   posix_spawnattr_setflags ()  shall  return  zero;  otherwise,  an  error
28909              number  shall  be  returned  to  indicate  the  error.


28910   ERRORS
28911              These  functions  may  fail  if:

28912              [EINVAL]                    The  value  specified  by   attr  is  invalid.

28913              The   posix_spawnattr_setflags ()  function  may  fail  if:

28914              [EINVAL]                    The  value  of  the  attribute  being  set  is  not  valid.


28915   EXAMPLES
28916              None.


28917   APPLICATION  USAGE
28918              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all  implementations.


28919   RATIONALE
28920              None.


28921   FUTURE  DIRECTIONS
28922              None.


28923   SEE  ALSO
28924               posix_spawn (),   posix_spawnattr_destroy (),   posix_spawnattr_init (),   posix_spawnattr_getsigdefault (),
28925               posix_spawnattr_getpgroup (),   posix_spawnattr_getschedparam (),   posix_spawnattr_getschedpolicy (),
28926               posix_spawnattr_getsigmask (),   posix_spawnattr_setsigdefault (),   posix_spawnattr_setpgroup (),
28927               posix_spawnattr_setschedparam (),   posix_spawnattr_setschedpolicy (),   posix_spawnattr_setsigmask (),
28928               posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < spawn.h>


28929   CHANGE  HISTORY
28930              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.


28931   NAME
28932              posix_spawnattr_getpgroup,  posix_spawnattr_setpgroup   ”  get  and  set  the  spawn-pgroup
28933              attribute  of  a  spawn  attributes  object   (ADVANCED  REALTIME)


28934   SYNOPSIS

 28935 SPN  #include <spawn.h>  28936  int posix_spawnattr_getpgroup (const posix_spawnattr_t *restrict  attr,   28937  pid_t *restrict  pgroup  );  28938  int posix_spawnattr_setpgroup (posix_spawnattr_t *  attr,  pid_t  pgroup  );  


28939


28940   DESCRIPTION
28941              The   posix_spawnattr_getpgroup ()  function  shall  obtain  the  value  of  the   spawn-pgroup  attribute
28942              from  the  attributes  object  referenced  by   attr .

28943              The   posix_spawnattr_setpgroup ()  function  shall  set  the   spawn-pgroup  attribute  in  an  initialized
28944              attributes  object  referenced  by   attr .

28945              The   spawn-pgroup  attribute  represents  the  process  group  to  be  joined  by  the  new  process  image
28946              in  a  spawn  operation  (if  POSIX_SPAWN_SETPGROUP  is  set  in  the   spawn-flags  attribute).  The
28947              default  value  of  this  attribute  shall  be  zero.


28948   RETURN  VALUE
28949              Upon  successful  completion,   posix_spawnattr_getpgroup ()  shall  return  zero  and  store  the  value  of
28950              the   spawn-pgroup  attribute  of   attr  into  the  object  referenced  by  the   pgroup  parameter;  otherwise,
28951              an  error  number  shall  be  returned  to  indicate  the  error.

28952              Upon  successful  completion,   posix_spawnattr_setpgroup ()  shall  return  zero;  otherwise,  an  error
28953              number  shall  be  returned  to  indicate  the  error.


28954   ERRORS
28955              These  functions  may  fail  if:

28956              [EINVAL]                    The  value  specified  by   attr  is  invalid.
28957              The   posix_spawnattr_setpgroup ()  function  may  fail  if:
28958              [EINVAL]                    The  value  of  the  attribute  being  set  is  not  valid.


28959   EXAMPLES
28960              None.


28961   APPLICATION  USAGE
28962              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all  implementations.


28963   RATIONALE
28964              None.


28965   FUTURE  DIRECTIONS
28966              None.


28967   SEE  ALSO
28968               posix_spawn (),   posix_spawnattr_destroy (),   posix_spawnattr_init (),   posix_spawnattr_getsigdefault (),
28969               posix_spawnattr_getflags (),   posix_spawnattr_getschedparam (),   posix_spawnattr_getschedpolicy (),
28970               posix_spawnattr_getsigmask (),   posix_spawnattr_setsigdefault (),   posix_spawnattr_setflags (),
28971               posix_spawnattr_setschedparam (),   posix_spawnattr_setschedpolicy (),   posix_spawnattr_setsigmask (),
28972               posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < spawn.h>


28973   CHANGE  HISTORY
28974              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.


28975   NAME
28976              posix_spawnattr_getschedparam,  posix_spawnattr_setschedparam   ”  get  and  set  the  spawn-
28977              schedparam  attribute  of  a  spawn  attributes  object  ( ADVANCED  REALTIME )


28978   SYNOPSIS

 28979 SPN PS  #include <spawn.h>  28980  #include <sched.h>  28981  int posix_spawnattr_getschedparam (const posix_spawnattr_t *  28982  restrict  attr,  struct sched_param *restrict  schedparam  );  28983  int posix_spawnattr_setschedparam (posix_spawnattr_t *restrict  attr,   28984  const struct sched_param *restrict  schedparam  );  


28985


28986   DESCRIPTION
28987              The   posix_spawnattr_getschedparam ()  function  shall  obtain  the  value  of  the   spawn-schedparam
28988              attribute  from  the  attributes  object  referenced  by   attr .

28989              The   posix_spawnattr_setschedparam ()  function  shall  set  the   spawn-schedparam  attribute  in  an
28990              initialized  attributes  object  referenced  by   attr .

28991              The   spawn-schedparam  attribute  represents  the  scheduling  parameters  to  be  assigned  to  the  new
28992              process  image  in  a  spawn  operation  (if  POSIX_SPAWN_SETSCHEDULER  or
28993              POSIX_SPAWN_SETSCHEDPARAM  is  set  in  the   spawn-flags  attribute).  The  default  value  of  this
28994              attribute  is  unspecified.


28995   RETURN  VALUE
28996              Upon  successful  completion,   posix_spawnattr_getschedparam ()  shall  return  zero  and  store  the
28997              value  of  the   spawn-schedparam  attribute  of   attr  into  the  object  referenced  by  the   schedparam
28998              parameter;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

28999              Upon  successful  completion,   posix_spawnattr_setschedparam ()  shall  return  zero;  otherwise,  an
29000              error  number  shall  be  returned  to  indicate  the  error.


29001   ERRORS
29002              These  functions  may  fail  if:
29003              [EINVAL]                    The  value  specified  by   attr  is  invalid.
29004              The   posix_spawnattr_setschedparam ()  function  may  fail  if:
29005              [EINVAL]                    The  value  of  the  attribute  being  set  is  not  valid.


29006   EXAMPLES
29007              None.


29008   APPLICATION  USAGE
29009              These  functions  are  part  of  the  Spawn  and  Process  Scheduling  options  and  need  not  be  provided
29010              on  all  implementations.


29011   RATIONALE
29012              None.


29013   FUTURE  DIRECTIONS
29014              None.


29015   SEE  ALSO
29016               posix_spawn (),   posix_spawnattr_destroy (),   posix_spawnattr_init (),   posix_spawnattr_getsigdefault (),
29017               posix_spawnattr_getflags (),   posix_spawnattr_getpgroup (),   posix_spawnattr_getschedpolicy (),
29018               posix_spawnattr_getsigmask (),   posix_spawnattr_setsigdefault (),   posix_spawnattr_setflags (),
29019               posix_spawnattr_setpgroup (),   posix_spawnattr_setschedpolicy (),   posix_spawnattr_setsigmask (),
29020               posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,   <sched.h>,  <spawn.h>


29021   CHANGE  HISTORY
29022              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.


29023   NAME
29024              posix_spawnattr_getschedpolicy,  posix_spawnattr_setschedpolicy   ”  get  and  set  the  spawn-schedpolicy
29025              attribute  of  a  spawn  attributes  object  ( ADVANCED  REALTIME )


29026   SYNOPSIS

 29027 SPN  #include <spawn.h>  29028  #include <sched.h>  29029  int posix_spawnattr_getschedpolicy (const posix_spawnattr_t *  29030  restrict  attr  , int *restrict  schedpolicy  );  29031  int posix_spawnattr_setschedpolicy (posix_spawnattr_t *  attr,   29032  int  schedpolicy  ).;  


29033


29034   DESCRIPTION
29035              The   posix_spawnattr_getschedpolicy ()  function  shall  obtain  the  value  of  the   spawn-schedpolicy
29036              attribute  from  the  attributes  object  referenced  by   attr .

29037              The   posix_spawnattr_setschedpolicy ()  function  shall  set  the   spawn-schedpolicy  attribute  in  an
29038              initialized  attributes  object  referenced  by   attr .

29039              The   spawn-schedpolicy  attribute  represents  the  scheduling  policy  to  be  assigned  to  the  new
29040              process  image  in  a  spawn  operation  (if  POSIX_SPAWN_SETSCHEDULER  is  set  in  the   spawn-flags
29041              attribute).  The  default  value  of  this  attribute  is  unspecified.


29042   RETURN  VALUE
29043              Upon  successful  completion,   posix_spawnattr_getschedpolicy ()  shall  return  zero  and  store  the
29044              value  of  the   spawn-schedpolicy  attribute  of   attr  into  the  object  referenced  by  the   schedpolicy
29045              parameter;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

29046              Upon  successful  completion,   posix_spawnattr_setschedpolicy ()  shall  return  zero;  otherwise,  an
29047              error  number  shall  be  returned  to  indicate  the  error.


29048   ERRORS
29049              These  functions  may  fail  if:
29050              [EINVAL]                    The  value  specified  by   attr  is  invalid.
29051              The   posix_spawnattr_setschedpolicy ()  function  may  fail  if:
29052              [EINVAL]                    The  value  of  the  attribute  being  set  is  not  valid.


29053   EXAMPLES
29054              None.


29055   APPLICATION  USAGE
29056              These  functions  are  part  of  the  Spawn  and  Process  Scheduling  options  and  need  not  be  provided
29057              on  all  implementations.


29058   RATIONALE
29059              None.


29060   FUTURE  DIRECTIONS
29061              None.


29062   SEE  ALSO
29063               posix_spawn (),   posix_spawnattr_destroy (),   posix_spawnattr_init (),   posix_spawnattr_getsigdefault (),
29064               posix_spawnattr_getflags (),   posix_spawnattr_getpgroup (),   posix_spawnattr_getschedparam (),
29065               posix_spawnattr_getsigmask (),   posix_spawnattr_setsigdefault (),   posix_spawnattr_setflags (),
29066               posix_spawnattr_setpgroup (),   posix_spawnattr_setschedparam (),   posix_spawnattr_setsigmask (),
29067               posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < sched.h>,  < spawn.h>


29068   CHANGE  HISTORY
29069              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.


29070   NAME
29071              posix_spawnattr_getsigdefault,  posix_spawnattr_setsigdefault   ”  get  and  set  the  spawn-sigdefault
29072              attribute  of  a  spawn  attributes  object  ( ADVANCED  REALTIME )


29073   SYNOPSIS

 29074 SPN  #include <signal.h>  29075  #include <spawn.h>  29076  int posix_spawnattr_getsigdefault (const posix_spawnattr_t *  29077  restrict  attr,  sigset_t *restrict  sigdefault  );  29078  int posix_spawnattr_setsigdefault (posix_spawnattr_t *restrict  attr,   29079  const sigset_t *restrict  sigdefault  );  


29080


29081   DESCRIPTION
29082              The   posix_spawnattr_getsigdefault ()  function  shall  obtain  the  value  of  the   spawn-sigdefault
29083              attribute  from  the  attributes  object  referenced  by   attr .

29084              The   posix_spawnattr_setsigdefault ()  function  shall  set  the   spawn-sigdefault  attribute  in  an
29085              initialized  attributes  object  referenced  by   attr .

29086              The   spawn-sigdefault  attribute  represents  the  set  of  signals  to  be  forced  to  default  signal  handling
29087              in  the  new  process  image  (if  POSIX_SPAWN_SETSIGDEF  is  set  in  the   spawn-flags  attribute)  by  a
29088              spawn  operation.  The  default  value  of  this  attribute  shall  be  an  empty  signal  set.


29089   RETURN  VALUE
29090              Upon  successful  completion,   posix_spawnattr_getsigdefault ()  shall  return  zero  and  store  the  value
29091              of  the   spawn-sigdefault  attribute  of   attr  into  the  object  referenced  by  the   sigdefault  parameter;
29092              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

29093              Upon  successful  completion,   posix_spawnattr_setsigdefault ()  shall  return  zero;  otherwise,  an  error
29094              number  shall  be  returned  to  indicate  the  error.


29095   ERRORS
29096              These  functions  may  fail  if:

29097              [EINVAL]                    The  value  specified  by   attr  is  invalid.
29098              The   posix_spawnattr_setsigdefault ()  function  may  fail  if:
29099              [EINVAL]                    The  value  of  the  attribute  being  set  is  not  valid.


29100   EXAMPLES
29101              None.


29102   APPLICATION  USAGE
29103              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all  implementations.


29104   RATIONALE
29105              None.


29106   FUTURE  DIRECTIONS
29107              None.


29108   SEE  ALSO
29109               posix_spawn (),   posix_spawnattr_destroy (),   posix_spawnattr_init (),   posix_spawnattr_getflags (),
29110               posix_spawnattr_getpgroup (),   posix_spawnattr_getschedparam (),   posix_spawnattr_getschedpolicy (),
29111               posix_spawnattr_getsigmask (),   posix_spawnattr_setflags (),   posix_spawnattr_setpgroup (),
29112               posix_spawnattr_setschedparam (),   posix_spawnattr_setschedpolicy (),   posix_spawnattr_setsigmask (),
29113               posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < signal.h >,  < spawn.h >


29114   CHANGE  HISTORY
29115              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.


29116   NAME
29117              posix_spawnattr_getsigmask,  posix_spawnattr_setsigmask ”get  and  set  the  spawn-sigmask
29118              attribute  of  a  spawn  attributes  object  ( ADVANCED  REALTIME )


29119   SYNOPSIS

 29120 SPN  #include <signal.h>  29121  #include <spawn.h>  29122  int posix_spawnattr_getsigmask (const posix_spawnattr_t *restrict  attr,   29123  sigset_t *restrict  sigmask  );  29124  int posix_spawnattr_setsigmask (posix_spawnattr_t *restrict  attr,   29125  const sigset_t *restrict  sigmask  );  


29126


29127   DESCRIPTION
29128              The   posix_spawnattr_getsigmask ()  function  shall  obtain  the  value  of  the   spawn-sigmask  attribute
29129              from  the  attributes  object  referenced  by   attr .

29130              The   posix_spawnattr_setsigmask ()  function  shall  set  the   spawn-sigmask  attribute  in  an  initialized
29131              attributes  object  referenced  by   attr .

29132              The   spawn-sigmask  attribute  represents  the  signal  mask  in  effect  in  the  new  process  image  of  a
29133              spawn  operation  (if  POSIX_SPAWN_SETSIGMASK  is  set  in  the   spawn-flags  attribute).  The
29134              default  value  of  this  attribute  is  unspecified.


29135   RETURN  VALUE
29136              Upon  successful  completion,   posix_spawnattr_getsigmask ()  shall  return  zero  and  store  the  value
29137              of  the   spawn-sigmask  attribute  of   attr  into  the  object  referenced  by  the   sigmask  parameter;
29138              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

29139              Upon  successful  completion,   posix_spawnattr_setsigmask ()  shall  return  zero;  otherwise,  an  error
29140              number  shall  be  returned  to  indicate  the  error.


29141   ERRORS
29142              These  functions  may  fail  if:

29143              [EINVAL]                    The  value  specified  by   attr  is  invalid.

29144              The   posix_spawnattr_setsigmask ()  function  may  fail  if:

29145              [EINVAL]                    The  value  of  the  attribute  being  set  is  not  valid.


29146   EXAMPLES
29147              None.


29148   APPLICATION  USAGE
29149              These  functions  are  part  of  the  Spawn  option  and  need  not  be  provided  on  all  implementations.


29150   RATIONALE
29151              None.


29152   FUTURE  DIRECTIONS
29153              None.


29154   SEE  ALSO
29155               posix_spawn (),   posix_spawnattr_destroy (),   posix_spawnattr_init (),   posix_spawnattr_getsigdefault (),
29156               posix_spawnattr_getflags (),   posix_spawnattr_getpgroup (),   posix_spawnattr_getschedparam (),
29157               posix_spawnattr_getschedpolicy (),   posix_spawnattr_setsigdefault (),   posix_spawnattr_setflags (),
29158               posix_spawnattr_setpgroup (),   posix_spawnattr_setschedparam (),   posix_spawnattr_setschedpolicy (),
29159               posix_spawnp (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < signal.h>,  < spawn.h >


29160   CHANGE  HISTORY
29161              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.


31104   NAME
31105              pthread_attr_destroy,  pthread_attr_init   ”  destroy  and  initialize  the  thread  attributes  object


31106   SYNOPSIS

 31107 THR  #include <pthread.h>  31108  int pthread_attr_destroy (pthread_attr_t *  attr  );  31109  int pthread_attr_init (pthread_attr_t *  attr  );  


31110


31111   DESCRIPTION
31112              The   pthread_attr_destroy ()  function  shall  destroy  a  thread  attributes  object.  An  implementation
31113              may  cause   pthread_attr_destroy ()  to  set   attr  to  an  implementation-defined  invalid  value.  A
31114              destroyed   attr  attributes  object  can  be  reinitialized  using   pthread_attr_init ();  the  results  of
31115              otherwise  referencing  the  object  after  it  has  been  destroyed  are  undefined.

31116              The   pthread_attr_init ()  function  shall  initialize  a  thread  attributes  object   attr  with  the  default
31117              value  for  all  of  the  individual  attributes  used  by  a  given  implementation.

31118              The  resulting  attributes  object  (possibly  modified  by  setting  individual  attribute  values)  when
31119              used  by   pthread_create ()  defines  the  attributes  of  the  thread  created.  A  single  attributes  object  can
31120              be  used  in  multiple  simultaneous  calls  to   pthread_create ().  Results  are  undefined  if
31121               pthread_attr_init ()  is  called  specifying  an  already  initialized   attr  attributes  object.


31122   RETURN  VALUE
31123              Upon  successful  completion,   pthread_attr_destroy ()  and   pthread_attr_init ()  shall  return  a  value  of
31124              0;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


31125   ERRORS

31126              The   pthread_attr_init ()  function  shall  fail  if:

31127              [ENOMEM]                  Insufficient  memory  exists  to  initialize  the  thread  attributes  object.

31128              These  functions  shall  not  return  an  error  code  of  [EINTR].


31129   EXAMPLES
31130              None.


31131   APPLICATION  USAGE
31132              None.


31133   RATIONALE
31134              Attributes  objects  are  provided  for  threads,   mutexes ,  and  condition  variables  as  a  mechanism  to
31135              support  probable  future  standardization  in  these  areas  without  requiring  that  the  function  itself
31136              be  changed.

31137              Attributes  objects  provide  clean  isolation  of  the  configurable  aspects  of  threads.  For  example,
31138              "stack  size"  is  an  important  attribute  of  a  thread,  but  it  cannot  be  expressed  portably.  When
31139              porting  a  threaded  program,  stack  sizes  often  need  to  be  adjusted.  The  use  of  attributes  objects
31140              can  help  by  allowing  the  changes  to  be  isolated  in  a  single  place,  rather  than  being  spread  across
31141              every  instance  of  thread  creation.

31142              Attributes  objects  can  be  used  to  set  up  "classes'  of  threads  with  similar  attributes;  for  example,
31143              "threads  with  large  stacks  and  high  priority"  or  "threads  with  minimal  stacks".  These  classes
31144              can  be  defined  in  a  single  place  and  then  referenced  wherever  threads  need  to  be  created.
31145              Changes  to  "class"  decisions  become  straightforward,  and  detailed  analysis  of  each
31146               pthread_create ()  call  is  not  required.

31147              The  attributes  objects  are  defined  as  opaque  types  as  an  aid  to  extensibility.  If  these  objects  had
31148              been  specified  as  structures,  adding  new  attributes  would  force  recompilation  of  all  multi-threaded
31149              programs  when  the  attributes  objects  are  extended;  this  might  not  be  possible  if
31150              different  program   components  were  supplied  by  different   vendors .

31151              Additionally,  opaque  attributes  objects  present  opportunities  for  improving  performance.
31152              Argument  validity  can  be  checked  once  when  attributes  are  set,  rather  than  each  time  a  thread  is
31153              created.  Implementations  often  need  to  cache  kernel  objects  that  are  expensive  to  create.
31154              Opaque  attributes  objects  provide  an  efficient  mechanism  to  detect  when  cached  objects  become
31155              invalid  due  to  attribute  changes.

31156              Since  assignment  is  not   necessarily  defined  on  a  given  opaque  type,  implementation-defined
31157              default  values  cannot  be  defined  in  a  portable  way.  The  solution  to  this  problem  is  to  allow
31158              attributes  objects  to  be  initialized  dynamically  by  attributes  object  initialization  functions,  so
31159              that  default  values  can  be  supplied  automatically  by  the  implementation.

31160              The  following  proposal  was  provided  as  a  suggested  alternative  to  the  supplied  attributes:

31161                1.  Maintain  the  style  of  passing  a  parameter   formed  by  the  bitwise-inclusive  OR  of  flags  to
31162                      the  initialization  routines  ( pthread_create (),   pthread_mutex_init (),   pthread_cond_init ()).  The
31163                      parameter  containing  the  flags  should  be  an  opaque  type  for  extensibility.  If  no  flags  are
31164                        set  in  the  parameter,  then  the  objects  are  created  with  default  characteristics.  An
31165                      implementation  may  specify  implementation-defined  flag  values  and  associated  behavior.

31166                2.  If  further  specialization  of  mutexes  and  condition  variables  is  necessary,  implementations
31167                        may  specify  additional  procedures  that   operate  on  the   pthread_mutex_t  and
31168                       pthread_cond_t  objects  (instead  of  on  attributes  objects).

31169              The  difficulties  with  this  solution  are:

31170                1.  A  bitmask  is  not  opaque  if  bits  have  to  be  set  into   bitvector  attributes  objects  using
31171                      explicitly-coded  bitwise-inclusive  OR  operations.  If  the  set  of  options  exceeds  an   int ,
31172                      application  programmers  need  to  know  the  location  of  each  bit.  If  bits  are  set  or  read  by
31173                      encapsulation  (that  is,  get  and  set  functions),  then  the  bitmask  is  merely  an
31174                      implementation  of  attributes  objects  as  currently  defined  and  should  not  be  exposed  to  the
31175                      programmer.

31176                2.  Many  attributes  are  not  Boolean  or  very  small  integral  values.  For  example,  scheduling
31177                      policy  may  be  placed  in  3-bit  or  4-bit,  but  priority  requires  5-bit  or  more,  thereby  taking  up
31178                      at  least  8  bits  out  of  a  possible  16  bits  on  machines  with  16-bit  integers.  Because  of  this,  the
31179                      bitmask  can  only  reasonably  control  whether  particular  attributes  are  set  or  not,  and  it
31180                      cannot  serve  as  the  repository  of  the  value  itself.  The  value  needs  to  be  specified  as  a
31181                      function  parameter  (which  is  non-extensible),  or  by  setting  a  structure  field  (which  is  non-
31182                      opaque),  or  by  get  and  set  functions  (making  the  bitmask  a  redundant  addition  to  the
31183                      attributes  objects).

31184              Stack  size  is  defined  as  an  optional  attribute  because  the  very  notion  of  a  stack  is   inherently
31185               machine-dependent .  Some  implementations  may  not  be  able  to  change  the  size  of  the  stack,  for
31186              example,  and  others  may  not  need  to  because  stack  pages  may  be   discontiguous  and  can  be
31187              allocated  and  released  on  demand.

31188              The  attribute  mechanism  has  been  designed  in  large  measure  for  extensibility.  Future  extensions
31189              to  the  attribute  mechanism  or  to  any  attributes  object  defined  in  this  volume  of
31190              IEEE  Std  1003.1-2001  has  to  be  done  with  care  so  as  not  to  affect  binary-compatibility.

31191              Attributes  objects,  even  if  allocated  by  means  of  dynamic  allocation  functions  such  as   malloc (),
31192              may  have  their  size  fixed  at  compile  time.  This  means,  for  example,  a   pthread_create ()  in  an
31193              implementation  with  extensions  to   pthread_attr_t  cannot  look  beyond  the  area  that  the  binary
31194              application  assumes  is  valid.  This  suggests  that  implementations  should  maintain  a  size  field  in
31195              the  attributes  object,  as  well  as  possibly  version  information,  if  extensions  in  different  directions
31196              (possibly  by  different  vendors)  are  to  be  accommodated.


31197   FUTURE  DIRECTIONS
31198              None.


31199   SEE  ALSO
31200               pthread_attr_getstackaddr (),   pthread_attr_getstacksize (),   pthread_attr_getdetachstate (),
31201               pthread_create (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h >


31202   CHANGE  HISTORY
31203              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


31204   Issue  6
31205              The   pthread_attr_destroy ()  and   pthread_attr_init ()  functions  are   marked  as  part  of  the  Threads
31206              option.

31207              IEEE  PASC  Interpretation  1003.1  #107  is  applied,  noting  that  the  effect  of  initializing  an  already
31208              initialized  thread  attributes  object  is  undefined.


31209   NAME
31210              pthread_attr_getdetachstate,  pthread_attr_setdetachstate   ”  get  and  set  the  detachstate  attribute


31211   SYNOPSIS

 31212 THR  #include <pthread.h>  31213  int pthread_attr_getdetachstate (const pthread_attr_t *  attr,   31214  int *  detachstate  );  31215  int pthread_attr_setdetachstate (pthread_attr_t *  attr,  int  detachstate  );  


31216


31217   DESCRIPTION
31218              The   detachstate  attribute  controls  whether  the  thread  is  created  in  a  detached  state.  If  the  thread
31219              is  created  detached,  then  use  of  the  ID  of  the  newly  created  thread  by  the   pthread_detach ()  or
31220               pthread_join ()  function  is  an  error.

31221              The   pthread_attr_getdetachstate ()  and   pthread_attr_setdetachstate ()  functions,  respectively,  shall
31222              get  and  set  the   detachstate  attribute  in  the   attr  object.

31223              For   pthread_attr_getdetachstate (),   detachstate  shall  be  set  to  either
31224              PTHREAD_CREATE_DETACHED  or  PTHREAD_CREATE_JOINABLE.

31225              For   pthread_attr_setdetachstate (),  the  application  shall  set   detachstate  to  either
31226              PTHREAD_CREATE_DETACHED  or  PTHREAD_CREATE_JOINABLE.

31227              A  value  of  PTHREAD_CREATE_DETACHED  shall  cause  all  threads  created  with   attr  to  be  in
31228              the  detached  state,  whereas  using  a  value  of  PTHREAD_CREATE_JOINABLE  shall  cause  all
31229              threads  created  with   attr  to  be  in  the  joinable  state.  The  default  value  of  the   detachstate  attribute
31230              shall  be  PTHREAD_CREATE_JOINABLE.


31231   RETURN  VALUE
31232              Upon  successful  completion,   pthread_attr_getdetachstate ()  and   pthread_attr_setdetachstate ()  shall
31233              return  a  value  of  0;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

31234              The   pthread_attr_getdetachstate ()  function  stores  the  value  of  the   detachstate  attribute  in   detachstate
31235              if  successful.


31236   ERRORS
31237              The   pthread_attr_setdetachstate ()  function  shall  fail  if:

31238              [EINVAL]                    The  value  of   detachstate  was  not  valid

31239              These  functions  shall  not  return  an  error  code  of  [EINTR].


31240   EXAMPLES
31241              None.


31242   APPLICATION  USAGE
31243              None.


31244   RATIONALE
31245              None.


31246   FUTURE  DIRECTIONS
31247              None.


31248   SEE  ALSO
31249               pthread_attr_destroy (),   pthread_attr_getstackaddr (),   pthread_attr_getstacksize (),   pthread_create (),  the
31250              Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h >


31251   CHANGE  HISTORY
31252              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


31253   Issue  6
31254              The   pthread_attr_setdetachstate ()  and   pthread_attr_getdetachstate ()  functions  are  marked  as  part  of
31255              the  Threads  option.
31256              The  DESCRIPTION  is  updated  to  avoid  use  of  the   term  "must"  for  application  requirements.


31257   NAME
31258              pthread_attr_getguardsize,  pthread_attr_setguardsize   ”  get  and  set  the  thread  guardsize
31259              attribute


31260   SYNOPSIS

 31261 XSI  #include <pthread.h>  31262  int pthread_attr_getguardsize (const pthread_attr_t *restrict  attr,   31263  size_t *restrict  guardsize  );  31264  int pthread_attr_setguardsize (pthread_attr_t *  attr,   31265  size_t  guardsize  );  


31266


31267   DESCRIPTION
31268              The   pthread_attr_getguardsize ()  function  shall  get  the   guardsize  attribute  in  the   attr  object.  This
31269              attribute  shall  be  returned  in  the   guardsize  parameter.

31270              The   pthread_attr_setguardsize ()  function  shall  set  the   guardsize  attribute  in  the   attr  object.  The  new
31271              value  of  this  attribute  shall  be  obtained  from  the   guardsize  parameter.  If   guardsize  is  zero,  a  guard
31272              area  shall  not  be  provided  for  threads  created  with   attr .  If   guardsize  is  greater  than  zero,  a  guard
31273              area  of  at  least  size   guardsize  bytes  shall  be  provided  for  each  thread  created  with   attr .

31274              The   guardsize  attribute  controls  the  size  of  the  guard  area  for  the  created  thread's  stack.  The
31275               guardsize  attribute  provides  protection  against  overflow  of  the  stack  pointer.  If  a  thread's  stack  is
31276              created  with  guard  protection,  the  implementation   allocates  extra  memory  at  the  overflow  end
31277              of  the  stack  as  a  buffer  against  stack  overflow  of  the  stack  pointer.  If  an  application  overflows
31278              into  this  buffer  an  error  shall  result  (possibly  in  a  SIGSEGV  signal  being  delivered  to  the  thread).

31279              A  conforming  implementation  may  round  up  the  value  contained  in   guardsize  to  a  multiple  of
31280              the  configurable  system  variable  {PAGESIZE}  (see  < sys/mman.h>).  If  an  implementation
31281              rounds  up  the  value  of   guardsize  to  a  multiple  of  {PAGESIZE},  a  call  to   pthread_attr_getguardsize ()
31282              specifying   attr  shall  store  in  the   guardsize  parameter  the  guard  size  specified  by  the  previous
31283               pthread_attr_setguardsize ()  function  call.

31284              The  default  value  of  the   guardsize  attribute  is  {PAGESIZE}  bytes.  The  actual  value  of  {PAGESIZE}
31285              is  implementation-defined.

31286              If  the   stackaddr  or   stack  attribute  has  been  set  (that  is,  the  caller  is  allocating  and  managing  its
31287              own  thread  stacks),  the   guardsize  attribute  shall  be  ignored  and  no  protection  shall  be  provided
31288              by  the  implementation.  It  is  the  responsibility  of  the  application  to  manage  stack  overflow  along
31289              with  stack  allocation  and  management  in  this  case.


31290   RETURN  VALUE
31291              If  successful,  the   pthread_attr_getguardsize ()  and   pthread_attr_setguardsize ()  functions  shall  return
31292              zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


31293   ERRORS
31294              The   pthread_attr_getguardsize ()  and   pthread_attr_setguardsize ()  functions  shall  fail  if:

31295              [EINVAL]                    The  attribute   attr  is  invalid.

31296              [EINVAL]                    The  parameter   guardsize  is  invalid.

31297              These  functions  shall  not  return  an  error  code  of  [EINTR].


31298   EXAMPLES
31299              None.


31300   APPLICATION  USAGE
31301              None.


31302   RATIONALE
31303              The   guardsize  attribute  is  provided  to  the  application  for  two  reasons:

31304                1.  Overflow  protection  can  potentially  result  in   wasted  system  resources.  An  application
31305                      that  creates  a  large  number  of  threads,  and  which   knows  its  threads  never  overflow  their
31306                      stack,  can  save  system  resources  by  turning  off  guard  areas.

31307                2.  When  threads  allocate  large  data  structures  on  the  stack,  large  guard  areas  may  be  needed
31308                      to  detect  stack  overflow.


31309   FUTURE  DIRECTIONS
31310              None.


31311   SEE  ALSO
31312              The  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h >,  < sys/mman.h >


31313   CHANGE  HISTORY
31314              First  released  in  Issue  5.


31315   Issue  6
31316              In  the  ERRORS  section,  a  third  [EINVAL]  error  condition  is  removed  as  it  is  covered  by  the
31317              second  error  condition.

31318              The   restrict  keyword  is  added  to  the   pthread_attr_getguardsize ()  prototype  for  alignment  with  the
31319              ISO/IEC  9899:  1999  standard.


31320   NAME
31321              pthread_attr_getinheritsched,  pthread_attr_setinheritsched   ”  get  and  set  the  inheritsched
31322              attribute  ( REALTIME  THREADS )


31323   SYNOPSIS
31324  THR  TPS   #include  <pthread.h>

31325                   int  pthread_attr_getinheritsched  (const  pthread_attr_t  *restrict   attr,
31326                           int  *restrict   inheritsched );
31327                   int  pthread_attr_setinheritsched  (pthread_attr_t  *   attr,
31328                           int   inheritsched );


31329


31330   DESCRIPTION
31331              The   pthread_attr_getinheritsched (),  and   pthread_attr_setinheritsched ()  functions,  respectively,  shall
31332              get  and  set  the   inheritsched  attribute  in  the   attr  argument.

31333              When  the  attributes  objects  are  used  by   pthread_create (),  the   inheritsched  attribute  determines
31334              how  the  other  scheduling  attributes  of  the  created  thread  shall  be  set.

31335              PTHREAD_INHERIT_SCHED
31336                Specifies  that  the  thread  scheduling  attributes  shall  be  inherited  from  the  creating  thread,
31337                and  the  scheduling  attributes  in  this   attr  argument  shall  be  ignored.

31338              PTHREAD_EXPLICIT_SCHED
31339                Specifies  that  the  thread  scheduling  attributes  shall  be  set  to  the  corresponding  values  from
31340                this  attributes  object.

31341              The  symbols  PTHREAD_INHERIT_SCHED  and  PTHREAD_EXPLICIT_SCHED  are  defined  in
31342              the  < pthread.h >  header.

31343              The  following  thread  scheduling  attributes  defined  by  IEEE  Std  1003.1-2001  are  affected  by  the
31344               inheritsched  attribute:  scheduling  policy  ( schedpolicy ),  scheduling  parameters  ( schedparam ),  and
31345              scheduling   contention  scope  ( contentionscope ).


31346   RETURN  VALUE
31347              If  successful,  the   pthread_attr_getinheritsched ()  and   pthread_attr_setinheritsched ()  functions  shall
31348              return  zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


31349   ERRORS
31350              The   pthread_attr_setinheritsched ()  function  may  fail  if:

31351              [EINVAL]                    The  value  of   inheritsched  is  not  valid.

31352              [ENOTSUP]                  An  attempt  was  made  to  set  the  attribute  to  an  unsupported  value.

31353              These  functions  shall  not  return  an  error  code  of  [EINTR].


31354   EXAMPLES
31355              None.


31356   APPLICATION  USAGE
31357              After  these  attributes  have  been  set,  a  thread  can  be  created  with  the  specified  attributes  using
31358               pthread_create ().  Using  these  routines  does  not  affect  the  current  running  thread.


31359   RATIONALE
31360              None.


31361   FUTURE  DIRECTIONS
31362              None.


31363   SEE  ALSO
31364               pthread_attr_destroy (),   pthread_attr_getscope (),   pthread_attr_getschedpolicy (),
31365               pthread_attr_getschedparam (),   pthread_create (),  the  Base  Definitions  volume  of
31366              IEEE  Std  1003.1-2001,  < pthread.h>,  < sched.h >


31367   CHANGE  HISTORY
31368              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.

31369              Marked  as  part  of  the  Realtime  Threads  Feature  Group.


31370   Issue  6
31371              The   pthread_attr_getinheritsched ()  and   pthread_attr_setinheritsched ()  functions  are  marked  as  part
31372              of  the  Threads  and  Thread  Execution  Scheduling  options.

31373              The  [ENOSYS]  error  condition  has  been  removed  as  stubs  need  not  be  provided  if  an
31374              implementation  does  not  support  the  Thread  Execution  Scheduling  option.

31375              The   restrict  keyword  is  added  to  the   pthread_attr_getinheritsched ()  prototype  for  alignment  with
31376              the  ISO/IEC  9899:  1999  standard.


31377   NAME
31378              pthread_attr_getschedparam,  pthread_attr_setschedparam   ”  get  and  set  the  schedparam
31379              attribute


31380   SYNOPSIS

 31381 THR  #include <pthread.h>  31382  int pthread_attr_getschedparam (const pthread_attr_t *restrict  attr,   31383  struct sched_param *restrict  param  );  31384  int pthread_attr_setschedparam (pthread_attr_t *restrict  attr  ,  31385  const struct sched_param *restrict  param  );  


31386


31387   DESCRIPTION
31388              The   pthread_attr_getschedparam (),  and   pthread_attr_setschedparam ()  functions,  respectively,  shall
31389              get  and  set  the  scheduling  parameter  attributes  in  the   attr  argument.  The  contents  of  the   param
31390              structure  are  defined  in  the  < sched.h >  header.  For  the  SCHED_FIFO  and  SCHED_RR  policies,
31391              the  only  required  member  of   param  is   sched_priority.

31392  TSP       For  the  SCHED_SPORADIC  policy,  the  required   members  of  the   param  structure  are
31393               sched_priority ,   sched_ss_low_priority ,   sched_ss_repl_period ,   sched_ss_init_budget ,  and
31394               sched_ss_max_repl.  The  specified   sched_ss_repl_period  must  be  greater  than  or  equal  to  the
31395               specified   sched_ss_init_budget  for  the  function  to  succeed;  if  it  is  not,  then  the  function  shall  fail.
31396               The  value  of   sched_ss_max_repl  shall  be  within  the  inclusive  range  [1.{SS_REPL_MAX}]  for  the
31397               function  to  succeed;  if  not,  the  function  shall  fail.


31398   RETURN  VALUE
31399              If  successful,  the   pthread_attr_getschedparam ()  and   pthread_attr_setschedparam ()  functions  shall
31400              return  zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


31401   ERRORS
31402              The   pthread_attr_setschedparam ()  function  may  fail  if:

31403              [EINVAL]                    The  value  of   param  is  not  valid.

31404              [ENOTSUP]                  An  attempt  was  made  to  set  the  attribute  to  an  unsupported  value.

31405              These  functions  shall  not  return  an  error  code  of  [EINTR].


31406   EXAMPLES
31407              None.


31408   APPLICATION  USAGE
31409              After  these  attributes  have  been  set,  a  thread  can  be  created  with  the  specified  attributes  using
31410               pthread_create ().  Using  these  routines  does  not  affect  the  current  running  thread.


31411   RATIONALE
31412              None.


31413   FUTURE  DIRECTIONS
31414              None.


31415   SEE  ALSO
31416               pthread_attr_destroy (),   pthread_attr_getscope (),   pthread_attr_getinheritsched (),
31417               pthread_attr_getschedpolicy (),   pthread_create (),  the  Base  Definitions  volume  of
31418              IEEE  Std  1003.1-2001,  < pthread.h>,  < sched.h >


31419   CHANGE  HISTORY
31420              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


31421   Issue  6
31422              The   pthread_attr_getschedparam ()  and   pthread_attr_setschedparam ()  functions  are  marked  as  part
31423              of  the  Threads  option.

31424              The  SCHED_SPORADIC  scheduling  policy  is  added  for  alignment  with  IEEE  Std  1003.1d-1999.

31425              The   restrict  keyword  is  added  to  the   pthread_attr_getschedparam ()  and
31426               pthread_attr_setschedparam ()   prototypes  for  alignment  with  the  ISO/IEC  9899:  1999  standard.


31427   NAME
31428              pthread_attr_getschedpolicy,  pthread_attr_setschedpolicy   ”  get  and  set  the  schedpolicy
31429              attribute  ( REALTIME  THREADS )


31430   SYNOPSIS

 31431 THR TPS  #include <pthread.h>  31432  int pthread_attr_getschedpolicy (const pthread_attr_t *restrict  attr,   31433  int *restrict  policy  );  31434  int pthread_attr_setschedpolicy (pthread_attr_t *  attr  , int  policy  );  


31435


31436   DESCRIPTION
31437              The   pthread_attr_getschedpolicy ()  and   pthread_attr_setschedpolicy ()  functions,  respectively,  shall
31438              get  and  set  the   schedpolicy  attribute  in  the   attr  argument.

31439              The  supported  values  of   policy  shall  include  SCHED_FIFO,  SCHED_RR,  and  SCHED_OTHER,
31440              which  are  defined  in  the  < sched.h >  header.  When  threads  executing  with  the  scheduling  policy
31441  TSP      SCHED_FIFO,  SCHED_RR,   or  SCHED_SPORADIC  are  waiting  on  a  mutex,  they  shall  acquire
31442              the  mutex  in  priority  order  when  the  mutex  is  unlocked.


31443   RETURN  VALUE
31444              If  successful,  the   pthread_attr_getschedpolicy ()  and   pthread_attr_setschedpolicy ()  functions  shall
31445              return  zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


31446   ERRORS
31447              The   pthread_attr_setschedpolicy ()  function  may  fail  if:

31448              [EINVAL]                    The  value  of   policy  is  not  valid.

31449              [ENOTSUP]                  An  attempt  was  made  to  set  the  attribute  to  an  unsupported  value.

31450              These  functions  shall  not  return  an  error  code  of  [EINTR].


31451   EXAMPLES
31452              None.


31453   APPLICATION  USAGE
31454              After  these  attributes  have  been  set,  a  thread  can  be  created  with  the  specified  attributes  using
31455               pthread_create ().  Using  these  routines  does  not  affect  the  current  running  thread.


31456   RATIONALE
31457              None.


31458   FUTURE  DIRECTIONS
31459              None.


31460   SEE  ALSO
31461               pthread_attr_destroy (),   pthread_attr_getscope (),   pthread_attr_getinheritsched (),
31462               pthread_attr_getschedparam (),   pthread_create (),  the  Base  Definitions  volume  of
31463              IEEE  Std  1003.1-2001,  < pthread.h>,  < sched.h >


31464   CHANGE  HISTORY
31465              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.

31466              Marked  as  part  of  the  Realtime  Threads  Feature  Group.


31467   Issue  6
31468              The   pthread_attr_getschedpolicy ()  and   pthread_attr_setschedpolicy ()  functions  are  marked  as  part  of
31469              the  Threads  and  Thread  Execution  Scheduling  options.

31470              The  [ENOSYS]  error  condition  has  been  removed  as  stubs  need  not  be  provided  if  an
31471              implementation  does  not  support  the  Thread  Execution  Scheduling  option.

31472              The  SCHED_SPORADIC  scheduling  policy  is  added  for  alignment  with  IEEE  Std  1003.1d-1999.

31473              The   restrict  keyword  is  added  to  the   pthread_attr_getschedpolicy ()  prototype  for  alignment  with
31474              the  ISO/IEC  9899:  1999  standard.


31983   NAME
31984              pthread_cancel   ”  cancel  execution  of  a  thread


31985   SYNOPSIS

 31986 THR  #include <pthread.h>  31987  int pthread_cancel (pthread_t  thread  );  


31988


31989   DESCRIPTION
31990              The   pthread_cancel ()  function  shall  request  that   thread  be   canceled .  The  target  thread's
31991              cancelability  state  and  type  determines  when  the  cancelation  takes  effect.  When  the  cancelation
31992              is  acted  on,  the  cancelation  cleanup  handlers  for   thread  shall  be  called.  When  the  last  cancelation
31993              cleanup  handler  returns,  the  thread-specific  data  destructor  functions  shall  be  called  for   thread .
31994              When  the  last  destructor  function  returns,   thread  shall  be  terminated.

31995              The  cancelation  processing  in  the  target  thread  shall  run  asynchronously  with  respect  to  the
31996              calling  thread  returning  from   pthread_cancel ().


31997   RETURN  VALUE
31998              If  successful,  the   pthread_cancel ()  function  shall  return  zero;  otherwise,  an  error  number  shall  be
31999              returned  to  indicate  the  error.


32000   ERRORS

32001              The   pthread_cancel ()  function  may  fail  if:

32002              [ESRCH]                    No  thread  could  be  found  corresponding  to  that  specified  by  the  given  thread
32003              ID.

32004              The   pthread_cancel ()  function  shall  not  return  an  error  code  of  [EINTR].


32005   EXAMPLES
32006              None.


32007   APPLICATION  USAGE
32008              None.


32009   RATIONALE
32010              Two  alternative  functions  were  considered  for  sending  the  cancelation  notification  to  a  thread.
32011              One  would  be  to  define  a  new  SIGCANCEL  signal  that  had  the  cancelation  semantics  when
32012              delivered;  the  other  was  to  define  the  new   pthread_cancel ()  function,  which  would  trigger  the
32013              cancelation  semantics.

32014              The  advantage  of  a  new  signal  was  that  so  much  of  the  delivery  criteria  were  identical  to  that
32015              used  when  trying  to  deliver  a  signal  that  making  cancelation  notification  a  signal  was  seen  as
32016              consistent.  Indeed,  many  implementations  implement  cancelation  using  a  special  signal.  On  the
32017              other  hand,  there  would  be  no  signal  functions  that  could  be  used  with  this  signal  except
32018               pthread_kill (),  and  the  behavior  of  the  delivered  cancelation  signal  would  be  unlike  any
32019              previously  existing  defined  signal.

32020              The  benefits  of  a  special  function  include  the  recognition  that  this  signal  would  be  defined
32021              because  of  the  similar  delivery  criteria  and  that  this  is  the  only  common  behavior  between  a
32022              cancelation  request  and  a  signal.  In  addition,  the  cancelation  delivery  mechanism  does  not  have
32023              to  be  implemented  as  a  signal.  There  are  also  strong,  if  not  stronger,  parallels  with  language
32024              exception  mechanisms  than  with  signals  that  are  potentially  obscured  if  the  delivery  mechanism
32025              is  visibly  closer  to  signals.

32026              In  the  end,  it  was  considered  that  as  there  were  so  many  exceptions  to  the  use  of  the  new  signal
32027              with  existing  signals  functions  it  would  be  misleading.  A  special  function  has  resolved  this
32028              problem.  This  function  was   carefully  defined  so  that  an  implementation  wishing  to  provide  the
32029              cancelation  functions  on  top  of  signals  could  do  so.  The  special  function  also  means  that
32030              implementations  are  not  obliged  to  implement  cancelation  with  signals.


32031   FUTURE  DIRECTIONS
32032              None.


32033   SEE  ALSO
32034               pthread_exit (),   pthread_cond_timedwait (),   pthread_join (),   pthread_setcancelstate (),  the  Base
32035              Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h >


32036   CHANGE  HISTORY
32037              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32038   Issue  6
32039              The   pthread_cancel ()  function  is  marked  as  part  of  the  Threads  option.


32040   NAME
32041              pthread_cleanup_pop,  pthread_cleanup_push   ”  establish  cancelation  handlers


32042   SYNOPSIS

 32043 THR  #include <pthread.h>  32044  void pthread_cleanup_pop (int  execute  );  32045  void pthread_cleanup_push (void (*  routine  ) (void*), void *  arg  );  


32046


32047   DESCRIPTION
32048              The   pthread_cleanup_pop ()  function  shall  remove  the  routine  at  the  top  of  the  calling  thread's
32049              cancelation  cleanup  stack  and  optionally  invoke  it  (if   execute  is  non-zero).

32050              The   pthread_cleanup_push ()  function  shall  push  the  specified  cancelation  cleanup  handler   routine
32051              onto  the  calling  thread's  cancelation  cleanup  stack.  The  cancelation  cleanup  handler  shall  be
32052              popped  from  the  cancelation  cleanup  stack  and  invoked  with  the  argument   arg  when:

32053                  The  thread  exits  (that  is,  calls   pthread_exit ()).

32054                  The  thread  acts  upon  a  cancelation  request.

32055                  The  thread  calls   pthread_cleanup_pop ()  with  a  non-zero   execute  argument.

32056              These  functions  may  be  implemented  as  macros.  The  application  shall  ensure  that  they  appear
32057              as  statements,  and  in  pairs  within  the  same  lexical  scope  (that  is,  the   pthread_cleanup_push ()
32058              macro  may  be  thought  to  expand  to  a  token  list  whose  first  token  is  '{'  with
32059               pthread_cleanup_pop ()  expanding  to  a  token  list  whose  last  token  is  the  corresponding  '}').

32060              The  effect  of  calling   longjmp ()  or   siglongjmp ()  is  undefined  if  there  have  been  any  calls  to
32061               pthread_cleanup_push ()  or   pthread_cleanup_pop ()  made  without  the  matching  call  since  the  jump
32062              buffer  was  filled.  The  effect  of  calling   longjmp ()  or   siglongjmp ()  from  inside  a  cancelation
32063              cleanup  handler  is  also  undefined  unless  the  jump  buffer  was  also  filled  in  the  cancelation
32064              cleanup  handler.


32065   RETURN  VALUE
32066              The   pthread_cleanup_push ()  and   pthread_cleanup_pop ()  functions  shall  not  return  a  value.


32067   ERRORS
32068              No  errors  are  defined.

32069              These  functions  shall  not  return  an  error  code  of  [EINTR].


32070   EXAMPLES
32071              The  following  is  an  example  using  thread  primitives  to  implement  a  cancelable,  writers-priority
32072              read-write  lock:

 32073       typedef struct { 32074           pthread_mutex_t lock; 32075           pthread_cond_t rcond, 32076               wcond; 32077           int lock_count; /* <0 .. Held by writer. */ 32078                           /* > 0 .. Held by lock_count readers. */ 32079                           /* = 0 .. Held by nobody. */ 32080           int waiting_writers; /* Count of waiting writers. */ 32081       } rwlock; 32082       void 32083       waiting_reader_cleanup (void. *arg). 32084       { 32085           rwlock *1; 32086           1 = (rwlock *) arg; 32087           pthread_mutex_unlock (&l->lock); 32088       } 32089       void 32090       lock_for_read (rwlock *1) 32091       { 32092           pthread_mutex_lock (&1->lock); 32093           pthread_cleanup_push (waiting_reader_cleanup, 1); 32094           while ((1->lock_count <0) && (1->waiting_writers ! = 0)) 32095               pthread_cond_wait (&1->rcond, &1->lock); 32096           1->lock_count++; 32097          /* 32098           * Note the pthread_cleanup_pop executes 32099           * waiting_reader_cleanup. 32100           */ 32101           pthread_cleanup_pop(1); 32102       } 32103       void 32104       release_read_lock (rwlock *1) 32105       { 32106           pthread_mutex_lock (&1->lock); 32107           if (--1->lock_count == 0) 32108               pthread_cond_signal (&1->wcond); 32109           pthread_mutex_unlock (1); 32110       } 32111       void 32112       waiting_writer_cleanup (void *arg) 32113       { 32114           rwlock *1; 32115           1 = (rwlock *) arg; 32116           if ((--1->waiting_writers == 0) && (1->lock_count >= 0)) { 32117              /* 32118               * This only happens if we have been canceled. 32119               */ 32120               pthread_cond_broadcast (&l->wcond); 32121       } 32122           pthread_mutex_unlock (&1->lock); 32123       } 32124       void 32125       lock_for_write (rwlock *1) 32126       { 32127           pthread_mutex_lock (&1->lock); 32128           1->waiting_writers++; 32129           pthread_cleanup_push (waiting_writer_cleanup, 1); 32130           while (1->lock_count ! = 0) 32131               pthread_cond_wait (&1->wcond, &1->lock); 32132           1->lock_count = -1; 32133          /* 32134           * Note the pthread_cleanup_pop executes 32135           * waiting_writer_cleanup. 32136           */ 32137           pthread_cleanup_pop (1); 32138       } 32139       void 32140       release_write_lock (rwlock *1) 32141       { 32142           pthread_mutex_lock (&1->lock); 32143           1->lock_count = 0; 32144           if (1->waiting_writers == 0) 32145               pthread_cond_broadcast (&1->rcond) 32146           else 32147               pthread_cond_signal (&1->wcond); 32148           pthread_mutex_unlock (&1->lock); 32149       } 32150       /* 32151        * This function is called to initialize the read/write lock. 32152        */ 32153       void 32154       initialize_rwlock (rwlock *1) 32155       { 32156           pthread_mutex_init (&1->lock, pthread_mutexattr_default); 32157           pthread_cond_init (&1->wcond, pthread_condattr_default); 32158           pthread_cond_init (&1->rcond, pthread_condattr_default); 32159           1->lock_count = 0; 32160           1->waiting_writers = 0; 32161       } 32162       reader_thread() 32163       { 32164           lock_for_read (&lock); 32165           pthread_cleanup_push (release_read_lock, &lock); 32166          /* 32167           * Thread has read lock. 32168           */ 32169           pthread_cleanup_pop (1); 32170       } 32171       writer_thread() 32172       { 32173           lock_for_write (&lock); 32174           pthread_cleanup_push (release_write_lock, &lock); 32175          /* 32176           * Thread has write lock. 32177           */ 32178           pthread_cleanup_pop (1); 32179       } 


32180   APPLICATION  USAGE
32181              The  two  routines  that  push  and  pop  cancelation  cleanup  handlers,   pthread_cleanup_push ()  and
32182               pthread_cleanup_pop (),  can  be  thought  of  as  left  and  right  parentheses.  They  always  need  to  be
32183              matched.


32184   RATIONALE
32185              The  restriction  that  the  two  routines  that  push  and  pop  cancelation  cleanup  handlers,
32186               pthread_cleanup_push ()  and   pthread_cleanup_pop (),  have  to  appear  in  the  same  lexical  scope
32187              allows  for  efficient  macro  or  compiler  implementations  and  efficient  storage  management.  A
32188              sample  implementation  of  these  routines  as  macros  might  look  like  this:

 32189       #define pthread_cleanup_push (rtn, arg) { \ 32190           struct _pthread_handler_rec __cleanup_handler, **__head; \ 32191           __cleanup_handler.rtn = rtn; \ 32192           __cleanup_handler.arg = arg; \ 32193           (void) pthread_getspecific (_pthread_handler_key, &__head); \ 32194           __cleanup_handler.next = *__head; \ 32195           *__head = &__cleanup_handler; 32196       #define pthread_cleanup_pop (ex) \ 32197           *__head = __cleanup_handler.next; \ 32198           if (ex) (*__cleanup_handler.rtn) (_cleanup_handler.arg); \ 32199       } 


32200              A  more  ambitious  implementation  of  these  routines  might  do  even  better  by  allowing  the
32201              compiler  to  note  that  the  cancelation  cleanup  handler  is  a  constant  and  can  be  expanded  inline.

32202              This  volume  of  IEEE  Std  1003.1-2001  currently   leaves  unspecified  the  effect  of  calling   longjmp ()
32203              from  a  signal  handler  executing  in  a  POSIX  System  Interfaces  function.  If  an  implementation
32204              wants  to  allow  this  and  give  the  programmer  reasonable  behavior,  the   longjmp ()  function  has  to
32205              call  all  cancelation  cleanup  handlers  that  have  been   pushed  but  not  popped  since  the  time
32206               setjmp ()  was  called.

32207              Consider  a  multi-threaded  function  called  by  a  thread  that  uses  signals.  If  a  signal  were
32208              delivered  to  a  signal  handler  during  the  operation  of   qsort ()  and  that  handler  were  to  call
32209               longjmp ()  (which,  in   turn ,  did   not  call  the  cancelation  cleanup  handlers)  the  helper  threads
32210              created  by  the   qsort ()  function  would  not  be  canceled.  Instead,  they  would  continue  to  execute
32211              and  write  into  the  argument  array  even  though  the  array  might  have  been  popped  off  the  stack.

32212              Note  that  the  specified  cleanup  handling  mechanism  is   especially  tied  to  the  C  language  and,
32213              while  the  requirement  for  a  uniform  mechanism  for   expressing  cleanup  is  language-
32214              independent,  the  mechanism  used  in  other  languages  may  be  quite  different.  In  addition,  this
32215              mechanism  is  really  only  necessary  due  to  the  lack  of  a  real  exception  mechanism  in  the  C
32216              language,  which  would  be  the  ideal  solution.

32217              There  is  no  notion  of  a  cancelation  cleanup-safe  function.  If  an  application  has  no  cancelation
32218              points  in  its  signal  handlers,  blocks  any  signal  whose  handler  may  have  cancelation  points  while
32219              calling  async-unsafe  functions,  or  disables  cancelation  while  calling  async-unsafe  functions,  all
32220              functions  may  be  safely  called  from  cancelation  cleanup  routines.


32221   FUTURE  DIRECTIONS
32222              None.


32223   SEE  ALSO
32224               pthread_cancel (),   pthread_setcancelstate (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,
32225              < pthread.h >


32226   CHANGE  HISTORY
32227              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32228   Issue  6
32229              The   pthread_cleanup_pop ()  and   pthread_cleanup_push ()  functions  are  marked  as  part  of  the
32230              Threads  option.

32231              The  APPLICATION  USAGE  section  is  added.

32232              The  DESCRIPTION  is  updated  to  avoid  use  of  the  term  "must"  for  application  requirements.


32233   NAME
32234              pthread_cond_broadcast,  pthread_cond_signal ”broadcast  or  signal  a  condition


32235   SYNOPSIS

 32236 THR  #include <pthread.h>  32237  int pthread_cond_broadcast (pthread_cond_t *  cond  );  32238  int pthread_cond_signal (pthread_cond_t *  cond  );  


32239


32240   DESCRIPTION
32241              These  functions  shall  unblock  threads  blocked  on  a  condition  variable.

32242              The   pthread_cond_broadcast ()  function  shall  unblock  all  threads  currently  blocked  on  the
32243              specified  condition  variable   cond .

32244              The   pthread_cond_signal ()  function  shall  unblock  at  least  one  of  the  threads  that  are  blocked  on
32245              the  specified  condition  variable   cond  (if  any  threads  are  blocked  on   cond ).

32246              If  more  than  one  thread  is  blocked  on  a  condition  variable,  the  scheduling  policy  shall  determine
32247              the  order  in  which  threads  are  unblocked.  When  each  thread  unblocked  as  a  result  of  a
32248               pthread_cond_broadcast ()  or   pthread_cond_signal ()  returns  from  its  call  to   pthread_cond_wait ()  or
32249               pthread_cond_timedwait (),  the  thread  shall  own  the  mutex  with  which  it  called
32250               pthread_cond_wait ()  or   pthread_cond_timedwait ().  The  thread(s)  that  are  unblocked  shall  contend
32251              for  the  mutex  according  to  the  scheduling  policy  (if   applicable ),  and  as  if  each  had  called
32252               pthread_mutex_lock ().

32253              The   pthread_cond_broadcast ()  or   pthread_cond_signal ()  functions  may  be  called  by  a  thread
32254              whether  or  not  it  currently  owns  the  mutex  that  threads  calling   pthread_cond_wait ()  or
32255               pthread_cond_timedwait ()  have  associated  with  the  condition  variable  during  their  waits;
32256              however,  if  predictable  scheduling  behavior  is  required,  then  that  mutex  shall  be  locked  by  the
32257              thread  calling   pthread_cond_broadcast ()  or   pthread_cond_signal ().

32258              The   pthread_cond_broadcast ()  and   pthread_cond_signal ()  functions  shall  have  no  effect  if  there  are
32259              no  threads  currently  blocked  on   cond .


32260   RETURN  VALUE
32261              If  successful,  the   pthread_cond_broadcast ()  and   pthread_cond_signal ()  functions  shall  return  zero;
32262              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


32263   ERRORS
32264              The   pthread_cond_broadcast ()  and   pthread_cond_signal ()  function  may  fail  if:

32265              [EINVAL]                  The  value   cond  does  not  refer  to  an  initialized  condition  variable.

32266              These  functions  shall  not  return  an  error  code  of  [EINTR].


32267   EXAMPLES
32268              None.


32269   APPLICATION  USAGE
32270              The   pthread_cond_broadcast ()  function  is  used  whenever  the  shared-variable  state  has  been
32271              changed  in  a  way  that  more  than  one  thread  can  proceed  with  its  task.  Consider  a  single
32272              producer/multiple  consumer  problem,  where  the  producer  can  insert  multiple  items  on  a  list
32273              that  is  accessed  one  item  at  a  time  by  the  consumers.  By  calling  the   pthread_cond_broadcast ()
32274              function,  the  producer  would  notify  all  consumers  that  might  be  waiting,  and  thereby  the
32275              application  would  receive  more  throughput  on  a  multi-processor.  In  addition,
32276               pthread_cond_broadcast ()  makes  it  easier  to  implement  a  read-write  lock.  The
32277               pthread_cond_broadcast ()  function  is  needed  in  order  to  wake  up  all  waiting  readers  when  a
32278              writer  releases  its  lock.  Finally,  the  two-phase  commit  algorithm  can  use  this  broadcast  function
32279              to  notify  all   clients  of  an   impending  transaction  commit.

32280              It  is  not  safe  to  use  the   pthread_cond_signal ()  function  in  a  signal  handler  that  is  invoked
32281              asynchronously.  Even  if  it  were  safe,  there  would  still  be  a  race  between  the  test  of  the  Boolean
32282               pthread_cond_wait ()  that  could  not  be  efficiently  eliminated.

32283              Mutexes  and  condition  variables  are  thus  not  suitable  for  releasing  a  waiting  thread  by  signaling
32284              from  code  running  in  a  signal  handler.


32285   RATIONALE

32286               Multiple  Awakenings  by  Condition  Signal

32287              On  a  multi-processor,  it  may  be  impossible  for  an  implementation  of   pthread_cond_signal ()  to
32288              avoid  the  unblocking  of  more  than  one  thread  blocked  on  a  condition  variable.  For  example,
32289              consider  the  following  partial  implementation  of   pthread_cond_wait ()  and   pthread_cond_signal (),
32290              executed  by  two  threads  in  the  order  given.  One  thread  is  trying  to  wait  on  the  condition
32291              variable,  another  is  concurrently  executing   pthread_cond_signal (),  while  a  third  thread  is  already
32292              waiting.

 32293       pthread_cond_wait (mutex, cond): 32294           value = cond->value; /* 1 */ 32295           pthread_mutex_unlock (mutex); /* 2 */ 32296           pthread_mutex_lock (cond->mutex); /* 10 */ 32297           if (value == cond->value) { /* 11 */ 32298               me->next_cond = cond->waiter; 32299               cond->waiter = me; 32300               pthread_mutex_unlock (cond->mutex); 32301               unable_to_run (me); 32302           } else 32303               pthread_mutex_unlock (cond->mutex); /* 12 */ 32304           pthread_mutex_lock (mutex); /* 13 * / 32305       pthread_cond_signal (cond): 32306           pthread_mutex_lock (cond->mutex); /* 3 */ 32307           cond->value++; /* 4 */ 32308           if (cond->waiter) { /* 5 */ 32309               sleeper = cond->waiter; /* 6 */ 32310               cond->waiter = sleeper->next_cond; /* 7 */ 32311               able_to_run (sleeper); /* 8 */ 32312       } 32313       pthread_mutex_unlock (cond->mutex); /* 9 */ 


32314              The  effect  is  that  more  than  one  thread  can  return  from  its  call  to   pthread_cond_wait ()  or
32315               pthread_cond_timedwait ()  as  a  result  of  one  call  to   pthread_cond_signal ().  This  effect  is  called
32316              " spurious   wakeup ".  Note  that  the  situation  is  self-correcting  in  that  the  number  of  threads  that
32317              are  so  awakened  is  finite;  for  example,  the  next  thread  to  call   pthread_cond_wait ()  after  the

32319              While  this  problem  could  be  resolved,  the  loss  of  efficiency  for  a  fringe  condition  that  occurs
32320              only  rarely  is  unacceptable,  especially  given  that  one  has  to  check  the  predicate  associated  with  a
32321              condition  variable  anyway.  Correcting  this  problem  would  unnecessarily  reduce  the  degree  of
32322              concurrency  in  this  basic  building  block  for  all  higher-level  synchronization  operations.

32323              An  added  benefit  of  allowing  spurious  wakeups  is  that  applications  are  forced  to  code  a
32324              predicate-testing-loop  around  the  condition  wait.  This  also  makes  the  application   tolerate
32325              superfluous  condition  broadcasts  or  signals  on  the  same  condition  variable  that  may  be  coded  in
32326              some  other  part  of  the  application.  The  resulting  applications  are  thus  more  robust.  Therefore,
32327              IEEE  Std  1003.1-2001  explicitly  documents  that  spurious  wakeups  may  occur.


32328   FUTURE  DIRECTIONS
32329              None.


32330   SEE  ALSO
32331               pthread_cond_destroy (),   pthread_cond_timedwait (),  the  Base  Definitions  volume  of
32332              IEEE  Std  1003.1-2001,  < pthread.h>


32333   CHANGE  HISTORY
32334              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32335   Issue  6
32336              The   pthread_cond_broadcast ()  and   pthread_cond_signal ()  functions  are  marked  as  part  of  the
32337              Threads  option.

32338              The  APPLICATION  USAGE  section  is  added.


32339   NAME
32340              pthread_cond_destroy,  pthread_cond_init   ”  destroy  and  initialize  condition  variables


32341   SYNOPSIS

 32342 THR  #include <pthread.h>  32343  int pthread_cond_destroy (pthread_cond_t *  cond  );  32344  int pthread_cond_init (pthread_cond_t *restrict  cond,   32345  const pthread_condattr_t *restrict  attr  );  32346  pthread_cond_t  cond  = PTHREAD_COND_INITIALIZER;  


32347


32348   DESCRIPTION
32349              The   pthread_cond_destroy ()  function  shall  destroy  the  given  condition  variable  specified  by   cond ;
32350              the  object  becomes,  in  effect,  uninitialized.  An  implementation  may  cause   pthread_cond_destroy ()
32351              to  set  the  object  referenced  by   cond  to  an  invalid  value.  A  destroyed  condition  variable  object  can
32352              be  reinitialized  using   pthread_cond_init ();  the  results  of  otherwise  referencing  the  object  after  it
32353              has  been  destroyed  are  undefined.

32354              It  shall  be  safe  to  destroy  an  initialized  condition  variable  upon  which  no  threads  are  currently
32355              blocked.  Attempting  to  destroy  a  condition  variable  upon  which  other  threads  are  currently
32356              blocked  results  in  undefined  behavior.

32357              The   pthread_cond_init ()  function  shall  initialize  the  condition  variable  referenced  by   cond  with
32358              attributes  referenced  by   attr .  If   attr  is  NULL,  the  default  condition  variable  attributes  shall  be
32359              used;  the  effect  is  the  same  as  passing  the  address  of  a  default  condition  variable  attributes
32360              object.  Upon  successful  initialization,  the  state  of  the  condition  variable  shall  become  initialized.

32361              Only   cond  itself  may  be  used  for  performing  synchronization.  The  result  of  referring  to  copies  of
32362               cond  in  calls  to   pthread_cond_wait (),   pthread_cond_timedwait (),   pthread_cond_signal (),
32363               pthread_cond_broadcast (),  and   pthread_cond_destroy ()  is  undefined.

32364              Attempting  to  initialize  an  already  initialized  condition  variable  results  in  undefined  behavior.

32365              In  cases  where  default  condition  variable  attributes  are  appropriate,  the  macro
32366              PTHREAD_COND_INITIALIZER  can  be  used  to  initialize  condition  variables  that  are  statically
32367              allocated.  The  effect  shall  be  equivalent  to  dynamic  initialization  by  a  call  to   pthread_cond_init ()
32368              with  parameter   attr  specified  as  NULL,  except  that  no  error  checks  are  performed.


32369   RETURN  VALUE
32370              If  successful,  the   pthread_cond_destroy ()  and   pthread_cond_init ()  functions  shall  return  zero;
32371              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

32372              The  [EBUSY]  and  [EINVAL]  error  checks,  if  implemented,  shall  act  as  if  they  were  performed
32373              immediately  at  the  beginning  of  processing  for  the  function  and  caused  an  error  return  prior  to
32374              modifying  the  state  of  the  condition  variable  specified  by   cond .


32375   ERRORS
32376              The   pthread_cond_destroy ()  function  may  fail  if:

32377              [EBUSY]              The  implementation  has  detected  an  attempt  to  destroy  the  object  referenced
32378                                          by   cond  while  it  is  referenced  (for  example,  while  being  used  in  a
32379                                           pthread_cond_wait ()  or   pthread_cond_timedwait ()  by  another  thread.
32380              [EINVAL]            The  value  specified  by   cond  is  invalid.

32381              The   pthread_cond_init ()  function  shall  fail  if:

32382              [EAGAIN]            The  system  lacked  the  necessary  resources  (other  than  memory)  to  initialize
32383                                          another  condition  variable.
32384              [ENOMEM]            Insufficient  memory  exists  to  initialize  the  condition  variable.

32385              The   pthread_cond_init ()  function  may  fail  if:

32386              [EBUSY]              The  implementation  has  detected  an  attempt  to   reinitialize  the  object
32387                                          referenced  by   cond ,  a  previously  initialized,  but  not  yet  destroyed,  condition
32388                                          variable.
32389              [EINVAL]            The  value  specified  by   attr  is  invalid.

32390              These  functions  shall  not  return  an  error  code  of  [EINTR].


32391   EXAMPLES
32392              A  condition  variable  can  be  destroyed  immediately  after  all  the  threads  that  are  blocked  on  it  are
32393              awakened.  For  example,  consider  the  following  code:

 32394       struct list { 32395           pthread_mutex_t lm; 32396           ... 32397       } 32398       struct elt { 32399           key k; 32400           int busy; 32401           pthread_cond_t notbusy; 32402           ... 32403       } 32404       /* Find a list element and reserve it. */ 32405       struct elt * 32406       list_find (struct list *lp, key k) 32407       { 32408           struct elt *ep; 32409           pthread_mutex_lock (&lp->lm); 32410           while ((ep = find_elt (1, k) ! = NULL) && ep->busy) 32411               pthread_cond_wait (&ep->notbusy, &lp->lm); 32412           if (ep != NULL) 32413               ep->busy = 1; 32414           pthread_mutex_unlock (&lp->lm); 32415           return (ep); 32416       } 32417       delete_elt (struct list *lp, struct elt *ep) 32418       { 32419           pthread_mutex_lock (&lp->lm); 32420           assert (ep->busy); 32421           ... remove ep from list ... 32422           ep->busy = 0; /* Paranoid. */ 32423       (A) pthread_cond_broadcast (&ep->notbusy); 32424           pthread_mutex_unlock (&lp->lm); 32425       (B) pthread_cond_destroy (&rp->notbusy); 32426           free (ep); 32427       } 


32428              In  this  example,  the  condition  variable  and  its  list  element  may  be  freed  (line  B)  immediately
32429              after  all  threads  waiting  for  it  are  awakened  (line  A),  since  the  mutex  and  the  code  ensure  that  no
32430              other  thread  can  touch  the  element  to  be  deleted.


32431   APPLICATION  USAGE
32432              None.


32433   RATIONALE
32434              See   pthread_mutex_init ();  a  similar  rationale  applies  to  condition  variables.


32435   FUTURE  DIRECTIONS
32436              None.


32437   SEE  ALSO
32438               pthread_cond_broadcast (),   pthread_cond_signal (),   pthread_cond_timedwait (),  the  Base  Definitions
32439              volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


32440   CHANGE  HISTORY
32441              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32442   Issue  6
32443              The   pthread_cond_destroy ()  and   pthread_cond_init ()  functions  are  marked  as  part  of  the  Threads
32444              option.

32445              IEEE  PASC  Interpretation  1003.1c  #34  is  applied,  updating  the  DESCRIPTION.

32446              The   restrict  keyword  is  added  to  the   pthread_cond_init ()  prototype  for  alignment  with  the
32447              ISO/IEC  9899:  1999  standard.


32456   NAME
32457              pthread_cond_timedwait,  pthread_cond_wait ”wait  on  a  condition


32458   SYNOPSIS

 32459 THR  #include <pthread.h>  32460  int pthread_cond_timedwait (pthread_cond_t *restrict  cond,   32461  pthread_mutex_t *restrict  mutex,   32462  const struct timespec *restrict  abstime  );  32463  int pthread_cond_wait (pthread_cond_t *restrict  cond,   32464  pthread_mutex_t *restrict  mutex  );  


32465


32466   DESCRIPTION
32467              The   pthread_cond_timedwait ()  and   pthread_cond_wait ()  functions  shall  block  on  a  condition
32468              variable.  They  shall  be  called  with   mutex  locked  by  the  calling  thread  or  undefined  behavior
32469              results.

32470              These  functions  atomically  release   mutex  and  cause  the  calling  thread  to  block  on  the  condition
32471              variable   cond ;  atomically  here  means  "atomically  with  respect  to  access  by  another  thread  to  the
32472              mutex  and  then  the  condition  variable".  That  is,  if  another  thread  is  able  to  acquire  the  mutex
32473              after  the  about-to-block  thread  has  released  it,  then  a  subsequent  call  to   pthread_cond_broadcast ()
32474              or   pthread_cond_signal ()  in  that  thread  shall  behave  as  if  it  were  issued  after  the  about-to-block
32475              thread  has  blocked.

32476              Upon  successful  return,  the  mutex  shall  have  been  locked  and  shall  be  owned  by  the  calling
32477              thread.

32478              When  using  condition  variables  there  is  always  a  Boolean  predicate  involving  shared  variables
32479              associated  with  each  condition  wait  that  is  true  if  the  thread  should  proceed.  Spurious  wakeups
32480              from  the   pthread_cond_timedwait ()  or   pthread_cond_wait ()  functions  may  occur.  Since  the  return
32481              from   pthread_cond_timedwait ()  or   pthread_cond_wait ()  does  not  imply  anything  about  the  value
32482              of  this  predicate,  the  predicate  should  be  re-evaluated  upon  such  return.

32483              The  effect  of  using  more  than  one  mutex  for  concurrent   pthread_cond_timedwait ()  or
32484               pthread_cond_wait ()  operations  on  the  same  condition  variable  is  undefined;  that  is,  a  condition
32485              variable  becomes  bound  to  a  unique  mutex  when  a  thread  waits  on  the  condition  variable,  and
32486              this  (dynamic)  binding  shall  end  when  the  wait  returns.

32487              A  condition  wait  (whether  timed  or  not)  is  a  cancelation  point.  When  the  cancelability  enable
32488              state  of  a  thread  is  set  to  PTHREAD_CANCEL_DEFERRED,  a  side  effect  of  acting  upon  a
32489              cancelation  request  while  in  a  condition  wait  is  that  the  mutex  is  (in  effect)  re- acquired  before
32490              calling  the  first  cancelation  cleanup  handler.  The  effect  is  as  if  the  thread  were  unblocked,
32491              allowed  to  execute  up  to  the  point  of  returning  from  the  call  to   pthread_cond_timedwait ()  or
32492               pthread_cond_wait (),  but  at  that  point  notices  the  cancelation  request  and  instead  of  returning  to
32493              the  caller  of   pthread_cond_timedwait ()  or   pthread_cond_wait (),  starts  the  thread  cancelation
32494              activities,  which  includes  calling  cancelation  cleanup  handlers.

32495              A  thread  that  has  been  unblocked  because  it  has  been  canceled  while  blocked  in  a  call  to
32496               pthread_cond_timedwait ()  or   pthread_cond_wait ()  shall  not   consume  any  condition  signal  that
32497              may  be  directed  concurrently  at  the  condition  variable  if  there  are  other  threads  blocked  on  the
32498              condition  variable.

32499              The   pthread_cond_timedwait ()  function  shall  be  equivalent  to   pthread_cond_wait (),  except  that  an
32500              error  is  returned  if  the  absolute  time  specified  by   abstime   passes  (that  is,  system  time  equals  or
32501              exceeds   abstime )  before  the  condition   cond  is  signaled  or  broadcasted,  or  if  the  absolute  time
32502              specified  by   abstime  has  already  been  passed  at  the  time  of  the  call.

32503  CS         If  the  Clock  Selection  option  is  supported,  the  condition  variable  shall  have  a  clock  attribute
32504               which  specifies  the  clock  that  shall  be  used  to  measure  the  time  specified  by  the   abstime
32505               argument .  When  such  timeouts  occur,   pthread_cond_timedwait ()  shall  nonetheless  release  and
32506              re-acquire  the  mutex  referenced  by   mutex .  The   pthread_cond_timedwait ()  function  is  also  a
32507              cancelation  point.

32508              If  a  signal  is  delivered  to  a  thread  waiting  for  a  condition  variable,  upon  return  from  the  signal
32509              handler  the  thread  resumes  waiting  for  the  condition  variable  as  if  it  was  not   interrupted ,  or  it
32510              shall  return  zero  due  to  spurious  wakeup.


32511   RETURN  VALUE
32512              Except  in  the  case  of  [ETIMEDOUT],  all  these  error  checks  shall  act  as  if  they  were  performed
32513              immediately  at  the  beginning  of  processing  for  the  function  and  shall  cause  an  error  return,  in
32514              effect,  prior  to  modifying  the  state  of  the  mutex  specified  by   mutex  or  the  condition  variable
32515              specified  by   cond .

32516              Upon  successful  completion,  a  value  of  zero  shall  be  returned;  otherwise,  an  error  number  shall
32517              be  returned  to  indicate  the  error.


32518   ERRORS
32519              The   pthread_cond_timedwait ()  function  shall  fail  if:

32520              [ETIMEDOUT]          The  time  specified  by   abstime  to   pthread_cond_timedwait ()  has  passed.

32521              The   pthread_cond_timedwait ()  and   pthread_cond_wait ()  functions  may  fail  if:

32522              [EINVAL]                The  value  specified  by   cond,  mutex ,  or   abstime  is  invalid.
32523              [EINVAL]                Different  mutexes  were  supplied  for  concurrent   pthread_cond_timedwait ()  or
32524                                               pthread_cond_wait ()  operations  on  the  same  condition  variable.
32525              [EPERM]                  The  mutex  was  not  owned  by  the  current  thread  at  the  time  of  the  call.

32526              These  functions  shall  not  return  an  error  code  of  [EINTR].


32527   EXAMPLES
32528              None.


32529   APPLICATION  USAGE
32530              None.


32531   RATIONALE

32532               Condition  Wait  Semantics

32533              It  is  important  to  note  that  when   pthread_cond_wait ()  and   pthread_cond_timedwait ()  return
32534              without  error,  the  associated  predicate  may  still  be  false.  Similarly,  when
32535               pthread_cond_timedwait ()  returns  with  the  timeout  error,  the  associated  predicate  may  be  true
32536              due  to  an  unavoidable  race  between  the  expiration  of  the  timeout  and  the  predicate  state  change.

32537              Some  implementations,  particularly  on  a  multi-processor,  may  sometimes  cause  multiple
32538              threads  to  wake  up  when  the  condition  variable  is  signaled   simultaneously  on  different
32539              processors.

32540              In  general,  whenever  a  condition  wait  returns,  the  thread  has  to  re-evaluate  the  predicate
32541              associated  with  the  condition  wait  to  determine  whether  it  can  safely  proceed,  should  wait
32542              again,  or  should  declare  a  timeout.  A  return  from  the  wait  does  not  imply  that  the  associated
32543              predicate  is  either  true  or  false.

32544              It  is  thus  recommended  that  a  condition  wait  be   enclosed  in  the  equivalent  of  a  "while  loop"
32545              that  checks  the  predicate.

32546               Timed  Wait  Semantics

32547              An  absolute  time  measure  was   chosen  for  specifying  the  timeout  parameter  for  two  reasons.
32548              First,  a  relative  time  measure  can  be  easily  implemented  on  top  of  a  function  that  specifies
32549              absolute  time,  but  there  is  a  race  condition  associated  with  specifying  an  absolute  timeout  on  top
32550              of  a  function  that  specifies  relative  timeouts.  For  example,  assume  that   clock_gettime ()  returns
32551              the  current  time  and   cond_relative_timed_wait ()  uses  relative  timeouts:

32552              clock_gettime  (CLOCK_REALTIME,  &now)
32553              reltime  =  sleep_til_this_absolute_time  -now;
32554              cond_relative_timed_wait  (c,  m,  &reltime);

32555              If  the  thread  is  preempted  between  the  first  statement  and  the  last  statement,  the  thread  blocks
32556              for  too  long.  Blocking,  however,  is  irrelevant  if  an  absolute  timeout  is  used.  An  absolute  timeout
32557              also  need  not  be  recomputed  if  it  is  used  multiple  times  in  a  loop,  such  as  that  enclosing  a
32558              condition  wait.

32559              For  cases  when  the  system  clock  is  advanced  discontinuously  by  an  operator,  it  is  expected  that
32560              implementations  process  any  timed  wait  expiring  at  an  intervening  time  as  if  that  time  had
32561              actually  occurred.

32562               Cancelation  and  Condition  Wait

32563              A  condition  wait,  whether  timed  or  not,  is  a  cancelation  point.  That  is,  the  functions
32564               pthread_cond_wait ()  or   pthread_cond_timedwait ()  are  points  where  a  pending  (or  concurrent)
32565              cancelation  request  is  noticed.  The  reason  for  this  is  that  an  indefinite  wait  is  possible  at  these
32566              points ”whatever  event  is  being  waited  for,  even  if  the  program  is  totally  correct,  might  never
32567              occur;  for  example,  some  input  data  being  awaited  might  never  be  sent.  By  making  condition
32568              wait  a  cancelation  point,  the  thread  can  be  canceled  and  perform  its  cancelation  cleanup  handler
32569              even  though  it  may  be  stuck  in  some  indefinite  wait.

32570              A  side  effect  of  acting  on  a  cancelation  request  while  a  thread  is  blocked  on  a  condition  variable
32571              is  to  re-acquire  the  mutex  before  calling  any  of  the  cancelation  cleanup  handlers.  This  is  done  in
32572              order  to  ensure  that  the  cancelation  cleanup  handler  is  executed  in  the  same  state  as  the  critical
32573              code  that  lies  both  before  and  after  the  call  to  the  condition  wait  function.  This  rule  is  also
32574              required  when  interfacing  to  POSIX  threads  from  languages,  such  as  Ada  or  C++,  which  may
32575              choose  to  map  cancelation  onto  a  language  exception;  this  rule  ensures  that  each  exception
32576              handler  guarding  a  critical  section  can  always  safely  depend  upon  the  fact  that  the  associated
32577              mutex  has  already  been  locked  regardless  of  exactly  where  within  the  critical  section  the
32578              exception  was  raised.  Without  this  rule,  there  would  not  be  a  uniform  rule  that  exception
32579              handlers  could  follow  regarding  the  lock,  and  so  coding  would  become  very  cumbersome.

32580              Therefore,  since   some  statement  has  to  be  made  regarding  the  state  of  the  lock  when  a
32581              cancelation  is  delivered  during  a  wait,  a  definition  has  been  chosen  that  makes  application
32582              coding  most  convenient  and  error  free.

32583              When  acting  on  a  cancelation  request  while  a  thread  is  blocked  on  a  condition  variable,  the
32584              implementation  is  required  to  ensure  that  the  thread  does  not  consume  any  condition  signals
32585              directed  at  that  condition  variable  if  there  are  any  other  threads  waiting  on  that  condition
32586              variable.  This  rule  is  specified  in  order  to  avoid  deadlock  conditions  that  could  occur  if  these  two
32587              independent   requests  (one  acting  on  a  thread  and  the  other  acting  on  the  condition  variable)
32588              were  not  processed  independently.

32589               Performance  of  Mutexes  and  Condition  Variables

32590              Mutexes  are  expected  to  be  locked  only  for  a  few  instructions.  This  practice  is  almost
32591              automatically  enforced  by  the   desire  of  programmers  to  avoid  long  serial   regions  of  execution
32592              (which  would  reduce  total  effective  parallelism).

32593              When  using  mutexes  and  condition  variables,  one   tries  to  ensure  that  the  usual  case  is  to  lock  the
32594              mutex,  access  shared  data,  and  unlock  the  mutex.  Waiting  on  a  condition  variable  should  be  a
32595              relatively  rare  situation.  For  example,  when  implementing  a  read-write  lock,  code  that  acquires  a
32596              read-lock  typically  needs  only  to  increment  the  count  of  readers  (under  mutual-exclusion)  and
32597              return.  The  calling  thread  would  actually  wait  on  the  condition  variable  only  when  there  is
32598              already  an  active  writer.  So  the  efficiency  of  a  synchronization  operation  is  bounded  by  the  cost
32599              of  mutex  lock/unlock  and  not  by  condition  wait.  Note  that  in  the  usual  case  there  is  no  context
32600              switch.

32601              This  is  not  to  say  that  the  efficiency  of  condition  waiting  is  unimportant.  Since  there  needs  to  be
32602              at  least  one  context  switch  per  Ada  rendezvous,  the  efficiency  of  waiting  on  a  condition  variable
32603              is  important.  The  cost  of  waiting  on  a  condition  variable  should  be  little  more  than  the  minimal
32604              cost  for  a  context  switch  plus  the  time  to  unlock  and  lock  the  mutex.

32605               Features  of  Mutexes  and  Condition  Variables

32606              It  had  been  suggested  that  the  mutex  acquisition  and  release  be  decoupled  from  condition  wait.
32607              This  was  rejected  because  it  is  the  combined  nature  of  the  operation  that,  in  fact,  facilitates
32608              realtime  implementations.  Those  implementations  can  atomically  move  a  high-priority  thread
32609              between  the  condition  variable  and  the  mutex  in  a  manner  that  is  transparent  to  the  caller.  This
32610              can  prevent  extra  context  switches  and  provide  more  deterministic  acquisition  of  a  mutex  when
32611              the  waiting  thread  is  signaled.  Thus,  fairness  and  priority  issues  can  be  dealt  with  directly  by  the
32612              scheduling  discipline.  Furthermore,  the  current  condition  wait  operation  matches  existing
32613              practice.

32614               Scheduling  Behavior  of  Mutexes  and  Condition  Variables

32615              Synchronization  primitives  that  attempt  to  interfere  with  scheduling  policy  by  specifying  an
32616              ordering  rule  are  considered  undesirable.  Threads  waiting  on  mutexes  and  condition  variables
32617              are  selected  to  proceed  in  an  order  dependent  upon  the  scheduling  policy  rather  than  in  some
32618              fixed  order  (for  example,  FIFO  or  priority).  Thus,  the  scheduling  policy  determines  which
32619              thread(s)  are  awakened  and  allowed  to  proceed.

32620               Timed  Condition  Wait

32621              The   pthread_cond_timedwait ()  function  allows  an  application  to  give  up  waiting  for  a  particular
32622              condition  after  a  given  amount  of  time.  An  example  of  its  use  follows:

 32623       (void) pthread_mutex_lock (&t. mn); 32624               t.waiters++; 32625           clock_gettime (CLOCK_REALTIME, &ts); 32626           ts.tv_sec += 5; 32627           rc = 0; 32628           while (! mypredicate (&t) && rc == 0) 32629               rc = pthread_cond_timedwait (&t.cond, &t.mn, &ts); 32630           t.waiters- -; 32631           if (rc == 0) setmystate (&t); 32632       (void) pthread_mutex_unlock (&t.mn); 


32633              By  making  the  timeout  parameter  absolute,  it  does  not  need  to  be  recomputed  each  time  the
32634              program  checks  its  blocking  predicate.  If  the  timeout  was  relative,  it  would  have  to  be
32635              recomputed  before  each  call.  This  would  be  especially  difficult  since  such  code  would  need  to
32636              take  into  account  the  possibility  of  extra  wakeups  that  result  from  extra  broadcasts  or  signals  on
32637              the  condition  variable  that  occur  before  either  the  predicate  is  true  or  the  timeout  is  due.


32638   FUTURE  DIRECTIONS
32639              None.


32640   SEE  ALSO
32641               pthread_cond_signal (),   pthread_cond_broadcast (),  the  Base  Definitions  volume  of
32642              IEEE  Std  1003.1-2001,  < pthread.h>


32643   CHANGE  HISTORY
32644              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32645   Issue  6
32646              The   pthread_cond_timedwait ()  and   pthread_cond_wait ()  functions  are  marked  as  part  of  the
32647              Threads  option.

32648              The  Open  Group  Corrigendum  U021/9  is  applied,  correcting  the  prototype  for  the
32649               pthread_cond_wait ()  function.

32650              The  DESCRIPTION  is  updated  for  alignment  with  IEEE  Std  1003.1j-2000  by  adding  semantics  for
32651              the  Clock  Selection  option.

32652              The  ERRORS  section  has  an  additional  case  for  [EPERM]  in  response  to  IEEE  PASC
32653              Interpretation  1003.1c  #28.

32654              The   restrict  keyword  is  added  to  the   pthread_cond_timedwait ()  and   pthread_cond_wait ()
32655              prototypes  for  alignment  with  the  ISO/IEC  9899:  1999  standard.


32656   NAME
32657              pthread_condattr_destroy,  pthread_condattr_init ”destroy  and  initialize  the  condition  variable
32658              attributes  object


32659   SYNOPSIS

 32660 THR  #include <pthread.h>  32661  int pthread_condattr_destroy (pthread_condattr_t *  attr  );  32662  int pthread_condattr_init (pthread_condattr_t *  attr  );  


32663


32664   DESCRIPTION
32665              The   pthread_condattr_destroy ()  function  shall  destroy  a  condition  variable  attributes  object;  the
32666              object  becomes,  in  effect,  uninitialized.  An  implementation  may  cause   pthread_condattr_destroy ()
32667              to  set  the  object  referenced  by   attr  to  an  invalid  value.  A  destroyed   attr  attributes  object  can  be
32668              reinitialized  using   pthread_condattr_init ();  the  results  of  otherwise  referencing  the  object  after  it
32669              has  been  destroyed  are  undefined.

32670              The   pthread_condattr_init ()  function  shall  initialize  a  condition  variable  attributes  object   attr  with
32671              the  default  value  for  all  of  the  attributes  defined  by  the  implementation.

32672              Results  are  undefined  if   pthread_condattr_init ()  is  called  specifying  an  already  initialized   attr
32673              attributes  object.

32674              After  a  condition  variable  attributes  object  has  been  used  to  initialize  one  or  more  condition
32675              variables,  any  function  affecting  the  attributes  object  (including  destruction)  shall  not  affect  any
32676              previously  initialized  condition  variables.

32677              This  volume  of  IEEE  Std  1003.1-2001  requires  two  attributes,  the   clock  attribute  and  the   process-
32678               shared  attribute.

32679              Additional  attributes,  their  default  values,  and  the  names  of  the  associated  functions  to  get  and
32680              set  those  attribute  values  are  implementation-defined.


32681   RETURN  VALUE
32682              If  successful,  the   pthread_condattr_destroy ()  and   pthread_condattr_init ()  functions  shall  return
32683              zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


32684   ERRORS
32685              The   pthread_condattr_destroy ()  function  may  fail  if:

32686              [EINVAL]                The  value  specified  by   attr  is  invalid.

32687              The   pthread_condattr_init ()  function  shall  fail  if:

32688              [ENOMEM]                Insufficient  memory  exists  to  initialize  the  condition  variable  attributes  object.

32689              These  functions  shall  not  return  an  error  code  of  [EINTR].


32690   EXAMPLES
32691              None.


32692   APPLICATION  USAGE
32693              None.


32694   RATIONALE
32695              See   pthread_attr_init ()  and   pthread_mutex_init ().

32696              A   process-shared  attribute  has  been  defined  for  condition  variables  for  the  same  reason  it  has  been
32697              defined  for  mutexes.


32698   FUTURE  DIRECTIONS
32699              None.


32700   SEE  ALSO
32701               pthread_attr_destroy (),   pthread_cond_destroy (),   pthread_condattr_getpshared (),   pthread_create (),
32702               pthread_mutex_destroy (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


32703   CHANGE  HISTORY
32704              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32705   Issue  6
32706              The   pthread_condattr_destroy ()  and   pthread_condattr_init ()  functions  are  marked  as  part  of  the
32707              Threads  option.


32753   NAME
32754              pthread_condattr_getpshared,  pthread_condattr_setpshared   ”  get  and  set  the  process-shared
32755              condition  variable  attributes


32756   SYNOPSIS

 32757 THR TSH  #include <pthread.h>  32758  int pthread_condattr_getpshared (const pthread_condattr_t *restrict  attr,   32759  int *restrict  pshared  );  32760  int pthread_condattr_setpshared (pthread_condattr_t *  attr,   32761  int  pshared  );  


32762


32763   DESCRIPTION
32764              The   pthread_condattr_getpshared ()  function  shall  obtain  the  value  of  the   process-shared  attribute
32765              from  the  attributes  object  referenced  by   attr .  The   pthread_condattr_setpshared ()  function  shall  set
32766              the   process-shared  attribute  in  an  initialized  attributes  object  referenced  by   attr .

32767              The   process-shared  attribute  is  set  to  PTHREAD_PROCESS_SHARED  to  permit  a  condition
32768              variable  to  be  operated  upon  by  any  thread  that  has  access  to  the  memory  where  the  condition
32769              variable  is  allocated,  even  if  the  condition  variable  is  allocated  in  memory  that  is  shared  by
32770              multiple  processes.  If  the   process-shared  attribute  is  PTHREAD_PROCESS_PRIVATE,  the
32771              condition  variable  shall  only  be  operated  upon  by  threads  created  within  the  same  process  as  the
32772              thread  that  initialized  the  condition  variable;  if  threads  of  differing  processes  attempt  to  operate
32773              on  such  a  condition  variable,  the  behavior  is  undefined.  The  default  value  of  the  attribute  is
32774              PTHREAD_PROCESS_PRIVATE.


32775   RETURN  VALUE
32776              If  successful,  the   pthread_condattr_setpshared ()  function  shall  return  zero;  otherwise,  an  error
32777              number  shall  be  returned  to  indicate  the  error.

32778              If  successful,  the   pthread_condattr_getpshared ()  function  shall  return  zero  and  store  the  value  of
32779              the   process-shared  attribute  of   attr  into  the  object  referenced  by  the   pshared  parameter.  Otherwise,
32780              an  error  number  shall  be  returned  to  indicate  the  error.


32781   ERRORS
32782              The   pthread_condattr_getpshared ()  and   pthread_condattr_setpshared ()  functions  may  fail  if:

32783              [EINVAL]                The  value  specified  by   attr  is  invalid.

32784              The   pthread_condattr_setpshared ()  function  may  fail  if:

32785              [EINVAL]                The  new  value  specified  for  the  attribute  is  outside  the  range  of  legal  values
32786                                              for  that  attribute.

32787              These  functions  shall  not  return  an  error  code  of  [EINTR].


32788   EXAMPLES
32789              None.


32790   APPLICATION  USAGE
32791              None.


32792   RATIONALE
32793              None.


32794   FUTURE  DIRECTIONS
32795              None.


32796   SEE  ALSO
32797               pthread_create (),   pthread_cond_destroy (),   pthread_condattr_destroy (),   pthread_mutex_destroy (),  the
32798              Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


32799   CHANGE  HISTORY
32800              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32801   Issue  6
32802              The   pthread_condattr_getpshared ()  and   pthread_condattr_setpshared ()  functions  are  marked  as  part
32803              of  the  Threads  and  Thread  Process-Shared  Synchronization  options.

32804              The   restrict  keyword  is  added  to  the   pthread_condattr_getpshared ()  prototype  for  alignment  with
32805              the  ISO/IEC  9899:  1999  standard.


32832   NAME
32833              pthread_create   ”  thread  creation


32834   SYNOPSIS

 32835 THR  #include <pthread.h>  32836  int pthread_create (pthread_t *restrict  thread  ,  32837  const pthread_attr_t *restrict  attr  ,  32838  void * (*  start_routine)  (void*), void *restrict  arg  );  


32839


32840   DESCRIPTION
32841              The   pthread_create ()  function  shall  create  a  new  thread,  with  attributes  specified  by   attr ,  within  a
32842              process.  If   attr  is  NULL,  the  default  attributes  shall  be  used.  If  the  attributes  specified  by   attr  are
32843              modified  later,  the  thread's  attributes  shall  not  be  affected.  Upon  successful  completion,
32844               pthread_create ()  shall  store  the  ID  of  the  created  thread  in  the  location  referenced  by   thread .

32845              The  thread  is  created  executing   start_routine  with   arg  as  its  sole  argument.  If  the   start_routine
32846              returns,  the  effect  shall  be  as  if  there  was  an  implicit  call  to   pthread_exit ()  using  the  return  value
32847              of   start_routine  as  the  exit  status.  Note  that  the  thread  in  which   main ()  was  originally  invoked
32848               differs  from  this.  When  it  returns  from   main (),  the  effect  shall  be  as  if  there  was  an  implicit  call
32849              to   exit ()  using  the  return  value  of   main ()  as  the  exit  status.

32850              The  signal  state  of  the  new  thread  shall  be  initialized  as  follows:

32851                  The  signal  mask  shall  be  inherited  from  the  creating  thread.

32852                  The  set  of  signals  pending  for  the  new  thread  shall  be  empty.

32853              The  floating-point  environment  shall  be  inherited  from  the  creating  thread.

32854              If   pthread_create ()  fails,  no  new  thread  is  created  and  the  contents  of  the  location  referenced  by
32855               thread  are  undefined.

32856  TCT       If  _POSIX_THREAD_CPUTIME  is  defined,  the  new  thread  shall  have  a  CPU-time  clock
32857               accessible,  and  the  initial  value  of  this  clock  shall  be  set  to  zero.


32858   RETURN  VALUE
32859              If  successful,  the   pthread_create ()  function  shall  return  zero;  otherwise,  an  error  number  shall  be
32860              returned  to  indicate  the  error.


32861   ERRORS

32862              The   pthread_create ()  function  shall  fail  if:

32863              [EAGAIN]                    The  system  lacked  the  necessary  resources  to  create  another  thread,  or  the
32864                                                  system-imposed  limit  on  the  total  number  of  threads  in  a  process
32865                                                  {PTHREAD_THREADS_MAX}  would  be  exceeded.

32866              [EINVAL]                    The  value  specified  by   attr  is  invalid.
32867              [EPERM]                      The  caller  does  not  have  appropriate  permission  to  set  the  required
32868                                                  scheduling  parameters  or  scheduling  policy.

32869              The   pthread_create ()  function  shall  not  return  an  error  code  of  [EINTR].


32870   EXAMPLES
32871              None.


32872   APPLICATION  USAGE
32873              None.


32874   RATIONALE
32875              A  suggested  alternative  to   pthread_create ()  would  be  to  define  two  separate  operations:  create
32876              and  start.  Some  applications  would  find  such  behavior  more  natural.  Ada,  in  particular,
32877              separates  the  "creation"  of  a  task  from  its  "activation".

32878              Splitting  the  operation  was  rejected  by  the  standard  developers  for  many  reasons:

32879                  The  number  of  calls  required  to  start  a  thread  would  increase  from  one  to  two  and  thus  place
32880                    an  additional  burden  on  applications  that  do  not  require  the  additional  synchronization.  The
32881                    second  call,  however,  could  be  avoided  by  the  additional  complication  of  a  start-up  state
32882                    attribute.

32883                  An  extra  state  would  be  introduced:  "created  but  not  started".  This  would  require  the
32884                    standard  to  specify  the  behavior  of  the  thread  operations  when  the  target  has  not  yet  started
32885                    executing.

32886                  For  those  applications  that  require  such  behavior,  it  is  possible  to  simulate  the  two  separate
32887                    steps  with  the  facilities  that  are  currently  provided.  The   start_routine ()  can  synchronize  by
32888                    waiting  on  a  condition  variable  that  is  signaled  by  the  start  operation.

32889              An  Ada  implementor  can  choose  to  create  the  thread  at  either  of  two  points  in  the  Ada  program:
32890              when  the  task  object  is  created,  or  when  the  task  is  activated  (generally  at  a  "begin").  If  the  first
32891              approach  is  adopted,  the   start_routine ()  needs  to  wait  on  a  condition  variable  to  receive  the
32892              order  to  begin  "activation".  The  second  approach  requires  no  such  condition  variable  or  extra
32893              synchronization.  In  either  approach,  a  separate  Ada  task  control  block  would  need  to  be  created
32894              when  the  task  object  is  created  to  hold  rendezvous  queues,  and  so  on.

32895              An  extension  of  the   preceding  model  would  be  to  allow  the  state  of  the  thread  to  be  modified
32896              between  the  create  and  start.  This  would  allow  the  thread  attributes  object  to  be  eliminated.  This
32897              has  been  rejected  because:

32898                  All  state  in  the  thread  attributes  object  has  to  be  able  to  be  set  for  the  thread.  This  would
32899                  require  the  definition  of  functions  to  modify  thread  attributes.  There  would  be  no  reduction
32900                  in  the  number  of  function  calls  required  to  set  up  the  thread.  In  fact,  for  an  application  that
32901                  creates  all  threads  using  identical  attributes,  the  number  of  function  calls  required  to  set  up
32902                  the  threads  would  be  dramatically  increased.  Use  of  a  thread  attributes  object   permits  the
32903                  application  to  make  one  set  of  attribute  setting  function  calls.  Otherwise,  the  set  of  attribute
32904                  setting  function  calls  needs  to  be  made  for  each  thread  creation.

32905                  Depending  on  the  implementation  architecture,  functions  to  set  thread  state  would  require
32906                  kernel  calls,  or  for  other  implementation  reasons  would  not  be  able  to  be  implemented  as
32907                  macros,  thereby  increasing  the  cost  of  thread  creation.

32908                  The  ability  for  applications  to   segregate  threads  by  class  would  be  lost.

32909              Another  suggested  alternative  uses  a  model  similar  to  that  for  process  creation,  such  as  "thread
32910              fork".  The  fork  semantics  would  provide  more  flexibility  and  the  "create"  function  can  be
32911              implemented  simply  by  doing  a  thread  fork  followed  immediately  by  a  call  to  the  desired  "start
32912              routine"  for  the  thread.  This  alternative  has  these  problems:

32913                  For  many  implementations,  the  entire  stack  of  the  calling  thread  would  need  to  be
32914                    duplicated,  since  in  many  architectures  there  is  no  way  to  determine  the  size  of  the  calling
32915                    frame.

32916                  Efficiency  is  reduced  since  at  least  some  part  of  the  stack  has  to  be  copied,  even  though  in
32917                    most  cases  the  thread  never  needs  the  copied  context,  since  it  merely  calls  the  desired  start
32918                    routine.


32919   FUTURE  DIRECTIONS
32920              None.


32921   SEE  ALSO
32922               fork (),   pthread_exit (),   pthread_join (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,
32923              < pthread.h>


32924   CHANGE  HISTORY
32925              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32926   Issue  6
32927              The   pthread_create ()  function  is  marked  as  part  of  the  Threads  option.

32928              The  following  new  requirements  on  POSIX  implementations  derive  from  alignment  with  the
32929              Single  UNIX  Specification:

32930                  The  [EPERM]  mandatory  error  condition  is  added.

32931              The  thread  CPU-time  clock  semantics  are  added  for  alignment  with  IEEE  Std  1003.1d-1999.

32932              The   restrict  keyword  is  added  to  the   pthread_create ()  prototype  for  alignment  with  the
32933              ISO/IEC  9899:  1999  standard.

32934              The  DESCRIPTION  is  updated  to  make  it  explicit  that  the  floating-point  environment  is
32935              inherited  from  the  creating  thread.


32936   NAME
32937              pthread_detach   ”  detach  a  thread


32938   SYNOPSIS

 32939 THR  #include <pthread.h>  32940  int pthread_detach (pthread_t  thread  );  


32941


32942   DESCRIPTION
32943              The   pthread_detach ()  function  shall  indicate  to  the  implementation  that  storage  for  the  thread
32944               thread  can  be  reclaimed  when  that  thread  terminates.  If   thread  has  not  terminated,
32945               pthread_detach ()  shall  not  cause  it  to  terminate.  The  effect  of  multiple   pthread_detach ()  calls  on
32946              the  same  target  thread  is  unspecified.


32947   RETURN  VALUE
32948              If  the  call  succeeds,   pthread_detach ()  shall  return  0;  otherwise,  an  error  number  shall  be  returned
32949              to  indicate  the  error.


32950   ERRORS
32951              The   pthread_detach ()  function  shall  fail  if:

32952              [EINVAL]                  The  implementation  has  detected  that  the  value  specified  by   thread  does  not
32953                                                refer  to  a  joinable  thread.

32954              [ESRCH]                    No  thread  could  be  found  corresponding  to  that  specified  by  the  given  thread
32955                                                ID.

32956              The   pthread_detach ()  function  shall  not  return  an  error  code  of  [EINTR].


32957   EXAMPLES
32958              None.


32959   APPLICATION  USAGE
32960              None.


32961   RATIONALE
32962              The   pthread_join ()  or   pthread_detach ()  functions  should  eventually  be  called  for  every  thread  that
32963              is  created  so  that  storage  associated  with  the  thread  may  be  reclaimed.

32964              It  has  been  suggested  that  a  "detach"  function  is  not  necessary;  the   detachstate  thread  creation
32965              attribute  is  sufficient,  since  a  thread  need  never  be  dynamically  detached.  However,  need  arises
32966              in  at  least  two  cases:

32967                1.  In  a  cancelation  handler  for  a   pthread_join ()  it  is  nearly  essential  to  have  a   pthread_detach ()
32968                      function  in  order  to  detach  the  thread  on  which   pthread_join ()  was  waiting.  Without  it,  it
32969                      would  be  necessary  to  have  the  handler  do  another   pthread_join ()  to  attempt  to  detach  the
32970                      thread,  which  would  both  delay  the  cancelation  processing  for  an  unbounded  period  and
32971                      introduce  a  new  call  to   pthread_join (),  which  might  itself  need  a  cancelation  handler.  A
32972                      dynamic  detach  is  nearly  essential  in  this  case.

32973                2.  In  order  to  detach  the  "initial  thread"  (as  may  be  desirable  in  processes  that  set  up  server
32974                      threads).


32975   FUTURE  DIRECTIONS
32976              None.


32977   SEE  ALSO
32978               pthread_join (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


32979   CHANGE  HISTORY
32980              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


32981   Issue  6
32982              The   pthread_detach ()  function  is  marked  as  part  of  the  Threads  option.


33016   NAME
33017              pthread_exit ”thread  termination


33018   SYNOPSIS

 33019 THR  #include <pthread.h>  33020  void pthread_exit (void *  value_ptr);   


33021


33022   DESCRIPTION
33023              The   pthread_exit ()  function  shall  terminate  the  calling  thread  and  make  the  value   value_ptr
33024              available  to  any  successful  join  with  the  terminating  thread.  Any  cancelation  cleanup  handlers
33025              that  have  been  pushed  and  not  yet  popped  shall  be  popped  in  the  reverse  order  that  they  were
33026              pushed  and  then  executed.  After  all  cancelation  cleanup  handlers  have  been  executed,  if  the
33027              thread  has  any  thread-specific  data,  appropriate  destructor  functions  shall  be  called  in  an
33028              unspecified  order.  Thread  termination  does  not  release  any  application  visible  process  resources,
33029              including,  but  not  limited  to,  mutexes  and  file  descriptors,  nor  does  it  perform  any  process-level
33030              cleanup  actions,  including,  but  not  limited  to,  calling  any   atexit ()  routines  that  may  exist.

33031              An  implicit  call  to   pthread_exit ()  is  made  when  a  thread  other  than  the  thread  in  which   main ()
33032              was  first  invoked  returns  from  the  start  routine  that  was  used  to  create  it.  The  function's  return
33033              value  shall  serve  as  the  thread's  exit  status.

33034              The  behavior  of   pthread_exit ()  is  undefined  if  called  from  a  cancelation  cleanup  handler  or
33035              destructor  function  that  was  invoked  as  a  result  of  either  an  implicit  or  explicit  call  to
33036               pthread_exit ().

33037              After  a  thread  has  terminated,  the  result  of  access  to  local  (auto)  variables  of  the  thread  is
33038              undefined.  Thus,  references  to  local  variables  of  the  exiting  thread  should  not  be  used  for  the
33039               pthread_exit ()   value_ptr  parameter  value.

33040              The  process  shall  exit  with  an  exit  status  of  0  after  the  last  thread  has  been  terminated.  The
33041              behavior  shall  be  as  if  the  implementation  called   exit ()  with  a  zero  argument  at  thread
33042              termination  time.


33043   RETURN  VALUE
33044              The   pthread_exit ()  function  cannot  return  to  its  caller.


33045   ERRORS
33046              No  errors  are  defined.


33047   EXAMPLES
33048              None.


33049   APPLICATION  USAGE
33050              None.


33051   RATIONALE
33052              The  normal  mechanism  by  which  a  thread  terminates  is  to  return  from  the  routine  that  was
33053              specified  in  the   pthread_create ()  call  that  started  it.  The   pthread_exit ()  function  provides  the
33054              capability  for  a  thread  to  terminate  without  requiring  a  return  from  the  start  routine  of  that
33055              thread,  thereby  providing  a  function  analogous  to   exit ().

33056              Regardless  of  the  method  of  thread  termination,  any  cancelation  cleanup  handlers  that  have
33057              been  pushed  and  not  yet  popped  are  executed,  and  the  destructors  for  any  existing  thread-specific
33058              data  are  executed.  This  volume  of  IEEE  Std  1003.1-2001  requires  that  cancelation
33059              cleanup  handlers  be  popped  and  called  in  order.  After  all  cancelation  cleanup  handlers  have
33060              been  executed,  thread-specific  data  destructors  are  called,  in  an  unspecified  order,  for  each  item
33061              of  thread-specific  data  that  exists  in  the  thread.  This  ordering  is  necessary  because  cancelation
33062              cleanup  handlers  may  rely  on  thread-specific  data.

33063              As  the  meaning  of  the  status  is  determined  by  the  application  (except  when  the  thread  has  been
33064              canceled,  in  which  case  it  is  PTHREAD_CANCELED),  the  implementation  has  no  idea  what  an
33065              illegal  status  value  is,  which  is  why  no  address  error  checking  is  done.


33066   FUTURE  DIRECTIONS
33067              None.


33068   SEE  ALSO
33069               exit (),   pthread_create (),   pthread_join (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,
33070              < pthread.h>


33071   CHANGE  HISTORY
33072              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


33073   Issue  6
33074              The   pthread_exit ()  function  is  marked  as  part  of  the  Threads  option.


33075   NAME
33076              pthread_getconcurrency,  pthread_setconcurrency   ”  get  and  set  the  level  of  concurrency


33077   SYNOPSIS

 33078 XSI  #include <pthread.h>  33079  int pthread_getconcurrency (void);  33080  int pthread_setconcurrency (int  new  _  level  );  


33081


33082   DESCRIPTION
33083               Unbound  threads  in  a  process  may  or  may  not  be  required  to  be  simultaneously  active.  By
33084              default,  the  threads  implementation  ensures  that  a  sufficient  number  of  threads  are  active  so  that
33085              the  process  can  continue  to  make  progress.  While  this  conserves  system  resources,  it  may  not
33086              produce  the  most  effective  level  of  concurrency.

33087              The   pthread_setconcurrency ()  function  allows  an  application  to   inform  the  threads
33088              implementation  of  its  desired  concurrency  level,   new_level.  The  actual  level  of  concurrency
33089              provided  by  the  implementation  as  a  result  of  this  function  call  is  unspecified.

33090              If   new_level  is  zero,  it  causes  the  implementation  to  maintain  the  concurrency  level  at  its
33091              discretion  as  if   pthread_setconcurrency ()  had  never  been  called.

33092              The   pthread_getconcurrency ()  function  shall  return  the  value  set  by  a  previous  call  to  the
33093               pthread_setconcurrency ()  function.  If  the   pthread_setconcurrency ()  function  was  not  previously
33094              called,  this  function  shall  return  zero  to  indicate  that  the  implementation  is  maintaining  the
33095              concurrency  level.

33096              A  call  to   pthread_setconcurrency ()  shall  inform  the  implementation  of  its  desired  concurrency
33097              level.  The  implementation  shall  use  this  as  a  hint,  not  a  requirement.

33098              If  an  implementation  does  not  support  multiplexing  of  user  threads  on  top  of  several  kernel-
33099              scheduled  entities,  the   pthread_setconcurrency ()  and   pthread_getconcurrency ()  functions  are
33100              provided  for  source  code  compatibility  but  they  shall  have  no  effect  when  called.  To  maintain
33101              the  function  semantics,  the   new_level  parameter  is  saved  when   pthread_setconcurrency ()  is  called
33102              so  that  a  subsequent  call  to   pthread_getconcurrency ()  shall  return  the  same  value.


33103   RETURN  VALUE
33104              If  successful,  the   pthread_setconcurrency ()  function  shall  return  zero;  otherwise,  an  error  number
33105              shall  be  returned  to  indicate  the  error.

33106              The   pthread_getconcurrency ()  function  shall  always  return  the  concurrency  level  set  by  a  previous
33107              call  to   pthread_setconcurrency ().  If  the   pthread_setconcurrency ()  function  has  never  been  called,
33108               pthread_getconcurrency ()  shall  return  zero.


33109   ERRORS

33110              The   pthread_setconcurrency ()  function  shall  fail  if:

33111              [EINVAL]                  The  value  specified  by   new_level  is  negative.
33112              [EAGAIN]                  The  value  specific  by   new_level  would  cause  a  system  resource  to  be  exceeded.

33113              These  functions  shall  not  return  an  error  code  of  [EINTR].


33114   EXAMPLES
33115              None.


33116   APPLICATION  USAGE
33117              Use  of  these  functions  changes  the  state  of  the  underlying  concurrency  upon  which  the
33118              application  depends.  Library  developers  are  advised  to  not  use  the   pthread_getconcurrency ()  and
33119               pthread_setconcurrency ()  functions  since  their  use  may  conflict  with  an  applications  use  of  these
33120              functions.


33121   RATIONALE
33122              None.


33123   FUTURE  DIRECTIONS
33124              None.


33125   SEE  ALSO
33126              The  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


33127   CHANGE  HISTORY
33128              First  released  in  Issue  5.


33161   NAME
33162              pthread_getschedparam,  pthread_setschedparam   ”  dynamic  thread  scheduling  parameters
33163              access   (REALTIME  THREADS)


33164   SYNOPSIS

 33165 THR TPS  #include <pthread.h>  33166  int pthread_getschedparam (pthread_t  thread,  int *restrict  policy,   33167  struct sched_param *restrict  param  );  33168  int pthread_setschedparam (pthread_t  thread,  int  policy,   33169  const struct sched_param *  param  );  


33170


33171   DESCRIPTION
33172              The   pthread_getschedparam ()  and   pthread_setschedparam ()  functions  shall,  respectively,  get  and  set
33173              the  scheduling  policy  and  parameters  of  individual  threads  within  a  multi-threaded  process  to
33174              be  retrieved  and  set.  For  SCHED_FIFO  and  SCHED_RR,  the  only  required  member  of  the
33175               sched_param  structure  is  the  priority   sched_priority.  For  SCHED_OTHER,  the  affected
33176              scheduling  parameters  are  implementation-defined.

33177              The   pthread_getschedparam ()  function  shall  retrieve  the  scheduling  policy  and  scheduling
33178              parameters  for  the  thread  whose  thread  ID  is  given  by   thread  and  shall  store  those  values  in
33179               policy  and   param ,  respectively.  The  priority  value  returned  from   pthread_getschedparam ()  shall  be
33180              the  value  specified  by  the  most  recent   pthread_setschedparam (),   pthread_setschedprio (),  or
33181               pthread_create ()  call  affecting  the  target  thread.  It  shall  not  reflect  any  temporary  adjustments  to
33182              its  priority  as  a  result  of  any  priority  inheritance  or  ceiling  functions.  The   pthread_setschedparam ()
33183              function  shall  set  the  scheduling  policy  and  associated  scheduling  parameters  for  the  thread
33184              whose  thread  ID  is  given  by   thread  to  the  policy  and  associated  parameters  provided  in   policy
33185              and   param ,  respectively.

33186              The   policy  parameter  may  have  the  value  SCHED_OTHER,  SCHED_FIFO,  or  SCHED_RR.  The
33187              scheduling  parameters  for  the  SCHED_OTHER  policy  are  implementation-defined.  The
33188              SCHED_FIFO  and  SCHED_RR  policies  shall  have  a  single  scheduling  parameter,   priority .

33189  TSP       If  _POSIX_THREAD_SPORADIC_SERVER  is  defined,  then  the   policy  argument  may  have  the
33190               value  SCHED_SPORADIC,  with  the  exception  for  the   pthread_setschedparam ()  function  that  if  the
33191               scheduling  policy  was  not  SCHED_SPORADIC  at  the  time  of  the  call,  it  is  implementation-
33192               defined  whether  the  function  is  supported;  in  other  words,  the  implementation  need  not  allow
33193               the  application  to  dynamically  change  the  scheduling  policy  to  SCHED_SPORADIC.  The
33194               sporadic  server  scheduling  policy  has  the  associated  parameters   sched_ss_low_priority,
33195               sched_ss_repl_period, sched_ss_init_budget, sched_priority,  and   sched_ss_max_repl.  The  specified
33196               sched_ss_repl_period  shall  be  greater  than  or  equal  to  the  specified   sched_ss_init_budget  for  the
33197               function  to  succeed;  if  it  is  not,  then  the  function  shall  fail.  The  value  of   sched_ss_max_repl  shall
33198               be  within  the  inclusive  range  [1,SS_REPL_MAX]  for  the  function  to  succeed;  if  not,  the  function
33199               shall  fail.

33200              If  the   pthread_setschedparam ()  function  fails,  the  scheduling  parameters  shall  not  be  changed  for
33201              the  target  thread.


33202   RETURN  VALUE
33203              If  successful,  the   pthread_getschedparam ()  and   pthread_setschedparam ()  functions  shall  return  zero;
33204              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


33205   ERRORS
33206              The   pthread_getschedparam ()  function  may  fail  if:

33207              [ESRCH]                        The  value  specified  by   thread  does  not  refer  to  an  existing  thread.

33208              The   pthread_setschedparam ()  function  may  fail  if:

33209              [EINVAL]                      The  value  specified  by   policy  or  one  of  the  scheduling  parameters  associated
33210                                                    with  the  scheduling  policy   policy  is  invalid.
33211              [ENOTSUP]                    An  attempt  was  made  to  set  the  policy  or  scheduling  parameters  to  an
33212                                                    unsupported  value.
33213  TSP       [ENOTSUP]                    An  attempt  was  made  to  dynamically  change  the  scheduling  policy  to
33214                                                     SCHED_SPORADIC,  and  the  implementation  does  not  support  this  change.
33215              [EPERM]                        The  caller  does  not  have  the  appropriate  permission  to  set  either  the
33216                                                    scheduling  parameters  or  the  scheduling  policy  of  the  specified  thread.
33217              [EPERM]                        The  implementation  does  not  allow  the  application  to  modify  one  of  the
33218                                                    parameters  to  the  value  specified.
33219              [ESRCH]                        The  value  specified  by   thread  does  not  refer  to  a  existing  thread.

33220              These  functions  shall  not  return  an  error  code  of  [EINTR].


33221   EXAMPLES
33222              None.


33223   APPLICATION  USAGE
33224              None.


33225   RATIONALE
33226              None.


33227   FUTURE  DIRECTIONS
33228              None.


33229   SEE  ALSO
33230               pthread_setschedprio (),   sched_getparam (),   sched_getscheduler (),  the  Base  Definitions  volume  of
33231              IEEE  Std  1003.1-2001,  < pthread.h>,  < sched.h>


33232   CHANGE  HISTORY
33233              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


33234   Issue  6
33235              The   pthread_getschedparam ()  and   pthread_setschedparam ()  functions  are  marked  as  part  of  the
33236              Threads  and  Thread  Execution  Scheduling  options.

33237              The  [ENOSYS]  error  condition  has  been  removed  as  stubs  need  not  be  provided  if  an
33238              implementation  does  not  support  the  Thread  Execution  Scheduling  option.

33239              The  Open  Group  Corrigendum  U026/2  is  applied,  correcting  the  prototype  for  the
33240               pthread_setschedparam ()  function  so  that  its  second  argument  is  of  type   int.

33241              The  SCHED_SPORADIC  scheduling  policy  is  added  for  alignment  with  IEEE  Std  1003.1d-1999.

33242              The   restrict  keyword  is  added  to  the   pthread_getschedparam ()  prototype  for  alignment  with  the
33243              ISO/IEC  9899:  1999  standard.

33244              The  Open  Group  Corrigendum  U047/1  is  applied.

33245              IEEE  PASC  Interpretation  1003.1  #96  is  applied,  noting  that  priority  values  can  also  be  set  by  a
33246              call  to  the   pthread_setschedprio ()  function.


33302   NAME
33303              pthread_join   ”  wait  for  thread  termination


33304   SYNOPSIS

 33305 THR  #include <pthread.h>  33306  int pthread_join (pthread_t thread, void **  value_ptr);   


33307


33308   DESCRIPTION
33309              The   pthread_join ()  function  shall  suspend  execution  of  the  calling  thread  until  the  target   thread
33310              terminates,  unless  the  target   thread  has  already  terminated.  On  return  from  a  successful
33311               pthread_join ()  call  with  a  non-NULL   value_ptr  argument,  the  value  passed  to   pthread_exit ()  by
33312              the  terminating  thread  shall  be  made  available  in  the  location  referenced  by   value_ptr.  When  a
33313               pthread_join ()  returns  successfully,  the  target  thread  has  been  terminated.  The  results  of  multiple
33314              simultaneous  calls  to   pthread_join ()  specifying  the  same  target  thread  are  undefined.  If  the
33315              thread  calling   pthread_join ()  is  canceled,  then  the  target  thread  shall  not  be  detached.

33316              It  is  unspecified  whether  a  thread  that  has  exited  but  remains  unjoined  counts  against
33317              {PTHREAD_THREADS_MAX}.


33318   RETURN  VALUE
33319              If  successful,  the   pthread_join ()  function  shall  return  zero;  otherwise,  an  error  number  shall  be
33320              returned  to  indicate  the  error.


33321   ERRORS
33322              The   pthread_join ()  function  shall  fail  if:

33323              [EINVAL]                    The  implementation  has  detected  that  the  value  specified  by   thread  does  not
33324                                                  refer  to  a  joinable  thread.
33325              [ESRCH]                      No  thread  could  be  found  corresponding  to  that  specified  by  the  given  thread
33326                                                  ID.

33327              The   pthread_join ()  function  may  fail  if:

33328              [EDEADLK]                  A  deadlock  was  detected  or  the  value  of   thread  specifies  the  calling  thread.

33329              The   pthread_join ()  function  shall  not  return  an  error  code  of  [EINTR].


33330   EXAMPLES
33331              An  example  of  thread  creation  and  deletion  follows:

 33332       typedef struct { 33333           int *ar; 33334           long n; 33335       } subarray; 33336       void * 33337       incer (void *arg) 33338       { 33339           long i; 33340           for (i = 0; i <((subarray *)arg) ->n; i++) 33341               ((subarray *) arg) ->ar[i]++; 33342       } 33343       int main (void) 33344       { 33345           int        ar[1000000]; 33346           pthread_t th1, th2; 33347           subarray sb1, sb2; 33348           sb1.ar = &ar[0]; 33349           sb1.n = 500000; 33350           (void) pthread_create(&th1, NULL, incer, &sb1); 33351           sb2.ar = &ar[500000]; 33352           sb2.n = 500000; 33353           (void) pthread_create(&th2, NULL, incer, &sb2); 33354           (void) pthread_join(th1, NULL); 33355           (void) pthread_join(th2, NULL); 33356           return 0; 33357       } 


33358   APPLICATION  USAGE
33359              None.


33360   RATIONALE

33361              The   pthread_join ()  function  is  a  convenience  that  has  proven  useful  in  multi-threaded
33362              applications.  It  is  true  that  a  programmer  could  simulate  this  function  if  it  were  not  provided  by
33363              passing  extra  state  as  part  of  the  argument  to  the   start_routine ().  The  terminating  thread  would
33364              set  a  flag  to  indicate  termination  and  broadcast  a  condition  that  is  part  of  that  state;  a  joining
33365              thread  would  wait  on  that  condition  variable.  While  such  a  technique  would  allow  a  thread  to
33366              wait  on  more  complex  conditions  (for  example,  waiting  for  multiple  threads  to  terminate),
33367              waiting  on  individual  thread  termination  is  considered  widely  useful.  Also,  including  the
33368               pthread_join ()  function  in  no  way  precludes  a  programmer  from  coding  such  complex  waits.
33369              Thus,  while  not  a  primitive,  including   pthread_join ()  in  this  volume  of  IEEE  Std  1003.1-2001  was
33370              considered   valuable .

33371              The   pthread_join ()  function  provides  a  simple  mechanism  allowing  an  application  to  wait  for  a
33372              thread  to  terminate.  After  the  thread  terminates,  the  application  may  then  choose  to  clean  up
33373              resources  that  were  used  by  the  thread.  For  instance,  after   pthread_join ()  returns,  any
33374              application-provided  stack  storage  could  be  reclaimed.

33375              The   pthread_join ()  or   pthread_detach ()  function  should  eventually  be  called  for  every  thread  that
33376              is  created  with  the   detachstate  attribute  set  to  PTHREAD_CREATE_JOINABLE  so  that  storage
33377              associated  with  the  thread  may  be  reclaimed.

33378              The  interaction  between   pthread_join ()  and  cancelation  is   well-defined  for  the  following  reasons:

33379                  The   pthread_join ()  function,  like  all  other  non-async-cancel-safe  functions,  can  only  be  called
33380                    with  deferred  cancelability  type.

33381                  Cancelation  cannot  occur  in  the  disabled  cancelability  state.

33382              Thus,  only  the  default  cancelability  state  need  be  considered.  As  specified,  either  the
33383               pthread_join ()  call  is  canceled,  or  it  succeeds,  but  not  both.  The  difference  is  obvious  to  the
33384              application,  since  either  a  cancelation  handler  is  run  or   pthread_join ()  returns.  There  are  no  race
33385              conditions  since   pthread_join ()  was  called  in  the  deferred  cancelability  state.


33386   FUTURE  DIRECTIONS
33387              None.


33388   SEE  ALSO
33389               pthread_create (),   wait (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


33390   CHANGE  HISTORY
33391              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


33392   Issue  6
33393              The   pthread_join ()  function  is  marked  as  part  of  the  Threads  option.


33621   NAME
33622              pthread_mutex_destroy,  pthread_mutex_init   ”  destroy  and  initialize  a  mutex


33623   SYNOPSIS

 33624 THR  #include <pthread.h>  33625  int pthread_mutex_destroy (pthread_mutex_t *  mutex  );  33626  int pthread_mutex_init (pthread_mutex_t *restrict  mutex  ,  33627  const pthread_mutexattr_t *restrict  attr  );  33628  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  


33629


33630   DESCRIPTION
33631              The   pthread_mutex_destroy ()  function  shall  destroy  the  mutex  object  referenced  by   mutex ;  the
33632              mutex  object  becomes,  in  effect,  uninitialized.  An  implementation  may  cause
33633               pthread_mutex_destroy ()  to  set  the  object  referenced  by   mutex  to  an  invalid  value.  A  destroyed
33634              mutex  object  can  be  reinitialized  using   pthread_mutex_init ();  the  results  of  otherwise  referencing
33635              the  object  after  it  has  been  destroyed  are  undefined.

33636              It  shall  be  safe  to  destroy  an  initialized  mutex  that  is  unlocked.  Attempting  to  destroy  a  locked
33637              mutex  results  in  undefined  behavior.

33638              The   pthread_mutex_init ()  function  shall  initialize  the  mutex  referenced  by   mutex  with  attributes
33639              specified  by   attr .  If   attr  is  NULL,  the  default  mutex  attributes  are  used;  the  effect  shall  be  the
33640              same  as  passing  the  address  of  a  default  mutex  attributes  object.  Upon  successful  initialization,
33641              the  state  of  the  mutex  becomes  initialized  and  unlocked.

33642              Only   mutex  itself  may  be  used  for  performing  synchronization.  The  result  of  referring  to  copies
33643              of   mutex  in  calls  to   pthread_mutex_lock (),   pthread_mutex_trylock (),   pthread_mutex_unlock (),  and
33644               pthread_mutex_destroy ()  is  undefined.

33645              Attempting  to  initialize  an  already  initialized  mutex  results  in  undefined  behavior.

33646              In  cases  where  default  mutex  attributes  are  appropriate,  the  macro
33647              PTHREAD_MUTEX_INITIALIZER  can  be  used  to  initialize  mutexes  that  are  statically  allocated.
33648              The  effect  shall  be  equivalent  to  dynamic  initialization  by  a  call  to   pthread_mutex_init ()  with
33649              parameter   attr  specified  as  NULL,  except  that  no  error  checks  are  performed.


33650   RETURN  VALUE
33651              If  successful,  the   pthread_mutex_destroy ()  and   pthread_mutex_init ()  functions  shall  return  zero;
33652              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

33653              The  [EBUSY]  and  [EINVAL]  error  checks,  if  implemented,  act  as  if  they  were  performed
33654              immediately  at  the  beginning  of  processing  for  the  function  and  shall  cause  an  error  return  prior
33655              to  modifying  the  state  of  the  mutex  specified  by   mutex .


33656   ERRORS
33657              The   pthread_mutex_destroy ()  function  may  fail  if:

33658              [EBUSY]                    The  implementation  has  detected  an  attempt  to  destroy  the  object  referenced
33659                                                by   mutex  while  it  is  locked  or  referenced  (for  example,  while  being  used  in  a
33660                                                 pthread_cond_timedwait ()  or   pthread_cond_wait ())  by  another  thread.
33661              [EINVAL]                  The  value  specified  by   mutex  is  invalid.

33662              The   pthread_mutex_init ()  function  shall  fail  if:

33663              [EAGAIN]                  The  system  lacked  the  necessary  resources  (other  than  memory)  to  initialize
33664                                                another  mutex.
33665              [ENOMEM]                  Insufficient  memory  exists  to  initialize  the  mutex.
33666              [EPERM]                    The  caller  does  not  have  the  privilege  to  perform  the  operation.

33667              The   pthread_mutex_init ()  function  may  fail  if:

33668              [EBUSY]                    The  implementation  has  detected  an  attempt  to  reinitialize  the  object
33669                                                referenced  by   mutex ,  a  previously  initialized,  but  not  yet  destroyed,  mutex.
33670              [EINVAL]                  The  value  specified  by   attr  is  invalid.

33671              These  functions  shall  not  return  an  error  code  of  [EINTR].


33672   EXAMPLES
33673              None.


33674   APPLICATION  USAGE
33675              None.


33676   RATIONALE

33677               Alternate  Implementations  Possible

33678              This  volume  of  IEEE  Std  1003.1-2001  supports  several  alternative  implementations  of  mutexes.
33679              An  implementation  may  store  the  lock  directly  in  the  object  of  type   pthread_mutex_t.
33680              Alternatively,  an  implementation  may  store  the  lock  in  the  heap  and  merely  store  a  pointer,
33681              handle,  or  unique  ID  in  the  mutex  object.  Either  implementation  has  advantages  or  may  be
33682              required  on  certain  hardware  configurations.  So  that  portable  code  can  be  written  that  is
33683              invariant  to  this  choice,  this  volume  of  IEEE  Std  1003.1-2001  does  not  define  assignment  or
33684              equality  for  this  type,  and  it  uses  the  term  "initialize"  to   reinforce  the  (more   restrictive )  notion
33685              that  the  lock  may  actually  reside  in  the  mutex  object  itself.

33686              Note  that  this  precludes  an  over-specification  of  the  type  of  the  mutex  or  condition  variable  and
33687              motivates  the  opaqueness  of  the  type.

33688              An  implementation  is  permitted,  but  not  required,  to  have   pthread_mutex_destroy ()  store  an
33689              illegal  value  into  the  mutex.  This  may  help  detect  erroneous  programs  that  try  to  lock  (or
33690              otherwise  reference)  a  mutex  that  has  already  been  destroyed.

33691               Tradeoff  Between  Error  Checks  and  Performance  Supported

33692              Many  of  the  error  checks  were  made  optional  in  order  to  let  implementations  trade  off
33693              performance   versus  degree  of  error  checking  according  to  the  needs  of  their  specific  applications
33694              and  execution  environment.  As  a  general  rule,  errors  or  conditions  caused  by  the  system  (such  as
33695              insufficient  memory)  always  need  to  be  reported,  but  errors  due  to  an  erroneously  coded
33696              application  (such  as  failing  to  provide  adequate  synchronization  to  prevent  a  mutex  from  being
33697              deleted  while  in  use)  are  made  optional.

33698              A  wide  range  of  implementations  is  thus  made  possible.  For  example,  an  implementation
33699              intended  for  application  debugging  may  implement  all  of  the  error  checks,  but  an
33700              implementation  running  a  single,  provably  correct  application  under  very  tight  performance
33701              constraints  in  an  embedded  computer  might  implement  minimal  checks.  An  implementation
33702              might  even  be  provided  in  two  versions,  similar  to  the  options  that  compilers  provide:  a  full-checking,
33703              but  slower  version;  and  a  limited-checking,  but  faster  version.  To   forbid  this
33704              optionality  would  be  a  disservice  to  users.

33705              By  carefully  limiting  the  use  of  "undefined  behavior"  only  to  things  that  an  erroneous  ( badly
33706              coded)  application  might  do,  and  by  defining  that  resource-not-available  errors  are  mandatory,
33707              this  volume  of  IEEE  Std  1003.1-2001  ensures  that  a  fully-conforming  application  is  portable
33708              across  the  full  range  of  implementations,  while  not  forcing  all  implementations  to  add  overhead
33709              to  check  for   numerous  things  that  a  correct  program  never  does.

33710               Why  No  Limits  are  Defined

33711              Defining  symbols  for  the  maximum  number  of  mutexes  and  condition  variables  was  considered
33712              but  rejected  because  the  number  of  these  objects  may  change  dynamically.  Furthermore,  many
33713              implementations  place  these  objects  into  application  memory;  thus,  there  is  no  explicit
33714              maximum.

33715               Static  Initializers  for  Mutexes  and  Condition  Variables

33716              Providing  for  static  initialization  of  statically  allocated  synchronization  objects  allows  modules
33717              with  private  static  synchronization  variables  to  avoid  runtime  initialization  tests  and  overhead.
33718              Furthermore,  it   simplifies  the  coding  of  self-initializing  modules.  Such  modules  are  common  in
33719              C  libraries,  where  for  various  reasons  the  design  calls  for  self-initialization  instead  of  requiring
33720              an  explicit  module  initialization  function  to  be  called.  An  example  use  of  static  initialization
33721              follows.

33722              Without  static  initialization,  a  self-initializing  routine   foo ()  might  look  as  follows:

 33723       static pthread_once_t foo_once = PTHREAD_ONCE_INIT; 33724       static pthread_mutex_t foo_mutex; 33725       void foo_init () 33726       { 33727       pthread_mutex_init (&foo_mutex, NULL); 33728       } 33729       void foo() 33730       { 33731         pthread_once (&foo_once, foo_init); 33732         pthread_mutex_lock (&foo_mutex); 33733         /* Do work. */ 33734         pthread_mutex_unlock (&foo_mutex); 33735       } 


33736               With  static  initialization,  the  same  routine  could  be  coded  as  follows:

 33737       static pthread_mutex_t foo_mutex = PTHREAD_MUTEX_INITIALIZER; 33738       void foo() 33739       { 33740         pthread_mutex_lock(&foo_mutex); 33741         /* Do work. */ 33742         pthread_mutex_unlock(&foo_mutex); 33743       } 


33744              Note  that  the  static  initialization  both  eliminates  the  need  for  the  initialization  test  inside
33745               pthread_once ()  and  the  fetch  of  &   foo_mutex  to  learn  the  address  to  be  passed  to
33746               pthread_mutex_lock ()  or   pthread_mutex_unlock ().

33747              Thus,  the  C  code  written  to  initialize  static  objects  is  simpler  on  all  systems  and  is  also  faster  on  a
33748              large  class  of  systems;  those  where  the  (entire)  synchronization  object  can  be  stored  in
33749              application  memory.

33750              Yet  the  locking  performance  question  is  likely  to  be  raised  for  machines  that  require  mutexes  to
33751              be  allocated  out  of  special  memory.  Such  machines  actually  have  to  have  mutexes  and  possibly
33752              condition  variables  contain  pointers  to  the  actual  hardware  locks.  For  static  initialization  to  work
33753              on  such  machines,   pthread_mutex_lock ()  also  has  to  test  whether  or  not  the  pointer  to  the  actual
33754              lock  has  been  allocated.  If  it  has  not,   pthread_mutex_lock ()  has  to  initialize  it  before  use.  The
33755              reservation  of  such  resources  can  be  made  when  the  program  is  loaded,  and  hence  return  codes
33756              have  not  been  added  to  mutex  locking  and  condition  variable  waiting  to  indicate  failure  to
33757              complete  initialization.

33758              This  runtime  test  in   pthread_mutex_lock ()  would  at  first  seem  to  be  extra  work;  an  extra  test  is
33759              required  to  see  whether  the  pointer  has  been  initialized.  On  most  machines  this  would  actually
33760              be  implemented  as  a  fetch  of  the  pointer,  testing  the  pointer  against  zero,  and  then  using  the
33761              pointer  if  it  has  already  been  initialized.  While  the  test  might  seem  to  add  extra  work,  the  extra
33762              effort  of  testing  a  register  is  usually  negligible  since  no  extra  memory  references  are  actually
33763              done.  As  more  and  more  machines  provide  caches,  the  real  expenses  are  memory  references,  not
33764              instructions  executed.

33765              Alternatively,  depending  on  the  machine  architecture,  there  are  often  ways  to  eliminate   all
33766              overhead  in  the  most  important  case:  on  the  lock  operations  that  occur   after  the  lock  has  been
33767              initialized.  This  can  be  done  by  shifting  more  overhead  to  the  less  frequent  operation:
33768              initialization.  Since   out-of-line  mutex  allocation  also  means  that  an  address  has  to  be
33769              dereferenced  to  find  the  actual  lock,  one  technique  that  is  widely  applicable  is  to  have  static
33770              initialization  store  a   bogus  value  for  that  address;  in  particular,  an  address  that  causes  a  machine
33771              fault  to  occur.  When  such  a  fault  occurs  upon  the  first  attempt  to  lock  such  a  mutex,  validity
33772              checks  can  be  done,  and  then  the  correct  address  for  the  actual  lock  can  be  filled  in.  Subsequent
33773              lock  operations  incur  no  extra  overhead  since  they  do  not  "fault".  This  is  merely  one  technique
33774              that  can  be  used  to  support  static  initialization,  while  not  adversely  affecting  the  performance  of
33775              lock  acquisition.  No  doubt  there  are  other  techniques  that  are  highly  machine-dependent.

33776              The  locking  overhead  for  machines  doing  out-of-line  mutex  allocation  is  thus  similar  for
33777              modules  being  implicitly  initialized,  where  it  is  improved  for  those  doing  mutex  allocation
33778              entirely  inline.  The  inline  case  is  thus  made  much  faster,  and  the  out-of-line  case  is  not
33779              significantly   worse .

33780              Besides  the  issue  of  locking  performance  for  such  machines,  a  concern  is  raised  that  it  is  possible
33781              that  threads  would  serialize  contending  for  initialization  locks  when  attempting  to  finish
33782              initializing  statically  allocated  mutexes.  (Such  finishing  would  typically  involve  taking  an
33783              internal  lock,  allocating  a  structure,  storing  a  pointer  to  the  structure  in  the  mutex,  and  releasing
33784              the  internal  lock.)  First,  many  implementations  would  reduce  such  serialization  by  hashing  on
33785              the  mutex  address.  Second,  such  serialization  can  only  occur  a  bounded  number  of  times.  In
33786              particular,  it  can  happen  at  most  as  many  times  as  there  are  statically  allocated  synchronization
33787              objects.  Dynamically  allocated  objects  would  still  be  initialized  via   pthread_mutex_init ()  or
33788               pthread_cond_init ().

33789              Finally,  if  none  of  the  above  optimization  techniques  for  out-of-line  allocation  yields  sufficient
33790              performance  for  an  application  on  some  implementation,  the  application  can  avoid  static
33791              initialization  altogether  by  explicitly  initializing  all  synchronization  objects  with  the
33792              corresponding   pthread_*_init ()  functions,  which  are  supported  by  all  implementations.  An
33793              implementation  can  also  document  the  tradeoffs  and   advise  which  initialization  technique  is
33794              more  efficient  for  that  particular  implementation.

33795               Destroying  Mutexes

33796              A  mutex  can  be  destroyed  immediately  after  it  is  unlocked.  For  example,  consider  the  following
33797              code:

 33798       struct obj { 33799       pthread_mutex_t om; 33800           int refcnt; 33801           ... 33802       }; 33803       obj_done (struct obj *op) 33804       { 33805           pthread_mutex_lock (&op- >om); 33806           if (- -op- >refcnt == 0) { 33807               pthread_mutex_unlock (&op- >om); 33808       (A)     pthread_mutex_destroy (&op- >om); 33809       (B)     free(op); 33810           } else 33811       (C)     pthread_mutex_unlock (&op->om); 33812       } 


33813              In  this  case   obj  is  reference  counted  and   obj_done ()  is  called  whenever  a  reference  to  the  object  is
33814              dropped.  Implementations  are  required  to  allow  an  object  to  be  destroyed  and  freed  and
33815              potentially  unmapped  (for  example,  lines  A  and  B)  immediately  after  the  object  is  unlocked  (line
33816              C).


33817   FUTURE  DIRECTIONS
33818              None.


33819   SEE  ALSO
33820               pthread_mutex_getprioceiling (),   pthread_mutex_lock (),   pthread_mutex_timedlock (),
33821               pthread_mutexattr_getpshared (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,
33822              < pthread.h>


33823   CHANGE  HISTORY
33824              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


33825   Issue  6
33826              The   pthread_mutex_destroy ()  and   pthread_mutex_init ()  functions  are  marked  as  part  of  the
33827              Threads  option.

33828              The   pthread_mutex_timedlock ()  function  is  added  to  the  SEE  ALSO  section  for  alignment  with
33829              IEEE  Std  1003.1d-1999.

33830              IEEE  PASC  Interpretation  1003.1c  #34  is  applied,  updating  the  DESCRIPTION.
33831              The   restrict  keyword  is  added  to  the   pthread_mutex_init ()  prototype  for  alignment  with  the
33832              ISO/IEC  9899:  1999  standard.


33833   NAME
33834              pthread_mutex_getprioceiling,  pthread_mutex_setprioceiling   ”  get  and  set  the  priority  ceiling
33835              of  a  mutex  (   REALTIME  THREADS )


33836   SYNOPSIS

 33837 THR TPP  #include <pthread.h>  33838  int pthread_mutex_getprioceiling (const pthread_mutex_t *restrict  mutex,   33839  int *restrict  prioceiling  ) ;  33840  int pthread_mutex_setprioceiling (pthread_mutex_t *restrict  mutex,   33841  int  prioceiling,  int *restrict  old  _  ceiling  );  


33842


33843   DESCRIPTION
33844              The   pthread_mutex_getprioceiling ()  function  shall  return  the  current  priority  ceiling  of  the  mutex.

33845              The   pthread_mutex_setprioceiling ()  function  shall  either  lock  the  mutex  if  it  is  unlocked,  or  block
33846              until  it  can  successfully  lock  the  mutex,  then  it  shall  change  the  mutex's  priority  ceiling  and
33847              release  the  mutex.  When  the  change  is  successful,  the  previous  value  of  the  priority  ceiling  shall
33848              be  returned  in   old_ceiling.  The  process  of  locking  the  mutex  need  not   adhere  to  the  priority
33849              protect  protocol.

33850              If  the   pthread_mutex_setprioceiling ()  function  fails,  the  mutex  priority  ceiling  shall  not  be
33851              changed.


33852   RETURN  VALUE
33853              If  successful,  the   pthread_mutex_getprioceiling ()  and   pthread_mutex_setprioceiling ()  functions  shall
33854              return  zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


33855   ERRORS
33856              The   pthread_mutex_getprioceiling ()  and   pthread_mutex_setprioceiling ()  functions  may  fail  if:

33857              [EINVAL]                  The  priority   requested  by   prioceiling  is  out  of  range.
33858              [EINVAL]                  The  value  specified  by   mutex  does  not  refer  to  a  currently  existing  mutex.
33859              [EPERM]                    The  caller  does  not  have  the  privilege  to  perform  the  operation.

33860              These  functions  shall  not  return  an  error  code  of  [EINTR].


33861   EXAMPLES
33862              None.


33863   APPLICATION  USAGE
33864              None.


33865   RATIONALE
33866              None.


33867   FUTURE  DIRECTIONS
33868              None.


33869   SEE  ALSO
33870               pthread_mutex_destroy (),   pthread_mutex_lock (),   pthread_mutex_timedlock (),  the  Base  Definitions
33871              volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


33872   CHANGE  HISTORY
33873              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.

33874              Marked  as  part  of  the  Realtime  Threads  Feature  Group.


33875   Issue  6
33876              The   pthread_mutex_getprioceiling ()  and   pthread_mutex_setprioceiling ()  functions  are  marked  as
33877              part  of  the  Threads  and  Thread  Priority  Protection  options.

33878              The  [ENOSYS]  error  condition  has  been  removed  as  stubs  need  not  be  provided  if  an
33879              implementation  does  not  support  the  Thread  Priority  Protection  option.

33880              The  [ENOSYS]  error  denoting  non-support  of  the  priority  ceiling  protocol  for  mutexes  has  been
33881              removed.  This  is  because  if  the  implementation  provides  the  functions  (regardless  of  whether
33882              _POSIX_PTHREAD_PRIO_PROTECT  is  defined),  they  must  function  as  in  the  DESCRIPTION
33883              and  therefore  the  priority  ceiling  protocol  for  mutexes  is  supported.

33884              The   pthread_mutex_timedlock ()  function  is  added  to  the  SEE  ALSO  section  for  alignment  with
33885              IEEE  Std  1003.1d-1999.

33886              The   restrict  keyword  is  added  to  the   pthread_mutex_getprioceiling ()  and
33887               pthread_mutex_setprioceiling ()  prototypes  for  alignment  with  the  ISO/IEC  9899:  1999  standard.


33898   NAME
33899              pthread_mutex_lock,  pthread_mutex_trylock,  pthread_mutex_unlock   ”  lock  and  unlock  a
33900              mutex


33901   SYNOPSIS

 33902 THR  #include <pthread.h>  33903  int pthread_mutex_lock (pthread_mutex_t *  mutex  );  33904  int pthread_mutex_trylock (pthread_mutex_t *  mutex  );  33905  int pthread_mutex_unlock (pthread_mutex_t *  mutex  );  33906 


33907   DESCRIPTION
33908              The  mutex  object  referenced  by   mutex  shall  be  locked  by  calling   pthread_mutex_lock ().  If  the
33909              mutex  is  already  locked,  the  calling  thread  shall  block  until  the  mutex  becomes  available.  This
33910              operation  shall  return  with  the  mutex  object  referenced  by   mutex  in  the  locked  state  with  the
33911              calling  thread  as  its  owner.

33912  XSI       If  the  mutex  type  is  PTHREAD_MUTEX_NORMAL,  deadlock  detection  shall  not  be  provided.
33913               Attempting  to  relock  the  mutex  causes  deadlock.  If  a  thread  attempts  to  unlock  a  mutex  that  it
33914               has  not  locked  or  a  mutex  which  is  unlocked,  undefined  behavior  results.

33915               If  the  mutex  type  is  PTHREAD_MUTEX_ERRORCHECK,  then  error  checking  shall  be  provided.
33916               If  a  thread  attempts  to  relock  a  mutex  that  it  has  already  locked,  an  error  shall  be  returned.  If  a
33917               thread  attempts  to  unlock  a  mutex  that  it  has  not  locked  or  a  mutex  which  is  unlocked,  an  error
33918               shall  be  returned.

33919               If  the  mutex  type  is  PTHREAD_MUTEX_RECURSIVE,  then  the  mutex  shall  maintain  the
33920               concept  of  a  lock  count.  When  a  thread  successfully  acquires  a  mutex  for  the  first  time,  the  lock
33921               count  shall  be  set  to  one.  Every  time  a  thread  relocks  this  mutex,  the  lock  count  shall  be
33922               incremented  by  one.  Each  time  the  thread  unlocks  the  mutex,  the  lock  count  shall  be
33923               decremented  by  one.  When  the  lock  count   reaches  zero,  the  mutex  shall  become  available  for
33924               other  threads  to  acquire.  If  a  thread  attempts  to  unlock  a  mutex  that  it  has  not  locked  or  a  mutex
33925               which  is  unlocked,  an  error  shall  be  returned.

33926               If  the  mutex  type  is  PTHREAD_MUTEX_DEFAULT,  attempting  to  recursively  lock  the  mutex
33927               results  in  undefined  behavior.  Attempting  to  unlock  the  mutex  if  it  was  not  locked  by  the  calling
33928               thread  results  in  undefined  behavior.  Attempting  to  unlock  the  mutex  if  it  is  not  locked  results  in
33929               undefined  behavior.

33930              The   pthread_mutex_trylock ()  function  shall  be  equivalent  to   pthread_mutex_lock (),  except  that  if
33931              the  mutex  object  referenced  by   mutex  is  currently  locked  (by  any  thread,  including  the  current
33932              thread),  the  call  shall  return  immediately.  If  the  mutex  type  is  PTHREAD_MUTEX_RECURSIVE
33933              and  the  mutex  is  currently  owned  by  the  calling  thread,  the  mutex  lock  count  shall  be
33934              incremented  by  one  and  the   pthread_mutex_trylock ()  function  shall  immediately  return  success.

33935  XSI      The   pthread_mutex_unlock ()  function  shall  release  the  mutex  object  referenced  by   mutex .   The
33936               manner  in  which  a  mutex  is  released  is  dependent  upon  the  mutex's  type  attribute.  If  there  are
33937              threads  blocked  on  the  mutex  object  referenced  by   mutex  when   pthread_mutex_unlock ()  is  called,
33938              resulting  in  the  mutex  becoming  available,  the  scheduling  policy  shall  determine  which  thread
33939              shall  acquire  the  mutex.

33940  XSI       (In  the  case  of  PTHREAD_MUTEX_RECURSIVE  mutexes,  the  mutex  shall  become  available
33941               when  the  count  reaches  zero  and  the  calling  thread  no  longer  has  any  locks  on  this  mutex.)

33942              If  a  signal  is  delivered  to  a  thread  waiting  for  a  mutex,  upon  return  from  the  signal  handler  the
33943              thread  shall  resume  waiting  for  the  mutex  as  if  it  was  not  interrupted.


33944   RETURN  VALUE
33945              If  successful,  the   pthread_mutex_lock ()  and   pthread_mutex_unlock ()  functions  shall  return  zero;
33946              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

33947              The   pthread_mutex_trylock ()  function  shall  return  zero  if  a  lock  on  the  mutex  object  referenced  by
33948               mutex  is  acquired.  Otherwise,  an  error  number  is  returned  to  indicate  the  error.


33949   ERRORS
33950              The   pthread_mutex_lock ()  and   pthread_mutex_trylock ()  functions  shall  fail  if:

33951              [EINVAL]                  The   mutex  was  created  with  the  protocol  attribute  having  the  value
33952                                                PTHREAD_PRIO_PROTECT  and  the  calling  thread's  priority  is  higher  than
33953                                                the  mutex's  current  priority  ceiling.

33954              The   pthread_mutex_trylock ()  function  shall  fail  if:
33955              [EBUSY]                    The   mutex  could  not  be  acquired  because  it  was  already  locked.
33956              The   pthread_mutex_lock (),   pthread_mutex_trylock (),  and   pthread_mutex_unlock ()  functions  may
33957              fail  if:

33958              [EINVAL]                  The  value  specified  by   mutex  does  not  refer  to  an  initialized  mutex  object.
33959  XSI       [EAGAIN]                  The  mutex  could  not  be  acquired  because  the  maximum  number  of  recursive
33960                                                 locks  for   mutex  has  been  exceeded.

33961              The   pthread_mutex_lock ()  function  may  fail  if:

33962              [EDEADLK]                The  current  thread  already  owns  the  mutex.

33963              The   pthread_mutex_unlock ()  function  may  fail  if:

33964              [EPERM]                    The  current  thread  does  not  own  the  mutex.

33965              These  functions  shall  not  return  an  error  code  of  [EINTR].


33966   EXAMPLES
33967              None.


33968   APPLICATION  USAGE
33969              None.


33970   RATIONALE
33971              Mutex  objects  are  intended  to  serve  as  a  low-level  primitive  from  which  other  thread
33972              synchronization  functions  can  be  built.  As  such,  the  implementation  of  mutexes  should  be  as
33973              efficient  as  possible,  and  this  has   ramifications  on  the  features  available  at  the  interface.

33974              The  mutex  functions  and  the  particular  default  settings  of  the  mutex  attributes  have  been
33975              motivated  by  the  desire  to  not  preclude  fast,  inlined  implementations  of  mutex  locking  and
33976              unlocking.

33977              For  example,  deadlocking  on  a  double-lock  is  explicitly  allowed  behavior  in  order  to  avoid
33978              requiring  more  overhead  in  the  basic  mechanism  than  is   absolutely  necessary.  (More  "friendly"
33979              mutexes  that  detect  deadlock  or  that  allow  multiple  locking  by  the  same  thread  are  easily
33980              constructed  by  the  user  via  the  other  mechanisms  provided.  For  example,   pthread_self ()  can  be
33981              used  to  record  mutex  ownership.)  Implementations  might  also  choose  to  provide  such  extended
33982              features  as  options  via  special  mutex  attributes.

33983              Since  most  attributes  only  need  to  be  checked  when  a  thread  is  going  to  be  blocked,  the  use  of
33984              attributes  does  not  slow  the  (common)  mutex-locking  case.

33985              Likewise,  while  being  able  to  extract  the  thread  ID  of  the  owner  of  a  mutex  might  be  desirable,  it
33986              would  require  storing  the  current  thread  ID  when  each  mutex  is  locked,  and  this  could  incur
33987              unacceptable  levels  of  overhead.  Similar  arguments  apply  to  a   mutex_tryunlock  operation.


33988   FUTURE  DIRECTIONS
33989              None.


33990   SEE  ALSO
33991               pthread_mutex_destroy (),   pthread_mutex_timedlock (),  the  Base  Definitions  volume  of
33992              IEEE  Std  1003.1-2001,   <pthread.h>


33993   CHANGE  HISTORY
33994              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


33995   Issue  6
33996              The   pthread_mutex_lock (),   pthread_mutex_trylock (),  and   pthread_mutex_unlock ()  functions  are
33997              marked  as  part  of  the  Threads  option.

33998              The  following  new  requirements  on  POSIX  implementations  derive  from  alignment  with  the
33999              Single  UNIX  Specification:

34000                  The  behavior  when  attempting  to  relock  a  mutex  is  defined.

34001              The   pthread_mutex_timedlock ()  function  is  added  to  the  SEE  ALSO  section  for  alignment  with
34002              IEEE  Std  1003.1d-1999.


34013   NAME
34014              pthread_mutex_timedlock   ”  lock  a  mutex  ( ADVANCED  REALTIME )


34015   SYNOPSIS

 34016 THR TMO  #include <pthread.h>  34017  #include <time.h>  34018  int pthread_mutex_timedlock (pthread_mutex_t *restrict  mutex  ,  34019  const struct timespec *restrict  abs_timeout);   


34020


34021   DESCRIPTION
34022              The   pthread_mutex_timedlock ()  function  shall  lock  the  mutex  object  referenced  by   mutex .  If  the
34023              mutex  is  already  locked,  the  calling  thread  shall  block  until  the  mutex  becomes  available  as  in
34024              the   pthread_mutex_lock ()  function.  If  the  mutex  cannot  be  locked  without  waiting  for  another
34025              thread  to  unlock  the  mutex,  this  wait  shall  be  terminated  when  the  specified  timeout   expires .

34026              The  timeout  shall  expire  when  the  absolute  time  specified  by   abs_timeout  passes,  as  measured  by
34027              the  clock  on  which  timeouts  are  based  (that  is,  when  the  value  of  that  clock  equals  or  exceeds
34028               abs_timeout),  or  if  the  absolute  time  specified  by   abs_timeout  has  already  been  passed  at  the  time
34029              of  the  call.

34030  TMR       If  the  Timers  option  is  supported,  the  timeout  shall  be  based  on  the  CLOCK_REALTIME  clock;  if
34031               the  Timers  option  is  not  supported,  the  timeout  shall  be  based  on  the  system  clock  as  returned
34032               by  the   time ()  function.

34033              The  resolution  of  the  timeout  shall  be  the  resolution  of  the  clock  on  which  it  is  based.  The
34034               timespec  data  type  is  defined  in  the  < time.h>  header.

34035              Under  no  circumstance  shall  the  function  fail  with  a  timeout  if  the  mutex  can  be  locked
34036              immediately.  The  validity  of  the   abs_timeout  parameter  need  not  be  checked  if  the  mutex  can  be
34037              locked  immediately.

34038              As  a  consequence  of  the  priority  inheritance  rules  (for  mutexes  initialized  with  the
34039              PRIO_INHERIT  protocol),  if  a  timed  mutex  wait  is  terminated  because  its  timeout  expires,  the
34040              priority  of  the  owner  of  the  mutex  shall  be  adjusted  as  necessary  to  reflect  the  fact  that  this
34041              thread  is  no  longer  among  the  threads  waiting  for  the  mutex.


34042   RETURN  VALUE
34043              If  successful,  the   pthread_mutex_timedlock ()  function  shall  return  zero;  otherwise,  an  error
34044              number  shall  be  returned  to  indicate  the  error.


34045   ERRORS
34046              The   pthread_mutex_timedlock ()  function  shall  fail  if:

34047              [EINVAL]                  The  mutex  was  created  with  the  protocol  attribute  having  the  value
34048                                                PTHREAD_PRIO_PROTECT  and  the  calling  thread's  priority  is  higher  than
34049                                                the  mutex'  current  priority  ceiling.
34050              [EINVAL]                  The  process  or  thread  would  have  blocked,  and  the   abs_timeout  parameter
34051                                                specified  a  nanoseconds  field  value  less  than  zero  or  greater  than  or  equal  to
34052                                                1000  million.
34053              [ETIMEDOUT]            The  mutex  could  not  be  locked  before  the  specified  timeout   expired .

34054              The   pthread_mutex_timedlock ()  function  may  fail  if:

34055              [EINVAL]                  The  value  specified  by   mutex  does  not  refer  to  an  initialized  mutex  object.
34056  XSI       [EAGAIN]                  The  mutex  could  not  be  acquired  because  the  maximum  number  of  recursive
34057                                                 locks  for   mutex  has  been  exceeded.
34058              [EDEADLK]                The  current  thread  already  owns  the  mutex.

34059              This  function  shall  not  return  an  error  code  of  [EINTR].


34060   EXAMPLES
34061              None.


34062   APPLICATION  USAGE
34063              The   pthread_mutex_timedlock ()  function  is  part  of  the  Threads  and  Timeouts  options  and  need
34064              not  be  provided  on  all  implementations.


34065   RATIONALE
34066              None.


34067   FUTURE  DIRECTIONS
34068              None.


34069   SEE  ALSO
34070               pthread_mutex_destroy (),   pthread_mutex_lock (),   pthread_mutex_trylock (),   time (),  the  Base
34071              Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>,  < time.h>


34072   CHANGE  HISTORY
34073              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1d-1999.


34083   NAME
34084              pthread_mutexattr_destroy,  pthread_mutexattr_init   ”  destroy  and  initialize  the  mutex
34085              attributes  object


34086   SYNOPSIS

 34087 THR  #include <pthread.h>  34088  int pthread_mutexattr_destroy (pthread_mutexattr_t *  attr  );  34089  int pthread_mutexattr_init (pthread_mutexattr_t *  attr  );  


34090


34091   DESCRIPTION
34092              The   pthread_mutexattr_destroy ()  function  shall  destroy  a  mutex  attributes  object;  the  object
34093              becomes,  in  effect,  uninitialized.  An  implementation  may  cause   pthread_mutexattr_destroy ()  to
34094              set  the  object  referenced  by   attr  to  an  invalid  value.  A  destroyed   attr  attributes  object  can  be
34095              reinitialized  using   pthread_mutexattr_init ();  the  results  of  otherwise  referencing  the  object  after  it
34096              has  been  destroyed  are  undefined.

34097              The   pthread_mutexattr_init ()  function  shall  initialize  a  mutex  attributes  object   attr  with  the
34098              default  value  for  all  of  the  attributes  defined  by  the  implementation.

34099              Results  are  undefined  if   pthread_mutexattr_init ()  is  called  specifying  an  already  initialized   attr
34100              attributes  object.

34101              After  a  mutex  attributes  object  has  been  used  to  initialize  one  or  more  mutexes,  any  function
34102              affecting  the  attributes  object  (including  destruction)  shall  not  affect  any  previously  initialized
34103              mutexes.


34104   RETURN  VALUE
34105              Upon  successful  completion,   pthread_mutexattr_destroy ()  and   pthread_mutexattr_init ()  shall
34106              return  zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


34107   ERRORS
34108              The   pthread_mutexattr_destroy ()  function  may  fail  if:

34109              [EINVAL]                  The  value  specified  by   attr  is  invalid.

34110              The   pthread_mutexattr_init ()  function  shall  fail  if:

34111              [ENOMEM]                  Insufficient  memory  exists  to  initialize  the  mutex  attributes  object.

34112              These  functions  shall  not  return  an  error  code  of  [EINTR].


34113   EXAMPLES
34114              None.


34115   APPLICATION  USAGE
34116              None.


34117   RATIONALE
34118              See   pthread_attr_init ()  for  a  general  explanation  of  attributes.  Attributes  objects  allow
34119              implementations  to  experiment  with  useful  extensions  and  permit  extension  of  this  volume  of
34120              IEEE  Std  1003.1-2001  without  changing  the  existing  functions.  Thus,  they  provide  for  future
34121              extensibility  of  this  volume  of  IEEE  Std  1003.1-2001  and  reduce  the   temptation  to  standardize
34122              prematurely  on  semantics  that  are  not  yet  widely  implemented  or   understood .

34123              Examples  of  possible  additional  mutex  attributes  that  have  been  discussed  are   spin_only,
34124               limited  spin,  no_spin,  recursive ,  and   metered .  (To  explain  what  the  latter  attributes  might  mean:
34125              recursive  mutexes  would  allow  for  multiple  re-locking  by  the  current  owner;  metered  mutexes
34126              would   transparently  keep  records  of  queue  length,  wait  time,  and  so  on.)  Since  there  is  not  yet
34127              wide  agreement  on  the   usefulness  of  these  resulting  from  shared  implementation  and  usage
34128              experience,  they  are  not  yet  specified  in  this  volume  of  IEEE  Std  1003.1-2001.  Mutex  attributes
34129              objects,  however,  make  it  possible  to  test  out  these  concepts  for  possible  standardization  at  a
34130              later  time.

34131               Mutex  Attributes  and  Performance

34132              Care  has  been  taken  to  ensure  that  the  default  values  of  the  mutex  attributes  have  been  defined
34133              such  that  mutexes  initialized  with  the  defaults  have  simple  enough  semantics  so  that  the  locking
34134              and  unlocking  can  be  done  with  the  equivalent  of  a  test-and-set  instruction  (plus  possibly  a  few
34135              other  basic  instructions).

34136              There  is  at  least  one  implementation  method  that  can  be  used  to  reduce  the  cost  of  testing  at
34137              lock-time  if  a  mutex  has  non-default  attributes.  One  such  method  that  an  implementation  can
34138               employ  (and  this  can  be  made  fully  transparent  to  fully  conforming  POSIX  applications)  is  to
34139               secretly  pre-lock  any  mutexes  that  are  initialized  to  non-default  attributes.  Any  later  attempt  to
34140              lock  such  a  mutex  causes  the  implementation  to  branch  to  the  "slow  path"  as  if  the  mutex  were
34141              unavailable;  then,  on  the  slow  path,  the  implementation  can  do  the  "real  work"  to  lock  a  non-default
34142              mutex.  The  underlying  unlock  operation  is  more  complicated  since  the  implementation
34143              never  really  wants  to  release  the  pre-lock  on  this  kind  of  mutex.  This  illustrates  that,  depending
34144              on  the  hardware,  there  may  be  certain  optimizations  that  can  be  used  so  that  whatever  mutex
34145              attributes  are  considered  "most  frequently  used"  can  be  processed  most  efficiently.

34146               Process  Shared  Memory  and  Synchronization

34147              The  existence  of  memory  mapping  functions  in  this  volume  of  IEEE  Std  1003.1-2001  leads  to  the
34148              possibility  that  an  application  may  allocate  the  synchronization  objects  from  this  section  in
34149              memory  that  is  accessed  by  multiple  processes  (and  therefore,  by  threads  of  multiple  processes).

34150              In  order  to  permit  such  usage,  while  at  the  same  time  keeping  the  usual  case  (that  is,  usage
34151              within  a  single  process)  efficient,  a   process-shared  option  has  been  defined.

34152              If  an  implementation  supports  the  _POSIX_THREAD_PROCESS_SHARED  option,  then  the
34153               process-shared  attribute  can  be  used  to  indicate  that  mutexes  or  condition  variables  may  be
34154              accessed  by  threads  of  multiple  processes.

34155              The  default  setting  of  PTHREAD_PROCESS_PRIVATE  has  been  chosen  for  the   process-shared
34156              attribute  so  that  the  most  efficient  forms  of  these  synchronization  objects  are  created  by  default.

34157              Synchronization  variables  that  are  initialized  with  the  PTHREAD_PROCESS_PRIVATE   process-
34158               shared  attribute  may  only  be  operated  on  by  threads  in  the  process  that  initialized  them.
34159              Synchronization  variables  that  are  initialized  with  the  PTHREAD_PROCESS_SHARED   process-
34160               shared  attribute  may  be  operated  on  by  any  thread  in  any  process  that  has  access  to  it.  In
34161              particular,  these  processes  may  exist  beyond  the  lifetime  of  the  initializing  process.  For  example,
34162              the  following  code  implements  a  simple  counting  semaphore  in  a  mapped  file  that  may  be  used
34163              by  many  processes.

 34164       /* sem.h */ 34165       struct semaphore { 34166           pthread_mutex_t lock; 34167           pthread_cond_t nonzero; 34168           unsigned count; 34169       }; 34170       typedef struct semaphore semaphore_t; 34171       semaphore_t *semaphore_create (char *semaphore_name); 34172       semaphore_t *semaphore_open (char *semaphore_name); 34173       void semaphore_post (semaphore_t *semap); 34174       void semaphore_wait (semaphore_t *semap); 34175       void semaphore_close (semaphore_t *semap); 34176       /* sem.c */ 34177       #include <sys/types.h> 34178       #include <sys/stat.h> 34179       #include <sys/mman.h> 34180       #include <fcntl.h> 34181       #include <pthread.h> 34182       #include "sem.h" 34183       semaphore_t * 34184       semaphore_create (char *semaphore_name) 34185       { 34186       int fd; 34187           semaphore_t *semap; 34188           pthread_mutexattr_t psharedm; 34189           pthread_condattr_t psharedc; 34190           fd = open(semaphore_name, O_RDWR  O_CREAT  O_EXCL, 0666); 34191           if (fd <0) 34192               return (NULL); 34193           (void) ftruncate (fd, sizeof (semaphore_t)); 34194           (void) pthread_mutexattr_init (&psharedm); 34195           (void) pthread_mutexattr_setpshared (&psharedm, 34196               PTHREAD_PROCESS_SHARED); 34197           (void) pthread_condattr_init (&psharedc); 34198           (void) pthread_condattr_setpshared (&psharedc, 34199               PTHREAD_PROCESS_SHARED); 34200           semap = (semaphore_t *) mmap (NULL, sizeof (semaphore_t), 34201                   PROT_READ  PROT_WRITE, MAP_SHARED, 34202                   fd, 0); 34203           close (fd); 34204           (void) pthread_mutex_init (&semap->lock, &psharedm); 34205           (void) pthread_cond_init (&semap->nonzero, &psharedc); 34206           semap->count = 0; 34207           return (semap); 34208       } 34209       semaphore_t * 34210       semaphore_open (char *semaphore_name) 34211       { 34212           int fd; 34213           semaphore_t *semap; 34214           fd = open (semaphore_name, O_RDWR, 0666); 34215           if (fd <0) 34216               return (NULL); 34217           semap = (semaphore_t *) mmap (NULL, sizeof (semaphore_t), 34218                   PROT_READ  PROT_WRITE, MAP_SHARED, 34219                   fd, 0); 34220           close (fd); 34221           return (semap); 34222       } 34223       void 34224       semaphore_post (semaphore_t *semap) 34225       { 34226           pthread_mutex_lock (&semap->lock); 34227           if (semap->count == 0) 34228               pthread_cond_signal (&semapx->nonzero); 34229           semap->count++; 34230           pthread_mutex_unlock (&semap->lock); 34231       } 34232       void 34233       semaphore_wait (semaphore_t *semap) 34234       { 34235           pthread_mutex_lock (&semap->lock); 34236           while (semap->count == 0) 34237               pthread_cond_wait (&semap->nonzero, &semap->lock); 34238           semap->count--; 34239           pthread_mutex_unlock (&semap->lock); 34240       } 34241       void 34242       semaphore_close (semaphore_t *semap) 34243       { 34244           munmap ((void *) semap, sizeof (semaphore_t)); 34245       } 


34246              The  following  code  is  for  three  separate  processes  that  create,  post,  and  wait  on  a  semaphore  in
34247              the  file   /tmp/semaphore.  Once  the  file  is  created,  the  post  and  wait  programs  increment  and
34248              decrement  the  counting  semaphore  (waiting  and   waking  as  required)  even  though  they  did  not
34249              initialize  the  semaphore.

 34250       /* create.c */ 34251       #include "pthread.h" 34252       #include "sem.h" 34253       int 34254       main() 34255       { 34256          semaphore_t *semap; 34257          semap = semaphore_create("/tmp/semaphore"); 34258          if (semap == NULL) 34259              exit(1); 34260          semaphore_close (semap); 34261          return (0); 34262       } 34263       /* post */ 34264       #include "pthread.h" 34265       #include "sem.h" 34266       int 34267       main() 34268       { 34269          semaphore_t *semap; 34270          semap = semaphore_open ("/tmp/semaphore"); 34271          if (semap == NULL) 34272              exit (1); 34273          semaphore_post (semap); 34274          semaphore_close (semap); 34275          return (0); 34276       } 34277       /* wait */ 34278       #include "pthread.h" 34279       #include "sem.h" 34280       int 34281       main () 34282       { 34283          semaphore_t *semap; 34284          semap = semaphore_open ("/tmp/semaphore"); 34285          if (semap == NULL) 34286              exit (1); 34287          semaphore_wait (semap); 34288          semaphore_close (semap); 34289          return (0); 34290       } 


34291   FUTURE  DIRECTIONS
34292              None.


34293   SEE  ALSO
34294               pthread_cond_destroy (),   pthread_create (),   pthread_mutex_destroy (),   pthread_mutexattr_destroy (),  the
34295              Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


34296   CHANGE  HISTORY
34297              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


34298   Issue  6
34299              The   pthread_mutexattr_destroy ()  and   pthread_mutexattr_init ()  functions  are  marked  as  part  of  the
34300              Threads  option.

34301              IEEE  PASC  Interpretation  1003.1c  #27  is  applied,  updating  the  ERRORS  section.


34302   NAME
34303              pthread_mutexattr_getprioceiling,  pthread_mutexattr_setprioceiling   ”  get  and  set  the
34304              prioceiling  attribute  of  the  mutex  attributes  object  (   REALTIME  THREADS )


34305   SYNOPSIS
34306  THR  TPP   #  include  <pthread.h>

34307                   int  pthread_mutexattr_getprioceiling  (const  pthread_mutexattr_t  *
34308                           restrict   attr,  int  *restrict   prioceiling );
34309                   int  pthread_mutexattr_setprioceiling  (pthread_mutexattr_t  *   attr,
34310                           int   prioceiling );
34311


34312   DESCRIPTION
34313              The   pthread_mutexattr_getprioceiling ()  and   pthread_mutexattr_setprioceiling ()  functions,
34314              respectively,  shall  get  and  set  the  priority  ceiling  attribute  of  a  mutex  attributes  object  pointed  to
34315              by   attr  which  was  previously  created  by  the  function   pthread_mutexattr_init ().

34316              The   prioceiling  attribute  contains  the  priority  ceiling  of  initialized  mutexes.  The  values  of
34317               prioceiling  are  within  the  maximum  range  of  priorities  defined  by  SCHED_FIFO.

34318              The   prioceiling  attribute  defines  the  priority  ceiling  of  initialized  mutexes,  which  is  the  minimum
34319              priority  level  at  which  the  critical  section   guarded  by  the  mutex  is  executed.  In  order  to  avoid
34320              priority  inversion,  the  priority  ceiling  of  the  mutex  shall  be  set  to  a  priority  higher  than  or  equal
34321              to  the  highest  priority  of  all  the  threads  that  may  lock  that  mutex.  The  values  of   prioceiling  are
34322              within  the  maximum  range  of  priorities  defined  under  the  SCHED_FIFO  scheduling  policy.


34323   RETURN  VALUE
34324              Upon  successful  completion,  the   pthread_mutexattr_getprioceiling ()  and
34325               pthread_mutexattr_setprioceiling ()  functions  shall  return  zero;  otherwise,  an  error  number  shall  be
34326              returned  to  indicate  the  error.


34327   ERRORS
34328              The   pthread_mutexattr_getprioceiling ()  and   pthread_mutexattr_setprioceiling ()  functions  may  fail  if:

34329              [EINVAL]            The  value  specified  by   attr  or   prioceiling  is  invalid.
34330              [EPERM]              The  caller  does  not  have  the  privilege  to  perform  the  operation.

34331              These  functions  shall  not  return  an  error  code  of  [EINTR].


34332   EXAMPLES
34333              None.


34334   APPLICATION  USAGE
34335              None.


34336   RATIONALE
34337              None.


34338   FUTURE  DIRECTIONS
34339              None.


34340   SEE  ALSO
34341               pthread_cond_destroy (),   pthread_create (),   pthread_mutex_destroy (),  the  Base  Definitions  volume  of
34342              IEEE  Std  1003.1-2001,  < pthread.h>


34343   CHANGE  HISTORY
34344              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.
34345              Marked  as  part  of  the  Realtime  Threads  Feature  Group.


34346   Issue  6
34347              The   pthread_mutexattr_getprioceiling ()  and   pthread_mutexattr_setprioceiling ()  functions  are
34348              marked  as  part  of  the  Threads  and  Thread  Priority  Protection  options.

34349              The  [ENOSYS]  error  condition  has  been  removed  as  stubs  need  not  be  provided  if  an
34350              implementation  does  not  support  the  Thread  Priority  Protection  option.

34351              The  [ENOTSUP]  error  condition  has  been  removed  since  these  functions  do  not  have  a   protocol
34352              argument.

34353              The   restrict  keyword  is  added  to  the   pthread_mutexattr_getprioceiling ()  prototype  for  alignment
34354              with  the  ISO/IEC  9899:  1999  standard.


34355   NAME
34356              pthread_mutexattr_getprotocol,  pthread_mutexattr_setprotocol   ”  get  and  set  the  protocol
34357              attribute  of  the  mutex  attributes  object  (   REALTIME  THREADS )


34358   SYNOPSIS
34359  THR           #  include  <pthread.h>

34360  TPPTPI   int  pthread_mutexattr_getprotocol  (const  pthread_mutexattr_t  *
34361                           restrict   attr ,  int  *restrict   protocol );
34362                   int  pthread_mutexattr_setprotocol  (pthread_mutexattr_t  *   attr ,
34363                           int   protocol );
34364


34365   DESCRIPTION
34366              The   pthread_mutexattr_getprotocol ()  and   pthread_mutexattr_setprotocol ()  functions,  respectively,
34367              shall  get  and  set  the  protocol  attribute  of  a  mutex  attributes  object  pointed  to  by   attr  which  was
34368              previously  created  by  the  function   pthread_mutexattr_init ().

34369              The   protocol  attribute  defines  the  protocol  to  be  followed  in   utilizing  mutexes.  The  value  of
34370               protocol  may  be  one  of:

34371              PTHREAD_PRIO_NONE
34372  TPI       PTHREAD_PRIO_INHERIT
34373  TPP       PTHREAD_PRIO_PROTECT
34374

34375              which  are  defined  in  the  < pthread.h>  header.

34376              When  a  thread  owns  a  mutex  with  the  PTHREAD_PRIO_NONE   protocol  attribute,  its  priority
34377              and  scheduling  shall  not  be  affected  by  its  mutex  ownership.

34378  TPI       When  a  thread  is  blocking  higher  priority  threads  because  of  owning  one  or  more  mutexes  with
34379               the  PTHREAD_PRIO_INHERIT   protocol  attribute,  it  shall  execute  at  the  higher  of  its  priority  or
34380               the  priority  of  the  highest  priority  thread  waiting  on  any  of  the  mutexes  owned  by  this  thread
34381               and  initialized  with  this  protocol.

34382  TPP       When  a  thread  owns  one  or  more  mutexes  initialized  with  the  PTHREAD_PRIO_PROTECT
34383               protocol,  it  shall  execute  at  the  higher  of  its  priority  or  the  highest  of  the  priority  ceilings  of  all
34384               the  mutexes  owned  by  this  thread  and  initialized  with  this  attribute,  regardless  of  whether  other
34385               threads  are  blocked  on  any  of  these  mutexes  or  not.

34386              While  a  thread  is  holding  a  mutex  which  has  been  initialized  with  the
34387              PTHREAD_PRIO_INHERIT  or  PTHREAD_PRIO_PROTECT  protocol  attributes,  it  shall  not  be
34388              subject  to  being  moved  to  the  tail  of  the  scheduling  queue  at  its  priority  in  the  event  that  its
34389              original  priority  is  changed,  such  as  by  a  call  to   sched_setparam ().  Likewise,  when  a  thread
34390              unlocks  a  mutex  that  has  been  initialized  with  the  PTHREAD_PRIO_INHERIT  or
34391              PTHREAD_PRIO_PROTECT  protocol  attributes,  it  shall  not  be  subject  to  being  moved  to  the  tail
34392              of  the  scheduling  queue  at  its  priority  in  the  event  that  its  original  priority  is  changed.

34393              If  a  thread  simultaneously  owns  several  mutexes  initialized  with  different  protocols,  it  shall
34394              execute  at  the  highest  of  the  priorities  that  it  would  have  obtained  by  each  of  these  protocols.

34395  TPI       When  a  thread  makes  a  call  to   pthread_mutex_lock (),  the  mutex  was  initialized  with  the  protocol
34396               attribute  having  the  value  PTHREAD_PRIO_INHERIT,  when  the  calling  thread  is  blocked
34397               because  the  mutex  is  owned  by  another  thread,  that  owner  thread  shall  inherit  the  priority  level
34398               of  the  calling  thread  as  long  as  it  continues  to  own  the  mutex.  The  implementation  shall  update
34399               its  execution  priority  to  the  maximum  of  its  assigned  priority  and  all  its  inherited  priorities.
34400               Furthermore,  if  this  owner  thread  itself  becomes  blocked  on  another  mutex,  the  same  priority
34401               inheritance  effect  shall  be  propagated  to  this  other  owner  thread,  in  a  recursive  manner.


34402   RETURN  VALUE
34403              Upon  successful  completion,  the   pthread_mutexattr_getprotocol ()  and
34404               pthread_mutexattr_setprotocol ()  functions  shall  return  zero;  otherwise,  an  error  number  shall  be
34405              returned  to  indicate  the  error.


34406   ERRORS
34407              The   pthread_mutexattr_setprotocol ()  function  shall  fall  if:

34408              [ENOTSUP]                The  value  specified  by   protocol  is  an  unsupported  value.

34409              The   pthread_mutexattr_getprotocol ()  and   pthread_mutexattr_setprotocol ()  functions  may  fail  if:

34410              [EINVAL]                  The  value  specified  by   attr  or   protocol  is  invalid.
34411              [EPERM]                    The  caller  does  not  have  the  privilege  to  perform  the  operation.

34412              These  functions  shall  not  return  an  error  code  of  [EINTR].


34413   EXAMPLES
34414              None.


34415   APPLICATION  USAGE
34416              None.


34417   RATIONALE
34418              None.


34419   FUTURE  DIRECTIONS
34420              None.


34421   SEE  ALSO
34422               pthread_cond_destroy (),   pthread_create (),   pthread_mutex_destroy (),  the  Base  Definitions  volume  of
34423              IEEE  Std  1003.1-2001,  < pthread.h>


34424   CHANGE  HISTORY
34425              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.
34426              Marked  as  part  of  the  Realtime  Threads  Feature  Group.


34427   Issue  6
34428              The   pthread_mutexattr_getprotocol ()  and   pthread_mutexattr_setprotocol ()  functions  are  marked  as
34429              part  of  the  Threads  option  and  either  the  Thread  Priority  Protection  or  Thread  Priority
34430              Inheritance  options.

34431              The  [ENOSYS]  error  condition  has  been  removed  as  stubs  need  not  be  provided  if  an
34432              implementation  does  not  support  the  Thread  Priority  Protection  or  Thread  Priority  Inheritance
34433              options.

34434              The   restrict  keyword  is  added  to  the   pthread_mutexattr_getprotocol ()  prototype  for  alignment
34435              with  the  ISO/IEC  9899:1999  standard.


34436   NAME
34437              pthread_mutexattr_getpshared,  pthread_mutexattr_setpshared   ”  get  and  set  the  process-shared
34438              attribute


34439   SYNOPSIS

 34440 THR TSH  #include <pthread.h>  34441  int pthread_mutexattr_getpshared (const pthread_mutexattr_t *  34442  restrict  attr,  int *restrict  pshared  );  34443  int pthread_mutexattr_setpshared(pthread_mutexattr_t *  attr  ,  34444  int  pshared  );  


34445


34446   DESCRIPTION
34447              The   pthread_mutexattr_getpshared ()  function  shall  obtain  the  value  of  the   process-shared  attribute
34448              from  the  attributes  object  referenced  by   attr .  The   pthread_mutexattr_setpshared ()  function  shall
34449              set  the   process-shared  attribute  in  an  initialized  attributes  object  referenced  by   attr .

34450              The   process-shared  attribute  is  set  to  PTHREAD_PROCESS_SHARED  to  permit  a  mutex  to  be
34451              operated  upon  by  any  thread  that  has  access  to  the  memory  where  the  mutex  is  allocated,  even  if
34452              the  mutex  is  allocated  in  memory  that  is  shared  by  multiple  processes.  If  the   process-shared
34453              attribute  is  PTHREAD_PROCESS_PRIVATE,  the  mutex  shall  only  be  operated  upon  by  threads
34454              created  within  the  same  process  as  the  thread  that  initialized  the  mutex;  if  threads  of  differing
34455              processes  attempt  to  operate  on  such  a  mutex,  the  behavior  is  undefined.  The  default  value  of
34456              the  attribute  shall  be  PTHREAD_PROCESS_PRIVATE.


34457   RETURN  VALUE
34458              Upon  successful  completion,   pthread_mutexattr_setpshared ()  shall  return  zero;  otherwise,  an  error
34459              number  shall  be  returned  to  indicate  the  error.

34460              Upon  successful  completion,   pthread_mutexattr_getpshared ()  shall  return  zero  and  store  the  value
34461              of  the   process-shared  attribute  of   attr  into  the  object  referenced  by  the   pshared  parameter.
34462              Otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


34463   ERRORS
34464              The   pthread_mutexattr_getpshared ()  and   pthread_mutexattr_setpshared ()  functions  may  fail  if:

34465              [EINVAL]                  The  value  specified  by   attr  is  invalid.

34466              The   pthread_mutexattr_setpshared ()  function  may  fail  if:

34467              [EINVAL]                  The  new  value  specified  for  the  attribute  is  outside  the  range  of  legal  values
34468                                                for  that  attribute.

34469              These  functions  shall  not  return  an  error  code  of  [EINTR].


34470   EXAMPLES
34471              None.


34472   APPLICATION  USAGE
34473              None.


34474   RATIONALE
34475              None.


34476   FUTURE  DIRECTIONS
34477              None.


34478   SEE  ALSO
34479               pthread_cond_destroy (),   pthread_create (),   pthread_mutex_destroy (),   pthread_mutexattr_destroy (),  the
34480              Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


34481   CHANGE  HISTORY
34482              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


34483   Issue  6
34484              The   pthread_mutexattr_getpshared ()  and   pthread_mutexattr_setpshared ()  functions  are  marked  as
34485              part  of  the  Threads  and  Thread  Process-Shared  Synchronization  options.

34486              The   restrict  keyword  is  added  to  the   pthread_mutexattr_getpshared ()  prototype  for  alignment
34487              with  the  ISO/IEC  9899:  1999  standard.


34488   NAME
34489               pthread_mutexattr_gettype,  pthread_mutexattr_settype   ”  get  and  set  the  mutex  type  attribute


34490   SYNOPSIS

 34491 XSI  #include <pthread.h>  34492  int pthread_mutexattr_gettype (const pthread_mutexattr_t *restrict  attr  ,  34493  int *restrict  type  );  34494  int pthread_mutexattr_settype (pthread_mutexattr_t *  attr  , int  type  );  


34495


34496   DESCRIPTION
34497              The   pthread_mutexattr_gettype ()  and   pthread_mutexattr_settype ()  functions,  respectively,  shall  get
34498              and  set  the  mutex   type  attribute.  This  attribute  is  set  in  the   type  parameter  to  these  functions.  The
34499              default  value  of  the   type  attribute  is  PTHREAD_MUTEX_DEFAULT.

34500              The  type  of  mutex  is  contained  in  the   type  attribute  of  the  mutex  attributes.  Valid  mutex  types
34501              include:

34502              PTHREAD_MUTEX_NORMAL
34503                    This  type  of  mutex  does  not  detect  deadlock.  A  thread  attempting  to  relock  this  mutex
34504                    without  first  unlocking  it  shall  deadlock.  Attempting  to  unlock  a  mutex  locked  by  a
34505                    different  thread  results  in  undefined  behavior.  Attempting  to  unlock  an  unlocked  mutex
34506                    results  in  undefined  behavior.
34507              PTHREAD_MUTEX_ERRORCHECK
34508                    This  type  of  mutex  provides  error  checking.  A  thread  attempting  to  relock  this  mutex
34509                    without  first  unlocking  it  shall  return  with  an  error.  A  thread  attempting  to  unlock  a  mutex
34510                    which  another  thread  has  locked  shall  return  with  an  error.  A  thread  attempting  to  unlock
34511                    an  unlocked  mutex  shall  return  with  an  error.
34512              PTHREAD_MUTEX_RECURSIVE
34513                    A  thread  attempting  to  relock  this  mutex  without  first  unlocking  it  shall  succeed  in  locking
34514                    the  mutex.  The  relocking  deadlock  which  can  occur  with  mutexes  of  type
34515                    PTHREAD_MUTEX_NORMAL  cannot  occur  with  this  type  of  mutex.  Multiple  locks  of  this
34516                    mutex  shall  require  the  same  number  of  unlocks  to  release  the  mutex  before  another  thread
34517                    can  acquire  the  mutex.  A  thread  attempting  to  unlock  a  mutex  which  another  thread  has
34518                    locked  shall  return  with  an  error.  A  thread  attempting  to  unlock  an  unlocked  mutex  shall
34519                    return  with  an  error.
34520              PTHREAD_MUTEX_DEFAULT
34521                    Attempting  to  recursively  lock  a  mutex  of  this  type  results  in  undefined  behavior.
34522                    Attempting  to  unlock  a  mutex  of  this  type  which  was  not  locked  by  the  calling  thread
34523                    results  in  undefined  behavior.  Attempting  to  unlock  a  mutex  of  this  type  which  is  not
34524                    locked  results  in  undefined  behavior.  An  implementation  may  map  this  mutex  to  one  of  the
34525                    other  mutex  types.


34526   RETURN  VALUE
34527              Upon  successful  completion,  the   pthread_mutexattr_gettype ()  function  shall  return  zero  and  store
34528              the  value  of  the   type  attribute  of   attr  into  the  object  referenced  by  the   type  parameter.  Otherwise,
34529              an  error  shall  be  returned  to  indicate  the  error.

34530              If  successful,  the   pthread_mutexattr_settype ()  function  shall  return  zero;  otherwise,  an  error
34531              number  shall  be  returned  to  indicate  the  error.


34532   ERRORS
34533              The   pthread_mutexattr_settype ()  function  shall  fail  if:

34534              [EINVAL]                        The  value   type  is  invalid.

34535              The   pthread_mutexattr_gettype ()  and   pthread_mutexattr_settype ()  functions  may  fail  if:

34536              [EINVAL]                        The  value  specified  by   attr  is  invalid.

34537              These  functions  shall  not  return  an  error  code  of  [EINTR].


34538   EXAMPLES
34539              None.


34540   APPLICATION  USAGE
34541              It  is  advised  that  an  application  should  not  use  a  PTHREAD_MUTEX_RECURSIVE  mutex  with
34542              condition  variables  because  the  implicit  unlock  performed  for  a   pthread_cond_timedwait ()  or
34543               pthread_cond_wait ()  may  not  actually  release  the  mutex  (if  it  had  been  locked  multiple  times).  If
34544              this  happens,  no  other  thread  can   satisfy  the  condition  of  the  predicate.


34545   RATIONALE
34546              None.


34547   FUTURE  DIRECTIONS
34548              None.


34549   SEE  ALSO
34550               pthread_cond_timedwait (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


34551   CHANGE  HISTORY
34552              First  released  in  Issue  5.


34553   Issue  6
34554              The  Open  Group  Corrigendum  U033/3  is  applied.  The  SYNOPSIS  for
34555               pthread_mutexattr_gettype ()  is  updated  so  that  the  first  argument  is  of  type   const
34556               pthread_mutexattr_t*.

34557              The   restrict  keyword  is  added  to  the   pthread_mutexattr_gettype ()  prototype  for  alignment  with
34558              the  ISO/IEC  9899:  1999  standard.


34604   NAME
34605              pthread_once   ”  dynamic  package  initialization


34606   SYNOPSIS

 34607 THR  #include <pthread.h>  34608  int pthread_once (pthread_once_t *  once_control,   34609  void (*  init_routine)  (void));  34610  pthread_once_t  once_control  = PTHREAD_ONCE_INIT;  


34611


34612   DESCRIPTION
34613              The  first  call  to   pthread_once ()  by  any  thread  in  a  process,  with  a  given   once_control,  shall  call  the
34614               init_routine  with  no  arguments.  Subsequent  calls  of   pthread_once ()  with  the  same   once_control
34615              shall  not  call  the   init_routine.  On  return  from   pthread_once (),   init_routine  shall  have  completed.
34616              The   once_control  parameter  shall  determine  whether  the  associated  initialization  routine  has
34617              been  called.

34618              The   pthread_once ()  function  is  not  a  cancelation  point.  However,  if   init_routine  is  a  cancelation
34619              point  and  is  canceled,  the  effect  on   once_control  shall  be  as  if   pthread_once ()  was  never  called.

34620              The  constant  PTHREAD_ONCE_INIT  is  defined  in  the  < pthread.h>  header.

34621              The  behavior  of   pthread_once ()  is  undefined  if   once_control  has  automatic  storage  duration  or  is
34622              not  initialized  by  PTHREAD_ONCE_INIT.


34623   RETURN  VALUE
34624              Upon  successful  completion,   pthread_once ()  shall  return  zero;  otherwise,  an  error  number  shall
34625              be  returned  to  indicate  the  error.


34626   ERRORS
34627              The   pthread_once ()  function  may  fail  if:

34628              [EINVAL]                  If  either   once_control  or   init_routine  is  invalid.

34629              The   pthread_once ()  function  shall  not  return  an  error  code  of  [EINTR].


34630   EXAMPLES
34631              None.


34632   APPLICATION  USAGE
34633              None.


34634   RATIONALE
34635              Some  C  libraries  are  designed  for  dynamic  initialization.  That  is,  the  global  initialization  for  the
34636              library  is  performed  when  the  first  procedure  in  the  library  is  called.  In  a  single-threaded
34637              program,  this  is  normally  implemented  using  a  static  variable  whose  value  is  checked  on  entry
34638              to  a  routine,  as  follows:

 34639       static int random_is_initialized = 0; 34640       extern int initialize_random (); 34641       int random_function () 34642       { 34643           if (random_is_initialized == 0) { 34644               initialize_random (); 34645               random_is_initialized = 1; 34646               } 34647               ... /* Operations performed after initialization. */ 34648       } 


34649              To  keep  the  same  structure  in  a  multi-threaded  program,  a  new  primitive  is  needed.  Otherwise,
34650              library  initialization  has  to  be  accomplished  by  an  explicit  call  to  a  library-exported  initialization
34651              function  prior  to  any  use  of  the  library.

34652              For  dynamic  library  initialization  in  a  multi-threaded  process,  a  simple  initialization  flag  is  not
34653              sufficient;  the  flag  needs  to  be  protected  against  modification  by  multiple  threads
34654              simultaneously  calling  into  the  library.  Protecting  the  flag  requires  the  use  of  a  mutex;  however,
34655              mutexes  have  to  be  initialized  before  they  are  used.  Ensuring  that  the  mutex  is  only  initialized
34656              once  requires  a  recursive  solution  to  this  problem.

34657              The  use  of   pthread_once ()  not  only   supplies  an  implementation-guaranteed  means  of  dynamic
34658              initialization,  it  provides  an  aid  to  the  reliable  construction  of  multi-threaded  and  realtime
34659              systems.  The  preceding  example  then  becomes:

 34660       #include <pthread.h> 34661       static pthread_once_t random_is_initialized = PTHREAD_ONCE_INIT; 34662       extern int initialize_random(); 34663       int random_function() 34664       { 34665           (void) pthread_once (&random_is_initialized, initialize_random); 34666           ... /* Operations performed after initialization. */ 34667       } 


34668              Note  that  a   pthread_once_t  cannot  be  an  array  because  some  compilers  do  not  accept  the
34669              construct  &< array_name>.


34670   FUTURE  DIRECTIONS
34671              None.


34672   SEE  ALSO
34673              The  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


34674   CHANGE  HISTORY
34675              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


34676   Issue  6
34677              The   pthread_once ()  function  is  marked  as  part  of  the  Threads  option.

34678              The  [EINVAL]  error  is  added  as  a  may  fail  case  for  if  either  argument  is  invalid.


34679   NAME
34680              pthread_rwlock_destroy,  pthread_rwlock_init   ”  destroy  and  initialize  a  read-write  lock  object


34681   SYNOPSIS

 34682 THR  #include <pthread.h>  34683  int pthread_rwlock_destroy(pthread_rwlock_t *  rwlock  );  34684  int pthread_rwlock_init(pthread_rwlock_t *restrict  rwlock,   34685  const pthread_rwlockattr_t *restrict  attr  );  


34686


34687   DESCRIPTION
34688              The   pthread_rwlock_destroy ()  function  shall  destroy  the  read-write  lock  object  referenced  by
34689               rwlock  and  release  any  resources  used  by  the  lock.  The  effect  of  subsequent  use  of  the  lock  is
34690              undefined  until  the  lock  is  reinitialized  by  another  call  to   pthread_rwlock_init ().  An
34691              implementation  may  cause   pthread_rwlock_destroy ()  to  set  the  object  referenced  by   rwlock  to  an
34692              invalid  value.  Results  are  undefined  if   pthread_rwlock_destroy ()  is  called  when  any  thread  holds
34693               rwlock .  Attempting  to  destroy  an  uninitialized  read-write  lock  results  in  undefined  behavior.

34694              The   pthread_rwlock_init ()  function  shall  allocate  any  resources  required  to  use  the  read-write
34695              lock  referenced  by   rwlock  and  initializes  the  lock  to  an  unlocked  state  with  attributes  referenced
34696              by   attr .  If   attr  is  NULL,  the  default  read-write  lock  attributes  shall  be  used;  the  effect  is  the  same
34697              as  passing  the  address  of  a  default  read-write  lock  attributes  object.  Once  initialized,  the  lock  can
34698              be  used  any  number  of  times  without  being  reinitialized.  Results  are  undefined  if
34699               pthread_rwlock_init ()  is  called  specifying  an  already  initialized  read-write  lock.  Results  are
34700              undefined  if  a  read-write  lock  is  used  without  first  being  initialized.

34701              If  the   pthread_rwlock_init ()  function  fails,   rwlock  shall  not  be  initialized  and  the  contents  of   rwlock
34702              are  undefined.

34703              Only  the  object  referenced  by   rwlock  may  be  used  for  performing  synchronization.  The  result  of
34704              referring  to  copies  of  that  object  in  calls  to   pthread_rwlock_destroy (),   pthread_rwlock_rdlock (),
34705               pthread_rwlock_timedrdlock (),   pthread_rwlock_timedwrlock (),   pthread_rwlock_tryrdlock (),
34706               pthread_rwlock_trywrlock (),   pthread_rwlock_unlock (),  or   pthread_rwlock_wrlock ()  is  undefined.


34707   RETURN  VALUE
34708              If  successful,  the   pthread_rwlock_destroy ()  and   pthread_rwlock_init ()  functions  shall  return  zero;
34709              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

34710              The  [EBUSY]  and  [EINVAL]  error  checks,  if  implemented,  act  as  if  they  were  performed
34711              immediately  at  the  beginning  of  processing  for  the  function  and  caused  an  error  return  prior  to
34712              modifying  the  state  of  the  read-write  lock  specified  by   rwlock .


34713   ERRORS
34714              The   pthread_rwlock_destroy ()  function  may  fail  if:

34715              [EBUSY]                    The  implementation  has  detected  an  attempt  to  destroy  the  object  referenced
34716                                                by   rwlock  while  it  is  locked.

34717              [EINVAL]                  The  value  specified  by   rwlock  is  invalid.

34718              The   pthread_rwlock_init ()  function  shall  fail  if:

34719              [EAGAIN]                  The  system  lacked  the  necessary  resources  (other  than  memory)  to  initialize
34720                                                another  read-write  lock.
34721              [ENOMEM]                  Insufficient  memory  exists  to  initialize  the  read-write  lock.
34722              [EPERM]                    The  caller  does  not  have  the  privilege  to  perform  the  operation.

34723              The   pthread_rwlock_init ()  function  may  fail  if:

34724              [EBUSY]                    The  implementation  has  detected  an  attempt  to  reinitialize  the  object
34725                                                referenced  by   rwlock ,  a  previously  initialized  but  not  yet  destroyed  read-write
34726                                                lock.
34727              [EINVAL]                  The  value  specified  by   attr  is  invalid.

34728              These  functions  shall  not  return  an  error  code  of  [EINTR].


34729   EXAMPLES
34730              None.


34731   APPLICATION  USAGE
34732              None.


34733   RATIONALE
34734              None.


34735   FUTURE  DIRECTIONS
34736              None.


34737   SEE  ALSO
34738               pthread_rwlock_rdlock (),   pthread_rwlock_timedrdlock (),   pthread_rwlock_timedwrlock (),
34739               pthread_rwlock_tryrdlock (),   pthread_rwlock_trywrlock (),   pthread_rwlock_unlock (),
34740               pthread_rwlock_wrlock (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001.  < pthread.h>


34741   CHANGE  HISTORY
34742              First  released  in  Issue  5.


34743   Issue  6
34744              The  following  changes  are  made  for  alignment  with  IEEE  Std  1003.1j-2000:

34745                  The  margin  code  in  the  SYNOPSIS  is  changed  to  THR  to  indicate  that  the  functionality  is
34746                    now  part  of  the  Threads  option  (previously  it  was  part  of  the  Read-Write  Locks  option  in
34747                    IEEE  Std  1003.1j-2000  and  also  part  of  the  XSI  extension).  The  initializer  macro  is  also  deleted
34748                    from  the  SYNOPSIS.

34749                  The  DESCRIPTION  is  updated  as  follows:
34750                     ”  It  explicitly  notes  allocation  of  resources  upon  initialization  of  a  read-write  lock  object.
34751                     ”  A  paragraph  is  added  specifying  that  copies  of  read-write  lock  objects  may  not  be  used.

34752                  An  [EINVAL]  error  is  added  to  the  ERRORS  section  for   pthread_rwlock_init (),  indicating  that
34753                    the   rwlock  value  is  invalid.

34754                  The  SEE  ALSO  section  is  updated.

34755              The   restrict  keyword  is  added  to  the   pthread_rwlock_init ()  prototype  for  alignment  with  the
34756              ISO/IEC  9899:  1999  standard.


34757   NAME
34758              pthread_rwlock_rdlock,  pthread_rwlock_tryrdlock   ”  lock  a  read-write  lock  object  for  reading


34759   SYNOPSIS

 34760 THR  #include <pthread.h>  34761  int pthread_rwlock_rdlock (pthread_rwlock_t *  rwlock  );  34762  int pthread_rwlock_tryrdlock (pthread_rwlock_t *  rwlock  );  


34763


34764   DESCRIPTION
34765              The   pthread_rwlock_rdlock ()  function  shall  apply  a  read  lock  to  the  read-write  lock  referenced  by
34766               rwlock .  The  calling  thread  acquires  the  read  lock  if  a  writer  does  not  hold  the  lock  and  there  are
34767              no  writers  blocked  on  the  lock.

34768  TPS       If  the  Thread  Execution  Scheduling  option  is  supported,  and  the  threads  involved  in  the  lock  are
34769               executing  with  the  scheduling  policies  SCHED_FIFO  or  SCHED_RR,  the  calling  thread  shall  not
34770               acquire  the  lock  if  a  writer  holds  the  lock  or  if  writers  of  higher  or  equal  priority  are  blocked  on
34771               the  lock;  otherwise,  the  calling  thread  shall  acquire  the  lock.

34772  TSP  TSP   If  the  Threads  Execution  Scheduling  option  is  supported,  and  the  threads  involved  in  the  lock
34773               are  executing  with  the  SCHED_SPORADIC  scheduling  policy,  the  calling  thread  shall  not
34774               acquire  the  lock  if  a  writer  holds  the  lock  or  if  writers  of  higher  or  equal  priority  are  blocked  on
34775               the  lock;  otherwise,  the  calling  thread  shall  acquire  the  lock.

34776               If  the  Thread  Execution  Scheduling  option  is  not  supported,  it  is  implementation-defined
34777               whether  the  calling  thread  acquires  the  lock  when  a  writer  does  not  hold  the  lock  and  there  are
34778               writers  blocked  on  the  lock.  If  a  writer  holds  the  lock,  the  calling  thread  shall  not  acquire  the
34779               read  lock.  If  the  read  lock  is  not  acquired,  the  calling  thread  shall  block  until  it  can  acquire  the
34780               lock.  The  calling  thread  may  deadlock  if  at  the  time  the  call  is  made  it  holds  a  write  lock.

34781              A  thread  may  hold  multiple  concurrent  read  locks  on   rwlock  (that  is,  successfully  call  the
34782               pthread_rwlock_rdlock ()  function   n  times).  If  so,  the  application  shall  ensure  that  the  thread
34783               performs  matching  unlocks  (that  is,  it  calls  the   pthread_rwlock_unlock ()  function   n  times).

34784              The  maximum  number  of  simultaneous  read  locks  that  an  implementation   guarantees  can  be
34785              applied  to  a  read-write  lock  shall  be  implementation-defined.  The   pthread_rwlock_rdlock ()
34786              function  may  fail  if  this  maximum  would  be  exceeded.

34787              The   pthread_rwlock_tryrdlock ()  function  shall  apply  a  read  lock  as  in  the   pthread_rwlock_rdlock ()
34788              function,  with  the  exception  that  the  function  shall  fail  if  the  equivalent   pthread_rwlock_rdlock ()
34789              call  would  have  blocked  the  calling  thread.  In  no  case  shall  the   pthread_rwlock_tryrdlock ()
34790              function  ever  block;  it  always  either  acquires  the  lock  or  fails  and  returns  immediately.

34791              Results  are  undefined  if  any  of  these  functions  are  called  with  an  uninitialized  read-write  lock.

34792              If  a  signal  is  delivered  to  a  thread  waiting  for  a  read-write  lock  for  reading,  upon  return  from  the
34793              signal  handler  the  thread  resumes  waiting  for  the  read-write  lock  for  reading  as  if  it  was  not
34794              interrupted.


34795   RETURN  VALUE
34796              If  successful,  the   pthread_rwlock_rdlock ()  function  shall  return  zero;  otherwise,  an  error  number
34797              shall  be  returned  to  indicate  the  error.

34798              The   pthread_rwlock_tryrdlock ()  function  shall  return  zero  if  the  lock  for  reading  on  the  read-write
34799              lock  object  referenced  by   rwlock  is  acquired.  Otherwise,  an  error  number  shall  be  returned  to
34800              indicate  the  error.


34801   ERRORS
34802              The   pthread_rwlock_tryrdlock ()  function  shall  fail  if:

34803              [EBUSY]                    The  read-write  lock  could  not  be  acquired  for  reading  because  a  writer  holds
34804                                                the  lock  or  a  writer  with  the  appropriate  priority  was  blocked  on  it.

34805              The   pthread_rwlock_rdlock ()  and   pthread_rwlock_tryrdlock ()  functions  may  fail  if:

34806              [EINVAL]                  The  value  specified  by   rwlock  does  not  refer  to  an  initialized  read-write  lock
34807                                                object.
34808              [EAGAIN]                  The  read  lock  could  not  be  acquired  because  the  maximum  number  of  read
34809                                                locks  for   rwlock  has  been  exceeded.

34810              The   pthread_rwlock_rdlock ()  function  may  fail  if:

34811              [EDEADLK]  The  current  thread  already  owns  the  read-write  lock  for  writing.

34812              These  functions  shall  not  return  an  error  code  of  [EINTR].


34813   EXAMPLES
34814              None.


34815   APPLICATION  USAGE
34816              Applications  using  these  functions  may  be  subject  to  priority  inversion,  as  discussed  in  the  Base
34817              Definitions  volume  of  IEEE  Std  1003.1-2001,  Section  3.285,  Priority  Inversion.


34818   RATIONALE
34819              None.


34820   FUTURE  DIRECTIONS
34821              None.


34822   SEE  ALSO
34823               pthread_rwlock_destroy (),   pthread_rwlock_timedrdlock (),   pthread_rwlock_timedwrlock (),
34824               pthread_rwlock_trywrlock (),   pthread_rwlock_unlock (),   pthread_rwlock_wrlock (),  the  Base  Definitions
34825              volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


34826   CHANGE  HISTORY
34827              First  released  in  Issue  5.


34828   Issue  6
34829              The  following  changes  are  made  for  alignment  with  IEEE  Std  1003.1j-2000:

34830                  The  margin  code  in  the  SYNOPSIS  is  changed  to  THR  to  indicate  that  the  functionality  is
34831                    now  part  of  the  Threads  option  (previously  it  was  part  of  the  Read-Write  Locks  option  in
34832                    IEEE  Std  1003.1j-2000  and  also  part  of  the  XSI  extension).

34833                  The  DESCRIPTION  is  updated  as  follows:
34834                     ”  Conditions  under  which  writers  have  precedence  over  readers  are  specified.
34835                     ”  Failure  of   pthread_rwlock_tryrdlock ()  is  clarified.
34836                     ”  A  paragraph  on  the  maximum  number  of  read  locks  is  added.

34837                  In  the  ERRORS  sections,  [EBUSY]  is  modified  to  take  into  account  write  priority,  and
34838                    [EDEADLK]  is  deleted  as  a   pthread_rwlock_tryrdlock ()  error.

34839                  The  SEE  ALSO  section  is  updated.


34840   NAME
34841              pthread_rwlock_timedrdlock   ”  lock  a  read-write  lock  for  reading


34842   SYNOPSIS

 34843 THR TMO  #include <pthread.h>  34844  #include <time.h>  34845  int pthread_rwlock_timedrdlock (pthread_rwlock_t *restrict  rwlock  ,  34846  const struct timespec *restrict  abs  _  timeout  );  


34847


34848   DESCRIPTION
34849              The   pthread_rwlock_timedrdlock ()  function  shall  apply  a  read  lock  to  the  read-write  lock
34850              referenced  by   rwlock  as  in  the   pthread_rwlock_rdlock ()  function.  However,  if  the  lock  cannot  be
34851              acquired  without  waiting  for  other  threads  to  unlock  the  lock,  this  wait  shall  be  terminated
34852              when  the  specified  timeout  expires.  The  timeout  shall  expire  when  the  absolute  time  specified
34853              by   abs_timeout  passes,  as  measured  by  the  clock  on  which  timeouts  are  based  (that  is,  when  the
34854              value  of  that  clock  equals  or  exceeds   abs_timeout),  or  if  the  absolute  time  specified  by   abs_timeout
34855              has  already  been  passed  at  the  time  of  the  call.

34856  TMR       If  the  Timers  option  is  supported,  the  timeout  shall  be  based  on  the  CLOCK_REALTIME  clock.  If
34857              the  Timers  option  is  not  supported,  the  timeout  shall  be  based  on  the  system  clock  as  returned
34858              by  the   time ()  function.  The  resolution  of  the  timeout  shall  be  the  resolution  of  the  clock  on  which
34859              it  is  based.  The   timespec  data  type  is  defined  in  the  < time.h>  header.  Under  no  circumstances
34860              shall  the  function  fail  with  a  timeout  if  the  lock  can  be  acquired  immediately.  The  validity  of  the
34861               abs_timeout  parameter  need  not  be  checked  if  the  lock  can  be  immediately  acquired.

34862              If  a  signal  that  causes  a  signal  handler  to  be  executed  is  delivered  to  a  thread  blocked  on  a  read-write
34863              lock  via  a  call  to   pthread_rwlock_timedrdlock (),  upon  return  from  the  signal  handler  the
34864              thread  shall  resume  waiting  for  the  lock  as  if  it  was  not  interrupted.

34865              The  calling  thread  may  deadlock  if  at  the  time  the  call  is  made  it  holds  a  write  lock  on   rwlock .
34866              The  results  are  undefined  if  this  function  is  called  with  an  uninitialized  read-write  lock.


34867   RETURN  VALUE

34868              The   pthread_rwlock_timedrdlock ()  function  shall  return  zero  if  the  lock  for  reading  on  the  read-write
34869              lock  object  referenced  by   rwlock  is  acquired.  Otherwise,  an  error  number  shall  be  returned
34870              to  indicate  the  error.


34871   ERRORS
34872              The   pthread_rwlock_timedrdlock ()  function  shall  fail  if:

34873              [ETIMEDOUT]            The  lock  could  not  be  acquired  before  the  specified  timeout  expired.

34874              The   pthread_rwlock_timedrdlock ()  function  may  fail  if:

34875              [EAGAIN]                  The  read  lock  could  not  be  acquired  because  the  maximum  number  of  read
34876                                                locks  for  lock  would  be  exceeded.
34877              [EDEADLK]                The  calling  thread  already  holds  a  write  lock  on   rwlock .
34878              [EINVAL]                  The  value  specified  by   rwlock  does  not  refer  to  an  initialized  read-write  lock
34879                                                object,  or  the   abs_timeout  nanosecond  value  is  less  than  zero  or  greater  than  or
34880                                                equal  to  1000  million.

34881              This  function  shall  not  return  an  error  code  of  [EINTR].


34882   EXAMPLES
34883              None.


34884   APPLICATION  USAGE
34885              Applications  using  this  function  may  be  subject  to  priority  inversion,  as  discussed  in  the  Base
34886              Definitions  volume  of  IEEE  Std  1003.1-2001,  Section  3.285,  Priority  Inversion.

34887              The   pthread_rwlock_timedrdlock ()  function  is  part  of  the  Threads  and  Timeouts  options  and  need
34888              not  be  provided  on  all  implementations.


34889   RATIONALE
34890              None.


34891   FUTURE  DIRECTIONS
34892              None.


34893   SEE  ALSO
34894               pthread_rwlock_destroy (),   pthread_rwlock_rdlock (),   pthread_rwlock_timedwrlock (),
34895               pthread_rwlock_tryrdlock (),   pthread_rwlock_trywrlock (),   pthread_rwlock_unlock (),
34896               pthread_rwlock_wrlock (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>,
34897              < time.h>


34898   CHANGE  HISTORY
34899              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1j-2000.


34900   NAME
34901              pthread_rwlock_timedwrlock   ”  lock  a  read-write  lock  for  writing


34902   SYNOPSIS

 34903 THR TMO  #include <pthread.h>  34904  #include <time.h>  34905  int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict  rwlock,   34906  const struct timespec *restrict  abs_timeout);   


34907


34908   DESCRIPTION
34909              The   pthread_rwlock_timedwrlock ()  function  shall  apply  a  write  lock  to  the  read-write  lock
34910              referenced  by   rwlock  as  in  the   pthread_rwlock_wrlock ()  function.  However,  if  the  lock  cannot  be
34911              acquired  without  waiting  for  other  threads  to  unlock  the  lock,  this  wait  shall  be  terminated
34912              when  the  specified  timeout  expires.  The  timeout  shall  expire  when  the  absolute  time  specified
34913              by   abs_timeout  passes,  as  measured  by  the  clock  on  which  timeouts  are  based  (that  is,  when  the
34914              value  of  that  clock  equals  or  exceeds   abs_timeout),  or  if  the  absolute  time  specified  by   abs_timeout
34915              has  already  been  passed  at  the  time  of  the  call.

34916  TMR       If  the  Timers  option  is  supported,  the  timeout  shall  be  based  on  the  CLOCK_REALTIME  clock.  If
34917              the  Timers  option  is  not  supported,  the  timeout  shall  be  based  on  the  system  clock  as  returned
34918              by  the   time ()  function.  The  resolution  of  the  timeout  shall  be  the  resolution  of  the  clock  on  which
34919              it  is  based.  The   timespec  data  type  is  defined  in  the  < time.h>  header.  Under  no  circumstances
34920              shall  the  function  fail  with  a  timeout  if  the  lock  can  be  acquired  immediately.  The  validity  of  the
34921               abs_timeout  parameter  need  not  be  checked  if  the  lock  can  be  immediately  acquired.

34922              If  a  signal  that  causes  a  signal  handler  to  be  executed  is  delivered  to  a  thread  blocked  on  a  read-write
34923              lock  via  a  call  to   pthread_rwlock_timedwrlock (),  upon  return  from  the  signal  handler  the
34924              thread  shall  resume  waiting  for  the  lock  as  if  it  was  not  interrupted.

34925              The  calling  thread  may  deadlock  if  at  the  time  the  call  is  made  it  holds  the  read-write  lock.  The
34926              results  are  undefined  if  this  function  is  called  with  an  uninitialized  read-write  lock.


34927   RETURN  VALUE
34928              The   pthread_rwlock_timedwrlock ()  function  shall  return  zero  if  the  lock  for  writing  on  the  read-write
34929              lock  object  referenced  by   rwlock  is  acquired.  Otherwise,  an  error  number  shall  be  returned
34930              to  indicate  the  error.


34931   ERRORS
34932              The   pthread_rwlock_timedwrlock ()  function  shall  fail  if:

34933              [ETIMEDOUT]            The  lock  could  not  be  acquired  before  the  specified  timeout  expired.

34934              The   pthread_rwlock_timedwrlock ()  function  may  fail  if:

34935              [EDEADLK]                The  calling  thread  already  holds  the   rwlock .
34936              [EINVAL]                  The  value  specified  by  rwlock  does  not  refer  to  an  initialized  read-write  lock
34937                                                object,  or  the   abs_timeout  nanosecond  value  is  less  than  zero  or  greater  than  or
34938                                                equal  to  1000  million.

34939              This  function  shall  not  return  an  error  code  of  [EINTR].


34940   EXAMPLES
34941              None.


34942   APPLICATION  USAGE
34943              Applications  using  this  function  may  be  subject  to  priority  inversion,  as  discussed  in  the  Base
34944              Definitions  volume  of  IEEE  Std  1003.1-2001,  Section  3.285,  Priority  Inversion.

34945              The   pthread_rwlock_timedwrlock ()  function  is  part  of  the  Threads  and  Timeouts  options  and  need
34946              not  be  provided  on  all  implementations.


34947   RATIONALE
34948              None.


34949   FUTURE  DIRECTIONS
34950              None.


34951   SEE  ALSO
34952               pthread_rwlock_destroy (),   pthread_rwlock_rdlock (),   pthread_rwlock_timedrdlock (),
34953               pthread_rwlock_tryrdlock (),   pthread_rwlock_trywrlock (),   pthread_rwlock_unlock (),
34954               pthread_rwlock_wrlock (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>,
34955              < time.h>


34956   CHANGE  HISTORY
34957              First  released  in  Issue  6.  Derived  from  IEEE  Std  1003.1j-2000.


34966   NAME
34967              pthread_rwlock_trywrlock,  pthread_rwlock_wrlock   ”  lock  a  read-write  lock  object  for  writing


34968   SYNOPSIS

 34969 THR  #include <pthread.h>  34970  int pthread_rwlock_trywrlock (pthread_rwlock_t *  rwlock  );  34971  int pthread_rwlock_wrlock (pthread_rwlock_t *  rwlock  );  


34972


34973   DESCRIPTION
34974              The   pthread_rwlock_trywrlock ()  function  shall  apply  a  write  lock  like  the   pthread_rwlock_wrlock ()
34975              function,  with  the  exception  that  the  function  shall  fail  if  any  thread  currently  holds   rwlock  (for
34976              reading  or  writing).

34977              The   pthread_rwlock_wrlock ()  function  shall  apply  a  write  lock  to  the  read-write  lock  referenced
34978              by   rwlock .  The  calling  thread  acquires  the  write  lock  if  no  other  thread  (reader  or  writer)  holds
34979              the  read-write  lock   rwlock .  Otherwise,  the  thread  shall  block  until  it  can  acquire  the  lock.  The
34980              calling  thread  may  deadlock  if  at  the  time  the  call  is  made  it  holds  the  read-write  lock  (whether  a
34981              read  or  write  lock).

34982              Implementations  may  favor  writers  over  readers  to  avoid  writer   starvation .

34983              Results  are  undefined  if  any  of  these  functions  are  called  with  an  uninitialized  read-write  lock.

34984              If  a  signal  is  delivered  to  a  thread  waiting  for  a  read-write  lock  for  writing,  upon  return  from  the
34985              signal  handler  the  thread  resumes  waiting  for  the  read-write  lock  for  writing  as  if  it  was  not
34986              interrupted.


34987   RETURN  VALUE
34988              The   pthread_rwlock_trywrlock ()  function  shall  return  zero  if  the  lock  for  writing  on  the  read-write
34989              lock  object  referenced  by   rwlock  is  acquired.  Otherwise,  an  error  number  shall  be  returned  to
34990              indicate  the  error.

34991              If  successful,  the   pthread_rwlock_wrlock ()  function  shall  return  zero;  otherwise,  an  error  number
34992              shall  be  returned  to  indicate  the  error.


34993   ERRORS
34994              The   pthread_rwlock_trywrlock ()  function  shall  fail  if:

34995              [EBUSY]                    The  read-write  lock  could  not  be  acquired  for  writing  because  it  was  already
34996                                                locked  for  reading  or  writing.

34997              The   pthread_rwlock_trywrlock ()  and   pthread_rwlock_wrlock ()  functions  may  fail  if:

34998              [EINVAL]                  The  value  specified  by   rwlock  does  not  refer  to  an  initialized  read-write  lock
34999                                                object.

35000              The   pthread_rwlock_wrlock ()  function  may  fail  if:

35001              [EDEADLK]                The  current  thread  already  owns  the  read-write  lock  for  writing  or  reading.

35002              These  functions  shall  not  return  an  error  code  of  [EINTR].


35003   EXAMPLES
35004              None.


35005   APPLICATION  USAGE
35006              Applications  using  these  functions  may  be  subject  to  priority  inversion,  as  discussed  in  the  Base
35007              Definitions  volume  of  IEEE  Std  1003.1-2001,  Section  3.285,  Priority  Inversion.


35008   RATIONALE
35009              None.


35010   FUTURE  DIRECTIONS
35011              None.


35012   SEE  ALSO
35013               pthread_rwlock_destroy (),   pthread_rwlock_rdlock (),   pthread_rwlock_timedrdlock (),
35014               pthread_rwlock_timedwrlock (),   pthread_rwlock_tryrdlock (),   pthread_rwlock_unlock (),  the  Base
35015              Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


35016   CHANGE  HISTORY
35017              First  released  in  Issue  5.


35018   Issue  6
35019              The  following  changes  are  made  for  alignment  with  IEEE  Std  1003.1j-2000:

35020                  The  margin  code  in  the  SYNOPSIS  is  changed  to  THR  to  indicate  that  the  functionality  is
35021                    now  part  of  the  Threads  option  (previously  it  was  part  of  the  Read-Write  Locks  option  in
35022                    IEEE  Std  1003.1j-2000  and  also  part  of  the  XSI  extension).

35023                  The  [EDEADLK]  error  is  deleted  as  a   pthread_rwlock_trywrlock ()  error.

35024                  The  SEE  ALSO  section  is  updated.


35025   NAME
35026              pthread_rwlock_unlock_unlock  a  read-write  lock  object


35027   SYNOPSIS

 35028 THR  #include <pthread.h>  35029  int pthread_rwlock_unlock(pthread_rwlock_t *  rwlock  );  


35030


35031   DESCRIPTION
35032              The   pthread_rwlock_unlock ()  function  shall  release  a  lock  held  on  the  read-write  lock  object
35033              referenced  by   rwlock .  Results  are  undefined  if  the  read-write  lock   rwlock  is  not  held  by  the
35034              calling  thread.

35035              If  this  function  is  called  to  release  a  read  lock  from  the  read-write  lock  object  and  there  are  other
35036              read  locks  currently  held  on  this  read-write  lock  object,  the  read-write  lock  object  remains  in  the
35037              read  locked  state.  If  this  function  releases  the  last  read  lock  for  this  read-write  lock  object,  the
35038              read-write  lock  object  shall  be  put  in  the  unlocked  state  with  no   owners .

35039              If  this  function  is  called  to  release  a  write  lock  for  this  read-write  lock  object,  the  read-write  lock
35040              object  shall  be  put  in  the  unlocked  state.

35041              If  there  are  threads  blocked  on  the  lock  when  it  becomes  available,  the  scheduling  policy  shall
35042  TPS      determine  which  thread(s)  shall  acquire  the  lock.   If  the  Thread  Execution  Scheduling  option  is
35043               supported,  when  threads  executing  with  the  scheduling  policies  SCHED_FIFO,  SCHED_RR,  or
35044               SCHED_SPORADIC  are  waiting  on  the  lock,  they  shall  acquire  the  lock  in  priority  order  when
35045               the  lock  becomes  available.  For  equal  priority  threads,  write  locks  shall  take  precedence  over
35046               read  locks.  If  the  Thread  Execution  Scheduling  option  is  not  supported,  it  is  implementation-
35047              defined  whether  write  locks  take  precedence  over  read  locks.

35048              Results  are  undefined  if  any  of  these  functions  are  called  with  an  uninitialized  read-write  lock.


35049   RETURN  VALUE
35050              If  successful,  the   pthread_rwlock_unlock ()  function  shall  return  zero;  otherwise,  an  error  number
35051              shall  be  returned  to  indicate  the  error.


35052   ERRORS
35053              The   pthread_rwlock_unlock ()  function  may  fail  if:

35054              [EINVAL]                  The  value  specified  by   rwlock  does  not  refer  to  an  initialized  read-write  lock
35055                                                object.
35056              [EPERM]                    The  current  thread  does  not  hold  a  lock  on  the  read-write  lock.

35057              The   pthread_rwlock_unlock ()  function  shall  not  return  an  error  code  of  [EINTR].


35058   EXAMPLES
35059              None.


35060   APPLICATION  USAGE
35061              None.


35062   RATIONALE
35063              None.


35064   FUTURE  DIRECTIONS
35065              None.


35066   SEE  ALSO
35067               pthread_rwlock_destroy (),   pthread_rwlock_rdlock (),   pthread_rwlock_timedrdlock (),
35068               pthread_rwlock_timedwrlock (),   pthread_rwlock_tryrdlock (),   pthread_rwlock_trywrlock (),
35069               pthread_rwlock_wrlock (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


35070   CHANGE  HISTORY
35071              First  released  in  Issue  5.


35072   Issue  6
35073              The  following  changes  are  made  for  alignment  with  IEEE  Std  1003.1j-2000:

35074                  The  margin  code  in  the  SYNOPSIS  is  changed  to  THR  to  indicate  that  the  functionality  is
35075                    now  part  of  the  Threads  option  (previously  it  was  part  of  the  Read-Write  Locks  option  in
35076                    IEEE  Std  1003.1j-2000  and  also  part  of  the  XSI  extension).

35077                  The  DESCRIPTION  is  updated  as  follows:
35078                     ”  The  conditions  under  which  writers  have  precedence  over  readers  are  specified.
35079                     ”  The  concept  of  read-write  lock  owner  is  deleted.

35080                  The  SEE  ALSO  section  is  updated.


35089   NAME
35090              pthread_rwlockattr_destroy,  pthread_rwlockattr_init   ”  destroy  and  initialize  the  read-write
35091              lock  attributes  object


35092   SYNOPSIS

 35093 THR  #include <pthread.h>  35094  int pthread_rwlockattr_destroy(pthread_rwlockattr_t *  attr  );  35095  int pthread_rwlockattr_init(pthread_rwlockattr_t *  attr  );  


35096


35097   DESCRIPTION
35098              The   pthread_rwlockattr_destroy ()  function  shall  destroy  a  read-write  lock  attributes  object.  A
35099              destroyed   attr  attributes  object  can  be  reinitialized  using   pthread_rwlockattr_init ();  the  results  of
35100              otherwise  referencing  the  object  after  it  has  been  destroyed  are  undefined.  An  implementation
35101              may  cause   pthread_rwlockattr_destroy ()  to  set  the  object  referenced  by   attr  to  an  invalid  value.

35102              The   pthread_rwlockattr_init ()  function  shall  initialize  a  read-write  lock  attributes  object   attr  with
35103              the  default  value  for  all  of  the  attributes  defined  by  the  implementation.

35104              Results  are  undefined  if   pthread_rwlockattr_init ()  is  called  specifying  an  already  initialized   attr
35105              attributes  object.

35106              After  a  read-write  lock  attributes  object  has  been  used  to  initialize  one  or  more  read-write  locks,
35107              any  function  affecting  the  attributes  object  (including  destruction)  shall  not  affect  any  previously
35108              initialized  read-write  locks.


35109   RETURN  VALUE
35110              If  successful,  the   pthread_rwlockattr_destroy ()  and   pthread_rwlockattr_init ()  functions  shall  return
35111              zero;  otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


35112   ERRORS
35113              The   pthread_rwlockattr_destroy ()  function  may  fail  if:

35114              [EINVAL]                  The  value  specified  by   attr  is  invalid.

35115              The   pthread_rwlockattr_init ()  function  shall  fail  if:

35116              [ENOMEM]                  Insufficient  memory  exists  to  initialize  the  read-write  lock  attributes  object.

35117              These  functions  shall  not  return  an  error  code  of  [EINTR].


35118   EXAMPLES
35119              None.


35120   APPLICATION  USAGE
35121              None.


35122   RATIONALE
35123              None.


35124   FUTURE  DIRECTIONS
35125              None.


35126   SEE  ALSO
35127               pthread_rwlock_destroy (),   pthread_rwlockattr_getpshared (),   pthread_rwlockattr_setpshared (),  the
35128              Base  Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


35129   CHANGE  HISTORY
35130              First  released  in  Issue  5.


35131   Issue  6
35132              The  following  changes  are  made  for  alignment  with  IEEE  Std  1003.1j-2000:

35133                  The  margin  code  in  the  SYNOPSIS  is  changed  to  THR  to  indicate  that  the  functionality  is
35134                    now  part  of  the  Threads  option  (previously  it  was  part  of  the  Read-Write  Locks  option  in
35135                    IEEE  Std  1003.1j-2000  and  also  part  of  the  XSI  extension).

35136                  The  SEE  ALSO  section  is  updated.


35137   NAME
35138              pthread_rwlockattr_getpshared,  pthread_rwlockattr_setpshared   ”  get  and  set  the  process-shared
35139              attribute  of  the  read-write  lock  attributes  object


35140   SYNOPSIS

 35141 THR TSH  #include <pthread.h>  35142  int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *  35143  restrict  attr,  int *restrict  pshared  );  35144  int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *  attr,   35145  int  pshared  );  


35146


35147   DESCRIPTION
35148              The   pthread_rwlockattr_getpshared ()  function  shall  obtain  the  value  of  the   process-shared  attribute
35149              from  the  initialized  attributes  object  referenced  by   attr .  The   pthread_rwlockattr_setpshared ()
35150              function  shall  set  the   process-shared  attribute  in  an  initialized  attributes  object  referenced  by   attr .

35151              The   process-shared  attribute  shall  be  set  to  PTHREAD_PROCESS_SHARED  to  permit  a  read-
35152              write  lock  to  be  operated  upon  by  any  thread  that  has  access  to  the  memory  where  the  read-write
35153              lock  is  allocated,  even  if  the  read-write  lock  is  allocated  in  memory  that  is  shared  by
35154              multiple  processes.  If  the   process-shared  attribute  is  PTHREAD_PROCESS_PRIVATE,  the  read-
35155              write  lock  shall  only  be  operated  upon  by  threads  created  within  the  same  process  as  the  thread
35156              that  initialized  the  read-write  lock;  if  threads  of  differing  processes  attempt  to  operate  on  such  a
35157              read-write  lock,  the  behavior  is  undefined.  The  default  value  of  the   process-shared  attribute  shall
35158              be  PTHREAD_PROCESS_PRIVATE.

35159              Additional  attributes,  their  default  values,  and  the  names  of  the  associated  functions  to  get  and
35160              set  those  attribute  values  are  implementation-defined.


35161   RETURN  VALUE
35162              Upon  successful  completion,  the   pthread_rwlockattr_getpshared ()  function  shall  return  zero  and
35163              store  the  value  of  the   process-shared  attribute  of   attr  into  the  object  referenced  by  the   pshared
35164              parameter.  Otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.

35165              If  successful,  the   pthread_rwlockattr_setpshared ()  function  shall  return  zero;  otherwise,  an  error
35166              number  shall  be  returned  to  indicate  the  error.


35167   ERRORS
35168              The   pthread_rwlockattr_getpshared ()  and   pthread_rwlockattr_setpshared ()  functions  may  fail  if:

35169              [EINVAL]                  The  value  specified  by   attr  is  invalid.

35170              The   pthread_rwlockattr_setpshared ()  function  may  fail  if:

35171              [EINVAL]                  The  new  value  specified  for  the  attribute  is  outside  the  range  of  legal  values
35172                                                for  that  attribute.

35173              These  functions  shall  not  return  an  error  code  of  [EINTR].


35174   EXAMPLES
35175              None.


35176   APPLICATION  USAGE
35177              None.


35178   RATIONALE
35179              None.


35180   FUTURE  DIRECTIONS
35181              None.


35182   SEE  ALSO
35183               pthread_rwlock_destroy (),   pthread_rwlockattr_destroy (),   pthread_rwlockattr_init (),  the  Base
35184              Definitions  volume  of  IEEE  Std  1003.1-2001,  < pthread.h>


35185   CHANGE  HISTORY
35186              First  released  in  Issue  5.


35187   ISSUE  6
35188              The  following  changes  are  made  for  alignment  with  IEEE  Std  1003.1j-2000:

35189                  The  margin  code  in  the  SYNOPSIS  is  changed  to  THR  TSH  to  indicate  that  the  functionality
35190                    is  now  part  of  the  Threads  option  (previously  it  was  part  of  the  Read-Write  Locks  option  in
35191                    IEEE  Std  1003.1j-2000  and  also  part  of  the  XSI  extension).

35192                  The  DESCRIPTION  notes  that  additional  attributes  are  implementation-defined.

35193                  The  SEE  ALSO  section  is  updated.

35194              The   restrict  keyword  is  added  to  the   pthread_rwlockattr_getpshared ()  prototype  for  alignment
35195              with  the  ISO/IEC  9899:  1999  standard.


35214   NAME
35215              pthread_self   ”  get  the  calling  thread  ID


35216   SYNOPSIS

 35217 THR  #include <pthread.h>  35218  pthread_t pthread_self (void);  


35219


35220   DESCRIPTION
35221              The   pthread_self ()  function  shall  return  the  thread  ID  of  the  calling  thread.


35222   RETURN  VALUE
35223              Refer  to  the  DESCRIPTION.


35224   ERRORS
35225              No  errors  are  defined.

35226              The   pthread_self ()  function  shall  not  return  an  error  code  of  [EINTR].


35227   EXAMPLES
35228              None.


35229   APPLICATION  USAGE
35230              None.


35231   RATIONALE
35232              The   pthread_self ()  function  provides  a  capability  similar  to  the   getpid ()  function  for  processes
35233              and  the  rationale  is  the  same:  the  creation  call  does  not  provide  the  thread  ID  to  the  created
35234              thread.


35235   FUTURE  DIRECTIONS
35236              None.


35237   SEE  ALSO
35238               pthread_create (),   pthread_equal (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,
35239              < pthread.h>


35240   CHANGE  HISTORY
35241              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extension.


35242   Issue  6
35243              The   pthread_self ()  function  is  marked  as  part  of  the  Threads  option.


35244   NAME
35245              pthread_setcancelstate,  pthread_setcanceltype,  pthread_testcancel   ”  set  cancelability  state


35246   SYNOPSIS

 35247 THR  #include <pthread.h>  35248  int pthread_setcancelstate(int  state,  int *  oldstate  );  35249  int pthread_setcanceltype(int  type,  int *  oldtype  );  35250  void pthread_testcancel(void);  


35251


35252   DESCRIPTION
35253              The   pthread_setcancelstate ()  function  shall  atomically  both  set  the  calling  thread's  cancelability
35254              state  to  the  indicated   state  and  return  the  previous  cancelability  state  at  the  location  referenced
35255              by   oldstate .  Legal  values  for   state  are  PTHREAD_CANCEL_ENABLE  and
35256              PTHREAD_CANCEL_DISABLE.

35257              The   pthread_setcanceltype ()  function  shall  atomically  both  set  the  calling  thread's  cancelability
35258              type  to  the  indicated   type  and  return  the  previous  cancelability  type  at  the  location  referenced  by
35259               oldtype .  Legal  values  for   type  are  PTHREAD_CANCEL_DEFERRED  and
35260              PTHREAD_CANCEL_ASYNCHRONOUS.

35261              The  cancelability  state  and  type  of  any  newly  created  threads,  including  the  thread  in  which
35262               main ()  was  first  invoked,  shall  be  PTHREAD_CANCEL_ENABLE  and
35263              PTHREAD_CANCEL_DEFERRED  respectively.

35264              The   pthread_testcancel ()  function  shall  create  a  cancelation  point  in  the  calling  thread.  The
35265               pthread_testcancel ()  function  shall  have  no  effect  if  cancelability  is  disabled.


35266   RETURN  VALUE
35267              If  successful,  the   pthread_setcancelstate ()  and   pthread_setcanceltype ()  functions  shall  return  zero;
35268              otherwise,  an  error  number  shall  be  returned  to  indicate  the  error.


35269   ERRORS
35270              The   pthread_setcancelstate ()  function  may  fail  if:

35271              [EINVAL]                    The  specified  state  is  not  PTHREAD_CANCEL_ENABLE  or
35272                                                  PTHREAD_CANCEL_DISABLE.

35273              The   pthread_setcanceltype ()  function  may  fail  if:

35274              [EINVAL]                    The  specified  type  is  not  PTHREAD_CANCEL_DEFERRED  or
35275                                                  PTHREAD_CANCEL_ASYNCHRONOUS.

35276              These  functions  shall  not  return  an  error  code  of  [EINTR].


35277   EXAMPLES
35278              None.


35279   APPLICATION  USAGE
35280              None.


35281   RATIONALE
35282              The   pthread_setcancelstate ()  and   pthread_setcanceltype ()  functions  control  the  points  at  which  a
35283              thread  may  be  asynchronously  canceled.  For  cancelation  control  to  be  usable  in  modular  fashion,
35284              some  rules  need  to  be  followed.

35285              An  object  can  be  considered  to  be  a  generalization  of  a  procedure.  It  is  a  set  of  procedures  and
35286              global  variables  written  as  a  unit  and  called  by  clients  not  known  by  the  object.  Objects  may
35287              depend  on  other  objects.

35288              First,  cancelability  should  only  be  disabled  on  entry  to  on  object,  never  explicitly  enabled.  On
35289              exit  from  an  object,  the  cancelability  state  should  always  be  restored  to  its  value  on  entry  to  the
35290              object.

35291              This  follows  from  a  modularity  argument:  if  the  client  of  an  object  (or  the  client  of  an  object  that
35292              uses  that  object)  has  disabled  cancelability,  it  is  because  the  client  does  not  want  to  be   concerned
35293              about  cleaning  up  if  the  thread  is  canceled  while  executing  some  sequence  of  actions.  If  an  object
35294              is  called  in  such  a  state  and  it  enables  cancelability  and  a  cancelation  request  is  pending  for  that
35295              thread,  then  the  thread  is  canceled,  contrary  to  the  wish  of  the  client  that  disabled.

35296              Second,  the  cancelability  type  may  be  explicitly  set  to  either   deferred  or   asynchronous  upon  entry
35297              to  an  object.  But  as  with  the  cancelability  state,  on  exit  from  an  object  the  cancelability  type
35298              should  always  be  restored  to  its  value  on  entry  to  the  object.

35299              Finally,  only  functions  that  are  cancel-safe  may  be  called  from  a  thread  that  is  asynchronously
35300              cancelable.


35301   FUTURE  DIRECTIONS
35302              None.


35303   SEE  ALSO
35304               pthread_cancel (),  the  Base  Definitions  volume  of  IEEE  Std  1003.1-2001,   <pthread.h>


35305   CHANGE  HISTORY
35306              First  released  in  Issue  5.  Included  for  alignment  with  the  POSIX  Threads  Extensions.


35307   Issue  6
35308              The   pthread_setcancelstate (),   pthread_setcanceltype (),  and   pthread_testcancel ()  functions  are  marked
35309              as  part  of  the  Threads  option.


35328   NAME
35329              pthread_setschedprio   ”  dynamic  thread  scheduling  parameters  access  (   REALTIME
35330               THREADS )


35331   SYNOPSIS

 35332 THR TPS  #include <pthread.h>  35333  int pthread_setschedprio(pthread_t  thread,  int  prio  );  


35334


35335   DESCRIPTION
35336              The   pthread_setschedprio ()  function  shall  set  the  scheduling  priority  for  the  thread  whose  thread
35337              ID  is  given  by   thread  to  the  value  given  by   prio .  See   Scheduling  Policies  (on  page  44)  for  a
35338              description  on  how  this  function  call  affects  the  ordering  of  the  thread  in  the  thread  list  for  its
35339              new  priority.

35340              If  the   pthread_setschedprio ()  function  fails,  the  scheduling  priority  of  the  target  thread  shall  not  be
35341              changed.


35342   RETURN  VALUE
35343              If  successful,  the   pthread_setschedprio ()  function  shall  return  zero;  otherwise,  an  error  number
35344              shall  be  returned  to  indicate  the  error.


35345   ERRORS
35346              The   pthread_setschedprio ()  function  may  fail  if:

35347              [EINVAL]                    The  value  of   prio  is  invalid  for  the  scheduling  policy  of  the  specified  thread.
35348              [ENOTSUP]                  An  attempt  was  made  to  set  the  priority  to  an  unsupported  value.
35349              [EPERM]                      The  caller  does  not  have  the  appropriate  permission  to  set  the  scheduling
35350                                                  policy  of  the  specified  thread.
35351              [EPERM]                      The  implementation  does  not  allow  the  application  to  modify  the  priority  to
35352                                                  the  value  specified.
35353              [ESRCH]                      The  value  specified  by   thread  does  not  refer  to  an  existing  thread.

35354              The   pthread_setschedprio ()  function  shall  not  return  an  error  code  of  [EINTR].


35355   EXAMPLES
35356              None.


35357   APPLICATION  USAGE
35358              None.


35359   RATIONALE
35360              The   pthread_setschedprio ()  function  provides  a  way  for  an  application  to  temporarily  raise  its
35361              priority  and  then  lower  it  again,  without  having  the   undesired  side  effect  of  yielding  to  other
35362              threads  of  the  same  priority.  This  is  necessary  if  the  application  is  to  implement  its  own
35363              strategies  for  bounding  priority  inversion,  such  as  priority  inheritance  or  priority  ceilings.  This
35364              capability  is  especially  important  if  the  implementation  does  not  support  the  Thread  Priority
35365              Protection  or  Thread  Priority  Inheritance  options,  but  even  if  those  options  are  supported  it  is
35366              needed  if  the  application  is  to  bound  priority  inheritance  for  other  resources,  such  as
35367              semaphores.

35368              The  standard  developers  considered  that  while  it  might  be  preferable  conceptually  to  solve  this
35369              problem  by  modifying  the  specification  of   pthread_setschedparam (),  it  was  too  late  to  make  such  a
35370              change,  as  there  may  be  implementations  that  would  need  to  be  changed.  Therefore,  this  new
35371              function  was  introduced.


35372   FUTURE  DIRECTIONS
35373              None.


35374   SEE  ALSO
35375               Scheduling  Policies  (on  page  44),   pthread_getschedparam (),  the  Base  Definitions  volume  of
35376              IEEE  Std  1003.1-2001,  < pthread.h>


35377   CHANGE  HISTORY
35378              First  released  in  Issue  6.  Included  as  a  response  to  IEEE  PASC  Interpretation  1003.1  #96.



Parallel and Distributed Programming Using C++
Parallel and Distributed Programming Using C++
ISBN: 0131013769
EAN: 2147483647
Year: 2002
Pages: 133

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net