diff options
-rw-r--r-- | include/dlt/dlt_shm.h | 21 | ||||
-rwxr-xr-x | include/dlt/dlt_user.h | 10 | ||||
-rw-r--r-- | src/lib/dlt_filetransfer.c | 28 | ||||
-rwxr-xr-x | src/lib/dlt_user.c | 8 | ||||
-rw-r--r-- | src/shared/dlt_shm.c | 27 | ||||
-rw-r--r-- | src/tests/dlt-test-filetransfer-file | 1 | ||||
-rw-r--r-- | src/tests/dlt-test-filetransfer-image.png | bin | 0 -> 49105 bytes | |||
-rw-r--r-- | src/tests/dlt-test-filetransfer.c | 13 |
8 files changed, 96 insertions, 12 deletions
diff --git a/include/dlt/dlt_shm.h b/include/dlt/dlt_shm.h index fc37117..e3608c3 100644 --- a/include/dlt/dlt_shm.h +++ b/include/dlt/dlt_shm.h @@ -177,6 +177,27 @@ extern void dlt_shm_status(DltShm *buf); extern int dlt_shm_free_client(DltShm *buf); /** + * Returns the total size of the shm. + * @param buf pointer to shm structure + * @return size of the shared memory. + */ +extern int dlt_shm_get_total_size(DltShm *buf); + +/** + * Returns the used size in the shm. + * @param buf pointer to shm structure + * @return size of the shared memory. + */ +extern int dlt_shm_get_used_size(DltShm *buf); + +/** + * Returns the number of messages in the shm. + * @param buf pointer to shm structure + * @return size of the shared memory. + */ +extern int dlt_shm_get_message_count(DltShm *buf); + +/** * Deinitialise the shared memory on the server side. * @param buf pointer to shm structure * @return negative value if there was an error diff --git a/include/dlt/dlt_user.h b/include/dlt/dlt_user.h index 1ea46cc..f2a1400 100755 --- a/include/dlt/dlt_user.h +++ b/include/dlt/dlt_user.h @@ -540,6 +540,16 @@ int dlt_log_raw(DltContext *handle,DltLogLevelType loglevel, void *data,uint16_t */ int dlt_forward_msg(void *msgdata,size_t size); +/** + * Get the total size and available size of the shared memory buffer between daemon and applications. + * This information is useful to control the flow control between applications and daemon. + * For example only 50% of the buffer should be used for file transfer. + * @param total_size total size of buffer in bytes + * @param used_size used size of buffer in bytes + * @return negative value if there was an error + */ +int dlt_user_check_buffer(int *total_size, int *used_size); + #ifdef __cplusplus } #endif diff --git a/src/lib/dlt_filetransfer.c b/src/lib/dlt_filetransfer.c index a78c418..935573d 100644 --- a/src/lib/dlt_filetransfer.c +++ b/src/lib/dlt_filetransfer.c @@ -95,14 +95,24 @@ int isFile (const char* file) */ void doTimeout(int timeout) { - if(timeout>MIN_TIMEOUT) - { - usleep(timeout * 1000); - } - else + int total_size, used_size; + + dlt_user_check_buffer(&total_size, &used_size); + + /* sleep only if more than 50% of buffer used */ + if((total_size - used_size) < (total_size/2)) { - usleep(MIN_TIMEOUT * 1000); - } + printf("Wait %d of %d already used\n",used_size,total_size); + + if(timeout>MIN_TIMEOUT) + { + usleep(timeout * 1000); + } + else + { + usleep(MIN_TIMEOUT * 1000); + } + } } //!Deletes the given file @@ -298,8 +308,8 @@ int dlt_user_log_file_header(DltContext *fileContext,const char *filename){ */ int dlt_user_log_file_data(DltContext *fileContext,const char *filename, int packageToTransfer, int timeout){ FILE *file; - int i,pkgNumber; - long positionIndicator,readBytes; + int pkgNumber; + long readBytes; if(isFile(filename)) { diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 4bab5fc..391b167 100755 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -2743,3 +2743,11 @@ int dlt_user_log_send_overflow(void) return ((ret==DLT_RETURN_OK)?0:-1); } +int dlt_user_check_buffer(int *total_size, int *used_size) +{ + *total_size = dlt_shm_get_total_size(&(dlt_user.dlt_shm)); + *used_size = dlt_shm_get_used_size(&(dlt_user.dlt_shm)); + + return 0; /* ok */ +} + diff --git a/src/shared/dlt_shm.c b/src/shared/dlt_shm.c index e3ec7c6..11993d7 100644 --- a/src/shared/dlt_shm.c +++ b/src/shared/dlt_shm.c @@ -229,6 +229,33 @@ void dlt_shm_status(DltShm *buf) } +int dlt_shm_get_total_size(DltShm *buf) +{ + return buf->size; +} + +int dlt_shm_get_used_size(DltShm *buf) +{ + int write, read, count; + + write = ((int*)(buf->shm))[0]; + read = ((int*)(buf->shm))[1]; + count = ((int*)(buf->shm))[2]; + + if(count == 0) + return 0; + + if(write>read) + return (write - read); + + return (buf->size - read + write); +} + +int dlt_shm_get_message_count(DltShm *buf) +{ + return ((int*)(buf->shm))[2]; +} + int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const unsigned char *data2,unsigned int size2,const unsigned char *data3,unsigned int size3) { int write, read, count; diff --git a/src/tests/dlt-test-filetransfer-file b/src/tests/dlt-test-filetransfer-file new file mode 100644 index 0000000..48841a2 --- /dev/null +++ b/src/tests/dlt-test-filetransfer-file @@ -0,0 +1 @@ +!!!HelloWorld!!! diff --git a/src/tests/dlt-test-filetransfer-image.png b/src/tests/dlt-test-filetransfer-image.png Binary files differnew file mode 100644 index 0000000..b969d9d --- /dev/null +++ b/src/tests/dlt-test-filetransfer-image.png diff --git a/src/tests/dlt-test-filetransfer.c b/src/tests/dlt-test-filetransfer.c index a3418eb..7c43058 100644 --- a/src/tests/dlt-test-filetransfer.c +++ b/src/tests/dlt-test-filetransfer.c @@ -16,16 +16,23 @@ char *file3; //!Just some variables int i,countPackages, transferResult, dltResult; +extern int testF1P1(); +extern int testF1P2(); +extern int testF2P1(); +extern int testF2P2(); +extern int testF3P1(); +extern int testF3P2(); +extern int testF3P3(); //!Main program dlt-test-filestransfer starts here int main(void) { //First file contains some text - file1 = "/usr/share/dlt-filetransfer/dlt-test-filetransfer-file"; + file1 = "dlt-test-filetransfer-file"; //Second file is a picture - file2 = "/usr/share/dlt-filetransfer/dlt-test-filetransfer-image.png"; + file2 = "dlt-test-filetransfer-image.png"; //Third file doesn't exist. Just to test the reaction when the file isn't available. - file3 = "/usr/share/dlt-filetransfer/dlt-test-filetransfer-doesntExist"; + file3 = "dlt-test-filetransfer-doesntExist"; //Register the application at the dlt-daemon |