mini_racer 0.2.11 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 276af6ac1a39ed9f00576b34e1944c0c27c9ee745871fc50de8010f06c642abf
4
- data.tar.gz: 911e1bf55677699df6623afec3430be7eccba88664c60e085562fb37e5a62847
3
+ metadata.gz: 35ced47bf0cd66e605b6bd14005c23381b9fa42e438b0ab45a3c99414d107634
4
+ data.tar.gz: '02968be5850b866d1c399995cb6d942dc826730447524df008f604035449050e'
5
5
  SHA512:
6
- metadata.gz: 17494a1abe347480cd62671155bcde45e60c8d47fee115338606a2b793308d9fe06f756da795f2b4fc84bbf8fded92ec6f6c3a656164ba195298efc4f27144e3
7
- data.tar.gz: 0c9cc0bad0cf4963582c00d4a6ac8df547fb1b655464f01ae115ec286c864c364521bba5d70ed2081c589d007328151af34e001ad48280f18d9afeca0af879c4
6
+ metadata.gz: 3c4fc5f71bcfddd5d58f5b0ae0f68e4b59067005362afbf29f096752f63fab9ea0d0526f2ba02d5a85f89976e607eae395c3714b6186282a6bce19217ae86ec0
7
+ data.tar.gz: 3d6268a03f472c01fa68278e4349c18b270765a8e831b020286a929b0fd0f2a1422b2c0c11432a33a348ec28044a38acdcd55d4cff93b436acc2fbed07ddfdf8
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ - 15-05-2020
2
+
3
+ - 0.2.12
4
+
5
+ - FEATURE: isolate.low_memory_notification which can force a full GC
6
+ - FEATURE: MiniRacer::Context.new(ensure_gc_after_idle: 2) - to force full GC 2 seconds after context is idle, this allows you to conserve memory on isolates
7
+
1
8
  - 14-05-2020
2
9
 
3
10
  - 0.2.11
data/README.md CHANGED
@@ -230,12 +230,17 @@ context = MiniRacer::Context.new(isolate: isolate)
230
230
  # give up to 100ms for V8 garbage collection
231
231
  isolate.idle_notification(100)
232
232
 
233
+ # force V8 to perform a full GC
234
+ isolate.low_memory_notification
235
+
233
236
  ```
234
237
 
235
238
  This can come in handy to force V8 GC runs for example in between requests if you use MiniRacer on a web application.
236
239
 
237
240
  Note that this method maps directly to [`v8::Isolate::IdleNotification`](http://bespin.cz/~ondras/html/classv8_1_1Isolate.html#aea16cbb2e351de9a3ae7be2b7cb48297), and that in particular its return value is the same (true if there is no further garbage to collect, false otherwise) and the same caveats apply, in particular that `there is no guarantee that the [call will return] within the time limit.`
238
241
 
242
+ Additionally you may automate this process on a context by defining it with `MiniRacer::Content.new(ensure_gc_after_idle: 1)`. Using this will ensure V8 will run a full GC using `context.isolate.low_memory_notification` 1 second after the last eval on the context. Low memory notification is both slower and more aggressive than an idle_notification and will ensure long living isolates use minimal amounts of memory.
243
+
239
244
  ### V8 Runtime flags
240
245
 
241
246
  It is possible to set V8 Runtime flags:
@@ -769,6 +769,16 @@ static VALUE rb_isolate_idle_notification(VALUE self, VALUE idle_time_in_ms) {
769
769
  return isolate_info->isolate->IdleNotificationDeadline(now + duration) ? Qtrue : Qfalse;
770
770
  }
771
771
 
772
+ static VALUE rb_isolate_low_memory_notification(VALUE self) {
773
+ IsolateInfo* isolate_info;
774
+ Data_Get_Struct(self, IsolateInfo, isolate_info);
775
+
776
+ if (current_platform == NULL) return Qfalse;
777
+
778
+ isolate_info->isolate->LowMemoryNotification();
779
+ return Qnil;
780
+ }
781
+
772
782
  static VALUE rb_context_init_unsafe(VALUE self, VALUE isolate, VALUE snap) {
773
783
  ContextInfo* context_info;
774
784
  Data_Get_Struct(self, ContextInfo, context_info);
@@ -1657,6 +1667,8 @@ extern "C" {
1657
1667
  rb_define_private_method(rb_cSnapshot, "load", (VALUE(*)(...))&rb_snapshot_load, 1);
1658
1668
 
1659
1669
  rb_define_method(rb_cIsolate, "idle_notification", (VALUE(*)(...))&rb_isolate_idle_notification, 1);
1670
+ rb_define_method(rb_cIsolate, "low_memory_notification", (VALUE(*)(...))&rb_isolate_low_memory_notification, 0);
1671
+
1660
1672
  rb_define_private_method(rb_cIsolate, "init_with_snapshot",(VALUE(*)(...))&rb_isolate_init_with_snapshot, 1);
1661
1673
 
1662
1674
  rb_define_singleton_method(rb_cPlatform, "set_flag_as_str!", (VALUE(*)(...))&rb_platform_set_flag_as_str, 1);
@@ -145,6 +145,15 @@ module MiniRacer
145
145
  end
146
146
  # false signals it should be fetched if requested
147
147
  @isolate = options[:isolate] || false
148
+
149
+ @ensure_gc_after_idle = options[:ensure_gc_after_idle]
150
+
151
+ if @ensure_gc_after_idle
152
+ @last_eval = nil
153
+ @ensure_gc_thread = nil
154
+ @ensure_gc_mutex = Mutex.new
155
+ end
156
+
148
157
  @disposed = false
149
158
 
150
159
  @callback_mutex = Mutex.new
@@ -203,6 +212,7 @@ module MiniRacer
203
212
  end
204
213
  ensure
205
214
  @eval_thread = nil
215
+ ensure_gc_thread if @ensure_gc_after_idle
206
216
  end
207
217
 
208
218
  def call(function_name, *arguments)
@@ -216,15 +226,17 @@ module MiniRacer
216
226
  end
217
227
  ensure
218
228
  @eval_thread = nil
229
+ ensure_gc_thread if @ensure_gc_after_idle
219
230
  end
220
231
 
221
232
  def dispose
222
233
  return if @disposed
223
234
  isolate_mutex.synchronize do
235
+ return if @disposed
224
236
  dispose_unsafe
237
+ @disposed = true
238
+ @isolate = nil # allow it to be garbage collected, if set
225
239
  end
226
- @disposed = true
227
- @isolate = nil # allow it to be garbage collected, if set
228
240
  end
229
241
 
230
242
 
@@ -273,6 +285,36 @@ module MiniRacer
273
285
 
274
286
  private
275
287
 
288
+ def ensure_gc_thread
289
+ @last_eval = Process.clock_gettime(Process::CLOCK_MONOTONIC)
290
+ @ensure_gc_mutex.synchronize do
291
+ @ensure_gc_thread = nil if !@ensure_gc_thread&.alive?
292
+ @ensure_gc_thread ||= Thread.new do
293
+ done = false
294
+ while !done
295
+ now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
296
+
297
+ if @disposed
298
+ @ensure_gc_thread = nil
299
+ break
300
+ end
301
+
302
+ if @ensure_gc_after_idle < now - @last_eval
303
+ @ensure_gc_mutex.synchronize do
304
+ isolate_mutex.synchronize do
305
+ # extra 50ms to make sure that we really have enough time
306
+ isolate.low_memory_notification if !@disposed
307
+ @ensure_gc_thread = nil
308
+ done = true
309
+ end
310
+ end
311
+ end
312
+ sleep @ensure_gc_after_idle if !done
313
+ end
314
+ end
315
+ end
316
+ end
317
+
276
318
  def stop_attached
277
319
  @callback_mutex.synchronize{
278
320
  if @callback_running
@@ -1,3 +1,3 @@
1
1
  module MiniRacer
2
- VERSION = "0.2.11"
2
+ VERSION = "0.2.12"
3
3
  end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.add_development_dependency "bundler"
30
- spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "rake", ">= 12.3.3"
31
31
  spec.add_development_dependency "minitest", "~> 5.0"
32
32
  spec.add_development_dependency "rake-compiler"
33
33
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_racer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.11
4
+ version: 0.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-14 00:00:00.000000000 Z
11
+ date: 2020-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -108,9 +108,9 @@ licenses:
108
108
  - MIT
109
109
  metadata:
110
110
  bug_tracker_uri: https://github.com/discourse/mini_racer/issues
111
- changelog_uri: https://github.com/discourse/mini_racer/blob/v0.2.11/CHANGELOG
112
- documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.2.11
113
- source_code_uri: https://github.com/discourse/mini_racer/tree/v0.2.11
111
+ changelog_uri: https://github.com/discourse/mini_racer/blob/v0.2.12/CHANGELOG
112
+ documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.2.12
113
+ source_code_uri: https://github.com/discourse/mini_racer/tree/v0.2.12
114
114
  post_install_message:
115
115
  rdoc_options: []
116
116
  require_paths: