You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by er...@apache.org on 2018/11/01 20:40:44 UTC

[2/2] celix git commit: Replaced celix-map with std::map

Replaced celix-map with std::map


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/3009e647
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/3009e647
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/3009e647

Branch: refs/heads/nanomsg
Commit: 3009e64705e1be606ca308ffc7ec7c0633dfde77
Parents: 95892a8
Author: Erjan Altena <er...@gmail.com>
Authored: Thu Nov 1 21:40:24 2018 +0100
Committer: Erjan Altena <er...@gmail.com>
Committed: Thu Nov 1 21:40:24 2018 +0100

----------------------------------------------------------------------
 .../src/pubsub_nanomsg_admin.cc                 | 57 +++++++++++---------
 .../src/pubsub_nanomsg_admin.h                  | 11 +++-
 .../src/pubsub_nanomsg_topic_receiver.h         |  3 +-
 3 files changed, 44 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/3009e647/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.cc
----------------------------------------------------------------------
diff --git a/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.cc b/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.cc
index c10431f..9fe91d9 100644
--- a/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.cc
+++ b/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.cc
@@ -28,7 +28,6 @@
 #include <netdb.h>
 #include <ifaddrs.h>
 #include <pubsub_endpoint.h>
-#include <pubsub_serializer.h>
 
 #include "pubsub_utils.h"
 #include "pubsub_nanomsg_admin.h"
@@ -105,7 +104,7 @@ pubsub_nanomsg_admin::pubsub_nanomsg_admin(celix_bundle_context_t *_ctx, log_hel
     qosSampleScore = celix_bundleContext_getPropertyAsDouble(ctx, PSA_NANOMSG_QOS_SAMPLE_SCORE_KEY, PSA_NANOMSG_DEFAULT_QOS_SAMPLE_SCORE);
     qosControlScore = celix_bundleContext_getPropertyAsDouble(ctx, PSA_NANOMSG_QOS_CONTROL_SCORE_KEY, PSA_NANOMSG_DEFAULT_QOS_CONTROL_SCORE);
 
-    serializers.map = hashMap_create(nullptr, nullptr, nullptr, nullptr);
+    //serializers.map = hashMap_create(nullptr, nullptr, nullptr, nullptr);
 
     topicSenders.map = hashMap_create(utils_stringHash, nullptr, utils_stringEquals, nullptr);
 
@@ -145,10 +144,9 @@ pubsub_nanomsg_admin::~pubsub_nanomsg_admin() {
 
     {
         std::lock_guard<std::mutex> lock(serializers.mutex);
-        hash_map_iterator_t iter = hashMapIterator_construct(serializers.map);
-        while (hashMapIterator_hasNext(&iter)) {
-            auto *entry = static_cast<psa_nanomsg_serializer_entry_t*>(hashMapIterator_nextValue(&iter));
-            free(entry);
+        // todo: do not use pointer but type in map
+        for(auto kv: serializers.map) {
+            free(kv.second);
         }
     }
 
@@ -158,8 +156,6 @@ pubsub_nanomsg_admin::~pubsub_nanomsg_admin() {
 
     hashMap_destroy(discoveredEndpoints.map, false, false);
 
-    hashMap_destroy(serializers.map, false, false);
-
     free(ipAddress);
 
 }
@@ -256,13 +252,13 @@ void pubsub_nanomsg_admin::addSerializerSvc(void *svc, const celix_properties_t
 
     {
         std::lock_guard<std::mutex> lock(serializers.mutex);
-        auto *entry = static_cast<psa_nanomsg_serializer_entry_t*>(hashMap_get(serializers.map, (void*)svcId));
-        if (entry == nullptr) {
-            entry = static_cast<psa_nanomsg_serializer_entry_t*>(calloc(1, sizeof(*entry)));
+        auto it = serializers.map.find(svcId);
+        if (it == serializers.map.end()) {
+            auto entry = static_cast<psa_nanomsg_serializer_entry_t*>(calloc(1, sizeof(psa_nanomsg_serializer_entry_t)));
             entry->serType = serType;
             entry->svcId = svcId;
             entry->svc = static_cast<pubsub_serializer_service_t*>(svc);
-            hashMap_put(serializers.map, (void*)svcId, entry);
+            serializers.map[svcId] = entry;
         }
     }
 }
@@ -278,7 +274,13 @@ void pubsub_nanomsg_admin::removeSerializerSvc(void */*svc*/, const celix_proper
     // Note that it is the responsibility of the topology manager to create new topic senders/receivers
 
     std::lock_guard<std::mutex> lock(serializers.mutex);
-    auto *entry = static_cast<psa_nanomsg_serializer_entry_t*>(hashMap_remove(serializers.map, (void*)svcId));
+
+    psa_nanomsg_serializer_entry_t* entry = nullptr;
+    auto kv = serializers.map.find(svcId);
+    if (kv != serializers.map.end()) {
+        entry = kv->second;
+    }
+    serializers.map.erase(svcId);
     if (entry != nullptr) {
         {
             std::lock_guard<std::mutex> senderLock(topicSenders.mutex);
@@ -365,8 +367,13 @@ celix_status_t pubsub_nanomsg_admin::setupTopicSender(const char *scope, const c
     std::lock_guard<std::mutex> topicSenderLock(topicSenders.mutex);
     sender = static_cast<pubsub_nanomsg_topic_sender_t *>(hashMap_get(topicSenders.map, key));
     if (sender == nullptr) {
-        auto *serEntry = static_cast<psa_nanomsg_serializer_entry_t *>(hashMap_get(serializers.map,
-                                                                                   (void *) serializerSvcId));
+        //auto *serEntry = static_cast<psa_nanomsg_serializer_entry_t *>(hashMap_get(serializers.map,
+        //                                                                           (void *) serializerSvcId));
+        psa_nanomsg_serializer_entry_t *serEntry = nullptr;
+        auto kv = serializers.map.find(serializerSvcId);
+        if (kv != serializers.map.end()) {
+            serEntry = kv->second;
+        }
         if (serEntry != nullptr) {
             sender = pubsub_nanoMsgTopicSender_create(ctx, log, scope, topic, serializerSvcId, serEntry->svc, ipAddress,
                                                       basePort, maxPort);
@@ -437,16 +444,16 @@ celix_status_t pubsub_nanomsg_admin::setupTopicReceiver(const char *scope, const
         std::lock_guard<std::mutex> topicReceiverLock(topicReceivers.mutex);
         receiver = static_cast<pubsub_nanomsg_topic_receiver_t *>(hashMap_get(topicReceivers.map, key));
         if (receiver == nullptr) {
-            auto *serEntry = static_cast<psa_nanomsg_serializer_entry_t *>(hashMap_get(serializers.map,
-                                                                                       (void *) serializerSvcId));
-            if (serEntry != nullptr) {
+            auto kv = serializers.map.find(serializerSvcId);
+            if (kv != serializers.map.end()) {
+                auto serEntry = kv->second;
                 receiver = pubsub_nanoMsgTopicReceiver_create(ctx, log, scope, topic, serializerSvcId, serEntry->svc);
             } else {
                 L_ERROR("[PSA_NANOMSG] Cannot find serializer for TopicSender %s/%s", scope, topic);
             }
             if (receiver != nullptr) {
                 const char *psaType = PUBSUB_NANOMSG_ADMIN_TYPE;
-                const char *serType = serEntry->serType;
+                const char *serType = kv->second->serType;
                 newEndpoint = pubsubEndpoint_create(fwUUID, scope, topic, PUBSUB_SUBSCRIBER_ENDPOINT_TYPE, psaType,
                                                     serType, nullptr);
                 //if available also set container name
@@ -617,9 +624,10 @@ celix_status_t pubsub_nanomsg_admin::executeCommand(char *commandLine __attribut
             pubsub_nanomsg_topic_sender_t *sender = static_cast<pubsub_nanomsg_topic_sender_t *>(hashMapIterator_nextValue(
                     &iter));
             long serSvcId = pubsub_nanoMsgTopicSender_serializerSvcId(sender);
-            psa_nanomsg_serializer_entry_t *serEntry = static_cast<psa_nanomsg_serializer_entry_t *>(hashMap_get(
-                    serializers.map, (void *) serSvcId));
-            const char *serType = serEntry == nullptr ? "!Error!" : serEntry->serType;
+            auto kv = serializers.map.find(serSvcId);
+            //psa_nanomsg_serializer_entry_t *serEntry = static_cast<psa_nanomsg_serializer_entry_t *>(hashMap_get(
+            //        serializers.map, (void *) serSvcId));
+            const char *serType = kv->second == nullptr ? "!Error!" : kv->second->serType;
             const char *scope = pubsub_nanoMsgTopicSender_scope(sender);
             const char *topic = pubsub_nanoMsgTopicSender_topic(sender);
             const char *url = pubsub_nanoMsgTopicSender_url(sender);
@@ -639,9 +647,8 @@ celix_status_t pubsub_nanomsg_admin::executeCommand(char *commandLine __attribut
             pubsub_nanomsg_topic_receiver_t *receiver = static_cast<pubsub_nanomsg_topic_receiver_t *>(hashMapIterator_nextValue(
                     &iter));
             long serSvcId = pubsub_nanoMsgTopicReceiver_serializerSvcId(receiver);
-            psa_nanomsg_serializer_entry_t *serEntry = static_cast<psa_nanomsg_serializer_entry_t *>(hashMap_get(
-                    serializers.map, (void *) serSvcId));
-            const char *serType = serEntry == nullptr ? "!Error!" : serEntry->serType;
+            auto kv =  serializers.map.find(serSvcId);
+            const char *serType = kv->second == nullptr ? "!Error!" : kv->second->serType;
             const char *scope = pubsub_nanoMsgTopicReceiver_scope(receiver);
             const char *topic = pubsub_nanoMsgTopicReceiver_topic(receiver);
 

http://git-wip-us.apache.org/repos/asf/celix/blob/3009e647/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.h
----------------------------------------------------------------------
diff --git a/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.h b/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.h
index b06c887..98314b3 100644
--- a/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.h
+++ b/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_admin.h
@@ -21,10 +21,13 @@
 #define CELIX_PUBSUB_ZMQ_ADMIN_H
 
 #include <mutex>
+#include <map>
 #include <pubsub_admin.h>
 #include "celix_api.h"
 #include "log_helper.h"
 #include "pubsub_nanomsg_topic_receiver.h"
+#include <pubsub_serializer.h>
+
 #include "../../../shell/shell/include/command.h"
 
 #define PUBSUB_NANOMSG_ADMIN_TYPE       "zmq"
@@ -98,9 +101,15 @@ private:
 
     bool verbose{};
 
+    typedef struct psa_nanomsg_serializer_entry {
+        const char *serType;
+        long svcId;
+        pubsub_serializer_service_t *svc;
+    } psa_nanomsg_serializer_entry_t;
     struct {
         std::mutex mutex;
-        hash_map_t *map; //key = svcId, value = psa_nanomsg_serializer_entry_t*
+        std::map<long, psa_nanomsg_serializer_entry_t*> map;
+        //hash_map_t *map; //key = svcId, value = psa_nanomsg_serializer_entry_t*
     } serializers{};
 
     struct {

http://git-wip-us.apache.org/repos/asf/celix/blob/3009e647/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_topic_receiver.h
----------------------------------------------------------------------
diff --git a/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_topic_receiver.h b/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_topic_receiver.h
index 786fb90..d584db8 100644
--- a/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_topic_receiver.h
+++ b/bundles/pubsub/pubsub_admin_nanomsg/src/pubsub_nanomsg_topic_receiver.h
@@ -20,7 +20,8 @@
 #define CELIX_PUBSUB_NANOMSG_TOPIC_RECEIVER_H
 #include <string>
 #include <vector>
-
+#include "pubsub_serializer.h"
+#include "log_helper.h"
 #include "celix_bundle_context.h"
 
 typedef struct pubsub_nanomsg_topic_receiver pubsub_nanomsg_topic_receiver_t;