aboutsummaryrefslogtreecommitdiff
path: root/src/fs/gnunet-service-fs_pr.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-10-07 17:56:31 +0000
committerChristian Grothoff <christian@grothoff.org>2012-10-07 17:56:31 +0000
commitdecf459805cdb3f6811f979df4831bc2ce9a2858 (patch)
tree7d7644446cf8bd315185f2598993d0b4ce21cabb /src/fs/gnunet-service-fs_pr.c
parent605c3946e573ab1446e8210b3b7f6cccd5c1ba03 (diff)
downloadgnunet-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.c37
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))