Really add file.
[gpgme.git] / src / ath-pth.c
1 /* ath-pth.c - Pth module for self-adapting thread-safeness library
2    Copyright (C) 2002, 2003, 2004 g10 Code GmbH
3
4    This file is part of GPGME.
5  
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Lesser General Public License as
8    published by the Free Software Foundation; either version 2.1 of
9    the License, or (at your option) any later version.
10    
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15    
16    You should have received a copy of the GNU Lesser General Public
17    License along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.  */
20
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdlib.h>
27 #include <errno.h>
28
29 #include <pth.h>
30
31 #include "ath.h"
32
33
34 /* The lock we take while checking for lazy lock initialization.  */
35 static pth_mutex_t check_init_lock = PTH_MUTEX_INIT;
36
37 /* Initialize the mutex *PRIV.  If JUST_CHECK is true, only do this if
38    it is not already initialized.  */
39 static int
40 mutex_pth_init (ath_mutex_t *priv, int just_check)
41 {
42   int err = 0;
43
44   if (just_check)
45     pth_mutex_acquire (&check_init_lock, 0, NULL);
46   if (!*priv || !just_check)
47     {
48       pth_mutex_t *lock = malloc (sizeof (pth_mutex_t));
49       if (!lock)
50         err = ENOMEM;
51       if (!err)
52         {
53           err = pth_mutex_init (lock);
54           if (err == FALSE)
55             err = errno;
56           else
57             err = 0;
58
59           if (err)
60             free (lock);
61           else
62             *priv = (ath_mutex_t) lock;
63         }
64     }
65   if (just_check)
66     pth_mutex_release (&check_init_lock);
67   return err;
68 }
69
70
71 void
72 ath_init (void)
73 {
74   /* Nothing to do.  */
75 }
76
77
78 int
79 ath_mutex_init (ath_mutex_t *lock)
80 {
81   return mutex_pth_init (lock, 0);
82 }
83
84
85 int
86 ath_mutex_destroy (ath_mutex_t *lock)
87 {
88   int err = mutex_pth_init (lock, 1);
89   if (!err)
90     {
91       /* GNU Pth has no destructor function.  */
92       free (*lock);
93     }
94   return err;
95 }
96
97
98 int
99 ath_mutex_lock (ath_mutex_t *lock)
100 {
101   int ret = mutex_pth_init (lock, 1);
102   if (ret)
103     return ret;
104
105   ret = pth_mutex_acquire ((pth_mutex_t *) *lock, 0, NULL);
106   return ret == FALSE ? errno : 0;
107 }
108
109
110 int
111 ath_mutex_unlock (ath_mutex_t *lock)
112 {
113   int ret = mutex_pth_init (lock, 1);
114   if (ret)
115     return ret;
116
117   ret = pth_mutex_release ((pth_mutex_t *) *lock);
118   return ret == FALSE ? errno : 0;
119 }
120
121
122 ssize_t
123 ath_read (int fd, void *buf, size_t nbytes)
124 {
125   return pth_read (fd, buf, nbytes);
126 }
127
128
129 ssize_t
130 ath_write (int fd, const void *buf, size_t nbytes)
131 {
132   return pth_write (fd, buf, nbytes);
133 }
134
135
136 ssize_t
137 ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
138             struct timeval *timeout)
139 {
140   return pth_select (nfd, rset, wset, eset, timeout);
141 }
142
143  
144 ssize_t
145 ath_waitpid (pid_t pid, int *status, int options)
146 {
147   return pth_waitpid (pid, status, options);
148 }
149
150
151 int
152 ath_accept (int s, struct sockaddr *addr, socklen_t *length_ptr)
153 {
154   return pth_accept (s, addr, length_ptr);
155 }
156
157
158 int
159 ath_connect (int s, const struct sockaddr *addr, socklen_t length)
160 {
161   return pth_connect (s, addr, length);
162 }
163
164 int
165 ath_sendmsg (int s, const struct msghdr *msg, int flags)
166 {
167   /* FIXME: GNU Pth is missing pth_sendmsg.  */
168   return sendmsg (s, msg, flags);
169 }
170
171
172 int
173 ath_recvmsg (int s, struct msghdr *msg, int flags)
174 {
175   /* FIXME: GNU Pth is missing pth_recvmsg.  */
176   return recvmsg (s, msg, flags);
177 }
178