diff options
author | ManikandanC <Manikandan.Chockalingam@in.bosch.com> | 2017-05-22 10:57:21 +0530 |
---|---|---|
committer | Christoph Lipka <clipka@users.noreply.github.com> | 2018-12-10 15:40:58 +0100 |
commit | b2ce65d9947849160e04e751075c7fe4b5dcd158 (patch) | |
tree | 17bd0227f0d26d3557deecb83b026284975019a1 /src/shared/dlt_common.c | |
parent | ea836f6de185f32c14404950f5cfb2ebf084e1ca (diff) | |
download | DLT-daemon-b2ce65d9947849160e04e751075c7fe4b5dcd158.tar.gz |
Dynamic allocation of msg buffer
It is possible to change the default buffer size for log message creation via
environment variable:
export DLT_LOG_MSG_BUF_LEN=<value>
Instead of using a static buffer with size of 1390 bytes, the buffer is
allocated dynamically with the specified value.The max size is restricted to approx 65k.
Signed-off-by: Christoph Lipka <clipka@de.adit-jv.com>
Signed-off-by: ManikandanC <Manikandan.Chockalingam@in.bosch.com>
Diffstat (limited to 'src/shared/dlt_common.c')
-rw-r--r-- | src/shared/dlt_common.c | 115 |
1 files changed, 82 insertions, 33 deletions
diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index d2f86f4..0b3c49e 100644 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -2137,6 +2137,7 @@ DltReturnValue dlt_receiver_init(DltReceiver *receiver, int fd, int buffersize) receiver->buffersize = buffersize; receiver->fd = fd; receiver->buffer = (char*)malloc(receiver->buffersize); + receiver->backup_buf = NULL; if (receiver->buffer == NULL) { @@ -2151,6 +2152,35 @@ DltReturnValue dlt_receiver_init(DltReceiver *receiver, int fd, int buffersize) return DLT_RETURN_OK; } +DltReturnValue dlt_receiver_init_unix_socket(DltReceiver *receiver, int fd, char **buffer) +{ + if (receiver == NULL) + { + return DLT_RETURN_WRONG_PARAMETER; + } + if (*buffer == NULL) + { + /* allocating the buffer once and using it for all application receivers + * by keeping allocated buffer in app_recv_buffer global handle + */ + *buffer = (char*)malloc(DLT_APP_RCV_BUF_MAX); + if (*buffer == NULL) + { + return DLT_RETURN_ERROR; + } + } + receiver->lastBytesRcvd = 0; + receiver->bytesRcvd = 0; + receiver->totalBytesRcvd = 0; + receiver->buffersize = DLT_APP_RCV_BUF_MAX; + receiver->fd = fd; + receiver->buffer = *buffer; + receiver->backup_buf = NULL; + receiver->buf = receiver->buffer; + + return DLT_RETURN_OK; +} + DltReturnValue dlt_receiver_free(DltReceiver *receiver) { @@ -2164,44 +2194,39 @@ DltReturnValue dlt_receiver_free(DltReceiver *receiver) free(receiver->buffer); } + if (receiver->backup_buf) + { + free(receiver->backup_buf); + } + receiver->buffer = NULL; receiver->buf = NULL; + receiver->backup_buf = NULL; return DLT_RETURN_OK; } -#ifndef QT_VIEWER -int dlt_receiver_receive_socket(DltReceiver *receiver) +DltReturnValue dlt_receiver_free_unix_socket(DltReceiver *receiver) { + if (receiver == NULL) { - return -1; + return DLT_RETURN_WRONG_PARAMETER; } - if (receiver->buffer == NULL) + if (receiver->backup_buf) { - return -1; + free(receiver->backup_buf); } - receiver->buf = (char *)receiver->buffer; - receiver->lastBytesRcvd = receiver->bytesRcvd; - - /* wait for data from socket */ - if ((receiver->bytesRcvd = recv(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd , 0)) <= 0) - { - receiver->bytesRcvd = 0; - - return receiver->bytesRcvd; - } /* if */ - - receiver->totalBytesRcvd += receiver->bytesRcvd; - receiver->bytesRcvd += receiver->lastBytesRcvd; + receiver->buffer = NULL; + receiver->buf = NULL; + receiver->backup_buf = NULL; - return receiver->bytesRcvd; + return DLT_RETURN_OK; } -#endif -int dlt_receiver_receive_fd(DltReceiver *receiver) +int dlt_receiver_receive(DltReceiver *receiver, DltReceiverType from_src) { if (receiver == NULL) { @@ -2216,8 +2241,30 @@ int dlt_receiver_receive_fd(DltReceiver *receiver) receiver->buf = (char *)receiver->buffer; receiver->lastBytesRcvd = receiver->bytesRcvd; - /* wait for data from fd */ - if ((receiver->bytesRcvd = read(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd)) <= 0) + if ((receiver->lastBytesRcvd) && (receiver->backup_buf != NULL)) + { + memcpy(receiver->buf, receiver->backup_buf, receiver->lastBytesRcvd); + free(receiver->backup_buf); + receiver->backup_buf = NULL; + } + + if (from_src == DLT_RECEIVE_SOCKET) + { + /* wait for data from socket */ + receiver->bytesRcvd = recv(receiver->fd, + receiver->buf + receiver->lastBytesRcvd, + receiver->buffersize - receiver->lastBytesRcvd, + 0); + } + else + { + /* wait for data from fd */ + receiver->bytesRcvd = read(receiver->fd, + receiver->buf + receiver->lastBytesRcvd, + receiver->buffersize - receiver->lastBytesRcvd); + } + + if (receiver->bytesRcvd <= 0) { receiver->bytesRcvd = 0; @@ -2230,15 +2277,6 @@ int dlt_receiver_receive_fd(DltReceiver *receiver) return receiver->bytesRcvd; } -int dlt_receiver_receive(DltReceiver *receiver) -{ -#ifdef DLT_USE_UNIX_SOCKET_IPC - return dlt_receiver_receive_socket(receiver); -#else - return dlt_receiver_receive_fd(receiver); -#endif -} - DltReturnValue dlt_receiver_remove(DltReceiver *receiver, int size) { if (receiver == NULL) @@ -2278,7 +2316,18 @@ DltReturnValue dlt_receiver_move_to_begin(DltReceiver *receiver) if ((receiver->buffer!=receiver->buf) && (receiver->bytesRcvd!=0)) { - memmove(receiver->buffer,receiver->buf,receiver->bytesRcvd); + receiver->backup_buf = calloc(receiver->bytesRcvd + 1, sizeof(char)); + + if (receiver->backup_buf == NULL) + { + dlt_vlog(LOG_WARNING, + "Can't allocate memory for backup buf, there will be atleast" + "one corrupted message for fd[%d] \n", receiver->fd); + } + else + { + memcpy(receiver->backup_buf, receiver->buf, receiver->bytesRcvd); + } } return DLT_RETURN_OK; |