2002-08-21 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_PREFIX1(x,y) x ## y
32 #define ATH_PREFIX2(x,y) ATH_PREFIX1(x,y)
33 #define ATH_PREFIX(x) ATH_PREFIX2(ATH_EXT_SYM_PREFIX,x)
34 #define ath_init ATH_PREFIX(ath_init)
35 #define ath_mutex_init ATH_PREFIX(ath_mutex_init)
36 #define ath_mutex_destroy ATH_PREFIX(ath_mutex_destroy)
37 #define ath_mutex_lock ATH_PREFIX(ath_mutex_lock)
38 #define ath_mutex_unlock ATH_PREFIX(ath_mutex_unlock)
39 #define ath_read ATH_PREFIX(ath_read)
40 #define ath_write ATH_PREFIX(ath_write)
41 #define ath_select ATH_PREFIX(ath_select)
42 #define ath_waitpid ATH_PREFIX(ath_waitpid)
43 #define ath_pthread_available ATH_PREFIX(ath_pthread_available)
44 #define ath_pth_available ATH_PREFIX(ath_pth_available)
45 #endif
46
47 \f
48 typedef void *ath_mutex_t;
49 #define ATH_MUTEX_INITIALIZER 0;
50
51 /* Functions for mutual exclusion.  */
52 int ath_mutex_init (ath_mutex_t *mutex);
53 int ath_mutex_destroy (ath_mutex_t *mutex);
54 int ath_mutex_lock (ath_mutex_t *mutex);
55 int ath_mutex_unlock (ath_mutex_t *mutex);
56
57 /* Replacement for the POSIX functions, which can be used to allow
58    other (user-level) threads to run.  */
59 ssize_t ath_read (int fd, void *buf, size_t nbytes);
60 ssize_t ath_write (int fd, const void *buf, size_t nbytes);
61 ssize_t ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
62                     struct timeval *timeout);
63 ssize_t ath_waitpid (pid_t pid, int *status, int options);
64
65 \f
66 struct ath_ops
67 {
68   int (*mutex_init) (void **priv, int just_check);
69   int (*mutex_destroy) (void *priv);
70   int (*mutex_lock) (void *priv);
71   int (*mutex_unlock) (void *priv);
72   ssize_t (*read) (int fd, void *buf, size_t nbytes);
73   ssize_t (*write) (int fd, const void *buf, size_t nbytes);
74   ssize_t (*select) (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
75                      struct timeval *timeout);
76   ssize_t (*waitpid) (pid_t pid, int *status, int options);
77 };
78
79 /* Initialize the any-thread package.  */
80 void ath_init (void);
81
82 /* Used by ath_pkg_init.  */
83 struct ath_ops *ath_pthread_available (void);
84 struct ath_ops *ath_pth_available (void);
85 struct ath_ops *ath_dummy_available (void);
86
87 #endif  /* ATH_H */