array: introduce an array collection storing elements very efficiently
authorMartin Willi <martin@revosec.ch>
Thu, 11 Jul 2013 09:44:33 +0000 (11:44 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 17 Jul 2013 15:20:17 +0000 (17:20 +0200)
commit2621ff4d40969d84ecc303b0ef6d369e773b7881
tree11f4a3554b7f7ac6c1a2a5e3e41ffaa808801d05
parentf067348134109b1896c39724fc8cd8cba0fe60f8
array: introduce an array collection storing elements very efficiently

Currently we use the very versatile linked-list collection to store elements
with variable count. This is fine, but very inefficient: Due to the many
methods in the linked list, on 64-bit platforms an empty list alone is more
than 200 bytes. As we currently have about 50 lists per IKE_SA/CHILD_SA pair,
this takes up to 10KB just for managing the empty lists. This is about the
half of memory used by an IKE_SA/CHILD_SA pair, and obviously way too much.

The new array type is not an object, but a collection of functions on an
abstract type.

The following lists are per IKE_SA and should be considered for a replacement
with more efficient arrays (this uses load-testers on-demand created dynamic
configurations, other scenarios have different lists):

14 -> ike_sa_create() @ src/libcharon/sa/ike_sa.c:2198
10 -> auth_cfg_create() @ src/libstrongswan/credentials/auth_cfg.c:1088
 6 -> task_manager_v2_create() @ src/libcharon/sa/ikev2/task_manager_v2.c:1505
 6 -> proposal_create() @ src/libcharon/config/proposal.c:592
 5 -> peer_cfg_create() @ src/libcharon/config/peer_cfg.c:657
 4 -> child_sa_create() @ src/libcharon/sa/child_sa.c:1090
 2 -> child_cfg_create() @ src/libcharon/config/child_cfg.c:536
 1 -> ike_cfg_create() @ src/libcharon/config/ike_cfg.c:330
 1 -> put_connected_peers() @ src/libcharon/sa/ike_sa_manager.c:854
src/libstrongswan/Android.mk
src/libstrongswan/Makefile.am
src/libstrongswan/collections/array.c [new file with mode: 0644]
src/libstrongswan/collections/array.h [new file with mode: 0644]