diff options
Diffstat (limited to 'erts/emulator/beam/erl_trace.c')
| -rw-r--r-- | erts/emulator/beam/erl_trace.c | 162 | 
1 files changed, 56 insertions, 106 deletions
diff --git a/erts/emulator/beam/erl_trace.c b/erts/emulator/beam/erl_trace.c index 114853cac4..41876b8c62 100644 --- a/erts/emulator/beam/erl_trace.c +++ b/erts/emulator/beam/erl_trace.c @@ -373,15 +373,10 @@ void erts_init_trace(void) {  static Eterm system_seq_tracer; -#ifdef ERTS_SMP  #define ERTS_ALLOC_SYSMSG_HEAP(SZ, BPP, OHPP, UNUSED) \    (*(BPP) = new_message_buffer((SZ)), \     *(OHPP) = &(*(BPP))->off_heap, \     (*(BPP))->mem) -#else -#define ERTS_ALLOC_SYSMSG_HEAP(SZ, BPP, OHPP, RPP) \ -  erts_alloc_message_heap((SZ), (BPP), (OHPP), (RPP), 0) -#endif  #ifdef ERTS_SMP  #define ERTS_ENQ_TRACE_MSG(FPID, TPID, MSG, BP) \ @@ -390,8 +385,12 @@ do { \      enqueue_sys_msg_unlocked(SYS_MSG_TYPE_TRACE, (FPID), (TPID), (MSG), (BP)); \  } while(0)  #else -#define ERTS_ENQ_TRACE_MSG(FPID, TPROC, MSG, BP) \ -    erts_queue_message((TPROC), NULL, (BP), (MSG), NIL) +#define ERTS_ENQ_TRACE_MSG(FPID, TPROC, MSG, BP)		\ +    do {							\ +	ErtsMessage *mp__ = erts_alloc_message(0, NULL);		\ +	mp__->data.heap_frag = (BP);				\ +	erts_queue_message((TPROC), NULL, mp__, (MSG), NIL);	\ +    } while (0)  #endif  /* @@ -826,11 +825,9 @@ send_to_port(Process *c_p, Eterm message,  static void   profile_send(Eterm from, Eterm message) {      Uint sz = 0; -    ErlHeapFragment *bp = NULL;      Uint *hp = NULL;      Eterm msg = NIL;      Process *profile_p = NULL; -    ErlOffHeap *off_heap = NULL;      Eterm profiler = erts_get_system_profile(); @@ -856,6 +853,7 @@ profile_send(Eterm from, Eterm message) {  	}      } else { +	ErtsMessage *mp;  	ASSERT(is_internal_pid(profiler));  	profile_p = erts_proc_lookup(profiler); @@ -864,10 +862,13 @@ profile_send(Eterm from, Eterm message) {  	    return;  	sz = size_object(message); -	hp = erts_alloc_message_heap(sz, &bp, &off_heap, profile_p, 0); -	msg = copy_struct(message, sz, &hp, &bp->off_heap); -	 -        erts_queue_message(profile_p, NULL, bp, msg, NIL); +	mp = erts_alloc_message(sz, &hp); +	if (sz == 0) +	    msg = message; +	else +	    msg = copy_struct(message, sz, &hp, &mp->hfrag.off_heap); + +        erts_queue_message(profile_p, NULL, mp, msg, NIL);      }  } @@ -1235,11 +1236,7 @@ seq_trace_update_send(Process *p)  {      Eterm seq_tracer = erts_get_system_seq_tracer();      ASSERT((is_tuple(SEQ_TRACE_TOKEN(p)) || is_nil(SEQ_TRACE_TOKEN(p)))); -    if ( (p->common.id == seq_tracer) || (SEQ_TRACE_TOKEN(p) == NIL) -#ifdef USE_VM_PROBES -	 || (SEQ_TRACE_TOKEN(p) == am_have_dt_utag) -#endif -	 ) { +    if ((p->common.id == seq_tracer) || have_no_seqtrace(SEQ_TRACE_TOKEN(p))) {  	return 0;      }      SEQ_TRACE_TOKEN_SENDER(p) = p->common.id; @@ -1431,7 +1428,11 @@ seq_trace_output_generic(Eterm token, Eterm msg, Uint type,  	erts_smp_mtx_unlock(&smq_mtx);  #else          /* trace_token must be NIL here */ -	erts_queue_message(tracer, NULL, bp, mess, NIL); +	{ +	    ErtsMessage *mp = erts_alloc_message(0, NULL); +	    mp->data.heap_frag = bp; +	    erts_queue_message(tracer, NULL, mp, mess, NIL); +	}  #endif      }  } @@ -1851,12 +1852,7 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,      ts_type = ERTS_TFLGS2TSTYPE(*tracee_flags);      if (is_internal_port(*tracer_pid)) { -#if HEAP_ON_C_STACK -	Eterm local_heap[60+ERTS_TRACE_PATCH_TS_MAX_SIZE+MAX_ARG]; -#else -	Eterm *local_heap = erts_alloc(ERTS_ALC_T_TEMP_TERM, -				       sizeof(Eterm)*(60+ERTS_TRACE_PATCH_TS_MAX_SIZE+MAX_ARG)); -#endif +	Eterm local_heap[64+ERTS_TRACE_PATCH_TS_MAX_SIZE+MAX_ARG];  	hp = local_heap;  	if (!erts_is_valid_tracer_port(*tracer_pid)) { @@ -1871,9 +1867,6 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,  	    if (is_not_nil(tracee))  		erts_smp_proc_unlock(p, ERTS_PROC_LOCKS_ALL_MINOR);  #endif -#if !HEAP_ON_C_STACK -	    erts_free(ERTS_ALC_T_TEMP_TERM,local_heap); -#endif  	    UnUseTmpHeap(ERL_SUB_BIN_SIZE,p);  	    return 0;  	} @@ -1901,9 +1894,6 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,  					    ERTS_PAM_TMP_RESULT, &return_flags);  	    if (is_non_value(pam_result)) {  		erts_match_set_release_result(p); -#if !HEAP_ON_C_STACK -		erts_free(ERTS_ALC_T_TEMP_TERM,local_heap); -#endif  		UnUseTmpHeap(ERL_SUB_BIN_SIZE,p);  		return 0;  	    } @@ -1912,9 +1902,6 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,  	    /* Meta trace */  	    if (pam_result == am_false) {  		erts_match_set_release_result(p); -#if !HEAP_ON_C_STACK -		erts_free(ERTS_ALC_T_TEMP_TERM,local_heap); -#endif  		UnUseTmpHeap(ERL_SUB_BIN_SIZE,p);  		return return_flags;  	    } @@ -1922,17 +1909,11 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,  	    /* Non-meta trace */  	    if (*tracee_flags & F_TRACE_SILENT) {   		erts_match_set_release_result(p); -#if !HEAP_ON_C_STACK -		erts_free(ERTS_ALC_T_TEMP_TERM,local_heap); -#endif  		UnUseTmpHeap(ERL_SUB_BIN_SIZE,p);  		return 0;  	    }  	    if (pam_result == am_false) {  		erts_match_set_release_result(p); -#if !HEAP_ON_C_STACK -		erts_free(ERTS_ALC_T_TEMP_TERM,local_heap); -#endif  		UnUseTmpHeap(ERL_SUB_BIN_SIZE,p);  		return return_flags;  	    } @@ -1974,9 +1955,6 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,  	send_to_port(p, mess, tracer_pid, tracee_flags);  	erts_smp_mtx_unlock(&smq_mtx);  	erts_match_set_release_result(p); -#if !HEAP_ON_C_STACK -	erts_free(ERTS_ALC_T_TEMP_TERM,local_heap); -#endif  	UnUseTmpHeap(ERL_SUB_BIN_SIZE,p);  	return *tracer_pid == NIL ? 0 : return_flags; @@ -2314,11 +2292,6 @@ void save_calls(Process *p, Export *e)  void  trace_gc(Process *p, Eterm what)  { -    ERTS_DECL_AM(bin_vheap_size); -    ERTS_DECL_AM(bin_vheap_block_size); -    ERTS_DECL_AM(bin_old_vheap_size); -    ERTS_DECL_AM(bin_old_vheap_block_size); -      ErlHeapFragment *bp = NULL;      ErlOffHeap *off_heap;      ERTS_TRACER_REF_TYPE tracer_ref = ERTS_NULL_TRACER_REF;	/* Initialized @@ -2329,52 +2302,19 @@ trace_gc(Process *p, Eterm what)      Eterm msg = NIL;      Uint size; -    Eterm tags[] = { -	am_old_heap_block_size, -	am_heap_block_size, -	am_mbuf_size, -	am_recent_size, -	am_stack_size, -	am_old_heap_size, -	am_heap_size, -	AM_bin_vheap_size, -	AM_bin_vheap_block_size, -	AM_bin_old_vheap_size, -	AM_bin_old_vheap_block_size -    }; - -    UWord values[] = { -	OLD_HEAP(p) ? OLD_HEND(p) - OLD_HEAP(p) : 0, -	HEAP_SIZE(p), -	MBUF_SIZE(p), -	HIGH_WATER(p) - HEAP_START(p), -	STACK_START(p) - p->stop, -	OLD_HEAP(p) ? OLD_HTOP(p) - OLD_HEAP(p) : 0, -	HEAP_TOP(p) - HEAP_START(p), -	MSO(p).overhead, -	BIN_VHEAP_SZ(p), -	BIN_OLD_VHEAP(p), -	BIN_OLD_VHEAP_SZ(p) -    };  #define LOCAL_HEAP_SIZE						\ -    (sizeof(values)/sizeof(*values)) *				\ -	(2/*cons*/ + 3/*2-tuple*/ + BIG_UINT_HEAP_SIZE) +	\ +    (ERTS_PROCESS_GC_INFO_MAX_SIZE) +                           \  	5/*4-tuple */ + ERTS_TRACE_PATCH_TS_MAX_SIZE      DeclareTmpHeap(local_heap,LOCAL_HEAP_SIZE,p); -    ERTS_CT_ASSERT(sizeof(values)/sizeof(*values) == sizeof(tags)/sizeof(Eterm)); -      UseTmpHeap(LOCAL_HEAP_SIZE,p);      if (is_internal_port(ERTS_TRACER_PROC(p))) {  	hp = local_heap;  #ifdef DEBUG  	size = 0; -	(void) erts_bld_atom_uword_2tup_list(NULL, -					    &size, -					    sizeof(values)/sizeof(*values), -					    tags, -					    values); +        (void) erts_process_gc_info(p, &size, NULL); +  	size += 5/*4-tuple*/ + PATCH_TS_SIZE(p);  #endif      } else { @@ -2385,11 +2325,8 @@ trace_gc(Process *p, Eterm what)  			    ERTS_TRACE_FLAGS(p));  	size = 0; -	(void) erts_bld_atom_uword_2tup_list(NULL, -					    &size, -					    sizeof(values)/sizeof(*values), -					    tags, -					    values); +        (void) erts_process_gc_info(p, &size, NULL); +  	size += 5/*4-tuple*/ + PATCH_TS_SIZE(p);  	hp = ERTS_ALLOC_SYSMSG_HEAP(size, &bp, &off_heap, tracer_ref); @@ -2397,11 +2334,7 @@ trace_gc(Process *p, Eterm what)      ASSERT(size <= LOCAL_HEAP_SIZE); -    msg = erts_bld_atom_uword_2tup_list(&hp, -				       NULL, -				       sizeof(values)/sizeof(*values), -				       tags, -				       values); +    msg = erts_process_gc_info(p, NULL, &hp);      msg = TUPLE4(hp, am_trace, p->common.id, what, msg);      hp += 5; @@ -2477,7 +2410,11 @@ monitor_long_schedule_proc(Process *p, BeamInstr *in_fp, BeamInstr *out_fp, Uint  #ifdef ERTS_SMP      enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp);  #else -    erts_queue_message(monitor_p, NULL, bp, msg, NIL); +    { +	ErtsMessage *mp = erts_alloc_message(0, NULL); +	mp->data.heap_frag = bp; +	erts_queue_message(monitor_p, NULL, mp, msg, NIL); +    }  #endif  }  void  @@ -2538,7 +2475,11 @@ monitor_long_schedule_port(Port *pp, ErtsPortTaskType type, Uint time)  #ifdef ERTS_SMP      enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, pp->common.id, NIL, msg, bp);  #else -    erts_queue_message(monitor_p, NULL, bp, msg, NIL); +    { +	ErtsMessage *mp = erts_alloc_message(0, NULL); +	mp->data.heap_frag = bp; +	erts_queue_message(monitor_p, NULL, mp, msg, NIL); +    }  #endif  } @@ -2609,7 +2550,11 @@ monitor_long_gc(Process *p, Uint time) {  #ifdef ERTS_SMP      enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp);  #else -    erts_queue_message(monitor_p, NULL, bp, msg, NIL); +    { +	ErtsMessage *mp = erts_alloc_message(0, NULL); +	mp->data.heap_frag = bp; +	erts_queue_message(monitor_p, NULL, mp, msg, NIL); +    }  #endif  } @@ -2680,7 +2625,11 @@ monitor_large_heap(Process *p) {  #ifdef ERTS_SMP      enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp);  #else -    erts_queue_message(monitor_p, NULL, bp, msg, NIL); +    { +	ErtsMessage *mp = erts_alloc_message(0, NULL); +	mp->data.heap_frag = bp; +	erts_queue_message(monitor_p, NULL, mp, msg, NIL); +    }  #endif  } @@ -2708,7 +2657,11 @@ monitor_generic(Process *p, Eterm type, Eterm spec) {  #ifdef ERTS_SMP      enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp);  #else -    erts_queue_message(monitor_p, NULL, bp, msg, NIL); +    { +	ErtsMessage *mp = erts_alloc_message(0, NULL); +	mp->data.heap_frag = bp; +	erts_queue_message(monitor_p, NULL, mp, msg, NIL); +    }  #endif  } @@ -3436,8 +3389,6 @@ sys_msg_dispatcher_func(void *unused)  	    if (erts_thr_progress_update(NULL))  		erts_thr_progress_leader_update(NULL); -	    ERTS_SCHED_FAIR_YIELD(); -  #ifdef DEBUG_PRINTOUTS  	    print_msg_type(smqp);  #endif @@ -3496,8 +3447,11 @@ sys_msg_dispatcher_func(void *unused)  		    goto failure;  		}  		else { +		    ErtsMessage *mp;  		queue_proc_msg: -		    erts_queue_message(proc,&proc_locks,smqp->bp,smqp->msg,NIL); +		    mp = erts_alloc_message(0, NULL); +		    mp->data.heap_frag = smqp->bp; +		    erts_queue_message(proc,&proc_locks,mp,smqp->msg,NIL);  #ifdef DEBUG_PRINTOUTS  		    erts_fprintf(stderr, "delivered\n");  #endif @@ -3592,9 +3546,6 @@ static void  init_sys_msg_dispatcher(void)  {      erts_smp_thr_opts_t thr_opts = ERTS_SMP_THR_OPTS_DEFAULT_INITER; -#ifdef __OSE__ -    thr_opts.coreNo   = 0; -#endif      thr_opts.detached = 1;      thr_opts.name = "sys_msg_dispatcher";      init_smq_element_alloc(); @@ -3602,7 +3553,6 @@ init_sys_msg_dispatcher(void)      sys_message_queue_end = NULL;      erts_smp_cnd_init(&smq_cnd);      erts_smp_mtx_init(&smq_mtx, "sys_msg_q"); -      erts_smp_thr_create(&sys_msg_dispatcher_tid,  			sys_msg_dispatcher_func,  			NULL,  | 
