annotate libfdcore/events.c @ 1240:0420ccc4671a

Add a counter for the sent requests for which we did not wait for an answer. It might be relevant this value contributes to the load estimate of the remote peer, but it is not very reliable
author Sebastien Decugis <sdecugis@freediameter.net>
date Thu, 10 Oct 2013 16:30:55 +0200
parents 6a1042d8075b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
82
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
1 /*********************************************************************************************************
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
4 * *
1127
1af09cc156d6 Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1093
diff changeset
5 * Copyright (c) 2013, WIDE Project and NICT *
82
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
6 * All rights reserved. *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
7 * *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
8 * Redistribution and use of this software in source and binary forms, with or without modification, are *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
9 * permitted provided that the following conditions are met: *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
10 * *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
11 * * Redistributions of source code must retain the above *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
12 * copyright notice, this list of conditions and the *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
13 * following disclaimer. *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
14 * *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
15 * * Redistributions in binary form must reproduce the above *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
16 * copyright notice, this list of conditions and the *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
17 * following disclaimer in the documentation and/or other *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
18 * materials provided with the distribution. *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
19 * *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
20 * * Neither the name of the WIDE Project or NICT nor the *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
21 * names of its contributors may be used to endorse or *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
22 * promote products derived from this software without *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
23 * specific prior written permission of WIDE Project and *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
24 * NICT. *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
25 * *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
34 *********************************************************************************************************/
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
39
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
40 int fd_event_send(struct fifo *queue, int code, size_t datasz, void * data)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
41 {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
42 struct fd_event * ev;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
43 CHECK_MALLOC( ev = malloc(sizeof(struct fd_event)) );
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
44 ev->code = code;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
45 ev->size = datasz;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
46 ev->data = data;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
47 CHECK_FCT( fd_fifo_post(queue, &ev) );
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
48 return 0;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
49 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
50
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
51 int fd_event_get(struct fifo *queue, int *code, size_t *datasz, void ** data)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
52 {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
53 struct fd_event * ev;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
54 CHECK_FCT( fd_fifo_get(queue, &ev) );
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
55 if (code)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
56 *code = ev->code;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
57 if (datasz)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
58 *datasz = ev->size;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
59 if (data)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
60 *data = ev->data;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
61 free(ev);
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
62 return 0;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
63 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
64
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
65 int fd_event_timedget(struct fifo *queue, struct timespec * timeout, int timeoutcode, int *code, size_t *datasz, void ** data)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
66 {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
67 struct fd_event * ev;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
68 int ret = 0;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
69 ret = fd_fifo_timedget(queue, &ev, timeout);
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
70 if (ret == ETIMEDOUT) {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
71 if (code)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
72 *code = timeoutcode;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
73 if (datasz)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
74 *datasz = 0;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
75 if (data)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
76 *data = NULL;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
77 } else {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
78 CHECK_FCT( ret );
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
79 if (code)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
80 *code = ev->code;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
81 if (datasz)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
82 *datasz = ev->size;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
83 if (data)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
84 *data = ev->data;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
85 free(ev);
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
86 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
87 return 0;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
88 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
89
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
90 void fd_event_destroy(struct fifo **queue, void (*free_cb)(void * data))
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
91 {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
92 struct fd_event * ev;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
93 /* Purge all events, and free the associated data if any */
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
94 while (fd_fifo_tryget( *queue, &ev ) == 0) {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
95 (*free_cb)(ev->data);
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
96 free(ev);
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
97 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
98 CHECK_FCT_DO( fd_fifo_del(queue), /* continue */ );
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
99 return ;
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
100 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
101
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
102 const char * fd_ev_str(int event)
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
103 {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
104 switch (event) {
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
105 #define case_str( _val )\
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
109
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
110 default:
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
111 TRACE_DEBUG(FULL, "Unknown event : %d", event);
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
112 return "Unknown event";
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
113 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
114 }
b6344f1d521a Some cleanups
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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 }
"Welcome to our mercurial repository"