File: Netmcore_heap.html

package info (click to toggle)
ocamlnet 4.1.9-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 54,024 kB
  • sloc: ml: 151,939; ansic: 11,071; sh: 2,003; makefile: 1,310
file content (573 lines) | stat: -rw-r--r-- 34,901 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link rel="previous" href="Netmcore_mempool.html">
<link rel="next" href="Netmcore_ref.html">
<link rel="Up" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of extensions" rel=Appendix href="index_extensions.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
<link title="Index of values" rel=Appendix href="index_values.html">
<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
<link title="Index of class methods" rel=Appendix href="index_methods.html">
<link title="Index of classes" rel=Appendix href="index_classes.html">
<link title="Index of class types" rel=Appendix href="index_class_types.html">
<link title="Index of modules" rel=Appendix href="index_modules.html">
<link title="Index of module types" rel=Appendix href="index_module_types.html">
<link title="Uq_gtk" rel="Chapter" href="Uq_gtk.html">
<link title="Uq_tcl" rel="Chapter" href="Uq_tcl.html">
<link title="Equeue" rel="Chapter" href="Equeue.html">
<link title="Unixqueue" rel="Chapter" href="Unixqueue.html">
<link title="Unixqueue_pollset" rel="Chapter" href="Unixqueue_pollset.html">
<link title="Unixqueue_select" rel="Chapter" href="Unixqueue_select.html">
<link title="Uq_resolver" rel="Chapter" href="Uq_resolver.html">
<link title="Uq_engines" rel="Chapter" href="Uq_engines.html">
<link title="Uq_multiplex" rel="Chapter" href="Uq_multiplex.html">
<link title="Uq_transfer" rel="Chapter" href="Uq_transfer.html">
<link title="Uq_socks5" rel="Chapter" href="Uq_socks5.html">
<link title="Uq_io" rel="Chapter" href="Uq_io.html">
<link title="Uq_lwt" rel="Chapter" href="Uq_lwt.html">
<link title="Uq_libevent" rel="Chapter" href="Uq_libevent.html">
<link title="Uq_mt" rel="Chapter" href="Uq_mt.html">
<link title="Uq_client" rel="Chapter" href="Uq_client.html">
<link title="Uq_server" rel="Chapter" href="Uq_server.html">
<link title="Uq_datagram" rel="Chapter" href="Uq_datagram.html">
<link title="Uq_engines_compat" rel="Chapter" href="Uq_engines_compat.html">
<link title="Equeue_intro" rel="Chapter" href="Equeue_intro.html">
<link title="Equeue_howto" rel="Chapter" href="Equeue_howto.html">
<link title="Netcamlbox" rel="Chapter" href="Netcamlbox.html">
<link title="Netcgi_apache" rel="Chapter" href="Netcgi_apache.html">
<link title="Netcgi_modtpl" rel="Chapter" href="Netcgi_modtpl.html">
<link title="Netcgi_plex" rel="Chapter" href="Netcgi_plex.html">
<link title="Netcgi_common" rel="Chapter" href="Netcgi_common.html">
<link title="Netcgi" rel="Chapter" href="Netcgi.html">
<link title="Netcgi_ajp" rel="Chapter" href="Netcgi_ajp.html">
<link title="Netcgi_scgi" rel="Chapter" href="Netcgi_scgi.html">
<link title="Netcgi_cgi" rel="Chapter" href="Netcgi_cgi.html">
<link title="Netcgi_fcgi" rel="Chapter" href="Netcgi_fcgi.html">
<link title="Netcgi_dbi" rel="Chapter" href="Netcgi_dbi.html">
<link title="Netcgi1_compat" rel="Chapter" href="Netcgi1_compat.html">
<link title="Netcgi_test" rel="Chapter" href="Netcgi_test.html">
<link title="Netcgi_porting" rel="Chapter" href="Netcgi_porting.html">
<link title="Nethttp_client_conncache" rel="Chapter" href="Nethttp_client_conncache.html">
<link title="Nethttp_client" rel="Chapter" href="Nethttp_client.html">
<link title="Nettelnet_client" rel="Chapter" href="Nettelnet_client.html">
<link title="Netftp_data_endpoint" rel="Chapter" href="Netftp_data_endpoint.html">
<link title="Netftp_client" rel="Chapter" href="Netftp_client.html">
<link title="Nethttp_fs" rel="Chapter" href="Nethttp_fs.html">
<link title="Netftp_fs" rel="Chapter" href="Netftp_fs.html">
<link title="Netsmtp" rel="Chapter" href="Netsmtp.html">
<link title="Netpop" rel="Chapter" href="Netpop.html">
<link title="Netldap" rel="Chapter" href="Netldap.html">
<link title="Netclient_tut" rel="Chapter" href="Netclient_tut.html">
<link title="Netgss_bindings" rel="Chapter" href="Netgss_bindings.html">
<link title="Netgss" rel="Chapter" href="Netgss.html">
<link title="Nethttpd_types" rel="Chapter" href="Nethttpd_types.html">
<link title="Nethttpd_kernel" rel="Chapter" href="Nethttpd_kernel.html">
<link title="Nethttpd_reactor" rel="Chapter" href="Nethttpd_reactor.html">
<link title="Nethttpd_engine" rel="Chapter" href="Nethttpd_engine.html">
<link title="Nethttpd_services" rel="Chapter" href="Nethttpd_services.html">
<link title="Nethttpd_plex" rel="Chapter" href="Nethttpd_plex.html">
<link title="Nethttpd_util" rel="Chapter" href="Nethttpd_util.html">
<link title="Nethttpd_intro" rel="Chapter" href="Nethttpd_intro.html">
<link title="Netmcore" rel="Chapter" href="Netmcore.html">
<link title="Netmcore_camlbox" rel="Chapter" href="Netmcore_camlbox.html">
<link title="Netmcore_mempool" rel="Chapter" href="Netmcore_mempool.html">
<link title="Netmcore_heap" rel="Chapter" href="Netmcore_heap.html">
<link title="Netmcore_ref" rel="Chapter" href="Netmcore_ref.html">
<link title="Netmcore_array" rel="Chapter" href="Netmcore_array.html">
<link title="Netmcore_sem" rel="Chapter" href="Netmcore_sem.html">
<link title="Netmcore_mutex" rel="Chapter" href="Netmcore_mutex.html">
<link title="Netmcore_condition" rel="Chapter" href="Netmcore_condition.html">
<link title="Netmcore_queue" rel="Chapter" href="Netmcore_queue.html">
<link title="Netmcore_buffer" rel="Chapter" href="Netmcore_buffer.html">
<link title="Netmcore_matrix" rel="Chapter" href="Netmcore_matrix.html">
<link title="Netmcore_hashtbl" rel="Chapter" href="Netmcore_hashtbl.html">
<link title="Netmcore_process" rel="Chapter" href="Netmcore_process.html">
<link title="Netmcore_tut" rel="Chapter" href="Netmcore_tut.html">
<link title="Netmcore_basics" rel="Chapter" href="Netmcore_basics.html">
<link title="Netplex_types" rel="Chapter" href="Netplex_types.html">
<link title="Netplex_mp" rel="Chapter" href="Netplex_mp.html">
<link title="Netplex_mt" rel="Chapter" href="Netplex_mt.html">
<link title="Netplex_log" rel="Chapter" href="Netplex_log.html">
<link title="Netplex_controller" rel="Chapter" href="Netplex_controller.html">
<link title="Netplex_container" rel="Chapter" href="Netplex_container.html">
<link title="Netplex_sockserv" rel="Chapter" href="Netplex_sockserv.html">
<link title="Netplex_workload" rel="Chapter" href="Netplex_workload.html">
<link title="Netplex_main" rel="Chapter" href="Netplex_main.html">
<link title="Netplex_config" rel="Chapter" href="Netplex_config.html">
<link title="Netplex_kit" rel="Chapter" href="Netplex_kit.html">
<link title="Rpc_netplex" rel="Chapter" href="Rpc_netplex.html">
<link title="Netplex_cenv" rel="Chapter" href="Netplex_cenv.html">
<link title="Netplex_semaphore" rel="Chapter" href="Netplex_semaphore.html">
<link title="Netplex_sharedvar" rel="Chapter" href="Netplex_sharedvar.html">
<link title="Netplex_mutex" rel="Chapter" href="Netplex_mutex.html">
<link title="Netplex_encap" rel="Chapter" href="Netplex_encap.html">
<link title="Netplex_mbox" rel="Chapter" href="Netplex_mbox.html">
<link title="Netplex_internal" rel="Chapter" href="Netplex_internal.html">
<link title="Netplex_intro" rel="Chapter" href="Netplex_intro.html">
<link title="Netplex_advanced" rel="Chapter" href="Netplex_advanced.html">
<link title="Netplex_admin" rel="Chapter" href="Netplex_admin.html">
<link title="Netshm" rel="Chapter" href="Netshm.html">
<link title="Netshm_data" rel="Chapter" href="Netshm_data.html">
<link title="Netshm_hashtbl" rel="Chapter" href="Netshm_hashtbl.html">
<link title="Netshm_array" rel="Chapter" href="Netshm_array.html">
<link title="Netshm_intro" rel="Chapter" href="Netshm_intro.html">
<link title="Netstring_pcre" rel="Chapter" href="Netstring_pcre.html">
<link title="Netconversion" rel="Chapter" href="Netconversion.html">
<link title="Netchannels" rel="Chapter" href="Netchannels.html">
<link title="Netstream" rel="Chapter" href="Netstream.html">
<link title="Netmime_string" rel="Chapter" href="Netmime_string.html">
<link title="Netmime" rel="Chapter" href="Netmime.html">
<link title="Netsendmail" rel="Chapter" href="Netsendmail.html">
<link title="Neturl" rel="Chapter" href="Neturl.html">
<link title="Netaddress" rel="Chapter" href="Netaddress.html">
<link title="Netbuffer" rel="Chapter" href="Netbuffer.html">
<link title="Netmime_header" rel="Chapter" href="Netmime_header.html">
<link title="Netmime_channels" rel="Chapter" href="Netmime_channels.html">
<link title="Neturl_ldap" rel="Chapter" href="Neturl_ldap.html">
<link title="Netdate" rel="Chapter" href="Netdate.html">
<link title="Netencoding" rel="Chapter" href="Netencoding.html">
<link title="Netulex" rel="Chapter" href="Netulex.html">
<link title="Netaccel" rel="Chapter" href="Netaccel.html">
<link title="Netaccel_link" rel="Chapter" href="Netaccel_link.html">
<link title="Nethtml" rel="Chapter" href="Nethtml.html">
<link title="Netstring_str" rel="Chapter" href="Netstring_str.html">
<link title="Netmappings" rel="Chapter" href="Netmappings.html">
<link title="Netaux" rel="Chapter" href="Netaux.html">
<link title="Nethttp" rel="Chapter" href="Nethttp.html">
<link title="Netpagebuffer" rel="Chapter" href="Netpagebuffer.html">
<link title="Netfs" rel="Chapter" href="Netfs.html">
<link title="Netglob" rel="Chapter" href="Netglob.html">
<link title="Netauth" rel="Chapter" href="Netauth.html">
<link title="Netsockaddr" rel="Chapter" href="Netsockaddr.html">
<link title="Netnumber" rel="Chapter" href="Netnumber.html">
<link title="Netxdr_mstring" rel="Chapter" href="Netxdr_mstring.html">
<link title="Netxdr" rel="Chapter" href="Netxdr.html">
<link title="Netcompression" rel="Chapter" href="Netcompression.html">
<link title="Netunichar" rel="Chapter" href="Netunichar.html">
<link title="Netasn1" rel="Chapter" href="Netasn1.html">
<link title="Netasn1_encode" rel="Chapter" href="Netasn1_encode.html">
<link title="Netoid" rel="Chapter" href="Netoid.html">
<link title="Netstring_tstring" rel="Chapter" href="Netstring_tstring.html">
<link title="Netdn" rel="Chapter" href="Netdn.html">
<link title="Netx509" rel="Chapter" href="Netx509.html">
<link title="Netascii_armor" rel="Chapter" href="Netascii_armor.html">
<link title="Nettls_support" rel="Chapter" href="Nettls_support.html">
<link title="Netmech_scram" rel="Chapter" href="Netmech_scram.html">
<link title="Netmech_scram_gssapi" rel="Chapter" href="Netmech_scram_gssapi.html">
<link title="Netmech_scram_sasl" rel="Chapter" href="Netmech_scram_sasl.html">
<link title="Netmech_scram_http" rel="Chapter" href="Netmech_scram_http.html">
<link title="Netgssapi_support" rel="Chapter" href="Netgssapi_support.html">
<link title="Netgssapi_auth" rel="Chapter" href="Netgssapi_auth.html">
<link title="Netchannels_crypto" rel="Chapter" href="Netchannels_crypto.html">
<link title="Netx509_pubkey" rel="Chapter" href="Netx509_pubkey.html">
<link title="Netx509_pubkey_crypto" rel="Chapter" href="Netx509_pubkey_crypto.html">
<link title="Netsaslprep" rel="Chapter" href="Netsaslprep.html">
<link title="Netmech_plain_sasl" rel="Chapter" href="Netmech_plain_sasl.html">
<link title="Netmech_crammd5_sasl" rel="Chapter" href="Netmech_crammd5_sasl.html">
<link title="Netmech_digest_sasl" rel="Chapter" href="Netmech_digest_sasl.html">
<link title="Netmech_digest_http" rel="Chapter" href="Netmech_digest_http.html">
<link title="Netmech_krb5_sasl" rel="Chapter" href="Netmech_krb5_sasl.html">
<link title="Netmech_gs2_sasl" rel="Chapter" href="Netmech_gs2_sasl.html">
<link title="Netmech_spnego_http" rel="Chapter" href="Netmech_spnego_http.html">
<link title="Netchannels_tut" rel="Chapter" href="Netchannels_tut.html">
<link title="Netmime_tut" rel="Chapter" href="Netmime_tut.html">
<link title="Netsendmail_tut" rel="Chapter" href="Netsendmail_tut.html">
<link title="Netulex_tut" rel="Chapter" href="Netulex_tut.html">
<link title="Neturl_tut" rel="Chapter" href="Neturl_tut.html">
<link title="Netsys" rel="Chapter" href="Netsys.html">
<link title="Netsys_posix" rel="Chapter" href="Netsys_posix.html">
<link title="Netsys_pollset" rel="Chapter" href="Netsys_pollset.html">
<link title="Netlog" rel="Chapter" href="Netlog.html">
<link title="Netexn" rel="Chapter" href="Netexn.html">
<link title="Netsys_win32" rel="Chapter" href="Netsys_win32.html">
<link title="Netsys_pollset_posix" rel="Chapter" href="Netsys_pollset_posix.html">
<link title="Netsys_pollset_win32" rel="Chapter" href="Netsys_pollset_win32.html">
<link title="Netsys_pollset_generic" rel="Chapter" href="Netsys_pollset_generic.html">
<link title="Netsys_signal" rel="Chapter" href="Netsys_signal.html">
<link title="Netsys_oothr" rel="Chapter" href="Netsys_oothr.html">
<link title="Netsys_xdr" rel="Chapter" href="Netsys_xdr.html">
<link title="Netsys_rng" rel="Chapter" href="Netsys_rng.html">
<link title="Netsys_crypto_types" rel="Chapter" href="Netsys_crypto_types.html">
<link title="Netsys_types" rel="Chapter" href="Netsys_types.html">
<link title="Netsys_mem" rel="Chapter" href="Netsys_mem.html">
<link title="Netsys_tmp" rel="Chapter" href="Netsys_tmp.html">
<link title="Netsys_sem" rel="Chapter" href="Netsys_sem.html">
<link title="Netsys_pmanage" rel="Chapter" href="Netsys_pmanage.html">
<link title="Netsys_crypto" rel="Chapter" href="Netsys_crypto.html">
<link title="Netsys_tls" rel="Chapter" href="Netsys_tls.html">
<link title="Netsys_ciphers" rel="Chapter" href="Netsys_ciphers.html">
<link title="Netsys_digests" rel="Chapter" href="Netsys_digests.html">
<link title="Netsys_crypto_modes" rel="Chapter" href="Netsys_crypto_modes.html">
<link title="Netsys_gssapi" rel="Chapter" href="Netsys_gssapi.html">
<link title="Netsys_sasl_types" rel="Chapter" href="Netsys_sasl_types.html">
<link title="Netsys_sasl" rel="Chapter" href="Netsys_sasl.html">
<link title="Netsys_polypipe" rel="Chapter" href="Netsys_polypipe.html">
<link title="Netsys_polysocket" rel="Chapter" href="Netsys_polysocket.html">
<link title="Netsys_global" rel="Chapter" href="Netsys_global.html">
<link title="Nettls_gnutls_bindings" rel="Chapter" href="Nettls_gnutls_bindings.html">
<link title="Nettls_nettle_bindings" rel="Chapter" href="Nettls_nettle_bindings.html">
<link title="Nettls_gnutls" rel="Chapter" href="Nettls_gnutls.html">
<link title="Netunidata" rel="Chapter" href="Netunidata.html">
<link title="Netgzip" rel="Chapter" href="Netgzip.html">
<link title="Rpc_auth_local" rel="Chapter" href="Rpc_auth_local.html">
<link title="Rpc_xti_client" rel="Chapter" href="Rpc_xti_client.html">
<link title="Rpc" rel="Chapter" href="Rpc.html">
<link title="Rpc_program" rel="Chapter" href="Rpc_program.html">
<link title="Rpc_util" rel="Chapter" href="Rpc_util.html">
<link title="Rpc_portmapper_aux" rel="Chapter" href="Rpc_portmapper_aux.html">
<link title="Rpc_packer" rel="Chapter" href="Rpc_packer.html">
<link title="Rpc_transport" rel="Chapter" href="Rpc_transport.html">
<link title="Rpc_client" rel="Chapter" href="Rpc_client.html">
<link title="Rpc_simple_client" rel="Chapter" href="Rpc_simple_client.html">
<link title="Rpc_portmapper_clnt" rel="Chapter" href="Rpc_portmapper_clnt.html">
<link title="Rpc_portmapper" rel="Chapter" href="Rpc_portmapper.html">
<link title="Rpc_server" rel="Chapter" href="Rpc_server.html">
<link title="Rpc_auth_sys" rel="Chapter" href="Rpc_auth_sys.html">
<link title="Rpc_auth_gssapi" rel="Chapter" href="Rpc_auth_gssapi.html">
<link title="Rpc_proxy" rel="Chapter" href="Rpc_proxy.html">
<link title="Rpc_intro" rel="Chapter" href="Rpc_intro.html">
<link title="Rpc_mapping_ref" rel="Chapter" href="Rpc_mapping_ref.html">
<link title="Rpc_intro_gss" rel="Chapter" href="Rpc_intro_gss.html">
<link title="Shell_sys" rel="Chapter" href="Shell_sys.html">
<link title="Shell" rel="Chapter" href="Shell.html">
<link title="Shell_uq" rel="Chapter" href="Shell_uq.html">
<link title="Shell_fs" rel="Chapter" href="Shell_fs.html">
<link title="Shell_intro" rel="Chapter" href="Shell_intro.html">
<link title="Intro" rel="Chapter" href="Intro.html">
<link title="Platform" rel="Chapter" href="Platform.html">
<link title="Foreword" rel="Chapter" href="Foreword.html">
<link title="Ipv6" rel="Chapter" href="Ipv6.html">
<link title="Regexp" rel="Chapter" href="Regexp.html">
<link title="Tls" rel="Chapter" href="Tls.html">
<link title="Crypto" rel="Chapter" href="Crypto.html">
<link title="Authentication" rel="Chapter" href="Authentication.html">
<link title="Credentials" rel="Chapter" href="Credentials.html">
<link title="Gssapi" rel="Chapter" href="Gssapi.html">
<link title="Ocamlnet4" rel="Chapter" href="Ocamlnet4.html">
<link title="Get" rel="Chapter" href="Get.html"><link title="Example: Mutable Variable" rel="Section" href="#2_ExampleMutableVariable">
<title>Ocamlnet 4 Reference Manual : Netmcore_heap</title>
</head>
<body>
<div class="navbar"><a class="pre" href="Netmcore_mempool.html" title="Netmcore_mempool">Previous</a>
&nbsp;<a class="up" href="index.html" title="Index">Up</a>
&nbsp;<a class="post" href="Netmcore_ref.html" title="Netmcore_ref">Next</a>
</div>
<h1>Module <a href="type_Netmcore_heap.html">Netmcore_heap</a></h1>

<pre><span id="MODULENetmcore_heap"><span class="keyword">module</span> Netmcore_heap</span>: <code class="code">sig</code> <a href="Netmcore_heap.html">..</a> <code class="code">end</code></pre><div class="info module top">
<div class="info-desc">
<p>Shared heaps of structured values</p>

<p>These heaps live in <a href="Netmcore_mempool.html"><code class="code">Netmcore_mempool</code></a>-type shared memory pools,
    and can contain an arbitrary number of Ocaml values. These values
    can be mutable, but special care has to be taken when modifying them.
    The first value pushed onto the heap is called the <i>root element</i>.
    All other values must be (directly or indirectly) reachable from the
    root element.</p>

<p>Heaps are created with a certain initial size. The heaps remain
    connected with the memory pool, and they are enlarged if necessary
    by allocating more blocks in the pool.</p>

<p>As the heaps are shared between processes, it must be taken care
    that no reference is made from shared heaps to normal process-local
    memory. These references would only be valid in the process creating
    them, and following such references from other processes would probably
    crash the program (or at least return wrong values). In order to ensure
    this, it is strictly forbidden to directly manipulate mutable
    data structures. The <a href="Netmcore_heap.html#VALmodify"><code class="code">Netmcore_heap.modify</code></a> function has to be used,
    as this function makes it possible to copy more values to the heap.
    Unfortunately, there is nothing in the type system that would prevent
    direct mutation. so this can only be ensured by the discipline of the
    programmer.</p>

<p>The values of the heap are also garbage-collected: If all allocated
    space is used and more values need to be added, it is first tried
    to get rid of old unreachable values. The garbarge collection is done
    by the process that happens to initiate the addition of the value
    that does no more fit onto the heap. During garbage collection, no
    other additions can be done, but read accesses are not prevented.
    The garbage collector does not move values (addresses remain unchanged).</p>

<p>The garabage collector only considers values as reachable that are
    reachable via the root element. It is not sufficient when a value
    is only reachable via a process-specific reference.</p>
</div>
</div>
<hr width="100%">

<pre><span id="TYPEheap"><span class="keyword">type</span> <code class="type">'a</code> heap</span> </pre>
<div class="info ">
<div class="info-desc">
<p>A heap where the type of the root element is <code class="code">'a</code></p>
</div>
</div>


<pre><span id="TYPEdescr"><span class="keyword">type</span> <code class="type">'a</code> descr</span> </pre>
<div class="info ">
<div class="info-desc">
<p>A descriptor ("address") pointing to the heap. Descriptors
      can be marshalled.</p>
</div>
</div>


<pre><span id="VALcreate_heap"><span class="keyword">val</span> create_heap</span> : <code class="type"><a href="Netmcore.html#TYPEres_id">Netmcore.res_id</a> -> int -> 'a -> 'a <a href="Netmcore_heap.html#TYPEheap">heap</a></code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">create_heap pool_id size root</code>: Creates a new heap with <code class="code">size</code>
      bytes in the pool identified by <code class="code">pool_id</code>. This ID must refer
      to a <a href="Netmcore_mempool.html"><code class="code">Netmcore_mempool</code></a>-managed pool.</p>

<p>The value <code class="code">root</code> is copied to the new heap. This is done by
      deeply duplicating <code class="code">root</code> and all values pointed to by <code class="code">root</code>,
      and storing these duplicates in the heap.</p>

<p>The possible types of value <code class="code">root</code> are restricted, see the <code class="code">add</code>
      function for more.</p>
</div>
</div>

<pre><span id="VALminimum_size"><span class="keyword">val</span> minimum_size</span> : <code class="type">'a -> int</code></pre><div class="info ">
<div class="info-desc">
<p>Returns the <code class="code">size</code> value one must pass to <code class="code">create_heap</code> at minimum
      to put this root element onto the heap.</p>
</div>
</div>

<pre><span id="VALroot"><span class="keyword">val</span> root</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> 'a</code></pre><div class="info ">
<div class="info-desc">
<p>Returns the root element</p>
</div>
</div>

<pre><span id="VALdescr_of_heap"><span class="keyword">val</span> descr_of_heap</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> 'a <a href="Netmcore_heap.html#TYPEdescr">descr</a></code></pre><div class="info ">
<div class="info-desc">
<p>Get the descriptor of a heap</p>
</div>
</div>

<pre><span id="VALheap_of_descr"><span class="keyword">val</span> heap_of_descr</span> : <code class="type"><a href="Netmcore.html#TYPEres_id">Netmcore.res_id</a> -> 'a <a href="Netmcore_heap.html#TYPEdescr">descr</a> -> 'a <a href="Netmcore_heap.html#TYPEheap">heap</a></code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">heap_of_descr pool d</code>:
      Get the heap for a descriptor. This assumes that the heap still
      exists.</p>
</div>
</div>

<pre><span id="TYPEmutator"><span class="keyword">type</span> <code class="type"></code>mutator</span> </pre>
<div class="info ">
<div class="info-desc">
<p>Mutators allow it to push new values onto the heap.</p>

<p>Caveat: pushed values are not considered as roots, and thus they
      need immediately be attached to the existing data structure.
      Otherwise, the next push might trigger a garbage collection, and
      the new value is deleted. If this is not possible, one can
      call <code class="code">pin</code> instead (see below).</p>
</div>
</div>


<pre><span id="VALmodify"><span class="keyword">val</span> modify</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> (<a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> 'r) -> 'r</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">modify h mutate</code>: This function locks the heap so that this process
      has exclusive write access to it for the duration of the <code class="code">mutate</code>
      function. The <code class="code">mutate</code> function is immediately called back, and
      the argument of <code class="code">mutate</code> is the mutator <code class="code">m</code> that allows one to push
      values onto the heap.</p>

<p>By calling <code class="code">add m x</code> from the body of <code class="code">mutate</code> one can create a copy
      of <code class="code">x</code> that is stored in the heap.</p>
</div>
</div>

<pre><span id="VALadd"><span class="keyword">val</span> add</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> 'a -> 'a</code></pre><div class="info ">
<div class="info-desc">
<p>Pushes a new value onto the heap. This creates a deep copy of the
      value.</p>

<p>Not all values can be pushed here. In particular, forbidden are:</p>
<ul>
<li>Functions</li>
<li>Objects</li>
<li>Unsupported custom blocks, e.g. <code class="code">in_channel</code> and <code class="code">out_channel</code>.
        Supported custom blocks are only <code class="code">int32</code>, <code class="code">int64</code>, <code class="code">nativeint</code>,
        and bigarrays.</li>
<li>Heaps (a heap cannot contain a heap)</li>
<li>Values containing semaphores and other synchronization primitives.
        Explicitly allowed are dummy primitives like <a href="Netmcore_mutex.html#VALdummy"><code class="code">Netmcore_mutex.dummy</code></a>.</li>
</ul>
</div>
</div>

<pre><span id="VALadd_immutable"><span class="keyword">val</span> add_immutable</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> 'a -> 'a</code></pre><div class="info ">
<div class="info-desc">
<p>Pushes a new value onto the heap. This function must only be used
      if the added value is immutable. An important optimization is applied
      here: if parts of the value are already living on the heap, these
      parts are not copied, but shared with the output value.</p>

<p>The same value restrictions apply as for <code class="code">add</code>. Note that
      <code class="code">add_immutable</code> cannot be used if the value to copy lives in a different
      heap of the same pool (as a whole or partially). In this case use
      <code class="code">add</code>.</p>
</div>
</div>

<pre><span id="VALadd_uniform_array"><span class="keyword">val</span> add_uniform_array</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> int -> 'a -> 'a array</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">add_uniform_array m n x</code>: Pushes a new value with n elements onto
      the heap. Each index position of the array is initialized with
      the same copy of <code class="code">x</code>.</p>

<p>You should not call this function with <code class="code">n=0</code>, because this results in
      a copied atom, which is an illegal representation in OCaml.</p>
</div>
</div>

<pre><span id="VALadd_init_array"><span class="keyword">val</span> add_init_array</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> int -> (int -> 'a) -> 'a array</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">add_init_array m n f</code>: Pushes a new value with n elements onto
      the heap. The index position <code class="code">k</code> is inititialized by running
      <code class="code">f k</code> and pushing the copy of this onto the heap.</p>

<p>You should not call this function with <code class="code">n=0</code>, because this results in
      a copied atom, which is an illegal representation in OCaml.</p>
</div>
</div>

<pre><span id="VALadd_some"><span class="keyword">val</span> add_some</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> 'a -> 'a option</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">add_some mut x</code>: Returns <code class="code">Some x</code> where the O'Caml value representing
      <code class="code">Some</code> is allocated in the heap using <code class="code">mut</code>. It is assumed that <code class="code">x</code> is
      already  a resident of the heap. This means <code class="code">x</code> is not copied!</p>
</div>
</div>

<pre><span id="VALadd_string"><span class="keyword">val</span> add_string</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> int -> string</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">let s = add_string mut len</code>: Adds an uninitialized string of length
      <code class="code">len</code> to the heap using <code class="code">mut</code>, and returns the string</p>
</div>
</div>

<pre><span id="VALpin"><span class="keyword">val</span> pin</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> 'a -> unit</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">pin m x</code>: Pins a shared value <code class="code">x</code> so it cannot be deleted by
      the garbage collector. The value remains pinned for the lifetime
      of the mutator <code class="code">m</code> (i.e. the runtime of the <code class="code">modify</code> function).</p>

<p>Pinning is relatively expensive if done in masses, and should be
      avoided if possible.</p>
</div>
</div>

<pre><span id="VALcopy"><span class="keyword">val</span> copy</span> : <code class="type">'a -> 'a</code></pre><div class="info ">
<div class="info-desc">
<p>Creates a deep copy of the input value, and stores the duplicate
      in normal process memory.</p>
</div>
</div>

<pre><span id="VALwith_value"><span class="keyword">val</span> with_value</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> (unit -> 'b) -> ('b -> 'c) -> 'c</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">with_value h find process</code>: Logically, this runs
      <code class="code">process (find ())</code> and returns the result. While <code class="code">find</code> is being
      executed, the heap is write-locked. This returns a value <code class="code">x</code>.
      While <code class="code">process</code> is being executed, the value <code class="code">x</code> is temporarily
      added to the set of reachable values, so that a parallely running
      garbage collection will not delete it.</p>

<p>Note that <code class="code">x</code> <b>must</b> reside in the heap!</p>

<p>Calling <code class="code">modify</code> from <code class="code">find</code> will cause a deadlock. Calling 
      it from <code class="code">process</code> is allowed.</p>
</div>
</div>

<pre><span id="VALwith_value_2"><span class="keyword">val</span> with_value_2</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> (unit -> 'b * 'c) -> ('b * 'c -> 'z) -> 'z</code></pre>
<pre><span id="VALwith_value_3"><span class="keyword">val</span> with_value_3</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> (unit -> 'b * 'c * 'd) -> ('b * 'c * 'd -> 'z) -> 'z</code></pre>
<pre><span id="VALwith_value_4"><span class="keyword">val</span> with_value_4</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -><br>       (unit -> 'b * 'c * 'd * 'e) -> ('b * 'c * 'd * 'e -> 'z) -> 'z</code></pre>
<pre><span id="VALwith_value_5"><span class="keyword">val</span> with_value_5</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -><br>       (unit -> 'b * 'c * 'd * 'e * 'f) -> ('b * 'c * 'd * 'e * 'f -> 'z) -> 'z</code></pre><div class="info ">
<div class="info-desc">
<p>Same as <code class="code">with_value</code>, but a tuple of values can be passed down</p>
</div>
</div>

<pre><span id="VALwith_value_n"><span class="keyword">val</span> with_value_n</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> (unit -> 'b list) -> ('b list -> 'c) -> 'c</code></pre><div class="info ">
<div class="info-desc">
<p>Same as <code class="code">with_value</code>, but a list of values can be passed down</p>
</div>
</div>

<pre><span id="VALdestroy"><span class="keyword">val</span> destroy</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> unit</code></pre><div class="info ">
<div class="info-desc">
<p>Destroys the heap and gives the memory back to the pool</p>
</div>
</div>

<pre><span id="VALgc"><span class="keyword">val</span> gc</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> unit</code></pre><div class="info ">
<div class="info-desc">
<p>Lock the heap and do a GC pass</p>
</div>
</div>

<pre><span id="VALpool"><span class="keyword">val</span> pool</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> <a href="Netmcore.html#TYPEres_id">Netmcore.res_id</a></code></pre><div class="info ">
<div class="info-desc">
<p>Return the pool ID</p>
</div>
</div>

<pre><span id="VALmut_pool"><span class="keyword">val</span> mut_pool</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> <a href="Netmcore.html#TYPEres_id">Netmcore.res_id</a></code></pre><div class="info ">
<div class="info-desc">
<p>Return the pool ID</p>
</div>
</div>

<pre><span id="VALsem_container"><span class="keyword">val</span> sem_container</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> <a href="Netsys_sem.html#TYPEcontainer">Netsys_sem.container</a></code></pre><div class="info ">
<div class="info-desc">
<p>Return the semaphore container</p>
</div>
</div>

<pre><span id="VALmut_sem_container"><span class="keyword">val</span> mut_sem_container</span> : <code class="type"><a href="Netmcore_heap.html#TYPEmutator">mutator</a> -> <a href="Netsys_sem.html#TYPEcontainer">Netsys_sem.container</a></code></pre><div class="info ">
<div class="info-desc">
<p>Return the semaphore container</p>
</div>
</div>

<pre><span id="VALdebug_info"><span class="keyword">val</span> debug_info</span> : <code class="type">'a <a href="Netmcore_heap.html#TYPEheap">heap</a> -> string</code></pre><div class="info ">
<div class="info-desc">
<p>Returns a multi-line debug string</p>
</div>
</div>
<h3 id="2_ExampleMutableVariable">Example: Mutable Variable</h3>
<p>This example creates a heap that stores a single value. (This is
    available as <a href="Netmcore_ref.html"><code class="code">Netmcore_ref</code></a>.)</p>

<pre class="codepre"><code class="code">    let shared_ref x =
      (* The shm version of [ref x] *)
      let r = ref x in
      let init_size = minimum_size r in
      let hp = create_heap pool_id init_size r in
      hp

    let deref sref =
      (* The shm version of [!] *)
      !(root sref)

    let assign sref x =
      (* The shm version of [:=] - however, a copy of x is done *)
      modify sref
        (fun add -&gt;
          (root sref) := add x
        )
    </code></pre>
<pre><span id="MODULEDebug"><span class="keyword">module</span> <a href="Netmcore_heap.Debug.html">Debug</a></span>: <code class="code">sig</code> <a href="Netmcore_heap.Debug.html">..</a> <code class="code">end</code></pre></body></html>