* ath.c: Include sys.time.h if sys/select.h does not exist.
[libgcrypt.git] / src / ath.c
1 /* ath.c - 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 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <unistd.h>
27 #ifndef HAVE_DOSISH_SYSTEM
28 # ifdef HAVE_SYS_SELECT_H
29 #  include <sys/select.h>
30 # else
31 #  include <sys/time.h>
32 # endif
33 # include <sys/types.h>
34 # include <sys/wait.h>
35 #endif /*HAVE_DOSISH_SYSTEM*/
36
37 #include "ath.h"
38
39 static struct ath_ops *ath_ops;
40
41 void
42 ath_init (void)
43 {
44 #ifdef HAVE_PTHREAD
45   if (!ath_ops)
46     ath_ops = ath_pthread_available ();
47 #endif
48 #ifdef HAVE_PTH
49   if (!ath_ops)
50     ath_ops = ath_pth_available ();
51 #endif
52 #ifdef HAVE_ATH_DUMMY
53   if (!ath_ops)
54     ath_ops = ath_dummy_available ();
55 #endif
56 }
57
58
59 /* This function is in general not very useful but due to some
60    backward compatibiltiy we need ot for gcry_control
61    (GCRYCTL_DISABLE_INTERNAL_LOCKING). */
62 void
63 ath_deinit (void)
64 {
65   /* fixme: We should deallocate the resource. */
66   ath_ops = NULL;
67 }
68
69
70 int
71 ath_mutex_init (ath_mutex_t *lock)
72 {
73   if (!ath_ops)
74     return 0;
75
76   return ath_ops->mutex_init (lock, 0);
77 }
78
79
80 int
81 ath_mutex_destroy (ath_mutex_t *lock)
82 {
83   int err;
84   if (!ath_ops)
85     return 0;
86   err = ath_ops->mutex_init (lock, 1);
87   if (!err)
88     err = ath_ops->mutex_destroy (*lock);
89   return err;
90 }
91
92
93 int
94 ath_mutex_lock (ath_mutex_t *lock)
95 {
96   int err;
97
98   if (!ath_ops)
99     return 0;
100   err = ath_ops->mutex_init (lock, 1);
101   if (!err)
102     err = ath_ops->mutex_lock (*lock);
103   return err;
104 }
105
106
107 int
108 ath_mutex_unlock (ath_mutex_t *lock)
109 {
110   int err;
111
112   if (!ath_ops)
113     return 0;
114   err = ath_ops->mutex_init (lock, 1);
115   if (!err)
116     err = ath_ops->mutex_unlock (*lock);
117   return err;
118 }
119
120
121 ssize_t
122 ath_read (int fd, void *buf, size_t nbytes)
123 {
124   if (ath_ops && ath_ops->read)
125     return ath_ops->read (fd, buf, nbytes);
126   else
127     return read (fd, buf, nbytes);
128 }
129
130
131 ssize_t
132 ath_write (int fd, const void *buf, size_t nbytes)
133 {
134   if (ath_ops && ath_ops->write)
135     return ath_ops->write (fd, buf, nbytes);
136   else
137     return write (fd, buf, nbytes);
138 }
139
140
141 ssize_t
142 ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
143             struct timeval *timeout)
144 {
145 #ifdef HAVE_DOSISH_SYSTEM
146   return 0;
147 #else
148   if (ath_ops && ath_ops->select)
149     return ath_ops->select (nfd, rset, wset, eset, timeout);
150   else
151     return select (nfd, rset, wset, eset, timeout);
152 #endif
153 }
154
155  
156 ssize_t
157 ath_waitpid (pid_t pid, int *status, int options)
158 {
159 #ifdef HAVE_DOSISH_SYSTEM
160   return 0;
161 #else
162   if (ath_ops && ath_ops->waitpid)
163     return ath_ops->waitpid (pid, status, options);
164   else
165     return waitpid (pid, status, options);
166 #endif
167 }