summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-09-29 15:24:54 +0200
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-09-29 15:24:54 +0200
commitc37ecb5031eebc36bfba8be0d741ec858e8898f7 (patch)
treef5ab98bf34fb9e70522386a8625d54425a6fb5d2 /src
parent8fd55260f1d572939f185e014aef34a53b50de8b (diff)
downloadDLT-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.c28
-rwxr-xr-xsrc/lib/dlt_user.c8
-rw-r--r--src/shared/dlt_shm.c27
-rw-r--r--src/tests/dlt-test-filetransfer-file1
-rw-r--r--src/tests/dlt-test-filetransfer-image.pngbin0 -> 49105 bytes
-rw-r--r--src/tests/dlt-test-filetransfer.c13
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
new file mode 100644
index 0000000..b969d9d
--- /dev/null
+++ b/src/tests/dlt-test-filetransfer-image.png
Binary files differ
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