diff options
author | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2011-09-29 15:24:54 +0200 |
---|---|---|
committer | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2011-09-29 15:24:54 +0200 |
commit | c37ecb5031eebc36bfba8be0d741ec858e8898f7 (patch) | |
tree | f5ab98bf34fb9e70522386a8625d54425a6fb5d2 /src | |
parent | 8fd55260f1d572939f185e014aef34a53b50de8b (diff) | |
download | DLT-daemon-c37ecb5031eebc36bfba8be0d741ec858e8898f7.tar.gz |
Fixed filetransfer to use shm status for flow control.
Added new function to dlt user library.
Diffstat (limited to 'src')
-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 |
6 files changed, 65 insertions, 12 deletions
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 |