diff options
author | Gabor X Toth <*@tg-x.net> | 2013-11-09 23:12:27 +0000 |
---|---|---|
committer | Gabor X Toth <*@tg-x.net> | 2013-11-09 23:12:27 +0000 |
commit | 172ab07eeb1215cc9d22dabc589f7529ac2d59ea (patch) | |
tree | d75fc75033c7e93b58c1908f06c7b856bc317b8e /src/psyc/test_psyc.c | |
parent | d10808d7f17c5f6f1356c22ef0992965cbaf5ce1 (diff) | |
download | gnunet-172ab07eeb1215cc9d22dabc589f7529ac2d59ea.tar.gz gnunet-172ab07eeb1215cc9d22dabc589f7529ac2d59ea.zip |
psyc: handling messages from multicast and passing them to clients; pause/resume fixes
Diffstat (limited to 'src/psyc/test_psyc.c')
-rw-r--r-- | src/psyc/test_psyc.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/src/psyc/test_psyc.c b/src/psyc/test_psyc.c index 41c4ca8e4..2986fdf6a 100644 --- a/src/psyc/test_psyc.c +++ b/src/psyc/test_psyc.c | |||
@@ -144,10 +144,12 @@ join (void *cls, const struct GNUNET_CRYPTO_EddsaPublicKey *slave_key, | |||
144 | return GNUNET_OK; | 144 | return GNUNET_OK; |
145 | } | 145 | } |
146 | 146 | ||
147 | |||
147 | struct TransmitClosure | 148 | struct TransmitClosure |
148 | { | 149 | { |
149 | struct GNUNET_PSYC_MasterTransmitHandle *handle; | 150 | struct GNUNET_PSYC_MasterTransmitHandle *handle; |
150 | uint8_t n; | 151 | uint8_t n; |
152 | uint8_t paused; | ||
151 | uint8_t fragment_count; | 153 | uint8_t fragment_count; |
152 | char *fragments[16]; | 154 | char *fragments[16]; |
153 | uint16_t fragment_sizes[16]; | 155 | uint16_t fragment_sizes[16]; |
@@ -157,8 +159,9 @@ struct TransmitClosure | |||
157 | static void | 159 | static void |
158 | transmit_resume (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 160 | transmit_resume (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
159 | { | 161 | { |
160 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Transmit resume\n"); | 162 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission resumed.\n"); |
161 | struct TransmitClosure *tmit = cls; | 163 | struct TransmitClosure *tmit = cls; |
164 | tmit->paused = GNUNET_NO; | ||
162 | GNUNET_PSYC_master_transmit_resume (tmit->handle); | 165 | GNUNET_PSYC_master_transmit_resume (tmit->handle); |
163 | } | 166 | } |
164 | 167 | ||
@@ -167,33 +170,36 @@ static int | |||
167 | transmit_notify (void *cls, size_t *data_size, void *data) | 170 | transmit_notify (void *cls, size_t *data_size, void *data) |
168 | { | 171 | { |
169 | struct TransmitClosure *tmit = cls; | 172 | struct TransmitClosure *tmit = cls; |
170 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 173 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
171 | "Transmit notify: %lu bytes\n", *data_size); | 174 | "Transmit notify: %lu bytes available, " |
172 | 175 | "processing fragment %u/%u.\n", | |
173 | if (tmit->fragment_count <= tmit->n) | 176 | *data_size, tmit->n + 1, tmit->fragment_count); |
174 | return GNUNET_YES; | ||
175 | |||
176 | GNUNET_assert (tmit->fragment_sizes[tmit->n] <= *data_size); | 177 | GNUNET_assert (tmit->fragment_sizes[tmit->n] <= *data_size); |
177 | 178 | ||
178 | *data_size = tmit->fragment_sizes[tmit->n]; | 179 | if (GNUNET_YES == tmit->paused && tmit->n == tmit->fragment_count - 1) |
179 | memcpy (data, tmit->fragments[tmit->n], *data_size); | ||
180 | tmit->n++; | ||
181 | |||
182 | if (tmit->n == tmit->fragment_count - 1) | ||
183 | { | 180 | { |
184 | /* Send last fragment later. */ | 181 | /* Send last fragment later. */ |
185 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &transmit_resume, | 182 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmission paused.\n"); |
186 | tmit); | 183 | tmit->paused = GNUNET_YES; |
184 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply | ||
185 | (GNUNET_TIME_UNIT_SECONDS, 3), | ||
186 | &transmit_resume, tmit); | ||
187 | *data_size = 0; | 187 | *data_size = 0; |
188 | return GNUNET_NO; | 188 | return GNUNET_NO; |
189 | } | 189 | } |
190 | return tmit->n <= tmit->fragment_count ? GNUNET_NO : GNUNET_YES; | 190 | |
191 | GNUNET_assert (tmit->fragment_sizes[tmit->n] <= *data_size); | ||
192 | *data_size = tmit->fragment_sizes[tmit->n]; | ||
193 | memcpy (data, tmit->fragments[tmit->n], *data_size); | ||
194 | |||
195 | return ++tmit->n < tmit->fragment_count ? GNUNET_NO : GNUNET_YES; | ||
191 | } | 196 | } |
192 | 197 | ||
193 | void | 198 | void |
194 | master_started (void *cls, uint64_t max_message_id) | 199 | master_started (void *cls, uint64_t max_message_id) |
195 | { | 200 | { |
196 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Master started: %lu\n", max_message_id); | 201 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
202 | "Master started: %lu\n", max_message_id); | ||
197 | 203 | ||
198 | struct GNUNET_ENV_Environment *env = GNUNET_ENV_environment_create (); | 204 | struct GNUNET_ENV_Environment *env = GNUNET_ENV_environment_create (); |
199 | GNUNET_ENV_environment_add_mod (env, GNUNET_ENV_OP_ASSIGN, | 205 | GNUNET_ENV_environment_add_mod (env, GNUNET_ENV_OP_ASSIGN, |
@@ -202,11 +208,13 @@ master_started (void *cls, uint64_t max_message_id) | |||
202 | "_foo_bar", "foo bar baz", 11); | 208 | "_foo_bar", "foo bar baz", 11); |
203 | 209 | ||
204 | struct TransmitClosure *tmit = GNUNET_new (struct TransmitClosure); | 210 | struct TransmitClosure *tmit = GNUNET_new (struct TransmitClosure); |
205 | tmit->fragment_count = 2; | 211 | tmit->fragment_count = 3; |
206 | tmit->fragments[0] = "foo bar"; | 212 | tmit->fragments[0] = "foo"; |
207 | tmit->fragment_sizes[0] = 7; | 213 | tmit->fragment_sizes[0] = 4; |
208 | tmit->fragments[1] = "baz!"; | 214 | tmit->fragments[1] = "foo bar"; |
209 | tmit->fragment_sizes[1] = 4; | 215 | tmit->fragment_sizes[1] = 7; |
216 | tmit->fragments[2] = "foo bar baz"; | ||
217 | tmit->fragment_sizes[2] = 11; | ||
210 | tmit->handle | 218 | tmit->handle |
211 | = GNUNET_PSYC_master_transmit (mst, "_test", env, transmit_notify, tmit, | 219 | = GNUNET_PSYC_master_transmit (mst, "_test", env, transmit_notify, tmit, |
212 | GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN); | 220 | GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN); |