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 <[email protected]> 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);
