source: trunk/libs/libpthread/pthread.h @ 466

Last change on this file since 466 was 457, checked in by alain, 6 years ago

This version modifies the exec syscall and fixes a large number of small bugs.
The version number has been updated (0.1)

File size: 14.1 KB
Line 
1/*
2 * pthread.h - User level <pthread> library definition.
3 *
4 * Author     Alain Greiner (2016,2017)
5 *
6 * Copyright (c) UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#ifndef _PTHREAD_H_
25#define _PTHREAD_H_
26
27//////////////////////////////////////////////////////////////////////////////////////////////
28//             POSIX Threads related functions (including barriers and mutexes)
29//////////////////////////////////////////////////////////////////////////////////////////////
30
31#include <shared_pthread.h>
32
33/*********************************************************************************************
34 * This function creates a new user thread. The <user_attr> argument is a pointer
35 * on a structure containing the thread attributes, defined in thread.h file.
36 *********************************************************************************************
37 * @ trdid       : [out] buffer for created thread identifier in process.
38 * @ user_attr   : [in]  pointer on thread attributes structure.
39 * @ start_func  : [in]  pointer on start function.
40 * @ start_args  : [in]  pointer on start function arguments.
41 * @ return 0 if success / return -1 if failure.
42 ********************************************************************************************/
43int pthread_create( pthread_t            * trdid,
44                    const pthread_attr_t * attr,
45                    void                 * start_func,
46                    void                 * start_args );
47
48/*********************************************************************************************
49 * This blocking function causes the calling thread to wait for the termination of a target
50 * thread identified by the <trdid> argument. The <exit_value> defines the buffer to store
51 * the pointer returned by the terminating thread.
52 *********************************************************************************************
53 * @ trdid       : target thread identifier in process.
54 * @ start_args  : [in]  pointer on start function arguments.
55 * @ return 0 if success / return -1 if failure.
56 ********************************************************************************************/
57int pthread_join( pthread_t    trdid,
58                  void      ** exit_value );
59
60/*********************************************************************************************
61 * This function is used to indicate that storage for the target thread, identified by the
62 * <trdid> argument can be reclaimed when the thread terminates.
63 * If target thread has not terminated, pthread_detach() will not cause it to terminate.
64 *********************************************************************************************
65 * @ trdid       : target thread identifier in process.
66 * @ return 0 if success / return -1 if failure.
67 ********************************************************************************************/
68int pthread_detach( pthread_t   trdid );
69
70/*********************************************************************************************
71 * This function terminates the execution of the calling thread, and makes the exit_value
72 * pointer available to any successful pthread_join() with the terminating thread.
73 *********************************************************************************************
74 * @ exit_vallue  : [in] pointer to be returned to parent thread if thead is attached.
75 * @ return 0 if success / return -1 if failure.
76 ********************************************************************************************/
77int pthread_exit( void * exit_value );
78
79/*********************************************************************************************
80 * This function calls the scheduler for the core running the calling thread.
81 * WARNING: It is not defined by POSIX.
82 *********************************************************************************************
83 * @ return always 0.
84 ********************************************************************************************/
85int pthread_yield();
86
87//////////////////////////////////////////////////////////////////////////////////////////////
88//                 POSIX Barriers related functions
89//
90// These functions are implemented in user space. Only the pthread_barrier_init() function
91// uses syscalls to build the distributed quad-tree infrastructure.
92//////////////////////////////////////////////////////////////////////////////////////////////
93
94/*********************************************************************************************
95 * These structures defines a hierarchical, POSIX compliant, barrier.
96 * - If the barrier attribute in the pthread_barrier_init() is NULL, it is implemented
97 *   as a simple, sense reversing barrier, localised in the calling thread cluster.
98 * - If the barrier attribute is defined, it is implemented as a hierarchical, physically
99 *   distributed quad-tree, covering all clusters specified, with the following constraints:
100 *   . The involved clusters form a mesh [x_size * y_size]
101 *   . The lower left involved cluster is cluster(0,0) 
102 *   . The number of threads in a cluster is the same in all clusters.
103 *
104 * Implementation note:
105 * - The quad three is implemented as a three dimensions array of node[x][y][l]
106 *   . [x][y] are the cluster coordinates / max values are (QDT_XMAX-1), (QDT_YMAX-1)
107 *   . [l] is the node level / 0 for terminal nodes / (QDT_LMAX-1) for the root node
108 ********************************************************************************************/
109
110#define  QDT_XMAX    16                /*! max number of clusters in a row                  */
111#define  QDT_YMAX    16                /*! max number of clusters in a column               */
112#define  QDT_LMAX    5                 /*! max depth of the quad tree                       */
113#define  QDT_YWIDTH  4                 /*! Y field in cxy, for cxy <=> (x,y) translation    */
114#define  QDT_YMASK   0xF               /*! Y field in cxy, for cxy <=> (x,y) translation    */
115
116typedef struct sqt_node_s
117{
118    volatile unsigned int sense;       /*! barrier state (toggle)                           */
119    volatile unsigned int count;       /*! number of not arrived tasks                      */
120    unsigned int          arity;       /*! number of locally expected tasks                 */
121    unsigned int          level;       /*! hierarchical level (0 is bottom)                 */
122    struct sqt_node_s   * parent;      /*! pointer on parent node (NULL for root)           */
123    struct sqt_node_s   * child[4];    /*! pointer on children node (NULL for bottom)       */
124}
125sqt_node_t;
126
127typedef struct pthread_barrier_s
128{
129    sqt_node_t          * node[QDT_XMAX][QDT_YMAX][QDT_LMAX];
130}
131pthread_barrier_t;
132
133typedef struct pthread_barrierattr_s
134{
135    unsigned int          x_size;      /*! number of clusters in a row (0 to x_size-1)      */
136    unsigned int          y_size;      /*! number of clusters in a column (0 to y_size-1)   */
137    unsigned int          nthreads;    /*! number of expected threads in a cluster          */
138}
139pthread_barrierattr_t;
140
141/*********************************************************************************************
142 * This function allocates resources required to use the barrier referenced by the <barrier>
143 * argument, and initializes the barrier from attributes referenced by the <attr> argument.
144 * If <attr> is NULL, the default barrier attributes shall be used.
145 * The results are undefined if pthread_barrier_init() is called when any thread is blocked
146 * on the barrier, or is used without first being initialized, or if pthread_barrier_init()
147 * is called specifying an already initialized barrier.
148 *********************************************************************************************
149 * @ barrier     : [in]  pointer on barrier in user space.
150 * @ attr        : [in]  pointer on attributes structure.
151 * @ count       : [in]  number of expected threads.
152 * @ return 0 if success / return EINVAL if illegal attributes.
153 ********************************************************************************************/
154int pthread_barrier_init( pthread_barrier_t           * barrier,
155                          const pthread_barrierattr_t * attr,
156                          unsigned int                  count ); 
157
158/*********************************************************************************************
159 * This function synchronizes participating threads at the barrier referenced by <barrier>.
160 * The calling is blocked until the required number of threads have called the function
161 * pthread_barrier_wait() specifying the barrier.
162 * When the required number of threads have called pthread_barrier_wait(), the constant
163 * PTHREAD_BARRIER_SERIAL_THREAD is returned to one unspecified thread and zero is returned
164 * to each of the remaining threads.
165 *********************************************************************************************
166 * @ barrier     : [in]  pointer on barrier in user space.
167 * @ return 0 if success / return EINVAL if the barrier was not properly initialized.
168 ********************************************************************************************/
169int pthread_barrier_wait( pthread_barrier_t * barrier );
170
171/*********************************************************************************************
172 * This function destroy the barrier referenced by <barrier> and release all resources used
173 * by the barrier. The effect of subsequent use of the barrier is undefined until the barrier
174 * is reinitialized by another call to pthread_barrier_init().
175 * An implementation may use this function to set barrier to an invalid value.
176 * The results are undefined if pthread_barrier_destroy() is called when a thread is blocked
177 * on the barrier, or if this function is called with an uninitialized barrier.
178 *********************************************************************************************
179 * @ barrier     : [in]  pointer on barrier in user space.
180 ********************************************************************************************/
181int pthread_barrier_destroy( pthread_barrier_t * barrier );
182   
183
184//////////////////////////////////////////////////////////////////////////////////////////////
185//                      POSIX Mutexes
186//
187// These functions are implemented in user space, and do not use syscalls.
188// This implementation uses a ticket based policy to enforce fairness.
189//////////////////////////////////////////////////////////////////////////////////////////////
190
191typedef struct pthread_mutex_s
192{
193    volatile unsigned int current;   /*! current index                                      */
194    volatile unsigned int free;      /*! next free ticket index                             */
195}
196pthread_mutex_t;
197
198typedef struct pthread_mutexattr_s
199{
200    int          bloup;              /*! unused                                             */
201}
202pthread_mutexattr_t;
203
204/*********************************************************************************************
205 * This function initialise the mutex identified by the <mutex> argument.
206 * The <attr> argument is not supported yet, and must be NULL.
207 *********************************************************************************************
208 * @ mutex     : pointer on mutex in user space.
209 * @ attr      : pointer on attributes structure / must be NULL.
210 * @ return 0 if success / return -1 if failure.
211 ********************************************************************************************/
212int pthread_mutex_init( pthread_mutex_t           * mutex,
213                        const pthread_mutexattr_t * attr );
214
215/*********************************************************************************************
216 * This function destroy the mutex identified by the <mutex> argument.
217 *********************************************************************************************
218 * @ mutex     : pointer on mutex in user space.
219 * @ return 0 if success / return -1 if failure.
220 ********************************************************************************************/
221int pthread_mutex_destroy( pthread_mutex_t * mutex );
222
223/*********************************************************************************************
224 * This bloking function locks the mutex identified by the <mutex> argument,
225 * and blocks until it becomes available.
226 *********************************************************************************************
227 * @ mutex     : pointer on mutex in user space.
228 * @ return 0 if success / return -1 if failure.
229 ********************************************************************************************/
230int pthread_mutex_lock( pthread_mutex_t * mutex );
231
232/*********************************************************************************************
233 * This function tries to lock the mutex identified by the <mutex> argument,
234 * but don't block if the mutex is locked by another thread, including the current thread.
235 *********************************************************************************************
236 * @ mutex     : pointer on mutex in user space.
237 * @ return 0 if success / return -1 if mutex already taken.
238 ********************************************************************************************/
239int pthread_mutex_trylock( pthread_mutex_t * mutex );
240
241/*********************************************************************************************
242 * This function unlocks the mutex identified by the <mutex> argument.
243 *********************************************************************************************
244 * @ mutex     : pointer on mutex in user space.
245 * @ return 0 if success / return -1 if failure.
246 ********************************************************************************************/
247int pthread_mutex_unlock( pthread_mutex_t * mutex );
248
249
250#endif  // _PTHREAD_H_
Note: See TracBrowser for help on using the repository browser.