[#70977] [Ruby trunk - Feature #11473] Immutable String literal in Ruby 3 — arai@...
Issue #11473 has been updated by Shunichi Arai.
3 messages
2015/10/04
[#71062] [Ruby trunk - Bug #10892] Deadlock in autoload — eregontp@...
Issue #10892 has been updated by Benoit Daloze.
4 messages
2015/10/12
[#71090] Re: [Ruby trunk - Bug #10892] Deadlock in autoload
— Eric Wong <normalperson@...>
2015/10/14
eregontp@gmail.com wrote:
[#71127] [Ruby trunk - Feature #11607] [PATCH] fiddle: release GVL for ffi_call — normalperson@...
Issue #11607 has been updated by Eric Wong.
3 messages
2015/10/20
[#71164] [Ruby trunk - Feature #11614] [Open] [RFC] use id_table for constant tables — normalperson@...
Issue #11614 has been reported by Eric Wong.
3 messages
2015/10/22
[#71211] [Ruby trunk - Feature #11607] [PATCH] fiddle: release GVL for ffi_call — naruse@...
Issue #11607 has been updated by Yui NARUSE.
6 messages
2015/10/27
[#71212] Re: [Ruby trunk - Feature #11607] [PATCH] fiddle: release GVL for ffi_call
— Eric Wong <normalperson@...>
2015/10/27
Yes, user must check if the function is MT-safe. Probably fine
[#71246] Re: [Ruby trunk - Feature #11607] [PATCH] fiddle: release GVL for ffi_call
— Aaron Patterson <tenderlove@...>
2015/10/28
On Tue, Oct 27, 2015 at 08:54:07AM +0000, Eric Wong wrote:
[#71254] Re: [Ruby trunk - Feature #11607] [PATCH] fiddle: release GVL for ffi_call
— Eric Wong <normalperson@...>
2015/10/28
Aaron Patterson <tenderlove@ruby-lang.org> wrote:
[#71230] [Ruby trunk - Feature #11625] Unlock GVL for SHA1 calculations — tenderlove@...
Issue #11625 has been updated by Aaron Patterson.
5 messages
2015/10/27
[#71236] Re: [Ruby trunk - Feature #11625] Unlock GVL for SHA1 calculations
— Юрий Соколов <funny.falcon@...>
2015/10/28
What's about other hashsum algos? MD5, SHA2, etc
[#71242] Re: [Ruby trunk - Feature #11625] Unlock GVL for SHA1 calculations
— Eric Wong <normalperson@...>
2015/10/28
Юрий Соколов <funny.falcon@gmail.com> wrote:
[#71239] [Ruby trunk - Bug #11384] multi-threaded autoload sometimes fails — shugo@...
Issue #11384 has been updated by Shugo Maeda.
4 messages
2015/10/28
[ruby-core:71229] Re: [Ruby trunk - Feature #11625] [Open] Unlock GVL for SHA1 calculations
From:
Eric Wong <normalperson@...>
Date:
2015-10-27 21:12:37 UTC
List:
ruby-core #71229
tenderlove@ruby-lang.org wrote:
> --- a/ext/digest/digest.c
> +++ b/ext/digest/digest.c
> @@ -624,6 +624,7 @@ rb_digest_base_update(VALUE self, VALUE str)
> TypedData_Get_Struct(self, void, &digest_type, pctx);
>
> StringValue(str);
> + str = rb_str_dup(str);
> algo->update_func(pctx, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str));
> RB_GC_GUARD(str);
Better to use rb_str_new_frozen instead of rb_str_dup
to prevent string modification by users traversing ObjectSpace.
IO#syswrite and similar methods do this.
Maybe rb_obj_hide + rb_gc_force_recycle is worth it for garbage
reduction, too.
> --- a/ext/digest/sha1/sha1.c
> +++ b/ext/digest/sha1/sha1.c
> +void SHA1_UpdateNoGVL(SHA1_CTX *context, const uint8_t *data, size_t len)
> +{
> + struct unpack_nogvl args;
> + args.context = context;
> + args.data = data;
> + args.len = len;
> +
> + rb_thread_call_without_gvl(SHA1_UpdateNoGVLUnpack, &args, RUBY_UBF_PROCESS, NULL);
I don't think there is any need to use a UBF, here.
Having a UBF could even be dangerous by corrupting the state with
no resume point, allowing incorrect checksums to be generated.
s/RUBY_UBF_PROCESS/NULL/ also brings you under the 80-column limit :)
> +int SHA1_FinishNoGVL(SHA1_CTX* context, uint8_t digest[20])
> +{
> + struct finish_nogvl args;
> + args.context = context;
> + args.digest = digest;
> +
> + rb_thread_call_without_gvl(SHA1_FinishNoGVLUnpack, &args, RUBY_UBF_PROCESS, NULL);
ditto
> diff --git a/ext/digest/sha1/sha1.h b/ext/digest/sha1/sha1.h
> index 6f1c388..030d59c 100644
> --- a/ext/digest/sha1/sha1.h
> +++ b/ext/digest/sha1/sha1.h
> @@ -31,6 +31,8 @@ void SHA1_Transform _((uint32_t state[5], const uint8_t buffer[64]));
> int SHA1_Init _((SHA1_CTX *context));
> void SHA1_Update _((SHA1_CTX *context, const uint8_t *data, size_t len));
> int SHA1_Finish _((SHA1_CTX *context, uint8_t digest[20]));
> +void SHA1_UpdateNoGVL _((SHA1_CTX *context, const uint8_t *data, size_t len));
> +int SHA1_FinishNoGVL _((SHA1_CTX *context, uint8_t digest[20]));
We can probably make SHA1_Update, SHA1_Finish (and perhaps other
functions, such as SHA1_Transform) static, now.