Mercurial > hg > freeDiameter
annotate libfdcore/events.c @ 1207:043b894b0511
Cleanups in failover situation to avoid deadlocks and corrupt messages ids. Tested OK now.
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Fri, 14 Jun 2013 17:30:42 +0800 |
parents | 6a1042d8075b |
children |
rev | line source |
---|---|
82 | 1 /********************************************************************************************************* |
2 * Software License Agreement (BSD License) * | |
740
4a9f08d6b6ba
Updated my mail address
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
664
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> * |
82 | 4 * * |
1127
1af09cc156d6
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1093
diff
changeset
|
5 * Copyright (c) 2013, WIDE Project and NICT * |
82 | 6 * All rights reserved. * |
7 * * | |
8 * Redistribution and use of this software in source and binary forms, with or without modification, are * | |
9 * permitted provided that the following conditions are met: * | |
10 * * | |
11 * * Redistributions of source code must retain the above * | |
12 * copyright notice, this list of conditions and the * | |
13 * following disclaimer. * | |
14 * * | |
15 * * Redistributions in binary form must reproduce the above * | |
16 * copyright notice, this list of conditions and the * | |
17 * following disclaimer in the documentation and/or other * | |
18 * materials provided with the distribution. * | |
19 * * | |
20 * * Neither the name of the WIDE Project or NICT nor the * | |
21 * names of its contributors may be used to endorse or * | |
22 * promote products derived from this software without * | |
23 * specific prior written permission of WIDE Project and * | |
24 * NICT. * | |
25 * * | |
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * | |
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * | |
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * | |
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * | |
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * | |
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * | |
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * | |
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * | |
34 *********************************************************************************************************/ | |
35 | |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
36 #include "fdcore-internal.h" |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
37 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
38 /* Events are a subset of fifo queues, with a known type */ |
82 | 39 |
40 int fd_event_send(struct fifo *queue, int code, size_t datasz, void * data) | |
41 { | |
42 struct fd_event * ev; | |
43 CHECK_MALLOC( ev = malloc(sizeof(struct fd_event)) ); | |
44 ev->code = code; | |
45 ev->size = datasz; | |
46 ev->data = data; | |
47 CHECK_FCT( fd_fifo_post(queue, &ev) ); | |
48 return 0; | |
49 } | |
50 | |
51 int fd_event_get(struct fifo *queue, int *code, size_t *datasz, void ** data) | |
52 { | |
53 struct fd_event * ev; | |
54 CHECK_FCT( fd_fifo_get(queue, &ev) ); | |
55 if (code) | |
56 *code = ev->code; | |
57 if (datasz) | |
58 *datasz = ev->size; | |
59 if (data) | |
60 *data = ev->data; | |
61 free(ev); | |
62 return 0; | |
63 } | |
64 | |
65 int fd_event_timedget(struct fifo *queue, struct timespec * timeout, int timeoutcode, int *code, size_t *datasz, void ** data) | |
66 { | |
67 struct fd_event * ev; | |
68 int ret = 0; | |
69 ret = fd_fifo_timedget(queue, &ev, timeout); | |
70 if (ret == ETIMEDOUT) { | |
71 if (code) | |
72 *code = timeoutcode; | |
73 if (datasz) | |
74 *datasz = 0; | |
75 if (data) | |
76 *data = NULL; | |
77 } else { | |
78 CHECK_FCT( ret ); | |
79 if (code) | |
80 *code = ev->code; | |
81 if (datasz) | |
82 *datasz = ev->size; | |
83 if (data) | |
84 *data = ev->data; | |
85 free(ev); | |
86 } | |
87 return 0; | |
88 } | |
89 | |
90 void fd_event_destroy(struct fifo **queue, void (*free_cb)(void * data)) | |
91 { | |
92 struct fd_event * ev; | |
93 /* Purge all events, and free the associated data if any */ | |
94 while (fd_fifo_tryget( *queue, &ev ) == 0) { | |
95 (*free_cb)(ev->data); | |
96 free(ev); | |
97 } | |
98 CHECK_FCT_DO( fd_fifo_del(queue), /* continue */ ); | |
99 return ; | |
100 } | |
101 | |
102 const char * fd_ev_str(int event) | |
103 { | |
104 switch (event) { | |
105 #define case_str( _val )\ | |
106 case _val : return #_val | |
1190
6a1042d8075b
Replace FDEV_TERMINATE events with calls to fd_core_shutdown to handle the core state properly
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
107 case_str(FDEV_TERMINATE_INT); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
108 case_str(FDEV_TRIGGER); |
82 | 109 |
110 default: | |
111 TRACE_DEBUG(FULL, "Unknown event : %d", event); | |
112 return "Unknown event"; | |
113 } | |
114 } | |
115 | |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
116 /**********************************************************************/ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
117 /* Trigged events */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
118 /* This allows extensions to register for / send triggers to other extensions */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
119 /* It is used for example for users interactions (through signals or ...) */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
120 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
121 /* Because the number of triggers is not expected to grow, we use a simple ordered chained list */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
122 static pthread_rwlock_t trig_rwl = PTHREAD_RWLOCK_INITIALIZER; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
123 static struct fd_list trig_list = FD_LIST_INITIALIZER(trig_list); /* The list of triggers ordered by trigger value */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
124 struct trig_item { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
125 struct fd_list chain; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
126 int trig_value; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
127 const char * trig_module; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
128 void (*cb)(void); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
129 }; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
130 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
131 /* Add a new entry in the trigger list */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
132 int fd_event_trig_regcb(int trigger_val, const char * module, void (*cb)(void)) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
133 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
134 struct trig_item * ti; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
135 struct fd_list * li; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
136 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
137 TRACE_ENTRY("%d %p %p", trigger_val, module, cb); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
138 CHECK_PARAMS( trigger_val && cb ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
139 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
140 /* Create a new trig_item */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
141 CHECK_MALLOC( ti = malloc(sizeof(struct trig_item)) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
142 memset(ti, 0, sizeof(struct trig_item)); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
143 fd_list_init(&ti->chain, ti); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
144 ti->trig_value = trigger_val; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
145 ti->trig_module = module; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
146 ti->cb = cb; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
147 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
148 /* Now insert in the list */ |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
149 CHECK_POSIX( pthread_rwlock_wrlock(&trig_rwl) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
150 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
151 for (li = trig_list.next; li != &trig_list; li = li->next) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
152 struct trig_item *t = li->o; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
153 if (t->trig_value >= trigger_val) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
154 break; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
155 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
156 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
157 fd_list_insert_before(li, &ti->chain); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
158 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
159 CHECK_POSIX( pthread_rwlock_unlock(&trig_rwl) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
160 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
161 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
162 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
163 |
1085
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
164 DECLARE_FD_DUMP_PROTOTYPE(fd_event_trig_dump) |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
165 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
166 struct fd_list * li; |
1093
44f3e48dfe27
Align the behavior of all fd_*dump functions wrt final \n
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1085
diff
changeset
|
167 FD_DUMP_HANDLE_OFFSET(); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
168 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
169 CHECK_POSIX_DO( pthread_rwlock_rdlock(&trig_rwl), ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
170 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
171 for (li = trig_list.next; li != &trig_list; li = li->next) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
172 struct trig_item *t = li->o; |
1093
44f3e48dfe27
Align the behavior of all fd_*dump functions wrt final \n
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1085
diff
changeset
|
173 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{signal:%d}'%s'->%p ", t->trig_value, t->trig_module, t->cb), break); |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
174 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
175 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
176 CHECK_POSIX_DO( pthread_rwlock_unlock(&trig_rwl), ); |
1085
7d7266115a34
Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
177 return *buf; |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
178 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
179 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
180 static void *call_cb_detached(void * arg) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
181 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
182 void (*cb)(void) = arg; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
183 fd_log_threadname("Trig'd callback thread"); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
184 TRACE_ENTRY("%p", arg); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
185 (*cb)(); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
186 TRACE_DEBUG(ANNOYING, "Callback %p completed", cb); |
664
c1ef1c39e8a5
Fix compilation warning
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
662
diff
changeset
|
187 return NULL; |
658
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
188 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
189 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
190 int fd_event_trig_call_cb(int trigger_val) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
191 { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
192 struct fd_list * li; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
193 pthread_attr_t detached; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
194 pthread_t th; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
195 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
196 CHECK_POSIX( pthread_attr_init(&detached) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
197 CHECK_POSIX( pthread_attr_setdetachstate(&detached, PTHREAD_CREATE_DETACHED) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
198 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
199 CHECK_POSIX( pthread_rwlock_rdlock(&trig_rwl) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
200 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
201 for (li = trig_list.next; li != &trig_list; li = li->next) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
202 struct trig_item *t = li->o; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
203 if (t->trig_value == trigger_val) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
204 TRACE_DEBUG(FULL, "Trigger %d: Calling %p in %s", t->trig_value, t->cb, t->trig_module); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
205 CHECK_POSIX_DO( pthread_create( &th, &detached, call_cb_detached, t->cb ), break ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
206 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
207 if (t->trig_value > trigger_val) |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
208 break; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
209 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
210 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
211 CHECK_POSIX( pthread_rwlock_unlock(&trig_rwl) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
212 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
213 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
214 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
215 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
216 int fd_event_trig_fini(void) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
217 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
218 TRACE_ENTRY(""); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
219 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
220 CHECK_POSIX( pthread_rwlock_wrlock(&trig_rwl) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
221 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
222 while (!FD_IS_LIST_EMPTY(&trig_list)) { |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
223 struct fd_list * li = trig_list.next; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
224 fd_list_unlink(li); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
225 free(li); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
226 } |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
227 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
228 CHECK_POSIX( pthread_rwlock_unlock(&trig_rwl) ); |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
229 |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
230 return 0; |
f198d16fa7f4
Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
82
diff
changeset
|
231 } |