Mercurial > hg > freeDiameter
annotate extensions/test_netemul/tne_process.c @ 656:5b05d85682f1 1.0.x-last
Small fixes
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Tue, 11 Jan 2011 15:48:58 +0900 |
parents | 98a322c319db |
children | 78b665400097 |
rev | line source |
---|---|
651
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
2 * Software License Agreement (BSD License) * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@nict.go.jp> * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
5 * Copyright (c) 2011, WIDE Project and NICT * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
6 * All rights reserved. * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
7 * * |
083317a4e947
Added new test_netemul extension (need testing)
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 * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
9 * permitted provided that the following conditions are met: * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
10 * * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
11 * * Redistributions of source code must retain the above * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
12 * copyright notice, this list of conditions and the * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
13 * following disclaimer. * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
14 * * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
15 * * Redistributions in binary form must reproduce the above * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
16 * copyright notice, this list of conditions and the * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
17 * following disclaimer in the documentation and/or other * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
18 * materials provided with the distribution. * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
19 * * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
20 * * Neither the name of the WIDE Project or NICT nor the * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
21 * names of its contributors may be used to endorse or * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
22 * promote products derived from this software without * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
23 * specific prior written permission of WIDE Project and * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
24 * NICT. * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
25 * * |
083317a4e947
Added new test_netemul extension (need testing)
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 * |
083317a4e947
Added new test_netemul extension (need testing)
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 * |
083317a4e947
Added new test_netemul extension (need testing)
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 * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
083317a4e947
Added new test_netemul extension (need testing)
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 * |
083317a4e947
Added new test_netemul extension (need testing)
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 * |
083317a4e947
Added new test_netemul extension (need testing)
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 * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
34 *********************************************************************************************************/ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
35 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
36 #include "test_netemul.h" |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 #include <math.h> |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
38 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
39 /* This file implements the real processing of the message. |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
40 The entry point is tne_process_message(). |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
41 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
42 First, the duplicate filter is applied: with the configured |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
43 probability, a copy of the message is created. Then, with |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
44 the tenth probability, a second copy is created, and so on, |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
45 until the random value tells not to create a copy. |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
46 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
47 The original message + all copies are stored in a list, for next step. |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
48 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
49 Second step is the latency filter. For each message in the list, a |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
50 latency value is randomly generated (with a lognormal shape of the |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
51 random distribution) and stored in the list. |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
52 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
53 Finally, when the latency time is over, the message is sent. |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
54 */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
55 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
56 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
57 static pthread_cond_t cnd = PTHREAD_COND_INITIALIZER; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
58 static pthread_t thr = (pthread_t)NULL; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
59 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
60 /* The lists bellow are all protected by the same mutex mtx */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
61 static struct fd_list input = FD_LIST_INITIALIZER(input); /* messages received from network */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
62 static struct fd_list forlat = FD_LIST_INITIALIZER(forlat); /* messages after duplicate filter */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
63 static struct fd_list waitlist = FD_LIST_INITIALIZER(waitlist); /* messages waiting for sending */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
64 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
65 struct process_item { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
66 struct fd_list chain; /* link into one of the lists. "o" points to the message. */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
67 struct timespec ts; /* when the message must be sent */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
68 }; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
69 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
70 /******************************************************************/ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
71 /* helper functions */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
72 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
73 /* Process all pi in input list and queue in forlat, duplicating when needed */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
74 static int do_duplicates() |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
75 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
76 TRACE_ENTRY(""); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
77 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
78 while (!FD_IS_LIST_EMPTY(&input)) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
79 struct msg * m; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
80 struct process_item * pi = (struct process_item *)(input.next); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
81 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
82 /* Take out this pi from input */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
83 fd_list_unlink(&pi->chain); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
84 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
85 /* store it in forlat */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
86 fd_list_insert_before(&forlat, &pi->chain); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
87 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
88 /* Duplicate eventually, unless deactivated */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
89 if (tne_conf.dupl_proba != 0.0) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
90 char * src; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
91 /* Pick a random value in [0, 1] */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
92 double my_rand = drand48(); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
93 m = pi->chain.o; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
94 CHECK_FCT( fd_msg_source_get(m, &src) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
95 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
96 while (my_rand < (double) tne_conf.dupl_proba) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
97 /* create the duplicate */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
98 struct process_item * npi; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
99 struct msg * nm; |
655
98a322c319db
Added T flag and some debug information for test_netemul
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
651
diff
changeset
|
100 struct msg_hdr * nh; |
651
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
101 unsigned char * buf; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
102 size_t len; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
103 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
104 /* Duplicate the message */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
105 CHECK_FCT( fd_msg_bufferize(m, &buf, &len) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
106 CHECK_FCT( fd_msg_parse_buffer(&buf, len, &nm) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
107 CHECK_FCT( fd_msg_source_set(nm, src, 0, NULL) ); |
655
98a322c319db
Added T flag and some debug information for test_netemul
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
651
diff
changeset
|
108 CHECK_FCT( fd_msg_hdr(nm, &nh) ); |
98a322c319db
Added T flag and some debug information for test_netemul
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
651
diff
changeset
|
109 nh->msg_flags |= CMD_FLAG_RETRANSMIT; /* Add the 'T' flag */ |
98a322c319db
Added T flag and some debug information for test_netemul
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
651
diff
changeset
|
110 TRACE_DEBUG(FULL, "[tne] Duplicated message %p as %p", m, nm); |
651
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
111 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
112 /* Duplicate the pi */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
113 CHECK_MALLOC( npi = malloc(sizeof(struct process_item)) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
114 memset(npi, 0, sizeof(struct process_item)); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
115 fd_list_init(&npi->chain, nm); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
116 memcpy(&npi->ts, &pi->ts, sizeof(struct timespec)); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
117 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
118 /* Enqueue the candidate in forlat */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
119 fd_list_insert_before(&forlat, &npi->chain); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
120 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
121 /* loop for another duplicate */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
122 if (!my_rand) |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
123 break; /* otherwise, infinite loop */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
124 my_rand *= 10.0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
125 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
126 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
127 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
128 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
129 /* Done */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
130 return 0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
131 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
132 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
133 /* Generate a random value with a normal distribution, mean 0, variance 1 */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
134 /* Using Box-Muller algo from Numerical Recipes in C++, 2nd Ed. */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
135 static double get_rand_norm() |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
136 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
137 double ru1, ru2; /* two random uniform values in -1..1 */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
138 double rsq; /* ru1^2 + ru2^2, to ensure we are in the circle */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
139 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
140 /* Get our appropriate 2 random uniform values */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
141 do { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
142 ru1 = 2.0 * drand48() - 1.0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
143 ru2 = 2.0 * drand48() - 1.0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
144 rsq = ru1 * ru1 + ru2 * ru2; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
145 } while ((rsq >= 1.0) || (rsq == 0.0)); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
146 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
147 /* Do the Box-Muller transform -- we don't use the 2nd value generated */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
148 return ru1 * sqrt( -2.0 * log(rsq) / rsq ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
149 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
150 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
151 /* Return the latency to add, in ms. */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
152 static __inline__ unsigned long get_latency() |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
153 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
154 unsigned long lat = tne_conf.lat_avg; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
155 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
156 if (tne_conf.lat_dev) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
157 /* We randomize the value to add */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
158 double rn; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
159 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
160 rn = get_rand_norm(); /* this is normal random value with mean = 0 and variance = 1 */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
161 rn = rn * ((double)tne_conf.lat_dev) / 100.0; /* now the variance is lat_dev */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
162 rn = exp(rn); /* and now, we have a lognormal random value, with geometric mean = 1 */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
163 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
164 lat = (unsigned long)(rn * (double)lat); /* Apply to our mean latency */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
165 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
166 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
167 return lat; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
168 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
169 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
170 /* Process all pi in forlat and add a random latency, then requeue in order into waitlist */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
171 static int do_latency() |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
172 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
173 TRACE_ENTRY(""); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
174 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
175 while (!FD_IS_LIST_EMPTY(&forlat)) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
176 struct process_item * pi = (struct process_item *)(forlat.next); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
177 struct fd_list * li; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
178 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
179 /* Take out this pi from forlat */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
180 fd_list_unlink(&pi->chain); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
181 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
182 /* If there is a latency to add */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
183 if (tne_conf.lat_avg) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
184 unsigned long l = get_latency(); |
655
98a322c319db
Added T flag and some debug information for test_netemul
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
651
diff
changeset
|
185 TRACE_DEBUG(FULL, "[tne] Set %lu ms latency for %p", l, pi->chain.o); |
651
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
186 pi->ts.tv_sec += l / 1000; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
187 l %= 1000; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
188 pi->ts.tv_nsec += l * 1000000; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
189 if (pi->ts.tv_nsec >= 1000000000) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
190 pi->ts.tv_sec += 1; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
191 pi->ts.tv_nsec -= 1000000000; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
192 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
193 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
194 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
195 for (li = waitlist.prev; li != &waitlist; li=li->prev) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
196 struct process_item * p = (struct process_item *)li; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
197 if (TS_IS_INFERIOR( &p->ts, &pi->ts )) |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
198 break; /* we must insert after this one */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
199 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
200 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
201 /* store it */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
202 fd_list_insert_after(li, &pi->chain); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
203 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
204 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
205 /* Done */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
206 return 0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
207 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
208 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
209 /* Send all messages in waitlist that have passed their latency period */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
210 static int send_all_ready() |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
211 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
212 struct timespec now; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
213 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
214 TRACE_ENTRY(""); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
215 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
216 CHECK_SYS( clock_gettime(CLOCK_REALTIME, &now) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
217 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
218 while (!FD_IS_LIST_EMPTY(&waitlist)) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
219 struct msg * m; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
220 struct process_item * pi = (struct process_item *)(waitlist.next); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
221 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
222 if (!TS_IS_INFERIOR( &pi->ts, &now)) |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
223 break; /* We sent already all we could */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
224 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
225 /* Take out this pi and send the message */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
226 fd_list_unlink(&pi->chain); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
227 m = pi->chain.o; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
228 free(pi); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
229 |
655
98a322c319db
Added T flag and some debug information for test_netemul
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
651
diff
changeset
|
230 TRACE_DEBUG(FULL, "[tne] Sending now %p", m); |
651
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
231 CHECK_FCT( fd_msg_send(&m, NULL, NULL) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
232 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
233 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
234 return 0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
235 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
236 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
237 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
238 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
239 /******************************************************************/ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
240 /* the processing thread */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
241 static void * tne_process_th(void * arg) |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
242 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
243 TRACE_ENTRY("%p", arg); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
244 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
245 /* Name the thread */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
246 fd_log_threadname ( "test_netemul/process" ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
247 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
248 CHECK_POSIX_DO( pthread_mutex_lock(&mtx), goto error ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
249 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
250 /* The loop */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
251 while (1) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
252 /* First, test if we are canceled */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
253 CHECK_POSIX_DO( pthread_mutex_unlock(&mtx), goto error ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
254 pthread_testcancel(); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
255 CHECK_POSIX_DO( pthread_mutex_lock(&mtx), goto error ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
256 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
257 pthread_cleanup_push( fd_cleanup_mutex, &mtx ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
258 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
259 /* Send all messages that are ready (free resources before using new ones) */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
260 CHECK_FCT_DO( send_all_ready(), goto error_ul ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
261 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
262 /* Now process the new messages in input list for duplicate filter */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
263 CHECK_FCT_DO( do_duplicates(), goto error_ul ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
264 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
265 /* Now compute the latency for each new item */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
266 CHECK_FCT_DO( do_latency(), goto error_ul ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
267 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
268 /* Now, wait then loop */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
269 if (FD_IS_LIST_EMPTY(&waitlist)) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
270 CHECK_POSIX_DO( pthread_cond_wait(&cnd, &mtx), goto error_ul ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
271 } else { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
272 CHECK_POSIX_DO2( pthread_cond_timedwait(&cnd, &mtx, &((struct process_item *)(waitlist.next))->ts), |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
273 ETIMEDOUT, /* ETIMEDOUT is a normal return value, continue */, |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
274 /* on other error, */ goto error_ul ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
275 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
276 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
277 pthread_cleanup_pop( 0 ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
278 /* loop */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
279 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
280 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
281 error_ul: |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
282 CHECK_POSIX_DO( pthread_mutex_unlock(&mtx), ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
283 error: |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
284 TRACE_DEBUG(INFO, "A fatal error occurred in test_netemul/process thread!"); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
285 ASSERT(0); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
286 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
287 return NULL; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
288 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
289 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
290 /******************************************************************/ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
291 /* functions visible from outside this file */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
292 int tne_process_init() |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
293 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
294 CHECK_POSIX( pthread_create(&thr, NULL, tne_process_th, NULL) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
295 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
296 #if 0 /* debug */ |
656 | 297 int i; |
651
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
298 for (i=0; i< 20; i++) { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
299 printf("LAT: %lu\n", get_latency()); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
300 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
301 #endif /* 0 */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
302 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
303 return 0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
304 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
305 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
306 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
307 int tne_process_fini() |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
308 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
309 CHECK_FCT( fd_thr_term(&thr) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
310 return 0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
311 } |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
312 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
313 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
314 int tne_process_message(struct msg * msg) |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
315 { |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
316 struct process_item * pi; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
317 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
318 TRACE_ENTRY("%p", msg); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
319 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
320 /* Create a new pi for this message */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
321 CHECK_MALLOC( pi = malloc(sizeof(struct process_item)) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
322 memset(pi, 0, sizeof(struct process_item)); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
323 fd_list_init(&pi->chain, msg); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
324 CHECK_SYS(clock_gettime(CLOCK_REALTIME, &pi->ts)); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
325 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
326 /* Store it in the input list */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
327 CHECK_POSIX( pthread_mutex_lock(&mtx) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
328 fd_list_insert_before(&input, &pi->chain); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
329 CHECK_POSIX( pthread_mutex_unlock(&mtx) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
330 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
331 /* Wake up the process thread so that it processes the message */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
332 CHECK_POSIX( pthread_cond_signal(&cnd) ); |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
333 |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
334 /* done */ |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
335 return 0; |
083317a4e947
Added new test_netemul extension (need testing)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
336 } |