summaryrefslogtreecommitdiff
path: root/src/shared/dlt_common.c
diff options
context:
space:
mode:
authorMohammed AL Dardoun <mohammed.aldardoun@partner.bmw.de>2011-08-09 17:04:17 +0200
committerMohammed AL Dardoun <mohammed.aldardoun@partner.bmw.de>2011-08-09 17:04:17 +0200
commit7554585a80ca2a8ebdcd5d1f1693ffe8e39b571d (patch)
tree5e479e49045e847c4ffe08d09a553763173bd836 /src/shared/dlt_common.c
parent11702b620d2ec8896af210168db81ee58923d9da (diff)
downloadDLT-daemon-7554585a80ca2a8ebdcd5d1f1693ffe8e39b571d.tar.gz
[GSW-43] Flow Control for sending huge amount of data over DLT. partialy fixed
Diffstat (limited to 'src/shared/dlt_common.c')
-rwxr-xr-xsrc/shared/dlt_common.c266
1 files changed, 200 insertions, 66 deletions
diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c
index 0533c0e..22834dd 100755
--- a/src/shared/dlt_common.c
+++ b/src/shared/dlt_common.c
@@ -2232,7 +2232,7 @@ int dlt_check_storageheader(DltStorageHeader *storageheader)
(storageheader->pattern[3] == 1));
}
-int dlt_ringbuffer_init(DltRingBuffer *dltbuf, uint32_t size)
+int dlt_ringbuffer_init(DltRingBuffer *dltbuf, uint32_t size, uint32_t increasesize, uint32_t maxsize)
{
if (dltbuf==0)
@@ -2245,13 +2245,17 @@ int dlt_ringbuffer_init(DltRingBuffer *dltbuf, uint32_t size)
return -1;
}
- dltbuf->buffer=(char*)malloc(size);
+ dltbuf->minimum_size = size;
+ dltbuf->buffer=(char*)malloc(dltbuf->minimum_size);
+
if (dltbuf->buffer==0)
{
return -1;
}
- dltbuf->size=size;
+ dltbuf->size= dltbuf->minimum_size;
+ dltbuf->increasing_size = increasesize;
+ dltbuf->maximum_size = maxsize;
dltbuf->pos_write=0;
dltbuf->pos_read=0;
@@ -2288,7 +2292,7 @@ int dlt_ringbuffer_free(DltRingBuffer *dltbuf)
int dlt_ringbuffer_put(DltRingBuffer *dltbuf, void *data, uint32_t size)
{
- uint32_t sui, part1, part2;
+ uint32_t sui, part1, part2;
if (dltbuf==0)
{
@@ -2307,29 +2311,21 @@ int dlt_ringbuffer_put(DltRingBuffer *dltbuf, void *data, uint32_t size)
sui = sizeof(uint32_t);
+ dlt_ringbuffer_checkandfreespace(dltbuf, (size+sui));
+
if ((size+sui)>dltbuf->size)
{
return -1;
}
- dlt_ringbuffer_checkandfreespace(dltbuf, (size+sui));
-
if (dltbuf->pos_write >= dltbuf->size)
{
dltbuf->pos_write = 0;
}
/* Not enough space for one uint available before end of linear buffer */
- /* Start at begin of linear buffer */
- if ((dltbuf->size - dltbuf->pos_write) < sui)
- {
- dltbuf->pos_write = 0;
- }
-
- /* Write length of following data to buffer */
- memcpy(&(dltbuf->buffer[dltbuf->pos_write]), &size, sui);
- dltbuf->pos_write+=sui;
-
+ dlt_ringbuffer_putMessageSize(dltbuf, &size,sui);
+
if (dltbuf->pos_write >= dltbuf->size)
{
dltbuf->pos_write = 0;
@@ -2359,9 +2355,59 @@ int dlt_ringbuffer_put(DltRingBuffer *dltbuf, void *data, uint32_t size)
return 0;
}
+// This function is for writting messages size into buffer
+void dlt_ringbuffer_putMessageSize(DltRingBuffer *dltbuf,uint32_t * data_size, uint32_t unit_size)
+{
+ unsigned char firstByte;
+ unsigned char secondByte;
+ unsigned char thirdByte;
+ unsigned char fourthByte;
+
+ if ((dltbuf->size - dltbuf->pos_write) < unit_size)
+ {
+ firstByte = (*data_size)>>0;
+ secondByte = (*data_size)>>8;
+ thirdByte = (*data_size)>>16;
+ fourthByte = (*data_size)>>24;
+
+ switch(dltbuf->size - dltbuf->pos_write)
+ {
+ case 1:
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write]), &firstByte, 1);
+ dltbuf->pos_write = 0;
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]),&secondByte,1);
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]),&thirdByte,1);
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]),&fourthByte,1);
+ break;
+ case 2:
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]), &firstByte, 1);
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write]),&secondByte,1);
+ dltbuf->pos_write = 0;
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]),&thirdByte,1);
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]),&fourthByte,1);
+ break;
+ case 3:
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]), &firstByte, 1);
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]),&secondByte,1);
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write]),&thirdByte,1);
+ dltbuf->pos_write = 0;
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write++]),&fourthByte,1);
+ break;
+ }
+
+ }
+ else
+ {
+ /* Write length of following data to buffer */
+ memcpy(&(dltbuf->buffer[dltbuf->pos_write]), data_size, unit_size);
+ dltbuf->pos_write +=unit_size;
+ }
+}
+
int dlt_ringbuffer_put3(DltRingBuffer *dltbuf, void *data1, uint32_t size1, void *data2, uint32_t size2, void *data3, uint32_t size3)
{
+
uint32_t sui, part1, part2;
uint32_t total_size;
@@ -2379,28 +2425,21 @@ int dlt_ringbuffer_put3(DltRingBuffer *dltbuf, void *data1, uint32_t size1, void
total_size = size1+size2+size3;
+ dlt_ringbuffer_checkandfreespace(dltbuf, (total_size+sui));
+
if ((total_size+sui)>dltbuf->size)
{
return -1;
- }
-
- dlt_ringbuffer_checkandfreespace(dltbuf, (total_size+sui));
+ }
if (dltbuf->pos_write >= dltbuf->size)
{
dltbuf->pos_write = 0;
}
+ //Write size of data
/* Not enough space for one uint available before end of linear buffer */
- /* Start at begin of linear buffer */
- if ((dltbuf->size - dltbuf->pos_write) < sui)
- {
- dltbuf->pos_write = 0;
- }
-
- /* Write length of following data to buffer */
- memcpy(&(dltbuf->buffer[dltbuf->pos_write]), &total_size, sui);
- dltbuf->pos_write+=sui;
+ dlt_ringbuffer_putMessageSize(dltbuf, &total_size,sui);
if (dltbuf->pos_write >= dltbuf->size)
{
@@ -2511,15 +2550,8 @@ int dlt_ringbuffer_get(DltRingBuffer *dltbuf, void *data, size_t *size)
dltbuf->pos_read = 0;
}
- if ((dltbuf->size - dltbuf->pos_read) < sui)
- {
- dltbuf->pos_read = 0;
- }
-
- /* printf("Reading at offset: %d\n", dltbuf->pos_read); */
-
- memcpy(&tmpsize,&(dltbuf->buffer[dltbuf->pos_read]), sui);
- dltbuf->pos_read += sui;
+ // get size of data
+ tmpsize = dlt_ringbuffer_getMessageSize(dltbuf, sui);
if (dltbuf->pos_read >= dltbuf->size)
{
@@ -2559,6 +2591,66 @@ int dlt_ringbuffer_get(DltRingBuffer *dltbuf, void *data, size_t *size)
return 0;
}
+int dlt_ringbuffer_getMessageSize(DltRingBuffer *dltbuf, uint32_t unit_size)
+{
+ uint32_t temp;
+ uint32_t retVal;
+ unsigned char firstByte = 0;
+ unsigned char secondByte = 0;
+ unsigned char thirdByte = 0;
+ unsigned char fourthByte = 0;
+
+ if ((dltbuf->size - dltbuf->pos_read) < unit_size)
+ {
+ switch(dltbuf->size - dltbuf->pos_read)
+ {
+ case 1:
+ memcpy(&firstByte,&(dltbuf->buffer[dltbuf->pos_read]), 1);
+ dltbuf->pos_read = 0;
+ memcpy(&secondByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ memcpy(&thirdByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ memcpy(&fourthByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ break;
+ case 2:
+ memcpy(&firstByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ memcpy(&secondByte,&(dltbuf->buffer[dltbuf->pos_read]), 1);
+ dltbuf->pos_read = 0;
+ memcpy(&thirdByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ memcpy(&fourthByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ break;
+ case 3:
+ memcpy(&firstByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ memcpy(&secondByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ memcpy(&thirdByte,&(dltbuf->buffer[dltbuf->pos_read]), 1);
+ dltbuf->pos_read = 0;
+ memcpy(&fourthByte,&(dltbuf->buffer[dltbuf->pos_read++]), 1);
+ break;
+ }
+
+ retVal = firstByte;
+
+ temp = secondByte;
+ temp = temp<<8;
+ retVal |= temp;
+
+ temp = thirdByte;
+ temp = temp<<16;
+ retVal |= temp;
+
+ temp = fourthByte;
+ temp = temp<<24;
+ retVal |= temp;
+ }
+ else
+ {
+ /* printf("Reading at offset: %d\n", dltbuf->pos_read); */
+ memcpy(&retVal,&(dltbuf->buffer[dltbuf->pos_read]), unit_size);
+ dltbuf->pos_read += unit_size;
+ }
+
+ return retVal;
+}
+
int dlt_ringbuffer_get_skip(DltRingBuffer *dltbuf)
{
uint32_t tmpsize=0;
@@ -2587,15 +2679,9 @@ int dlt_ringbuffer_get_skip(DltRingBuffer *dltbuf)
{
dltbuf->pos_read = 0;
}
-
- if ((dltbuf->size - dltbuf->pos_read) < sui)
- {
- dltbuf->pos_read = 0;
- }
-
- memcpy(&tmpsize,&(dltbuf->buffer[dltbuf->pos_read]), sui);
- dltbuf->pos_read += sui;
-
+
+ tmpsize = dlt_ringbuffer_getMessageSize(dltbuf, sui);
+
if (dltbuf->pos_read >= dltbuf->size)
{
dltbuf->pos_read = 0;
@@ -2623,6 +2709,7 @@ int dlt_ringbuffer_get_skip(DltRingBuffer *dltbuf)
return 0;
}
+
int dlt_ringbuffer_freespacewrite(DltRingBuffer *dltbuf, uint32_t *freespace)
{
if ((dltbuf==0) || (freespace==0))
@@ -2661,7 +2748,9 @@ int dlt_ringbuffer_freespacewrite(DltRingBuffer *dltbuf, uint32_t *freespace)
int dlt_ringbuffer_checkandfreespace(DltRingBuffer *dltbuf, uint32_t reqspace)
{
uint32_t space_left;
-
+ uint32_t newSize;
+ uint32_t sizeOfNonReadData;
+
if (dltbuf==0)
{
return -1;
@@ -2669,30 +2758,75 @@ int dlt_ringbuffer_checkandfreespace(DltRingBuffer *dltbuf, uint32_t reqspace)
if (dlt_ringbuffer_freespacewrite(dltbuf,&space_left) == -1)
{
- return -1;
+ return -1;
}
/* printf("Now reading at: %d, space_left = %d, req = %d, r=%d, w=%d, count=%d \n",
dltbuf->pos_read,space_left, reqspace, dltbuf->pos_read, dltbuf->pos_write, dltbuf->count); */
- while (space_left<reqspace)
- {
- /* Overwrite, correct read position */
-
- /* Read and skip one element */
- dlt_ringbuffer_get_skip(dltbuf);
-
- /* Space until pos_read */
- if (dlt_ringbuffer_freespacewrite(dltbuf,&space_left) == -1)
- {
- return -1;
- }
-
- /* printf("Overwrite: Now reading at: %d, space_left = %d, req = %d, r=%d, w=%d, count=%d \n",
- dltbuf->pos_read,space_left, reqspace, dltbuf->pos_read, dltbuf->pos_write, dltbuf->count); */
- }
-
- return 0;
+ if(space_left<reqspace)
+ {
+ if(dltbuf->size < dltbuf->maximum_size)
+ {
+ char * extendedBuffer;
+
+ newSize = dltbuf->increasing_size + dltbuf->size;
+ if(newSize > dltbuf->maximum_size)
+ {
+ newSize = dltbuf->maximum_size;
+ }
+
+ extendedBuffer = (char *) malloc(newSize);
+
+
+ if(dltbuf->pos_write > dltbuf->pos_read)
+ {
+ //printf("Buffer read < write \n");
+ sizeOfNonReadData = dltbuf->pos_write - dltbuf->pos_read;
+ memcpy(extendedBuffer,&(dltbuf->buffer[dltbuf->pos_read]),sizeOfNonReadData);
+ free(dltbuf->buffer);
+ dltbuf->buffer = extendedBuffer;
+ dltbuf->pos_read = dltbuf->buffer[0];
+ dltbuf->pos_write = sizeOfNonReadData;
+ dltbuf->size = newSize;
+ }
+ else if(dltbuf->pos_write <= dltbuf->pos_read && dltbuf->count >0)
+ {
+
+ //printf("Buffer read = write \n");
+ sizeOfNonReadData = (dltbuf->size - dltbuf->pos_read) + (dltbuf->pos_write - dltbuf->buffer[0]);
+ memcpy(extendedBuffer,&(dltbuf->buffer[dltbuf->pos_read]),dltbuf->size - dltbuf->pos_read);
+ memcpy(&(extendedBuffer[dltbuf->size - dltbuf->pos_read]),&(dltbuf->buffer[0]),dltbuf->pos_write - dltbuf->buffer[0]);
+ free(dltbuf->buffer);
+ dltbuf->buffer = extendedBuffer;
+ dltbuf->pos_read = dltbuf->buffer[0];
+ dltbuf->pos_write = sizeOfNonReadData;
+ dltbuf->size = newSize;
+ }
+ //printf("Buffer size is increased to %d!\n",newSize);
+ }
+ else
+ {
+ //printf("Maximum buffer size reached!\n");
+ while (space_left<reqspace)
+ {
+ /* Overwrite, correct read position */
+ /* Read and skip one element */
+ dlt_ringbuffer_get_skip(dltbuf);
+
+ /* Space until pos_read */
+ if (dlt_ringbuffer_freespacewrite(dltbuf,&space_left) == -1)
+ {
+ return -1;
+ }
+
+ /* printf("Overwrite: Now reading at: %d, space_left = %d, req = %d, r=%d, w=%d, count=%d \n",
+ dltbuf->pos_read,space_left, reqspace, dltbuf->pos_read, dltbuf->pos_write, dltbuf->count); */
+ }
+ }
+ }
+
+ return 0;
}
#if !defined (__WIN32__)