summaryrefslogtreecommitdiffstats
path: root/runtime/print_new.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/print_new.c')
-rw-r--r--runtime/print_new.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/runtime/print_new.c b/runtime/print_new.c
index fa7b4727..4857b301 100644
--- a/runtime/print_new.c
+++ b/runtime/print_new.c
@@ -23,13 +23,15 @@ void EXPORT_FN(stp_print_flush) (_stp_pbuf *pb)
uint32_t len = pb->len;
/* check to see if there is anything in the buffer */
+ dbug_trans(1, "len = %ud\n", len);
if (likely (len == 0))
return;
pb->len = 0;
- if (unlikely(!_stp_utt || _stp_utt->trace_state != Utt_trace_running))
- return;
+//DRS FIXME: this digs down too deep in internals
+// if (unlikely(!_stp_utt || _stp_utt->trace_state != Utt_trace_running))
+// return;
#ifdef STP_BULKMODE
{
@@ -53,14 +55,46 @@ void EXPORT_FN(stp_print_flush) (_stp_pbuf *pb)
}
#else
{
- void *buf;
+ struct _stp_entry *entry;
unsigned long flags;
+
+ dbug_trans(1, "calling _stp_data_write...\n");
spin_lock_irqsave(&_stp_print_lock, flags);
- buf = utt_reserve(_stp_utt, len);
- if (likely(buf))
- memcpy(buf, pb->buf, len);
+#if 0
+ entry = _stp_data_write_reserve(len);
+ if (likely(entry)) {
+ memcpy(entry->buf, pb->buf, len);
+ _stp_data_write_commit(entry);
+ }
else
- atomic_inc (&_stp_transport_failures);
+#endif
+ {
+ uint32_t cnt;
+ char *bufp = pb->buf;
+
+#define MAX_RESERVE_SIZE (4080 /*BUF_PAGE_SIZE*/ - sizeof(struct _stp_entry) - 10)
+ while (len > 0) {
+ if (len > MAX_RESERVE_SIZE) {
+ len -= MAX_RESERVE_SIZE;
+ cnt = MAX_RESERVE_SIZE;
+ }
+ else {
+ cnt = len;
+ len = 0;
+ }
+
+ entry = _stp_data_write_reserve(cnt);
+ if (likely(entry)) {
+ memcpy(entry->buf, bufp, cnt);
+ _stp_data_write_commit(entry);
+ bufp += cnt;
+ }
+ else {
+ atomic_inc (&_stp_transport_failures);
+ break;
+ }
+ }
+ }
spin_unlock_irqrestore(&_stp_print_lock, flags);
}
#endif /* STP_BULKMODE */