This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/celix.git
The following commit(s) were added to refs/heads/develop by this push: new 8c956d8 Refactors curl read and add code for manual unrolling. (#160) 8c956d8 is described below commit 8c956d842a59fb9d5e447ff26d8acd25ae3bb837 Author: Pepijn Noltes <pepijnnol...@gmail.com> AuthorDate: Wed Mar 4 20:11:46 2020 +0100 Refactors curl read and add code for manual unrolling. (#160) * Refactors curl read and add code for manual unrolling. Note the manual unrolling does not have the desired effect on OSX, so for now it its commented out. * Replaces loop with memcpy * Applying rsa patch for curl sharing of data, cookie & dns * Removes unused (empty) macro --- .../src/remote_service_admin_dfi.c | 93 +++++++++++++++++++--- 1 file changed, 82 insertions(+), 11 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 c95bdf4..71f337a 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 @@ -72,6 +72,10 @@ struct remote_service_admin { struct mg_context *ctx; FILE *logFile; + void *curlShare; + pthread_mutex_t curlMutexConnect; + pthread_mutex_t curlMutexCookie; + pthread_mutex_t curlMutexDns; }; struct post { @@ -107,6 +111,47 @@ static size_t remoteServiceAdmin_readCallback(void *ptr, size_t size, size_t nme static size_t remoteServiceAdmin_write(void *contents, size_t size, size_t nmemb, void *userp); static void remoteServiceAdmin_log(remote_service_admin_t *admin, int level, const char *file, int line, const char *msg, ...); +static void remoteServiceAdmin_curlshare_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess, void *userptr) +{ + (void)handle; + (void)data; + (void)laccess; + remote_service_admin_t *rsa = userptr; + switch(data) { + case CURL_LOCK_DATA_CONNECT: + pthread_mutex_lock(&rsa->curlMutexConnect); + break; + case CURL_LOCK_DATA_COOKIE: + pthread_mutex_lock(&rsa->curlMutexCookie); + break; + case CURL_LOCK_DATA_DNS: + pthread_mutex_lock(&rsa->curlMutexDns); + break; + default: + break; + } +} + +static void remoteServiceAdmin_curlshare_unlock(CURL *handle, curl_lock_data data, void *userptr) +{ + (void)handle; + (void)data; + remote_service_admin_t *rsa = userptr; + switch(data) { + case CURL_LOCK_DATA_CONNECT: + pthread_mutex_unlock(&rsa->curlMutexConnect); + break; + case CURL_LOCK_DATA_COOKIE: + pthread_mutex_unlock(&rsa->curlMutexCookie); + break; + case CURL_LOCK_DATA_DNS: + pthread_mutex_unlock(&rsa->curlMutexDns); + break; + default: + break; + } +} + celix_status_t remoteServiceAdmin_create(celix_bundle_context_t *context, remote_service_admin_t **admin) { celix_status_t status = CELIX_SUCCESS; @@ -153,6 +198,30 @@ celix_status_t remoteServiceAdmin_create(celix_bundle_context_t *context, remote free(detectedIp); } + (*admin)->curlShare = curl_share_init(); + curl_share_setopt((*admin)->curlShare, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT); + curl_share_setopt((*admin)->curlShare, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); + curl_share_setopt((*admin)->curlShare, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); + curl_share_setopt((*admin)->curlShare, CURLSHOPT_USERDATA, *admin); + + curl_share_setopt((*admin)->curlShare, CURLSHOPT_LOCKFUNC, remoteServiceAdmin_curlshare_lock); + curl_share_setopt((*admin)->curlShare, CURLSHOPT_UNLOCKFUNC, remoteServiceAdmin_curlshare_unlock); + + if(status == CELIX_SUCCESS && pthread_mutex_init(&(*admin)->curlMutexConnect, NULL) != 0) { + fprintf(stderr, "Could not initialize mutex connect\n"); + status = EPERM; + } + + if(status == CELIX_SUCCESS && pthread_mutex_init(&(*admin)->curlMutexCookie, NULL) != 0) { + fprintf(stderr, "Could not initialize mutex cookie\n"); + status = EPERM; + } + + if(status == CELIX_SUCCESS && pthread_mutex_init(&(*admin)->curlMutexDns, NULL) != 0) { + fprintf(stderr, "Could not initialize mutex dns\n"); + status = EPERM; + } + // Prepare callbacks structure. We have only one callback, the rest are NULL. struct mg_callbacks callbacks; memset(&callbacks, 0, sizeof(callbacks)); @@ -208,6 +277,10 @@ celix_status_t remoteServiceAdmin_destroy(remote_service_admin_t **admin) free((*admin)->ip); free((*admin)->port); free(*admin); + curl_share_cleanup((*admin)->curlShare); + pthread_mutex_destroy(&(*admin)->curlMutexConnect); + pthread_mutex_destroy(&(*admin)->curlMutexCookie); + pthread_mutex_destroy(&(*admin)->curlMutexDns); *admin = NULL; @@ -749,6 +822,7 @@ static celix_status_t remoteServiceAdmin_send(void *handle, endpoint_description curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, remoteServiceAdmin_write); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&get); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (curl_off_t)post.size); + curl_easy_setopt(curl, CURLOPT_SHARE, rsa->curlShare); //logHelper_log(rsa->loghelper, OSGI_LOGSERVICE_DEBUG, "RSA: Performing curl post\n"); res = curl_easy_perform(curl); @@ -763,18 +837,15 @@ static celix_status_t remoteServiceAdmin_send(void *handle, endpoint_description static size_t remoteServiceAdmin_readCallback(void *voidBuffer, size_t size, size_t nmemb, void *userp) { struct post *post = userp; - char *buffer = voidBuffer; - - 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; + size_t buffSize = size * nmemb; + size_t readSize = post->size - post->read; + if (readSize > buffSize) { + readSize = buffSize; } + void *startRead = (void*)(post->readptr + post->read); + memcpy(voidBuffer, startRead, readSize); + post->read += readSize; + return readSize; } static size_t remoteServiceAdmin_write(void *contents, size_t size, size_t nmemb, void *userp) {