Sha256: 3274a07cedd875749fcd71bbf92eb1e298ea826bfe01cf028ad07555a14bc280

Contents?: true

Size: 1.23 KB

Versions: 29

Compression:

Stored size: 1.23 KB

Contents

# typed: true

# Copyright (c) 2015 Sqreen. All Rights Reserved.
# Please refer to our terms for more information: https://www.sqreen.com/terms.html

# TODO: => Sqreen::JS:ExecJS

require 'sqreen/js/executable_js'

module Sqreen
  module Js
    class ThreadLocalExecJsRunnable < ExecutableJs
      def initialize(code)
        @code = code
        @tl_key = "SQREEN_EXECJS_CONTEXT_#{object_id}".freeze
        @runtimes = [] # place where to keep strong references
        @runtimes_mutex = Mutex.new
      end

      def run_js_cb(cbname, _budget, arguments)
        tl_exec_js_runnable.call(cbname, *arguments)
      end

      def with_runtimes_mutex
        @runtimes_mutex.synchronize { yield }
      end

      private

      def dispose_from_dead_threads
        with_runtimes_mutex do
          @runtimes.delete_if { |th, _runtime| !th.alive? }
        end
      end

      def tl_exec_js_runnable
        runnable = Thread.current[@tl_key]
        return runnable if runnable && runnable.weakref_alive?

        dispose_from_dead_threads
        runtime = ExecJS.compile(@code)
        with_runtimes_mutex do
          @runtimes << [Thread.current, runtime]
        end
        Thread.current[@tl_key] = WeakRef.new(runtime)
      end
    end
  end
end

Version data entries

29 entries across 29 versions & 1 rubygems

Version Path
sqreen-1.22.0-java lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.22.0 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.1-java lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.1 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.0-java lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.0 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.4-java lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.4 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.0.beta3-java lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.0.beta3 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.4.beta1 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.19.4 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.3 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.2 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.0.beta2 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.21.0.beta1 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.1-java lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.1 lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.0-java lib/sqreen/js/thread_local_exec_js_runnable.rb
sqreen-1.20.0 lib/sqreen/js/thread_local_exec_js_runnable.rb