* ath.c: Include sys.time.h if sys/select.h does not exist.
[libgcrypt.git] / src / ath.h
1 /* ath.h - interfaces for self-adapting thread-safeness library
2  *      Copyright (C) 2002 g10 Code GmbH
3  *      Copyright (C) 2002 Free Software Foundation, Inc.
4  *
5  * This file is part of Libgcrypt.
6  *
7  * Libgcrypt is free software; you can redistribute it and/or modify
8  * it 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  * Libgcrypt is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU 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 #ifndef ATH_H
23 #define ATH_H
24
25 #include <sys/types.h>
26
27 #ifdef HAVE_DOSISH_SYSTEM
28 # include <windows.h> /* for fd_set */
29 # include <process.h> /* for pid_t */
30   typedef unsigned int ssize_t;
31 #endif
32
33 /* Define ATH_EXT_SYM_PREFIX if you want to give all external symbols
34    a prefix.  */
35 #define ATH_EXT_SYM_PREFIX _gcry_
36
37 #ifdef ATH_EXT_SYM_PREFIX
38 #define ATH_PREFIX1(x,y) x ## y
39 #define ATH_PREFIX2(x,y) ATH_PREFIX1(x,y)
40 #define ATH_PREFIX(x) ATH_PREFIX2(ATH_EXT_SYM_PREFIX,x)
41 #define ath_init ATH_PREFIX(ath_init)
42 #define ath_deinit ATH_PREFIX(ath_deinit)
43 #define ath_mutex_init ATH_PREFIX(ath_mutex_init)
44 #define ath_mutex_destroy ATH_PREFIX(ath_mutex_destroy)
45 #define ath_mutex_lock ATH_PREFIX(ath_mutex_lock)
46 #define ath_mutex_unlock ATH_PREFIX(ath_mutex_unlock)
47 #define ath_read ATH_PREFIX(ath_read)
48 #define ath_write ATH_PREFIX(ath_write)
49 #define ath_select ATH_PREFIX(ath_select)
50 #define ath_waitpid ATH_PREFIX(ath_waitpid)
51 #define ath_pthread_available ATH_PREFIX(ath_pthread_available)
52 #define ath_pth_available ATH_PREFIX(ath_pth_available)
53 #endif
54
55 \f
56 typedef void *ath_mutex_t;
57 #define ATH_MUTEX_INITIALIZER 0;
58
59 /* Functions for mutual exclusion.  */
60 int ath_mutex_init (ath_mutex_t *mutex);
61 int ath_mutex_destroy (ath_mutex_t *mutex);
62 int ath_mutex_lock (ath_mutex_t *mutex);
63 int ath_mutex_unlock (ath_mutex_t *mutex);
64
65 /* Replacement for the POSIX functions, which can be used to allow
66    other (user-level) threads to run.  */
67 ssize_t ath_read (int fd, void *buf, size_t nbytes);
68 ssize_t ath_write (int fd, const void *buf, size_t nbytes);
69 ssize_t ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
70                     struct timeval *timeout);
71 ssize_t ath_waitpid (pid_t pid, int *status, int options);
72
73 \f
74 struct ath_ops
75 {
76   int (*mutex_init) (void **priv, int just_check);
77   int (*mutex_destroy) (void *priv);
78   int (*mutex_lock) (void *priv);
79   int (*mutex_unlock) (void *priv);
80   ssize_t (*read) (int fd, void *buf, size_t nbytes);
81   ssize_t (*write) (int fd, const void *buf, size_t nbytes);
82   ssize_t (*select) (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
83                      struct timeval *timeout);
84   ssize_t (*waitpid) (pid_t pid, int *status, int options);
85 };
86
87 /* Initialize the any-thread package.  */
88 void ath_init (void);
89 void ath_deinit (void);
90
91 /* Used by ath_pkg_init.  */
92 struct ath_ops *ath_pthread_available (void);
93 struct ath_ops *ath_pth_available (void);
94 struct ath_ops *ath_dummy_available (void);
95
96 #endif  /* ATH_H */