summaryrefslogtreecommitdiff
path: root/src/psyc/test_psyc.c
diff options
context:
space:
mode:
authorGabor X Toth <*@tg-x.net>2013-11-09 23:12:27 +0000
committerGabor X Toth <*@tg-x.net>2013-11-09 23:12:27 +0000
commit172ab07eeb1215cc9d22dabc589f7529ac2d59ea (patch)
treed75fc75033c7e93b58c1908f06c7b856bc317b8e /src/psyc/test_psyc.c
parentd10808d7f17c5f6f1356c22ef0992965cbaf5ce1 (diff)
downloadgnunet-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.c50
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
147struct TransmitClosure 148struct 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
157static void 159static void
158transmit_resume (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 160transmit_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
167transmit_notify (void *cls, size_t *data_size, void *data) 170transmit_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
193void 198void
194master_started (void *cls, uint64_t max_message_id) 199master_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);