From b58f15d0be07ec1b3f85a26a43ce76ba4e6c28bc Mon Sep 17 00:00:00 2001 From: balaksh Date: Tue, 2 May 2017 10:27:11 +1200 Subject: [PATCH] Fixed race condition that occurs when 'requiring' plugins --- lib/cmock_plugin_manager.rb | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/cmock_plugin_manager.rb b/lib/cmock_plugin_manager.rb index eb8f9e8..336b227 100644 --- a/lib/cmock_plugin_manager.rb +++ b/lib/cmock_plugin_manager.rb @@ -4,6 +4,8 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== +require 'thread' + class CMockPluginManager attr_accessor :plugins @@ -14,14 +16,7 @@ class CMockPluginManager plugins_to_load.each do |plugin| plugin_name = plugin.to_s object_name = "CMockGeneratorPlugin" + camelize(plugin_name) - begin - unless (Object.const_defined? object_name) - require "#{File.expand_path(File.dirname(__FILE__))}/cmock_generator_plugin_#{plugin_name.downcase}.rb" - end - @plugins << eval("#{object_name}.new(config, utils)") - rescue - raise "ERROR: CMock unable to load plugin '#{plugin_name}'" - end + self.class.plugin_require_mutex.synchronize { load_plugin(plugin_name, object_name, config, utils) } end @plugins.sort! {|a,b| a.priority <=> b.priority } end @@ -37,4 +32,24 @@ class CMockPluginManager def camelize(lower_case_and_underscored_word) lower_case_and_underscored_word.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase } end + + private + + def self.plugin_require_mutex + @mutex ||= Mutex.new + end + + def load_plugin(plugin_name, object_name, config, utils) + begin + unless (Object.const_defined? object_name) + file_name = "#{File.expand_path(File.dirname(__FILE__))}/cmock_generator_plugin_#{plugin_name.downcase}.rb" + require file_name + end + class_name = Object.const_get(object_name) + @plugins << class_name.new(config, utils) + rescue + file_name = "#{File.expand_path(File.dirname(__FILE__))}/cmock_generator_plugin_#{plugin_name.downcase}.rb" + raise "ERROR: CMock unable to load plugin '#{plugin_name}' '#{object_name}' #{file_name}" + end + end end