288
300
disable_trace(int error, char *reason, int eno)
290
#define ENO_BUF_SZ 100
291
char buf[ENO_BUF_SZ];
302
char *mt_dis = "Memory trace disabled";
305
erts_mtrace_enabled = 0;
306
erts_sock_close(socket_desc);
307
socket_desc = ERTS_SOCK_INVALID_SOCKET;
310
erts_fprintf(stderr, "%s: %s\n", mt_dis, reason);
295
312
eno_str = erl_errno_id(eno);
297
313
if (strcmp(eno_str, "unknown") == 0)
298
sprintf(buf, ": %d", eno);
301
buf[0] = ':'; buf[1] = ' ';
302
for (i = 2; i < ENO_BUF_SZ && eno_str[i-2]; i++)
303
buf[i] = eno_str[i-2];
310
erts_mtrace_enabled = 0;
311
erts_sock_close(socket_desc);
312
socket_desc = ERTS_SOCK_INVALID_SOCKET;
314
erl_printf(erts_initialized ? CBUF : CERR,
315
"Memory trace disabled: %s%s\n", reason, eno_str);
316
if (erts_initialized) {
318
send_error_to_logger(NIL);
314
erts_fprintf(stderr, "%s: %s: %d\n", mt_dis, reason, eno);
320
send_error_to_logger(NIL);
316
erts_fprintf(stderr, "%s: %s: %s\n", mt_dis, reason, eno_str);
365
write_trace_header(void)
359
write_trace_header(char *nodename, char *pid, char *hostname)
365
Uint32 flags, n_len, h_len, p_len, hdr_prolog_len;
370
366
int i, no, str_len;
373
if (!MAKE_TBUF_SZ(5*UI32_SZ + 2*UI16_SZ))
374
sys_gettimeofday(&last_tv);
376
start_time.gsec = (Uint32) (last_tv.tv_sec / 1000000000);
377
start_time.sec = (Uint32) (last_tv.tv_sec % 1000000000);
378
start_time.usec = (Uint32) last_tv.tv_usec;
380
if (!MAKE_TBUF_SZ(3*UI32_SZ))
378
385
flags |= ERTS_MT_64_BIT_FLAG;
387
flags |= ERTS_MT_CRR_INFO;
388
#ifdef ERTS_CAN_TRACK_MALLOC
389
flags |= ERTS_MT_SEG_CRR_INFO;
393
* The following 3 ui32 words *always* have to come
394
* first in the trace.
381
396
PUT_UI32(tracep, ERTS_MT_START_WORD);
382
397
PUT_UI32(tracep, ERTS_MT_MAJOR_VSN);
383
398
PUT_UI32(tracep, ERTS_MT_MINOR_VSN);
400
n_len = strlen(nodename);
401
h_len = strlen(hostname);
403
hdr_prolog_len = (2*UI32_SZ
411
if (!MAKE_TBUF_SZ(hdr_prolog_len))
415
* New stuff can be added at the end the of header prolog
416
* (EOHP). The reader should skip stuff at the end, that it
417
* doesn't understand.
424
PUT_UI32(tracep, hdr_prolog_len);
384
425
PUT_UI32(tracep, flags);
426
PUT_UI16(tracep, ERTS_MTRACE_SEGMENT_ID);
388
427
PUT_UI16(tracep, ERTS_ALC_A_MAX);
389
428
PUT_UI16(tracep, ERTS_ALC_N_MAX);
391
hdr_sz = 5*UI32_SZ + 2*UI16_SZ;
430
PUT_UI32(tracep, start_time.gsec);
431
PUT_UI32(tracep, start_time.sec);
432
PUT_UI32(tracep, start_time.usec);
434
PUT_UI8(tracep, (byte) n_len);
435
memcpy((void *) tracep, (void *) nodename, n_len);
438
PUT_UI8(tracep, (byte) h_len);
439
memcpy((void *) tracep, (void *) hostname, h_len);
442
PUT_UI8(tracep, (byte) p_len);
443
memcpy((void *) tracep, (void *) pid, p_len);
446
ASSERT(startp + hdr_prolog_len == tracep);
453
* All tags from here on should be followed by an Uint16 size
454
* field containing the total size of the entry.
456
* New stuff can eigther be added at the end of an entry, or
457
* as a new tagged entry. The reader should skip stuff at the
458
* end, that it doesn't understand.
393
461
for (i = ERTS_ALC_A_MIN; i <= ERTS_ALC_A_MAX; i++) {
464
#ifndef ERTS_CAN_TRACK_MALLOC
465
if (i != ERTS_ALC_A_SYSTEM)
467
aflags |= ERTS_MT_ALLCTR_USD_CRR_INFO;
394
469
str = ERTS_ALC_A2AD(i);
396
471
str_len = strlen(str);
398
473
disable_trace(1, "Excessively large allocator string", 0);
402
if (!MAKE_TBUF_SZ(UI8_SZ + 2*UI16_SZ + str_len))
477
entry_sz = UI8_SZ + 3*UI16_SZ + UI8_SZ;
478
entry_sz += (erts_allctrs_info[i].alloc_util ? 2 : 1)*UI16_SZ;
479
entry_sz += UI8_SZ + str_len;
481
if (!MAKE_TBUF_SZ(entry_sz))
404
hdr_sz += UI8_SZ + 2*UI16_SZ + str_len;
406
PUT_UI16(tracep, ERTS_MT_ALLOCATOR_TAG);
487
PUT_UI8(tracep, ERTS_MT_ALLOCATOR_HDR_TAG);
488
PUT_UI16(tracep, entry_sz);
489
PUT_UI16(tracep, aflags);
407
490
PUT_UI16(tracep, (Uint16) i);
408
491
PUT_UI8( tracep, (byte) str_len);
409
492
memcpy((void *) tracep, (void *) str, str_len);
410
493
tracep += str_len;
494
if (erts_allctrs_info[i].alloc_util) {
496
PUT_UI16(tracep, ERTS_MTRACE_SEGMENT_ID);
497
PUT_UI16(tracep, ERTS_ALC_A_SYSTEM);
502
case ERTS_ALC_A_SYSTEM:
503
PUT_UI16(tracep, ERTS_MTRACE_SEGMENT_ID);
505
case ERTS_ALC_A_FIXED_SIZE:
506
if (erts_allctrs_info[ERTS_FIX_CORE_ALLOCATOR].enabled)
507
PUT_UI16(tracep, ERTS_FIX_CORE_ALLOCATOR);
509
PUT_UI16(tracep, ERTS_ALC_A_SYSTEM);
512
PUT_UI16(tracep, ERTS_MTRACE_SEGMENT_ID);
516
ASSERT(startp + entry_sz == tracep);
413
519
for (i = ERTS_ALC_N_MIN; i <= ERTS_ALC_N_MAX; i++) {
414
521
str = ERTS_ALC_N2TD(i);
425
532
no = ERTS_ALC_A_SYSTEM;
426
533
ASSERT(ERTS_ALC_A_MIN <= no && no <= ERTS_ALC_A_MAX);
428
if (!MAKE_TBUF_SZ(UI8_SZ + 3*UI16_SZ + str_len))
535
entry_sz = UI8_SZ + 3*UI16_SZ + UI8_SZ + str_len + UI16_SZ;
537
if (!MAKE_TBUF_SZ(entry_sz))
431
hdr_sz += UI8_SZ + 3*UI16_SZ + str_len;
433
PUT_UI16(tracep, ERTS_MT_BLOCK_TYPE_TAG);
543
PUT_UI8(tracep, ERTS_MT_BLOCK_TYPE_HDR_TAG);
544
PUT_UI16(tracep, entry_sz);
545
PUT_UI16(tracep, nflags);
434
546
PUT_UI16(tracep, (Uint16) i);
435
PUT_UI8( tracep, (byte) str_len);
547
PUT_UI8(tracep, (byte) str_len);
436
548
memcpy((void *) tracep, (void *) str, str_len);
437
549
tracep += str_len;
438
550
PUT_UI16(tracep, no);
551
ASSERT(startp + entry_sz == tracep);
441
WRITE_UI32(hdr_szp, hdr_sz);
554
entry_sz = UI8_SZ + UI16_SZ;
555
if (!MAKE_TBUF_SZ(entry_sz))
557
PUT_UI8(tracep, ERTS_MT_END_OF_HDR_TAG);
558
PUT_UI16(tracep, entry_sz);
450
567
static ErtsAllocatorFunctions_t real_allctrs[ERTS_ALC_A_MAX+1];
452
void erts_mtrace_init(char *receiver)
569
void erts_mtrace_pre_init(void)
573
void erts_mtrace_init(char *receiver, char *nodename)
575
char hostname[MAXHOSTNAMELEN];
576
char pid[21]; /* enough for a 64 bit number */
454
578
socket_desc = ERTS_SOCK_INVALID_SOCKET;
455
579
erts_mtrace_enabled = receiver != NULL;
457
581
if (erts_mtrace_enabled) {
459
582
unsigned a, b, c, d, p;
463
/* Install trace functions */
464
ASSERT(sizeof(erts_allctrs) == sizeof(real_allctrs));
466
sys_memcpy((void *) real_allctrs,
467
(void *) erts_allctrs,
468
sizeof(erts_allctrs));
470
for (i = ERTS_ALC_A_MIN; i <= ERTS_ALC_A_MAX; i++) {
471
erts_allctrs[i].alloc = mtrace_alloc;
472
erts_allctrs[i].realloc = mtrace_realloc;
473
erts_allctrs[i].free = mtrace_free;
474
erts_allctrs[i].extra = (void *) &real_allctrs[i];
479
mutex = erts_mutex_sys(ERTS_MUTEX_SYS_MTRACE);
480
if(!mutex || erts_mutex_set_default_atfork(mutex))
481
erl_exit(1, "Failed to initialize mtrace mutex\n");
586
erts_mtx_init(&mtrace_buf_mutex, "mtrace_buf");
587
erts_mtx_set_forksafe(&mtrace_buf_mutex);
588
erts_mtx_init(&mtrace_op_mutex, "mtrace_op");
589
erts_mtx_set_forksafe(&mtrace_op_mutex);
484
591
socket_desc = erts_sock_open();
485
592
if (socket_desc == ERTS_SOCK_INVALID_SOCKET) {
506
613
erts_sock_errno());
509
sys_gettimeofday(&last_tv);
510
616
tracep = trace_buffer;
511
617
endp = trace_buffer + TRACE_BUF_SZ;
512
write_trace_header();
618
if (erts_sock_gethostname(hostname, MAXHOSTNAMELEN) != 0)
620
hostname[MAXHOSTNAMELEN-1] = '\0';
622
write_trace_header(nodename ? nodename : "", pid, hostname);
623
erts_mtrace_update_heap_size();
628
erts_mtrace_install_wrapper_functions(void)
630
if (erts_mtrace_enabled) {
632
/* Install trace functions */
633
ASSERT(sizeof(erts_allctrs) == sizeof(real_allctrs));
635
sys_memcpy((void *) real_allctrs,
636
(void *) erts_allctrs,
637
sizeof(erts_allctrs));
639
for (i = ERTS_ALC_A_MIN; i <= ERTS_ALC_A_MAX; i++) {
640
erts_allctrs[i].alloc = mtrace_alloc;
641
erts_allctrs[i].realloc = mtrace_realloc;
642
erts_allctrs[i].free = mtrace_free;
643
erts_allctrs[i].extra = (void *) &real_allctrs[i];
517
649
erts_mtrace_stop(void)
651
erts_mtx_lock(&mtrace_op_mutex);
652
erts_mtx_lock(&mtrace_buf_mutex);
520
653
if (erts_mtrace_enabled) {
521
654
Uint32 ti = get_time_inc();
523
if (ti != INVALID_TIME_INC && MAKE_TBUF_SZ(UI16_SZ + UI32_SZ)) {
656
if (ti != INVALID_TIME_INC
657
&& MAKE_TBUF_SZ(UI8_SZ + UI16_SZ + UI32_SZ)) {
662
*(tracep++) = ERTS_MT_STOP_BDY_TAG;
720
erts_mtx_unlock(&mtrace_buf_mutex);
721
erts_mtx_unlock(&mtrace_op_mutex);
589
mtrace_alloc(ErtsAlcType_t n, void *extra, Uint size)
724
static ERTS_INLINE void
725
write_alloc_entry(byte tag,
591
ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra;
597
res = (*real_af->alloc)(n, real_af->extra, size);
731
erts_mtx_lock(&mtrace_buf_mutex);
599
732
if (erts_mtrace_enabled) {
600
Uint16 t_no = (Uint16) n;
733
Uint32 ti = get_time_inc();
603
735
if (ti != INVALID_TIME_INC
604
&& MAKE_TBUF_SZ(UI8_SZ + UI16_SZ + 2*UI_SZ + UI32_SZ)) {
736
&& MAKE_TBUF_SZ(UI8_SZ + 2*UI16_SZ + 2*UI_SZ + UI32_SZ)) {
737
Uint16 hdr, t_no = (Uint16) x, ct_no = (Uint16) y;
607
int t_no_n, res_n, size_n, ti_n;
739
int t_no_n, ct_no_n = 0, res_n, size_n, ti_n;
746
if (tag == ERTS_MT_CRR_ALLOC_BDY_TAG) {
747
PUT_VSZ_UI16(tracep, ct_no_n, ct_no);
612
749
PUT_VSZ_UI16(tracep, t_no_n, t_no);
613
750
PUT_VSZ_UI( tracep, res_n, res);
614
751
PUT_VSZ_UI( tracep, size_n, size);
795
erts_mtx_unlock(&mtrace_buf_mutex);
662
mtrace_realloc(ErtsAlcType_t n, void *extra, void *ptr, Uint size)
799
static ERTS_INLINE void
800
write_realloc_entry(byte tag,
664
ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra;
670
res = (*real_af->realloc)(n, real_af->extra, ptr, size);
807
erts_mtx_lock(&mtrace_buf_mutex);
672
808
if (erts_mtrace_enabled) {
674
int no_previous_block;
678
no_previous_block = (ptr == NULL);
679
moved = (!no_previous_block && res != ptr);
809
Uint32 ti = get_time_inc();
681
811
if (ti != INVALID_TIME_INC
682
&& MAKE_TBUF_SZ(2*UI16_SZ + (moved ? 3 : 2)*UI_SZ + UI32_SZ)) {
812
&& MAKE_TBUF_SZ(UI8_SZ + 2*UI16_SZ + 3*UI_SZ + UI32_SZ)) {
813
Uint16 hdr, t_no = (Uint16) x, ct_no = (Uint16) y;
685
int t_no_n, res_n, ptr_n, size_n, ti_n;
815
int t_no_n, ct_no_n = 0, res_n, ptr_n, size_n, ti_n;
690
if (no_previous_block) {
692
PUT_VSZ_UI16(tracep, t_no_n, t_no);
822
if (tag == ERTS_MT_CRR_REALLOC_BDY_TAG) {
823
PUT_VSZ_UI16(tracep, ct_no_n, ct_no);
825
PUT_VSZ_UI16(tracep, t_no_n, t_no);
698
826
PUT_VSZ_UI( tracep, res_n, res);
700
PUT_VSZ_UI( tracep, ptr_n, ptr);
827
PUT_VSZ_UI( tracep, ptr_n, ptr);
703
828
PUT_VSZ_UI( tracep, size_n, size);
704
829
PUT_VSZ_UI32(tracep, ti_n, ti);
708
833
hdr <<= UI_MSB_EHF_SZ;
712
hdr <<= UI_MSB_EHF_SZ;
836
hdr <<= UI_MSB_EHF_SZ;
716
839
hdr <<= UI_MSB_EHF_SZ;
719
if (no_previous_block) {
842
hdr <<= UI16_MSB_EHF_SZ;
845
if (tag == ERTS_MT_CRR_REALLOC_BDY_TAG) {
720
846
hdr <<= UI16_MSB_EHF_SZ;
725
if (no_previous_block)
726
hdr |= ERTS_MT_REALLOC_NPB_TAG;
728
hdr |= ERTS_MT_REALLOC_MV_TAG;
730
hdr |= ERTS_MT_REALLOC_NMV_TAG;
732
850
WRITE_UI16(hdrp, hdr);
734
852
#if TRACE_PRINTOUTS
737
"{realloc_mv, {%u, %u, %u, %u}, {%u, %u, %u, %u, %u}}\n",
739
(unsigned) t_no, (unsigned) res,
740
(unsigned) ptr, (unsigned) size,
742
MSB2BITS(t_no_n), MSB2BITS(res_n),
743
MSB2BITS(ptr_n), MSB2BITS(size_n),
747
"{realloc_nmv, {%u, %u, %u}, {%u, %u, %u, %u}}\n",
749
(unsigned) t_no, (unsigned) ptr, (unsigned) size,
751
MSB2BITS(t_no_n), MSB2BITS(ptr_n),
752
MSB2BITS(size_n), MSB2BITS(ti_n));
853
print_trace_entry(tag,
758
check_realloc_entry(hdrp, tracep, no_previous_block, moved,
863
check_realloc_entry(hdrp-1, tracep,
760
867
(Uint) res, res_n,
761
868
(Uint) ptr, ptr_n,
875
erts_mtx_unlock(&mtrace_buf_mutex);
776
mtrace_free(ErtsAlcType_t n, void *extra, void *ptr)
878
static ERTS_INLINE void
879
write_free_entry(byte tag,
778
ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra;
783
(*real_af->free)(n, real_af->extra, ptr);
884
erts_mtx_lock(&mtrace_buf_mutex);
785
885
if (erts_mtrace_enabled) {
886
Uint32 ti = get_time_inc();
788
888
if (ti != INVALID_TIME_INC
789
&& MAKE_TBUF_SZ(2*UI16_SZ + UI_SZ + UI32_SZ)) {
889
&& MAKE_TBUF_SZ(UI8_SZ + 2*UI16_SZ + UI_SZ + UI32_SZ)) {
890
Uint16 hdr, t_no = (Uint16) x, ct_no = (Uint16) y;
892
int t_no_n, ct_no_n = 0, ptr_n, ti_n;
899
if (tag == ERTS_MT_CRR_FREE_BDY_TAG) {
900
PUT_VSZ_UI16(tracep, ct_no_n, ct_no);
902
PUT_VSZ_UI16(tracep, t_no_n, t_no);
797
903
PUT_VSZ_UI( tracep, ptr_n, ptr);
798
904
PUT_VSZ_UI32(tracep, ti_n, ti);
802
908
hdr <<= UI_MSB_EHF_SZ;
806
hdr |= ERTS_MT_FREE_TAG;
911
hdr <<= UI16_MSB_EHF_SZ;
914
if (tag == ERTS_MT_CRR_FREE_BDY_TAG) {
915
hdr <<= UI16_MSB_EHF_SZ;
808
919
WRITE_UI16(hdrp, hdr);
811
921
#if TRACE_PRINTOUTS
813
"{free, {%u}, {%u, %u}}\n",
814
(unsigned) ptr, MSB2BITS(ptr_n), MSB2BITS(ti_n));
922
print_trace_entry(tag,
820
check_free_entry(hdrp, tracep,
932
check_free_entry(hdrp-1, tracep,
821
936
(Uint) ptr, ptr_n,
942
erts_mtx_unlock(&mtrace_buf_mutex);
946
mtrace_alloc(ErtsAlcType_t n, void *extra, Uint size)
948
ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra;
951
erts_mtx_lock(&mtrace_op_mutex);
953
res = (*real_af->alloc)(n, real_af->extra, size);
954
write_alloc_entry(ERTS_MT_ALLOC_BDY_TAG, res, n, 0, size);
956
erts_mtx_unlock(&mtrace_op_mutex);
962
mtrace_realloc(ErtsAlcType_t n, void *extra, void *ptr, Uint size)
964
ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra;
967
erts_mtx_lock(&mtrace_op_mutex);
969
res = (*real_af->realloc)(n, real_af->extra, ptr, size);
970
write_realloc_entry(ERTS_MT_REALLOC_BDY_TAG, res, n, 0, ptr, size);
972
erts_mtx_unlock(&mtrace_op_mutex);
979
mtrace_free(ErtsAlcType_t n, void *extra, void *ptr)
981
ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra;
983
erts_mtx_lock(&mtrace_op_mutex);
985
(*real_af->free)(n, real_af->extra, ptr);
986
write_free_entry(ERTS_MT_FREE_BDY_TAG, n, 0, ptr);
988
erts_mtx_unlock(&mtrace_op_mutex);
993
erts_mtrace_crr_alloc(void *res, ErtsAlcType_t n, ErtsAlcType_t m, Uint size)
995
write_alloc_entry(ERTS_MT_CRR_ALLOC_BDY_TAG, res, n, m, size);
999
erts_mtrace_crr_realloc(void *res, ErtsAlcType_t n, ErtsAlcType_t m, void *ptr,
1002
write_realloc_entry(ERTS_MT_CRR_REALLOC_BDY_TAG, res, n, m, ptr, size);
1006
erts_mtrace_crr_free(ErtsAlcType_t n, ErtsAlcType_t m, void *ptr)
1008
write_free_entry(ERTS_MT_CRR_FREE_BDY_TAG, n, m, ptr);
1014
print_trace_entry(byte tag,
1015
Uint16 t_no, int t_no_n,
1016
Uint16 ct_no, int ct_no_n,
1017
Uint res, int res_n,
1018
Uint ptr, int ptr_n,
1019
Uint size, int size_n,
1023
case ERTS_MT_ALLOC_BDY_TAG:
1025
"{alloc, {%lu, %lu, %lu}, {%u, %u, %u, %u}}\n\r",
1027
(unsigned long) t_no, (unsigned long) res,
1028
(unsigned long) size,
1030
MSB2BITS(t_no_n), MSB2BITS(res_n),
1031
MSB2BITS(size_n), MSB2BITS(ti_n));
1033
case ERTS_MT_REALLOC_BDY_TAG:
1035
"{realloc, {%lu, %lu, %lu, %lu}, {%u, %u, %u, %u, %u}}\n\r",
1037
(unsigned long) t_no, (unsigned long) res,
1038
(unsigned long) ptr, (unsigned long) size,
1040
MSB2BITS(t_no_n), MSB2BITS(res_n),
1041
MSB2BITS(ptr_n), MSB2BITS(size_n), MSB2BITS(ti_n));
1043
case ERTS_MT_FREE_BDY_TAG:
1045
"{free, {%lu, %lu}, {%u, %u, %u, %u, %u}}\n\r",
1047
(unsigned long) t_no, (unsigned long) ptr,
1049
MSB2BITS(t_no_n), MSB2BITS(ptr_n), MSB2BITS(ti_n));
1051
case ERTS_MT_CRR_ALLOC_BDY_TAG:
1053
"{crr_alloc, {%lu, %lu, %lu, %lu}, {%u, %u, %u, %u, %u}}\n\r",
1055
(unsigned long) ct_no, (unsigned long) t_no,
1056
(unsigned long) res, (unsigned long) size,
1058
MSB2BITS(ct_no_n), MSB2BITS(t_no_n),
1059
MSB2BITS(res_n), MSB2BITS(size_n),
1062
case ERTS_MT_CRR_REALLOC_BDY_TAG:
1064
"{crr_realloc, {%lu, %lu, %lu, %lu, %lu}, "
1065
"{%u, %u, %u, %u, %u, %u}}\n\r",
1067
(unsigned long) ct_no, (unsigned long) t_no,
1068
(unsigned long) res, (unsigned long) ptr,
1069
(unsigned long) size,
1071
MSB2BITS(ct_no_n), MSB2BITS(t_no_n),
1072
MSB2BITS(res_n), MSB2BITS(ptr_n),
1073
MSB2BITS(size_n), MSB2BITS(ti_n));
1075
case ERTS_MT_CRR_FREE_BDY_TAG:
1077
"{crr_free, {%lu, %lu, %lu}, {%u, %u, %u, %u}}\n\r",
1079
(unsigned long) ct_no, (unsigned long) t_no,
1080
(unsigned long) ptr,
1082
MSB2BITS(ct_no_n), MSB2BITS(t_no_n),
1083
MSB2BITS(ptr_n), MSB2BITS(ti_n));
1086
fprintf(stderr, "{'\?\?\?'}\n\r");
1091
#endif /* #if TRACE_PRINTOUTS */
906
ASSERT((ERTS_MT_REALLOC_MV_TAG & ~TAG_EHF_MSK) == 0);
907
ASSERT((ERTS_MT_REALLOC_NMV_TAG & ~TAG_EHF_MSK) == 0);
909
1176
hdr = GET_UI16(p);
910
if (no_previous_block) {
911
ASSERT((hdr & TAG_EHF_MSK) == ERTS_MT_REALLOC_NPB_TAG);
914
ASSERT((hdr & TAG_EHF_MSK) == ERTS_MT_REALLOC_MV_TAG);
917
ASSERT((hdr & TAG_EHF_MSK) == ERTS_MT_REALLOC_NMV_TAG);
921
if (no_previous_block)
922
check_ui(&hdr, &p, t_no, t_no_n, UI16_MSB_EHF_MSK, UI16_MSB_EHF_SZ);
1178
if (tag == ERTS_MT_CRR_REALLOC_BDY_TAG)
1179
check_ui(&hdr, &p, ct_no, ct_no_n, UI16_MSB_EHF_MSK, UI16_MSB_EHF_SZ);
1180
check_ui(&hdr, &p, t_no, t_no_n, UI16_MSB_EHF_MSK, UI16_MSB_EHF_SZ);
923
1181
check_ui(&hdr, &p, res, res_n, UI_MSB_EHF_MSK, UI_MSB_EHF_SZ);
925
check_ui(&hdr, &p, ptr, ptr_n, UI_MSB_EHF_MSK, UI_MSB_EHF_SZ);
1182
check_ui(&hdr, &p, ptr, ptr_n, UI_MSB_EHF_MSK, UI_MSB_EHF_SZ);
926
1183
check_ui(&hdr, &p, size, size_n, UI_MSB_EHF_MSK, UI_MSB_EHF_SZ);
927
1184
check_ui(&hdr, &p, ti, ti_n, UI32_MSB_EHF_MSK, UI32_MSB_EHF_SZ);