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 d2e33cb  gh-91: Refactors rsa test bundle
d2e33cb is described below

commit d2e33cbc0f1fe9c368b68664fc98e4dbfbf55f7f
Author: Pepijn Noltes <[email protected]>
AuthorDate: Mon Jan 20 22:01:46 2020 +0100

    gh-91: Refactors rsa test bundle
---
 .../test/src/tst_activator.c                       | 177 ++++++++-------------
 1 file changed, 65 insertions(+), 112 deletions(-)

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 5512903..98612e2 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,144 +19,97 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
-#include <service_tracker_customizer.h>
-#include <service_tracker.h>
 
-#include "bundle_activator.h"
-#include "bundle_context.h"
-#include "service_registration.h"
-#include "service_reference.h"
-#include "celix_errno.h"
+#include <celix_api.h>
 
 #include "tst_service.h"
 #include "calculator_service.h"
 #include <unistd.h>
 
-
 struct activator {
-       celix_bundle_context_t *context;
-       struct tst_service serv;
-       service_registration_t * reg;
-
-       service_tracker_customizer_t *cust;
-       service_tracker_t *tracker;
-       calculator_service_t *calc;
-};
-
-static celix_status_t addCalc(void * handle, service_reference_pt reference, 
void * service);
-static celix_status_t removeCalc(void * handle, service_reference_pt 
reference, void * service);
-static int test(void *handle);
-
-celix_status_t bundleActivator_create(celix_bundle_context_t *context, void 
**out) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator *act = calloc(1, sizeof(*act));
-       if (act != NULL) {
-               act->context = context;
-               act->serv.handle = act;
-               act->serv.test = test;
-
-               status = serviceTrackerCustomizer_create(act, NULL, addCalc, 
NULL, removeCalc, &act->cust);
-               status = CELIX_DO_IF(status, serviceTracker_create(context, 
CALCULATOR_SERVICE, act->cust, &act->tracker));
-
-       } else {
-               status = CELIX_ENOMEM;
-       }
-
-       if (status == CELIX_SUCCESS) {
-               *out = act;
-       } else if (act != NULL) {
-               if (act->cust != NULL) {
-                       free(act->cust);
-                       act->cust = NULL;
-               }
-               if (act->tracker != NULL) {
-                       serviceTracker_destroy(act->tracker);
-                       act->tracker = NULL;
-               }
-               free(act);
-       }
-
-       return CELIX_SUCCESS;
-}
-
-static celix_status_t addCalc(void * handle, service_reference_pt reference, 
void * service) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator * act = handle;
-       act->calc = service;
-       return status;
-}
-
-static celix_status_t removeCalc(void * handle, service_reference_pt 
reference, void * service) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator * act = handle;
-       if (act->calc == service) {
-               act->calc = NULL;
-       }
-       return status;
-
-}
-
-celix_status_t bundleActivator_start(void * userData, celix_bundle_context_t 
*context) {
-    celix_status_t status = CELIX_SUCCESS;
-       struct activator * act = userData;
-
-       act->reg = NULL;
-       status = bundleContext_registerService(context, (char 
*)TST_SERVICE_NAME, &act->serv, NULL, &act->reg);
-
-       status = CELIX_DO_IF(status, serviceTracker_open(act->tracker));
-
-
-       return status;
-}
+    long svcId;
+    struct tst_service testSvc;
 
+    long trackerId;
 
-celix_status_t bundleActivator_stop(void * userData, celix_bundle_context_t 
*context) {
-    celix_status_t status = CELIX_SUCCESS;
-       struct activator * act = userData;
-
-       status = serviceRegistration_unregister(act->reg);
-       status = CELIX_DO_IF(status, serviceTracker_close(act->tracker));
-
-       return status;
-}
+    pthread_mutex_t mutex; //protects below
+    calculator_service_t *calc;
+};
 
-celix_status_t bundleActivator_destroy(void * userData, celix_bundle_context_t 
*context) {
-       struct activator *act = userData;
-       if (act != NULL) {
-               if (act->tracker != NULL) {
-                       serviceTracker_destroy(act->tracker);
-                       act->tracker = NULL;
-               }
-               free(act);
-       }
-       return CELIX_SUCCESS;
+static void bndSetCalc(void* handle, void* svc) {
+    struct activator * act = handle;
+    pthread_mutex_lock(&act->mutex);
+    act->calc = svc;
+    pthread_mutex_unlock(&act->mutex);
 }
 
-static int test(void *handle) {
-       int status = 0;
-       struct activator *act = handle;
+static int bndTest(void *handle) {
+    int status = 0;
+    struct activator *act = handle;
 
-       double result = -1.0;
+    double result = -1.0;
 
     int retries = 40;
 
-    while (act->calc == NULL) {
+    pthread_mutex_lock(&act->mutex);
+    calculator_service_t *local = act->calc;
+    pthread_mutex_unlock(&act->mutex);
+
+    while (local == NULL && retries > 0) {
         printf("Waiting for calc service .. %d\n", retries);
         usleep(100000);
         --retries;
+        pthread_mutex_lock(&act->mutex);
+        local = act->calc;
+        pthread_mutex_unlock(&act->mutex);
     }
 
+
+    pthread_mutex_lock(&act->mutex);
     int rc = 1;
     if (act->calc != NULL) {
-               rc = act->calc->sqrt(act->calc->calculator, 4, &result);
+        rc = act->calc->sqrt(act->calc->calculator, 4, &result);
         printf("calc result is %f\n", result);
     } else {
         printf("calc not ready\n");
     }
+    pthread_mutex_unlock(&act->mutex);
 
-       if (rc != 0 || result != 2.0) {
-               status = 1;
-       }
-       return status;
+
+    if (rc != 0 || result != 2.0) {
+        status = 1;
+    }
+    return status;
 }
+
+static celix_status_t bndStart(struct activator *act, celix_bundle_context_t* 
ctx) {
+    //initialize service struct
+    act->testSvc.handle = act;
+    act->testSvc.test = bndTest;
+
+    //create mutex
+    pthread_mutex_init(&act->mutex, NULL);
+
+    //track (remote) service
+    {
+        celix_service_tracking_options_t opts = 
CELIX_EMPTY_SERVICE_TRACKING_OPTIONS;
+        opts.set = bndSetCalc;
+        opts.callbackHandle = act;
+        opts.filter.serviceName = CALCULATOR_SERVICE;
+        opts.filter.ignoreServiceLanguage = true;
+        act->trackerId = celix_bundleContext_trackServicesWithOptions(ctx, 
&opts);
+    }
+
+    //register test service
+    act->svcId = celix_bundleContext_registerService(ctx, &act->testSvc, 
TST_SERVICE_NAME, NULL);
+    return CELIX_SUCCESS;
+}
+
+static celix_status_t bndStop(struct activator *act, celix_bundle_context_t* 
ctx) {
+    celix_bundleContext_unregisterService(ctx, act->svcId);
+    celix_bundleContext_stopTracker(ctx, act->trackerId);
+    pthread_mutex_destroy(&act->mutex);
+    return CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(struct activator, bndStart, bndStop);
\ No newline at end of file

Reply via email to