@@ -52,7 +52,6 @@ const static char *TAG = "esp_apptrace";
5252
5353static uint32_t esp_apptrace_membufs_down_buffer_write_nolock (esp_apptrace_membufs_proto_data_t * proto , uint8_t * data , uint32_t size );
5454
55-
5655esp_err_t esp_apptrace_membufs_init (esp_apptrace_membufs_proto_data_t * proto , const esp_apptrace_mem_block_t blocks_cfg [2 ])
5756{
5857 // disabled by default
@@ -64,10 +63,6 @@ esp_err_t esp_apptrace_membufs_init(esp_apptrace_membufs_proto_data_t *proto, co
6463 proto -> state .markers [i ] = 0 ;
6564 }
6665 proto -> state .in_block = 0 ;
67- #if CONFIG_APPTRACE_PENDING_DATA_SIZE_MAX > 0
68- esp_apptrace_rb_init (& proto -> rb_pend , proto -> pending_data ,
69- sizeof (proto -> pending_data ));
70- #endif
7166 return ESP_OK ;
7267}
7368
@@ -81,10 +76,10 @@ static esp_err_t esp_apptrace_membufs_swap(esp_apptrace_membufs_proto_data_t *pr
8176{
8277 int prev_block_num = proto -> state .in_block % 2 ;
8378 int new_block_num = prev_block_num ? (0 ) : (1 );
84- esp_err_t res = ESP_OK ;
8579
86- res = proto -> hw -> swap_start (proto -> state .in_block );
80+ esp_err_t res = proto -> hw -> swap_start (proto -> state .in_block );
8781 if (res != ESP_OK ) {
82+ ESP_APPTRACE_LOGE ("Failed to swap to new block: %d" , res );
8883 return res ;
8984 }
9085
@@ -101,40 +96,18 @@ static esp_err_t esp_apptrace_membufs_swap(esp_apptrace_membufs_proto_data_t *pr
10196 // TODO: add support for multiple blocks from host, currently there is no need for that
10297 uint8_t * p = proto -> blocks [new_block_num ].start + proto -> blocks [new_block_num ].sz ;
10398 ESP_APPTRACE_LOGD ("Recvd %" PRIu16 " bytes from host (@ %p) [%x %x %x %x %x %x %x %x .. %x %x %x %x %x %x %x %x]" ,
104- hdr -> block_sz , proto -> blocks [new_block_num ].start ,
105- * (proto -> blocks [new_block_num ].start + 0 ), * (proto -> blocks [new_block_num ].start + 1 ),
106- * (proto -> blocks [new_block_num ].start + 2 ), * (proto -> blocks [new_block_num ].start + 3 ),
107- * (proto -> blocks [new_block_num ].start + 4 ), * (proto -> blocks [new_block_num ].start + 5 ),
108- * (proto -> blocks [new_block_num ].start + 6 ), * (proto -> blocks [new_block_num ].start + 7 ),
109- * (p - 8 ), * (p - 7 ), * (p - 6 ), * (p - 5 ), * (p - 4 ), * (p - 3 ), * (p - 2 ), * (p - 1 ));
110- uint32_t sz = esp_apptrace_membufs_down_buffer_write_nolock (proto , (uint8_t * )(hdr + 1 ), hdr -> block_sz );
99+ hdr -> block_sz , proto -> blocks [new_block_num ].start ,
100+ * (proto -> blocks [new_block_num ].start + 0 ), * (proto -> blocks [new_block_num ].start + 1 ),
101+ * (proto -> blocks [new_block_num ].start + 2 ), * (proto -> blocks [new_block_num ].start + 3 ),
102+ * (proto -> blocks [new_block_num ].start + 4 ), * (proto -> blocks [new_block_num ].start + 5 ),
103+ * (proto -> blocks [new_block_num ].start + 6 ), * (proto -> blocks [new_block_num ].start + 7 ),
104+ * (p - 8 ), * (p - 7 ), * (p - 6 ), * (p - 5 ), * (p - 4 ), * (p - 3 ), * (p - 2 ), * (p - 1 ));
105+ uint32_t sz = esp_apptrace_membufs_down_buffer_write_nolock (proto , (uint8_t * )(hdr + 1 ), hdr -> block_sz );
111106 if (sz != hdr -> block_sz ) {
112107 ESP_APPTRACE_LOGE ("Failed to write %" PRIu32 " bytes to down buffer (%" PRIu16 " %" PRIu32 ")!" , hdr -> block_sz - sz , hdr -> block_sz , sz );
113108 }
114109 hdr -> block_sz = 0 ;
115110 }
116- #if CONFIG_APPTRACE_PENDING_DATA_SIZE_MAX > 0
117- // copy pending data to block if any
118- while (proto -> state .markers [new_block_num ] < proto -> blocks [new_block_num ].sz ) {
119- uint32_t read_sz = esp_apptrace_rb_read_size_get (& proto -> rb_pend );
120- if (read_sz == 0 ) {
121- break ; // no more data in pending buffer
122- }
123- if (read_sz > proto -> blocks [new_block_num ].sz - proto -> state .markers [new_block_num ]) {
124- read_sz = proto -> blocks [new_block_num ].sz - proto -> state .markers [new_block_num ];
125- }
126- uint8_t * ptr = esp_apptrace_rb_consume (& proto -> rb_pend , read_sz );
127- if (!ptr ) {
128- assert (false && "Failed to consume pended bytes!!" );
129- break ;
130- }
131- ESP_APPTRACE_LOGD ("Pump %d pend bytes [%x %x %x %x : %x %x %x %x : %x %x %x %x : %x %x...%x %x]" ,
132- read_sz , * (ptr + 0 ), * (ptr + 1 ), * (ptr + 2 ), * (ptr + 3 ), * (ptr + 4 ),
133- * (ptr + 5 ), * (ptr + 6 ), * (ptr + 7 ), * (ptr + 8 ), * (ptr + 9 ), * (ptr + 10 ), * (ptr + 11 ), * (ptr + 12 ), * (ptr + 13 ), * (ptr + read_sz - 2 ), * (ptr + read_sz - 1 ));
134- memcpy (proto -> blocks [new_block_num ].start + proto -> state .markers [new_block_num ], ptr , read_sz );
135- proto -> state .markers [new_block_num ] += read_sz ;
136- }
137- #endif
138111 proto -> hw -> swap_end (proto -> state .in_block , proto -> state .markers [prev_block_num ]);
139112 return res ;
140113}
@@ -209,7 +182,7 @@ static uint32_t esp_apptrace_membufs_down_buffer_write_nolock(esp_apptrace_membu
209182
210183 while (total_sz < size ) {
211184 ESP_APPTRACE_LOGD ("esp_apptrace_trax_down_buffer_write_nolock WRS %" PRIu32 "-%" PRIu32 "-%" PRIu32 " %" PRIu32 , proto -> rb_down .wr , proto -> rb_down .rd ,
212- proto -> rb_down .cur_size , size );
185+ proto -> rb_down .cur_size , size );
213186 uint32_t wr_sz = esp_apptrace_rb_write_size_get (& proto -> rb_down );
214187 if (wr_sz == 0 ) {
215188 break ;
@@ -231,45 +204,6 @@ static uint32_t esp_apptrace_membufs_down_buffer_write_nolock(esp_apptrace_membu
231204 return total_sz ;
232205}
233206
234- static inline uint8_t * esp_apptrace_membufs_wait4buf (esp_apptrace_membufs_proto_data_t * proto , uint16_t size , esp_apptrace_tmo_t * tmo , int * pended )
235- {
236- uint8_t * ptr = NULL ;
237-
238- int res = esp_apptrace_membufs_swap_waitus (proto , tmo );
239- if (res != ESP_OK ) {
240- return NULL ;
241- }
242- #if CONFIG_APPTRACE_PENDING_DATA_SIZE_MAX > 0
243- // check if we still have pending data
244- if (esp_apptrace_rb_read_size_get (& proto -> rb_pend ) > 0 ) {
245- // if after block switch we still have pending data (not all pending data have been pumped to block)
246- // alloc new pending buffer
247- * pended = 1 ;
248- ptr = esp_apptrace_rb_produce (& proto -> rb_pend , size );
249- if (!ptr ) {
250- ESP_APPTRACE_LOGE ("Failed to alloc pend buf 1: w-r-s %d-%d-%d!" , proto -> rb_pend .wr , proto -> rb_pend .rd , proto -> rb_pend .cur_size );
251- }
252- } else
253- #endif
254- {
255- // update block pointers
256- if (ESP_APPTRACE_INBLOCK_MARKER (proto ) + size > ESP_APPTRACE_INBLOCK (proto )-> sz ) {
257- #if CONFIG_APPTRACE_PENDING_DATA_SIZE_MAX > 0
258- * pended = 1 ;
259- ptr = esp_apptrace_rb_produce (& proto -> rb_pend , size );
260- if (ptr == NULL ) {
261- ESP_APPTRACE_LOGE ("Failed to alloc pend buf 2: w-r-s %d-%d-%d!" , proto -> rb_pend .wr , proto -> rb_pend .rd , proto -> rb_pend .cur_size );
262- }
263- #endif
264- } else {
265- * pended = 0 ;
266- ptr = ESP_APPTRACE_INBLOCK (proto )-> start + ESP_APPTRACE_INBLOCK_MARKER (proto );
267- }
268- }
269-
270- return ptr ;
271- }
272-
273207static inline uint8_t * esp_apptrace_membufs_pkt_start (uint8_t * ptr , uint16_t size )
274208{
275209 // it is safe to use esp_cpu_get_core_id() in macro call because arg is used only once inside it
@@ -287,63 +221,23 @@ static inline void esp_apptrace_membufs_pkt_end(uint8_t *ptr)
287221
288222uint8_t * esp_apptrace_membufs_up_buffer_get (esp_apptrace_membufs_proto_data_t * proto , uint32_t size , esp_apptrace_tmo_t * tmo )
289223{
290- uint8_t * buf_ptr = NULL ;
291-
292224 if (size > ESP_APPTRACE_USR_DATA_LEN_MAX (proto )) {
293225 ESP_APPTRACE_LOGE ("Too large user data size %" PRIu32 "!" , size );
294226 return NULL ;
295227 }
296228
297- // check for data in the pending buffer
298- #if CONFIG_APPTRACE_PENDING_DATA_SIZE_MAX > 0
299- if (esp_apptrace_rb_read_size_get (& proto -> rb_pend ) > 0 ) {
300- // if we have buffered data try to switch block
301- esp_apptrace_membufs_swap (proto );
302- // if switch was successful, part or all pended data have been copied to block
303- }
304- if (esp_apptrace_rb_read_size_get (& proto -> rb_pend ) > 0 ) {
305- // if we have buffered data alloc new pending buffer
306- ESP_APPTRACE_LOGD ("Get %d bytes from PEND buffer" , size );
307- buf_ptr = esp_apptrace_rb_produce (& proto -> rb_pend , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ));
308- if (buf_ptr == NULL ) {
309- int pended_buf ;
310- buf_ptr = esp_apptrace_membufs_wait4buf (proto , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ), tmo , & pended_buf );
311- if (buf_ptr && !pended_buf ) {
312- ESP_APPTRACE_LOGD ("Get %d bytes from block" , size );
313- // update cur block marker
314- ESP_APPTRACE_INBLOCK_MARKER_UPD (proto , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ));
315- }
316- }
317- } else {
318- #else
319- if (1 ) {
320- #endif
321- if (ESP_APPTRACE_INBLOCK_MARKER (proto ) + ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ) > ESP_APPTRACE_INBLOCK (proto )-> sz ) {
322- #if CONFIG_APPTRACE_PENDING_DATA_SIZE_MAX > 0
323- ESP_APPTRACE_LOGD ("Block full. Get %" PRIu32 " bytes from PEND buffer" , size );
324- buf_ptr = esp_apptrace_rb_produce (& proto -> rb_pend , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ));
325- #endif
326- if (buf_ptr == NULL ) {
327- int pended_buf ;
328- ESP_APPTRACE_LOGD (" full. Get %" PRIu32 " bytes from pend buffer" , size );
329- buf_ptr = esp_apptrace_membufs_wait4buf (proto , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ), tmo , & pended_buf );
330- if (buf_ptr && !pended_buf ) {
331- ESP_APPTRACE_LOGD ("Got %" PRIu32 " bytes from block" , size );
332- // update cur block marker
333- ESP_APPTRACE_INBLOCK_MARKER_UPD (proto , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ));
334- }
335- }
336- } else {
337- ESP_APPTRACE_LOGD ("Get %" PRIu32 " bytes from buffer" , size );
338- // fit to curr nlock
339- buf_ptr = ESP_APPTRACE_INBLOCK (proto )-> start + ESP_APPTRACE_INBLOCK_MARKER (proto );
340- // update cur block marker
341- ESP_APPTRACE_INBLOCK_MARKER_UPD (proto , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ));
229+ if (ESP_APPTRACE_INBLOCK_MARKER (proto ) + ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ) > ESP_APPTRACE_INBLOCK (proto )-> sz ) {
230+ int res = esp_apptrace_membufs_swap_waitus (proto , tmo );
231+ if (res != ESP_OK ) {
232+ return NULL ;
342233 }
343234 }
344- if (buf_ptr ) {
345- buf_ptr = esp_apptrace_membufs_pkt_start (buf_ptr , size );
346- }
235+
236+ uint8_t * buf_ptr = ESP_APPTRACE_INBLOCK (proto )-> start + ESP_APPTRACE_INBLOCK_MARKER (proto );
237+ // update cur block marker
238+ ESP_APPTRACE_INBLOCK_MARKER_UPD (proto , ESP_APPTRACE_USR_BLOCK_RAW_SZ (size ));
239+ buf_ptr = esp_apptrace_membufs_pkt_start (buf_ptr , size );
240+ ESP_APPTRACE_LOGD ("Got %" PRIu32 " bytes from block" , size );
347241
348242 return buf_ptr ;
349243}
@@ -367,15 +261,16 @@ esp_err_t esp_apptrace_membufs_flush_nolock(esp_apptrace_membufs_proto_data_t *p
367261 ESP_APPTRACE_LOGI ("Ignore flush request for min %" PRIu32 " bytes. Bytes in block: %" PRIu32 , min_sz , ESP_APPTRACE_INBLOCK_MARKER (proto ));
368262 return ESP_OK ;
369263 }
370- // switch block while size of data (including that in pending buffer) is more than min size
264+ // switch block while size of data is more than min size
371265 while (ESP_APPTRACE_INBLOCK_MARKER (proto ) > min_sz ) {
372- ESP_APPTRACE_LOGD ("Try to flush %" PRIu32 " bytes. Wait until block switch for %" PRIi64 " us" , ESP_APPTRACE_INBLOCK_MARKER (proto ), tmo -> tmo );
266+ ESP_APPTRACE_LOGD ("Try to flush %" PRIu32 " bytes" , ESP_APPTRACE_INBLOCK_MARKER (proto ));
373267 res = esp_apptrace_membufs_swap_waitus (proto , tmo );
374268 if (res != ESP_OK ) {
375- if (tmo -> tmo != ESP_APPTRACE_TMO_INFINITE )
376- ESP_APPTRACE_LOGW ("Failed to switch to another block in %lld us!" , tmo -> tmo );
377- else
378- ESP_APPTRACE_LOGE ("Failed to switch to another block in %lld us!" , tmo -> tmo );
269+ if (res == ESP_ERR_TIMEOUT ) {
270+ ESP_APPTRACE_LOGW ("Failed to switch to another block in %" PRIi32 " us!" , (int32_t )tmo -> elapsed );
271+ } else {
272+ ESP_APPTRACE_LOGE ("Failed to switch to another block, res: %d" , res );
273+ }
379274 return res ;
380275 }
381276 }
0 commit comments