summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Brandner <simon.brandner@partner.bmw.de>2012-11-29 16:38:18 +0100
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2013-07-19 16:53:59 +0200
commit407fbecc4b95658e9c36e2e45e210b88d4bbc308 (patch)
treeff1c14d791bad0a60bf5602d6fd23ff6408de887
parented306103337f6f8d5cdfa27872eb7662e85ac99f (diff)
downloadDLT-daemon-407fbecc4b95658e9c36e2e45e210b88d4bbc308.tar.gz
split up dlt_user_trace_network_segmented_thread function to avoid nested loop
Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
-rw-r--r--src/lib/dlt_user.c154
1 files changed, 81 insertions, 73 deletions
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c
index 64ba5c3..8155d52 100644
--- a/src/lib/dlt_user.c
+++ b/src/lib/dlt_user.c
@@ -134,6 +134,7 @@ static int dlt_user_log_check_user_message(void);
static void dlt_user_log_reattach_to_daemon(void);
static int dlt_user_log_send_overflow(void);
static void dlt_user_trace_network_segmented_thread(void *unused);
+static void dlt_user_trace_network_segmented_thread_segmenter(s_segmented_data *data);
static int dlt_user_queue_resend(void);
int dlt_user_check_library_version(const char *user_major_version,const char *user_minor_version){
@@ -2105,92 +2106,99 @@ int dlt_user_trace_network_segmented_end(uint16_t id, DltContext *handle, DltNet
return 0;
}
+
void dlt_user_trace_network_segmented_thread(void *unused)
{
- /* Unused on purpose. */
- (void) unused;
+ /* Unused on purpose. */
+ (void) unused;
- s_segmented_data *data;
+ s_segmented_data *data;
- while(1)
- {
- // Wait untill message queue is initialized
- pthread_mutex_lock(&mq_mutex);
- if(dlt_user.dlt_segmented_queue_read_handle < 0)
- {
- pthread_cond_wait(&mq_init_condition, &mq_mutex);
- }
- pthread_mutex_unlock(&mq_mutex);
+ while(1)
+ {
+ // Wait untill message queue is initialized
+ pthread_mutex_lock(&mq_mutex);
+ if(dlt_user.dlt_segmented_queue_read_handle < 0)
+ {
+ pthread_cond_wait(&mq_init_condition, &mq_mutex);
+ }
+ pthread_mutex_unlock(&mq_mutex);
- ssize_t read = mq_receive(dlt_user.dlt_segmented_queue_read_handle, (char *)&data,
- sizeof(s_segmented_data * ), NULL);
+ ssize_t read = mq_receive(dlt_user.dlt_segmented_queue_read_handle, (char *)&data,
+ sizeof(s_segmented_data * ), NULL);
- if(read != sizeof(s_segmented_data *))
- {
- dlt_log(LOG_ERR, "NWTSegmented: Error while reading queue.\n");
- dlt_log(LOG_ERR, strerror(errno));
- continue;
- }
+ if(read != sizeof(s_segmented_data *))
+ {
+ dlt_log(LOG_ERR, "NWTSegmented: Error while reading queue.\n");
+ dlt_log(LOG_ERR, strerror(errno));
+ continue;
+ }
- /* Indicator just to try to flush the buffer */
- if(data->payload_len == DLT_DELAYED_RESEND_INDICATOR_PATTERN)
- {
- // Sleep 100ms, to allow other process to read FIFO
- usleep(100*1000);
- if(dlt_user_log_resend_buffer() < 0)
- {
- // Requeue if still not empty
- dlt_user_queue_resend();
- }
- free(data);
- continue;
- }
+ /* Indicator just to try to flush the buffer */
+ if(data->payload_len == DLT_DELAYED_RESEND_INDICATOR_PATTERN)
+ {
+ // Sleep 100ms, to allow other process to read FIFO
+ usleep(100*1000);
+ if(dlt_user_log_resend_buffer() < 0)
+ {
+ // Requeue if still not empty
+ dlt_user_queue_resend();
+ }
+ free(data);
+ continue;
+ }
- /* Segment the data and send the chunks */
- void *ptr = NULL;
- uint16_t offset = 0;
- uint16_t sequence = 0;
- do
- {
- uint16_t len = 0;
- if(offset + DLT_MAX_TRACE_SEGMENT_SIZE > data->payload_len)
- {
- len = data->payload_len - offset;
- }
- else
- {
- len = DLT_MAX_TRACE_SEGMENT_SIZE;
- }
- /* If payload size aligns perfectly with segment size, avoid sendind empty segment */
- if(len == 0)
- {
- break;
- }
+ dlt_user_trace_network_segmented_thread_segmenter(data);
- ptr = data->payload + offset;
- DltReturnValue err = dlt_user_trace_network_segmented_segment(data->id, data->handle, data->nw_trace_type, sequence++, len, ptr);
- if(err == DLT_RETURN_BUFFER_FULL || err == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_ERR,"NWTSegmented: Could not send segment. Aborting.\n");
- break; // Inner loop
- }
- offset += len;
- }while(ptr < data->payload + data->payload_len);
+ /* Send the end message */
+ DltReturnValue err = dlt_user_trace_network_segmented_end(data->id, data->handle, data->nw_trace_type);
+ if(err == DLT_RETURN_BUFFER_FULL || err == DLT_RETURN_ERROR)
+ {
+ dlt_log(LOG_ERR,"NWTSegmented: Could not send end segment.\n");
+ }
- /* Send the end message */
- DltReturnValue err = dlt_user_trace_network_segmented_end(data->id, data->handle, data->nw_trace_type);
- if(err == DLT_RETURN_BUFFER_FULL || err == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_ERR,"NWTSegmented: Could not send end segment.\n");
- }
+ /* Free resources */
+ free(data->header);
+ free(data->payload);
+ free(data);
+ }
+}
- /* Free resources */
- free(data->header);
- free(data->payload);
- free(data);
- }
+void dlt_user_trace_network_segmented_thread_segmenter(s_segmented_data *data)
+{
+ /* Segment the data and send the chunks */
+ void *ptr = NULL;
+ uint16_t offset = 0;
+ uint16_t sequence = 0;
+ do
+ {
+ uint16_t len = 0;
+ if(offset + DLT_MAX_TRACE_SEGMENT_SIZE > data->payload_len)
+ {
+ len = data->payload_len - offset;
+ }
+ else
+ {
+ len = DLT_MAX_TRACE_SEGMENT_SIZE;
+ }
+ /* If payload size aligns perfectly with segment size, avoid sending empty segment */
+ if(len == 0)
+ {
+ break;
+ }
+
+ ptr = data->payload + offset;
+ DltReturnValue err = dlt_user_trace_network_segmented_segment(data->id, data->handle, data->nw_trace_type, sequence++, len, ptr);
+ if(err == DLT_RETURN_BUFFER_FULL || err == DLT_RETURN_ERROR)
+ {
+ dlt_log(LOG_ERR,"NWTSegmented: Could not send segment. Aborting.\n");
+ break; // loop
+ }
+ offset += len;
+ }while(ptr < data->payload + data->payload_len);
}
+
int dlt_user_trace_network_segmented(DltContext *handle, DltNetworkTraceType nw_trace_type, uint16_t header_len, void *header, uint16_t payload_len, void *payload)
{
/* Send as normal trace if possible */