2002-06-02 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / ath.h
1 /* ath.h - interfaces for self-adapting thread-safeness library
2  *      Copyright (C) 2002 g10 Code GmbH
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GPGME is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #ifndef ATH_H
22 #define ATH_H
23
24 #include <sys/types.h>
25
26 /* Define ATH_EXT_SYM_PREFIX if you want to give all external symbols
27    a prefix.  */
28 /* #define ATH_EXT_SYM_PREFIX _gpgme_ */
29
30 #ifdef ATH_EXT_SYM_PREFIX
31 #define ath_pkg_init MUTEX_EXT_SYM_PREFIX##ath_pkg_init
32 #define ath_mutex_init MUTEX_EXT_SYM_PREFIX##ath_mutex_init
33 #define ath_mutex_destroy MUTEX_EXT_SYM_PREFIX##ath_mutex_destroy
34 #define ath_mutex_lock MUTEX_EXT_SYM_PREFIX##ath_mutex_lock
35 #define ath_mutex_pthread_available \
36   MUTEX_EXT_SYM_PREFIX##ath_mutex_pthread_available
37 #define ath_mutex_pth_available \
38   MUTEX_EXT_SYM_PREFIX##ath_mutex_pth_available
39 #define ath_mutex_dummy_available \
40   MUTEX_EXT_SYM_PREFIX##ath_mutex_dummy_available
41 #define ath_read MUTEX_EXT_SYM##ath_read
42 #define ath_write MUTEX_EXT_SYM##ath_write
43 #define ath_select MUTEX_EXT_SYM##ath_select
44 #define ath_waitpid MUTEX_EXT_SYM##ath_waitpid
45 #define ath_mutex_pthread_available \
46   MUTEX_EXT_SYM_PREFIX##ath_mutex_pthread_available
47 #define ath_mutex_pthr_available \
48   MUTEX_EXT_SYM_PREFIX##ath_mutex_pthr_available
49 #define ath_mutex_dummy_available \
50   MUTEX_EXT_SYM_PREFIX##ath_mutex_dummy_available
51 #endif
52
53 \f
54 typedef void *ath_mutex_t;
55 #define ATH_MUTEX_INITIALIZER 0;
56
57 /* Functions for mutual exclusion.  */
58 int ath_mutex_init (ath_mutex_t *mutex);
59 int ath_mutex_destroy (ath_mutex_t *mutex);
60 int ath_mutex_lock (ath_mutex_t *mutex);
61 int ath_mutex_unlock (ath_mutex_t *mutex);
62
63 /* Replacement for the POSIX functions, which can be used to allow
64    other (user-level) threads to run.  */
65 ssize_t ath_read (int fd, void *buf, size_t nbytes);
66 ssize_t ath_write (int fd, const void *buf, size_t nbytes);
67 ssize_t ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
68                     struct timeval *timeout);
69 ssize_t ath_waitpid (pid_t pid, int *status, int options);
70
71 \f
72 struct ath_ops
73 {
74   int (*mutex_init) (void **priv, int just_check);
75   int (*mutex_destroy) (void *priv);
76   int (*mutex_lock) (void *priv);
77   int (*mutex_unlock) (void *priv);
78   ssize_t (*read) (int fd, void *buf, size_t nbytes);
79   ssize_t (*write) (int fd, const void *buf, size_t nbytes);
80   ssize_t (*select) (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
81                      struct timeval *timeout);
82   ssize_t (*waitpid) (pid_t pid, int *status, int options);
83 };
84
85 /* Initialize the any-thread package.  */
86 void ath_init (void);
87
88 /* Used by ath_pkg_init.  */
89 struct ath_ops *ath_pthread_available (void);
90 struct ath_ops *ath_pth_available (void);
91 struct ath_ops *ath_dummy_available (void);
92
93 #endif  /* ATH_H */