Browse Source

refactor & feat: InterMessageStream添加互斥锁

SongZihuan 3 years ago
parent
commit
523f4347e1

+ 1 - 1
include/core/env-var.inline.h

@@ -4,7 +4,7 @@
 
 namespace aFuncore {
     inline size_t EnvVarSpace::getCount() {
-        std::unique_lock<std::mutex> mut(lock);
+        std::unique_lock<std::mutex> mutex{lock};
         return var.size();
     }
 }

+ 4 - 4
include/core/inter.h

@@ -87,8 +87,8 @@ namespace aFuncore {
         [[nodiscard]] bool checkLiteral(const std::string &element) const;
         [[nodiscard]] bool checkLiteral(const std::string &element, std::string &literaler, bool &in_protect) const;
         [[nodiscard]] inline EnvVarSpace &getEnvVarSpace();
-        [[nodiscard]] inline InterMessage &getOutMessageStream();
-        [[nodiscard]] inline InterMessage &getInMessageStream();
+        [[nodiscard]] inline InterOutMessage &getOutMessageStream();
+        [[nodiscard]] inline InterInMessage &getInMessageStream();
 
         bool pushLiteral(const std::string &pattern, const std::string &literaler, bool in_protect);
 
@@ -104,8 +104,8 @@ namespace aFuncore {
 
         Activation *activation;  // 活动记录
 
-        InterMessage out;
-        InterMessage in;
+        InterOutMessage out;
+        InterInMessage in;
 
         std::list<LiteralRegex> literal;
 

+ 2 - 2
include/core/inter.inline.h

@@ -43,11 +43,11 @@ namespace aFuncore {
         return env.envvar;
     }
 
-    inline InterMessage &Inter::getOutMessageStream() {
+    inline InterOutMessage &Inter::getOutMessageStream() {
         return out;
     }
 
-    inline InterMessage &Inter::getInMessageStream() {
+    inline InterInMessage &Inter::getInMessageStream() {
         return in;
     }
 

+ 17 - 1
include/core/msg.h

@@ -98,9 +98,25 @@ namespace aFuncore {
     };
 
     class AFUN_CORE_EXPORT InterMessage : public MessageStream {
-        std::mutex mutex;
     public:
         Message *popFrontMessage(std::string &type);
+        Message *popMessage(const std::string &type);
+        void pushMessage(const std::string &type, Message *msg);
+
+        template <typename Callable, typename...T>
+        void forEach(Callable func, T...arg);
+    private:
+        std::mutex lock;
+    };
+
+    class InterOutMessage : public InterMessage {
+    public:
+        template<class T>
+        [[nodiscard]] T *getMessage(const std::string &type) const = delete;  // 对外不设置 getMessage 以避免线程问题
+    };
+
+    class InterInMessage : public InterMessage {
+
     };
 }
 

+ 10 - 0
include/core/msg.template.h

@@ -22,6 +22,16 @@ namespace aFuncore {
         for (const UpMessage *up = this; up != nullptr; up = up->old)
             up->MessageStream::forEach(func, arg...);
     }
+
+    template<typename Callable, typename... T>
+    void InterMessage::forEach(Callable func, T... arg) {
+        std::unique_lock<std::mutex> mutex{lock};
+        for (auto &msg : stream) {
+            mutex.unlock();
+            func(msg.second, arg...);
+            mutex.lock();
+        }
+    }
 }
 
 #endif //AFUN_MSG_TEMPLATE_H

+ 6 - 6
src/core/env-var.cpp

@@ -7,7 +7,7 @@ namespace aFuncore {
      * @return 是否成功
      */
     bool EnvVarSpace::findString(const std::string &name, std::string &str) {
-        std::unique_lock<std::mutex> mut(lock);
+        std::unique_lock<std::mutex> mutex{lock};
         auto env_var = var.find(name);
         if (env_var == var.end())
             return false;
@@ -22,7 +22,7 @@ namespace aFuncore {
      * @return 是否成功
      */
     bool EnvVarSpace::findNumber(const std::string &name, int32_t &num) {
-        std::unique_lock<std::mutex> mut(lock);
+        std::unique_lock<std::mutex> mutex{lock};
         auto env_var = var.find(name);
         if (env_var == var.end())
             return false;
@@ -36,7 +36,7 @@ namespace aFuncore {
      * @param str 文本
      */
     void EnvVarSpace::setString(const std::string &name, const std::string &str){
-        std::unique_lock<std::mutex> mut(lock);
+        std::unique_lock<std::mutex> mutex{lock};
         auto env_var = var.find(name);
         if (env_var == var.end())
             var.insert({name, {str, 0}});
@@ -50,7 +50,7 @@ namespace aFuncore {
      * @param num 数值
      */
     void EnvVarSpace::setNumber(const std::string &name, int32_t num){
-        std::unique_lock<std::mutex> mut(lock);
+        std::unique_lock<std::mutex> mutex{lock};
         auto env_var = var.find(name);
         if (env_var == var.end())
             var.insert({name, {"", num}});
@@ -64,7 +64,7 @@ namespace aFuncore {
      * @param str 文本
      */
     void EnvVarSpace::addString(const std::string &name, const std::string &str){
-        std::unique_lock<std::mutex> mut(lock);
+        std::unique_lock<std::mutex> mutex{lock};
         auto env_var = var.find(name);
         if (env_var == var.end())
             var.insert({name, {str, 0}});
@@ -78,7 +78,7 @@ namespace aFuncore {
      * @param num 数值
      */
     void EnvVarSpace::addNumber(const std::string &name, int32_t num){
-        std::unique_lock<std::mutex> mut(lock);
+        std::unique_lock<std::mutex> mutex{lock};
         auto env_var = var.find(name);
         if (env_var == var.end())
             var.insert({name, {"", num}});

+ 11 - 0
src/core/msg.cpp

@@ -85,6 +85,7 @@ namespace aFuncore {
     }
 
     Message *InterMessage::popFrontMessage(std::string &type) {
+        std::unique_lock<std::mutex> mutex{lock};
         if (stream.empty())
             return nullptr;
         Message *ret = stream.begin()->second;
@@ -92,4 +93,14 @@ namespace aFuncore {
         stream.erase(stream.begin());
         return ret;
     }
+
+    Message *InterMessage::popMessage(const std::string &type) {
+        std::unique_lock<std::mutex> mutex{lock};
+        return MessageStream::popMessage(type);
+    }
+
+    void InterMessage::pushMessage(const std::string &type, Message *msg) {
+        std::unique_lock<std::mutex> mutex{lock};
+        MessageStream::pushMessage(type, msg);
+    }
 }