You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2013/12/04 16:47:31 UTC
svn commit: r1547827 - in /qpid/proton/trunk/proton-c:
include/proton/engine.h src/dispatcher/dispatcher.c
src/dispatcher/dispatcher.h src/engine/engine-internal.h src/sasl/sasl.c
src/transport/transport.c
Author: rhs
Date: Wed Dec 4 15:47:30 2013
New Revision: 1547827
URL: http://svn.apache.org/r1547827
Log:
PROTON-343: added logging callback for proton-c
Modified:
qpid/proton/trunk/proton-c/include/proton/engine.h
qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c
qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h
qpid/proton/trunk/proton-c/src/engine/engine-internal.h
qpid/proton/trunk/proton-c/src/sasl/sasl.c
qpid/proton/trunk/proton-c/src/transport/transport.c
Modified: qpid/proton/trunk/proton-c/include/proton/engine.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/engine.h?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/engine.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/engine.h Wed Dec 4 15:47:30 2013
@@ -120,6 +120,7 @@ typedef int pn_state_t; /**< encodes
#define PN_MODIFIED (0x0000000000000027)
typedef int pn_trace_t;
+typedef void (pn_tracer_t)(pn_transport_t *transport, const char *message);
#define PN_TRACE_OFF (0)
#define PN_TRACE_RAW (1)
@@ -435,6 +436,10 @@ PN_EXTERN int pn_transport_close_head(pn
*/
PN_EXTERN pn_timestamp_t pn_transport_tick(pn_transport_t *transport, pn_timestamp_t now);
PN_EXTERN void pn_transport_trace(pn_transport_t *transport, pn_trace_t trace);
+PN_EXTERN void pn_transport_set_tracer(pn_transport_t *transport, pn_tracer_t *tracer);
+PN_EXTERN pn_tracer_t *pn_transport_get_tracer(pn_transport_t *transport);
+PN_EXTERN void pn_transport_log(pn_transport_t *transport, const char *message);
+PN_EXTERN void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...);
// max frame of zero means "unlimited"
PN_EXTERN uint32_t pn_transport_get_max_frame(pn_transport_t *transport);
PN_EXTERN void pn_transport_set_max_frame(pn_transport_t *transport, uint32_t size);
Modified: qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c Wed Dec 4 15:47:30 2013
@@ -30,12 +30,12 @@
#include "../util.h"
#include "../platform_fmt.h"
-pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, void *context)
+pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, pn_transport_t *transport)
{
pn_dispatcher_t *disp = (pn_dispatcher_t *) calloc(sizeof(pn_dispatcher_t), 1);
disp->frame_type = frame_type;
- disp->context = context;
+ disp->transport = transport;
disp->trace = PN_TRACE_OFF;
disp->input = pn_buffer(1024);
@@ -57,6 +57,8 @@ pn_dispatcher_t *pn_dispatcher(uint8_t f
disp->halt = false;
disp->batch = true;
+ disp->scratch = pn_string(NULL);
+
return disp;
}
@@ -68,6 +70,7 @@ void pn_dispatcher_free(pn_dispatcher_t
pn_data_free(disp->output_args);
pn_buffer_free(disp->frame);
free(disp->output);
+ pn_free(disp->scratch);
free(disp);
}
}
@@ -84,45 +87,35 @@ static void pn_do_trace(pn_dispatcher_t
pn_data_t *args, const char *payload, size_t size)
{
if (disp->trace & PN_TRACE_FRM) {
- size_t n = SCRATCH;
- pn_data_format(args, disp->scratch, &n);
- pn_dispatcher_trace(disp, ch, "%s %s", dir == OUT ? "->" : "<-",
- disp->scratch);
+ pn_string_format(disp->scratch, "%u %s ", ch, dir == OUT ? "->" : "<-");
+ pn_inspect(args, disp->scratch);
+
if (size) {
char buf[1024];
int e = pn_quote_data(buf, 1024, payload, size);
- fprintf(stderr, " (%" PN_ZU ") \"%s\"%s\n", size, buf,
- e == PN_OVERFLOW ? "... (truncated)" : "");
- } else {
- fprintf(stderr, "\n");
+ pn_string_addf(disp->scratch, " (%" PN_ZU ") \"%s\"%s", size, buf,
+ e == PN_OVERFLOW ? "... (truncated)" : "");
}
- }
-}
-void pn_dispatcher_trace(pn_dispatcher_t *disp, uint16_t ch, const char *fmt, ...)
-{
- va_list ap;
- fprintf(stderr, "[%p:%u] ", (void *) disp, ch);
-
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
+ pn_transport_log(disp->transport, pn_string_get(disp->scratch));
+ }
}
int pn_dispatch_frame(pn_dispatcher_t *disp, pn_frame_t frame)
{
if (frame.size == 0) { // ignore null frames
if (disp->trace & PN_TRACE_FRM)
- pn_dispatcher_trace(disp, frame.channel, "<- (EMPTY FRAME)\n");
+ pn_transport_logf(disp->transport, "%u <- (EMPTY FRAME)\n", frame.channel);
return 0;
}
ssize_t dsize = pn_data_decode(disp->args, frame.payload, frame.size);
if (dsize < 0) {
- fprintf(stderr, "Error decoding frame: %s %s\n", pn_code(dsize),
- pn_error_text(pn_data_error(disp->args)));
- pn_fprint_data(stderr, frame.payload, frame.size);
- fprintf(stderr, "\n");
+ pn_string_format(disp->scratch,
+ "Error decoding frame: %s %s\n", pn_code(dsize),
+ pn_error_text(pn_data_error(disp->args)));
+ pn_quote(disp->scratch, frame.payload, frame.size);
+ pn_transport_log(disp->transport, pn_string_get(disp->scratch));
return dsize;
}
@@ -132,11 +125,11 @@ int pn_dispatch_frame(pn_dispatcher_t *d
bool scanned;
int e = pn_data_scan(disp->args, "D?L.", &scanned, &lcode);
if (e) {
- fprintf(stderr, "Scan error\n");
+ pn_transport_log(disp->transport, "Scan error");
return e;
}
if (!scanned) {
- fprintf(stderr, "Error dispatching frame\n");
+ pn_transport_log(disp->transport, "Error dispatching frame");
return PN_ERR;
}
uint8_t code = lcode;
@@ -207,8 +200,9 @@ int pn_post_frame(pn_dispatcher_t *disp,
int err = pn_data_vfill(disp->output_args, fmt, ap);
va_end(ap);
if (err) {
- fprintf(stderr, "error posting frame: %s, %s: %s\n", fmt, pn_code(err),
- pn_error_text(pn_data_error(disp->output_args)));
+ pn_transport_logf(disp->transport,
+ "error posting frame: %s, %s: %s", fmt, pn_code(err),
+ pn_error_text(pn_data_error(disp->output_args)));
return PN_ERR;
}
@@ -225,7 +219,8 @@ int pn_post_frame(pn_dispatcher_t *disp,
pn_buffer_ensure( disp->frame, pn_buffer_available( disp->frame ) * 2 );
goto encode_performatives;
}
- fprintf(stderr, "error posting frame: %s", pn_code(wr));
+ pn_transport_logf(disp->transport,
+ "error posting frame: %s", pn_code(wr));
return PN_ERR;
}
@@ -241,9 +236,10 @@ int pn_post_frame(pn_dispatcher_t *disp,
}
disp->output_frames_ct += 1;
if (disp->trace & PN_TRACE_RAW) {
- fprintf(stderr, "RAW: \"");
- pn_fprint_data(stderr, disp->output + disp->available, n);
- fprintf(stderr, "\"\n");
+ pn_string_set(disp->scratch, "RAW: \"");
+ pn_quote(disp->scratch, disp->output + disp->available, n);
+ pn_string_addf(disp->scratch, "\"");
+ pn_transport_log(disp->transport, pn_string_get(disp->scratch));
}
disp->available += n;
@@ -282,8 +278,9 @@ int pn_post_transfer_frame(pn_dispatcher
message_format,
settled, more_flag);
if (err) {
- fprintf(stderr, "error posting transfer frame: %s: %s\n", pn_code(err),
- pn_error_text(pn_data_error(disp->output_args)));
+ pn_transport_logf(disp->transport,
+ "error posting transfer frame: %s: %s", pn_code(err),
+ pn_error_text(pn_data_error(disp->output_args)));
return PN_ERR;
}
@@ -300,7 +297,7 @@ int pn_post_transfer_frame(pn_dispatcher
pn_buffer_ensure( disp->frame, pn_buffer_available( disp->frame ) * 2 );
goto encode_performatives;
}
- fprintf(stderr, "error posting frame: %s", pn_code(wr));
+ pn_transport_logf(disp->transport, "error posting frame: %s", pn_code(wr));
return PN_ERR;
}
buf.size = wr;
@@ -348,9 +345,10 @@ int pn_post_transfer_frame(pn_dispatcher
disp->output_frames_ct += 1;
framecount++;
if (disp->trace & PN_TRACE_RAW) {
- fprintf(stderr, "RAW: \"");
- pn_fprint_data(stderr, disp->output + disp->available, n);
- fprintf(stderr, "\"\n");
+ pn_string_set(disp->scratch, "RAW: \"");
+ pn_quote(disp->scratch, disp->output + disp->available, n);
+ pn_string_addf(disp->scratch, "\"");
+ pn_transport_log(disp->transport, pn_string_get(disp->scratch));
}
disp->available += n;
} while (disp->output_size > 0 && framecount < frame_limit);
Modified: qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h Wed Dec 4 15:47:30 2013
@@ -55,15 +55,15 @@ struct pn_dispatcher_t {
size_t capacity;
size_t available; /* number of raw bytes pending output */
char *output;
- void *context;
+ pn_transport_t *transport;
bool halt;
bool batch;
uint64_t output_frames_ct;
uint64_t input_frames_ct;
- char scratch[SCRATCH];
+ pn_string_t *scratch;
};
-pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, void *context);
+pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, pn_transport_t *transport);
void pn_dispatcher_free(pn_dispatcher_t *disp);
void pn_dispatcher_action(pn_dispatcher_t *disp, uint8_t code,
pn_action_t *action);
@@ -72,7 +72,6 @@ void pn_set_payload(pn_dispatcher_t *dis
int pn_post_frame(pn_dispatcher_t *disp, uint16_t ch, const char *fmt, ...);
ssize_t pn_dispatcher_input(pn_dispatcher_t *disp, const char *bytes, size_t available);
ssize_t pn_dispatcher_output(pn_dispatcher_t *disp, char *bytes, size_t size);
-void pn_dispatcher_trace(pn_dispatcher_t *disp, uint16_t ch, const char *fmt, ...);
int pn_post_transfer_frame(pn_dispatcher_t *disp,
uint16_t local_channel,
uint32_t handle,
Modified: qpid/proton/trunk/proton-c/src/engine/engine-internal.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine-internal.h?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine-internal.h (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine-internal.h Wed Dec 4 15:47:30 2013
@@ -110,6 +110,7 @@ typedef struct pn_io_layer_t {
} pn_io_layer_t;
struct pn_transport_t {
+ pn_tracer_t *tracer;
size_t header_count;
pn_sasl_t *sasl;
pn_ssl_t *ssl;
@@ -150,7 +151,7 @@ struct pn_transport_t {
pn_error_t *error;
pn_hash_t *local_channels;
pn_hash_t *remote_channels;
- char scratch[SCRATCH];
+ pn_string_t *scratch;
/* statistics */
uint64_t bytes_input;
Modified: qpid/proton/trunk/proton-c/src/sasl/sasl.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/sasl/sasl.c?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/sasl/sasl.c (original)
+++ qpid/proton/trunk/proton-c/src/sasl/sasl.c Wed Dec 4 15:47:30 2013
@@ -67,7 +67,7 @@ pn_sasl_t *pn_sasl(pn_transport_t *trans
{
if (!transport->sasl) {
pn_sasl_t *sasl = (pn_sasl_t *) malloc(sizeof(pn_sasl_t));
- sasl->disp = pn_dispatcher(1, sasl);
+ sasl->disp = pn_dispatcher(1, transport);
sasl->disp->batch = false;
pn_dispatcher_action(sasl->disp, SASL_INIT, pn_do_init);
@@ -356,7 +356,7 @@ ssize_t pn_sasl_output(pn_sasl_t *sasl,
int pn_do_init(pn_dispatcher_t *disp)
{
- pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+ pn_sasl_t *sasl = disp->transport->sasl;
pn_bytes_t mech;
pn_bytes_t recv;
int err = pn_scan_args(disp, "D.[sz]", &mech, &recv);
@@ -369,14 +369,14 @@ int pn_do_init(pn_dispatcher_t *disp)
int pn_do_mechanisms(pn_dispatcher_t *disp)
{
- pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+ pn_sasl_t *sasl = disp->transport->sasl;
sasl->rcvd_init = true;
return 0;
}
int pn_do_recv(pn_dispatcher_t *disp)
{
- pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+ pn_sasl_t *sasl = disp->transport->sasl;
pn_bytes_t recv;
int err = pn_scan_args(disp, "D.[z]", &recv);
if (err) return err;
@@ -396,7 +396,7 @@ int pn_do_response(pn_dispatcher_t *disp
int pn_do_outcome(pn_dispatcher_t *disp)
{
- pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+ pn_sasl_t *sasl = disp->transport->sasl;
uint8_t outcome;
int err = pn_scan_args(disp, "D.[B]", &outcome);
if (err) return err;
@@ -425,7 +425,7 @@ static ssize_t pn_input_read_sasl_header
if (sasl->header_count == SASL_HEADER_LEN) {
sasl->io_layer->process_input = pn_input_read_sasl;
if (sasl->disp->trace & PN_TRACE_FRM)
- fprintf(stderr, " <- %s\n", "SASL");
+ pn_transport_logf(sasl->transport, " <- %s", "SASL");
}
return delta;
}
@@ -447,7 +447,7 @@ static ssize_t pn_output_write_sasl_head
{
pn_sasl_t *sasl = (pn_sasl_t *)io_layer->context;
if (sasl->disp->trace & PN_TRACE_FRM)
- fprintf(stderr, " -> %s\n", "SASL");
+ pn_transport_logf(sasl->transport, " -> %s", "SASL");
if (size >= SASL_HEADER_LEN) {
memmove(bytes, SASL_HEADER, SASL_HEADER_LEN);
sasl->io_layer->process_output = pn_output_write_sasl;
Modified: qpid/proton/trunk/proton-c/src/transport/transport.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/transport/transport.c?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/transport/transport.c (original)
+++ qpid/proton/trunk/proton-c/src/transport/transport.c Wed Dec 4 15:47:30 2013
@@ -104,11 +104,18 @@ static ssize_t pn_output_write_amqp_head
static ssize_t pn_output_write_amqp(pn_io_layer_t *io_layer, char *bytes, size_t available);
static pn_timestamp_t pn_tick_amqp(pn_io_layer_t *io_layer, pn_timestamp_t now);
+static void pni_default_tracer(pn_transport_t *transport, const char *message)
+{
+ fprintf(stderr, "[%p]:%s\n", (void *) transport, message);
+}
+
void pn_transport_init(pn_transport_t *transport)
{
+ transport->tracer = pni_default_tracer;
transport->header_count = 0;
transport->sasl = NULL;
transport->ssl = NULL;
+ transport->scratch = pn_string(NULL);
transport->disp = pn_dispatcher(0, transport);
pn_io_layer_t *io_layer = transport->io_layers;
@@ -233,6 +240,7 @@ void pn_transport_free(pn_transport_t *t
pn_free(transport->remote_channels);
free(transport->input_buf);
free(transport->output_buf);
+ pn_free(transport->scratch);
free(transport);
}
@@ -377,7 +385,7 @@ int pn_do_error(pn_transport_t *transpor
transport->close_sent = true;
}
transport->disp->halt = true;
- fprintf(stderr, "ERROR %s %s\n", condition, pn_error_text(transport->error));
+ pn_transport_logf(transport, "ERROR %s %s", condition, pn_error_text(transport->error));
return PN_ERR;
}
@@ -388,7 +396,7 @@ static char *pn_bytes_strdup(pn_bytes_t
int pn_do_open(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
pn_connection_t *conn = transport->connection;
bool container_q, hostname_q;
pn_bytes_t remote_container, remote_hostname;
@@ -405,8 +413,8 @@ int pn_do_open(pn_dispatcher_t *disp)
if (err) return err;
if (transport->remote_max_frame > 0) {
if (transport->remote_max_frame < AMQP_MIN_MAX_FRAME_SIZE) {
- fprintf(stderr, "Peer advertised bad max-frame (%u), forcing to %u\n",
- transport->remote_max_frame, AMQP_MIN_MAX_FRAME_SIZE);
+ pn_transport_logf(transport, "Peer advertised bad max-frame (%u), forcing to %u",
+ transport->remote_max_frame, AMQP_MIN_MAX_FRAME_SIZE);
transport->remote_max_frame = AMQP_MIN_MAX_FRAME_SIZE;
}
disp->remote_max_frame = transport->remote_max_frame;
@@ -436,7 +444,7 @@ int pn_do_open(pn_dispatcher_t *disp)
int pn_do_begin(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
bool reply;
uint16_t remote_channel;
pn_sequence_t next;
@@ -524,7 +532,7 @@ int pn_terminus_set_address_bytes(pn_ter
int pn_do_attach(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
pn_bytes_t name;
uint32_t handle;
bool is_sender;
@@ -641,7 +649,7 @@ void pn_full_settle(pn_delivery_map_t *d
int pn_do_transfer(pn_dispatcher_t *disp)
{
// XXX: multi transfer
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
uint32_t handle;
pn_bytes_t tag;
bool id_present;
@@ -710,7 +718,7 @@ int pn_do_transfer(pn_dispatcher_t *disp
int pn_do_flow(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
pn_sequence_t onext, inext, delivery_count;
uint32_t iwin, owin, link_credit;
uint32_t handle;
@@ -777,7 +785,7 @@ static int pn_scan_error(pn_data_t *data
int pn_do_disposition(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
bool role;
pn_sequence_t first, last;
uint64_t type = 0;
@@ -854,7 +862,7 @@ int pn_do_disposition(pn_dispatcher_t *d
int pn_do_detach(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
uint32_t handle;
bool closed;
int err = pn_scan_args(disp, "D.[Io]", &handle, &closed);
@@ -883,7 +891,7 @@ int pn_do_detach(pn_dispatcher_t *disp)
int pn_do_end(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
pn_session_t *ssn = pn_channel_state(transport, disp->channel);
int err = pn_scan_error(disp->args, &ssn->endpoint.remote_condition, SCAN_ERROR_DEFAULT);
if (err) return err;
@@ -894,7 +902,7 @@ int pn_do_end(pn_dispatcher_t *disp)
int pn_do_close(pn_dispatcher_t *disp)
{
- pn_transport_t *transport = (pn_transport_t *) disp->context;
+ pn_transport_t *transport = disp->transport;
pn_connection_t *conn = transport->connection;
int err = pn_scan_error(disp->args, &transport->remote_condition, SCAN_ERROR_DEFAULT);
if (err) return err;
@@ -947,12 +955,12 @@ static ssize_t transport_consume(pn_tran
break;
} else {
if (n != PN_EOS) {
- pn_dispatcher_trace(transport->disp, 0, "ERROR[%i] %s\n",
- pn_error_code(transport->error),
- pn_error_text(transport->error));
+ pn_transport_logf(transport, "ERROR[%i] %s\n",
+ pn_error_code(transport->error),
+ pn_error_text(transport->error));
}
if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM))
- pn_dispatcher_trace(transport->disp, 0, "<- EOS\n");
+ pn_transport_log(transport, " <- EOS");
transport->input_pending = 0; // XXX ???
return n;
}
@@ -983,7 +991,7 @@ static ssize_t pn_input_read_header(pn_t
transport->io_layers[PN_IO_AMQP].process_input = next;
if (transport->disp->trace & PN_TRACE_FRM)
- fprintf(stderr, " <- %s\n", protocol);
+ pn_transport_logf(transport, " <- %s", protocol);
}
return delta;
}
@@ -1623,7 +1631,7 @@ static ssize_t pn_output_write_header(pn
ssize_t (*next)(pn_io_layer_t *, char *, size_t))
{
if (transport->disp->trace & PN_TRACE_FRM)
- fprintf(stderr, " -> %s\n", protocol);
+ pn_transport_logf(transport, " -> %s", protocol);
if (size >= hdrsize) {
memmove(bytes, header, hdrsize);
transport->io_layers[PN_IO_AMQP].process_output = next;
@@ -1700,10 +1708,10 @@ static ssize_t transport_produce(pn_tran
break; // return what is available
if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM)) {
if (n == PN_EOS)
- pn_dispatcher_trace(transport->disp, 0, "-> EOS\n");
+ pn_transport_log(transport, " -> EOS");
else
- pn_dispatcher_trace(transport->disp, 0, "-> EOS (%" PN_ZI ") %s\n", n,
- pn_error_text(transport->error));
+ pn_transport_logf(transport, " -> EOS (%" PN_ZI ") %s", n,
+ pn_error_text(transport->error));
}
return n;
}
@@ -1732,6 +1740,37 @@ void pn_transport_trace(pn_transport_t *
transport->disp->trace = trace;
}
+void pn_transport_set_tracer(pn_transport_t *transport, pn_tracer_t *tracer)
+{
+ assert(transport);
+ assert(tracer);
+
+ transport->tracer = tracer;
+}
+
+pn_tracer_t *pn_transport_get_tracer(pn_transport_t *transport)
+{
+ assert(transport);
+ return transport->tracer;
+}
+
+void pn_transport_log(pn_transport_t *transport, const char *message)
+{
+ assert(transport);
+ transport->tracer(transport, message);
+}
+
+void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pn_string_vformat(transport->scratch, fmt, ap);
+ va_end(ap);
+
+ pn_transport_log(transport, pn_string_get(transport->scratch));
+}
+
uint32_t pn_transport_get_max_frame(pn_transport_t *transport)
{
return transport->local_max_frame;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org