mini_racer 0.2.11 → 0.2.12

Sign up to get free protection for your applications and to get access to all the features.
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: