Added check on the mainloop context being initialized before used 2.1-pre1
authorPhilip Rauwolf <rauwolf@itestra.de>
Mon, 24 Jun 2013 12:30:28 +0000 (14:30 +0200)
committerPhilip Rauwolf <rauwolf@itestra.de>
Mon, 24 Jun 2013 12:30:28 +0000 (14:30 +0200)
src/CommonAPI/MainLoopContext.h
src/CommonAPI/Runtime.cpp
src/CommonAPI/Runtime.h

index 0d87442..c651532 100644 (file)
@@ -314,6 +314,16 @@ class MainLoopContext {
         }
     }
 
+    /**
+     * \brief Will return true if at least one subscribe for DispatchSources or Watches has been called.
+     *
+     * This function will be used to prevent creation of a factory if a mainloop context is given, but
+     * no listeners have been registered. This is done in order to ensure correct use of the mainloop context.
+     */
+    inline bool isInitialized() {
+        return dispatchSourceListeners_.size() > 0 || watchListeners_.size() > 0;
+    }
+
  private:
     DispatchSourceListenerList dispatchSourceListeners_;
     WatchListenerList watchListeners_;
index d7185df..f930db9 100644 (file)
@@ -57,5 +57,14 @@ std::shared_ptr<MainLoopContext> Runtime::getNewMainLoopContext() const {
     return std::make_shared<MainLoopContext>();
 }
 
+std::shared_ptr<Factory> Runtime::createFactory(std::shared_ptr<MainLoopContext> mainLoopContext,
+                                                const std::string factoryName,
+                                                const bool nullOnInvalidName) {
+    if(mainLoopContext && !mainLoopContext->isInitialized()) {
+        return std::shared_ptr<Factory>(NULL);
+    }
+    return doCreateFactory(mainLoopContext, factoryName, nullOnInvalidName);
+}
+
 
 } // namespace CommonAPI
index 5cf7afa..6a8eeec 100644 (file)
@@ -85,14 +85,24 @@ class Runtime {
      *
      * Create a factory for the loaded runtime
      *
-     * @param In case mainloop integration shall be used, a std::shared_ptr<MainLoopContext> can be passed in.
+     * @param mainLoopContext: In case mainloop integration shall be used, a std::shared_ptr<MainLoopContext> can be passed in.
      *        If no parameter is given, internal threading will handle sending and receiving of messages automatically.
+     *        If the mainloop context is not initialized, no factory will be returned. See documentation of
+     *        MainLoopContext::isInitialized().
+     *
+     * @param factoryName: If additional configuration parameters for the specific middleware factory shall be provided,
+     *        the appropriate set of parameters may be identified by this name. See accompanying documentation for
+     *        usage of configuration files.
+     *
+     * @param nullOnInvalidName: If a factoryName is provided, this parameter determines whether the standard configuration
+     *        for factories shall be used if the specific parameter set cannot be found, or if instead no factory
+     *        shall be returned in this case.
      *
      * @return Factory object for this runtime
      */
-    virtual std::shared_ptr<Factory> createFactory(std::shared_ptr<MainLoopContext> = std::shared_ptr<MainLoopContext>(NULL),
+    virtual std::shared_ptr<Factory> createFactory(std::shared_ptr<MainLoopContext> mainLoopContext = std::shared_ptr<MainLoopContext>(NULL),
                                                    const std::string factoryName = "",
-                                                   const bool nullOnInvalidName = false) = 0;
+                                                   const bool nullOnInvalidName = false);
 
     /**
      * \brief Returns the ServicePublisher object for this runtime.
@@ -105,6 +115,11 @@ class Runtime {
      * @return The ServicePublisher object for this runtime
      */
     virtual std::shared_ptr<ServicePublisher> getServicePublisher() = 0;
+
+ protected:
+    virtual std::shared_ptr<Factory> doCreateFactory(std::shared_ptr<MainLoopContext>,
+                                                     const std::string factoryName,
+                                                     const bool nullOnInvalidName) = 0;
 };