1 /* Copyright (C) 2001 by First Peer, Inc. All rights reserved.
2 **
3 ** Redistribution and use in source and binary forms, with or without
4 ** modification, are permitted provided that the following conditions
5 ** are met:
6 ** 1. Redistributions of source code must retain the above copyright
7 **    notice, this list of conditions and the following disclaimer.
8 ** 2. Redistributions in binary form must reproduce the above copyright
9 **    notice, this list of conditions and the following disclaimer in the
10 **    documentation and/or other materials provided with the distribution.
11 ** 3. The name of the author may not be used to endorse or promote products
12 **    derived from this software without specific prior written permission.
13 **
14 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ** ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 ** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 ** SUCH DAMAGE. */
25 
26 #ifndef PTHREADX_H_INCLUDED
27 #define PTHREADX_H_INCLUDED
28 
29 #include "xmlrpc_config.h"
30 
31 #if HAVE_PTHREAD
32 #  define _REENTRANT
33 #  include <pthread.h>
34 #elif HAVE_WINDOWS_THREAD
35 #include <windows.h>
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 typedef HANDLE pthread_t;
42 typedef CRITICAL_SECTION pthread_mutex_t;
43 
44 #define PTHREAD_MUTEX_INITIALIZER NULL
45     /* usage: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; */
46 
47 typedef
48 struct {
49     int attrs; /* currently unused. placeholder. */
50 } pthread_attr_t;
51 
52 typedef
53 struct {
54     int attrs; /* currently unused. placeholder. */
55 } pthread_mutexattr_t;
56 
57 typedef void * pthread_func(void *);
58 
59 extern int pthread_create(pthread_t *            const new_thread_ID,
60                           const pthread_attr_t * const attr,
61                           pthread_func * start_func,
62                           void *                 const arg);
63 extern int pthread_cancel(pthread_t target_thread);
64 extern int pthread_join(pthread_t target_thread, void **status);
65 extern int pthread_detach(pthread_t target_thread);
66 
67 extern int pthread_mutex_init(pthread_mutex_t *           const mp,
68                               const pthread_mutexattr_t * const attr);
69 extern int pthread_mutex_lock(pthread_mutex_t * const mp);
70 extern int pthread_mutex_unlock(pthread_mutex_t * const mp);
71 extern int pthread_mutex_destroy(pthread_mutex_t * const mp);
72 
73 #ifdef __cplusplus
74 }
75 #endif
76 #else  /* HAVE_WINDOWS_THREAD */
77   #error "You don't have any thread facility.  (According to "
78   #error "HAVE_PTHREAD and HAVE_WINDOWS_THREAD macros defined in "
79   #error "xmlrpc_config.h)"
80 #endif
81 
82 #endif
83