1 | /***************************************
2 | $Revision: 1.20 $
3 |
4 | Example code: A thread.
5 |
6 | Status: NOT REVUED, NOT TESTED
7 |
8 | Authors: Chris Ottrey
9 | Joao Damas
10 |
11 | +html+ <DL COMPACT>
12 | +html+ <DT>Online References:
13 | +html+ <DD><UL>
14 | +html+ </UL>
15 | +html+ </DL>
16 |
17 | ******************/ /******************
18 | Modification History:
19 | ottrey (02/03/1999) Created.
20 | ottrey (08/03/1999) Modified.
21 | ottrey (17/06/1999) Stripped down.
22 | joao (22/06/1999) Redid thread startup
23 | ******************/ /******************
24 | Copyright (c) 1999 RIPE NCC
25 |
26 | All Rights Reserved
27 |
28 | Permission to use, copy, modify, and distribute this software and its
29 | documentation for any purpose and without fee is hereby granted,
30 | provided that the above copyright notice appear in all copies and that
31 | both that copyright notice and this permission notice appear in
32 | supporting documentation, and that the name of the author not be
33 | used in advertising or publicity pertaining to distribution of the
34 | software without specific, written prior permission.
35 |
36 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
37 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
38 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
39 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
40 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
41 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
42 | ***************************************/
43 | #include <pthread.h> /* Posix thread library */
44 | #include <stdio.h>
45 | #include <strings.h>
46 |
47 | #include "thread.h"
48 | #include "socket.h"
49 | #include "protocol_whois.h"
50 | #include "protocol_config.h"
51 | #include "protocol_mirror.h"
52 | #include "constants.h"
53 | #include "server.h"
54 | #include "memwrap.h"
55 |
56 | /*+ String sizes +*/
57 | #define STR_S 63
58 | #define STR_M 255
59 | #define STR_L 1023
60 | #define STR_XL 4095
61 | #define STR_XXL 16383
62 |
63 | //typedef struct th_args {
64 | // void *function;
65 | // int sock;
66 | //} th_args;
67 |
68 |
69 | /* TH_acquire_read_lock() */
70 | /*++++++++++++++++++++++++++++++++++++++
71 |
72 | Aquire a readers lock.
73 |
74 | rw_lock_t *prw_lock Readers writers lock.
75 |
76 | Reference: "Multithreaded Programming Techniques - Prasad p.192"
77 | More:
78 | +html+ <PRE>
79 | Author:
80 | ottrey
81 | +html+ </PRE>
82 | ++++++++++++++++++++++++++++++++++++++*/
83 | void TH_acquire_read_lock(rw_lock_t *prw_lock) {
84 | pthread_mutex_lock(&prw_lock->rw_mutex);
85 |
86 | while (prw_lock->rw_count < 0) {
87 | pthread_cond_wait(&prw_lock->rw_cond, &prw_lock->rw_mutex);
88 | }
89 |
90 | ++prw_lock->rw_count;
91 | pthread_mutex_unlock(&prw_lock->rw_mutex);
92 |
93 | } /* TH_acquire_read_lock() */
94 |
95 | /* TH_release_read_lock() */
96 | /*++++++++++++++++++++++++++++++++++++++
97 |
98 | Release a readers lock.
99 |
100 | rw_lock_t *prw_lock Readers writers lock.
101 |
102 | Reference: "Multithreaded Programming Techniques - Prasad p.192"
103 | More:
104 | +html+ <PRE>
105 | Author:
106 | ottrey
107 | +html+ </PRE>
108 | ++++++++++++++++++++++++++++++++++++++*/
109 | void TH_release_read_lock(rw_lock_t *prw_lock) {
110 | pthread_mutex_lock(&prw_lock->rw_mutex);
111 |
112 | --prw_lock->rw_count;
113 |
114 | if (!prw_lock->rw_count) {
115 | pthread_cond_signal(&prw_lock->rw_cond);
116 | }
117 |
118 | pthread_mutex_unlock(&prw_lock->rw_mutex);
119 |
120 | } /* TH_release_read_lock() */
121 |
122 | /* TH_acquire_write_lock() */
123 | /*++++++++++++++++++++++++++++++++++++++
124 |
125 | Aquire a writers lock.
126 |
127 | rw_lock_t *prw_lock Readers writers lock.
128 |
129 | Reference: "Multithreaded Programming Techniques - Prasad p.192"
130 | More:
131 | +html+ <PRE>
132 | Author:
133 | ottrey
134 | +html+ </PRE>
135 | ++++++++++++++++++++++++++++++++++++++*/
136 | void TH_acquire_write_lock(rw_lock_t *prw_lock) {
137 | pthread_mutex_lock(&prw_lock->rw_mutex);
138 |
139 | while (prw_lock->rw_count != 0) {
140 | pthread_cond_wait(&prw_lock->rw_cond, &prw_lock->rw_mutex);
141 | }
142 |
143 | prw_lock->rw_count = -1;
144 | pthread_mutex_unlock(&prw_lock->rw_mutex);
145 |
146 | } /* TH_acquire_write_lock() */
147 |
148 | /* TH_release_write_lock() */
149 | /*++++++++++++++++++++++++++++++++++++++
150 |
151 | Release a writers lock.
152 |
153 | rw_lock_t *prw_lock Readers writers lock.
154 |
155 | Reference: "Multithreaded Programming Techniques - Prasad p.192"
156 | More:
157 | +html+ <PRE>
158 | Author:
159 | ottrey
160 | +html+ </PRE>
161 | ++++++++++++++++++++++++++++++++++++++*/
162 | void TH_release_write_lock(rw_lock_t *prw_lock) {
163 | pthread_mutex_lock(&prw_lock->rw_mutex);
164 | prw_lock->rw_count = 0;
165 | pthread_mutex_unlock(&prw_lock->rw_mutex);
166 | pthread_cond_broadcast(&prw_lock->rw_cond);
167 |
168 | } /* TH_release_write_lock() */
169 |
170 | /* TH_init_read_write_lock() */
171 | /*++++++++++++++++++++++++++++++++++++++
172 |
173 | Initialize a readers/writers lock.
174 |
175 | rw_lock_t *prw_lock Readers writers lock.
176 |
177 | Side effect: the lock is set to open(?)
178 |
179 | Reference: "Multithreaded Programming Techniques - Prasad p.192"
180 | More:
181 | +html+ <PRE>
182 | Author:
183 | ottrey
184 | +html+ </PRE>
185 | ++++++++++++++++++++++++++++++++++++++*/
186 | void TH_init_read_write_lock(rw_lock_t *prw_lock) {
187 | pthread_mutex_init(&prw_lock->rw_mutex, NULL);
188 | pthread_cond_init(&prw_lock->rw_cond, NULL);
189 | prw_lock->rw_count = 0;
190 |
191 | } /* TH_init_read_write_lock() */
192 |
193 | int TH_get_id(void) {
194 |
195 | return (int)pthread_self();
196 |
197 | } /* TH_get_id() */
198 |
199 | /* TH_to_string() */
200 | char *TH_to_string(void) {
201 | char *thread_info;
202 | char tmp[STR_L];
203 | char thread_info_buffer[STR_XL];
204 |
205 | strcpy(thread_info_buffer, "Thread = { ");
206 |
207 | sprintf(tmp, "[pthread_self] = \"%d\" ", pthread_self());
208 | strcat(thread_info_buffer, tmp);
209 |
210 | /*
211 | thread_name = (char *)pthread_getspecific(Name);
212 |
213 | if (thread_name == NULL ) {
214 | sprintf(tmp, "[Name] = \"%s\" ", "didn't work!");
215 | }
216 | else {
217 | sprintf(tmp, "[Name] = \"%s\" ", thread_name);
218 | }
219 | strcat(thread_info_buffer, tmp);
220 | */
221 |
222 | strcat(thread_info_buffer, "}");
223 |
224 | dieif( wr_malloc((void **)&thread_info,
225 | strlen(thread_info_buffer)+1) != UT_OK);
226 |
227 | strcpy(thread_info, thread_info_buffer);
228 |
229 | return thread_info;
230 | } /* TH_to_string() */
231 |
232 |
233 | /*++++++++++++++++++++++++++++++++++++++
234 |
235 | This is the routine that creates a thread.
236 |
237 | More:
238 | +html+ <PRE>
239 | Author:
240 | ottrey
241 | joao
242 | andrei
243 | +html+ </PRE>
244 | ++++++++++++++++++++++++++++++++++++++*/
245 | void TH_create(void *do_function(void *), void *arguments ) {
246 | pthread_t tid;
247 | pthread_attr_t attr;
248 |
249 | /* Start a new thread. */
250 | pthread_attr_init(&attr); /* initialize attr with default attributes */
251 | pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
252 | pthread_create(&tid, &attr, do_function, arguments);
253 |
254 | } /* TH_run() */
255 |
256 |
257 |