diff options
author | Gabor X Toth <*@tg-x.net> | 2016-08-17 22:28:52 +0000 |
---|---|---|
committer | Gabor X Toth <*@tg-x.net> | 2016-08-17 22:28:52 +0000 |
commit | d226c5f08990628851ac0b61894727e3817f8ad7 (patch) | |
tree | 7dec7dd7500d38f7a83287ca1b6427557467d2bf /src/multicast | |
parent | 4f51ef196f6dff91fd83085462fd9c4624f7296b (diff) | |
download | gnunet-d226c5f08990628851ac0b61894727e3817f8ad7.tar.gz gnunet-d226c5f08990628851ac0b61894727e3817f8ad7.zip |
multicast, psyc, social: wait till last message sent before disconnect
Diffstat (limited to 'src/multicast')
-rw-r--r-- | src/multicast/multicast_api.c | 74 | ||||
-rw-r--r-- | src/multicast/test_multicast.c | 34 |
2 files changed, 56 insertions, 52 deletions
diff --git a/src/multicast/multicast_api.c b/src/multicast/multicast_api.c index 89a9bf5e1..ad9929dca 100644 --- a/src/multicast/multicast_api.c +++ b/src/multicast/multicast_api.c | |||
@@ -522,27 +522,51 @@ handle_member_join_decision (void *cls, | |||
522 | static void | 522 | static void |
523 | group_cleanup (struct GNUNET_MULTICAST_Group *grp) | 523 | group_cleanup (struct GNUNET_MULTICAST_Group *grp) |
524 | { | 524 | { |
525 | GNUNET_MQ_discard (grp->connect_env); | 525 | if (NULL != grp->connect_env) |
526 | { | ||
527 | GNUNET_MQ_discard (grp->connect_env); | ||
528 | grp->connect_env = NULL; | ||
529 | } | ||
530 | if (NULL != grp->mq) | ||
531 | { | ||
532 | GNUNET_MQ_destroy (grp->mq); | ||
533 | grp->mq = NULL; | ||
534 | } | ||
526 | if (NULL != grp->disconnect_cb) | 535 | if (NULL != grp->disconnect_cb) |
536 | { | ||
527 | grp->disconnect_cb (grp->disconnect_cls); | 537 | grp->disconnect_cb (grp->disconnect_cls); |
538 | grp->disconnect_cb = NULL; | ||
539 | } | ||
540 | GNUNET_free (grp); | ||
528 | } | 541 | } |
529 | 542 | ||
530 | 543 | ||
531 | static void | 544 | static void |
532 | origin_cleanup (void *cls) | 545 | group_disconnect (struct GNUNET_MULTICAST_Group *grp, |
546 | GNUNET_ContinuationCallback cb, | ||
547 | void *cls) | ||
533 | { | 548 | { |
534 | struct GNUNET_MULTICAST_Origin *orig = cls; | 549 | grp->is_disconnecting = GNUNET_YES; |
535 | group_cleanup (&orig->grp); | 550 | grp->disconnect_cb = cb; |
536 | GNUNET_free (orig); | 551 | grp->disconnect_cls = cls; |
537 | } | ||
538 | |||
539 | 552 | ||
540 | static void | 553 | if (NULL != grp->mq) |
541 | member_cleanup (void *cls) | 554 | { |
542 | { | 555 | struct GNUNET_MQ_Envelope *last = GNUNET_MQ_get_last_envelope (grp->mq); |
543 | struct GNUNET_MULTICAST_Member *mem = cls; | 556 | if (NULL != last) |
544 | group_cleanup (&mem->grp); | 557 | { |
545 | GNUNET_free (mem); | 558 | GNUNET_MQ_notify_sent (last, |
559 | (GNUNET_MQ_NotifyCallback) group_cleanup, grp); | ||
560 | } | ||
561 | else | ||
562 | { | ||
563 | group_cleanup (grp); | ||
564 | } | ||
565 | } | ||
566 | else | ||
567 | { | ||
568 | group_cleanup (grp); | ||
569 | } | ||
546 | } | 570 | } |
547 | 571 | ||
548 | 572 | ||
@@ -861,17 +885,7 @@ GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *orig, | |||
861 | { | 885 | { |
862 | struct GNUNET_MULTICAST_Group *grp = &orig->grp; | 886 | struct GNUNET_MULTICAST_Group *grp = &orig->grp; |
863 | 887 | ||
864 | grp->is_disconnecting = GNUNET_YES; | 888 | group_disconnect (grp, stop_cb, stop_cls); |
865 | grp->disconnect_cb = stop_cb; | ||
866 | grp->disconnect_cls = stop_cls; | ||
867 | |||
868 | // FIXME: wait till queued messages are sent | ||
869 | if (NULL != grp->mq) | ||
870 | { | ||
871 | GNUNET_MQ_destroy (grp->mq); | ||
872 | grp->mq = NULL; | ||
873 | } | ||
874 | origin_cleanup (orig); | ||
875 | } | 889 | } |
876 | 890 | ||
877 | 891 | ||
@@ -1198,23 +1212,13 @@ GNUNET_MULTICAST_member_part (struct GNUNET_MULTICAST_Member *mem, | |||
1198 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Member parting.\n", mem); | 1212 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Member parting.\n", mem); |
1199 | struct GNUNET_MULTICAST_Group *grp = &mem->grp; | 1213 | struct GNUNET_MULTICAST_Group *grp = &mem->grp; |
1200 | 1214 | ||
1201 | grp->is_disconnecting = GNUNET_YES; | ||
1202 | grp->disconnect_cb = part_cb; | ||
1203 | grp->disconnect_cls = part_cls; | ||
1204 | |||
1205 | mem->join_dcsn_cb = NULL; | 1215 | mem->join_dcsn_cb = NULL; |
1206 | grp->join_req_cb = NULL; | 1216 | grp->join_req_cb = NULL; |
1207 | grp->message_cb = NULL; | 1217 | grp->message_cb = NULL; |
1208 | grp->replay_msg_cb = NULL; | 1218 | grp->replay_msg_cb = NULL; |
1209 | grp->replay_frag_cb = NULL; | 1219 | grp->replay_frag_cb = NULL; |
1210 | 1220 | ||
1211 | // FIXME: wait till queued messages are sent | 1221 | group_disconnect (grp, part_cb, part_cls); |
1212 | if (NULL != grp->mq) | ||
1213 | { | ||
1214 | GNUNET_MQ_destroy (grp->mq); | ||
1215 | grp->mq = NULL; | ||
1216 | } | ||
1217 | member_cleanup (mem); | ||
1218 | } | 1222 | } |
1219 | 1223 | ||
1220 | 1224 | ||
diff --git a/src/multicast/test_multicast.c b/src/multicast/test_multicast.c index 63f162d00..a4288e93d 100644 --- a/src/multicast/test_multicast.c +++ b/src/multicast/test_multicast.c | |||
@@ -239,7 +239,7 @@ member_recv_join_request (void *cls, | |||
239 | const struct GNUNET_MessageHeader *join_msg, | 239 | const struct GNUNET_MessageHeader *join_msg, |
240 | struct GNUNET_MULTICAST_JoinHandle *jh) | 240 | struct GNUNET_MULTICAST_JoinHandle *jh) |
241 | { | 241 | { |
242 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 242 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
243 | "Test #%u: member_recv_join_request()\n", test); | 243 | "Test #%u: member_recv_join_request()\n", test); |
244 | } | 244 | } |
245 | 245 | ||
@@ -247,7 +247,7 @@ member_recv_join_request (void *cls, | |||
247 | static void | 247 | static void |
248 | origin_stopped (void *cls) | 248 | origin_stopped (void *cls) |
249 | { | 249 | { |
250 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 250 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
251 | "Test #%u: origin_stopped()\n", test); | 251 | "Test #%u: origin_stopped()\n", test); |
252 | end (); | 252 | end (); |
253 | } | 253 | } |
@@ -267,7 +267,7 @@ schedule_origin_stop (void *cls) | |||
267 | static void | 267 | static void |
268 | member_parted (void *cls) | 268 | member_parted (void *cls) |
269 | { | 269 | { |
270 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 270 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
271 | "Test #%u: member_parted()\n", test); | 271 | "Test #%u: member_parted()\n", test); |
272 | member = NULL; | 272 | member = NULL; |
273 | 273 | ||
@@ -283,7 +283,7 @@ member_parted (void *cls) | |||
283 | 283 | ||
284 | default: | 284 | default: |
285 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 285 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
286 | "Invalid test #%d in member_recv_join_decision()\n", test); | 286 | "Invalid test #%d in member_parted()\n", test); |
287 | GNUNET_assert (0); | 287 | GNUNET_assert (0); |
288 | } | 288 | } |
289 | } | 289 | } |
@@ -292,7 +292,7 @@ member_parted (void *cls) | |||
292 | static void | 292 | static void |
293 | schedule_member_part (void *cls) | 293 | schedule_member_part (void *cls) |
294 | { | 294 | { |
295 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 295 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
296 | "Test #%u: schedule_member_part()\n", test); | 296 | "Test #%u: schedule_member_part()\n", test); |
297 | GNUNET_MULTICAST_member_part (member, member_parted, NULL); | 297 | GNUNET_MULTICAST_member_part (member, member_parted, NULL); |
298 | } | 298 | } |
@@ -312,7 +312,7 @@ static void | |||
312 | member_replay_ok () | 312 | member_replay_ok () |
313 | { | 313 | { |
314 | test = TEST_MEMBER_REPLAY_OK; | 314 | test = TEST_MEMBER_REPLAY_OK; |
315 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 315 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
316 | "Test #%u: member_replay_ok()\n", test); | 316 | "Test #%u: member_replay_ok()\n", test); |
317 | replay_fragment_id = 1; | 317 | replay_fragment_id = 1; |
318 | replay_flags = 1 | 1<<11; | 318 | replay_flags = 1 | 1<<11; |
@@ -325,7 +325,7 @@ static void | |||
325 | member_replay_error () | 325 | member_replay_error () |
326 | { | 326 | { |
327 | test = TEST_MEMBER_REPLAY_ERROR; | 327 | test = TEST_MEMBER_REPLAY_ERROR; |
328 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 328 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
329 | "Test #%u: member_replay_error()\n", test); | 329 | "Test #%u: member_replay_error()\n", test); |
330 | replay_fragment_id = 1234; | 330 | replay_fragment_id = 1234; |
331 | replay_flags = 11 | 1<<11; | 331 | replay_flags = 11 | 1<<11; |
@@ -342,7 +342,7 @@ origin_recv_replay_msg (void *cls, | |||
342 | uint64_t flags, | 342 | uint64_t flags, |
343 | struct GNUNET_MULTICAST_ReplayHandle *rh) | 343 | struct GNUNET_MULTICAST_ReplayHandle *rh) |
344 | { | 344 | { |
345 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 345 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
346 | "Test #%u: origin_recv_replay_msg()\n", test); | 346 | "Test #%u: origin_recv_replay_msg()\n", test); |
347 | GNUNET_assert (0); | 347 | GNUNET_assert (0); |
348 | } | 348 | } |
@@ -356,7 +356,7 @@ member_recv_replay_msg (void *cls, | |||
356 | uint64_t flags, | 356 | uint64_t flags, |
357 | struct GNUNET_MULTICAST_ReplayHandle *rh) | 357 | struct GNUNET_MULTICAST_ReplayHandle *rh) |
358 | { | 358 | { |
359 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 359 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
360 | "Test #%u: member_recv_replay_msg()\n", test); | 360 | "Test #%u: member_recv_replay_msg()\n", test); |
361 | GNUNET_assert (0); | 361 | GNUNET_assert (0); |
362 | } | 362 | } |
@@ -369,7 +369,7 @@ origin_recv_replay_frag (void *cls, | |||
369 | uint64_t flags, | 369 | uint64_t flags, |
370 | struct GNUNET_MULTICAST_ReplayHandle *rh) | 370 | struct GNUNET_MULTICAST_ReplayHandle *rh) |
371 | { | 371 | { |
372 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 372 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
373 | "Test #%u: origin_recv_replay_frag()" | 373 | "Test #%u: origin_recv_replay_frag()" |
374 | " - fragment_id=%" PRIu64 " flags=%" PRIu64 "\n", | 374 | " - fragment_id=%" PRIu64 " flags=%" PRIu64 "\n", |
375 | test, fragment_id, flags); | 375 | test, fragment_id, flags); |
@@ -416,7 +416,7 @@ member_recv_replay_frag (void *cls, | |||
416 | uint64_t flags, | 416 | uint64_t flags, |
417 | struct GNUNET_MULTICAST_ReplayHandle *rh) | 417 | struct GNUNET_MULTICAST_ReplayHandle *rh) |
418 | { | 418 | { |
419 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 419 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
420 | "Test #%u: member_recv_replay_frag()\n", test); | 420 | "Test #%u: member_recv_replay_frag()\n", test); |
421 | GNUNET_assert (0); | 421 | GNUNET_assert (0); |
422 | } | 422 | } |
@@ -427,7 +427,7 @@ origin_recv_request (void *cls, | |||
427 | const struct GNUNET_MULTICAST_RequestHeader *req) | 427 | const struct GNUNET_MULTICAST_RequestHeader *req) |
428 | { | 428 | { |
429 | struct OriginClosure *ocls = cls; | 429 | struct OriginClosure *ocls = cls; |
430 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 430 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
431 | "Test #%u: origin_recv_request()\n", test); | 431 | "Test #%u: origin_recv_request()\n", test); |
432 | if (++ocls->n != ocls->msgs_expected) | 432 | if (++ocls->n != ocls->msgs_expected) |
433 | return; | 433 | return; |
@@ -446,7 +446,7 @@ static void | |||
446 | member_to_origin () | 446 | member_to_origin () |
447 | { | 447 | { |
448 | test = TEST_MEMBER_TO_ORIGIN; | 448 | test = TEST_MEMBER_TO_ORIGIN; |
449 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 449 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
450 | "Test #%u: member_to_origin()\n", test); | 450 | "Test #%u: member_to_origin()\n", test); |
451 | 451 | ||
452 | struct TransmitClosure *tmit = &tmit_cls; | 452 | struct TransmitClosure *tmit = &tmit_cls; |
@@ -471,7 +471,7 @@ member_recv_message (void *cls, | |||
471 | { | 471 | { |
472 | struct MemberClosure *mcls = cls; | 472 | struct MemberClosure *mcls = cls; |
473 | 473 | ||
474 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 474 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
475 | "Test #%u: member_recv_message() %u/%u\n", | 475 | "Test #%u: member_recv_message() %u/%u\n", |
476 | test, | 476 | test, |
477 | (unsigned int) (mcls->n + 1), | 477 | (unsigned int) (mcls->n + 1), |
@@ -505,7 +505,7 @@ origin_recv_message (void *cls, | |||
505 | const struct GNUNET_MULTICAST_MessageHeader *msg) | 505 | const struct GNUNET_MULTICAST_MessageHeader *msg) |
506 | { | 506 | { |
507 | struct OriginClosure *ocls = cls; | 507 | struct OriginClosure *ocls = cls; |
508 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 508 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
509 | "Test #%u: origin_recv_message() %u/%u\n", | 509 | "Test #%u: origin_recv_message() %u/%u\n", |
510 | test, ocls->n + 1, ocls->msgs_expected); | 510 | test, ocls->n + 1, ocls->msgs_expected); |
511 | if (++ocls->n != ocls->msgs_expected) | 511 | if (++ocls->n != ocls->msgs_expected) |
@@ -562,7 +562,7 @@ member_recv_join_decision (void *cls, | |||
562 | const struct GNUNET_PeerIdentity *relays, | 562 | const struct GNUNET_PeerIdentity *relays, |
563 | const struct GNUNET_MessageHeader *join_msg) | 563 | const struct GNUNET_MessageHeader *join_msg) |
564 | { | 564 | { |
565 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 565 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
566 | "Test #%u: member_recv_join_decision() - is_admitted: %d\n", | 566 | "Test #%u: member_recv_join_decision() - is_admitted: %d\n", |
567 | test, is_admitted); | 567 | test, is_admitted); |
568 | 568 | ||
@@ -597,7 +597,7 @@ origin_recv_join_request (void *cls, | |||
597 | const struct GNUNET_MessageHeader *join_msg, | 597 | const struct GNUNET_MessageHeader *join_msg, |
598 | struct GNUNET_MULTICAST_JoinHandle *jh) | 598 | struct GNUNET_MULTICAST_JoinHandle *jh) |
599 | { | 599 | { |
600 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 600 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
601 | "Test #%u: origin_recv_join_request()\n", test); | 601 | "Test #%u: origin_recv_join_request()\n", test); |
602 | 602 | ||
603 | GNUNET_assert (0 == memcmp (mem_key, &member_pub_key, sizeof (member_pub_key))); | 603 | GNUNET_assert (0 == memcmp (mem_key, &member_pub_key, sizeof (member_pub_key))); |