eliminate a class of v8 initialization bugs due to concurrency in sidekiq

This commit is contained in:
Sam 2013-08-15 21:16:06 +10:00
parent a7eea65d53
commit 883db5798b
1 changed files with 29 additions and 16 deletions

View File

@ -77,6 +77,7 @@ module PrettyText
end
@mutex = Mutex.new
@ctx_init = Mutex.new
def self.mention_matcher
Regexp.new("(\@[a-zA-Z0-9_]{#{User.username_length.begin},#{User.username_length.end}})")
@ -86,14 +87,13 @@ module PrettyText
Rails.root
end
def self.v8
return @ctx unless @ctx.nil?
def self.create_new_context
ctx = V8::Context.new
@ctx = V8::Context.new
ctx["helpers"] = Helpers.new
@ctx["helpers"] = Helpers.new
ctx_load( "app/assets/javascripts/external/md5.js",
ctx_load(ctx,
"app/assets/javascripts/external/md5.js",
"app/assets/javascripts/external/lodash.js",
"app/assets/javascripts/external/Markdown.Converter.js",
"app/assets/javascripts/external/twitter-text-1.5.0.js",
@ -101,27 +101,40 @@ module PrettyText
"app/assets/javascripts/external/rsvp.js",
Rails.configuration.ember.handlebars_location)
@ctx.eval("var Discourse = {}; Discourse.SiteSettings = #{SiteSetting.client_settings_json};")
@ctx.eval("var window = {}; window.devicePixelRatio = 2;") # hack to make code think stuff is retina
@ctx.eval("var I18n = {}; I18n.t = function(a,b){ return helpers.t(a,b); }");
ctx.eval("var Discourse = {}; Discourse.SiteSettings = #{SiteSetting.client_settings_json};")
ctx.eval("var window = {}; window.devicePixelRatio = 2;") # hack to make code think stuff is retina
ctx.eval("var I18n = {}; I18n.t = function(a,b){ return helpers.t(a,b); }");
ctx_load( "app/assets/javascripts/discourse/components/bbcode.js",
ctx_load(ctx,
"app/assets/javascripts/discourse/components/bbcode.js",
"app/assets/javascripts/discourse/components/utilities.js",
"app/assets/javascripts/discourse/components/markdown.js")
# Load server side javascripts
if DiscoursePluginRegistry.server_side_javascripts.present?
DiscoursePluginRegistry.server_side_javascripts.each do |ssjs|
@ctx.load(ssjs)
ctx.load(ssjs)
end
end
@ctx['quoteTemplate'] = File.open(app_root + 'app/assets/javascripts/discourse/templates/quote.js.shbrs') {|f| f.read}
@ctx['quoteEmailTemplate'] = File.open(app_root + 'lib/assets/quote_email.js.shbrs') {|f| f.read}
@ctx.eval("HANDLEBARS_TEMPLATES = {
ctx['quoteTemplate'] = File.open(app_root + 'app/assets/javascripts/discourse/templates/quote.js.shbrs') {|f| f.read}
ctx['quoteEmailTemplate'] = File.open(app_root + 'lib/assets/quote_email.js.shbrs') {|f| f.read}
ctx.eval("HANDLEBARS_TEMPLATES = {
'quote': Handlebars.compile(quoteTemplate),
'quote_email': Handlebars.compile(quoteEmailTemplate),
};")
ctx
end
def self.v8
return @ctx if @ctx
# ensure we only init one of these
@ctx_init.synchronize do
return @ctx if @ctx
@ctx = create_new_context
end
@ctx
end
@ -263,9 +276,9 @@ module PrettyText
protected
def self.ctx_load(*files)
def self.ctx_load(ctx, *files)
files.each do |file|
@ctx.load(app_root + file)
ctx.load(app_root + file)
end
end