Module: RaceGuard::CommitSafety::Watcher

Defined in:
lib/race_guard/commit_safety/watcher.rb

Overview

Prepends emit-and-super wrappers for commit-safety custom intercepts.

Constant Summary collapse

REGISTRY_MUTEX =
Mutex.new
REGISTRY =
Set.new

Class Method Summary collapse

Class Method Details

.emit_intercept_event(watch_name, label, method_name, owner) ⇒ Object

Called from prepended wrappers; kept public so define_method bodies can invoke it.



47
48
49
50
51
52
53
54
55
56
# File 'lib/race_guard/commit_safety/watcher.rb', line 47

def emit_intercept_event(watch_name, label, method_name, owner)
  ::RaceGuard::Interceptors::Emitter.emit(
    watch_name,
    "#{label}##{method_name}",
    'watch' => watch_name.to_s,
    'class' => label,
    'method' => method_name.to_s,
    'owner' => owner.to_s
  )
end

.install!(watch_name, klass, method_name, scope:) ⇒ Object

Raises:

  • (TypeError)


27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/race_guard/commit_safety/watcher.rb', line 27

def install!(watch_name, klass, method_name, scope:)
  raise TypeError, 'klass must be a Class or Module' unless klass.is_a?(Module)

  m = method_name.to_sym
  sym = watch_name.to_sym
  REGISTRY_MUTEX.synchronize do
    owner = MethodResolution.resolve_owner!(klass, m, scope)
    key = [klass.__id__, m, owner, sym]
    return if REGISTRY.include?(key)

    prepend_emit_wrapper!(klass, m, owner, sym)
    REGISTRY.add(key)
  end
end

.reset_registry!Object



42
43
44
# File 'lib/race_guard/commit_safety/watcher.rb', line 42

def reset_registry!
  REGISTRY_MUTEX.synchronize { REGISTRY.clear }
end