comparison src/signals.c @ 8004:07dc83303503

[gaim-migrate @ 8681] Removing a signal handler while a signal is being emitted could crash Gaim. This should now be fixed. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Mon, 05 Jan 2004 07:03:56 +0000
parents 191e5b9a249b
children fa6395637e2c
comparison
equal deleted inserted replaced
8003:b9d3d397a195 8004:07dc83303503
410 gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) 410 gaim_signal_emit_vargs(void *instance, const char *signal, va_list args)
411 { 411 {
412 GaimInstanceData *instance_data; 412 GaimInstanceData *instance_data;
413 GaimSignalData *signal_data; 413 GaimSignalData *signal_data;
414 GaimSignalHandlerData *handler_data; 414 GaimSignalHandlerData *handler_data;
415 GList *l; 415 GList *l, *l_next;
416 416
417 g_return_if_fail(instance != NULL); 417 g_return_if_fail(instance != NULL);
418 g_return_if_fail(signal != NULL); 418 g_return_if_fail(signal != NULL);
419 419
420 instance_data = 420 instance_data =
430 gaim_debug(GAIM_DEBUG_ERROR, "signals", 430 gaim_debug(GAIM_DEBUG_ERROR, "signals",
431 "Signal data for %s not found!\n", signal); 431 "Signal data for %s not found!\n", signal);
432 return; 432 return;
433 } 433 }
434 434
435 for (l = signal_data->handlers; l != NULL; l = l->next) 435 for (l = signal_data->handlers; l != NULL; l = l_next)
436 { 436 {
437 l_next = l->next;
438
437 handler_data = (GaimSignalHandlerData *)l->data; 439 handler_data = (GaimSignalHandlerData *)l->data;
438 440
439 if (handler_data->use_vargs) 441 if (handler_data->use_vargs)
440 { 442 {
441 ((void (*)(va_list, void *))handler_data->cb)(args, 443 ((void (*)(va_list, void *))handler_data->cb)(args,
471 { 473 {
472 GaimInstanceData *instance_data; 474 GaimInstanceData *instance_data;
473 GaimSignalData *signal_data; 475 GaimSignalData *signal_data;
474 GaimSignalHandlerData *handler_data; 476 GaimSignalHandlerData *handler_data;
475 void *ret_val = NULL; 477 void *ret_val = NULL;
476 GList *l; 478 GList *l, *l_next;
477 479
478 g_return_val_if_fail(instance != NULL, NULL); 480 g_return_val_if_fail(instance != NULL, NULL);
479 g_return_val_if_fail(signal != NULL, NULL); 481 g_return_val_if_fail(signal != NULL, NULL);
480 482
481 instance_data = 483 instance_data =
491 gaim_debug(GAIM_DEBUG_ERROR, "signals", 493 gaim_debug(GAIM_DEBUG_ERROR, "signals",
492 "Signal data for %s not found!\n", signal); 494 "Signal data for %s not found!\n", signal);
493 return 0; 495 return 0;
494 } 496 }
495 497
496 for (l = signal_data->handlers; l != NULL; l = l->next) 498 for (l = signal_data->handlers; l != NULL; l = l_next)
497 { 499 {
500 l_next = l->next;
501
498 handler_data = (GaimSignalHandlerData *)l->data; 502 handler_data = (GaimSignalHandlerData *)l->data;
499 503
500 if (handler_data->use_vargs) 504 if (handler_data->use_vargs)
501 { 505 {
502 ret_val = ((void *(*)(va_list, void *))handler_data->cb)( 506 ret_val = ((void *(*)(va_list, void *))handler_data->cb)(