! * \brief 加载一个插件,线程安全,可单独使用 * \param pluginMetaObj */
| 108 | * \param pluginMetaObj |
| 109 | */ |
| 110 | bool PluginManagerPrivate::loadPlugin(PluginMetaObjectPointer &pluginMetaObj) |
| 111 | { |
| 112 | dpfCheckTimeBegin(); |
| 113 | // don't load disabled plugins |
| 114 | if (!pluginMetaObj->isEnabledBySettings()) |
| 115 | return true; |
| 116 | |
| 117 | QMutexLocker lock(&GlobalPrivate::mutex); |
| 118 | |
| 119 | //流程互斥 |
| 120 | if (pluginMetaObj->d->state >= PluginMetaObject::State::Loaded) { |
| 121 | dpfDebug() << "Plugin" |
| 122 | << pluginMetaObj->d->name |
| 123 | << "already loaded and state: " |
| 124 | << pluginMetaObj->d->state; |
| 125 | return true; |
| 126 | } |
| 127 | |
| 128 | if (pluginMetaObj.isNull()) { |
| 129 | dpfCritical() << "Failed, load plugin is nullptr"; |
| 130 | return false; |
| 131 | } |
| 132 | |
| 133 | bool result = pluginMetaObj->d->loader->load(); |
| 134 | pluginMetaObj->d->plugin = QSharedPointer<Plugin>( |
| 135 | qobject_cast<Plugin*>(pluginMetaObj->d->loader->instance())); |
| 136 | if (!pluginMetaObj->d->plugin.isNull()) { |
| 137 | pluginMetaObj->d->state = PluginMetaObject::State::Loaded; |
| 138 | dpfDebug() << "Loaded plugin: " << pluginMetaObj->d->name; |
| 139 | } else { |
| 140 | pluginMetaObj->d->error = "Failed, get plugin instance is nullptr: " |
| 141 | + pluginMetaObj->d->loader->errorString(); |
| 142 | dpfCritical() << pluginMetaObj->d->error; |
| 143 | result = false; |
| 144 | } |
| 145 | |
| 146 | dpfCheckTimeEnd(); |
| 147 | |
| 148 | return result; |
| 149 | } |
| 150 | |
| 151 | /*! |
| 152 | * \brief 初始化一个插件,线程安全,可单独使用 |
nothing calls this directly
no test coverage detected