diff options
Diffstat (limited to 'src/statistics')
-rw-r--r-- | src/statistics/gnunet-service-statistics.c | 418 | ||||
-rw-r--r-- | src/statistics/gnunet-statistics.c | 42 |
2 files changed, 175 insertions, 285 deletions
diff --git a/src/statistics/gnunet-service-statistics.c b/src/statistics/gnunet-service-statistics.c index 5ce54d768..18905f458 100644 --- a/src/statistics/gnunet-service-statistics.c +++ b/src/statistics/gnunet-service-statistics.c | |||
@@ -71,7 +71,6 @@ struct WatchEntry | |||
71 | * #GNUNET_NO : last_value is n/a, #GNUNET_YES: last_value is valid | 71 | * #GNUNET_NO : last_value is n/a, #GNUNET_YES: last_value is valid |
72 | */ | 72 | */ |
73 | int last_value_set; | 73 | int last_value_set; |
74 | |||
75 | }; | 74 | }; |
76 | 75 | ||
77 | 76 | ||
@@ -138,7 +137,6 @@ struct StatsEntry | |||
138 | * #GNUNET_NO: value is n/a, #GNUNET_YES: value is valid | 137 | * #GNUNET_NO: value is n/a, #GNUNET_YES: value is valid |
139 | */ | 138 | */ |
140 | int set; | 139 | int set; |
141 | |||
142 | }; | 140 | }; |
143 | 141 | ||
144 | 142 | ||
@@ -173,7 +171,6 @@ struct SubsystemEntry | |||
173 | * the end of this struct, do not free(). | 171 | * the end of this struct, do not free(). |
174 | */ | 172 | */ |
175 | const char *service; | 173 | const char *service; |
176 | |||
177 | }; | 174 | }; |
178 | 175 | ||
179 | 176 | ||
@@ -201,7 +198,6 @@ struct ClientEntry | |||
201 | * Maximum watch ID used by this client so far. | 198 | * Maximum watch ID used by this client so far. |
202 | */ | 199 | */ |
203 | uint32_t max_wid; | 200 | uint32_t max_wid; |
204 | |||
205 | }; | 201 | }; |
206 | 202 | ||
207 | 203 | ||
@@ -257,11 +253,10 @@ save () | |||
257 | size_t slen; | 253 | size_t slen; |
258 | struct GNUNET_STATISTICS_SetMessage *msg; | 254 | struct GNUNET_STATISTICS_SetMessage *msg; |
259 | 255 | ||
260 | if (GNUNET_OK != | 256 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, |
261 | GNUNET_CONFIGURATION_get_value_filename (cfg, | 257 | "STATISTICS", |
262 | "STATISTICS", | 258 | "DATABASE", |
263 | "DATABASE", | 259 | &fn)) |
264 | &fn)) | ||
265 | { | 260 | { |
266 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, | 261 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, |
267 | "STATISTICS", | 262 | "STATISTICS", |
@@ -273,17 +268,12 @@ save () | |||
273 | total = 0; | 268 | total = 0; |
274 | while (NULL != (se = sub_head)) | 269 | while (NULL != (se = sub_head)) |
275 | { | 270 | { |
276 | GNUNET_CONTAINER_DLL_remove (sub_head, | 271 | GNUNET_CONTAINER_DLL_remove (sub_head, sub_tail, se); |
277 | sub_tail, | ||
278 | se); | ||
279 | slen = strlen (se->service) + 1; | 272 | slen = strlen (se->service) + 1; |
280 | while (NULL != (pos = se->stat_head)) | 273 | while (NULL != (pos = se->stat_head)) |
281 | { | 274 | { |
282 | GNUNET_CONTAINER_DLL_remove (se->stat_head, | 275 | GNUNET_CONTAINER_DLL_remove (se->stat_head, se->stat_tail, pos); |
283 | se->stat_tail, | 276 | if ((pos->persistent) && (NULL != wh)) |
284 | pos); | ||
285 | if ( (pos->persistent) && | ||
286 | (NULL != wh) ) | ||
287 | { | 277 | { |
288 | nlen = strlen (pos->name) + 1; | 278 | nlen = strlen (pos->name) + 1; |
289 | size = sizeof (struct GNUNET_STATISTICS_SetMessage) + nlen + slen; | 279 | size = sizeof (struct GNUNET_STATISTICS_SetMessage) + nlen + slen; |
@@ -298,19 +288,14 @@ save () | |||
298 | 2, | 288 | 2, |
299 | se->service, | 289 | se->service, |
300 | pos->name)); | 290 | pos->name)); |
301 | msg->flags = htonl (pos->persistent ? GNUNET_STATISTICS_SETFLAG_PERSISTENT : 0); | 291 | msg->flags = |
292 | htonl (pos->persistent ? GNUNET_STATISTICS_SETFLAG_PERSISTENT : 0); | ||
302 | msg->value = GNUNET_htonll (pos->value); | 293 | msg->value = GNUNET_htonll (pos->value); |
303 | if (GNUNET_OK != GNUNET_BIO_write (wh, | 294 | if (GNUNET_OK != GNUNET_BIO_write (wh, msg, size)) |
304 | msg, | ||
305 | size)) | ||
306 | { | 295 | { |
307 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, | 296 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "write", fn); |
308 | "write", | ||
309 | fn); | ||
310 | if (GNUNET_OK != GNUNET_BIO_write_close (wh)) | 297 | if (GNUNET_OK != GNUNET_BIO_write_close (wh)) |
311 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, | 298 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "close", fn); |
312 | "close", | ||
313 | fn); | ||
314 | wh = NULL; | 299 | wh = NULL; |
315 | } | 300 | } |
316 | else | 301 | else |
@@ -325,17 +310,13 @@ save () | |||
325 | } | 310 | } |
326 | if (NULL != wh) | 311 | if (NULL != wh) |
327 | { | 312 | { |
328 | if (GNUNET_OK != | 313 | if (GNUNET_OK != GNUNET_BIO_write_close (wh)) |
329 | GNUNET_BIO_write_close (wh)) | 314 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "close", fn); |
330 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, | ||
331 | "close", | ||
332 | fn); | ||
333 | if (0 == total) | 315 | if (0 == total) |
334 | GNUNET_break (0 == | 316 | GNUNET_break (0 == unlink (fn)); |
335 | UNLINK (fn)); | ||
336 | else | 317 | else |
337 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 318 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
338 | _("Wrote %llu bytes of statistics to `%s'\n"), | 319 | _ ("Wrote %llu bytes of statistics to `%s'\n"), |
339 | total, | 320 | total, |
340 | fn); | 321 | fn); |
341 | } | 322 | } |
@@ -350,37 +331,31 @@ save () | |||
350 | * @param e value to transmit | 331 | * @param e value to transmit |
351 | */ | 332 | */ |
352 | static void | 333 | static void |
353 | transmit (struct ClientEntry *ce, | 334 | transmit (struct ClientEntry *ce, const struct StatsEntry *e) |
354 | const struct StatsEntry *e) | ||
355 | { | 335 | { |
356 | struct GNUNET_MQ_Envelope *env; | 336 | struct GNUNET_MQ_Envelope *env; |
357 | struct GNUNET_STATISTICS_ReplyMessage *m; | 337 | struct GNUNET_STATISTICS_ReplyMessage *m; |
358 | size_t size; | 338 | size_t size; |
359 | 339 | ||
360 | size = strlen (e->subsystem->service) + 1 + | 340 | size = strlen (e->subsystem->service) + 1 + strlen (e->name) + 1; |
361 | strlen (e->name) + 1; | ||
362 | GNUNET_assert (size < GNUNET_MAX_MESSAGE_SIZE); | 341 | GNUNET_assert (size < GNUNET_MAX_MESSAGE_SIZE); |
363 | env = GNUNET_MQ_msg_extra (m, | 342 | env = GNUNET_MQ_msg_extra (m, size, GNUNET_MESSAGE_TYPE_STATISTICS_VALUE); |
364 | size, | ||
365 | GNUNET_MESSAGE_TYPE_STATISTICS_VALUE); | ||
366 | m->uid = htonl (e->uid); | 343 | m->uid = htonl (e->uid); |
367 | if (e->persistent) | 344 | if (e->persistent) |
368 | m->uid |= htonl (GNUNET_STATISTICS_PERSIST_BIT); | 345 | m->uid |= htonl (GNUNET_STATISTICS_PERSIST_BIT); |
369 | m->value = GNUNET_htonll (e->value); | 346 | m->value = GNUNET_htonll (e->value); |
370 | GNUNET_assert (size == | 347 | GNUNET_assert (size == GNUNET_STRINGS_buffer_fill ((char *) &m[1], |
371 | GNUNET_STRINGS_buffer_fill ((char *) &m[1], | 348 | size, |
372 | size, | 349 | 2, |
373 | 2, | 350 | e->subsystem->service, |
374 | e->subsystem->service, | 351 | e->name)); |
375 | e->name)); | ||
376 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 352 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
377 | "Transmitting value for `%s:%s' (%d): %llu\n", | 353 | "Transmitting value for `%s:%s' (%d): %llu\n", |
378 | e->subsystem->service, | 354 | e->subsystem->service, |
379 | e->name, | 355 | e->name, |
380 | e->persistent, | 356 | e->persistent, |
381 | (unsigned long long) e->value); | 357 | (unsigned long long) e->value); |
382 | GNUNET_MQ_send (ce->mq, | 358 | GNUNET_MQ_send (ce->mq, env); |
383 | env); | ||
384 | } | 359 | } |
385 | 360 | ||
386 | 361 | ||
@@ -394,8 +369,8 @@ transmit (struct ClientEntry *ce, | |||
394 | */ | 369 | */ |
395 | static void * | 370 | static void * |
396 | client_connect_cb (void *cls, | 371 | client_connect_cb (void *cls, |
397 | struct GNUNET_SERVICE_Client *c, | 372 | struct GNUNET_SERVICE_Client *c, |
398 | struct GNUNET_MQ_Handle *mq) | 373 | struct GNUNET_MQ_Handle *mq) |
399 | { | 374 | { |
400 | struct ClientEntry *ce; | 375 | struct ClientEntry *ce; |
401 | 376 | ||
@@ -403,8 +378,7 @@ client_connect_cb (void *cls, | |||
403 | ce->client = c; | 378 | ce->client = c; |
404 | ce->mq = mq; | 379 | ce->mq = mq; |
405 | client_count++; | 380 | client_count++; |
406 | GNUNET_notification_context_add (nc, | 381 | GNUNET_notification_context_add (nc, mq); |
407 | mq); | ||
408 | return ce; | 382 | return ce; |
409 | } | 383 | } |
410 | 384 | ||
@@ -417,20 +391,18 @@ client_connect_cb (void *cls, | |||
417 | * @return #GNUNET_OK if @a message is well-formed | 391 | * @return #GNUNET_OK if @a message is well-formed |
418 | */ | 392 | */ |
419 | static int | 393 | static int |
420 | check_get (void *cls, | 394 | check_get (void *cls, const struct GNUNET_MessageHeader *message) |
421 | const struct GNUNET_MessageHeader *message) | ||
422 | { | 395 | { |
423 | const char *service; | 396 | const char *service; |
424 | const char *name; | 397 | const char *name; |
425 | size_t size; | 398 | size_t size; |
426 | 399 | ||
427 | size = ntohs (message->size) - sizeof (struct GNUNET_MessageHeader); | 400 | size = ntohs (message->size) - sizeof (struct GNUNET_MessageHeader); |
428 | if (size != | 401 | if (size != GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], |
429 | GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], | 402 | size, |
430 | size, | 403 | 2, |
431 | 2, | 404 | &service, |
432 | &service, | 405 | &name)) |
433 | &name)) | ||
434 | { | 406 | { |
435 | GNUNET_break (0); | 407 | GNUNET_break (0); |
436 | return GNUNET_SYSERR; | 408 | return GNUNET_SYSERR; |
@@ -446,8 +418,7 @@ check_get (void *cls, | |||
446 | * @param message the actual message | 418 | * @param message the actual message |
447 | */ | 419 | */ |
448 | static void | 420 | static void |
449 | handle_get (void *cls, | 421 | handle_get (void *cls, const struct GNUNET_MessageHeader *message) |
450 | const struct GNUNET_MessageHeader *message) | ||
451 | { | 422 | { |
452 | struct ClientEntry *ce = cls; | 423 | struct ClientEntry *ce = cls; |
453 | struct GNUNET_MQ_Envelope *env; | 424 | struct GNUNET_MQ_Envelope *env; |
@@ -462,11 +433,11 @@ handle_get (void *cls, | |||
462 | 433 | ||
463 | size = ntohs (message->size) - sizeof (struct GNUNET_MessageHeader); | 434 | size = ntohs (message->size) - sizeof (struct GNUNET_MessageHeader); |
464 | GNUNET_assert (size == | 435 | GNUNET_assert (size == |
465 | GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], | 436 | GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], |
466 | size, | 437 | size, |
467 | 2, | 438 | 2, |
468 | &service, | 439 | &service, |
469 | &name)); | 440 | &name)); |
470 | slen = strlen (service); | 441 | slen = strlen (service); |
471 | nlen = strlen (name); | 442 | nlen = strlen (name); |
472 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 443 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -475,23 +446,17 @@ handle_get (void *cls, | |||
475 | nlen ? name : "*"); | 446 | nlen ? name : "*"); |
476 | for (se = sub_head; NULL != se; se = se->next) | 447 | for (se = sub_head; NULL != se; se = se->next) |
477 | { | 448 | { |
478 | if (! ( (0 == slen) || | 449 | if (! ((0 == slen) || (0 == strcmp (service, se->service)))) |
479 | (0 == strcmp (service, se->service))) ) | ||
480 | continue; | 450 | continue; |
481 | for (pos = se->stat_head; NULL != pos; pos = pos->next) | 451 | for (pos = se->stat_head; NULL != pos; pos = pos->next) |
482 | { | 452 | { |
483 | if (! ( (0 == nlen) || | 453 | if (! ((0 == nlen) || (0 == strcmp (name, pos->name)))) |
484 | (0 == strcmp (name, | ||
485 | pos->name))) ) | ||
486 | continue; | 454 | continue; |
487 | transmit (ce, | 455 | transmit (ce, pos); |
488 | pos); | ||
489 | } | 456 | } |
490 | } | 457 | } |
491 | env = GNUNET_MQ_msg (end, | 458 | env = GNUNET_MQ_msg (end, GNUNET_MESSAGE_TYPE_STATISTICS_END); |
492 | GNUNET_MESSAGE_TYPE_STATISTICS_END); | 459 | GNUNET_MQ_send (ce->mq, env); |
493 | GNUNET_MQ_send (ce->mq, | ||
494 | env); | ||
495 | GNUNET_SERVICE_client_continue (ce->client); | 460 | GNUNET_SERVICE_client_continue (ce->client); |
496 | } | 461 | } |
497 | 462 | ||
@@ -519,14 +484,13 @@ notify_change (struct StatsEntry *se) | |||
519 | { | 484 | { |
520 | pos->last_value_set = GNUNET_YES; | 485 | pos->last_value_set = GNUNET_YES; |
521 | } | 486 | } |
522 | env = GNUNET_MQ_msg (wvm, | 487 | env = GNUNET_MQ_msg (wvm, GNUNET_MESSAGE_TYPE_STATISTICS_WATCH_VALUE); |
523 | GNUNET_MESSAGE_TYPE_STATISTICS_WATCH_VALUE); | 488 | wvm->flags = |
524 | wvm->flags = htonl (se->persistent ? GNUNET_STATISTICS_SETFLAG_PERSISTENT : 0); | 489 | htonl (se->persistent ? GNUNET_STATISTICS_SETFLAG_PERSISTENT : 0); |
525 | wvm->wid = htonl (pos->wid); | 490 | wvm->wid = htonl (pos->wid); |
526 | wvm->reserved = htonl (0); | 491 | wvm->reserved = htonl (0); |
527 | wvm->value = GNUNET_htonll (se->value); | 492 | wvm->value = GNUNET_htonll (se->value); |
528 | GNUNET_MQ_send (pos->ce->mq, | 493 | GNUNET_MQ_send (pos->ce->mq, env); |
529 | env); | ||
530 | pos->last_value = se->value; | 494 | pos->last_value = se->value; |
531 | } | 495 | } |
532 | } | 496 | } |
@@ -541,8 +505,7 @@ notify_change (struct StatsEntry *se) | |||
541 | * @return subsystem entry, never NULL (subsystem entry is created if necessary) | 505 | * @return subsystem entry, never NULL (subsystem entry is created if necessary) |
542 | */ | 506 | */ |
543 | static struct SubsystemEntry * | 507 | static struct SubsystemEntry * |
544 | find_subsystem_entry (struct ClientEntry *ce, | 508 | find_subsystem_entry (struct ClientEntry *ce, const char *service) |
545 | const char *service) | ||
546 | { | 509 | { |
547 | size_t slen; | 510 | size_t slen; |
548 | struct SubsystemEntry *se; | 511 | struct SubsystemEntry *se; |
@@ -551,13 +514,10 @@ find_subsystem_entry (struct ClientEntry *ce, | |||
551 | se = ce->subsystem; | 514 | se = ce->subsystem; |
552 | else | 515 | else |
553 | se = NULL; | 516 | se = NULL; |
554 | if ( (NULL == se) || | 517 | if ((NULL == se) || (0 != strcmp (service, se->service))) |
555 | (0 != strcmp (service, | ||
556 | se->service)) ) | ||
557 | { | 518 | { |
558 | for (se = sub_head; NULL != se; se = se->next) | 519 | for (se = sub_head; NULL != se; se = se->next) |
559 | if (0 == strcmp (service, | 520 | if (0 == strcmp (service, se->service)) |
560 | se->service)) | ||
561 | break; | 521 | break; |
562 | if (NULL != ce) | 522 | if (NULL != ce) |
563 | ce->subsystem = se; | 523 | ce->subsystem = se; |
@@ -568,15 +528,10 @@ find_subsystem_entry (struct ClientEntry *ce, | |||
568 | "Allocating new subsystem entry `%s'\n", | 528 | "Allocating new subsystem entry `%s'\n", |
569 | service); | 529 | service); |
570 | slen = strlen (service) + 1; | 530 | slen = strlen (service) + 1; |
571 | se = GNUNET_malloc (sizeof (struct SubsystemEntry) + | 531 | se = GNUNET_malloc (sizeof (struct SubsystemEntry) + slen); |
572 | slen); | 532 | GNUNET_memcpy (&se[1], service, slen); |
573 | GNUNET_memcpy (&se[1], | ||
574 | service, | ||
575 | slen); | ||
576 | se->service = (const char *) &se[1]; | 533 | se->service = (const char *) &se[1]; |
577 | GNUNET_CONTAINER_DLL_insert (sub_head, | 534 | GNUNET_CONTAINER_DLL_insert (sub_head, sub_tail, se); |
578 | sub_tail, | ||
579 | se); | ||
580 | if (NULL != ce) | 535 | if (NULL != ce) |
581 | ce->subsystem = se; | 536 | ce->subsystem = se; |
582 | return se; | 537 | return se; |
@@ -591,13 +546,12 @@ find_subsystem_entry (struct ClientEntry *ce, | |||
591 | * @return statistis entry, or NULL if not found | 546 | * @return statistis entry, or NULL if not found |
592 | */ | 547 | */ |
593 | static struct StatsEntry * | 548 | static struct StatsEntry * |
594 | find_stat_entry (struct SubsystemEntry *se, | 549 | find_stat_entry (struct SubsystemEntry *se, const char *name) |
595 | const char *name) | ||
596 | { | 550 | { |
597 | struct StatsEntry *pos; | 551 | struct StatsEntry *pos; |
598 | 552 | ||
599 | for (pos = se->stat_head; NULL != pos; pos = pos->next) | 553 | for (pos = se->stat_head; NULL != pos; pos = pos->next) |
600 | if (0 == strcmp (name, pos->name)) | 554 | if (0 == strcmp (name, pos->name)) |
601 | return pos; | 555 | return pos; |
602 | return NULL; | 556 | return NULL; |
603 | } | 557 | } |
@@ -611,20 +565,18 @@ find_stat_entry (struct SubsystemEntry *se, | |||
611 | * @return #GNUNET_OK if message is well-formed | 565 | * @return #GNUNET_OK if message is well-formed |
612 | */ | 566 | */ |
613 | static int | 567 | static int |
614 | check_set (void *cls, | 568 | check_set (void *cls, const struct GNUNET_STATISTICS_SetMessage *msg) |
615 | const struct GNUNET_STATISTICS_SetMessage *msg) | ||
616 | { | 569 | { |
617 | const char *service; | 570 | const char *service; |
618 | const char *name; | 571 | const char *name; |
619 | size_t msize; | 572 | size_t msize; |
620 | 573 | ||
621 | msize = ntohs (msg->header.size) - sizeof (*msg); | 574 | msize = ntohs (msg->header.size) - sizeof (*msg); |
622 | if (msize != | 575 | if (msize != GNUNET_STRINGS_buffer_tokenize ((const char *) &msg[1], |
623 | GNUNET_STRINGS_buffer_tokenize ((const char *) &msg[1], | 576 | msize, |
624 | msize, | 577 | 2, |
625 | 2, | 578 | &service, |
626 | &service, | 579 | &name)) |
627 | &name)) | ||
628 | { | 580 | { |
629 | GNUNET_break (0); | 581 | GNUNET_break (0); |
630 | return GNUNET_SYSERR; | 582 | return GNUNET_SYSERR; |
@@ -640,8 +592,7 @@ check_set (void *cls, | |||
640 | * @param message the actual message | 592 | * @param message the actual message |
641 | */ | 593 | */ |
642 | static void | 594 | static void |
643 | handle_set (void *cls, | 595 | handle_set (void *cls, const struct GNUNET_STATISTICS_SetMessage *msg) |
644 | const struct GNUNET_STATISTICS_SetMessage *msg) | ||
645 | { | 596 | { |
646 | struct ClientEntry *ce = cls; | 597 | struct ClientEntry *ce = cls; |
647 | const char *service; | 598 | const char *service; |
@@ -659,14 +610,12 @@ handle_set (void *cls, | |||
659 | 610 | ||
660 | msize = ntohs (msg->header.size); | 611 | msize = ntohs (msg->header.size); |
661 | size = msize - sizeof (struct GNUNET_STATISTICS_SetMessage); | 612 | size = msize - sizeof (struct GNUNET_STATISTICS_SetMessage); |
662 | GNUNET_assert (size == | 613 | GNUNET_assert (size == GNUNET_STRINGS_buffer_tokenize ((const char *) &msg[1], |
663 | GNUNET_STRINGS_buffer_tokenize ((const char *) &msg[1], | 614 | size, |
664 | size, | 615 | 2, |
665 | 2, | 616 | &service, |
666 | &service, | 617 | &name)); |
667 | &name)); | 618 | se = find_subsystem_entry (ce, service); |
668 | se = find_subsystem_entry (ce, | ||
669 | service); | ||
670 | flags = ntohl (msg->flags); | 619 | flags = ntohl (msg->flags); |
671 | value = GNUNET_ntohll (msg->value); | 620 | value = GNUNET_ntohll (msg->value); |
672 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 621 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -675,8 +624,7 @@ handle_set (void *cls, | |||
675 | name, | 624 | name, |
676 | (unsigned int) flags, | 625 | (unsigned int) flags, |
677 | (unsigned long long) value); | 626 | (unsigned long long) value); |
678 | pos = find_stat_entry (se, | 627 | pos = find_stat_entry (se, name); |
679 | name); | ||
680 | if (NULL != pos) | 628 | if (NULL != pos) |
681 | { | 629 | { |
682 | initial_set = 0; | 630 | initial_set = 0; |
@@ -696,8 +644,7 @@ handle_set (void *cls, | |||
696 | else | 644 | else |
697 | { | 645 | { |
698 | changed = (0 != delta); | 646 | changed = (0 != delta); |
699 | GNUNET_break ( (delta <= 0) || | 647 | GNUNET_break ((delta <= 0) || (pos->value + delta > pos->value)); |
700 | (pos->value + delta > pos->value) ); | ||
701 | pos->value += delta; | 648 | pos->value += delta; |
702 | } | 649 | } |
703 | } | 650 | } |
@@ -710,12 +657,8 @@ handle_set (void *cls, | |||
710 | if (pos != se->stat_head) | 657 | if (pos != se->stat_head) |
711 | { | 658 | { |
712 | /* move to front for faster setting next time! */ | 659 | /* move to front for faster setting next time! */ |
713 | GNUNET_CONTAINER_DLL_remove (se->stat_head, | 660 | GNUNET_CONTAINER_DLL_remove (se->stat_head, se->stat_tail, pos); |
714 | se->stat_tail, | 661 | GNUNET_CONTAINER_DLL_insert (se->stat_head, se->stat_tail, pos); |
715 | pos); | ||
716 | GNUNET_CONTAINER_DLL_insert (se->stat_head, | ||
717 | se->stat_tail, | ||
718 | pos); | ||
719 | } | 662 | } |
720 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 663 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
721 | "Statistic `%s:%s' updated to value %llu (%d).\n", | 664 | "Statistic `%s:%s' updated to value %llu (%d).\n", |
@@ -723,8 +666,7 @@ handle_set (void *cls, | |||
723 | name, | 666 | name, |
724 | (unsigned long long) pos->value, | 667 | (unsigned long long) pos->value, |
725 | pos->persistent); | 668 | pos->persistent); |
726 | if ( (changed) || | 669 | if ((changed) || (1 == initial_set)) |
727 | (1 == initial_set) ) | ||
728 | notify_change (pos); | 670 | notify_change (pos); |
729 | GNUNET_SERVICE_client_continue (ce->client); | 671 | GNUNET_SERVICE_client_continue (ce->client); |
730 | return; | 672 | return; |
@@ -732,13 +674,11 @@ handle_set (void *cls, | |||
732 | /* not found, create a new entry */ | 674 | /* not found, create a new entry */ |
733 | nlen = strlen (name) + 1; | 675 | nlen = strlen (name) + 1; |
734 | pos = GNUNET_malloc (sizeof (struct StatsEntry) + nlen); | 676 | pos = GNUNET_malloc (sizeof (struct StatsEntry) + nlen); |
735 | GNUNET_memcpy (&pos[1], | 677 | GNUNET_memcpy (&pos[1], name, nlen); |
736 | name, | ||
737 | nlen); | ||
738 | pos->name = (const char *) &pos[1]; | 678 | pos->name = (const char *) &pos[1]; |
739 | pos->subsystem = se; | 679 | pos->subsystem = se; |
740 | if ( (0 == (flags & GNUNET_STATISTICS_SETFLAG_RELATIVE)) || | 680 | if ((0 == (flags & GNUNET_STATISTICS_SETFLAG_RELATIVE)) || |
741 | (0 < (int64_t) GNUNET_ntohll (msg->value)) ) | 681 | (0 < (int64_t) GNUNET_ntohll (msg->value))) |
742 | { | 682 | { |
743 | pos->value = GNUNET_ntohll (msg->value); | 683 | pos->value = GNUNET_ntohll (msg->value); |
744 | pos->set = GNUNET_YES; | 684 | pos->set = GNUNET_YES; |
@@ -749,9 +689,7 @@ handle_set (void *cls, | |||
749 | } | 689 | } |
750 | pos->uid = uidgen++; | 690 | pos->uid = uidgen++; |
751 | pos->persistent = (0 != (flags & GNUNET_STATISTICS_SETFLAG_PERSISTENT)); | 691 | pos->persistent = (0 != (flags & GNUNET_STATISTICS_SETFLAG_PERSISTENT)); |
752 | GNUNET_CONTAINER_DLL_insert (se->stat_head, | 692 | GNUNET_CONTAINER_DLL_insert (se->stat_head, se->stat_tail, pos); |
753 | se->stat_tail, | ||
754 | pos); | ||
755 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 693 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
756 | "New statistic on `%s:%s' with value %llu created.\n", | 694 | "New statistic on `%s:%s' with value %llu created.\n", |
757 | service, | 695 | service, |
@@ -770,20 +708,18 @@ handle_set (void *cls, | |||
770 | * @return #GNUNET_OK if message is well-formed | 708 | * @return #GNUNET_OK if message is well-formed |
771 | */ | 709 | */ |
772 | static int | 710 | static int |
773 | check_watch (void *cls, | 711 | check_watch (void *cls, const struct GNUNET_MessageHeader *message) |
774 | const struct GNUNET_MessageHeader *message) | ||
775 | { | 712 | { |
776 | size_t size; | 713 | size_t size; |
777 | const char *service; | 714 | const char *service; |
778 | const char *name; | 715 | const char *name; |
779 | 716 | ||
780 | size = ntohs (message->size) - sizeof (struct GNUNET_MessageHeader); | 717 | size = ntohs (message->size) - sizeof (struct GNUNET_MessageHeader); |
781 | if (size != | 718 | if (size != GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], |
782 | GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], | 719 | size, |
783 | size, | 720 | 2, |
784 | 2, | 721 | &service, |
785 | &service, | 722 | &name)) |
786 | &name)) | ||
787 | { | 723 | { |
788 | GNUNET_break (0); | 724 | GNUNET_break (0); |
789 | return GNUNET_SYSERR; | 725 | return GNUNET_SYSERR; |
@@ -799,8 +735,7 @@ check_watch (void *cls, | |||
799 | * @param message the actual message | 735 | * @param message the actual message |
800 | */ | 736 | */ |
801 | static void | 737 | static void |
802 | handle_watch (void *cls, | 738 | handle_watch (void *cls, const struct GNUNET_MessageHeader *message) |
803 | const struct GNUNET_MessageHeader *message) | ||
804 | { | 739 | { |
805 | struct ClientEntry *ce = cls; | 740 | struct ClientEntry *ce = cls; |
806 | const char *service; | 741 | const char *service; |
@@ -821,32 +756,25 @@ handle_watch (void *cls, | |||
821 | msize = ntohs (message->size); | 756 | msize = ntohs (message->size); |
822 | size = msize - sizeof (struct GNUNET_MessageHeader); | 757 | size = msize - sizeof (struct GNUNET_MessageHeader); |
823 | GNUNET_assert (size == | 758 | GNUNET_assert (size == |
824 | GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], | 759 | GNUNET_STRINGS_buffer_tokenize ((const char *) &message[1], |
825 | size, | 760 | size, |
826 | 2, | 761 | 2, |
827 | &service, | 762 | &service, |
828 | &name)); | 763 | &name)); |
829 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 764 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
830 | "Received request to watch statistic on `%s:%s'\n", | 765 | "Received request to watch statistic on `%s:%s'\n", |
831 | service, | 766 | service, |
832 | name); | 767 | name); |
833 | se = find_subsystem_entry (ce, | 768 | se = find_subsystem_entry (ce, service); |
834 | service); | 769 | pos = find_stat_entry (se, name); |
835 | pos = find_stat_entry (se, | ||
836 | name); | ||
837 | if (NULL == pos) | 770 | if (NULL == pos) |
838 | { | 771 | { |
839 | nlen = strlen (name) + 1; | 772 | nlen = strlen (name) + 1; |
840 | pos = GNUNET_malloc (sizeof (struct StatsEntry) + | 773 | pos = GNUNET_malloc (sizeof (struct StatsEntry) + nlen); |
841 | nlen); | 774 | GNUNET_memcpy (&pos[1], name, nlen); |
842 | GNUNET_memcpy (&pos[1], | ||
843 | name, | ||
844 | nlen); | ||
845 | pos->name = (const char *) &pos[1]; | 775 | pos->name = (const char *) &pos[1]; |
846 | pos->subsystem = se; | 776 | pos->subsystem = se; |
847 | GNUNET_CONTAINER_DLL_insert (se->stat_head, | 777 | GNUNET_CONTAINER_DLL_insert (se->stat_head, se->stat_tail, pos); |
848 | se->stat_tail, | ||
849 | pos); | ||
850 | pos->uid = uidgen++; | 778 | pos->uid = uidgen++; |
851 | pos->set = GNUNET_NO; | 779 | pos->set = GNUNET_NO; |
852 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 780 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -859,9 +787,7 @@ handle_watch (void *cls, | |||
859 | we->ce = ce; | 787 | we->ce = ce; |
860 | we->last_value_set = GNUNET_NO; | 788 | we->last_value_set = GNUNET_NO; |
861 | we->wid = ce->max_wid++; | 789 | we->wid = ce->max_wid++; |
862 | GNUNET_CONTAINER_DLL_insert (pos->we_head, | 790 | GNUNET_CONTAINER_DLL_insert (pos->we_head, pos->we_tail, we); |
863 | pos->we_tail, | ||
864 | we); | ||
865 | if (0 != pos->value) | 791 | if (0 != pos->value) |
866 | notify_change (pos); | 792 | notify_change (pos); |
867 | GNUNET_SERVICE_client_continue (ce->client); | 793 | GNUNET_SERVICE_client_continue (ce->client); |
@@ -877,17 +803,14 @@ handle_watch (void *cls, | |||
877 | * @param message the actual message | 803 | * @param message the actual message |
878 | */ | 804 | */ |
879 | static void | 805 | static void |
880 | handle_disconnect (void *cls, | 806 | handle_disconnect (void *cls, const struct GNUNET_MessageHeader *message) |
881 | const struct GNUNET_MessageHeader *message) | ||
882 | { | 807 | { |
883 | struct ClientEntry *ce = cls; | 808 | struct ClientEntry *ce = cls; |
884 | struct GNUNET_MQ_Envelope *env; | 809 | struct GNUNET_MQ_Envelope *env; |
885 | struct GNUNET_MessageHeader *msg; | 810 | struct GNUNET_MessageHeader *msg; |
886 | 811 | ||
887 | env = GNUNET_MQ_msg (msg, | 812 | env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_STATISTICS_DISCONNECT_CONFIRM); |
888 | GNUNET_MESSAGE_TYPE_STATISTICS_DISCONNECT_CONFIRM); | 813 | GNUNET_MQ_send (ce->mq, env); |
889 | GNUNET_MQ_send (ce->mq, | ||
890 | env); | ||
891 | GNUNET_SERVICE_client_continue (ce->client); | 814 | GNUNET_SERVICE_client_continue (ce->client); |
892 | } | 815 | } |
893 | 816 | ||
@@ -910,20 +833,14 @@ do_shutdown () | |||
910 | GNUNET_assert (0 == client_count); | 833 | GNUNET_assert (0 == client_count); |
911 | while (NULL != (se = sub_head)) | 834 | while (NULL != (se = sub_head)) |
912 | { | 835 | { |
913 | GNUNET_CONTAINER_DLL_remove (sub_head, | 836 | GNUNET_CONTAINER_DLL_remove (sub_head, sub_tail, se); |
914 | sub_tail, | ||
915 | se); | ||
916 | while (NULL != (pos = se->stat_head)) | 837 | while (NULL != (pos = se->stat_head)) |
917 | { | 838 | { |
918 | GNUNET_CONTAINER_DLL_remove (se->stat_head, | 839 | GNUNET_CONTAINER_DLL_remove (se->stat_head, se->stat_tail, pos); |
919 | se->stat_tail, | ||
920 | pos); | ||
921 | while (NULL != (we = pos->we_head)) | 840 | while (NULL != (we = pos->we_head)) |
922 | { | 841 | { |
923 | GNUNET_break (0); | 842 | GNUNET_break (0); |
924 | GNUNET_CONTAINER_DLL_remove (pos->we_head, | 843 | GNUNET_CONTAINER_DLL_remove (pos->we_head, pos->we_tail, we); |
925 | pos->we_tail, | ||
926 | we); | ||
927 | GNUNET_free (we); | 844 | GNUNET_free (we); |
928 | } | 845 | } |
929 | GNUNET_free (pos); | 846 | GNUNET_free (pos); |
@@ -957,8 +874,8 @@ shutdown_task (void *cls) | |||
957 | */ | 874 | */ |
958 | static void | 875 | static void |
959 | client_disconnect_cb (void *cls, | 876 | client_disconnect_cb (void *cls, |
960 | struct GNUNET_SERVICE_Client *client, | 877 | struct GNUNET_SERVICE_Client *client, |
961 | void *app_cls) | 878 | void *app_cls) |
962 | { | 879 | { |
963 | struct ClientEntry *ce = app_cls; | 880 | struct ClientEntry *ce = app_cls; |
964 | struct WatchEntry *we; | 881 | struct WatchEntry *we; |
@@ -977,16 +894,13 @@ client_disconnect_cb (void *cls, | |||
977 | wen = we->next; | 894 | wen = we->next; |
978 | if (we->ce != ce) | 895 | if (we->ce != ce) |
979 | continue; | 896 | continue; |
980 | GNUNET_CONTAINER_DLL_remove (pos->we_head, | 897 | GNUNET_CONTAINER_DLL_remove (pos->we_head, pos->we_tail, we); |
981 | pos->we_tail, | ||
982 | we); | ||
983 | GNUNET_free (we); | 898 | GNUNET_free (we); |
984 | } | 899 | } |
985 | } | 900 | } |
986 | } | 901 | } |
987 | GNUNET_free (ce); | 902 | GNUNET_free (ce); |
988 | if ( (0 == client_count) && | 903 | if ((0 == client_count) && (GNUNET_YES == in_shutdown)) |
989 | (GNUNET_YES == in_shutdown) ) | ||
990 | do_shutdown (); | 904 | do_shutdown (); |
991 | } | 905 | } |
992 | 906 | ||
@@ -1003,23 +917,19 @@ client_disconnect_cb (void *cls, | |||
1003 | * #GNUNET_SYSERR to stop further processing with error | 917 | * #GNUNET_SYSERR to stop further processing with error |
1004 | */ | 918 | */ |
1005 | static int | 919 | static int |
1006 | inject_message (void *cls, | 920 | inject_message (void *cls, const struct GNUNET_MessageHeader *message) |
1007 | const struct GNUNET_MessageHeader *message) | ||
1008 | { | 921 | { |
1009 | uint16_t msize = ntohs (message->size); | 922 | uint16_t msize = ntohs (message->size); |
1010 | const struct GNUNET_STATISTICS_SetMessage *sm; | 923 | const struct GNUNET_STATISTICS_SetMessage *sm; |
1011 | 924 | ||
1012 | sm = (const struct GNUNET_STATISTICS_SetMessage *) message; | 925 | sm = (const struct GNUNET_STATISTICS_SetMessage *) message; |
1013 | if ( (sizeof (struct GNUNET_STATISTICS_SetMessage) > msize) || | 926 | if ((sizeof (struct GNUNET_STATISTICS_SetMessage) > msize) || |
1014 | (GNUNET_OK != | 927 | (GNUNET_OK != check_set (NULL, sm))) |
1015 | check_set (NULL, | ||
1016 | sm)) ) | ||
1017 | { | 928 | { |
1018 | GNUNET_break (0); | 929 | GNUNET_break (0); |
1019 | return GNUNET_SYSERR; | 930 | return GNUNET_SYSERR; |
1020 | } | 931 | } |
1021 | handle_set (NULL, | 932 | handle_set (NULL, sm); |
1022 | sm); | ||
1023 | return GNUNET_OK; | 933 | return GNUNET_OK; |
1024 | } | 934 | } |
1025 | 935 | ||
@@ -1037,23 +947,19 @@ load () | |||
1037 | char *buf; | 947 | char *buf; |
1038 | struct GNUNET_MessageStreamTokenizer *mst; | 948 | struct GNUNET_MessageStreamTokenizer *mst; |
1039 | 949 | ||
1040 | if (GNUNET_OK != | 950 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, |
1041 | GNUNET_CONFIGURATION_get_value_filename (cfg, | 951 | "STATISTICS", |
1042 | "STATISTICS", | 952 | "DATABASE", |
1043 | "DATABASE", | 953 | &fn)) |
1044 | &fn)) | ||
1045 | { | 954 | { |
1046 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, | 955 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, |
1047 | "STATISTICS", | 956 | "STATISTICS", |
1048 | "DATABASE"); | 957 | "DATABASE"); |
1049 | return; | 958 | return; |
1050 | } | 959 | } |
1051 | if ( (GNUNET_OK != | 960 | if ((GNUNET_OK != |
1052 | GNUNET_DISK_file_size (fn, | 961 | GNUNET_DISK_file_size (fn, &fsize, GNUNET_NO, GNUNET_YES)) || |
1053 | &fsize, | 962 | (0 == fsize)) |
1054 | GNUNET_NO, | ||
1055 | GNUNET_YES)) || | ||
1056 | (0 == fsize) ) | ||
1057 | { | 963 | { |
1058 | GNUNET_free (fn); | 964 | GNUNET_free (fn); |
1059 | return; | 965 | return; |
@@ -1066,39 +972,25 @@ load () | |||
1066 | GNUNET_free (fn); | 972 | GNUNET_free (fn); |
1067 | return; | 973 | return; |
1068 | } | 974 | } |
1069 | if (GNUNET_OK != | 975 | if (GNUNET_OK != GNUNET_BIO_read (rh, fn, buf, fsize)) |
1070 | GNUNET_BIO_read (rh, | ||
1071 | fn, | ||
1072 | buf, | ||
1073 | fsize)) | ||
1074 | { | 976 | { |
1075 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, | 977 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "read", fn); |
1076 | "read", | 978 | GNUNET_break (GNUNET_OK == GNUNET_BIO_read_close (rh, NULL)); |
1077 | fn); | ||
1078 | GNUNET_break (GNUNET_OK == | ||
1079 | GNUNET_BIO_read_close (rh, | ||
1080 | NULL)); | ||
1081 | GNUNET_free (buf); | 979 | GNUNET_free (buf); |
1082 | GNUNET_free (fn); | 980 | GNUNET_free (fn); |
1083 | return; | 981 | return; |
1084 | } | 982 | } |
1085 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 983 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
1086 | _("Loading %llu bytes of statistics from `%s'\n"), | 984 | _ ("Loading %llu bytes of statistics from `%s'\n"), |
1087 | (unsigned long long) fsize, | 985 | (unsigned long long) fsize, |
1088 | fn); | 986 | fn); |
1089 | mst = GNUNET_MST_create (&inject_message, | 987 | mst = GNUNET_MST_create (&inject_message, NULL); |
1090 | NULL); | 988 | GNUNET_break ( |
1091 | GNUNET_break (GNUNET_OK == | 989 | GNUNET_OK == |
1092 | GNUNET_MST_from_buffer (mst, | 990 | GNUNET_MST_from_buffer (mst, buf, (size_t) fsize, GNUNET_YES, GNUNET_NO)); |
1093 | buf, | ||
1094 | (size_t) fsize, | ||
1095 | GNUNET_YES, | ||
1096 | GNUNET_NO)); | ||
1097 | GNUNET_MST_destroy (mst); | 991 | GNUNET_MST_destroy (mst); |
1098 | GNUNET_free (buf); | 992 | GNUNET_free (buf); |
1099 | GNUNET_break (GNUNET_OK == | 993 | GNUNET_break (GNUNET_OK == GNUNET_BIO_read_close (rh, NULL)); |
1100 | GNUNET_BIO_read_close (rh, | ||
1101 | NULL)); | ||
1102 | GNUNET_free (fn); | 994 | GNUNET_free (fn); |
1103 | } | 995 | } |
1104 | 996 | ||
@@ -1118,38 +1010,37 @@ run (void *cls, | |||
1118 | cfg = c; | 1010 | cfg = c; |
1119 | nc = GNUNET_notification_context_create (16); | 1011 | nc = GNUNET_notification_context_create (16); |
1120 | load (); | 1012 | load (); |
1121 | GNUNET_SCHEDULER_add_shutdown (&shutdown_task, | 1013 | GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); |
1122 | NULL); | ||
1123 | } | 1014 | } |
1124 | 1015 | ||
1125 | 1016 | ||
1126 | /** | 1017 | /** |
1127 | * Define "main" method using service macro. | 1018 | * Define "main" method using service macro. |
1128 | */ | 1019 | */ |
1129 | GNUNET_SERVICE_MAIN | 1020 | GNUNET_SERVICE_MAIN ( |
1130 | ("statistics", | 1021 | "statistics", |
1131 | GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN, | 1022 | GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN, |
1132 | &run, | 1023 | &run, |
1133 | &client_connect_cb, | 1024 | &client_connect_cb, |
1134 | &client_disconnect_cb, | 1025 | &client_disconnect_cb, |
1135 | NULL, | 1026 | NULL, |
1136 | GNUNET_MQ_hd_var_size (set, | 1027 | GNUNET_MQ_hd_var_size (set, |
1137 | GNUNET_MESSAGE_TYPE_STATISTICS_SET, | 1028 | GNUNET_MESSAGE_TYPE_STATISTICS_SET, |
1138 | struct GNUNET_STATISTICS_SetMessage, | 1029 | struct GNUNET_STATISTICS_SetMessage, |
1139 | NULL), | 1030 | NULL), |
1140 | GNUNET_MQ_hd_var_size (get, | 1031 | GNUNET_MQ_hd_var_size (get, |
1141 | GNUNET_MESSAGE_TYPE_STATISTICS_GET, | 1032 | GNUNET_MESSAGE_TYPE_STATISTICS_GET, |
1142 | struct GNUNET_MessageHeader, | 1033 | struct GNUNET_MessageHeader, |
1143 | NULL), | 1034 | NULL), |
1144 | GNUNET_MQ_hd_var_size (watch, | 1035 | GNUNET_MQ_hd_var_size (watch, |
1145 | GNUNET_MESSAGE_TYPE_STATISTICS_WATCH, | 1036 | GNUNET_MESSAGE_TYPE_STATISTICS_WATCH, |
1146 | struct GNUNET_MessageHeader, | 1037 | struct GNUNET_MessageHeader, |
1147 | NULL), | 1038 | NULL), |
1148 | GNUNET_MQ_hd_fixed_size (disconnect, | 1039 | GNUNET_MQ_hd_fixed_size (disconnect, |
1149 | GNUNET_MESSAGE_TYPE_STATISTICS_DISCONNECT, | 1040 | GNUNET_MESSAGE_TYPE_STATISTICS_DISCONNECT, |
1150 | struct GNUNET_MessageHeader, | 1041 | struct GNUNET_MessageHeader, |
1151 | NULL), | 1042 | NULL), |
1152 | GNUNET_MQ_handler_end ()); | 1043 | GNUNET_MQ_handler_end ()); |
1153 | 1044 | ||
1154 | 1045 | ||
1155 | #if defined(LINUX) && defined(__GLIBC__) | 1046 | #if defined(LINUX) && defined(__GLIBC__) |
@@ -1158,8 +1049,7 @@ GNUNET_SERVICE_MAIN | |||
1158 | /** | 1049 | /** |
1159 | * MINIMIZE heap size (way below 128k) since this process doesn't need much. | 1050 | * MINIMIZE heap size (way below 128k) since this process doesn't need much. |
1160 | */ | 1051 | */ |
1161 | void __attribute__ ((constructor)) | 1052 | void __attribute__ ((constructor)) GNUNET_STATISTICS_memory_init () |
1162 | GNUNET_STATISTICS_memory_init () | ||
1163 | { | 1053 | { |
1164 | mallopt (M_TRIM_THRESHOLD, 4 * 1024); | 1054 | mallopt (M_TRIM_THRESHOLD, 4 * 1024); |
1165 | mallopt (M_TOP_PAD, 1 * 1024); | 1055 | mallopt (M_TOP_PAD, 1 * 1024); |
diff --git a/src/statistics/gnunet-statistics.c b/src/statistics/gnunet-statistics.c index bc30670e9..f1ea8cb19 100644 --- a/src/statistics/gnunet-statistics.c +++ b/src/statistics/gnunet-statistics.c | |||
@@ -216,7 +216,7 @@ printer (void *cls, const struct GNUNET_HashCode *key, void *value) | |||
216 | if (GNUNET_YES == watch) | 216 | if (GNUNET_YES == watch) |
217 | { | 217 | { |
218 | now_str = GNUNET_STRINGS_absolute_time_to_string (now); | 218 | now_str = GNUNET_STRINGS_absolute_time_to_string (now); |
219 | FPRINTF (stdout, | 219 | fprintf (stdout, |
220 | "%24s%s %s%s%12s%s %s%50s%s%s ", | 220 | "%24s%s %s%s%12s%s %s%50s%s%s ", |
221 | now_str, | 221 | now_str, |
222 | csv_separator, | 222 | csv_separator, |
@@ -231,7 +231,7 @@ printer (void *cls, const struct GNUNET_HashCode *key, void *value) | |||
231 | } | 231 | } |
232 | else | 232 | else |
233 | { | 233 | { |
234 | FPRINTF (stdout, | 234 | fprintf (stdout, |
235 | "%s%s%12s%s %s%50s%s%s ", | 235 | "%s%s%12s%s %s%50s%s%s ", |
236 | value_set->is_persistent ? "!" : " ", | 236 | value_set->is_persistent ? "!" : " ", |
237 | csv_separator, | 237 | csv_separator, |
@@ -245,12 +245,12 @@ printer (void *cls, const struct GNUNET_HashCode *key, void *value) | |||
245 | } | 245 | } |
246 | for (unsigned i = 0; i < num_nodes; i++) | 246 | for (unsigned i = 0; i < num_nodes; i++) |
247 | { | 247 | { |
248 | FPRINTF (stdout, | 248 | fprintf (stdout, |
249 | "%16llu%s", | 249 | "%16llu%s", |
250 | (unsigned long long) value_set->values[i], | 250 | (unsigned long long) value_set->values[i], |
251 | csv_separator); | 251 | csv_separator); |
252 | } | 252 | } |
253 | FPRINTF (stdout, "\n"); | 253 | fprintf (stdout, "\n"); |
254 | GNUNET_free (value_set->subsystem); | 254 | GNUNET_free (value_set->subsystem); |
255 | GNUNET_free (value_set->name); | 255 | GNUNET_free (value_set->name); |
256 | GNUNET_free (value_set->values); | 256 | GNUNET_free (value_set->values); |
@@ -283,7 +283,7 @@ printer_watch (void *cls, | |||
283 | if (GNUNET_YES == watch) | 283 | if (GNUNET_YES == watch) |
284 | { | 284 | { |
285 | now_str = GNUNET_STRINGS_absolute_time_to_string (now); | 285 | now_str = GNUNET_STRINGS_absolute_time_to_string (now); |
286 | FPRINTF (stdout, | 286 | fprintf (stdout, |
287 | "%24s%s %s%s%12s%s %s%50s%s%s %16llu\n", | 287 | "%24s%s %s%s%12s%s %s%50s%s%s %16llu\n", |
288 | now_str, | 288 | now_str, |
289 | csv_separator, | 289 | csv_separator, |
@@ -299,7 +299,7 @@ printer_watch (void *cls, | |||
299 | } | 299 | } |
300 | else | 300 | else |
301 | { | 301 | { |
302 | FPRINTF (stdout, | 302 | fprintf (stdout, |
303 | "%s%s%12s%s %s%50s%s%s %16llu\n", | 303 | "%s%s%12s%s %s%50s%s%s %16llu\n", |
304 | is_persistent ? "!" : " ", | 304 | is_persistent ? "!" : " ", |
305 | csv_separator, | 305 | csv_separator, |
@@ -313,7 +313,7 @@ printer_watch (void *cls, | |||
313 | } | 313 | } |
314 | } | 314 | } |
315 | else | 315 | else |
316 | FPRINTF (stdout, "%llu\n", (unsigned long long) value); | 316 | fprintf (stdout, "%llu\n", (unsigned long long) value); |
317 | 317 | ||
318 | return GNUNET_OK; | 318 | return GNUNET_OK; |
319 | } | 319 | } |
@@ -401,9 +401,9 @@ continuation_print (void *cls, int success) | |||
401 | if (GNUNET_OK != success) | 401 | if (GNUNET_OK != success) |
402 | { | 402 | { |
403 | if (NULL == remote_host) | 403 | if (NULL == remote_host) |
404 | FPRINTF (stderr, "%s", _ ("Failed to obtain statistics.\n")); | 404 | fprintf (stderr, "%s", _ ("Failed to obtain statistics.\n")); |
405 | else | 405 | else |
406 | FPRINTF (stderr, | 406 | fprintf (stderr, |
407 | _ ("Failed to obtain statistics from host `%s:%llu'\n"), | 407 | _ ("Failed to obtain statistics from host `%s:%llu'\n"), |
408 | remote_host, | 408 | remote_host, |
409 | remote_port); | 409 | remote_port); |
@@ -439,9 +439,9 @@ cleanup (void *cls, int success) | |||
439 | if (GNUNET_OK != success) | 439 | if (GNUNET_OK != success) |
440 | { | 440 | { |
441 | if (NULL == remote_host) | 441 | if (NULL == remote_host) |
442 | FPRINTF (stderr, "%s", _ ("Failed to obtain statistics.\n")); | 442 | fprintf (stderr, "%s", _ ("Failed to obtain statistics.\n")); |
443 | else | 443 | else |
444 | FPRINTF (stderr, | 444 | fprintf (stderr, |
445 | _ ("Failed to obtain statistics from host `%s:%llu'\n"), | 445 | _ ("Failed to obtain statistics from host `%s:%llu'\n"), |
446 | remote_host, | 446 | remote_host, |
447 | remote_port); | 447 | remote_port); |
@@ -478,7 +478,7 @@ collector (void *cls, | |||
478 | 478 | ||
479 | len_subsys_name = strlen (subsystem) + 3 + strlen (name) + 1; | 479 | len_subsys_name = strlen (subsystem) + 3 + strlen (name) + 1; |
480 | subsys_name = GNUNET_malloc (len_subsys_name); | 480 | subsys_name = GNUNET_malloc (len_subsys_name); |
481 | SPRINTF (subsys_name, "%s---%s", subsystem, name); | 481 | sprintf (subsys_name, "%s---%s", subsystem, name); |
482 | key = &hc; | 482 | key = &hc; |
483 | GNUNET_CRYPTO_hash (subsys_name, len_subsys_name, key); | 483 | GNUNET_CRYPTO_hash (subsys_name, len_subsys_name, key); |
484 | GNUNET_free (subsys_name); | 484 | GNUNET_free (subsys_name); |
@@ -515,13 +515,13 @@ main_task (void *cls) | |||
515 | { | 515 | { |
516 | if (NULL == subsystem) | 516 | if (NULL == subsystem) |
517 | { | 517 | { |
518 | FPRINTF (stderr, "%s", _ ("Missing argument: subsystem \n")); | 518 | fprintf (stderr, "%s", _ ("Missing argument: subsystem \n")); |
519 | ret = 1; | 519 | ret = 1; |
520 | return; | 520 | return; |
521 | } | 521 | } |
522 | if (NULL == name) | 522 | if (NULL == name) |
523 | { | 523 | { |
524 | FPRINTF (stderr, "%s", _ ("Missing argument: name\n")); | 524 | fprintf (stderr, "%s", _ ("Missing argument: name\n")); |
525 | ret = 1; | 525 | ret = 1; |
526 | return; | 526 | return; |
527 | } | 527 | } |
@@ -605,7 +605,7 @@ iter_check_config (void *cls, const char *filename) | |||
605 | if (GNUNET_OK != | 605 | if (GNUNET_OK != |
606 | GNUNET_CONFIGURATION_load (nodes[num_nodes - 1].conf, filename)) | 606 | GNUNET_CONFIGURATION_load (nodes[num_nodes - 1].conf, filename)) |
607 | { | 607 | { |
608 | FPRINTF (stderr, "Failed loading config `%s'\n", filename); | 608 | fprintf (stderr, "Failed loading config `%s'\n", filename); |
609 | return GNUNET_SYSERR; | 609 | return GNUNET_SYSERR; |
610 | } | 610 | } |
611 | return GNUNET_NO; | 611 | return GNUNET_NO; |
@@ -636,7 +636,7 @@ iter_testbed_path (void *cls, const char *filename) | |||
636 | unsigned index_node; | 636 | unsigned index_node; |
637 | 637 | ||
638 | GNUNET_assert (NULL != filename); | 638 | GNUNET_assert (NULL != filename); |
639 | if (1 == SSCANF (GNUNET_STRINGS_get_short_name (filename), "%u", &index_node)) | 639 | if (1 == sscanf (GNUNET_STRINGS_get_short_name (filename), "%u", &index_node)) |
640 | { | 640 | { |
641 | if (-1 == GNUNET_DISK_directory_scan (filename, iter_check_config, NULL)) | 641 | if (-1 == GNUNET_DISK_directory_scan (filename, iter_check_config, NULL)) |
642 | { | 642 | { |
@@ -665,7 +665,7 @@ discover_testbed_nodes (const char *path_testbed) | |||
665 | GNUNET_DISK_directory_scan (path_testbed, iter_testbed_path, NULL); | 665 | GNUNET_DISK_directory_scan (path_testbed, iter_testbed_path, NULL); |
666 | if (-1 == num_dir_entries) | 666 | if (-1 == num_dir_entries) |
667 | { | 667 | { |
668 | FPRINTF (stderr, "Failure during scanning directory `%s'\n", path_testbed); | 668 | fprintf (stderr, "Failure during scanning directory `%s'\n", path_testbed); |
669 | return -1; | 669 | return -1; |
670 | } | 670 | } |
671 | return 0; | 671 | return 0; |
@@ -693,9 +693,9 @@ run (void *cls, | |||
693 | csv_separator = ""; | 693 | csv_separator = ""; |
694 | if (NULL != args[0]) | 694 | if (NULL != args[0]) |
695 | { | 695 | { |
696 | if (1 != SSCANF (args[0], "%llu", &set_val)) | 696 | if (1 != sscanf (args[0], "%llu", &set_val)) |
697 | { | 697 | { |
698 | FPRINTF (stderr, _ ("Invalid argument `%s'\n"), args[0]); | 698 | fprintf (stderr, _ ("Invalid argument `%s'\n"), args[0]); |
699 | ret = 1; | 699 | ret = 1; |
700 | return; | 700 | return; |
701 | } | 701 | } |
@@ -710,7 +710,7 @@ run (void *cls, | |||
710 | "PORT", | 710 | "PORT", |
711 | &remote_port)) | 711 | &remote_port)) |
712 | { | 712 | { |
713 | FPRINTF (stderr, | 713 | fprintf (stderr, |
714 | _ ("A port is required to connect to host `%s'\n"), | 714 | _ ("A port is required to connect to host `%s'\n"), |
715 | remote_host); | 715 | remote_host); |
716 | return; | 716 | return; |
@@ -718,7 +718,7 @@ run (void *cls, | |||
718 | } | 718 | } |
719 | else if (65535 <= remote_port) | 719 | else if (65535 <= remote_port) |
720 | { | 720 | { |
721 | FPRINTF (stderr, | 721 | fprintf (stderr, |
722 | _ ( | 722 | _ ( |
723 | "A port has to be between 1 and 65535 to connect to host `%s'\n"), | 723 | "A port has to be between 1 and 65535 to connect to host `%s'\n"), |
724 | remote_host); | 724 | remote_host); |