method

render_details

Importance_0
v5.1.7 - Show latest stable - 0 notes - Class: DebugLocks
render_details(req) private

No documentation

This method has no description. You can help the Ruby on Rails community by adding new notes.

Hide source
# File actionpack/lib/action_dispatch/middleware/debug_locks.rb, line 43
      def render_details(req)
        threads = ActiveSupport::Dependencies.interlock.raw_state do |threads|
          # The Interlock itself comes to a complete halt as long as this block
          # is executing. That gives us a more consistent picture of everything,
          # but creates a pretty strong Observer Effect.
          #
          # Most directly, that means we need to do as little as possible in
          # this block. More widely, it means this middleware should remain a
          # strictly diagnostic tool (to be used when something has gone wrong),
          # and not for any sort of general monitoring.

          threads.each.with_index do |(thread, info), idx|
            info[:index] = idx
            info[:backtrace] = thread.backtrace
          end

          threads
        end

        str = threads.map do |thread, info|
          if info[:exclusive]
            lock_state = "Exclusive"
          elsif info[:sharing] > 0
            lock_state = "Sharing"
            lock_state << " x#{info[:sharing]}" if info[:sharing] > 1
          else
            lock_state = "No lock"
          end

          if info[:waiting]
            lock_state << " (yielded share)"
          end

          msg = "Thread #{info[:index]} [0x#{thread.__id__.to_s(16)} #{thread.status || 'dead'}]  #{lock_state}\n"

          if info[:sleeper]
            msg << "  Waiting in #{info[:sleeper]}"
            msg << " to #{info[:purpose].to_s.inspect}" unless info[:purpose].nil?
            msg << "\n"

            if info[:compatible]
              compat = info[:compatible].map { |c| c == false ? "share" : c.to_s.inspect }
              msg << "  may be pre-empted for: #{compat.join(', ')}\n"
            end

            blockers = threads.values.select { |binfo| blocked_by?(info, binfo, threads.values) }
            msg << "  blocked by: #{blockers.map { |i| i[:index] }.join(', ')}\n" if blockers.any?
          end

          blockees = threads.values.select { |binfo| blocked_by?(binfo, info, threads.values) }
          msg << "  blocking: #{blockees.map { |i| i[:index] }.join(', ')}\n" if blockees.any?

          msg << "\n#{info[:backtrace].join("\n")}\n" if info[:backtrace]
        end.join("\n\n---\n\n\n")

        [200, { "Content-Type" => "text/plain", "Content-Length" => str.size }, [str]]
      end
Register or log in to add new notes.