diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-10-07 17:56:31 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-10-07 17:56:31 +0000 |
commit | decf459805cdb3f6811f979df4831bc2ce9a2858 (patch) | |
tree | 7d7644446cf8bd315185f2598993d0b4ce21cabb /src/fs/gnunet-service-fs_pr.c | |
parent | 605c3946e573ab1446e8210b3b7f6cccd5c1ba03 (diff) | |
download | gnunet-decf459805cdb3f6811f979df4831bc2ce9a2858.tar.gz gnunet-decf459805cdb3f6811f979df4831bc2ce9a2858.zip |
-reducing memory use for PendingRequestData by 30% by not allocating space for target/namespace hash codes unless the request needs/has them
Diffstat (limited to 'src/fs/gnunet-service-fs_pr.c')
-rw-r--r-- | src/fs/gnunet-service-fs_pr.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/fs/gnunet-service-fs_pr.c b/src/fs/gnunet-service-fs_pr.c index 1df10abd2..ceb034ba0 100644 --- a/src/fs/gnunet-service-fs_pr.c +++ b/src/fs/gnunet-service-fs_pr.c | |||
@@ -277,6 +277,8 @@ GSF_pending_request_create_ (enum GSF_PendingRequestOptions options, | |||
277 | { | 277 | { |
278 | struct GSF_PendingRequest *pr; | 278 | struct GSF_PendingRequest *pr; |
279 | struct GSF_PendingRequest *dpr; | 279 | struct GSF_PendingRequest *dpr; |
280 | size_t extra; | ||
281 | struct GNUNET_HashCode *eptr; | ||
280 | 282 | ||
281 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 283 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
282 | "Creating request handle for `%s' of type %d\n", | 284 | "Creating request handle for `%s' of type %d\n", |
@@ -284,19 +286,27 @@ GSF_pending_request_create_ (enum GSF_PendingRequestOptions options, | |||
284 | GNUNET_STATISTICS_update (GSF_stats, | 286 | GNUNET_STATISTICS_update (GSF_stats, |
285 | gettext_noop ("# Pending requests created"), 1, | 287 | gettext_noop ("# Pending requests created"), 1, |
286 | GNUNET_NO); | 288 | GNUNET_NO); |
287 | pr = GNUNET_malloc (sizeof (struct GSF_PendingRequest)); | 289 | extra = 0; |
290 | if (GNUNET_BLOCK_TYPE_FS_SBLOCK == type) | ||
291 | extra += sizeof (struct GNUNET_HashCode); | ||
292 | if (NULL != target) | ||
293 | extra += sizeof (struct GNUNET_PeerIdentity); | ||
294 | pr = GNUNET_malloc (sizeof (struct GSF_PendingRequest) + extra); | ||
288 | pr->local_result_offset = | 295 | pr->local_result_offset = |
289 | GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX); | 296 | GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX); |
290 | pr->public_data.query = *query; | 297 | pr->public_data.query = *query; |
298 | eptr = (struct GNUNET_HashCode *) &pr[1]; | ||
291 | if (GNUNET_BLOCK_TYPE_FS_SBLOCK == type) | 299 | if (GNUNET_BLOCK_TYPE_FS_SBLOCK == type) |
292 | { | 300 | { |
293 | GNUNET_assert (NULL != namespace); | 301 | GNUNET_assert (NULL != namespace); |
294 | pr->public_data.namespace = *namespace; | 302 | pr->public_data.namespace = eptr; |
303 | memcpy (eptr, namespace, sizeof (struct GNUNET_HashCode)); | ||
304 | eptr++; | ||
295 | } | 305 | } |
296 | if (NULL != target) | 306 | if (NULL != target) |
297 | { | 307 | { |
298 | pr->public_data.target = *target; | 308 | pr->public_data.target = (struct GNUNET_PeerIdentity *) eptr; |
299 | pr->public_data.has_target = GNUNET_YES; | 309 | memcpy (eptr, target, sizeof (struct GNUNET_PeerIdentity)); |
300 | } | 310 | } |
301 | pr->public_data.anonymity_level = anonymity_level; | 311 | pr->public_data.anonymity_level = anonymity_level; |
302 | pr->public_data.priority = priority; | 312 | pr->public_data.priority = priority; |
@@ -401,7 +411,8 @@ GSF_pending_request_is_compatible_ (struct GSF_PendingRequest *pra, | |||
401 | sizeof (struct GNUNET_HashCode))) || | 411 | sizeof (struct GNUNET_HashCode))) || |
402 | ((pra->public_data.type == GNUNET_BLOCK_TYPE_FS_SBLOCK) && | 412 | ((pra->public_data.type == GNUNET_BLOCK_TYPE_FS_SBLOCK) && |
403 | (0 != | 413 | (0 != |
404 | memcmp (&pra->public_data.namespace, &prb->public_data.namespace, | 414 | memcmp (pra->public_data.namespace, |
415 | prb->public_data.namespace, | ||
405 | sizeof (struct GNUNET_HashCode))))) | 416 | sizeof (struct GNUNET_HashCode))))) |
406 | return GNUNET_NO; | 417 | return GNUNET_NO; |
407 | return GNUNET_OK; | 418 | return GNUNET_OK; |
@@ -509,7 +520,7 @@ GSF_pending_request_get_message_ (struct GSF_PendingRequest *pr, | |||
509 | bm |= GET_MESSAGE_BIT_SKS_NAMESPACE; | 520 | bm |= GET_MESSAGE_BIT_SKS_NAMESPACE; |
510 | k++; | 521 | k++; |
511 | } | 522 | } |
512 | if (GNUNET_YES == pr->public_data.has_target) | 523 | if (NULL != pr->public_data.target) |
513 | { | 524 | { |
514 | bm |= GET_MESSAGE_BIT_TRANSMIT_TO; | 525 | bm |= GET_MESSAGE_BIT_TRANSMIT_TO; |
515 | k++; | 526 | k++; |
@@ -545,9 +556,11 @@ GSF_pending_request_get_message_ (struct GSF_PendingRequest *pr, | |||
545 | GNUNET_PEER_resolve (pr->sender_pid, | 556 | GNUNET_PEER_resolve (pr->sender_pid, |
546 | (struct GNUNET_PeerIdentity *) &ext[k++]); | 557 | (struct GNUNET_PeerIdentity *) &ext[k++]); |
547 | if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type) | 558 | if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type) |
548 | memcpy (&ext[k++], &pr->public_data.namespace, sizeof (struct GNUNET_HashCode)); | 559 | memcpy (&ext[k++], pr->public_data.namespace, sizeof (struct GNUNET_HashCode)); |
549 | if (GNUNET_YES == pr->public_data.has_target) | 560 | if (NULL != pr->public_data.target) |
550 | ext[k++] = pr->public_data.target.hashPubKey; | 561 | memcpy (&ext[k++], |
562 | pr->public_data.target, | ||
563 | sizeof (struct GNUNET_PeerIdentity)); | ||
551 | if (pr->bf != NULL) | 564 | if (pr->bf != NULL) |
552 | GNUNET_assert (GNUNET_SYSERR != | 565 | GNUNET_assert (GNUNET_SYSERR != |
553 | GNUNET_CONTAINER_bloomfilter_get_raw_data (pr->bf, | 566 | GNUNET_CONTAINER_bloomfilter_get_raw_data (pr->bf, |
@@ -782,7 +795,7 @@ process_reply (void *cls, const struct GNUNET_HashCode * key, void *value) | |||
782 | GNUNET_NO); | 795 | GNUNET_NO); |
783 | prq->eval = | 796 | prq->eval = |
784 | GNUNET_BLOCK_evaluate (GSF_block_ctx, prq->type, key, &pr->bf, pr->mingle, | 797 | GNUNET_BLOCK_evaluate (GSF_block_ctx, prq->type, key, &pr->bf, pr->mingle, |
785 | &pr->public_data.namespace, | 798 | pr->public_data.namespace, |
786 | (prq->type == | 799 | (prq->type == |
787 | GNUNET_BLOCK_TYPE_FS_SBLOCK) ? | 800 | GNUNET_BLOCK_TYPE_FS_SBLOCK) ? |
788 | sizeof (struct GNUNET_HashCode) : 0, prq->data, | 801 | sizeof (struct GNUNET_HashCode) : 0, prq->data, |
@@ -1073,7 +1086,7 @@ GSF_dht_lookup_ (struct GSF_PendingRequest *pr) | |||
1073 | if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type) | 1086 | if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type) |
1074 | { | 1087 | { |
1075 | xquery = buf; | 1088 | xquery = buf; |
1076 | memcpy (buf, &pr->public_data.namespace, sizeof (struct GNUNET_HashCode)); | 1089 | memcpy (buf, pr->public_data.namespace, sizeof (struct GNUNET_HashCode)); |
1077 | xquery_size = sizeof (struct GNUNET_HashCode); | 1090 | xquery_size = sizeof (struct GNUNET_HashCode); |
1078 | } | 1091 | } |
1079 | if (0 != (pr->public_data.options & GSF_PRO_FORWARD_ONLY)) | 1092 | if (0 != (pr->public_data.options & GSF_PRO_FORWARD_ONLY)) |