bcd82659ca5da5100fa0e48fe31333a9d6b5102f
[gnupg.git] / jnlib / w32-pth.h
1 /* w32-pth.h - GNU Pth emulation for W32 (MS Windows).
2  * Copyright (c) 1999-2003 Ralf S. Engelschall <rse@engelschall.com>
3  * Copyright (C) 2004 g10 Code GmbH
4  *
5  * This file is part of GnuPG.
6  *
7  * GnuPG is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * GnuPG is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 
20  *
21  * ------------------------------------------------------------------
22  * This code is based on Ralf Engelschall's GNU Pth, a non-preemptive
23  * thread scheduling library which can be found at
24  * http://www.gnu.org/software/pth/.
25  */
26
27 /* Note that this header is usually used through a symlinked pth.h
28    file.  This is needed so that we don't have a pth.h file here which
29    would conflict if a system really has pth available. */
30 #ifndef W32_PTH_H
31 #define W32_PTH_H
32
33 #include <windows.h>  /* We need this for sockaddr et al.  FIXME: too
34                          heavyweight - may be we should factor such
35                          code out to a second header and adjust all
36                          user files to include it only if required. */ 
37
38 #ifndef W32_PTH_HANDLE_INTERNAL
39 #define W32_PTH_HANDLE_INTERNAL  int
40 #endif
41
42
43 /* Filedescriptor blocking modes.  */
44 enum
45   {
46     PTH_FDMODE_ERROR = -1,
47     PTH_FDMODE_POLL  =  0,
48     PTH_FDMODE_BLOCK,
49     PTH_FDMODE_NONBLOCK
50   };
51
52
53 /* Mutex values. */
54 #define PTH_MUTEX_INITIALIZED  (1<<0)
55 #define PTH_MUTEX_LOCKED       (1<<1)
56 #define PTH_MUTEX_INIT         {PTH_MUTEX_INITIALIZED}
57
58
59 #define PTH_KEY_INIT           (1<<0)
60
61
62 /* Event subject classes. */
63 #define PTH_EVENT_FD           (1<<1)
64 #define PTH_EVENT_SELECT       (1<<2)
65 #define PTH_EVENT_SIGS         (1<<3)
66 #define PTH_EVENT_TIME         (1<<4)
67 #define PTH_EVENT_MSG          (1<<5)
68 #define PTH_EVENT_MUTEX        (1<<6)
69 #define PTH_EVENT_COND         (1<<7)
70 #define PTH_EVENT_TID          (1<<8)
71 #define PTH_EVENT_FUNC         (1<<9)
72
73
74
75 /* Event occurrence restrictions. */
76 #define PTH_UNTIL_OCCURRED     (1<<11)
77 #define PTH_UNTIL_FD_READABLE  (1<<12)
78 #define PTH_UNTIL_FD_WRITEABLE (1<<13)
79 #define PTH_UNTIL_FD_EXCEPTION (1<<14)
80 #define PTH_UNTIL_TID_NEW      (1<<15)
81 #define PTH_UNTIL_TID_READY    (1<<16)
82 #define PTH_UNTIL_TID_WAITING  (1<<17)
83 #define PTH_UNTIL_TID_DEAD     (1<<18)
84
85
86 /* Event structure handling modes. */
87 #define PTH_MODE_REUSE         (1<<20)
88 #define PTH_MODE_CHAIN         (1<<21)
89 #define PTH_MODE_STATIC        (1<<22)
90
91
92 /* Attribute commands for pth_attr_get and pth_attr_set(). */
93 enum
94   {
95     PTH_ATTR_PRIO,           /* RW [int]           Priority of thread.  */
96     PTH_ATTR_NAME,           /* RW [char *]        Name of thread.  */
97     PTH_ATTR_JOINABLE,       /* RW [int]           Thread detachment type.  */
98     PTH_ATTR_CANCEL_STATE,   /* RW [unsigned int]  Thread cancellation state.*/
99     PTH_ATTR_STACK_SIZE,     /* RW [unsigned int]  Stack size. */
100     PTH_ATTR_STACK_ADDR,     /* RW [char *]        Stack lower address. */
101     PTH_ATTR_DISPATCHES,     /* RO [int]           Total number of
102                                                    thread dispatches. */
103     PTH_ATTR_TIME_SPAWN,     /* RO [pth_time_t]    Time thread was spawned.  */
104     PTH_ATTR_TIME_LAST,      /* RO [pth_time_t]    Time thread was
105                                                    last dispatched.  */
106     PTH_ATTR_TIME_RAN,       /* RO [pth_time_t]    Time thread was running.  */
107     PTH_ATTR_START_FUNC,     /* RO [void *(*)(void *)] Thread start function.*/
108     PTH_ATTR_START_ARG,      /* RO [void *]        Thread start argument.  */
109     PTH_ATTR_STATE,          /* RO [pth_state_t]   Scheduling state. */
110     PTH_ATTR_EVENTS,         /* RO [pth_event_t]   Events the thread 
111                                                    is waiting for.  */
112     PTH_ATTR_BOUND           /* RO [int]           Whether object is 
113                                                    bound to thread. */
114   };
115
116
117
118 /* Queries for pth_ctrl(). */
119 #define PTH_CTRL_GETAVLOAD            (1<<1)
120 #define PTH_CTRL_GETPRIO              (1<<2)
121 #define PTH_CTRL_GETNAME              (1<<3)
122 #define PTH_CTRL_GETTHREADS_NEW       (1<<4)
123 #define PTH_CTRL_GETTHREADS_READY     (1<<5)
124 #define PTH_CTRL_GETTHREADS_RUNNING   (1<<6)
125 #define PTH_CTRL_GETTHREADS_WAITING   (1<<7)
126 #define PTH_CTRL_GETTHREADS_SUSPENDED (1<<8)
127 #define PTH_CTRL_GETTHREADS_DEAD      (1<<9)
128 #define PTH_CTRL_DUMPSTATE            (1<<10)
129
130 #define PTH_CTRL_GETTHREADS           (  PTH_CTRL_GETTHREADS_NEW       \
131                                        | PTH_CTRL_GETTHREADS_READY     \
132                                        | PTH_CTRL_GETTHREADS_RUNNING   \
133                                        | PTH_CTRL_GETTHREADS_WAITING   \
134                                        | PTH_CTRL_GETTHREADS_SUSPENDED \
135                                        | PTH_CTRL_GETTHREADS_DEAD        )
136
137
138 /* Event status codes. */
139 typedef enum
140   {
141     PTH_STATUS_PENDING,
142     PTH_STATUS_OCCURRED,
143     PTH_STATUS_FAILED
144   }
145 pth_status_t;
146
147
148 /* Event deallocation types. */
149 enum 
150   {
151     PTH_FREE_THIS,
152     PTH_FREE_ALL 
153   };
154
155
156 /* The Pth thread handle object.  */
157 typedef void *pth_t;
158
159
160 /* The Mutex object.  */
161 struct pth_mutex_s 
162 {
163   unsigned mx_state;
164   W32_PTH_HANDLE_INTERNAL mx; 
165 };
166 typedef struct pth_mutex_s pth_mutex_t;
167
168
169 /* The Event object.  */
170 struct pth_event_s;
171 typedef struct pth_event_s *pth_event_t;
172
173
174 /* The Attribute object.  */
175 struct pth_attr_s;
176 typedef struct pth_attr_s *pth_attr_t;
177
178
179 /* The Key object.  */
180 typedef int pth_key_t;
181
182
183 /* The Pth time object.  */
184 typedef struct timeval pth_time_t;
185
186
187 /* Function prototypes. */
188 int pth_init (void);
189 int pth_kill (void);
190 long pth_ctrl (unsigned long query, ...);
191
192 int pth_read_ev (int fd, void *buffer, size_t size, pth_event_t ev);
193 int pth_read (int fd,  void *buffer, size_t size);
194 int pth_write_ev (int fd, const void *buffer, size_t size, pth_event_t ev);
195 int pth_write (int fd, const void *buffer, size_t size);
196
197 int pth_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds,
198                 const struct timeval *timeout);
199
200 int pth_accept (int fd, struct sockaddr *addr, int *addrlen);
201 int pth_accept_ev (int fd, struct sockaddr *addr, int *addrlen,
202                    pth_event_t hd);
203
204 int pth_connect (int fd, struct sockaddr *name, int namelen);
205
206
207 int pth_mutex_release (pth_mutex_t *hd);
208 int pth_mutex_acquire(pth_mutex_t *hd, int try_only, pth_event_t ev_extra);
209 int pth_mutex_init (pth_mutex_t *hd);
210
211
212 pth_attr_t pth_attr_new (void);
213 int pth_attr_destroy (pth_attr_t hd);
214 int pth_attr_set (pth_attr_t hd, int field, ...);
215
216 pth_t pth_spawn (pth_attr_t hd, void *(*func)(void *), void *arg);
217 int pth_join (pth_t hd, void **value);
218 int pth_abort (pth_t hd);
219 void pth_exit (void *value);
220
221 unsigned int pth_waitpid (unsigned int, int *status, int options);
222 int pth_wait (pth_event_t hd);
223
224 int pth_sleep (int n);
225 pth_time_t pth_timeout (long sec, long usec);
226
227
228
229 pth_event_t pth_event_isolate (pth_event_t hd);
230 int pth_event_free (pth_event_t hd, int mode);
231 int pth_event_status (pth_event_t hd);
232 int pth_event_occurred (pth_event_t hd);
233 pth_event_t pth_event_concat (pth_event_t ev, ...);
234 pth_event_t pth_event (unsigned long spec, ...);
235
236
237
238 /*-- pth_util.c --*/
239
240 /* void sigemptyset (struct sigset_s * ss); */
241
242 /* int sigaddset (struct sigset_s * ss, int signo); */
243
244
245
246 #endif /*W32_PTH_H*/