google-protobuf 3.15.6 → 3.15.7
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of google-protobuf might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/message.c +3 -6
- data/ext/google/protobuf_c/protobuf.c +79 -6
- data/ext/google/protobuf_c/protobuf.h +2 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4756c4b6ddbf7341827bd33ac53b92833e1c122da77146cc7a9bcadeb43c704f
|
4
|
+
data.tar.gz: 813aeeed854daa71d558f9b4e44dfb04a99e4d3fce8b74d1d4c33a89cdebe1b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 167cb6e1ff5ade9115a0f73a3f02743bf8428a9ad4716c6477f10ac6d5047ef379fbad27b1bf2b3bd3d97f550296d9c48a9a3f21e9670e67c61f4cb8f129ae9d
|
7
|
+
data.tar.gz: a9aed646593493f4940b3dca5eb93b0fa662f90263901f25f9fe744668787b0ec19eafb85c33b60ae36e7cb1fc7ad7d8ea575458b7f8304f4b86e07556113d7e
|
@@ -697,16 +697,13 @@ bool Message_Equal(const upb_msg *m1, const upb_msg *m2, const upb_msgdef *m) {
|
|
697
697
|
* field is of a primitive type).
|
698
698
|
*/
|
699
699
|
static VALUE Message_eq(VALUE _self, VALUE _other) {
|
700
|
-
if (
|
701
|
-
return Qfalse;
|
702
|
-
}
|
700
|
+
if (CLASS_OF(_self) != CLASS_OF(_other)) return Qfalse;
|
703
701
|
|
704
702
|
Message* self = ruby_to_Message(_self);
|
705
703
|
Message* other = ruby_to_Message(_other);
|
704
|
+
assert(self->msgdef == other->msgdef);
|
706
705
|
|
707
|
-
return Message_Equal(self->msg, other->msg, self->msgdef)
|
708
|
-
? Qtrue
|
709
|
-
: Qfalse;
|
706
|
+
return Message_Equal(self->msg, other->msg, self->msgdef) ? Qtrue : Qfalse;
|
710
707
|
}
|
711
708
|
|
712
709
|
uint64_t Message_Hash(const upb_msg* msg, const upb_msgdef* m, uint64_t seed) {
|
@@ -251,14 +251,80 @@ void Arena_register(VALUE module) {
|
|
251
251
|
// The object is used only for its identity; it does not contain any data.
|
252
252
|
VALUE secondary_map = Qnil;
|
253
253
|
|
254
|
+
// Mutations to the map are under a mutex, because SeconaryMap_MaybeGC()
|
255
|
+
// iterates over the map which cannot happen in parallel with insertions, or
|
256
|
+
// Ruby will throw:
|
257
|
+
// can't add a new key into hash during iteration (RuntimeError)
|
258
|
+
VALUE secondary_map_mutex = Qnil;
|
259
|
+
|
260
|
+
// Lambda that will GC entries from the secondary map that are no longer present
|
261
|
+
// in the primary map.
|
262
|
+
VALUE gc_secondary_map_lambda = Qnil;
|
263
|
+
ID length;
|
264
|
+
|
265
|
+
extern VALUE weak_obj_cache;
|
266
|
+
|
254
267
|
static void SecondaryMap_Init() {
|
255
268
|
rb_gc_register_address(&secondary_map);
|
269
|
+
rb_gc_register_address(&gc_secondary_map_lambda);
|
270
|
+
rb_gc_register_address(&secondary_map_mutex);
|
256
271
|
secondary_map = rb_hash_new();
|
272
|
+
gc_secondary_map_lambda = rb_eval_string(
|
273
|
+
"->(secondary, weak) {\n"
|
274
|
+
" secondary.delete_if { |k, v| !weak.key?(v) }\n"
|
275
|
+
"}\n");
|
276
|
+
secondary_map_mutex = rb_mutex_new();
|
277
|
+
length = rb_intern("length");
|
257
278
|
}
|
258
279
|
|
259
|
-
|
280
|
+
// The secondary map is a regular Hash, and will never shrink on its own.
|
281
|
+
// The main object cache is a WeakMap that will automatically remove entries
|
282
|
+
// when the target object is no longer reachable, but unless we manually
|
283
|
+
// remove the corresponding entries from the secondary map, it will grow
|
284
|
+
// without bound.
|
285
|
+
//
|
286
|
+
// To avoid this unbounded growth we periodically remove entries from the
|
287
|
+
// secondary map that are no longer present in the WeakMap. The logic of
|
288
|
+
// how often to perform this GC is an artbirary tuning parameter that
|
289
|
+
// represents a straightforward CPU/memory tradeoff.
|
290
|
+
//
|
291
|
+
// Requires: secondary_map_mutex is held.
|
292
|
+
static void SecondaryMap_MaybeGC() {
|
293
|
+
PBRUBY_ASSERT(rb_mutex_locked_p(secondary_map_mutex) == Qtrue);
|
294
|
+
size_t weak_len = NUM2ULL(rb_funcall(weak_obj_cache, length, 0));
|
295
|
+
size_t secondary_len = RHASH_SIZE(secondary_map);
|
296
|
+
if (secondary_len < weak_len) {
|
297
|
+
// Logically this case should not be possible: a valid entry cannot exist in
|
298
|
+
// the weak table unless there is a corresponding entry in the secondary
|
299
|
+
// table. It should *always* be the case that secondary_len >= weak_len.
|
300
|
+
//
|
301
|
+
// However ObjectSpace::WeakMap#length (and therefore weak_len) is
|
302
|
+
// unreliable: it overreports its true length by including non-live objects.
|
303
|
+
// However these non-live objects are not yielded in iteration, so we may
|
304
|
+
// have previously deleted them from the secondary map in a previous
|
305
|
+
// invocation of SecondaryMap_MaybeGC().
|
306
|
+
//
|
307
|
+
// In this case, we can't measure any waste, so we just return.
|
308
|
+
return;
|
309
|
+
}
|
310
|
+
size_t waste = secondary_len - weak_len;
|
311
|
+
// GC if we could remove at least 2000 entries or 20% of the table size
|
312
|
+
// (whichever is greater). Since the cost of the GC pass is O(N), we
|
313
|
+
// want to make sure that we condition this on overall table size, to
|
314
|
+
// avoid O(N^2) CPU costs.
|
315
|
+
size_t threshold = PBRUBY_MAX(secondary_len * 0.2, 2000);
|
316
|
+
if (waste > threshold) {
|
317
|
+
rb_funcall(gc_secondary_map_lambda, rb_intern("call"), 2,
|
318
|
+
secondary_map, weak_obj_cache);
|
319
|
+
}
|
320
|
+
}
|
321
|
+
|
322
|
+
// Requires: secondary_map_mutex is held by this thread iff create == true.
|
323
|
+
static VALUE SecondaryMap_Get(VALUE key, bool create) {
|
324
|
+
PBRUBY_ASSERT(!create || rb_mutex_locked_p(secondary_map_mutex) == Qtrue);
|
260
325
|
VALUE ret = rb_hash_lookup(secondary_map, key);
|
261
|
-
if (ret == Qnil) {
|
326
|
+
if (ret == Qnil && create) {
|
327
|
+
SecondaryMap_MaybeGC();
|
262
328
|
ret = rb_eval_string("Object.new");
|
263
329
|
rb_hash_aset(secondary_map, key, ret);
|
264
330
|
}
|
@@ -267,14 +333,15 @@ static VALUE SecondaryMap_Get(VALUE key) {
|
|
267
333
|
|
268
334
|
#endif
|
269
335
|
|
270
|
-
|
336
|
+
// Requires: secondary_map_mutex is held by this thread iff create == true.
|
337
|
+
static VALUE ObjectCache_GetKey(const void* key, bool create) {
|
271
338
|
char buf[sizeof(key)];
|
272
339
|
memcpy(&buf, &key, sizeof(key));
|
273
340
|
intptr_t key_int = (intptr_t)key;
|
274
341
|
PBRUBY_ASSERT((key_int & 3) == 0);
|
275
342
|
VALUE ret = LL2NUM(key_int >> 2);
|
276
343
|
#if USE_SECONDARY_MAP
|
277
|
-
ret = SecondaryMap_Get(ret);
|
344
|
+
ret = SecondaryMap_Get(ret, create);
|
278
345
|
#endif
|
279
346
|
return ret;
|
280
347
|
}
|
@@ -298,14 +365,20 @@ static void ObjectCache_Init() {
|
|
298
365
|
|
299
366
|
void ObjectCache_Add(const void* key, VALUE val) {
|
300
367
|
PBRUBY_ASSERT(ObjectCache_Get(key) == Qnil);
|
301
|
-
|
368
|
+
#if USE_SECONDARY_MAP
|
369
|
+
rb_mutex_lock(secondary_map_mutex);
|
370
|
+
#endif
|
371
|
+
VALUE key_rb = ObjectCache_GetKey(key, true);
|
302
372
|
rb_funcall(weak_obj_cache, item_set, 2, key_rb, val);
|
373
|
+
#if USE_SECONDARY_MAP
|
374
|
+
rb_mutex_unlock(secondary_map_mutex);
|
375
|
+
#endif
|
303
376
|
PBRUBY_ASSERT(ObjectCache_Get(key) == val);
|
304
377
|
}
|
305
378
|
|
306
379
|
// Returns the cached object for this key, if any. Otherwise returns Qnil.
|
307
380
|
VALUE ObjectCache_Get(const void* key) {
|
308
|
-
VALUE key_rb = ObjectCache_GetKey(key);
|
381
|
+
VALUE key_rb = ObjectCache_GetKey(key, false);
|
309
382
|
return rb_funcall(weak_obj_cache, item_get, 1, key_rb);
|
310
383
|
}
|
311
384
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-protobuf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.15.
|
4
|
+
version: 3.15.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Protobuf Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler-dock
|
@@ -123,7 +123,7 @@ homepage: https://developers.google.com/protocol-buffers
|
|
123
123
|
licenses:
|
124
124
|
- BSD-3-Clause
|
125
125
|
metadata:
|
126
|
-
source_code_uri: https://github.com/protocolbuffers/protobuf/tree/v3.15.
|
126
|
+
source_code_uri: https://github.com/protocolbuffers/protobuf/tree/v3.15.7/ruby
|
127
127
|
post_install_message:
|
128
128
|
rdoc_options: []
|
129
129
|
require_paths:
|
@@ -139,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: '0'
|
141
141
|
requirements: []
|
142
|
-
rubygems_version: 3.2.
|
142
|
+
rubygems_version: 3.2.15
|
143
143
|
signing_key:
|
144
144
|
specification_version: 4
|
145
145
|
summary: Protocol Buffers
|