You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2020/03/03 20:10:54 UTC

[celix] branch feature/slow_rsa created (now 3f72835)

This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a change to branch feature/slow_rsa
in repository https://gitbox.apache.org/repos/asf/celix.git.


      at 3f72835  Refactors the RSA curl read callback function.

This branch includes the following new commits:

     new 3f72835  Refactors the RSA curl read callback function.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[celix] 01/01: Refactors the RSA curl read callback function.

Posted by pn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/slow_rsa
in repository https://gitbox.apache.org/repos/asf/celix.git

commit 3f728350a50ec7e8be20b00b5110d0a522db2e1a
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Tue Mar 3 21:10:35 2020 +0100

    Refactors the RSA curl read callback function.
    
    It was apparently copying the data byte for byte.
---
 .../src/remote_service_admin_dfi.c                 | 46 +++++++++++----------
 .../test/src/rsa_client_server_tests.cpp           | 32 ++++++++-------
 .../test/src/tst_activator.c                       | 48 ++++++++++++++++++----
 3 files changed, 82 insertions(+), 44 deletions(-)

diff --git a/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_dfi.c b/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_dfi.c
index eb45cf8..9fd6015 100644
--- a/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_dfi.c
+++ b/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_dfi.c
@@ -28,6 +28,7 @@
 #include <curl/curl.h>
 
 #include <jansson.h>
+#include <assert.h>
 #include "json_serializer.h"
 #include "utils.h"
 
@@ -76,12 +77,13 @@ struct remote_service_admin {
 
 struct post {
     const char *readptr;
-    int size;
+    size_t size;
+    size_t read;
 };
 
 struct get {
     char *writeptr;
-    int size;
+    size_t size;
 };
 
 #define OSGI_RSA_REMOTE_PROXY_FACTORY   "remote_proxy_factory"
@@ -700,16 +702,16 @@ celix_status_t remoteServiceAdmin_removeImportedService(remote_service_admin_t *
     return status;
 }
 
-
 static celix_status_t remoteServiceAdmin_send(void *handle, endpoint_description_t *endpointDescription, char *request, char **reply, int* replyStatus) {
     remote_service_admin_t * rsa = handle;
     struct post post;
     post.readptr = request;
     post.size = strlen(request);
+    post.read = 0;
 
     struct get get;
     get.size = 0;
-    get.writeptr = malloc(1);
+    get.writeptr = NULL;
 
     const char *serviceUrl = celix_properties_get(endpointDescription->properties, (char*) RSA_DFI_ENDPOINT_URL, NULL);
     char url[256];
@@ -760,35 +762,37 @@ static celix_status_t remoteServiceAdmin_send(void *handle, endpoint_description
     return status;
 }
 
-static size_t remoteServiceAdmin_readCallback(void *ptr, size_t size, size_t nmemb, void *userp) {
+static size_t remoteServiceAdmin_readCallback(void *voidBuffer, size_t size, size_t nmemb, void *userp) {
     struct post *post = userp;
+    char *buffer = voidBuffer;
 
-    if (post->size) {
-        *(char *) ptr = post->readptr[0];
-        post->readptr++;
-        post->size--;
-        return 1;
+    if (post->read == post->size) {
+        return 0;
+    } else {
+        size_t buffSize = size * nmemb;
+        size_t startRead = post->read;
+        for (size_t i = 0; i < buffSize && post->size != post->read; ++i) {
+            buffer[i] = post->readptr[post->read++];
+        }
+        return post->read - startRead;
     }
-
-    return 0;
 }
 
 static size_t remoteServiceAdmin_write(void *contents, size_t size, size_t nmemb, void *userp) {
     size_t realsize = size * nmemb;
     struct get *mem = (struct get *)userp;
 
-    mem->writeptr = realloc(mem->writeptr, mem->size + realsize + 1);
+    mem->writeptr =malloc(realsize + 1);
     if (mem->writeptr == NULL) {
         /* out of memory! */
-        printf("not enough memory (realloc returned NULL)");
-        exit(EXIT_FAILURE);
+        fprintf(stderr, "not enough memory (malloc returned NULL)");
+        return 0;
+    } else {
+        memcpy(&(mem->writeptr[mem->size]), contents, realsize);
+        mem->size += realsize;
+        mem->writeptr[mem->size] = 0;
+        return realsize;
     }
-
-    memcpy(&(mem->writeptr[mem->size]), contents, realsize);
-    mem->size += realsize;
-    mem->writeptr[mem->size] = 0;
-
-    return realsize;
 }
 
 
diff --git a/bundles/remote_services/remote_service_admin_dfi/test/src/rsa_client_server_tests.cpp b/bundles/remote_services/remote_service_admin_dfi/test/src/rsa_client_server_tests.cpp
index 3622235..e4b9452 100644
--- a/bundles/remote_services/remote_service_admin_dfi/test/src/rsa_client_server_tests.cpp
+++ b/bundles/remote_services/remote_service_admin_dfi/test/src/rsa_client_server_tests.cpp
@@ -75,29 +75,31 @@ extern "C" {
         bool discovered = tst->isCalcDiscovered(tst->handle);
         CHECK_TRUE(discovered);
 
-//        ok = tst->testCalculator(tst->handle);
-//        CHECK_TRUE(ok);
+        ok = tst->testCalculator(tst->handle);
+        CHECK_TRUE(ok);
 
         discovered = tst->isRemoteExampleDiscovered(tst->handle);
         CHECK_TRUE(discovered);
 
-//        ok = tst->testRemoteString(tst->handle);
-//        CHECK_TRUE(ok);
-//
-//        ok = tst->testRemoteConstString(tst->handle);
-//        CHECK_TRUE(ok);
+        ok = tst->testRemoteComplex(tst->handle);
+        CHECK_TRUE(ok);
+
+        ok = tst->testRemoteAction(tst->handle);
+        CHECK_TRUE(ok);
 
         ok = tst->testRemoteNumbers(tst->handle);
         CHECK_TRUE(ok);
 
-//        ok = tst->testRemoteEnum(tst->handle);
-//        CHECK_TRUE(ok);
-//
-//        ok = tst->testRemoteAction(tst->handle);
-//        CHECK_TRUE(ok);
-//
-//        ok = tst->testRemoteComplex(tst->handle);
-//        CHECK_TRUE(ok);
+        ok = tst->testRemoteString(tst->handle);
+        CHECK_TRUE(ok);
+
+        ok = tst->testRemoteConstString(tst->handle);
+        CHECK_TRUE(ok);
+
+#ifndef __APPLE__ //TODO fix for apple dfi handling, see issue #91
+        ok = tst->testRemoteEnum(tst->handle);
+        CHECK_TRUE(ok);
+#endif
     };
 
     static void test(void) {
diff --git a/bundles/remote_services/remote_service_admin_dfi/test/src/tst_activator.c b/bundles/remote_services/remote_service_admin_dfi/test/src/tst_activator.c
index 5894c73..5c48d18 100644
--- a/bundles/remote_services/remote_service_admin_dfi/test/src/tst_activator.c
+++ b/bundles/remote_services/remote_service_admin_dfi/test/src/tst_activator.c
@@ -19,6 +19,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 
 #include <celix_api.h>
 
@@ -27,6 +28,31 @@
 #include "remote_example.h"
 #include <unistd.h>
 
+static double diffBetweenTimeSpecs(struct timespec *b, struct timespec *e)
+{
+    struct timespec diff;
+    if ((e->tv_nsec - b->tv_nsec) < 0) {
+        diff.tv_sec = e->tv_sec - b->tv_sec - 1;
+        diff.tv_nsec = e->tv_nsec - b->tv_nsec + 1000000000;
+    } else {
+        diff.tv_sec = e->tv_sec - b->tv_sec;
+        diff.tv_nsec = e->tv_nsec - b->tv_nsec;
+    }
+
+    return ((double)diff.tv_sec) + diff.tv_nsec /  1000000000.0;
+}
+
+//note exports double diff variable (time in ms)
+#define TIMED_EXPR(expr) \
+    double diff; \
+    do { \
+        struct timespec _begin, _end; \
+        clock_gettime(CLOCK_MONOTONIC, &_begin); \
+        expr; \
+        clock_gettime(CLOCK_MONOTONIC, &_end); \
+        diff = diffBetweenTimeSpecs(&_begin, &_end) * 1000.0; \
+    } while(0)
+
 struct activator {
     long svcId;
     struct tst_service testSvc;
@@ -105,8 +131,8 @@ static bool bndTestCalculator(void *handle) {
     pthread_mutex_lock(&act->mutex);
     int rc = 1;
     if (act->calc != NULL) {
-        rc = act->calc->sqrt(act->calc->handle, 4, &result);
-        printf("calc result is %f\n", result);
+        TIMED_EXPR(rc = act->calc->sqrt(act->calc->handle, 4, &result));
+        printf("calc result is %f. Call took %f ms\n", result, diff);
     } else {
         printf("calc not ready\n");
     }
@@ -121,10 +147,11 @@ static bool bndTestRemoteString(void *handle) {
 
     pthread_mutex_lock(&act->mutex);
     if (act->remoteExample != NULL) {
-        //test string call with taking ownership
+        //test string Call with taking ownership
         char *tmp = strndup("test1", 1024);
         char *result = NULL;
-        act->remoteExample->setName1(act->remoteExample->handle, tmp, &result);
+        TIMED_EXPR(act->remoteExample->setName1(act->remoteExample->handle, tmp, &result));
+        printf("Call setName1 took %f ms\n", diff);
         //note setName1 should take ownership of tmp, so no free(tmp) needed.
         ok = strncmp("test1", result, 1024) == 0;
         free(result);
@@ -146,7 +173,8 @@ static bool bndTestRemoteConstString(void *handle) {
         //test pow
         const char *name = "name2";
         char *result = NULL;
-        act->remoteExample->setName2(act->remoteExample->handle, name, &result);
+        TIMED_EXPR(act->remoteExample->setName2(act->remoteExample->handle, name, &result));
+        printf("Call setName2 took %f ms\n", diff);
         ok = strncmp(result, "name2", 1024) == 0;
         free(result);
     } else {
@@ -168,14 +196,16 @@ static bool bndTestRemoteNumbers(void *handle) {
         if (ok) {
             //test pow
             double p;
-            act->remoteExample->pow(act->remoteExample->handle, 2, 2, &p);
+            TIMED_EXPR(act->remoteExample->pow(act->remoteExample->handle, 2, 2, &p));
+            printf("Call pow took %f ms\n", diff);
             ok = (p == 4.0);
         }
 
         if (ok) {
             //test fib
             int32_t f;
-            act->remoteExample->fib(act->remoteExample->handle, 4, &f);
+            TIMED_EXPR(act->remoteExample->fib(act->remoteExample->handle, 4, &f));
+            printf("Call fib took %f ms\n", diff);
             ok = (f == 3);
         }
     } else {
@@ -236,7 +266,9 @@ static bool bndTestRemoteComplex(void *handle) {
        exmpl.name = "name";
        exmpl.e = ENUM_EXAMPLE_VAL3;
        struct complex_output_example* result = NULL;
-       int rc = act->remoteExample->setComplex(act->remoteExample->handle, &exmpl, &result);
+       int rc;
+       TIMED_EXPR(rc = act->remoteExample->setComplex(act->remoteExample->handle, &exmpl, &result));
+       printf("Call setComplex took %f ms\n", diff);
        ok = rc == 0 && result->pow == 8 && result->fib == 5 && strncmp("name", result->name, 64) == 0;
        if (rc == 0) {
            free(result->name);