• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

aes/H15-Mar-2022-56,16548,308

aria/H15-Mar-2022-1,218995

asn1/H15-Mar-2022-16,11512,279

async/H15-Mar-2022-1,173796

bf/H15-Mar-2022-1,2461,035

bio/H15-Mar-2022-12,1599,487

bn/H15-Mar-2022-55,50344,747

buffer/H15-Mar-2022-201153

camellia/H15-Mar-2022-4,0373,177

cast/H15-Mar-2022-1,4241,204

chacha/H15-Mar-2022-11,4929,722

cmac/H15-Mar-2022-257188

cmp/H15-Mar-2022-7,6755,523

cms/H15-Mar-2022-8,4206,614

comp/H15-Mar-2022-818644

conf/H15-Mar-2022-2,8972,225

crmf/H15-Mar-2022-1,6441,048

ct/H15-Mar-2022-2,3891,658

des/H15-Mar-2022-6,0584,568

dh/H15-Mar-2022-3,5672,657

dsa/H15-Mar-2022-3,0622,238

dso/H15-Mar-2022-2,4391,826

ec/H15-Mar-2022-65,93453,408

encode_decode/H15-Mar-2022-4,0742,869

engine/H15-Mar-2022-4,6663,362

err/H03-May-2022-1,6751,286

ess/H15-Mar-2022-428330

evp/H15-Mar-2022-35,20726,923

ffc/H15-Mar-2022-2,0491,435

hmac/H15-Mar-2022-282219

http/H15-Mar-2022-1,7611,391

idea/H15-Mar-2022-567423

kdf/H15-Mar-2022-2310

lhash/H15-Mar-2022-623480

md2/H15-Mar-2022-244175

md4/H15-Mar-2022-279200

md5/H15-Mar-2022-1,6161,220

mdc2/H15-Mar-2022-177127

modes/H15-Mar-2022-19,73114,589

objects/H03-May-2022-9,4418,934

ocsp/H15-Mar-2022-2,7692,030

pem/H15-Mar-2022-3,7702,955

perlasm/H15-Mar-2022-8,5266,898

pkcs12/H15-Mar-2022-2,7072,060

pkcs7/H15-Mar-2022-3,1752,528

poly1305/H15-Mar-2022-15,47212,395

property/H15-Mar-2022-2,0751,636

rand/H15-Mar-2022-2,1391,433

rc2/H15-Mar-2022-634470

rc4/H15-Mar-2022-2,7822,104

rc5/H15-Mar-2022-764590

ripemd/H15-Mar-2022-1,3951,172

rsa/H15-Mar-2022-10,0957,229

seed/H15-Mar-2022-830643

sha/H15-Mar-2022-35,29829,015

siphash/H15-Mar-2022-260179

sm2/H15-Mar-2022-1,029788

sm3/H15-Mar-2022-314250

sm4/H15-Mar-2022-239185

srp/H15-Mar-2022-1,112815

stack/H15-Mar-2022-456338

store/H15-Mar-2022-2,7792,011

ts/H15-Mar-2022-3,4902,747

txt_db/H15-Mar-2022-321285

ui/H15-Mar-2022-2,0251,630

whrlpool/H15-Mar-2022-2,2451,852

x509/H15-Mar-2022-27,34420,745

LPdir_nyi.cH A D15-Mar-20222 KiB5716

LPdir_unix.cH A D15-Mar-20224.9 KiB169102

LPdir_vms.cH A D15-Mar-20226.2 KiB208135

LPdir_win.cH A D15-Mar-20226.9 KiB215140

LPdir_win32.cH A D15-Mar-20221.9 KiB423

LPdir_wince.cH A D15-Mar-20222 KiB452

README-sparse_array.mdH A D15-Mar-20225.6 KiB157136

alphacpuid.plH A D15-Mar-20223.9 KiB257220

arm64cpuid.plH A D15-Mar-20223.2 KiB158127

arm_arch.hH A D15-Mar-20224.2 KiB13091

armcap.cH A D15-Mar-20227.2 KiB281207

armv4cpuid.plH A D15-Mar-20225.6 KiB301264

asn1_dsa.cH A D15-Mar-20227.4 KiB253124

bsearch.cH A D15-Mar-20221.2 KiB4533

build.infoH A D15-Mar-20224.4 KiB137107

c64xpluscpuid.plH A D15-Mar-20225.3 KiB288259

context.cH A D15-Mar-202213 KiB495377

core_algorithm.cH A D15-Mar-20224.8 KiB147104

core_fetch.cH A D15-Mar-20224.7 KiB14085

core_namemap.cH A D15-Mar-202214.4 KiB533367

cpt_err.cH A D15-Mar-20222.7 KiB7156

cpuid.cH A D15-Mar-20225.7 KiB215129

cryptlib.cH A D15-Mar-20227.9 KiB283212

ctype.cH A D15-Mar-202214.4 KiB281250

cversion.cH A D15-Mar-20221.9 KiB8768

der_writer.cH A D15-Mar-20226 KiB200142

dllmain.cH A D15-Mar-20221.2 KiB4724

ebcdic.cH A D15-Mar-202215 KiB362232

ex_data.cH A D15-Mar-202213.9 KiB505361

getenv.cH A D15-Mar-20223.1 KiB10468

ia64cpuid.SH A D15-Mar-20226.3 KiB298258

info.cH A D15-Mar-20227.9 KiB208172

init.cH A D15-Mar-202221 KiB715501

initthread.cH A D15-Mar-202212.8 KiB468335

mem.cH A D15-Mar-20228 KiB338245

mem_clr.cH A D15-Mar-2022773 268

mem_sec.cH A D15-Mar-202218.6 KiB709541

mips_arch.hH A D15-Mar-20221.2 KiB4127

o_dir.cH A D15-Mar-20221.1 KiB3820

o_fopen.cH A D15-Mar-20224.3 KiB12775

o_init.cH A D15-Mar-2022516 226

o_str.cH A D15-Mar-20228.4 KiB341263

o_time.cH A D15-Mar-20225.5 KiB201133

packet.cH A D15-Mar-202211.9 KiB513358

param_build.cH A D15-Mar-202211.2 KiB386321

param_build_set.cH A D15-Mar-20223.6 KiB12292

params.cH A D15-Mar-202237.5 KiB1,2961,099

params_dup.cH A D15-Mar-20227.2 KiB237184

params_from_text.cH A D15-Mar-20227 KiB231141

pariscid.plH A D15-Mar-20224.8 KiB280237

passphrase.cH A D15-Mar-202211.3 KiB354284

ppccap.cH A D15-Mar-20228.3 KiB312240

ppccpuid.plH A D15-Mar-20227.3 KiB387331

provider.cH A D15-Mar-20224.2 KiB150119

provider_child.cH A D15-Mar-20229.4 KiB307223

provider_conf.cH A D15-Mar-20229.8 KiB317240

provider_core.cH A D15-Mar-202263.9 KiB2,0511,422

provider_local.hH A D15-Mar-20221 KiB3420

provider_predefined.cH A D15-Mar-20221.1 KiB3322

punycode.cH A D15-Mar-20229.2 KiB339197

s390x_arch.hH A D15-Mar-20226.2 KiB171121

s390xcap.cH A D15-Mar-202229.5 KiB743640

s390xcpuid.plH A D15-Mar-202211.4 KiB562447

self_test_core.cH A D15-Mar-20224.6 KiB173126

sparccpuid.SH A D15-Mar-202212 KiB579535

sparcv9cap.cH A D15-Mar-20227.3 KiB232173

sparse_array.cH A D15-Mar-20225.9 KiB220156

threads_lib.cH A D15-Mar-2022510 2612

threads_none.cH A D15-Mar-20223.1 KiB166117

threads_pthread.cH A D03-May-20226.3 KiB278213

threads_win.cH A D15-Mar-20225.1 KiB230164

trace.cH A D15-Mar-202214.3 KiB523420

uid.cH A D15-Mar-20221.3 KiB5636

vms_rms.hH A D15-Mar-20222.1 KiB5943

x86_64cpuid.plH A D15-Mar-202210.4 KiB523466

x86cpuid.plH A D15-Mar-202212.2 KiB508427

README-sparse_array.md

1Sparse Arrays
2=============
3
4The `sparse_array.c` file contains an implementation of a sparse array that
5attempts to be both space and time efficient.
6
7The sparse array is represented using a tree structure.  Each node in the
8tree contains a block of pointers to either the user supplied leaf values or
9to another node.
10
11There are a number of parameters used to define the block size:
12
13    OPENSSL_SA_BLOCK_BITS   Specifies the number of bits covered by each block
14    SA_BLOCK_MAX            Specifies the number of pointers in each block
15    SA_BLOCK_MASK           Specifies a bit mask to perform modulo block size
16    SA_BLOCK_MAX_LEVELS     Indicates the maximum possible height of the tree
17
18These constants are inter-related:
19
20    SA_BLOCK_MAX        = 2 ^ OPENSSL_SA_BLOCK_BITS
21    SA_BLOCK_MASK       = SA_BLOCK_MAX - 1
22    SA_BLOCK_MAX_LEVELS = number of bits in size_t divided by
23                          OPENSSL_SA_BLOCK_BITS rounded up to the next multiple
24                          of OPENSSL_SA_BLOCK_BITS
25
26`OPENSSL_SA_BLOCK_BITS` can be defined at compile time and this overrides the
27built in setting.
28
29As a space and performance optimisation, the height of the tree is usually
30less than the maximum possible height.  Only sufficient height is allocated to
31accommodate the largest index added to the data structure.
32
33The largest index used to add a value to the array determines the tree height:
34
35        +----------------------+---------------------+
36        | Largest Added Index  |   Height of Tree    |
37        +----------------------+---------------------+
38        | SA_BLOCK_MAX     - 1 |          1          |
39        | SA_BLOCK_MAX ^ 2 - 1 |          2          |
40        | SA_BLOCK_MAX ^ 3 - 1 |          3          |
41        | ...                  |          ...        |
42        | size_t max           | SA_BLOCK_MAX_LEVELS |
43        +----------------------+---------------------+
44
45The tree height is dynamically increased as needed based on additions.
46
47An empty tree is represented by a NULL root pointer.  Inserting a value at
48index 0 results in the allocation of a top level node full of null pointers
49except for the single pointer to the user's data (N = SA_BLOCK_MAX for
50brevity):
51
52        +----+
53        |Root|
54        |Node|
55        +-+--+
56          |
57          |
58          |
59          v
60        +-+-+---+---+---+---+
61        | 0 | 1 | 2 |...|N-1|
62        |   |nil|nil|...|nil|
63        +-+-+---+---+---+---+
64          |
65          |
66          |
67          v
68        +-+--+
69        |User|
70        |Data|
71        +----+
72    Index 0
73
74Inserting at element 2N+1 creates a new root node and pushes down the old root
75node.  It then creates a second second level node to hold the pointer to the
76user's new data:
77
78        +----+
79        |Root|
80        |Node|
81        +-+--+
82          |
83          |
84          |
85          v
86        +-+-+---+---+---+---+
87        | 0 | 1 | 2 |...|N-1|
88        |   |nil|   |...|nil|
89        +-+-+---+-+-+---+---+
90          |       |
91          |       +------------------+
92          |                          |
93          v                          v
94        +-+-+---+---+---+---+      +-+-+---+---+---+---+
95        | 0 | 1 | 2 |...|N-1|      | 0 | 1 | 2 |...|N-1|
96        |nil|   |nil|...|nil|      |nil|   |nil|...|nil|
97        +-+-+---+---+---+---+      +---+-+-+---+---+---+
98          |                              |
99          |                              |
100          |                              |
101          v                              v
102        +-+--+                         +-+--+
103        |User|                         |User|
104        |Data|                         |Data|
105        +----+                         +----+
106    Index 0                       Index 2N+1
107
108The nodes themselves are allocated in a sparse manner.  Only nodes which exist
109along a path from the root of the tree to an added leaf will be allocated.
110The complexity is hidden and nodes are allocated on an as needed basis.
111Because the data is expected to be sparse this doesn't result in a large waste
112of space.
113
114Values can be removed from the sparse array by setting their index position to
115NULL.  The data structure does not attempt to reclaim nodes or reduce the
116height of the tree on removal.  For example, now setting index 0 to NULL would
117result in:
118
119        +----+
120        |Root|
121        |Node|
122        +-+--+
123          |
124          |
125          |
126          v
127        +-+-+---+---+---+---+
128        | 0 | 1 | 2 |...|N-1|
129        |   |nil|   |...|nil|
130        +-+-+---+-+-+---+---+
131          |       |
132          |       +------------------+
133          |                          |
134          v                          v
135        +-+-+---+---+---+---+      +-+-+---+---+---+---+
136        | 0 | 1 | 2 |...|N-1|      | 0 | 1 | 2 |...|N-1|
137        |nil|nil|nil|...|nil|      |nil|   |nil|...|nil|
138        +---+---+---+---+---+      +---+-+-+---+---+---+
139                                         |
140                                         |
141                                         |
142                                         v
143                                       +-+--+
144                                       |User|
145                                       |Data|
146                                       +----+
147                                  Index 2N+1
148
149Accesses to elements in the sparse array take O(log n) time where n is the
150largest element.  The base of the logarithm is `SA_BLOCK_MAX`, so for moderately
151small indices (e.g. NIDs), single level (constant time) access is achievable.
152Space usage is O(minimum(m, n log(n)) where m is the number of elements in the
153array.
154
155Note: sparse arrays only include pointers to types.
156Thus, `SPARSE_ARRAY_OF(char)` can be used to store a string.
157