* gpgme.texi (Key Listing Mode): Doc KEYLIST_MODE_VALIDATE.
[gpgme.git] / gpgme / sema.h
1 /* sema.h - Definitions for semaphores.
2    Copyright (C) 2000 Werner Koch (dd9jn)
3    Copyright (C) 2001, 2003 g10 Code GmbH
4
5    This file is part of GPGME.
6  
7    GPGME is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11  
12    GPGME is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16  
17    You should have received a copy of the GNU General Public License
18    along with GPGME; if not, write to the Free Software Foundation,
19    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #ifndef SEMA_H
22 #define SEMA_H
23
24 struct critsect_s
25 {
26   const char *name;
27   void *private;
28 };
29
30 #define DEFINE_GLOBAL_LOCK(name) \
31   struct critsect_s name = { #name, NULL }
32 #define DEFINE_STATIC_LOCK(name) \
33   static struct critsect_s name  = { #name, NULL }
34
35 #define DECLARE_LOCK(name) \
36   struct critsect_s name
37 #define INIT_LOCK(a)                    \
38   do                                    \
39     {                                   \
40       (a).name = #a;                    \
41       (a).private = NULL;               \
42     }                                   \
43   while (0)
44 #define DESTROY_LOCK(name) _gpgme_sema_cs_destroy (&(name))
45                        
46
47 #define LOCK(name)                      \
48   do                                    \
49     {                                   \
50       _gpgme_sema_cs_enter (&(name));   \
51     }                                   \
52   while (0)
53
54 #define UNLOCK(name)                    \
55   do                                    \
56     {                                   \
57       _gpgme_sema_cs_leave (&(name));   \
58     }                                   \
59   while (0)
60
61 void _gpgme_sema_subsystem_init (void);
62 void _gpgme_sema_cs_enter (struct critsect_s *s);
63 void _gpgme_sema_cs_leave (struct critsect_s *s);
64 void _gpgme_sema_cs_destroy (struct critsect_s *s);
65
66 #endif /* SEMA_H */