sqreen-backport 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5eb6c9f010afbe49d2a2eb9b48a6269938d54fef43fe1b06c39c6b138b6dfcc3
4
+ data.tar.gz: d9fd4fa56b7f8fac04def7cefb9cb72919e2d2337050c9c682728b8e3c85846f
5
+ SHA512:
6
+ metadata.gz: 1972d3bab5633ad8ad6f395c9b739f3f19745ba9b5bbfd3487c97175f0143be481267e974594aa3a75aafa141a786d35da7671d0ded731f830e7ef5944f821e6
7
+ data.tar.gz: 8d3f8aa1cead045afa6421b4b12046cf730e41483a5eafaeabfeda19602bfe12c14b702f9b6aba692294dc96e4351a0efeebadd81723d24d9d7e33596f6ce024
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ * Extracted code from Ruby agent
data/LICENSE ADDED
@@ -0,0 +1,3 @@
1
+ Sqreen for Ruby is free-to-use, proprietary software.
2
+
3
+ Please refer to our terms for more information: https://www.sqreen.com/terms.html
@@ -0,0 +1,8 @@
1
+ # typed: ignore
2
+
3
+ # frozen_string_literal: true
4
+
5
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
6
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
7
+
8
+ require 'sqreen/backport'
@@ -0,0 +1,10 @@
1
+ # typed: ignore
2
+
3
+ # frozen_string_literal: true
4
+
5
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
6
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
7
+
8
+ module Sqreen; end
9
+
10
+ module Sqreen::Backport; end
@@ -0,0 +1,73 @@
1
+ # typed: ignore
2
+
3
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
+
6
+ require 'sqreen/backport'
7
+
8
+ module Sqreen::Backport::ClockGettime
9
+ class << self
10
+ def supported?
11
+ Process.respond_to?(:clock_gettime)
12
+ end
13
+ end
14
+
15
+ unless supported?
16
+ require 'ffi'
17
+
18
+ class Timespec < FFI::Struct
19
+ layout :tv_sec => :time_t, :tv_nsec => :long
20
+ end
21
+
22
+ module LibC
23
+ extend FFI::Library
24
+ ffi_lib FFI::Library::LIBC
25
+
26
+ # TODO: FFI::NotFoundError
27
+
28
+ if RUBY_PLATFORM =~ /darwin/
29
+ attach_function :mach_absolute_time, [], :uint64
30
+ end
31
+
32
+ attach_function :clock_gettime, [:int, :pointer], :int
33
+ end
34
+
35
+ module Constants
36
+ case RUBY_PLATFORM
37
+ when /darwin/
38
+ CLOCK_REALTIME = 0
39
+ CLOCK_MONOTONIC = 6
40
+ CLOCK_PROCESS_CPUTIME_ID = 12
41
+ CLOCK_THERAD_CPUTIME_ID = 16
42
+ when /linux/
43
+ CLOCK_REALTIME = 0
44
+ CLOCK_MONOTONIC = 1
45
+ CLOCK_PROCESS_CPUTIME_ID = 2
46
+ CLOCK_THREAD_CPUTIME_ID = 3
47
+ end
48
+ end
49
+
50
+ def clock_gettime(clock_id, unit = :float_second)
51
+ unless unit == :float_second
52
+ raise "Process.clock_gettime: unsupported unit #{unit.inspect}"
53
+ end
54
+
55
+ t = Sqreen::Backport::ClockGettime::Timespec.new
56
+ ret = Sqreen::Backport::ClockGettime::LibC.clock_gettime(
57
+ clock_id,
58
+ t.pointer,
59
+ )
60
+
61
+ raise SystemCallError, "Errno #{FFI.errno}" if ret == -1
62
+
63
+ t[:tv_sec].to_f + t[:tv_nsec].to_f / 1_000_000_000
64
+ end
65
+ end
66
+ end
67
+
68
+ unless Sqreen::Backport::ClockGettime.supported?
69
+ Process.instance_eval do
70
+ extend Sqreen::Backport::ClockGettime
71
+ include Sqreen::Backport::ClockGettime::Constants
72
+ end
73
+ end
@@ -0,0 +1,26 @@
1
+ # typed: ignore
2
+
3
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
+
6
+ require 'sqreen/backport'
7
+
8
+ module Sqreen::Backport::MutexOwned
9
+ class << self
10
+ def supported?
11
+ Mutex.new.respond_to?(:owned?)
12
+ end
13
+ end
14
+
15
+ def owned?
16
+ locked? && synchronize { return false }
17
+ rescue ThreadError
18
+ return true
19
+ end
20
+ end
21
+
22
+ unless Sqreen::Backport::MutexOwned.supported?
23
+ Mutex.instance_eval do
24
+ include Sqreen::Backport::MutexOwned
25
+ end
26
+ end
@@ -0,0 +1,90 @@
1
+ # typed: ignore
2
+
3
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
+
6
+ require 'sqreen/backport'
7
+
8
+ module Sqreen::Backport
9
+ module OriginalName
10
+ HAS_UNBOUND_METHOD_ORIGINAL_NAME = ::UnboundMethod.instance_methods(false).include?(:original_name)
11
+ HAS_METHOD_ORIGINAL_NAME = ::Method.instance_methods(false).include?(:original_name)
12
+
13
+ def original_name
14
+ self.class.get_original_name(owner, original_name_key) || self.original_name = name
15
+ end
16
+
17
+ private
18
+
19
+ def original_name=(name)
20
+ self.class.set_original_name(owner, original_name_key, name)
21
+ end
22
+
23
+ def original_name_key
24
+ return hash if is_a?(::UnboundMethod)
25
+
26
+ owner.instance_method(name).hash
27
+ end
28
+
29
+ class << self
30
+ def supported?
31
+ !::Kernel.const_defined?(:JRUBY_VERSION) &&
32
+ HAS_UNBOUND_METHOD_ORIGINAL_NAME &&
33
+ HAS_METHOD_ORIGINAL_NAME
34
+ end
35
+
36
+ def included(klass)
37
+ klass.extend(ClassMethods)
38
+ end
39
+
40
+ def prepended(klass)
41
+ klass.extend(ClassMethods)
42
+ end
43
+ end
44
+
45
+ class Store < ::Hash; end
46
+
47
+ module ClassMethods
48
+ def original_names(owner)
49
+ owner.instance_eval { @__sqreen_backport_original_names ||= Store.new }
50
+ end
51
+
52
+ def get_original_name(owner, key)
53
+ original_names(owner)[key]
54
+ end
55
+
56
+ def set_original_name(owner, key, name)
57
+ original_names(owner)[key] ||= name
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ class UnboundMethod
64
+ if Sqreen::Backport::OriginalName::HAS_UNBOUND_METHOD_ORIGINAL_NAME
65
+ prepend Sqreen::Backport::OriginalName
66
+ else
67
+ include Sqreen::Backport::OriginalName
68
+ end
69
+ end unless Sqreen::Backport::OriginalName.supported?
70
+
71
+ class Method
72
+ if Sqreen::Backport::OriginalName::HAS_METHOD_ORIGINAL_NAME
73
+ prepend Sqreen::Backport::OriginalName
74
+ else
75
+ include Sqreen::Backport::OriginalName
76
+ end
77
+ end unless Sqreen::Backport::OriginalName.supported?
78
+
79
+ class Module
80
+ alias_method(:alias_method_without_original_name, :alias_method)
81
+
82
+ def alias_method_with_original_name(newname, oldname)
83
+ alias_method_without_original_name(newname, oldname).tap do
84
+ instance_method(newname).send(:original_name=, :"#{oldname}")
85
+ end
86
+ end
87
+
88
+ alias_method_with_original_name(:alias_method_without_original_name, :alias_method)
89
+ alias_method_with_original_name(:alias_method, :alias_method_with_original_name)
90
+ end unless Sqreen::Backport::OriginalName.supported?
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sqreen-backport
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Loic Nageleisen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - CHANGELOG.md
20
+ - LICENSE
21
+ - lib/sqreen-backport.rb
22
+ - lib/sqreen/backport.rb
23
+ - lib/sqreen/backport/clock_gettime.rb
24
+ - lib/sqreen/backport/mutex_owned.rb
25
+ - lib/sqreen/backport/original_name.rb
26
+ homepage: https://sqreen.com
27
+ licenses:
28
+ - Sqreen
29
+ metadata:
30
+ source_code_uri: https://github.com/sqreen/ruby-backport
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.9.3
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubygems_version: 3.0.3
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: Backports to keep supporting old rubies
50
+ test_files: []