home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / i-cpthre.ads < prev    next >
Text File  |  1996-09-28  |  11KB  |  322 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                 GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS               --
  4. --                                                                          --
  5. --                 I N T E R F A C E S . C . P T H R E A D S                --
  6. --                                                                          --
  7. --                                  S p e c                                 --
  8. --                                                                          --
  9. --                             $Revision: 1.17 $                            --
  10. --                                                                          --
  11. --      Copyright (c) 1991,1992,1993,1994,1995 FSU, All Rights Reserved     --
  12. --                                                                          --
  13. -- GNARL is free software; you can redistribute it  and/or modify it  under --
  14. -- terms  of  the  GNU  Library General Public License  as published by the --
  15. -- Free Software  Foundation;  either version 2, or (at  your  option)  any --
  16. -- later  version.  GNARL is distributed  in the hope that  it will be use- --
  17. -- ful, but but WITHOUT ANY WARRANTY;  without even the implied warranty of --
  18. -- MERCHANTABILITY  or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Gen- --
  19. -- eral Library Public License  for more details.  You should have received --
  20. -- a  copy of the GNU Library General Public License along with GNARL;  see --
  21. -- file COPYING.LIB.  If not,  write to the  Free Software Foundation,  675 --
  22. -- Mass Ave, Cambridge, MA 02139, USA.                                      --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. --  This package interfaces with Pthreads. It is not a complete interface;
  27. --  it only includes what is needed to implement the Ada runtime.
  28.  
  29. with System;
  30.  
  31. with Interfaces.C.System_Constants;
  32. --  Used for: Add_Prio
  33. --            pthread_attr_t_size
  34. --            pthread_mutexattr_t_size
  35. --            pthread_mutex_t_size
  36. --            pthread_condattr_t_size
  37. --            pthread_cond_t_size
  38. --            NO_PRIO_INHERIT
  39. --            PRIO_INHERIT
  40. --            PRIO_PROTECT
  41.  
  42. with Interfaces.C.POSIX_RTE;
  43. --  Used for: Signal,
  44. --            Signal_Set
  45.  
  46. with Interfaces.C.POSIX_Error;
  47. --  Used for: Return_Code
  48.  
  49. with Interfaces.C.POSIX_Timers;
  50. --  Used for: timespec
  51.  
  52. package Interfaces.C.Pthreads is
  53.  
  54.    use Interfaces.C.POSIX_Error;
  55.  
  56.    Alignment : constant := Natural'Min (Standard'Maximum_Alignment, 8);
  57.  
  58.    Pthreads_Error : exception;
  59.  
  60.    type Priority_Type is new int;
  61.  
  62.    type pthread_t       is private;
  63.    type pthread_mutex_t is private;
  64.    type pthread_cond_t  is private;
  65.  
  66.    type pthread_attr_t      is private;
  67.    type pthread_mutexattr_t is private;
  68.    type pthread_condattr_t  is private;
  69.    type pthread_key_t       is private;
  70.    type pthread_protocol_t  is private;
  71.  
  72.    NO_PRIO_INHERIT : constant pthread_protocol_t;
  73.    PRIO_INHERIT    : constant pthread_protocol_t;
  74.    PRIO_PROTECT    : constant pthread_protocol_t;
  75.  
  76.    procedure pthread_attr_init
  77.      (attributes : out pthread_attr_t;
  78.       result     : out Return_Code);
  79.    pragma Inline (pthread_attr_init);
  80.  
  81.    procedure pthread_attr_destroy
  82.      (attributes : in out pthread_attr_t;
  83.       result     : out Return_Code);
  84.    pragma Inline (pthread_attr_destroy);
  85.  
  86.    procedure pthread_attr_setstacksize
  87.      (attr      : in out pthread_attr_t;
  88.       stacksize : size_t;
  89.       result    : out Return_Code);
  90.    pragma Inline (pthread_attr_setstacksize);
  91.  
  92.    procedure pthread_attr_setdetachstate
  93.      (attr        : in out pthread_attr_t;
  94.       detachstate : int;
  95.       Result      : out Return_Code);
  96.    pragma Inline (pthread_attr_setdetachstate);
  97.  
  98.    procedure pthread_create
  99.      (thread        : out pthread_t;
  100.       attributes    : pthread_attr_t;
  101.       start_routine : System.Address;
  102.       arg           : System.Address;
  103.       result        : out Return_Code);
  104.    pragma Inline (pthread_create);
  105.  
  106.    procedure pthread_init;
  107.  
  108.    function pthread_self return pthread_t;
  109.    pragma Inline (pthread_self);
  110.  
  111.    procedure pthread_detach
  112.      (thread : in out pthread_t;
  113.       result : out Return_Code);
  114.    pragma Inline (pthread_detach);
  115.  
  116.    procedure pthread_mutexattr_init
  117.      (attributes : out pthread_mutexattr_t;
  118.       result     : out Return_Code);
  119.    pragma Inline (pthread_mutexattr_init);
  120.  
  121.    procedure pthread_mutexattr_setprotocol
  122.      (attributes : in out pthread_mutexattr_t;
  123.       protocol   : pthread_protocol_t;
  124.       result     : out Return_Code);
  125.    pragma Inline (pthread_mutexattr_setprotocol);
  126.  
  127.    procedure pthread_mutexattr_setprio_ceiling
  128.      (attributes   : in out pthread_mutexattr_t;
  129.       prio_ceiling : int;
  130.       result       : out Return_Code);
  131.    pragma Inline (pthread_mutexattr_setprio_ceiling);
  132.  
  133.    procedure pthread_mutex_init
  134.      (mutex      : out pthread_mutex_t;
  135.       attributes : pthread_mutexattr_t;
  136.       result     : out Return_Code);
  137.    pragma Inline (pthread_mutex_init);
  138.  
  139.    procedure pthread_mutex_destroy
  140.      (mutex  : in out pthread_mutex_t;
  141.       result : out Return_Code);
  142.    pragma Inline (pthread_mutex_destroy);
  143.  
  144.    procedure pthread_mutex_trylock
  145.      (mutex  : in out pthread_mutex_t;
  146.       result : out Return_Code);
  147.    pragma Inline (pthread_mutex_trylock);
  148.  
  149.    procedure pthread_mutex_lock
  150.      (mutex  : in out pthread_mutex_t;
  151.       result : out Return_Code);
  152.    pragma Inline (pthread_mutex_lock);
  153.  
  154.    procedure pthread_mutex_unlock
  155.      (mutex  : in out pthread_mutex_t;
  156.       result : out Return_Code);
  157.    pragma Inline (pthread_mutex_unlock);
  158.  
  159.    procedure pthread_cond_init
  160.      (condition  : out pthread_cond_t;
  161.       attributes : pthread_condattr_t;
  162.       result     : out Return_Code);
  163.    pragma Inline (pthread_cond_init);
  164.  
  165.    procedure pthread_cond_wait
  166.      (condition : in out pthread_cond_t;
  167.       mutex     : in out pthread_mutex_t;
  168.       result    : out Return_Code);
  169.    pragma Inline (pthread_cond_wait);
  170.  
  171.    procedure pthread_cond_timedwait
  172.      (condition     : in out pthread_cond_t;
  173.       mutex         : in out pthread_mutex_t;
  174.       absolute_time : Interfaces.C.POSIX_Timers.timespec;
  175.       result        : out Return_Code);
  176.    pragma Inline (pthread_cond_timedwait);
  177.  
  178.    procedure pthread_cond_signal
  179.      (condition : in out pthread_cond_t;
  180.       result    : out Return_Code);
  181.    pragma Inline (pthread_cond_signal);
  182.  
  183.    procedure pthread_cond_broadcast
  184.      (condition : in out pthread_cond_t;
  185.       result    : out Return_Code);
  186.    pragma Inline (pthread_cond_broadcast);
  187.  
  188.    procedure pthread_cond_destroy
  189.      (condition : in out pthread_cond_t;
  190.       result    : out Return_Code);
  191.    pragma Inline (pthread_cond_destroy);
  192.  
  193.    procedure pthread_condattr_init
  194.      (attributes : out pthread_condattr_t;
  195.       result     : out Return_Code);
  196.    pragma Inline (pthread_condattr_init);
  197.  
  198.    procedure pthread_condattr_destroy
  199.      (attributes : in out pthread_condattr_t;
  200.       result     : out Return_Code);
  201.    pragma Inline (pthread_condattr_destroy);
  202.  
  203.    procedure pthread_setspecific
  204.      (key    : pthread_key_t;
  205.       value  : System.Address;
  206.       result : out Return_Code);
  207.    pragma Inline (pthread_setspecific);
  208.  
  209.    procedure pthread_getspecific
  210.      (key    : pthread_key_t;
  211.       value  : out System.Address;
  212.       result : out Return_Code);
  213.    pragma Inline (pthread_getspecific);
  214.  
  215.    procedure pthread_key_create
  216.      (key        : out pthread_key_t;
  217.       destructor : System.Address;
  218.       result     : out Return_Code);
  219.    pragma Inline (pthread_key_create);
  220.  
  221.    procedure pthread_attr_setprio
  222.      (attr     : in out pthread_attr_t;
  223.       priority : Priority_Type;
  224.       result   : out Return_Code);
  225.    pragma Inline (pthread_attr_setprio);
  226.  
  227.    procedure pthread_attr_getprio
  228.      (attr     : pthread_attr_t;
  229.       priority : out Priority_Type;
  230.       result   : out Return_Code);
  231.    pragma Inline (pthread_attr_getprio);
  232.  
  233.    procedure pthread_setschedattr
  234.      (thread     : pthread_t;
  235.       attributes : pthread_attr_t;
  236.       result     : out Return_Code);
  237.    pragma Inline (pthread_setschedattr);
  238.  
  239.    procedure pthread_getschedattr
  240.      (thread     : pthread_t;
  241.       attributes : out pthread_attr_t;
  242.       result     : out Return_Code);
  243.    pragma Inline (pthread_getschedattr);
  244.  
  245.    procedure pthread_exit (status : System.Address);
  246.    pragma Interface (C, pthread_exit);
  247.    pragma Interface_Name (pthread_exit, "pthread_exit");
  248.  
  249.    procedure sigwait
  250.      (set    : Interfaces.C.POSIX_RTE.Signal_Set;
  251.       sig    : out Interfaces.C.POSIX_RTE.Signal;
  252.       result : out Return_Code);
  253.    pragma Inline (sigwait);
  254.  
  255.    procedure pthread_kill
  256.      (thread : pthread_t; sig : Interfaces.C.POSIX_RTE.Signal;
  257.       result : out Return_Code);
  258.    pragma Inline (pthread_kill);
  259.  
  260.    procedure pthread_cleanup_push
  261.      (routine : System.Address;
  262.       arg     : System.Address);
  263.    pragma Inline (pthread_cleanup_push);
  264.  
  265.    procedure pthread_cleanup_pop (execute : int);
  266.    pragma Inline (pthread_cleanup_pop);
  267.  
  268.    procedure pthread_yield;
  269.    pragma Inline (pthread_yield);
  270.  
  271. private
  272.  
  273.    --  The use of longword alignment for the following C types is
  274.    --  a stopgap measure which is not generally portable.  A portable
  275.    --  solution will require some means of getting alignment information
  276.    --  from the C compiler.
  277.  
  278.    type pthread_attr_t is
  279.      array (1 .. System_Constants.pthread_attr_t_size) of unsigned_char;
  280.    for pthread_attr_t'Alignment use Alignment;
  281.  
  282.    type pthread_mutexattr_t is
  283.      array (1 .. System_Constants.pthread_mutexattr_t_size) of unsigned_char;
  284.    for pthread_mutexattr_t'Alignment use Alignment;
  285.  
  286.    type pthread_mutex_t is
  287.      array (1 .. System_Constants.pthread_mutex_t_size) of unsigned_char;
  288.    for pthread_mutex_t'Alignment use Alignment;
  289.  
  290.    type pthread_condattr_t is
  291.      array (1 .. System_Constants.pthread_condattr_t_size) of unsigned_char;
  292.    for pthread_condattr_t'Alignment use Alignment;
  293.  
  294.    type pthread_cond_t is
  295.      array (1 .. System_Constants.pthread_cond_t_size) of unsigned_char;
  296.    for pthread_cond_t'Alignment use Alignment;
  297.  
  298. --   type pthread_t is
  299. --     array (1 .. System_Constants.pthread_t_size) of unsigned_char;
  300.    type pthread_t is new unsigned;
  301.    --  ??? The use of an array here seems to cause
  302.    --  problems in the compiler.  It put a long word 4 in the
  303.    --  instruction stream of Interfaces.C.Pthreads.pthread_self.  This
  304.    --  is obviously meant to provide some clue as to what size
  305.    --  item it is to return, but pthread_self tried to execute it.
  306.  
  307.    type pthread_key_t is new unsigned;
  308.    --  This type is passed as a scaler into a C function. It must
  309.    --  be declared as a scaler, not an array.  This being so, an unsigned
  310.    --  should work.
  311.  
  312.    type pthread_protocol_t is new int;
  313.  
  314.    NO_PRIO_INHERIT : constant pthread_protocol_t :=
  315.                                            System_Constants.NO_PRIO_INHERIT;
  316.    PRIO_INHERIT    : constant pthread_protocol_t :=
  317.                                            System_Constants.PRIO_INHERIT;
  318.    PRIO_PROTECT     : constant pthread_protocol_t :=
  319.                                            System_Constants.PRIO_PROTECT;
  320.  
  321. end Interfaces.C.Pthreads;
  322.