mirror of
https://github.com/eclipse/mosquitto.git
synced 2025-05-09 01:01:11 +08:00
Integrate debugging only xtreport code.
This commit is contained in:
parent
2755fe3c4c
commit
95c098a807
@ -114,6 +114,10 @@ WITH_CONTROL:=yes
|
||||
# Build the broker with the jemalloc allocator
|
||||
WITH_JEMALLOC:=no
|
||||
|
||||
# Build with xtreport capability. This is for debugging purposes and is
|
||||
# probably of no particular interest to end users.
|
||||
WITH_XTREPORT=no
|
||||
|
||||
# =============================================================================
|
||||
# End of user configuration
|
||||
# =============================================================================
|
||||
@ -365,6 +369,10 @@ ifeq ($(WITH_CJSON),yes)
|
||||
CLIENT_STATIC_LDADD:=$(CLIENT_STATIC_LDADD) -lcjson
|
||||
endif
|
||||
|
||||
ifeq ($(WITH_XTREPORT),yes)
|
||||
BROKER_CFLAGS:=$(BROKER_CFLAGS) -DWITH_XTREPORT
|
||||
endif
|
||||
|
||||
BROKER_LDADD:=${BROKER_LDADD} ${LDADD}
|
||||
CLIENT_LDADD:=${CLIENT_LDADD} ${LDADD}
|
||||
PASSWD_LDADD:=${PASSWD_LDADD} ${LDADD}
|
||||
|
@ -77,7 +77,8 @@ OBJS= mosquitto.o \
|
||||
util_topic.o \
|
||||
websockets.o \
|
||||
will_delay.o \
|
||||
will_mosq.o
|
||||
will_mosq.o \
|
||||
xtreport.o
|
||||
|
||||
mosquitto : ${OBJS}
|
||||
${CROSS_COMPILE}${CC} ${BROKER_LDFLAGS} $^ -o $@ $(BROKER_LDADD)
|
||||
@ -304,6 +305,9 @@ will_delay.o : will_delay.c mosquitto_broker_internal.h
|
||||
will_mosq.o : ../lib/will_mosq.c ../lib/will_mosq.h
|
||||
${CROSS_COMPILE}${CC} $(BROKER_CPPFLAGS) $(BROKER_CFLAGS) -c $< -o $@
|
||||
|
||||
xtreport.o : xtreport.c
|
||||
${CROSS_COMPILE}${CC} $(BROKER_CPPFLAGS) $(BROKER_CFLAGS) -c $< -o $@
|
||||
|
||||
plugin_defer.so : plugin_defer.c ../include/mosquitto_plugin.h ../include/mosquitto_broker.h mosquitto_broker_internal.h
|
||||
${CROSS_COMPILE}${CC} -I. -I../lib -fPIC -shared $< -o $@
|
||||
|
||||
|
@ -210,6 +210,9 @@ int mosquitto_main_loop(struct mosquitto__listener_sock *listensock, int listens
|
||||
if(flag_tree_print){
|
||||
sub__tree_print(db.subs, 0);
|
||||
flag_tree_print = false;
|
||||
#ifdef WITH_XTREPORT
|
||||
xtreport();
|
||||
#endif
|
||||
}
|
||||
#ifdef WITH_WEBSOCKETS
|
||||
for(i=0; i<db.config->listener_count; i++){
|
||||
|
@ -919,5 +919,13 @@ void will_delay__check(void);
|
||||
void will_delay__send_all(void);
|
||||
void will_delay__remove(struct mosquitto *mosq);
|
||||
|
||||
|
||||
/* ============================================================
|
||||
* Other
|
||||
* ============================================================ */
|
||||
#ifdef WITH_XTREPORT
|
||||
void xtreport(void);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
123
src/xtreport.c
Normal file
123
src/xtreport.c
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
Copyright (c) 2020 Roger Light <roger@atchoo.org>
|
||||
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are made available under the terms of the Eclipse Public License v1.0
|
||||
and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
|
||||
The Eclipse Public License is available at
|
||||
http://www.eclipse.org/legal/epl-v10.html
|
||||
and the Eclipse Distribution License is available at
|
||||
http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
|
||||
Contributors:
|
||||
Roger Light - initial implementation and documentation.
|
||||
*/
|
||||
|
||||
#ifdef WITH_XTREPORT
|
||||
|
||||
/* This file allows reporting of internal parameters to a kcachegrind
|
||||
* compatible output file. It is for debugging purposes only and is most likely
|
||||
* of no interest to end users.
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <uthash.h>
|
||||
|
||||
#include "mosquitto_broker_internal.h"
|
||||
#include "mosquitto_internal.h"
|
||||
#include "net_mosq.h"
|
||||
|
||||
|
||||
static void client_cost(FILE *fptr, struct mosquitto *context, int fn_index)
|
||||
{
|
||||
size_t pkt_count, pkt_bytes;
|
||||
size_t cmsg_count, cmsg_bytes;
|
||||
struct mosquitto__packet *pkt_tmp;
|
||||
size_t tBytes;
|
||||
|
||||
pkt_count = 1;
|
||||
pkt_bytes = context->in_packet.packet_length;
|
||||
if(context->current_out_packet){
|
||||
pkt_count++;
|
||||
pkt_bytes += context->current_out_packet->packet_length;
|
||||
}
|
||||
pkt_tmp = context->out_packet;
|
||||
while(pkt_tmp){
|
||||
pkt_count++;
|
||||
pkt_bytes += pkt_tmp->packet_length;
|
||||
pkt_tmp = pkt_tmp->next;
|
||||
}
|
||||
|
||||
cmsg_count = (size_t)context->msgs_in.msg_count;
|
||||
cmsg_bytes = context->msgs_in.msg_bytes;
|
||||
cmsg_count += (size_t)context->msgs_out.msg_count;
|
||||
cmsg_bytes += context->msgs_out.msg_bytes;
|
||||
|
||||
tBytes = pkt_bytes + cmsg_bytes;
|
||||
if(context->id){
|
||||
tBytes += strlen(context->id);
|
||||
}
|
||||
fprintf(fptr, "%d %ld %lu %lu %lu %lu %d\n", fn_index,
|
||||
tBytes,
|
||||
pkt_count, cmsg_count,
|
||||
pkt_bytes, cmsg_bytes,
|
||||
context->sock == INVALID_SOCKET?0:context->sock);
|
||||
}
|
||||
|
||||
|
||||
void xtreport(void)
|
||||
{
|
||||
pid_t pid;
|
||||
char filename[40];
|
||||
FILE *fptr;
|
||||
struct mosquitto *context, *ctxt_tmp;
|
||||
int fn_index = 2;
|
||||
static int iter = 1;
|
||||
|
||||
pid = getpid();
|
||||
snprintf(filename, 40, "/tmp/xtmosquitto.kcg.%d.%d", pid, iter);
|
||||
iter++;
|
||||
fptr = fopen(filename, "wt");
|
||||
if(fptr == NULL) return;
|
||||
|
||||
fprintf(fptr, "# callgrind format\n");
|
||||
fprintf(fptr, "version: 1\n");
|
||||
fprintf(fptr, "creator: mosquitto\n");
|
||||
fprintf(fptr, "pid: %d\n", pid);
|
||||
fprintf(fptr, "cmd: mosquitto\n\n");
|
||||
|
||||
fprintf(fptr, "positions: line\n");
|
||||
fprintf(fptr, "event: tB : total bytes\n");
|
||||
fprintf(fptr, "event: pkt : currently queued packets\n");
|
||||
fprintf(fptr, "event: cmsg : currently pending client messages\n");
|
||||
fprintf(fptr, "event: pktB : currently queued packet bytes\n");
|
||||
fprintf(fptr, "event: cmsgB : currently pending client message bytes\n");
|
||||
fprintf(fptr, "events: tB pkt cmsg pktB cmsgB sock\n");
|
||||
|
||||
fprintf(fptr, "fn=(1) clients\n");
|
||||
fprintf(fptr, "1 0 0 0 0 0 0\n");
|
||||
|
||||
fn_index = 2;
|
||||
HASH_ITER(hh_id, db.contexts_by_id, context, ctxt_tmp){
|
||||
if(context->id){
|
||||
fprintf(fptr, "cfn=(%d) %s\n", fn_index, context->id);
|
||||
}else{
|
||||
fprintf(fptr, "cfn=(%d) unknown\n", fn_index);
|
||||
}
|
||||
fprintf(fptr, "calls=1 %d\n", fn_index);
|
||||
client_cost(fptr, context, fn_index);
|
||||
fn_index++;
|
||||
}
|
||||
|
||||
fn_index = 2;
|
||||
HASH_ITER(hh_id, db.contexts_by_id, context, ctxt_tmp){
|
||||
fprintf(fptr, "fn=(%d)\n", fn_index);
|
||||
client_cost(fptr, context, fn_index);
|
||||
fn_index++;
|
||||
}
|
||||
|
||||
fclose(fptr);
|
||||
}
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user