From michael.santos@REDACTED Sat Nov 3 15:49:56 2012 From: michael.santos@REDACTED (Michael Santos) Date: Sat, 3 Nov 2012 10:49:56 -0400 Subject: [erlang-patches] [PATCH] epmd: support IPv6 node registration In-Reply-To: <20120807231358.GA30451@ioctl> References: <20120807231358.GA30451@ioctl> Message-ID: <20121103144956.GF29060@ioctl> On Tue, Aug 07, 2012 at 07:13:58PM -0400, Michael Santos wrote: > Allow IPv6 nodes to register with and query epmd. On systems with > IPv6 support: > > * epmd listens on the IPv4 and IPv6 ANY or loopback sockets > > * the epmd cli client connects to epmd using the IPv6 loopback > > * distributed nodes started with "-proto_dist inet6_tcp" will register > with epmd over IPv6 ping! (or should that be ICMP6_ECHO_REQUEST ...) > --- > erts/doc/src/epmd.xml | 2 +- > erts/doc/src/erl.xml | 22 +++++ > erts/epmd/src/epmd.c | 6 +- > erts/epmd/src/epmd_cli.c | 11 ++- > erts/epmd/src/epmd_int.h | 37 ++++---- > erts/epmd/src/epmd_srv.c | 184 +++++++++++++++++++++++++------------ > erts/epmd/test/epmd_SUITE.erl | 33 ++++++- > lib/kernel/src/erl_epmd.erl | 18 ++-- > lib/kernel/src/inet6_tcp_dist.erl | 2 +- > 9 files changed, 222 insertions(+), 93 deletions(-) From n.oxyde@REDACTED Sat Nov 3 19:02:56 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Sat, 3 Nov 2012 19:02:56 +0100 Subject: [erlang-patches] Promote compiler option 'inline_list_funcs' Message-ID: The compiler option inline_list_funcs has been present in Erlang/OTP since at least release R9B0. It enables the inlining of the most used list manipulation functions of the stdlib's lists module. This couple of commits fix some wrong warnings triggered by the option if the result of the inlined function is not actually used and mention it in the documentation. https://github.com/nox/otp/compare/promote-inline_list_funcs https://github.com/nox/otp/compare/promote-inline_list_funcs.patch Regards, The following changes since commit d5733bc3e34449affde2594d85b905c8ab440d42: Merge branch 'egil/ensure-erl_crash.dump/OTP-10422' into maint (2012-10-24 14:20:26 +0200) are available in the git repository at: https://github.com/nox/otp promote-inline_list_funcs for you to fetch changes up to 6ac8429cbe1072af6d615f668523237a2d040ed0: Document compiler option 'inline_list_funcs' (2012-11-03 18:55:07 +0100) ---------------------------------------------------------------- Anthony Ramine (2): Silence some wrong warnings triggered by inline_list_funcs Document compiler option 'inline_list_funcs' lib/compiler/doc/src/compile.xml | 26 ++++++++++++++++++++++++++ lib/compiler/src/sys_core_fold.erl | 20 ++++++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/compiler/doc/src/compile.xml b/lib/compiler/doc/src/compile.xml index 27d750f..e9375d6 100644 --- a/lib/compiler/doc/src/compile.xml +++ b/lib/compiler/doc/src/compile.xml @@ -816,6 +816,32 @@ pi() -> 3.1416.
+ Inlining of list functions +

The compiler can also inline a variety of list manipulation functions + from the stdlib's lists module.

+ +

This feature must be explicitely enabled with a compiler option or a + -compile() attribute in the source module.

+ +

To enable inlining of list functions, use the inline_list_funcs + option.

+ +

The following functions are inlined:

+ + lists:all/1 + lists:any/1 + lists:foreach/2 + lists:map/2 + lists:flatmap/2 + lists:filter/2 + lists:foldl/3 + lists:foldr/3 + lists:mapfoldl/3 + lists:mapfoldr/3 + +
+ +
Parse Transformations

Parse transformations are used when a programmer wants to use diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index 18fba79..17397be 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -756,6 +756,7 @@ call_1(#c_call{anno=Anno}, lists, map, [Arg1,Arg2], Sub) -> op=F, args=[X]}, body=#c_cons{hd=H, + anno=[compiler_generated], tl=#c_apply{anno=Anno, op=Loop, args=[Xs]}}}}, @@ -780,7 +781,7 @@ call_1(#c_call{anno=Anno}, lists, flatmap, [Arg1,Arg2], Sub) -> C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true}, body=#c_let{vars=[H], arg=#c_apply{anno=Anno, op=F, args=[X]}, - body=#c_call{anno=Anno, + body=#c_call{anno=[compiler_generated|Anno], module=#c_literal{val=erlang}, name=#c_literal{val='++'}, args=[H, @@ -807,7 +808,7 @@ call_1(#c_call{anno=Anno}, lists, filter, [Arg1,Arg2], Sub) -> B = #c_var{name='B'}, Err1 = #c_tuple{es=[#c_literal{val='case_clause'}, X]}, CC1 = #c_clause{pats=[#c_literal{val=true}], guard=#c_literal{val=true}, - body=#c_cons{hd=X, tl=Xs}}, + body=#c_cons{anno=[compiler_generated], hd=X, tl=Xs}}, CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true}, body=Xs}, CC3 = #c_clause{pats=[X], guard=#c_literal{val=true}, @@ -901,7 +902,10 @@ call_1(#c_call{anno=Anno}, lists, mapfoldl, [Arg1,Arg2,Arg3], Sub) -> op=Loop, args=[Xs, Avar]}, #c_tuple{es=[Xs, Avar]}, - #c_tuple{es=[#c_cons{hd=X, tl=Xs}, Avar]}) + #c_tuple{anno=[compiler_generated], + es=[#c_cons{anno=[compiler_generated], + hd=X, tl=Xs}, + Avar]}) %%% Multiple-value version %%% #c_let{vars=[Xs,A], %%% %% The tuple here will be optimised @@ -912,7 +916,8 @@ call_1(#c_call{anno=Anno}, lists, mapfoldl, [Arg1,Arg2,Arg3], Sub) -> )}, C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true}, %%% Tuple passing version - body=#c_tuple{es=[#c_literal{val=[]}, Avar]}}, + body=#c_tuple{anno=[compiler_generated], + es=[#c_literal{val=[]}, Avar]}}, %%% Multiple-value version %%% body=#c_values{es=[#c_literal{val=[]}, A]}}, Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]}, @@ -955,7 +960,9 @@ call_1(#c_call{anno=Anno}, lists, mapfoldr, [Arg1,Arg2,Arg3], Sub) -> #c_tuple{es=[Xs, Avar]}, Match(#c_apply{anno=Anno, op=F, args=[X, Avar]}, #c_tuple{es=[X, Avar]}, - #c_tuple{es=[#c_cons{hd=X, tl=Xs}, Avar]})) + #c_tuple{anno=[compiler_generated], + es=[#c_cons{anno=[compiler_generated], + hd=X, tl=Xs}, Avar]})) %%% Multiple-value version %%% body=#c_let{vars=[Xs,A], %%% %% The tuple will be optimised away @@ -967,7 +974,8 @@ call_1(#c_call{anno=Anno}, lists, mapfoldr, [Arg1,Arg2,Arg3], Sub) -> }, C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true}, %%% Tuple passing version - body=#c_tuple{es=[#c_literal{val=[]}, Avar]}}, + body=#c_tuple{anno=[compiler_generated], + es=[#c_literal{val=[]}, Avar]}}, %%% Multiple-value version %%% body=#c_values{es=[#c_literal{val=[]}, A]}}, Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]}, -- Anthony Ramine From n.oxyde@REDACTED Sat Nov 3 19:35:33 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Sat, 3 Nov 2012 19:35:33 +0100 Subject: [erlang-patches] Promote compiler option 'inline_list_funcs' In-Reply-To: References: Message-ID: I've fixed a small typo, the HEAD commit is now d790aefafa81afbf14d210629d1f178e457337c5. Regards, On Sat, Nov 3, 2012 at 7:02 PM, Anthony Ramine wrote: > The compiler option inline_list_funcs has been present in Erlang/OTP > since at least release R9B0. It enables the inlining of the most used > list manipulation functions of the stdlib's lists module. > > This couple of commits fix some wrong warnings triggered by the option > if the result of the inlined function is not actually used and mention > it in the documentation. > > https://github.com/nox/otp/compare/promote-inline_list_funcs > https://github.com/nox/otp/compare/promote-inline_list_funcs.patch > > Regards, > > > The following changes since commit d5733bc3e34449affde2594d85b905c8ab440d42: > > Merge branch 'egil/ensure-erl_crash.dump/OTP-10422' into maint > (2012-10-24 14:20:26 +0200) > > are available in the git repository at: > > https://github.com/nox/otp promote-inline_list_funcs > > for you to fetch changes up to 6ac8429cbe1072af6d615f668523237a2d040ed0: > > Document compiler option 'inline_list_funcs' (2012-11-03 18:55:07 +0100) > > ---------------------------------------------------------------- > Anthony Ramine (2): > Silence some wrong warnings triggered by inline_list_funcs > Document compiler option 'inline_list_funcs' > > lib/compiler/doc/src/compile.xml | 26 ++++++++++++++++++++++++++ > lib/compiler/src/sys_core_fold.erl | 20 ++++++++++++++------ > 2 files changed, 40 insertions(+), 6 deletions(-) From tjarvstrand@REDACTED Sun Nov 4 15:54:18 2012 From: tjarvstrand@REDACTED (=?ISO-8859-1?Q?Thomas_J=E4rvstrand?=) Date: Sun, 4 Nov 2012 15:54:18 +0100 Subject: [erlang-patches] Additional error-handling file:path_open/3 Message-ID: Hi! file:path_open/3 currently doesn't handle eisdir or enotdir return values from file:open/2. Suppose we want to do path_open(["dir1", "dir2"], "sub/file") and dir2/sub/file is the actual path of the file that we are looking for. The effect of not handling these error cases is that the call will fail if dir1 happens to contain either a regular file called sub (file:open/2 returns enotdir) or a directory sub that in turn contains a directory file (file:open/2 return eisdir). This patch handles these extra error cases in file:path_open/3 Repo: git fetch git@REDACTED:tjarvstrand/otp.git additional-error-cases-in-path_open Comparison: https://github.com/tjarvstrand/otp/compare/additional-error-cases-in-path_open https://github.com/tjarvstrand/otp/compare/additional-error-cases-in-path_open.patch Regards Thomas J?rvstrand -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Tue Nov 6 10:09:37 2012 From: henrik@REDACTED (Henrik Nord) Date: Tue, 6 Nov 2012 10:09:37 +0100 Subject: [erlang-patches] [PATCH] epmd: support IPv6 node registration In-Reply-To: <20121103144956.GF29060@ioctl> References: <20120807231358.GA30451@ioctl> <20121103144956.GF29060@ioctl> Message-ID: <5098D3D1.8050903@erlang.org> Thank you, I have added this patch to 'master-pu' On 11/03/2012 03:49 PM, Michael Santos wrote: > On Tue, Aug 07, 2012 at 07:13:58PM -0400, Michael Santos wrote: >> Allow IPv6 nodes to register with and query epmd. On systems with >> IPv6 support: >> >> * epmd listens on the IPv4 and IPv6 ANY or loopback sockets >> >> * the epmd cli client connects to epmd using the IPv6 loopback >> >> * distributed nodes started with "-proto_dist inet6_tcp" will register >> with epmd over IPv6 > ping! (or should that be ICMP6_ECHO_REQUEST ...) > >> --- >> erts/doc/src/epmd.xml | 2 +- >> erts/doc/src/erl.xml | 22 +++++ >> erts/epmd/src/epmd.c | 6 +- >> erts/epmd/src/epmd_cli.c | 11 ++- >> erts/epmd/src/epmd_int.h | 37 ++++---- >> erts/epmd/src/epmd_srv.c | 184 +++++++++++++++++++++++++------------ >> erts/epmd/test/epmd_SUITE.erl | 33 ++++++- >> lib/kernel/src/erl_epmd.erl | 18 ++-- >> lib/kernel/src/inet6_tcp_dist.erl | 2 +- >> 9 files changed, 222 insertions(+), 93 deletions(-) > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP From lemenkov@REDACTED Tue Nov 6 10:25:37 2012 From: lemenkov@REDACTED (Peter Lemenkov) Date: Tue, 6 Nov 2012 12:25:37 +0300 Subject: [erlang-patches] [PATCH] epmd: support IPv6 node registration In-Reply-To: <20120807231358.GA30451@ioctl> References: <20120807231358.GA30451@ioctl> Message-ID: Hello All. 2012/8/8 Michael Santos : > Allow IPv6 nodes to register with and query epmd. On systems with > IPv6 support: Just FYI - some time ago I wrote a simple yet fully functional drop-in replacement for the server part of epmd: * https://github.com/lemenkov/erlpmd It also supports listening on a IPv6 addresses. So far it works quite well and can be used for various testing purposes. -- With best regards, Peter Lemenkov. From henrik@REDACTED Tue Nov 6 15:18:42 2012 From: henrik@REDACTED (Henrik Nord) Date: Tue, 6 Nov 2012 15:18:42 +0100 Subject: [erlang-patches] [PATCH] epmd: support IPv6 node registration In-Reply-To: <20121103144956.GF29060@ioctl> References: <20120807231358.GA30451@ioctl> <20121103144956.GF29060@ioctl> Message-ID: <50991C42.9040302@erlang.org> Does not compile under windows, epmd_cli.c(145) : error C2037: left of 'sin6_family' specifies undefined struct/union 'sockaddr_in6' epmd_cli.c(145) : error C2037: left of 'sin6_addr' specifies undefined struct/union 'sockaddr_in6' epmd_cli.c(145) : error C2065: 'in6addr_loopback' : undeclared identifier epmd_cli.c(145) : error C2037: left of 'sin6_port' specifies undefined struct/union 'sockaddr_in6' epmd_cli.c(146) : error C2027: use of undefined type 'sockaddr_in6' epmd_cli.c(146) : see declaration of 'sockaddr_in6' On 11/03/2012 03:49 PM, Michael Santos wrote: > On Tue, Aug 07, 2012 at 07:13:58PM -0400, Michael Santos wrote: >> Allow IPv6 nodes to register with and query epmd. On systems with >> IPv6 support: >> >> * epmd listens on the IPv4 and IPv6 ANY or loopback sockets >> >> * the epmd cli client connects to epmd using the IPv6 loopback >> >> * distributed nodes started with "-proto_dist inet6_tcp" will register >> with epmd over IPv6 > ping! (or should that be ICMP6_ECHO_REQUEST ...) > >> --- >> erts/doc/src/epmd.xml | 2 +- >> erts/doc/src/erl.xml | 22 +++++ >> erts/epmd/src/epmd.c | 6 +- >> erts/epmd/src/epmd_cli.c | 11 ++- >> erts/epmd/src/epmd_int.h | 37 ++++---- >> erts/epmd/src/epmd_srv.c | 184 +++++++++++++++++++++++++------------ >> erts/epmd/test/epmd_SUITE.erl | 33 ++++++- >> lib/kernel/src/erl_epmd.erl | 18 ++-- >> lib/kernel/src/inet6_tcp_dist.erl | 2 +- >> 9 files changed, 222 insertions(+), 93 deletions(-) > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP From michael.santos@REDACTED Tue Nov 6 15:41:00 2012 From: michael.santos@REDACTED (Michael Santos) Date: Tue, 6 Nov 2012 09:41:00 -0500 Subject: [erlang-patches] [PATCH] epmd: support IPv6 node registration In-Reply-To: <50991C42.9040302@erlang.org> References: <20120807231358.GA30451@ioctl> <20121103144956.GF29060@ioctl> <50991C42.9040302@erlang.org> Message-ID: <20121106144100.GA30360@ioctl> On Tue, Nov 06, 2012 at 03:18:42PM +0100, Henrik Nord wrote: > Does not compile under windows, > > > epmd_cli.c(145) : error C2037: left of 'sin6_family' specifies undefined struct/union 'sockaddr_in6' > epmd_cli.c(145) : error C2037: left of 'sin6_addr' specifies undefined struct/union 'sockaddr_in6' > epmd_cli.c(145) : error C2065: 'in6addr_loopback' : undeclared identifier > epmd_cli.c(145) : error C2037: left of 'sin6_port' specifies undefined struct/union 'sockaddr_in6' > epmd_cli.c(146) : error C2027: use of undefined type 'sockaddr_in6' > epmd_cli.c(146) : see declaration of 'sockaddr_in6' Seems Windows defines sockaddr_in6 in ws2tcpip.h. Something like this should get the compile working a bit further: diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h index 14d05c3..ae7cbcb 100644 --- a/erts/epmd/src/epmd_int.h +++ b/erts/epmd/src/epmd_int.h @@ -49,6 +49,7 @@ # ifndef WINDOWS_H_INCLUDES_WINSOCK2_H # include # endif +# include # include # include #endif I'll regenerate the patch. Sorry for the problem! No windows systems to test with here. > On 11/03/2012 03:49 PM, Michael Santos wrote: > >On Tue, Aug 07, 2012 at 07:13:58PM -0400, Michael Santos wrote: > >>Allow IPv6 nodes to register with and query epmd. On systems with > >>IPv6 support: > >> > >>* epmd listens on the IPv4 and IPv6 ANY or loopback sockets > >> > >>* the epmd cli client connects to epmd using the IPv6 loopback > >> > >>* distributed nodes started with "-proto_dist inet6_tcp" will register > >> with epmd over IPv6 > >ping! (or should that be ICMP6_ECHO_REQUEST ...) > > > >>--- > >> erts/doc/src/epmd.xml | 2 +- > >> erts/doc/src/erl.xml | 22 +++++ > >> erts/epmd/src/epmd.c | 6 +- > >> erts/epmd/src/epmd_cli.c | 11 ++- > >> erts/epmd/src/epmd_int.h | 37 ++++---- > >> erts/epmd/src/epmd_srv.c | 184 +++++++++++++++++++++++++------------ > >> erts/epmd/test/epmd_SUITE.erl | 33 ++++++- > >> lib/kernel/src/erl_epmd.erl | 18 ++-- > >> lib/kernel/src/inet6_tcp_dist.erl | 2 +- > >> 9 files changed, 222 insertions(+), 93 deletions(-) > >_______________________________________________ > >erlang-patches mailing list > >erlang-patches@REDACTED > >http://erlang.org/mailman/listinfo/erlang-patches > > -- > /Henrik Nord Erlang/OTP > From tjarvstrand@REDACTED Tue Nov 6 19:50:27 2012 From: tjarvstrand@REDACTED (=?ISO-8859-1?Q?Thomas_J=E4rvstrand?=) Date: Tue, 6 Nov 2012 19:50:27 +0100 Subject: [erlang-patches] Tweaking regexp in erlang-font-lock-keywords-vars Message-ID: Hi! Currently font-lock fontification in erlang-mode fails for the first erlang variable in the fontification region if the region to fontify starts on the same position as the variable. This is because the current regexp requires at least one character (any character except #) to be present before the actual variable names starts. This patch tweaks the regexp slightly to allow either a start-of-word or a non-# at the head of the variable-name. The use case is that I'm trying to accomplish syntax highlighting in the erlang-shell inside Emacs and the problem I encountered was that in the following example only Bar would be highlighted as a variable. 1> Foo = Bar. > Repo: git fetch git@REDACTED:tjarvstrand/otp.git erlang-font-lock-keyword-vars Comparison: https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars.patch Regards -------------- next part -------------- An HTML attachment was scrubbed... URL: From tjarvstrand@REDACTED Tue Nov 6 23:51:18 2012 From: tjarvstrand@REDACTED (=?ISO-8859-1?Q?Thomas_J=E4rvstrand?=) Date: Tue, 6 Nov 2012 23:51:18 +0100 Subject: [erlang-patches] Tweaking regexp in erlang-font-lock-keywords-vars In-Reply-To: References: Message-ID: Please disregard this patch, it does not work as intended. Sorry for the noise. Thomas 2012/11/6 Thomas J?rvstrand > Hi! > > Currently font-lock fontification in erlang-mode fails for the first > erlang variable in the fontification region if the region to fontify starts > on the same position as the variable. This is because the current regexp > requires at least one character (any character except #) to be present > before the actual variable names starts. This patch tweaks the regexp > slightly to allow either a start-of-word or a non-# at the head of the > variable-name. > > The use case is that I'm trying to accomplish syntax highlighting in the > erlang-shell inside Emacs and the problem I encountered was that in the > following example only Bar would be highlighted as a variable. > > 1> Foo = Bar. >> > > Repo: > git fetch git@REDACTED:tjarvstrand/otp.git erlang-font-lock-keyword-vars > > Comparison: > https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars > > https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars.patch > > Regards > -------------- next part -------------- An HTML attachment was scrubbed... URL: From michael.santos@REDACTED Wed Nov 7 01:24:17 2012 From: michael.santos@REDACTED (Michael Santos) Date: Tue, 6 Nov 2012 19:24:17 -0500 Subject: [erlang-patches] [PATCH] epmd: support IPv6 node registration Message-ID: <20121107002417.GA7235@ioctl> Allow IPv6 nodes to register with and query epmd. On systems with IPv6 support: * epmd listens on the IPv4 and IPv6 ANY or loopback sockets * the epmd cli client connects to epmd using the IPv6 loopback * distributed nodes started with "-proto_dist inet6_tcp" will register with epmd over IPv6 --- erts/doc/src/epmd.xml | 2 +- erts/doc/src/erl.xml | 22 +++++ erts/epmd/src/epmd.c | 6 +- erts/epmd/src/epmd_cli.c | 11 ++- erts/epmd/src/epmd_int.h | 38 ++++---- erts/epmd/src/epmd_srv.c | 184 +++++++++++++++++++++++++------------ erts/epmd/test/epmd_SUITE.erl | 33 ++++++- lib/kernel/src/erl_epmd.erl | 18 ++-- lib/kernel/src/inet6_tcp_dist.erl | 2 +- 9 files changed, 223 insertions(+), 93 deletions(-) diff --git a/erts/doc/src/epmd.xml b/erts/doc/src/epmd.xml index 3e70054..3c9313e 100644 --- a/erts/doc/src/epmd.xml +++ b/erts/doc/src/epmd.xml @@ -36,7 +36,7 @@

Erlang Port Mapper Daemon

- +

Starts the port mapper daemon

diff --git a/erts/doc/src/erl.xml b/erts/doc/src/erl.xml index 6221a23..09dc81e 100644 --- a/erts/doc/src/erl.xml +++ b/erts/doc/src/erl.xml @@ -381,6 +381,28 @@ similar to . See code(3).

+ + +

Specify a protocol for Erlang distribution.

+ + inet_tcp + +

TCP over IPv4 (the default)

+
+ inet_ssl + +

distribution over SSL

+
+ inet6_tcp + +

TCP over IPv6

+
+
+

For example, to start up IPv6 distributed nodes:

+
+% erl -name test@REDACTED -proto_dist inet6_tcp
+
+

Starts Erlang with a remote shell connected to .

diff --git a/erts/epmd/src/epmd.c b/erts/epmd/src/epmd.c index 2267f9b..e2bba09 100644 --- a/erts/epmd/src/epmd.c +++ b/erts/epmd/src/epmd.c @@ -335,10 +335,10 @@ static void run_daemon(EpmdVars *g) for (fd = 0; fd < g->max_conn ; fd++) /* close all files ... */ close(fd); /* Syslog on linux will try to write to whatever if we dont - inform it of that the log is closed. */ + inform it that the log is closed. */ closelog(); - /* These chouldn't be needed but for safety... */ + /* These shouldn't be needed but for safety... */ open("/dev/null", O_RDONLY); /* Order is important! */ open("/dev/null", O_WRONLY); @@ -379,7 +379,7 @@ static void run_daemon(EpmdVars *g) close(1); close(2); - /* These chouldn't be needed but for safety... */ + /* These shouldn't be needed but for safety... */ open("nul", O_RDONLY); open("nul", O_WRONLY); diff --git a/erts/epmd/src/epmd_cli.c b/erts/epmd/src/epmd_cli.c index 74408e3..e46a700 100644 --- a/erts/epmd/src/epmd_cli.c +++ b/erts/epmd/src/epmd_cli.c @@ -132,6 +132,7 @@ void epmd_call(EpmdVars *g,int what) static int conn_to_epmd(EpmdVars *g) { struct EPMD_SOCKADDR_IN address; + size_t salen = 0; int connect_sock; connect_sock = socket(FAMILY, SOCK_STREAM, 0); @@ -140,10 +141,16 @@ static int conn_to_epmd(EpmdVars *g) { /* store port number in unsigned short */ unsigned short sport = g->port; - SET_ADDR(address, EPMD_ADDR_LOOPBACK, sport); +#if defined(HAVE_IN6) && defined(AF_INET6) + SET_ADDR6(address, in6addr_loopback, sport); + salen = sizeof(struct sockaddr_in6); +#else + SET_ADDR(address, htonl(INADDR_LOOPBACK), sport); + salen = sizeof(struct sockaddr_in); +#endif } - if (connect(connect_sock, (struct sockaddr*)&address, sizeof address) < 0) + if (connect(connect_sock, (struct sockaddr*)&address, salen) < 0) goto error; return connect_sock; diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h index 14d05c3..9c77e86 100644 --- a/erts/epmd/src/epmd_int.h +++ b/erts/epmd/src/epmd_int.h @@ -49,6 +49,7 @@ # ifndef WINDOWS_H_INCLUDES_WINSOCK2_H # include # endif +# include # include # include #endif @@ -165,33 +166,32 @@ /* ************************************************************************ */ /* Macros that let us use IPv6 */ -#if defined(HAVE_IN6) && defined(AF_INET6) && defined(EPMD6) +#define IS_ADDR_LOOPBACK(addr) ((addr).s_addr == htonl(INADDR_LOOPBACK)) + +#if defined(HAVE_IN6) && defined(AF_INET6) -#define EPMD_SOCKADDR_IN sockaddr_in6 -#define EPMD_IN_ADDR in6_addr -#define EPMD_S_ADDR s6_addr -#define EPMD_ADDR_LOOPBACK in6addr_loopback.s6_addr -#define EPMD_ADDR_ANY in6addr_any.s6_addr +#define EPMD_SOCKADDR_IN sockaddr_storage #define FAMILY AF_INET6 -#define SET_ADDR(dst, addr, port) do { \ - memset((char*)&(dst), 0, sizeof(dst)); \ - memcpy((char*)&(dst).sin6_addr.s6_addr, (char*)&(addr), 16); \ - (dst).sin6_family = AF_INET6; \ - (dst).sin6_flowinfo = 0; \ - (dst).sin6_port = htons(port); \ +#define SET_ADDR6(dst, addr, port) do { \ + struct sockaddr_in6 *sa = (struct sockaddr_in6 *)&(dst); \ + memset(sa, 0, sizeof(dst)); \ + sa->sin6_family = AF_INET6; \ + sa->sin6_addr = (addr); \ + sa->sin6_port = htons(port); \ } while(0) -#define IS_ADDR_LOOPBACK(addr) \ - (memcmp((addr).s6_addr, in6addr_loopback.s6_addr, 16) == 0) +#define SET_ADDR(dst, addr, port) do { \ + struct sockaddr_in *sa = (struct sockaddr_in *)&(dst); \ + memset(sa, 0, sizeof(dst)); \ + sa->sin_family = AF_INET; \ + sa->sin_addr.s_addr = (addr); \ + sa->sin_port = htons(port); \ + } while(0) #else /* Not IP v6 */ #define EPMD_SOCKADDR_IN sockaddr_in -#define EPMD_IN_ADDR in_addr -#define EPMD_S_ADDR s_addr -#define EPMD_ADDR_LOOPBACK htonl(INADDR_LOOPBACK) -#define EPMD_ADDR_ANY htonl(INADDR_ANY) #define FAMILY AF_INET #define SET_ADDR(dst, addr, port) do { \ @@ -201,8 +201,6 @@ (dst).sin_port = htons(port); \ } while(0) -#define IS_ADDR_LOOPBACK(addr) ((addr).s_addr == htonl(INADDR_LOOPBACK)) - #endif /* Not IP v6 */ /* ************************************************************************ */ diff --git a/erts/epmd/src/epmd_srv.c b/erts/epmd/src/epmd_srv.c index da575af..538706b 100644 --- a/erts/epmd/src/epmd_srv.c +++ b/erts/epmd/src/epmd_srv.c @@ -69,6 +69,7 @@ static time_t current_time(EpmdVars*); static Connection *conn_init(EpmdVars*); static int conn_open(EpmdVars*,int); +static int conn_local_peer_check(EpmdVars*, int); static int conn_close_fd(EpmdVars*,int); static void node_init(EpmdVars*); @@ -92,7 +93,7 @@ void run(EpmdVars *g) { struct EPMD_SOCKADDR_IN iserv_addr[MAX_LISTEN_SOCKETS]; int listensock[MAX_LISTEN_SOCKETS]; - int num_sockets; + int num_sockets = 0; int i; int opt; unsigned short sport = g->port; @@ -105,64 +106,82 @@ void run(EpmdVars *g) if (g->addresses != NULL && /* String contains non-separator characters if: */ g->addresses[strspn(g->addresses," ,")] != '\000') { - char *tmp; - char *token; - int loopback_ok = 0; + char *tmp = NULL; + char *token = NULL; + + /* Always listen on the loopback. */ + SET_ADDR(iserv_addr[num_sockets],htonl(INADDR_LOOPBACK),sport); + num_sockets++; +#if defined(HAVE_IN6) && defined(AF_INET6) + SET_ADDR6(iserv_addr[num_sockets],in6addr_loopback,sport); + num_sockets++; +#endif - if ((tmp = (char *)malloc(strlen(g->addresses) + 1)) == NULL) + if ((tmp = strdup(g->addresses)) == NULL) { dbg_perror(g,"cannot allocate memory"); epmd_cleanup_exit(g,1); } - strcpy(tmp,g->addresses); - for(token = strtok(tmp,", "), num_sockets = 0; + for(token = strtok(tmp,", "); token != NULL; - token = strtok(NULL,", "), num_sockets++) + token = strtok(NULL,", ")) { - struct EPMD_IN_ADDR addr; -#ifdef HAVE_INET_PTON - int ret; + struct in_addr addr; +#if defined(HAVE_IN6) && defined(AF_INET6) + struct in6_addr addr6; + struct sockaddr_storage *sa = &iserv_addr[num_sockets]; - if ((ret = inet_pton(FAMILY,token,&addr)) == -1) + if (inet_pton(AF_INET,token,&addr) == 1) { - dbg_perror(g,"cannot convert IP address to network format"); - epmd_cleanup_exit(g,1); + SET_ADDR(iserv_addr[num_sockets],addr.s_addr,sport); + } + else if (inet_pton(AF_INET6,token,&addr6) == 1) + { + SET_ADDR6(iserv_addr[num_sockets],addr6,sport); + } + else +#else + if ((addr.s_addr = inet_addr(token)) != INADDR_NONE) + { + SET_ADDR(iserv_addr[num_sockets],addr.s_addr,sport); } - else if (ret == 0) -#elif !defined(EPMD6) - if ((addr.EPMD_S_ADDR = inet_addr(token)) == INADDR_NONE) + else #endif { dbg_tty_printf(g,0,"cannot parse IP address \"%s\"",token); epmd_cleanup_exit(g,1); } +#if defined(HAVE_IN6) && defined(AF_INET6) + if (sa->ss_family == AF_INET6 && IN6_IS_ADDR_LOOPBACK(&addr6)) + continue; + + if (sa->ss_family == AF_INET) +#endif if (IS_ADDR_LOOPBACK(addr)) - loopback_ok = 1; + continue; - if (num_sockets - loopback_ok == MAX_LISTEN_SOCKETS - 1) + num_sockets++; + + if (num_sockets >= MAX_LISTEN_SOCKETS) { dbg_tty_printf(g,0,"cannot listen on more than %d IP addresses", MAX_LISTEN_SOCKETS); epmd_cleanup_exit(g,1); } - - SET_ADDR(iserv_addr[num_sockets],addr.EPMD_S_ADDR,sport); } free(tmp); - - if (!loopback_ok) - { - SET_ADDR(iserv_addr[num_sockets],EPMD_ADDR_LOOPBACK,sport); - num_sockets++; - } } else { - SET_ADDR(iserv_addr[0],EPMD_ADDR_ANY,sport); - num_sockets = 1; + SET_ADDR(iserv_addr[num_sockets],htonl(INADDR_ANY),sport); + num_sockets++; +#if defined(HAVE_IN6) && defined(AF_INET6) + SET_ADDR6(iserv_addr[num_sockets],in6addr_any,sport); + num_sockets++; +#endif } #if !defined(__WIN32__) @@ -183,13 +202,33 @@ void run(EpmdVars *g) for (i = 0; i < num_sockets; i++) { - if ((listensock[i] = socket(FAMILY,SOCK_STREAM,0)) < 0) + struct sockaddr *sa = (struct sockaddr *)&iserv_addr[i]; +#if defined(HAVE_IN6) && defined(AF_INET6) + size_t salen = (sa->sa_family == AF_INET6 ? + sizeof(struct sockaddr_in6) : + sizeof(struct sockaddr_in)); +#else + size_t salen = sizeof(struct sockaddr_in); +#endif + + if ((listensock[i] = socket(sa->sa_family,SOCK_STREAM,0)) < 0) { dbg_perror(g,"error opening stream socket"); epmd_cleanup_exit(g,1); } g->listenfd[i] = listensock[i]; - + +#if defined(HAVE_IN6) && defined(AF_INET6) + opt = 1; + if (sa->sa_family == AF_INET6 && + setsockopt(listensock[i],IPPROTO_IPV6,IPV6_V6ONLY,&opt, + sizeof(opt)) <0) + { + dbg_perror(g,"can't set IPv6 only socket option"); + epmd_cleanup_exit(g,1); + } +#endif + /* * Note that we must not enable the SO_REUSEADDR on Windows, * because addresses will be reused even if they are still in use. @@ -221,8 +260,7 @@ void run(EpmdVars *g) dbg_perror(g,"failed to set non-blocking mode of listening socket %d", listensock[i]); - if (bind(listensock[i], (struct sockaddr*) &iserv_addr[i], - sizeof(iserv_addr[i])) < 0) + if (bind(listensock[i], (struct sockaddr*) &iserv_addr[i], salen) < 0) { if (errno == EADDRINUSE) { @@ -818,15 +856,6 @@ static int conn_open(EpmdVars *g,int fd) for (i = 0; i < g->max_conn; i++) { if (g->conn[i].open == EPMD_FALSE) { - struct sockaddr_in si; - struct sockaddr_in di; -#ifdef HAVE_SOCKLEN_T - socklen_t st; -#else - int st; -#endif - st = sizeof(si); - g->active_conn++; s = &g->conn[i]; @@ -837,20 +866,7 @@ static int conn_open(EpmdVars *g,int fd) s->open = EPMD_TRUE; s->keep = EPMD_FALSE; - /* Determine if connection is from localhost */ - if (getpeername(s->fd,(struct sockaddr*) &si,&st) || - st < sizeof(si)) { - /* Failure to get peername is regarded as non local host */ - s->local_peer = EPMD_FALSE; - } else { - /* Only 127.x.x.x and connections from the host's IP address - allowed, no false positives */ - s->local_peer = - (((((unsigned) ntohl(si.sin_addr.s_addr)) & 0xFF000000U) == - 0x7F000000U) || - (getsockname(s->fd,(struct sockaddr*) &di,&st) ? - EPMD_FALSE : si.sin_addr.s_addr == di.sin_addr.s_addr)); - } + s->local_peer = conn_local_peer_check(g, s->fd); dbg_tty_printf(g,2,(s->local_peer) ? "Local peer connected" : "Non-local peer connected"); @@ -858,7 +874,7 @@ static int conn_open(EpmdVars *g,int fd) s->got = 0; s->mod_time = current_time(g); /* Note activity */ - s->buf = (char *)malloc(INBUF_SIZE); + s->buf = malloc(INBUF_SIZE); if (s->buf == NULL) { dbg_printf(g,0,"epmd: Insufficient memory"); @@ -876,6 +892,60 @@ static int conn_open(EpmdVars *g,int fd) return EPMD_FALSE; } +static int conn_local_peer_check(EpmdVars *g, int fd) +{ + struct EPMD_SOCKADDR_IN si; + struct EPMD_SOCKADDR_IN di; + + struct sockaddr_in *si4 = (struct sockaddr_in *)&si; + struct sockaddr_in *di4 = (struct sockaddr_in *)&di; + +#if defined(HAVE_IN6) && defined(AF_INET6) + struct sockaddr_in6 *si6 = (struct sockaddr_in6 *)&si; + struct sockaddr_in6 *di6 = (struct sockaddr_in6 *)&di; +#endif + +#ifdef HAVE_SOCKLEN_T + socklen_t st; +#else + int st; +#endif + + st = sizeof(si); + + /* Determine if connection is from localhost */ + if (getpeername(fd,(struct sockaddr*) &si,&st) || + st > sizeof(si)) { + /* Failure to get peername is regarded as non local host */ + return EPMD_FALSE; + } + + /* Only 127.x.x.x and connections from the host's IP address + allowed, no false positives */ +#if defined(HAVE_IN6) && defined(AF_INET6) + if (si.ss_family == AF_INET6 && IN6_IS_ADDR_LOOPBACK(&(si6->sin6_addr))) + return EPMD_TRUE; + + if (si.ss_family == AF_INET) +#endif + if ((((unsigned) ntohl(si4->sin_addr.s_addr)) & 0xFF000000U) == + 0x7F000000U) + return EPMD_TRUE; + + if (getsockname(fd,(struct sockaddr*) &di,&st)) + return EPMD_FALSE; + +#if defined(HAVE_IN6) && defined(AF_INET6) + if (si.ss_family == AF_INET6) + return IN6_ARE_ADDR_EQUAL( &(si6->sin6_addr), &(di6->sin6_addr)); + if (si.ss_family == AF_INET) +#endif + return si4->sin_addr.s_addr == di4->sin_addr.s_addr; +#if defined(HAVE_IN6) && defined(AF_INET6) + return EPMD_FALSE; +#endif +} + static int conn_close_fd(EpmdVars *g,int fd) { int i; diff --git a/erts/epmd/test/epmd_SUITE.erl b/erts/epmd/test/epmd_SUITE.erl index 3f31cd9..5821cd8 100644 --- a/erts/epmd/test/epmd_SUITE.erl +++ b/erts/epmd/test/epmd_SUITE.erl @@ -42,6 +42,7 @@ -export( [ register_name/1, + register_name_ipv6/1, register_names_1/1, register_names_2/1, register_duplicate_name/1, @@ -106,7 +107,8 @@ suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> - [register_name, register_names_1, register_names_2, + [register_name, register_name_ipv6, + register_names_1, register_names_2, register_duplicate_name, get_port_nr, slow_get_port_nr, unregister_others_name_1, unregister_others_name_2, register_overflow, name_with_null_inside, @@ -162,6 +164,24 @@ register_name(Config) when is_list(Config) -> ?line ok = close(Sock), % Unregister ok. +register_name_ipv6(doc) -> + ["Register a name over IPv6"]; +register_name_ipv6(suite) -> + []; +register_name_ipv6(Config) when is_list(Config) -> + % Test if the host has an IPv6 loopback address + Res = gen_tcp:listen(0, [inet6, {ip, {0,0,0,0,0,0,0,1}}]), + case Res of + {ok,LSock} -> + gen_tcp:close(LSock), + ?line ok = epmdrun(), + ?line {ok,Sock} = register_node6("foobar6"), + ?line ok = close(Sock), % Unregister + ok; + _Error -> + {skip, "Host does not have an IPv6 loopback address"} + end. + register_names_1(doc) -> ["Register and unregister two nodes"]; register_names_1(suite) -> @@ -204,12 +224,17 @@ register_node(Name) -> register_node(Name,Port) -> register_node_v2(Port,$M,0,5,5,Name,""). +register_node6(Name) -> + register_node_v2({0,0,0,0,0,0,0,1},?DUMMY_PORT,$M,0,5,5,Name,""). + register_node_v2(Port, NodeType, Prot, HVsn, LVsn, Name, Extra) -> + register_node_v2("localhost", Port, NodeType, Prot, HVsn, LVsn, Name, Extra). +register_node_v2(Addr, Port, NodeType, Prot, HVsn, LVsn, Name, Extra) -> Req = [?EPMD_ALIVE2_REQ, put16(Port), NodeType, Prot, put16(HVsn), put16(LVsn), size16(Name), Name, size16(Extra), Extra], - case send_req(Req) of + case send_req(Req, Addr) of {ok,Sock} -> case recv(Sock,4) of {ok, [?EPMD_ALIVE2_RESP,_Res=0,_C0,_C1]} -> @@ -1092,7 +1117,9 @@ send_direct(Sock, Bytes) -> end. send_req(Req) -> - case connect() of + send_req(Req, "localhost"). +send_req(Req, Addr) -> + case connect(Addr) of {ok,Sock} -> case send(Sock, [size16(Req), Req]) of ok -> diff --git a/lib/kernel/src/erl_epmd.erl b/lib/kernel/src/erl_epmd.erl index 91af49f..21a3dec 100644 --- a/lib/kernel/src/erl_epmd.erl +++ b/lib/kernel/src/erl_epmd.erl @@ -31,7 +31,7 @@ %% External exports -export([start/0, start_link/0, stop/0, port_please/2, port_please/3, names/0, names/1, - register_node/2, open/0, open/1, open/2]). + register_node/2, register_node/3, open/0, open/1, open/2]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -106,7 +106,9 @@ names1(HostName) -> register_node(Name, PortNo) -> - gen_server:call(erl_epmd, {register, Name, PortNo}, infinity). + register_node(Name, PortNo, inet). +register_node(Name, PortNo, Family) -> + gen_server:call(erl_epmd, {register, Name, PortNo, Family}, infinity). %%%---------------------------------------------------------------------- %%% Callback functions from gen_server @@ -124,10 +126,10 @@ init(_) -> -spec handle_call(calls(), term(), state()) -> {'reply', term(), state()} | {'stop', 'shutdown', 'ok', state()}. -handle_call({register, Name, PortNo}, _From, State) -> +handle_call({register, Name, PortNo, Family}, _From, State) -> case State#state.socket of P when P < 0 -> - case do_register_node(Name, PortNo) of + case do_register_node(Name, PortNo, Family) of {alive, Socket, Creation} -> S = State#state{socket = Socket, port_no = PortNo, @@ -210,8 +212,12 @@ open({A,B,C,D,E,F,G,H}=EpmdAddr, Timeout) when ?ip6(A,B,C,D,E,F,G,H) -> close(Socket) -> gen_tcp:close(Socket). -do_register_node(NodeName, TcpPort) -> - case open() of +do_register_node(NodeName, TcpPort, Family) -> + Localhost = case Family of + inet -> open({127,0,0,1}); + inet6 -> open({0,0,0,0,0,0,0,1}) + end, + case Localhost of {ok, Socket} -> Name = to_string(NodeName), Extra = "", diff --git a/lib/kernel/src/inet6_tcp_dist.erl b/lib/kernel/src/inet6_tcp_dist.erl index b9c4fa6..0b5fb44 100644 --- a/lib/kernel/src/inet6_tcp_dist.erl +++ b/lib/kernel/src/inet6_tcp_dist.erl @@ -71,7 +71,7 @@ listen(Name) -> {ok, Socket} -> TcpAddress = get_tcp_address(Socket), {_,Port} = TcpAddress#net_address.address, - {ok, Creation} = erl_epmd:register_node(Name, Port), + {ok, Creation} = erl_epmd:register_node(Name, Port, inet6), {ok, {Socket, TcpAddress, Creation}}; Error -> Error -- 1.7.9.5 From henrik@REDACTED Wed Nov 7 09:35:56 2012 From: henrik@REDACTED (Henrik Nord) Date: Wed, 7 Nov 2012 09:35:56 +0100 Subject: [erlang-patches] [PATCH] epmd: support IPv6 node registration In-Reply-To: <20121107002417.GA7235@ioctl> References: <20121107002417.GA7235@ioctl> Message-ID: <509A1D6C.2050502@erlang.org> I have refetched On 11/07/2012 01:24 AM, Michael Santos wrote: > Allow IPv6 nodes to register with and query epmd. On systems with > IPv6 support: > > * epmd listens on the IPv4 and IPv6 ANY or loopback sockets > > * the epmd cli client connects to epmd using the IPv6 loopback > > * distributed nodes started with "-proto_dist inet6_tcp" will register > with epmd over IPv6 > --- > erts/doc/src/epmd.xml | 2 +- > erts/doc/src/erl.xml | 22 +++++ > erts/epmd/src/epmd.c | 6 +- > erts/epmd/src/epmd_cli.c | 11 ++- > erts/epmd/src/epmd_int.h | 38 ++++---- > erts/epmd/src/epmd_srv.c | 184 +++++++++++++++++++++++++------------ > erts/epmd/test/epmd_SUITE.erl | 33 ++++++- > lib/kernel/src/erl_epmd.erl | 18 ++-- > lib/kernel/src/inet6_tcp_dist.erl | 2 +- > 9 files changed, 223 insertions(+), 93 deletions(-) > > diff --git a/erts/doc/src/epmd.xml b/erts/doc/src/epmd.xml > index 3e70054..3c9313e 100644 > --- a/erts/doc/src/epmd.xml > +++ b/erts/doc/src/epmd.xml > @@ -36,7 +36,7 @@ > >

Erlang Port Mapper Daemon

> > - > + > >

Starts the port mapper daemon

>
> diff --git a/erts/doc/src/erl.xml b/erts/doc/src/erl.xml > index 6221a23..09dc81e 100644 > --- a/erts/doc/src/erl.xml > +++ b/erts/doc/src/erl.xml > @@ -381,6 +381,28 @@ > similar to . See > code(3).

>
> + > + > +

Specify a protocol for Erlang distribution.

> + > + inet_tcp > + > +

TCP over IPv4 (the default)

> +
> + inet_ssl > + > +

distribution over SSL

> +
> + inet6_tcp > + > +

TCP over IPv6

> +
> +
> +

For example, to start up IPv6 distributed nodes:

> +
> +% erl -name test@REDACTED -proto_dist inet6_tcp
> +
> +
> > >

Starts Erlang with a remote shell connected to .

> diff --git a/erts/epmd/src/epmd.c b/erts/epmd/src/epmd.c > index 2267f9b..e2bba09 100644 > --- a/erts/epmd/src/epmd.c > +++ b/erts/epmd/src/epmd.c > @@ -335,10 +335,10 @@ static void run_daemon(EpmdVars *g) > for (fd = 0; fd < g->max_conn ; fd++) /* close all files ... */ > close(fd); > /* Syslog on linux will try to write to whatever if we dont > - inform it of that the log is closed. */ > + inform it that the log is closed. */ > closelog(); > > - /* These chouldn't be needed but for safety... */ > + /* These shouldn't be needed but for safety... */ > > open("/dev/null", O_RDONLY); /* Order is important! */ > open("/dev/null", O_WRONLY); > @@ -379,7 +379,7 @@ static void run_daemon(EpmdVars *g) > close(1); > close(2); > > - /* These chouldn't be needed but for safety... */ > + /* These shouldn't be needed but for safety... */ > > open("nul", O_RDONLY); > open("nul", O_WRONLY); > diff --git a/erts/epmd/src/epmd_cli.c b/erts/epmd/src/epmd_cli.c > index 74408e3..e46a700 100644 > --- a/erts/epmd/src/epmd_cli.c > +++ b/erts/epmd/src/epmd_cli.c > @@ -132,6 +132,7 @@ void epmd_call(EpmdVars *g,int what) > static int conn_to_epmd(EpmdVars *g) > { > struct EPMD_SOCKADDR_IN address; > + size_t salen = 0; > int connect_sock; > > connect_sock = socket(FAMILY, SOCK_STREAM, 0); > @@ -140,10 +141,16 @@ static int conn_to_epmd(EpmdVars *g) > > { /* store port number in unsigned short */ > unsigned short sport = g->port; > - SET_ADDR(address, EPMD_ADDR_LOOPBACK, sport); > +#if defined(HAVE_IN6) && defined(AF_INET6) > + SET_ADDR6(address, in6addr_loopback, sport); > + salen = sizeof(struct sockaddr_in6); > +#else > + SET_ADDR(address, htonl(INADDR_LOOPBACK), sport); > + salen = sizeof(struct sockaddr_in); > +#endif > } > > - if (connect(connect_sock, (struct sockaddr*)&address, sizeof address) < 0) > + if (connect(connect_sock, (struct sockaddr*)&address, salen) < 0) > goto error; > return connect_sock; > > diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h > index 14d05c3..9c77e86 100644 > --- a/erts/epmd/src/epmd_int.h > +++ b/erts/epmd/src/epmd_int.h > @@ -49,6 +49,7 @@ > # ifndef WINDOWS_H_INCLUDES_WINSOCK2_H > # include > # endif > +# include > # include > # include > #endif > @@ -165,33 +166,32 @@ > /* ************************************************************************ */ > /* Macros that let us use IPv6 */ > > -#if defined(HAVE_IN6) && defined(AF_INET6) && defined(EPMD6) > +#define IS_ADDR_LOOPBACK(addr) ((addr).s_addr == htonl(INADDR_LOOPBACK)) > + > +#if defined(HAVE_IN6) && defined(AF_INET6) > > -#define EPMD_SOCKADDR_IN sockaddr_in6 > -#define EPMD_IN_ADDR in6_addr > -#define EPMD_S_ADDR s6_addr > -#define EPMD_ADDR_LOOPBACK in6addr_loopback.s6_addr > -#define EPMD_ADDR_ANY in6addr_any.s6_addr > +#define EPMD_SOCKADDR_IN sockaddr_storage > #define FAMILY AF_INET6 > > -#define SET_ADDR(dst, addr, port) do { \ > - memset((char*)&(dst), 0, sizeof(dst)); \ > - memcpy((char*)&(dst).sin6_addr.s6_addr, (char*)&(addr), 16); \ > - (dst).sin6_family = AF_INET6; \ > - (dst).sin6_flowinfo = 0; \ > - (dst).sin6_port = htons(port); \ > +#define SET_ADDR6(dst, addr, port) do { \ > + struct sockaddr_in6 *sa = (struct sockaddr_in6 *)&(dst); \ > + memset(sa, 0, sizeof(dst)); \ > + sa->sin6_family = AF_INET6; \ > + sa->sin6_addr = (addr); \ > + sa->sin6_port = htons(port); \ > } while(0) > > -#define IS_ADDR_LOOPBACK(addr) \ > - (memcmp((addr).s6_addr, in6addr_loopback.s6_addr, 16) == 0) > +#define SET_ADDR(dst, addr, port) do { \ > + struct sockaddr_in *sa = (struct sockaddr_in *)&(dst); \ > + memset(sa, 0, sizeof(dst)); \ > + sa->sin_family = AF_INET; \ > + sa->sin_addr.s_addr = (addr); \ > + sa->sin_port = htons(port); \ > + } while(0) > > #else /* Not IP v6 */ > > #define EPMD_SOCKADDR_IN sockaddr_in > -#define EPMD_IN_ADDR in_addr > -#define EPMD_S_ADDR s_addr > -#define EPMD_ADDR_LOOPBACK htonl(INADDR_LOOPBACK) > -#define EPMD_ADDR_ANY htonl(INADDR_ANY) > #define FAMILY AF_INET > > #define SET_ADDR(dst, addr, port) do { \ > @@ -201,8 +201,6 @@ > (dst).sin_port = htons(port); \ > } while(0) > > -#define IS_ADDR_LOOPBACK(addr) ((addr).s_addr == htonl(INADDR_LOOPBACK)) > - > #endif /* Not IP v6 */ > > /* ************************************************************************ */ > diff --git a/erts/epmd/src/epmd_srv.c b/erts/epmd/src/epmd_srv.c > index da575af..538706b 100644 > --- a/erts/epmd/src/epmd_srv.c > +++ b/erts/epmd/src/epmd_srv.c > @@ -69,6 +69,7 @@ static time_t current_time(EpmdVars*); > > static Connection *conn_init(EpmdVars*); > static int conn_open(EpmdVars*,int); > +static int conn_local_peer_check(EpmdVars*, int); > static int conn_close_fd(EpmdVars*,int); > > static void node_init(EpmdVars*); > @@ -92,7 +93,7 @@ void run(EpmdVars *g) > { > struct EPMD_SOCKADDR_IN iserv_addr[MAX_LISTEN_SOCKETS]; > int listensock[MAX_LISTEN_SOCKETS]; > - int num_sockets; > + int num_sockets = 0; > int i; > int opt; > unsigned short sport = g->port; > @@ -105,64 +106,82 @@ void run(EpmdVars *g) > if (g->addresses != NULL && /* String contains non-separator characters if: */ > g->addresses[strspn(g->addresses," ,")] != '\000') > { > - char *tmp; > - char *token; > - int loopback_ok = 0; > + char *tmp = NULL; > + char *token = NULL; > + > + /* Always listen on the loopback. */ > + SET_ADDR(iserv_addr[num_sockets],htonl(INADDR_LOOPBACK),sport); > + num_sockets++; > +#if defined(HAVE_IN6) && defined(AF_INET6) > + SET_ADDR6(iserv_addr[num_sockets],in6addr_loopback,sport); > + num_sockets++; > +#endif > > - if ((tmp = (char *)malloc(strlen(g->addresses) + 1)) == NULL) > + if ((tmp = strdup(g->addresses)) == NULL) > { > dbg_perror(g,"cannot allocate memory"); > epmd_cleanup_exit(g,1); > } > - strcpy(tmp,g->addresses); > > - for(token = strtok(tmp,", "), num_sockets = 0; > + for(token = strtok(tmp,", "); > token != NULL; > - token = strtok(NULL,", "), num_sockets++) > + token = strtok(NULL,", ")) > { > - struct EPMD_IN_ADDR addr; > -#ifdef HAVE_INET_PTON > - int ret; > + struct in_addr addr; > +#if defined(HAVE_IN6) && defined(AF_INET6) > + struct in6_addr addr6; > + struct sockaddr_storage *sa = &iserv_addr[num_sockets]; > > - if ((ret = inet_pton(FAMILY,token,&addr)) == -1) > + if (inet_pton(AF_INET,token,&addr) == 1) > { > - dbg_perror(g,"cannot convert IP address to network format"); > - epmd_cleanup_exit(g,1); > + SET_ADDR(iserv_addr[num_sockets],addr.s_addr,sport); > + } > + else if (inet_pton(AF_INET6,token,&addr6) == 1) > + { > + SET_ADDR6(iserv_addr[num_sockets],addr6,sport); > + } > + else > +#else > + if ((addr.s_addr = inet_addr(token)) != INADDR_NONE) > + { > + SET_ADDR(iserv_addr[num_sockets],addr.s_addr,sport); > } > - else if (ret == 0) > -#elif !defined(EPMD6) > - if ((addr.EPMD_S_ADDR = inet_addr(token)) == INADDR_NONE) > + else > #endif > { > dbg_tty_printf(g,0,"cannot parse IP address \"%s\"",token); > epmd_cleanup_exit(g,1); > } > > +#if defined(HAVE_IN6) && defined(AF_INET6) > + if (sa->ss_family == AF_INET6 && IN6_IS_ADDR_LOOPBACK(&addr6)) > + continue; > + > + if (sa->ss_family == AF_INET) > +#endif > if (IS_ADDR_LOOPBACK(addr)) > - loopback_ok = 1; > + continue; > > - if (num_sockets - loopback_ok == MAX_LISTEN_SOCKETS - 1) > + num_sockets++; > + > + if (num_sockets >= MAX_LISTEN_SOCKETS) > { > dbg_tty_printf(g,0,"cannot listen on more than %d IP addresses", > MAX_LISTEN_SOCKETS); > epmd_cleanup_exit(g,1); > } > - > - SET_ADDR(iserv_addr[num_sockets],addr.EPMD_S_ADDR,sport); > } > > free(tmp); > - > - if (!loopback_ok) > - { > - SET_ADDR(iserv_addr[num_sockets],EPMD_ADDR_LOOPBACK,sport); > - num_sockets++; > - } > } > else > { > - SET_ADDR(iserv_addr[0],EPMD_ADDR_ANY,sport); > - num_sockets = 1; > + SET_ADDR(iserv_addr[num_sockets],htonl(INADDR_ANY),sport); > + num_sockets++; > +#if defined(HAVE_IN6) && defined(AF_INET6) > + SET_ADDR6(iserv_addr[num_sockets],in6addr_any,sport); > + num_sockets++; > +#endif > } > > #if !defined(__WIN32__) > @@ -183,13 +202,33 @@ void run(EpmdVars *g) > > for (i = 0; i < num_sockets; i++) > { > - if ((listensock[i] = socket(FAMILY,SOCK_STREAM,0)) < 0) > + struct sockaddr *sa = (struct sockaddr *)&iserv_addr[i]; > +#if defined(HAVE_IN6) && defined(AF_INET6) > + size_t salen = (sa->sa_family == AF_INET6 ? > + sizeof(struct sockaddr_in6) : > + sizeof(struct sockaddr_in)); > +#else > + size_t salen = sizeof(struct sockaddr_in); > +#endif > + > + if ((listensock[i] = socket(sa->sa_family,SOCK_STREAM,0)) < 0) > { > dbg_perror(g,"error opening stream socket"); > epmd_cleanup_exit(g,1); > } > g->listenfd[i] = listensock[i]; > - > + > +#if defined(HAVE_IN6) && defined(AF_INET6) > + opt = 1; > + if (sa->sa_family == AF_INET6 && > + setsockopt(listensock[i],IPPROTO_IPV6,IPV6_V6ONLY,&opt, > + sizeof(opt)) <0) > + { > + dbg_perror(g,"can't set IPv6 only socket option"); > + epmd_cleanup_exit(g,1); > + } > +#endif > + > /* > * Note that we must not enable the SO_REUSEADDR on Windows, > * because addresses will be reused even if they are still in use. > @@ -221,8 +260,7 @@ void run(EpmdVars *g) > dbg_perror(g,"failed to set non-blocking mode of listening socket %d", > listensock[i]); > > - if (bind(listensock[i], (struct sockaddr*) &iserv_addr[i], > - sizeof(iserv_addr[i])) < 0) > + if (bind(listensock[i], (struct sockaddr*) &iserv_addr[i], salen) < 0) > { > if (errno == EADDRINUSE) > { > @@ -818,15 +856,6 @@ static int conn_open(EpmdVars *g,int fd) > > for (i = 0; i < g->max_conn; i++) { > if (g->conn[i].open == EPMD_FALSE) { > - struct sockaddr_in si; > - struct sockaddr_in di; > -#ifdef HAVE_SOCKLEN_T > - socklen_t st; > -#else > - int st; > -#endif > - st = sizeof(si); > - > g->active_conn++; > s = &g->conn[i]; > > @@ -837,20 +866,7 @@ static int conn_open(EpmdVars *g,int fd) > s->open = EPMD_TRUE; > s->keep = EPMD_FALSE; > > - /* Determine if connection is from localhost */ > - if (getpeername(s->fd,(struct sockaddr*) &si,&st) || > - st < sizeof(si)) { > - /* Failure to get peername is regarded as non local host */ > - s->local_peer = EPMD_FALSE; > - } else { > - /* Only 127.x.x.x and connections from the host's IP address > - allowed, no false positives */ > - s->local_peer = > - (((((unsigned) ntohl(si.sin_addr.s_addr)) & 0xFF000000U) == > - 0x7F000000U) || > - (getsockname(s->fd,(struct sockaddr*) &di,&st) ? > - EPMD_FALSE : si.sin_addr.s_addr == di.sin_addr.s_addr)); > - } > + s->local_peer = conn_local_peer_check(g, s->fd); > dbg_tty_printf(g,2,(s->local_peer) ? "Local peer connected" : > "Non-local peer connected"); > > @@ -858,7 +874,7 @@ static int conn_open(EpmdVars *g,int fd) > s->got = 0; > s->mod_time = current_time(g); /* Note activity */ > > - s->buf = (char *)malloc(INBUF_SIZE); > + s->buf = malloc(INBUF_SIZE); > > if (s->buf == NULL) { > dbg_printf(g,0,"epmd: Insufficient memory"); > @@ -876,6 +892,60 @@ static int conn_open(EpmdVars *g,int fd) > return EPMD_FALSE; > } > > +static int conn_local_peer_check(EpmdVars *g, int fd) > +{ > + struct EPMD_SOCKADDR_IN si; > + struct EPMD_SOCKADDR_IN di; > + > + struct sockaddr_in *si4 = (struct sockaddr_in *)&si; > + struct sockaddr_in *di4 = (struct sockaddr_in *)&di; > + > +#if defined(HAVE_IN6) && defined(AF_INET6) > + struct sockaddr_in6 *si6 = (struct sockaddr_in6 *)&si; > + struct sockaddr_in6 *di6 = (struct sockaddr_in6 *)&di; > +#endif > + > +#ifdef HAVE_SOCKLEN_T > + socklen_t st; > +#else > + int st; > +#endif > + > + st = sizeof(si); > + > + /* Determine if connection is from localhost */ > + if (getpeername(fd,(struct sockaddr*) &si,&st) || > + st > sizeof(si)) { > + /* Failure to get peername is regarded as non local host */ > + return EPMD_FALSE; > + } > + > + /* Only 127.x.x.x and connections from the host's IP address > + allowed, no false positives */ > +#if defined(HAVE_IN6) && defined(AF_INET6) > + if (si.ss_family == AF_INET6 && IN6_IS_ADDR_LOOPBACK(&(si6->sin6_addr))) > + return EPMD_TRUE; > + > + if (si.ss_family == AF_INET) > +#endif > + if ((((unsigned) ntohl(si4->sin_addr.s_addr)) & 0xFF000000U) == > + 0x7F000000U) > + return EPMD_TRUE; > + > + if (getsockname(fd,(struct sockaddr*) &di,&st)) > + return EPMD_FALSE; > + > +#if defined(HAVE_IN6) && defined(AF_INET6) > + if (si.ss_family == AF_INET6) > + return IN6_ARE_ADDR_EQUAL( &(si6->sin6_addr), &(di6->sin6_addr)); > + if (si.ss_family == AF_INET) > +#endif > + return si4->sin_addr.s_addr == di4->sin_addr.s_addr; > +#if defined(HAVE_IN6) && defined(AF_INET6) > + return EPMD_FALSE; > +#endif > +} > + > static int conn_close_fd(EpmdVars *g,int fd) > { > int i; > diff --git a/erts/epmd/test/epmd_SUITE.erl b/erts/epmd/test/epmd_SUITE.erl > index 3f31cd9..5821cd8 100644 > --- a/erts/epmd/test/epmd_SUITE.erl > +++ b/erts/epmd/test/epmd_SUITE.erl > @@ -42,6 +42,7 @@ > -export( > [ > register_name/1, > + register_name_ipv6/1, > register_names_1/1, > register_names_2/1, > register_duplicate_name/1, > @@ -106,7 +107,8 @@ > suite() -> [{ct_hooks,[ts_install_cth]}]. > > all() -> > - [register_name, register_names_1, register_names_2, > + [register_name, register_name_ipv6, > + register_names_1, register_names_2, > register_duplicate_name, get_port_nr, slow_get_port_nr, > unregister_others_name_1, unregister_others_name_2, > register_overflow, name_with_null_inside, > @@ -162,6 +164,24 @@ register_name(Config) when is_list(Config) -> > ?line ok = close(Sock), % Unregister > ok. > > +register_name_ipv6(doc) -> > + ["Register a name over IPv6"]; > +register_name_ipv6(suite) -> > + []; > +register_name_ipv6(Config) when is_list(Config) -> > + % Test if the host has an IPv6 loopback address > + Res = gen_tcp:listen(0, [inet6, {ip, {0,0,0,0,0,0,0,1}}]), > + case Res of > + {ok,LSock} -> > + gen_tcp:close(LSock), > + ?line ok = epmdrun(), > + ?line {ok,Sock} = register_node6("foobar6"), > + ?line ok = close(Sock), % Unregister > + ok; > + _Error -> > + {skip, "Host does not have an IPv6 loopback address"} > + end. > + > register_names_1(doc) -> > ["Register and unregister two nodes"]; > register_names_1(suite) -> > @@ -204,12 +224,17 @@ register_node(Name) -> > register_node(Name,Port) -> > register_node_v2(Port,$M,0,5,5,Name,""). > > +register_node6(Name) -> > + register_node_v2({0,0,0,0,0,0,0,1},?DUMMY_PORT,$M,0,5,5,Name,""). > + > register_node_v2(Port, NodeType, Prot, HVsn, LVsn, Name, Extra) -> > + register_node_v2("localhost", Port, NodeType, Prot, HVsn, LVsn, Name, Extra). > +register_node_v2(Addr, Port, NodeType, Prot, HVsn, LVsn, Name, Extra) -> > Req = [?EPMD_ALIVE2_REQ, put16(Port), NodeType, Prot, > put16(HVsn), put16(LVsn), > size16(Name), Name, > size16(Extra), Extra], > - case send_req(Req) of > + case send_req(Req, Addr) of > {ok,Sock} -> > case recv(Sock,4) of > {ok, [?EPMD_ALIVE2_RESP,_Res=0,_C0,_C1]} -> > @@ -1092,7 +1117,9 @@ send_direct(Sock, Bytes) -> > end. > > send_req(Req) -> > - case connect() of > + send_req(Req, "localhost"). > +send_req(Req, Addr) -> > + case connect(Addr) of > {ok,Sock} -> > case send(Sock, [size16(Req), Req]) of > ok -> > diff --git a/lib/kernel/src/erl_epmd.erl b/lib/kernel/src/erl_epmd.erl > index 91af49f..21a3dec 100644 > --- a/lib/kernel/src/erl_epmd.erl > +++ b/lib/kernel/src/erl_epmd.erl > @@ -31,7 +31,7 @@ > %% External exports > -export([start/0, start_link/0, stop/0, port_please/2, > port_please/3, names/0, names/1, > - register_node/2, open/0, open/1, open/2]). > + register_node/2, register_node/3, open/0, open/1, open/2]). > > %% gen_server callbacks > -export([init/1, handle_call/3, handle_cast/2, handle_info/2, > @@ -106,7 +106,9 @@ names1(HostName) -> > > > register_node(Name, PortNo) -> > - gen_server:call(erl_epmd, {register, Name, PortNo}, infinity). > + register_node(Name, PortNo, inet). > +register_node(Name, PortNo, Family) -> > + gen_server:call(erl_epmd, {register, Name, PortNo, Family}, infinity). > > %%%---------------------------------------------------------------------- > %%% Callback functions from gen_server > @@ -124,10 +126,10 @@ init(_) -> > -spec handle_call(calls(), term(), state()) -> > {'reply', term(), state()} | {'stop', 'shutdown', 'ok', state()}. > > -handle_call({register, Name, PortNo}, _From, State) -> > +handle_call({register, Name, PortNo, Family}, _From, State) -> > case State#state.socket of > P when P < 0 -> > - case do_register_node(Name, PortNo) of > + case do_register_node(Name, PortNo, Family) of > {alive, Socket, Creation} -> > S = State#state{socket = Socket, > port_no = PortNo, > @@ -210,8 +212,12 @@ open({A,B,C,D,E,F,G,H}=EpmdAddr, Timeout) when ?ip6(A,B,C,D,E,F,G,H) -> > close(Socket) -> > gen_tcp:close(Socket). > > -do_register_node(NodeName, TcpPort) -> > - case open() of > +do_register_node(NodeName, TcpPort, Family) -> > + Localhost = case Family of > + inet -> open({127,0,0,1}); > + inet6 -> open({0,0,0,0,0,0,0,1}) > + end, > + case Localhost of > {ok, Socket} -> > Name = to_string(NodeName), > Extra = "", > diff --git a/lib/kernel/src/inet6_tcp_dist.erl b/lib/kernel/src/inet6_tcp_dist.erl > index b9c4fa6..0b5fb44 100644 > --- a/lib/kernel/src/inet6_tcp_dist.erl > +++ b/lib/kernel/src/inet6_tcp_dist.erl > @@ -71,7 +71,7 @@ listen(Name) -> > {ok, Socket} -> > TcpAddress = get_tcp_address(Socket), > {_,Port} = TcpAddress#net_address.address, > - {ok, Creation} = erl_epmd:register_node(Name, Port), > + {ok, Creation} = erl_epmd:register_node(Name, Port, inet6), > {ok, {Socket, TcpAddress, Creation}}; > Error -> > Error -- /Henrik Nord Erlang/OTP From hm@REDACTED Wed Nov 7 09:48:43 2012 From: hm@REDACTED (=?ISO-8859-1?Q?H=E5kan_Mattsson?=) Date: Wed, 7 Nov 2012 09:48:43 +0100 Subject: [erlang-patches] Debugger settings Message-ID: The wxFileDialog behaves a bit different in Ubuntu 12.10. In the Debugger this caused the settings to be stored in $HOME instead of $HOME/.erlang_tools/debugger (or whatever the user has entered). This has been fixed. git fetch git://github.com/hawk/otp.git hawk/debugger_settings_dialog or viewed here https://github.com/hawk/otp/compare/hawk/debugger_settings_dialog https://github.com/hawk/otp/compare/hawk/debugger_settings_dialog.patch /H?kan From tjarvstrand@REDACTED Wed Nov 7 11:16:27 2012 From: tjarvstrand@REDACTED (=?ISO-8859-1?Q?Thomas_J=E4rvstrand?=) Date: Wed, 7 Nov 2012 11:16:27 +0100 Subject: [erlang-patches] Tweaking regexp in erlang-font-lock-keywords-vars In-Reply-To: References: Message-ID: Hi! I've updated the patch. Currently font-lock fontification in erlang-mode fails for the first erlang variable in the fontification region if the region to fontify starts on the same position as the variable. This is because the current regexp requires at least one character (any character except #) to be present before the actual variable names starts. This patch exchanges the straight regexp with a fun that searches for a match for erlang-variable-regexp and then asserts that the match is not preceeded by a #, thus relieving the requirement of at least one preceeding character to be present in the search range before a variable name. The use case is that I'm trying to accomplish syntax highlighting in the erlang-shell inside Emacs and the problem I encountered was that in the following example only Bar would be highlighted as a variable. 1> Foo = Bar. > Repo: git fetch git@REDACTED:tjarvstrand/ otp.git erlang-font-lock-keyword-vars Comparison: https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars.patch Regards Thomas J?rvstrand 2012/11/6 Thomas J?rvstrand > Please disregard this patch, it does not work as intended. Sorry for the > noise. > > Thomas > > > 2012/11/6 Thomas J?rvstrand > >> Hi! >> >> Currently font-lock fontification in erlang-mode fails for the first >> erlang variable in the fontification region if the region to fontify starts >> on the same position as the variable. This is because the current regexp >> requires at least one character (any character except #) to be present >> before the actual variable names starts. This patch tweaks the regexp >> slightly to allow either a start-of-word or a non-# at the head of the >> variable-name. >> >> The use case is that I'm trying to accomplish syntax highlighting in the >> erlang-shell inside Emacs and the problem I encountered was that in the >> following example only Bar would be highlighted as a variable. >> >> 1> Foo = Bar. >>> >> >> Repo: >> git fetch git@REDACTED:tjarvstrand/otp.git >> erlang-font-lock-keyword-vars >> >> Comparison: >> https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars >> >> https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars.patch >> >> Regards >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tjarvstrand@REDACTED Wed Nov 7 13:29:34 2012 From: tjarvstrand@REDACTED (=?ISO-8859-1?Q?Thomas_J=E4rvstrand?=) Date: Wed, 7 Nov 2012 13:29:34 +0100 Subject: [erlang-patches] Tweaking regexp in erlang-font-lock-keywords-vars In-Reply-To: References: Message-ID: This is embarrasing. Turns out this version gives variable highlighing in comments. T 2012/11/7 Thomas J?rvstrand > Hi! > > I've updated the patch. > > Currently font-lock fontification in erlang-mode fails for the first > erlang variable in the fontification region if the region to fontify starts > on the same position as the variable. This is because the current regexp > requires at least one character (any character except #) to be present > before the actual variable names starts. This patch exchanges the straight > regexp with a fun that searches for a match for erlang-variable-regexp and > then asserts that the match is not preceeded by a #, thus relieving the > requirement of at least one preceeding character to be present in the > search range before a variable name. > > > The use case is that I'm trying to accomplish syntax highlighting in the > erlang-shell inside Emacs and the problem I encountered was that in the > following example only Bar would be highlighted as a variable. > > 1> Foo = Bar. >> > > Repo: > git fetch git@REDACTED:tjarvstrand/ > otp.git erlang-font-lock-keyword-vars > > Comparison: > https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars > > https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars.patch > > Regards > Thomas J?rvstrand > > > 2012/11/6 Thomas J?rvstrand > >> Please disregard this patch, it does not work as intended. Sorry for the >> noise. >> >> Thomas >> >> >> 2012/11/6 Thomas J?rvstrand >> >>> Hi! >>> >>> Currently font-lock fontification in erlang-mode fails for the first >>> erlang variable in the fontification region if the region to fontify starts >>> on the same position as the variable. This is because the current regexp >>> requires at least one character (any character except #) to be present >>> before the actual variable names starts. This patch tweaks the regexp >>> slightly to allow either a start-of-word or a non-# at the head of the >>> variable-name. >>> >>> The use case is that I'm trying to accomplish syntax highlighting in the >>> erlang-shell inside Emacs and the problem I encountered was that in the >>> following example only Bar would be highlighted as a variable. >>> >>> 1> Foo = Bar. >>>> >>> >>> Repo: >>> git fetch git@REDACTED:tjarvstrand/otp.git >>> erlang-font-lock-keyword-vars >>> >>> Comparison: >>> https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars >>> >>> https://github.com/tjarvstrand/otp/compare/erlang-font-lock-keyword-vars.patch >>> >>> Regards >>> >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Wed Nov 7 13:44:25 2012 From: henrik@REDACTED (Henrik Nord) Date: Wed, 7 Nov 2012 13:44:25 +0100 Subject: [erlang-patches] Promote compiler option 'inline_list_funcs' In-Reply-To: References: Message-ID: <509A57A9.5000501@erlang.org> Add this patch to 'master-pu' On 11/03/2012 07:02 PM, Anthony Ramine wrote: > The compiler option inline_list_funcs has been present in Erlang/OTP > since at least release R9B0. It enables the inlining of the most used > list manipulation functions of the stdlib's lists module. > > This couple of commits fix some wrong warnings triggered by the option > if the result of the inlined function is not actually used and mention > it in the documentation. > > https://github.com/nox/otp/compare/promote-inline_list_funcs > https://github.com/nox/otp/compare/promote-inline_list_funcs.patch > > Regards, > > > The following changes since commit d5733bc3e34449affde2594d85b905c8ab440d42: > > Merge branch 'egil/ensure-erl_crash.dump/OTP-10422' into maint > (2012-10-24 14:20:26 +0200) > > are available in the git repository at: > > https://github.com/nox/otp promote-inline_list_funcs > > for you to fetch changes up to 6ac8429cbe1072af6d615f668523237a2d040ed0: > > Document compiler option 'inline_list_funcs' (2012-11-03 18:55:07 +0100) > > ---------------------------------------------------------------- > Anthony Ramine (2): > Silence some wrong warnings triggered by inline_list_funcs > Document compiler option 'inline_list_funcs' > > lib/compiler/doc/src/compile.xml | 26 ++++++++++++++++++++++++++ > lib/compiler/src/sys_core_fold.erl | 20 ++++++++++++++------ > 2 files changed, 40 insertions(+), 6 deletions(-) > > diff --git a/lib/compiler/doc/src/compile.xml b/lib/compiler/doc/src/compile.xml > index 27d750f..e9375d6 100644 > --- a/lib/compiler/doc/src/compile.xml > +++ b/lib/compiler/doc/src/compile.xml > @@ -816,6 +816,32 @@ pi() -> 3.1416. >
> >
> + Inlining of list functions > +

The compiler can also inline a variety of list manipulation functions > + from the stdlib's lists module.

> + > +

This feature must be explicitely enabled with a compiler option or a > + -compile() attribute in the source module.

> + > +

To enable inlining of list functions, use the inline_list_funcs > + option.

> + > +

The following functions are inlined:

> + > + lists:all/1 > + lists:any/1 > + marker="stdlib:lists#foreach/2">lists:foreach/2 > + lists:map/2 > + marker="stdlib:lists#flatmap/2">lists:flatmap/2 > + marker="stdlib:lists#filter/1">lists:filter/2 > + marker="stdlib:lists#foldl/3">lists:foldl/3 > + marker="stdlib:lists#foldr/3">lists:foldr/3 > + marker="stdlib:lists#mapfoldl/3">lists:mapfoldl/3 > + marker="stdlib:lists#mapfoldr/3">lists:mapfoldr/3 > + > +
> + > +
> Parse Transformations > >

Parse transformations are used when a programmer wants to use > diff --git a/lib/compiler/src/sys_core_fold.erl > b/lib/compiler/src/sys_core_fold.erl > index 18fba79..17397be 100644 > --- a/lib/compiler/src/sys_core_fold.erl > +++ b/lib/compiler/src/sys_core_fold.erl > @@ -756,6 +756,7 @@ call_1(#c_call{anno=Anno}, lists, map, [Arg1,Arg2], Sub) -> > op=F, > args=[X]}, > body=#c_cons{hd=H, > + anno=[compiler_generated], > tl=#c_apply{anno=Anno, > op=Loop, > args=[Xs]}}}}, > @@ -780,7 +781,7 @@ call_1(#c_call{anno=Anno}, lists, flatmap, > [Arg1,Arg2], Sub) -> > C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true}, > body=#c_let{vars=[H], > arg=#c_apply{anno=Anno, op=F, args=[X]}, > - body=#c_call{anno=Anno, > + body=#c_call{anno=[compiler_generated|Anno], > module=#c_literal{val=erlang}, > name=#c_literal{val='++'}, > args=[H, > @@ -807,7 +808,7 @@ call_1(#c_call{anno=Anno}, lists, filter, > [Arg1,Arg2], Sub) -> > B = #c_var{name='B'}, > Err1 = #c_tuple{es=[#c_literal{val='case_clause'}, X]}, > CC1 = #c_clause{pats=[#c_literal{val=true}], guard=#c_literal{val=true}, > - body=#c_cons{hd=X, tl=Xs}}, > + body=#c_cons{anno=[compiler_generated], hd=X, tl=Xs}}, > CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true}, > body=Xs}, > CC3 = #c_clause{pats=[X], guard=#c_literal{val=true}, > @@ -901,7 +902,10 @@ call_1(#c_call{anno=Anno}, lists, mapfoldl, > [Arg1,Arg2,Arg3], Sub) -> > op=Loop, > args=[Xs, Avar]}, > #c_tuple{es=[Xs, Avar]}, > - #c_tuple{es=[#c_cons{hd=X, tl=Xs}, Avar]}) > + #c_tuple{anno=[compiler_generated], > + es=[#c_cons{anno=[compiler_generated], > + hd=X, tl=Xs}, > + Avar]}) > %%% Multiple-value version > %%% #c_let{vars=[Xs,A], > %%% %% The tuple here will be optimised > @@ -912,7 +916,8 @@ call_1(#c_call{anno=Anno}, lists, mapfoldl, > [Arg1,Arg2,Arg3], Sub) -> > )}, > C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true}, > %%% Tuple passing version > - body=#c_tuple{es=[#c_literal{val=[]}, Avar]}}, > + body=#c_tuple{anno=[compiler_generated], > + es=[#c_literal{val=[]}, Avar]}}, > %%% Multiple-value version > %%% body=#c_values{es=[#c_literal{val=[]}, A]}}, > Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]}, > @@ -955,7 +960,9 @@ call_1(#c_call{anno=Anno}, lists, mapfoldr, > [Arg1,Arg2,Arg3], Sub) -> > #c_tuple{es=[Xs, Avar]}, > Match(#c_apply{anno=Anno, op=F, args=[X, Avar]}, > #c_tuple{es=[X, Avar]}, > - #c_tuple{es=[#c_cons{hd=X, tl=Xs}, Avar]})) > + #c_tuple{anno=[compiler_generated], > + es=[#c_cons{anno=[compiler_generated], > + hd=X, tl=Xs}, Avar]})) > %%% Multiple-value version > %%% body=#c_let{vars=[Xs,A], > %%% %% The tuple will be optimised away > @@ -967,7 +974,8 @@ call_1(#c_call{anno=Anno}, lists, mapfoldr, > [Arg1,Arg2,Arg3], Sub) -> > }, > C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true}, > %%% Tuple passing version > - body=#c_tuple{es=[#c_literal{val=[]}, Avar]}}, > + body=#c_tuple{anno=[compiler_generated], > + es=[#c_literal{val=[]}, Avar]}}, > %%% Multiple-value version > %%% body=#c_values{es=[#c_literal{val=[]}, A]}}, > Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]}, > -- /Henrik Nord Erlang/OTP From henrik@REDACTED Wed Nov 7 13:45:19 2012 From: henrik@REDACTED (Henrik Nord) Date: Wed, 7 Nov 2012 13:45:19 +0100 Subject: [erlang-patches] Debugger settings In-Reply-To: References: Message-ID: <509A57DF.8060006@erlang.org> I have added your patch to 'master-pu' Thank you for your contribution! On 11/07/2012 09:48 AM, H?kan Mattsson wrote: > The wxFileDialog behaves a bit different in Ubuntu 12.10. > In the Debugger this caused the settings to be stored in > $HOME instead of $HOME/.erlang_tools/debugger (or > whatever the user has entered). This has been fixed. > > git fetch git://github.com/hawk/otp.git hawk/debugger_settings_dialog > > or viewed here > > https://github.com/hawk/otp/compare/hawk/debugger_settings_dialog > https://github.com/hawk/otp/compare/hawk/debugger_settings_dialog.patch > > /H?kan > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP From aleksandr.vin@REDACTED Thu Nov 8 11:11:14 2012 From: aleksandr.vin@REDACTED (Aleksandr Vinokurov) Date: Thu, 8 Nov 2012 14:11:14 +0400 Subject: [erlang-patches] Deep list argument error under Windows in os:cmd/1 Message-ID: Because of leeway in implementing os:cmd/1 under different OS there is a difference in results when calling it with deep list argument. os:cmd/1 specifies io_lib:chars() type for its argument and io_lib functions can produce deep lists inspite of io_lib:chars() result type specification. This commit flattens the argument for erlang:open_port/2 (which is used under Windows) and expands the os_SUITE to regress the bug. git fetch git://github.com/aleksandr-vin/otp.git maint-fix-os-cmd-win or viewed here: https://github.com/aleksandr-vin/otp/compare/maint-fix-os-cmd-winhttps://github.com/aleksandr-vin/otp/compare/maint-fix-os-cmd-win.patch -- Aleksandr Vinokurov +7 (921) 982-21-43 @aleksandrvin -------------- next part -------------- An HTML attachment was scrubbed... URL: From gomoripeti@REDACTED Thu Nov 8 14:26:10 2012 From: gomoripeti@REDACTED (=?ISO-8859-1?Q?Peti_G=F6m=F6ri?=) Date: Thu, 8 Nov 2012 14:26:10 +0100 Subject: [erlang-patches] Fix Table Viewer refresh crash Message-ID: Hi, This minor patch handles the case when observer Table Viewer wants to refresh an ets table which no more exists. thanks Peter -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-Fix-Table-Viewer-refresh-crash-on-no-more-existing-e.patch Type: application/octet-stream Size: 866 bytes Desc: not available URL: From mc@REDACTED Thu Nov 8 22:11:28 2012 From: mc@REDACTED (Pedram Nimreezi) Date: Thu, 8 Nov 2012 16:11:28 -0500 Subject: [erlang-patches] test Message-ID: test -- /* Sincerely -------------------------------------------------------------- Pedram Nimreezi - Chief Technology Officer */ // The hardest part of design ? is keeping features out. - Donald Norman -------------- next part -------------- An HTML attachment was scrubbed... URL: From mc@REDACTED Fri Nov 9 00:55:09 2012 From: mc@REDACTED (Pedram Nimreezi) Date: Thu, 8 Nov 2012 18:55:09 -0500 Subject: [erlang-patches] test Message-ID: test -- /* Sincerely -------------------------------------------------------------- Pedram Nimreezi - Chief Technology Officer */ // The hardest part of design ? is keeping features out. - Donald Norman -------------- next part -------------- An HTML attachment was scrubbed... URL: From n.oxyde@REDACTED Sat Nov 10 16:28:30 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Sat, 10 Nov 2012 16:28:30 +0100 Subject: [erlang-patches] Return end locations in erl_scan Message-ID: Hi, This branch adds a new option "end" to erl_scan. If set, it tracks and returns end locations of each scanned token in their attributes as `{'end', {EndLine, EndCol}}`. https://github.com/nox/otp/compare/scan-end-locations https://github.com/nox/otp/compare/scan-end-locations.patch git fetch https://github.com/nox/otp scan-end-locations Regards, -- Anthony Ramine From n.oxyde@REDACTED Sat Nov 10 16:35:40 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Sat, 10 Nov 2012 16:35:40 +0100 Subject: [erlang-patches] Optimize handling of local fun variables in v3_kernel Message-ID: Hi, This branch removes the so-called "reverse etha-conversion" from v3_kernel and replaces it by a proper call to the make_fun internal BIF without the need of a redundant lambda function every time the local fun variable is referenced. There may be some test suites related to this in lib/compiler/test/ but I couldn't find one; feel free to point me to them if any. https://github.com/nox/otp/compare/rm-reverse-eta-conversion https://github.com/nox/otp/compare/rm-reverse-eta-conversion.patch git fetch https://github.com/nox/otp/ rm-reverse-eta-conversion Regards, -- Anthony Ramine From mc@REDACTED Wed Nov 14 14:49:24 2012 From: mc@REDACTED (Pedram Nimreezi) Date: Wed, 14 Nov 2012 08:49:24 -0500 Subject: [erlang-patches] Support ANSI in the console Message-ID: The ttsl driver strips ANSI escape sequences from the console. This commit addresses that and allows for them to be supported. https://github.com/DeadZen/otp/compare/maint...ansi-console https://github.com/DeadZen/otp/compare/maint...ansi-console.patch git fetch git://github.com/DeadZen/otp.git ansi-console Supplemental Note... This has been tested, used and abused for nearly a year, and should apply cleanly to the last few major versions Initially the patch was simply: --- a/erts/emulator/drivers/unix/ttsl_drv.c 2011-05-24 07:16:43.000000000 -0400 +++ b/erts/emulator/drivers/unix/ttsl_drv.c 2011-12-10 14:24:23.000000000 -0500 @@ -912,6 +912,15 @@ static int insert_buf(byte *s, int n) lbuf[lpos++] = (CONTROL_TAG | ((Uint32) ch)); ch = 0; } while (lpos % 8); + } else if (ch == '\e') { + write_buf(lbuf + buffpos, lpos - buffpos); + outc('\e'); + + if (llen > lpos) { + memcpy(lbuf, lbuf + lpos, llen - lpos); + } + llen -= lpos; + lpos = buffpos = 0; Recently I've compared various approaches, however, and decided to push my patch and findings... For instance I've compared this change to allowing for the ''\e" control character 27 to these locations: https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L901 https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L599 https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L609 but believe, the "console display control characters" section and the smallest possible change would be here: https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L915 I have thoroughly tested, including using a forked copy of the lager application at high speed for extended durations here: git fetch git://github.com/DeadZen/lager.git colors For this patch I've reduced the affected lines to the smallest degree I believe possible. Thank you. -- /* Sincerely -------------------------------------------------------------- Pedram Nimreezi - Chief Technology Officer */ // The hardest part of design ? is keeping features out. - Donald Norman From n.oxyde@REDACTED Wed Nov 14 17:42:07 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Wed, 14 Nov 2012 17:42:07 +0100 Subject: [erlang-patches] EEP37: Funs with names Message-ID: This patch implements EEP37: Funs with names This adds optional names to fun expressions. A named fun expression is parsed as a tuple `{named_fun,Loc,Name,Clauses}` in erl_parse. If a fun expression has a name, it must be present and be the same in every of its clauses. The function name shadows the environment of the expression shadowing the environment and it is shadowed by the environment of the clauses' arguments. An unused function name triggers a warning unless it is prefixed by _, just as every variable. Variable _ is allowed as a function name. It is not an error to put a named function in a record field default value. When transforming to Core Erlang, the named fun Fun is changed into the following expression: letrec 'Fun'/Arity = fun (Args) -> let = 'Fun'/Arity in Case in 'Fun'/Arity where Args is the list of arguments of 'Fun'/Arity and Case the Core Erlang expression corresponding to the clauses of Fun. This transformation allows us to entirely skip any k_var to k_local transformation in the fun's clauses bodies. https://github.com/nox/otp/compare/erlang:master...eep37 https://github.com/nox/otp/compare/erlang:master...eep37.patch git fetch https://github.com/nox/otp eep37 Regards, -- Anthony Ramine From jbothma@REDACTED Wed Nov 14 18:18:40 2012 From: jbothma@REDACTED (JD Bothma) Date: Wed, 14 Nov 2012 18:18:40 +0100 Subject: [erlang-patches] Documentation of the 'ram' mode in the 'file' module Message-ID: Here's basic documentation of the ram mode in the file module: https://github.com/jbothma/otp/tree/file-ram-opt-doc I don't know if the fact that it's a port driver should be mentioned. I thought I'd see if this is sufficient or at least along the right path before I go too far. Generally I think it's intuitive which functions can be used with the ram mode (e.g. make_symlink wouldn't make sense). I don't know if the modes supported (or otherwise) with the ram mode should be listed explicitly. This is RE: http://erlang.org/pipermail/erlang-questions/2012-November/070586.html Regards, JD -------------- next part -------------- An HTML attachment was scrubbed... URL: From n.oxyde@REDACTED Thu Nov 15 13:04:59 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Thu, 15 Nov 2012 13:04:59 +0100 Subject: [erlang-patches] EEP37: Funs with names In-Reply-To: References: Message-ID: Sorry for the double post, I thought it was erlang-eeps@ and not eeps@REDACTED Le 14 nov. 2012 ? 17:42, Anthony Ramine a ?crit : > This patch implements EEP37: Funs with names > > This adds optional names to fun expressions. A named fun expression > is parsed as a tuple `{named_fun,Loc,Name,Clauses}` in erl_parse. > > If a fun expression has a name, it must be present and be the same in > every of its clauses. The function name shadows the environment of the > expression shadowing the environment and it is shadowed by the > environment of the clauses' arguments. An unused function name triggers > a warning unless it is prefixed by _, just as every variable. > Variable _ is allowed as a function name. > > It is not an error to put a named function in a record field default > value. > > When transforming to Core Erlang, the named fun Fun is changed into > the following expression: > > letrec 'Fun'/Arity = > fun (Args) -> > let = 'Fun'/Arity > in Case > in 'Fun'/Arity > > where Args is the list of arguments of 'Fun'/Arity and Case the > Core Erlang expression corresponding to the clauses of Fun. > > This transformation allows us to entirely skip any k_var to k_local > transformation in the fun's clauses bodies. > > https://github.com/nox/otp/compare/erlang:master...eep37 > https://github.com/nox/otp/compare/erlang:master...eep37.patch > > git fetch https://github.com/nox/otp eep37 > > Regards, > > -- > Anthony Ramine > From henrik@REDACTED Thu Nov 15 13:16:29 2012 From: henrik@REDACTED (Henrik Nord) Date: Thu, 15 Nov 2012 13:16:29 +0100 Subject: [erlang-patches] Documentation of the 'ram' mode in the 'file' module In-Reply-To: References: Message-ID: <50A4DD1D.6030104@erlang.org> I have added your patch to 'master-pu' Please see https://github.com/erlang/otp/wiki/Submitting-patches It always helps if you add these links to your patch submissions. git fetch git://github.com/mygithub/otp.git my-cool-updates https://github.com/mygithub/otp/compare/my-cool-updates https://github.com/mygithub/otp/compare/my-cool-updates.patch Other than that, Thank you for your contribution! On 2012-11-14 18:18, JD Bothma wrote: > Here's basic documentation of the ram mode in the file module: > https://github.com/jbothma/otp/tree/file-ram-opt-doc > > I don't know if the fact that it's a port driver should be mentioned. > > I thought I'd see if this is sufficient or at least along the right > path before I go too far. Generally I think it's intuitive which > functions can be used with the ram mode (e.g. make_symlink wouldn't > make sense). I don't know if the modes supported (or otherwise) with > the ram mode should be listed explicitly. > > This is RE: > http://erlang.org/pipermail/erlang-questions/2012-November/070586.html > > Regards, > JD > > > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Thu Nov 15 13:20:54 2012 From: henrik@REDACTED (Henrik Nord) Date: Thu, 15 Nov 2012 13:20:54 +0100 Subject: [erlang-patches] Support ANSI in the console In-Reply-To: References: Message-ID: <50A4DE26.30402@erlang.org> Thank you for your contribution, I have added the patch to 'master-pu' On 2012-11-14 14:49, Pedram Nimreezi wrote: > https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L901 > https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L599 > https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L609 -- /Henrik Nord Erlang/OTP From henrik@REDACTED Thu Nov 15 15:22:33 2012 From: henrik@REDACTED (Henrik Nord) Date: Thu, 15 Nov 2012 15:22:33 +0100 Subject: [erlang-patches] EEP37: Funs with names In-Reply-To: References: Message-ID: <50A4FAA9.1070706@erlang.org> I will add this patch to 'master-pu'. Thank you for your contribution! On 2012-11-14 17:42, Anthony Ramine wrote: > This patch implements EEP37: Funs with names > > This adds optional names to fun expressions. A named fun expression > is parsed as a tuple `{named_fun,Loc,Name,Clauses}` in erl_parse. > > If a fun expression has a name, it must be present and be the same in > every of its clauses. The function name shadows the environment of the > expression shadowing the environment and it is shadowed by the > environment of the clauses' arguments. An unused function name triggers > a warning unless it is prefixed by _, just as every variable. > Variable _ is allowed as a function name. > > It is not an error to put a named function in a record field default > value. > > When transforming to Core Erlang, the named fun Fun is changed into > the following expression: > > letrec 'Fun'/Arity = > fun (Args) -> > let = 'Fun'/Arity > in Case > in 'Fun'/Arity > > where Args is the list of arguments of 'Fun'/Arity and Case the > Core Erlang expression corresponding to the clauses of Fun. > > This transformation allows us to entirely skip any k_var to k_local > transformation in the fun's clauses bodies. > > https://github.com/nox/otp/compare/erlang:master...eep37 > https://github.com/nox/otp/compare/erlang:master...eep37.patch > > git fetch https://github.com/nox/otp eep37 > > Regards, > -- /Henrik Nord Erlang/OTP From n.oxyde@REDACTED Thu Nov 15 17:29:01 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Thu, 15 Nov 2012 17:29:01 +0100 Subject: [erlang-patches] Optimize handling of local fun variables in v3_kernel In-Reply-To: References: Message-ID: <9757CB06-32DF-468D-96A4-B52C0B98ADE2@gmail.com> Hi, I've added a commit to the branch (6eebc6c), it allows the compiler to substitute local functions' names now that v3_kernel doesn't create a lambda for every one of them it encounters. This optimizes a lot my implementation of EEP37. Regards, Le 10 nov. 2012 ? 16:35, Anthony Ramine a ?crit : > Hi, > > This branch removes the so-called "reverse etha-conversion" from v3_kernel and > replaces it by a proper call to the make_fun internal BIF without the need of a > redundant lambda function every time the local fun variable is referenced. > > There may be some test suites related to this in lib/compiler/test/ > but I couldn't > find one; feel free to point me to them if any. > > https://github.com/nox/otp/compare/rm-reverse-eta-conversion > https://github.com/nox/otp/compare/rm-reverse-eta-conversion.patch > > git fetch https://github.com/nox/otp/ rm-reverse-eta-conversion -- Anthony Ramine From robert.virding@REDACTED Fri Nov 16 01:44:23 2012 From: robert.virding@REDACTED (Robert Virding) Date: Fri, 16 Nov 2012 00:44:23 -0000 (GMT) Subject: [erlang-patches] Optimize handling of local fun variables in v3_kernel In-Reply-To: <9757CB06-32DF-468D-96A4-B52C0B98ADE2@gmail.com> Message-ID: <34a5f050-d6c4-42f7-82a0-9720d95c371e@knuth> There seems to be an awful lot in this patch which has nothing to do with what the patch is about, most of it in fact. Is there a rebase missing or something here? Robert ----- Original Message ----- > From: "Anthony Ramine" > To: "erlang-patches" > Sent: Thursday, 15 November, 2012 5:29:01 PM > Subject: Re: [erlang-patches] Optimize handling of local fun variables in v3_kernel > > Hi, > > I've added a commit to the branch (6eebc6c), it allows > the compiler to substitute local functions' names now that > v3_kernel doesn't create a lambda for every one of them it > encounters. > > This optimizes a lot my implementation of EEP37. > > Regards, > > Le 10 nov. 2012 ? 16:35, Anthony Ramine a ?crit : > > > Hi, > > > > This branch removes the so-called "reverse etha-conversion" from > > v3_kernel and > > replaces it by a proper call to the make_fun internal BIF without > > the need of a > > redundant lambda function every time the local fun variable is > > referenced. > > > > There may be some test suites related to this in lib/compiler/test/ > > but I couldn't > > find one; feel free to point me to them if any. > > > > https://github.com/nox/otp/compare/rm-reverse-eta-conversion > > https://github.com/nox/otp/compare/rm-reverse-eta-conversion.patch > > > > git fetch https://github.com/nox/otp/ rm-reverse-eta-conversion > > -- > Anthony Ramine > > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches > From yamt@REDACTED Fri Nov 16 03:30:21 2012 From: yamt@REDACTED (YAMAMOTO Takashi) Date: Fri, 16 Nov 2012 02:30:21 +0000 (UTC) Subject: [erlang-patches] use a proper way to pull ssize_t definition Message-ID: <20121116023021.F0E5714A1B4@mail.netbsd.org> hi, this change is necessary at least on netbsd. i noticed this when building erlang-lz4. https://github.com/yamt/otp/compare/erlang:master...ssize_t https://github.com/yamt/otp/compare/erlang:master...ssize_t.patch git fetch https://github.com/yamt/otp ssize_t YAMAMOTO Takashi From n.oxyde@REDACTED Fri Nov 16 10:24:54 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Fri, 16 Nov 2012 10:24:54 +0100 Subject: [erlang-patches] Optimize handling of local fun variables in v3_kernel In-Reply-To: <34a5f050-d6c4-42f7-82a0-9720d95c371e@knuth> References: <34a5f050-d6c4-42f7-82a0-9720d95c371e@knuth> Message-ID: <6732C8A6-8F18-4EC5-B48E-D0632643ADE3@gmail.com> Hi Robert, Sorry I couldn't send this patch earlier because I was behind a damn firewall that blocks outgoing SMTP. As I have rebased my branch against master earlier, the compare links should be: https://github.com/nox/otp/compare/erlang:master...rm-reverse-eta-conversion https://github.com/nox/otp/compare/erlang:master...rm-reverse-eta-conversion.patch I've come to realize there is a bug in the second commit which I'll try to fix today: if a variable that is bound to a local name function is in a guard, the propagation of its value will make beam_validator errors out with {invalid_store,{yy,0}}. You shouldn't bother looking at the second commit until I fix this. Regards, -- Anthony Ramine Le 16 nov. 2012 ? 01:44, Robert Virding a ?crit : > There seems to be an awful lot in this patch which has nothing to do with what the patch is about, most of it in fact. Is there a rebase missing or something here? > > Robert From n.oxyde@REDACTED Fri Nov 16 18:26:36 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Fri, 16 Nov 2012 18:26:36 +0100 Subject: [erlang-patches] Optimize handling of local fun variables in v3_kernel In-Reply-To: <56DB6882-09AC-4F03-9736-492162253FA3@gmail.com> References: <34a5f050-d6c4-42f7-82a0-9720d95c371e@knuth> <6732C8A6-8F18-4EC5-B48E-D0632643ADE3@gmail.com> <56DB6882-09AC-4F03-9736-492162253FA3@gmail.com> Message-ID: <944A444D-C5B0-45B1-8FB0-DA1CB5FA04C6@gmail.com> Err, forgot to include the mailing-list. Sorry. You can now look at it there shouldn't be any bug. -- Anthony Ramine Le 16 nov. 2012 ? 18:23, Anthony Ramine a ?crit : > The commit is amended and the bug is fixed, variables which values > are local function names are substituted everywhere but in guards. > > -- > Anthony Ramine > > Le 16 nov. 2012 ? 10:24, Anthony Ramine a ?crit : > >> Hi Robert, >> >> Sorry I couldn't send this patch earlier because I was behind a damn firewall that blocks outgoing SMTP. >> >> As I have rebased my branch against master earlier, >> the compare links should be: >> https://github.com/nox/otp/compare/erlang:master...rm-reverse-eta-conversion >> https://github.com/nox/otp/compare/erlang:master...rm-reverse-eta-conversion.patch >> >> I've come to realize there is a bug in the second commit which I'll try to fix today: if a variable that is bound to a local name function is in a guard, the propagation of its value will make beam_validator errors out with {invalid_store,{yy,0}}. >> >> You shouldn't bother looking at the second commit until I fix this. >> >> Le 16 nov. 2012 ? 01:44, Robert Virding a ?crit : >> >>> There seems to be an awful lot in this patch which has nothing to do with what the patch is about, most of it in fact. Is there a rebase missing or something here? From antik@REDACTED Sat Nov 17 10:30:53 2012 From: antik@REDACTED (Ivan Dubovik) Date: Sat, 17 Nov 2012 11:30:53 +0200 Subject: [erlang-patches] SNMP performance optimization Message-ID: Hi. I have a lot of agents: ets:i(). id name type size mem owner ---------------------------------------------------------------------------- ... snmpm_agent_table snmpm_agent_table set 42932 2287790 snmpm_config Was: fprof:analyse(). ... {[{{snmpm_server,agent_data,2}, 513,11826.813, 4.607}, {undefined, 0, 0.446, 0.000}], { {snmpm_config,agent_info,2}, 513,11827.259, 4.607}, % [{{ets,match_object,2}, 513,11822.196,11524.680}, {{ets,select_trap,1}, 0, 0.446, 0.373}, {{snmpm_server,agent_data_item,2}, 1, 0.010, 0.008}]}. ... Now: {[{{snmpm_server,agent_data,2}, 906, 20.413, 6.341}], { {snmpm_server,agent_data_item,2}, 906, 20.413, 6.341}, % [{{snmpm_config,agent_info,2}, 906, 14.072, 7.743}]}. git fetch git://github.com/IvanDubovik/otp.git snmp_optimization https://github.com/IvanDubovik/otp/compare/snmp_optimization https://github.com/IvanDubovik/otp/compare/snmp_optimization.patch From aschultz@REDACTED Sun Nov 18 12:30:14 2012 From: aschultz@REDACTED (Andreas Schultz) Date: Sun, 18 Nov 2012 12:30:14 +0100 (CET) Subject: [erlang-patches] TLS 1.2 hash fixes In-Reply-To: <599380706.174395.1353237771373.JavaMail.root@tpip.net> Message-ID: <1038051640.174409.1353238214895.JavaMail.root@tpip.net> Hi Henrik, Mail to henrik@REDACTED got reject, but I guess the patches ML should be ok for this. I have rebased both branches ssl-sha224-fixes and tls-psk-srp-suites. I moved the patch that enables the required hashes for the psk and srp TLS 1.2 ciphers to the proper branch. The ssl-sha224-fixes branch now only contains the bit that advertises sha224 for TLS 1.2 handshakes. https://github.com/RoadRunnr/otp/compare/master...ssl-sha224-fixes https://github.com/RoadRunnr/otp/compare/master...ssl-sha224-fixes.patch https://github.com/RoadRunnr/otp/compare/master...tls-psk-srp-suites https://github.com/RoadRunnr/otp/compare/master...tls-psk-srp-suites.patch Regards Andreas ----- Original Message ----- > Hi > > Can you also rebase this on current master. > > as/tls-psk-srp-suites > > Thank you > On 2012-10-29 11:20, Henrik Nord wrote: > > Then I suggest you move that commit to the branch introducing those > > ciphers. > > > > And keep this branch as a advertise sha224 support branch > > > > /Henrik > > > > On 10/28/2012 04:25 PM, Andreas Schultz wrote: > >> Hi, > >> > >> Please disregard my last mail. The SRP and PSK patches introduce > >> TLS > >> 1.2 ciphers > >> that do default to sha384, so the extended hash_size method is > >> required should the > >> SPR and PSK ciphers be accepted. > >> > >> Andreas > >> > >> ----- Original Message ----- > >>> Hi, > >>> > >>> Here is an update to the sha224 ssl branch: > >>> https://github.com/RoadRunnr/otp/compare/master...ssl-sha224-fixes > >>> > >>> Tree is correctly based on master now. > >>> > >>> I have dropped the hash_size changes. After reviewing the call > >>> patch > >>> for hash_size, it became apparent that the original comment is > >>> correct. > >>> I am absolutely sure that I did hit hash_size with a stronger > >>> hash, > >>> but > >>> I am unable to reproduce it. So it is probably better to leave > >>> that > >>> alone. > >>> > >>> The other change still applies. > >>> > >>> Andreas > >>> > >>> ----- Original Message ----- > >>>> First and foremost: > >>>> You should not base any branches on a ' pu' branch, as they will > >>>> frequently be rebuilt from scratch on top of the current > >>>> development > >>>> branch. > >>>> Base branches upon 'master' or 'maint' depending on where we are > >>>> in > >>>> the release cycle and if it is a feature or a bug etc. > >>>> More information here: > >>>> https://github.com/erlang/otp/wiki/Submitting-patches > >>>> > >>>> Secondly: Thank you for your contribution, I have rebased your > >>>> branch > >>>> upon 'master' and included it in 'master-pu' > >>>> > >>>> If this are to be included in master, you will most likely have > >>>> to > >>>> add this in the documentation, and in the test. > >>>> > >>>> > >>>> > >>>> On 10/18/2012 07:24 PM, Andreas Schultz wrote: > >>>> > >>>> > >>>> > >>>> Hi, > >>>> > >>>> Here are two changes to improve TLS 1.2 higher strength sha > >>>> hashes. > >>>> > >>>> There is this comment in ssl_cipher: > >>>> > >>>> %% Currently no supported cipher suites defaults to sha384 or > >>>> sha512 > >>>> %% so these clauses are not needed at the moment. > >>>> > >>>> I'm afraid that this is wrong. With TLS 1.2 the actual hash > >>>> being > >>>> used > >>>> can be negotiated and is not longer fixed to the one specified > >>>> in > >>>> the > >>>> cipher suite. So it is possible to end up with a stronger cipher > >>>> even > >>>> when we don't default to one. > >>>> > >>>> The other change adds sha224 to list of support and announced > >>>> ciphers. > >>>> It might not be as good as sha256, but should still be stronger > >>>> that > >>>> sha1. > >>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes > >>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes.patch > >>>> > >>>> Both changes should apply cleanly on master and master-pu. > >>>> > >>>> Andreas > >>>> > >>>> -- > >>>> /Henrik Nord Erlang/OTP > >>>> > >>>> First and foremost: > >>>> You should *not* base any branches on a '|pu'| branch, as they > >>>> will > >>>> frequently be rebuilt from scratch on top of the current > >>>> development > >>>> branch. > >>>> Base branches upon 'master' or 'maint' depending on where we are > >>>> in > >>>> the > >>>> release cycle and if it is a feature or a bug etc. > >>>> More information here: > >>>> https://github.com/erlang/otp/wiki/Submitting-patches > >>>> > >>>> Secondly: Thank you for your contribution, I have rebased your > >>>> branch > >>>> upon 'master' and included it in 'master-pu' > >>>> > >>>> If this are to be included in master, you will most likely have > >>>> to > >>>> add > >>>> this in the documentation, and in the test. > >>>> > >>>> > >>>> > >>>> On 10/18/2012 07:24 PM, Andreas Schultz wrote: > >>>>> Hi, > >>>>> > >>>>> Here are two changes to improve TLS 1.2 higher strength sha > >>>>> hashes. > >>>>> > >>>>> There is this comment in ssl_cipher: > >>>>> > >>>>> %% Currently no supported cipher suites defaults to sha384 or > >>>>> sha512 > >>>>> %% so these clauses are not needed at the moment. > >>>>> > >>>>> I'm afraid that this is wrong. With TLS 1.2 the actual hash > >>>>> being > >>>>> used > >>>>> can be negotiated and is not longer fixed to the one specified > >>>>> in > >>>>> the > >>>>> cipher suite. So it is possible to end up with a stronger > >>>>> cipher > >>>>> even > >>>>> when we don't default to one. > >>>>> > >>>>> The other change adds sha224 to list of support and announced > >>>>> ciphers. > >>>>> It might not be as good as sha256, but should still be stronger > >>>>> that > >>>>> sha1. > >>>>> > >>>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes > >>>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes.patch > >>>>> > >>>>> > >>>>> Both changes should apply cleanly on master and master-pu. > >>>>> > >>>>> Andreas > >>>> -- > >>>> /Henrik Nord Erlang/OTP > >>>> > >>>> > >>> -- > >>> -- > >>> Dipl. Inform. > >>> Andreas Schultz > >>> > >>> email: as@REDACTED > >>> phone: +49-391-819099-224 > >>> mobil: +49-170-2226073 > >>> > >>> ------------------ managed broadband access ------------------ > >>> > >>> Travelping GmbH phone: +49-391-8190990 > >>> Roentgenstr. 13 fax: +49-391-819099299 > >>> D-39108 Magdeburg email: info@REDACTED > >>> GERMANY web: http://www.travelping.com > >>> > >>> Company Registration: HRB21276 Handelsregistergericht Chemnitz > >>> Geschaeftsfuehrer: Holger Winkelmann | VAT ID No.: DE236673780 > >>> -------------------------------------------------------------- > >>> _______________________________________________ > >>> erlang-patches mailing list > >>> erlang-patches@REDACTED > >>> http://erlang.org/mailman/listinfo/erlang-patches > >>> > > > > -- > /Henrik Nord Erlang/OTP > > -- -- Dipl. Inform. Andreas Schultz email: as@REDACTED phone: +49-391-819099-224 mobil: +49-170-2226073 ------------------ managed broadband access ------------------ Travelping GmbH phone: +49-391-8190990 Roentgenstr. 13 fax: +49-391-819099299 D-39108 Magdeburg email: info@REDACTED GERMANY web: http://www.travelping.com Company Registration: HRB21276 Handelsregistergericht Chemnitz Geschaeftsfuehrer: Holger Winkelmann | VAT ID No.: DE236673780 -------------------------------------------------------------- From henrik@REDACTED Wed Nov 21 10:27:24 2012 From: henrik@REDACTED (Henrik Nord) Date: Wed, 21 Nov 2012 10:27:24 +0100 Subject: [erlang-patches] TLS 1.2 hash fixes In-Reply-To: <1038051640.174409.1353238214895.JavaMail.root@tpip.net> References: <1038051640.174409.1353238214895.JavaMail.root@tpip.net> Message-ID: <50AC9E7C.6000605@erlang.org> On 2012-11-18 12:30, Andreas Schultz wrote: > Hi Henrik, > > Mail to henrik@REDACTED got reject, but I guess the patches ML should > be ok for this. > > I have rebased both branches ssl-sha224-fixes and tls-psk-srp-suites. > > I moved the patch that enables the required hashes for the psk and > srp TLS 1.2 ciphers to the proper branch. The ssl-sha224-fixes branch > now only contains the bit that advertises sha224 for TLS 1.2 handshakes. Nice! Thank you > > > https://github.com/RoadRunnr/otp/compare/master...ssl-sha224-fixes > https://github.com/RoadRunnr/otp/compare/master...ssl-sha224-fixes.patch > > https://github.com/RoadRunnr/otp/compare/master...tls-psk-srp-suites > https://github.com/RoadRunnr/otp/compare/master...tls-psk-srp-suites.patch > > Regards > Andreas > > ----- Original Message ----- >> Hi >> >> Can you also rebase this on current master. >> >> as/tls-psk-srp-suites >> >> Thank you >> On 2012-10-29 11:20, Henrik Nord wrote: >>> Then I suggest you move that commit to the branch introducing those >>> ciphers. >>> >>> And keep this branch as a advertise sha224 support branch >>> >>> /Henrik >>> >>> On 10/28/2012 04:25 PM, Andreas Schultz wrote: >>>> Hi, >>>> >>>> Please disregard my last mail. The SRP and PSK patches introduce >>>> TLS >>>> 1.2 ciphers >>>> that do default to sha384, so the extended hash_size method is >>>> required should the >>>> SPR and PSK ciphers be accepted. >>>> >>>> Andreas >>>> >>>> ----- Original Message ----- >>>>> Hi, >>>>> >>>>> Here is an update to the sha224 ssl branch: >>>>> https://github.com/RoadRunnr/otp/compare/master...ssl-sha224-fixes >>>>> >>>>> Tree is correctly based on master now. >>>>> >>>>> I have dropped the hash_size changes. After reviewing the call >>>>> patch >>>>> for hash_size, it became apparent that the original comment is >>>>> correct. >>>>> I am absolutely sure that I did hit hash_size with a stronger >>>>> hash, >>>>> but >>>>> I am unable to reproduce it. So it is probably better to leave >>>>> that >>>>> alone. >>>>> >>>>> The other change still applies. >>>>> >>>>> Andreas >>>>> >>>>> ----- Original Message ----- >>>>>> First and foremost: >>>>>> You should not base any branches on a ' pu' branch, as they will >>>>>> frequently be rebuilt from scratch on top of the current >>>>>> development >>>>>> branch. >>>>>> Base branches upon 'master' or 'maint' depending on where we are >>>>>> in >>>>>> the release cycle and if it is a feature or a bug etc. >>>>>> More information here: >>>>>> https://github.com/erlang/otp/wiki/Submitting-patches >>>>>> >>>>>> Secondly: Thank you for your contribution, I have rebased your >>>>>> branch >>>>>> upon 'master' and included it in 'master-pu' >>>>>> >>>>>> If this are to be included in master, you will most likely have >>>>>> to >>>>>> add this in the documentation, and in the test. >>>>>> >>>>>> >>>>>> >>>>>> On 10/18/2012 07:24 PM, Andreas Schultz wrote: >>>>>> >>>>>> >>>>>> >>>>>> Hi, >>>>>> >>>>>> Here are two changes to improve TLS 1.2 higher strength sha >>>>>> hashes. >>>>>> >>>>>> There is this comment in ssl_cipher: >>>>>> >>>>>> %% Currently no supported cipher suites defaults to sha384 or >>>>>> sha512 >>>>>> %% so these clauses are not needed at the moment. >>>>>> >>>>>> I'm afraid that this is wrong. With TLS 1.2 the actual hash >>>>>> being >>>>>> used >>>>>> can be negotiated and is not longer fixed to the one specified >>>>>> in >>>>>> the >>>>>> cipher suite. So it is possible to end up with a stronger cipher >>>>>> even >>>>>> when we don't default to one. >>>>>> >>>>>> The other change adds sha224 to list of support and announced >>>>>> ciphers. >>>>>> It might not be as good as sha256, but should still be stronger >>>>>> that >>>>>> sha1. >>>>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes >>>>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes.patch >>>>>> >>>>>> Both changes should apply cleanly on master and master-pu. >>>>>> >>>>>> Andreas >>>>>> >>>>>> -- >>>>>> /Henrik Nord Erlang/OTP >>>>>> >>>>>> First and foremost: >>>>>> You should *not* base any branches on a '|pu'| branch, as they >>>>>> will >>>>>> frequently be rebuilt from scratch on top of the current >>>>>> development >>>>>> branch. >>>>>> Base branches upon 'master' or 'maint' depending on where we are >>>>>> in >>>>>> the >>>>>> release cycle and if it is a feature or a bug etc. >>>>>> More information here: >>>>>> https://github.com/erlang/otp/wiki/Submitting-patches >>>>>> >>>>>> Secondly: Thank you for your contribution, I have rebased your >>>>>> branch >>>>>> upon 'master' and included it in 'master-pu' >>>>>> >>>>>> If this are to be included in master, you will most likely have >>>>>> to >>>>>> add >>>>>> this in the documentation, and in the test. >>>>>> >>>>>> >>>>>> >>>>>> On 10/18/2012 07:24 PM, Andreas Schultz wrote: >>>>>>> Hi, >>>>>>> >>>>>>> Here are two changes to improve TLS 1.2 higher strength sha >>>>>>> hashes. >>>>>>> >>>>>>> There is this comment in ssl_cipher: >>>>>>> >>>>>>> %% Currently no supported cipher suites defaults to sha384 or >>>>>>> sha512 >>>>>>> %% so these clauses are not needed at the moment. >>>>>>> >>>>>>> I'm afraid that this is wrong. With TLS 1.2 the actual hash >>>>>>> being >>>>>>> used >>>>>>> can be negotiated and is not longer fixed to the one specified >>>>>>> in >>>>>>> the >>>>>>> cipher suite. So it is possible to end up with a stronger >>>>>>> cipher >>>>>>> even >>>>>>> when we don't default to one. >>>>>>> >>>>>>> The other change adds sha224 to list of support and announced >>>>>>> ciphers. >>>>>>> It might not be as good as sha256, but should still be stronger >>>>>>> that >>>>>>> sha1. >>>>>>> >>>>>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes >>>>>>> https://github.com/RoadRunnr/otp/compare/master-pu...ssl-sha224-fixes.patch >>>>>>> >>>>>>> >>>>>>> Both changes should apply cleanly on master and master-pu. >>>>>>> >>>>>>> Andreas >>>>>> -- >>>>>> /Henrik Nord Erlang/OTP >>>>>> >>>>>> >>>>> -- >>>>> -- >>>>> Dipl. Inform. >>>>> Andreas Schultz >>>>> >>>>> email: as@REDACTED >>>>> phone: +49-391-819099-224 >>>>> mobil: +49-170-2226073 >>>>> >>>>> ------------------ managed broadband access ------------------ >>>>> >>>>> Travelping GmbH phone: +49-391-8190990 >>>>> Roentgenstr. 13 fax: +49-391-819099299 >>>>> D-39108 Magdeburg email: info@REDACTED >>>>> GERMANY web: http://www.travelping.com >>>>> >>>>> Company Registration: HRB21276 Handelsregistergericht Chemnitz >>>>> Geschaeftsfuehrer: Holger Winkelmann | VAT ID No.: DE236673780 >>>>> -------------------------------------------------------------- >>>>> _______________________________________________ >>>>> erlang-patches mailing list >>>>> erlang-patches@REDACTED >>>>> http://erlang.org/mailman/listinfo/erlang-patches >>>>> >> -- >> /Henrik Nord Erlang/OTP >> >> -- /Henrik Nord Erlang/OTP From henrik@REDACTED Wed Nov 21 14:40:39 2012 From: henrik@REDACTED (Henrik Nord) Date: Wed, 21 Nov 2012 14:40:39 +0100 Subject: [erlang-patches] autoconf: if GCC is used, treat -Wreturn-type as error In-Reply-To: References: Message-ID: <50ACD9D7.2050703@erlang.org> currently in "master-pu" On 2012-10-11 19:21, Tuncer Ayaz wrote: > https://github.com/tuncer/otp/compare/maint...werror-return-type > https://github.com/tuncer/otp/compare/maint...werror-return-type.patch > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP From n.oxyde@REDACTED Wed Nov 21 15:36:10 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Wed, 21 Nov 2012 15:36:10 +0100 Subject: [erlang-patches] EEP37: Funs with names In-Reply-To: <50A4FAA9.1070706@erlang.org> References: <50A4FAA9.1070706@erlang.org> Message-ID: <466D4B3A-8B3C-4AA7-9A2B-B85EA5EA2A90@gmail.com> Hi, I had forgotten to update the abstract format documentation, named_fun is now mentioned in absform.xml in the doc commit. Please refetch, -- Anthony Ramine Le 15 nov. 2012 ? 15:22, Henrik Nord a ?crit : > I will add this patch to 'master-pu'. > > Thank you for your contribution! > > > On 2012-11-14 17:42, Anthony Ramine wrote: >> This patch implements EEP37: Funs with names >> >> This adds optional names to fun expressions. A named fun expression >> is parsed as a tuple `{named_fun,Loc,Name,Clauses}` in erl_parse. >> >> If a fun expression has a name, it must be present and be the same in >> every of its clauses. The function name shadows the environment of the >> expression shadowing the environment and it is shadowed by the >> environment of the clauses' arguments. An unused function name triggers >> a warning unless it is prefixed by _, just as every variable. >> Variable _ is allowed as a function name. >> >> It is not an error to put a named function in a record field default >> value. >> >> When transforming to Core Erlang, the named fun Fun is changed into >> the following expression: >> >> letrec 'Fun'/Arity = >> fun (Args) -> >> let = 'Fun'/Arity >> in Case >> in 'Fun'/Arity >> >> where Args is the list of arguments of 'Fun'/Arity and Case the >> Core Erlang expression corresponding to the clauses of Fun. >> >> This transformation allows us to entirely skip any k_var to k_local >> transformation in the fun's clauses bodies. >> >> https://github.com/nox/otp/compare/erlang:master...eep37 >> https://github.com/nox/otp/compare/erlang:master...eep37.patch >> >> git fetch https://github.com/nox/otp eep37 >> >> Regards, >> > > -- > /Henrik Nord Erlang/OTP > From yrashk@REDACTED Wed Nov 21 19:01:23 2012 From: yrashk@REDACTED (Yurii Rashkovskii) Date: Wed, 21 Nov 2012 10:01:23 -0800 Subject: [erlang-patches] Support ANSI in the console In-Reply-To: <50A4DE26.30402@erlang.org> References: <50A4DE26.30402@erlang.org> Message-ID: Forgive me if I am missing something, but did this patch somehow not make it to master-pu? https://github.com/erlang/otp/blob/master-pu/erts/emulator/drivers/unix/ttsl_drv.c#L915 (pu doesn't have it either https://github.com/erlang/otp/blob/pu/erts/emulator/drivers/unix/ttsl_drv.c#L915 ) Is it intentional or is it an omission? On Thu, Nov 15, 2012 at 4:20 AM, Henrik Nord wrote: > Thank you for your contribution, I have added the patch to 'master-pu' > > > > On 2012-11-14 14:49, Pedram Nimreezi wrote: > >> https://github.com/DeadZen/**otp/blob/**d3e3d51dbb21f0fdb125becacb80e3** >> 4d0565fff7/erts/emulator/**drivers/unix/ttsl_drv.c#L901 >> https://github.com/DeadZen/**otp/blob/**d3e3d51dbb21f0fdb125becacb80e3** >> 4d0565fff7/erts/emulator/**drivers/unix/ttsl_drv.c#L599 >> https://github.com/DeadZen/**otp/blob/**d3e3d51dbb21f0fdb125becacb80e3** >> 4d0565fff7/erts/emulator/**drivers/unix/ttsl_drv.c#L609 >> > > -- > /Henrik Nord Erlang/OTP > > > ______________________________**_________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/**listinfo/erlang-patches > -------------- next part -------------- An HTML attachment was scrubbed... URL: From aleksandr.vin@REDACTED Thu Nov 22 09:02:47 2012 From: aleksandr.vin@REDACTED (Aleksandr Vinokurov) Date: Thu, 22 Nov 2012 12:02:47 +0400 Subject: [erlang-patches] Deep list argument error under Windows in os:cmd/1 In-Reply-To: References: Message-ID: Hi all, Maybe I'm doing smth. wrong -- why there is no reply to my patch? WBR, Aleksandr Vinokurov On 8 November 2012 14:11, Aleksandr Vinokurov wrote: > Because of leeway in implementing os:cmd/1 under different OS there is > a difference in results when calling it with deep list > argument. os:cmd/1 specifies io_lib:chars() type for its argument and > io_lib functions can produce deep lists inspite of io_lib:chars() > result type specification. This commit flattens the argument for > erlang:open_port/2 (which is used under Windows) and expands the > os_SUITE to regress the bug. > > git fetch git://github.com/aleksandr-vin/otp.git maint-fix-os-cmd-win > > or viewed here: > > https://github.com/aleksandr-vin/otp/compare/maint-fix-os-cmd-winhttps://github.com/aleksandr-vin/otp/compare/maint-fix-os-cmd-win.patch > > -- > Aleksandr Vinokurov > +7 (921) 982-21-43 > @aleksandrvin > > -- ????????? ????????? +7 (921) 982-21-43 @aleksandrvin -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Thu Nov 22 09:55:01 2012 From: henrik@REDACTED (Henrik Nord) Date: Thu, 22 Nov 2012 09:55:01 +0100 Subject: [erlang-patches] Deep list argument error under Windows in os:cmd/1 In-Reply-To: References: Message-ID: <50ADE865.7030402@erlang.org> Hi Sorry for the delay, I have now added your patch to master-pu, and rebased it on master. Thank you for your contribution! On 2012-11-08 11:11, Aleksandr Vinokurov wrote: > Because of leeway in implementing os:cmd/1 under different OS there is > a difference in results when calling it with deep list > argument. os:cmd/1 specifies io_lib:chars() type for its argument and > io_lib functions can produce deep lists inspite of io_lib:chars() > result type specification. This commit flattens the argument for > erlang:open_port/2 (which is used under Windows) and expands the > os_SUITE to regress the bug. > git fetch git://github.com/aleksandr-vin/otp.git maint-fix-os-cmd-win > or viewed here: > https://github.com/aleksandr-vin/otp/compare/maint-fix-os-cmd-win > https://github.com/aleksandr-vin/otp/compare/maint-fix-os-cmd-win.patch > -- > Aleksandr Vinokurov > +7 (921) 982-21-43 > @aleksandrvin > > > > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Thu Nov 22 10:07:48 2012 From: henrik@REDACTED (Henrik Nord) Date: Thu, 22 Nov 2012 10:07:48 +0100 Subject: [erlang-patches] Support ANSI in the console In-Reply-To: References: <50A4DE26.30402@erlang.org> Message-ID: <50ADEB64.6060601@erlang.org> No its in there, it was just removed temporary from the push On 2012-11-21 19:01, Yurii Rashkovskii wrote: > Forgive me if I am missing something, but did this patch somehow not > make it to master-pu? > > https://github.com/erlang/otp/blob/master-pu/erts/emulator/drivers/unix/ttsl_drv.c#L915 > > (pu doesn't have it either > https://github.com/erlang/otp/blob/pu/erts/emulator/drivers/unix/ttsl_drv.c#L915) > > Is it intentional or is it an omission? > > > On Thu, Nov 15, 2012 at 4:20 AM, Henrik Nord > wrote: > > Thank you for your contribution, I have added the patch to > 'master-pu' > > > > On 2012-11-14 14:49, Pedram Nimreezi wrote: > > https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L901 > https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L599 > https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L609 > > > -- > /Henrik Nord Erlang/OTP > > > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches > > -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From yrashk@REDACTED Thu Nov 22 10:11:22 2012 From: yrashk@REDACTED (Yurii Rashkovskii) Date: Thu, 22 Nov 2012 01:11:22 -0800 Subject: [erlang-patches] Support ANSI in the console In-Reply-To: <50ADEB64.6060601@erlang.org> References: <50A4DE26.30402@erlang.org> <50ADEB64.6060601@erlang.org> Message-ID: Is there any *reliable* way to track what's in pu/master-pu? On Thu, Nov 22, 2012 at 1:07 AM, Henrik Nord wrote: > No its in there, it was just removed temporary from the push > > > > On 2012-11-21 19:01, Yurii Rashkovskii wrote: > > Forgive me if I am missing something, but did this patch somehow not make > it to master-pu? > > > https://github.com/erlang/otp/blob/master-pu/erts/emulator/drivers/unix/ttsl_drv.c#L915 > > (pu doesn't have it either > https://github.com/erlang/otp/blob/pu/erts/emulator/drivers/unix/ttsl_drv.c#L915 > ) > > Is it intentional or is it an omission? > > > On Thu, Nov 15, 2012 at 4:20 AM, Henrik Nord wrote: > >> Thank you for your contribution, I have added the patch to 'master-pu' >> >> >> >> On 2012-11-14 14:49, Pedram Nimreezi wrote: >> >>> >>> https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L901 >>> >>> https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L599 >>> >>> https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L609 >>> >> >> -- >> /Henrik Nord Erlang/OTP >> >> >> _______________________________________________ >> erlang-patches mailing list >> erlang-patches@REDACTED >> http://erlang.org/mailman/listinfo/erlang-patches >> > > > -- > /Henrik Nord Erlang/OTP > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Thu Nov 22 10:15:00 2012 From: henrik@REDACTED (Henrik Nord) Date: Thu, 22 Nov 2012 10:15:00 +0100 Subject: [erlang-patches] Support ANSI in the console In-Reply-To: References: <50A4DE26.30402@erlang.org> <50ADEB64.6060601@erlang.org> Message-ID: <50ADED14.6030404@erlang.org> This mailing list + github is the only way atm. We are considering letting a view of our daily build result page show up to the public via erlang.org That would increase transparency and possible decrease the turnaround time for patches as the authors themselves could check the test results of their patches. On 2012-11-22 10:11, Yurii Rashkovskii wrote: > Is there any *reliable* way to track what's in pu/master-pu? > > > On Thu, Nov 22, 2012 at 1:07 AM, Henrik Nord > wrote: > > No its in there, it was just removed temporary from the push > > > > On 2012-11-21 19:01, Yurii Rashkovskii wrote: >> Forgive me if I am missing something, but did this patch somehow >> not make it to master-pu? >> >> https://github.com/erlang/otp/blob/master-pu/erts/emulator/drivers/unix/ttsl_drv.c#L915 >> >> (pu doesn't have it either >> https://github.com/erlang/otp/blob/pu/erts/emulator/drivers/unix/ttsl_drv.c#L915) >> >> Is it intentional or is it an omission? >> >> >> On Thu, Nov 15, 2012 at 4:20 AM, Henrik Nord > > wrote: >> >> Thank you for your contribution, I have added the patch to >> 'master-pu' >> >> >> >> On 2012-11-14 14:49, Pedram Nimreezi wrote: >> >> https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L901 >> https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L599 >> https://github.com/DeadZen/otp/blob/d3e3d51dbb21f0fdb125becacb80e34d0565fff7/erts/emulator/drivers/unix/ttsl_drv.c#L609 >> >> >> -- >> /Henrik Nord Erlang/OTP >> >> >> _______________________________________________ >> erlang-patches mailing list >> erlang-patches@REDACTED >> http://erlang.org/mailman/listinfo/erlang-patches >> >> > > -- > /Henrik Nord Erlang/OTP > > -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Thu Nov 22 11:08:28 2012 From: henrik@REDACTED (Henrik Nord) Date: Thu, 22 Nov 2012 11:08:28 +0100 Subject: [erlang-patches] Fix Table Viewer refresh crash In-Reply-To: References: Message-ID: <50ADF99C.5070109@erlang.org> Thank you for your contribution, patch added to 'master-pu' On 2012-11-08 14:26, Peti G?m?ri wrote: > Hi, > > This minor patch handles the case when observer Table Viewer wants to > refresh an ets table which no more exists. > > thanks > Peter > > > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Mon Nov 26 10:46:25 2012 From: henrik@REDACTED (Henrik Nord) Date: Mon, 26 Nov 2012 10:46:25 +0100 Subject: [erlang-patches] ASN.1 Patch moving num_bits to compile-time In-Reply-To: References: Message-ID: <50B33A71.6050208@erlang.org> Thanks for the patch and for pointing out that numbits can be resolved in compile time. We will whoever not include this patch since we are working with a major rewrite and optimization of the per and uper backends and will address this and other opportunities for optimization in a different way, but with the same principle of moving calculations to compile time as much as possible. Thank you for your contribution! On 09/24/2012 06:05 PM, Jeremy Heater wrote: > Hello, > > Here is a proposed patch that moves asn1rt_uper_bin:num_bits/1 from > the runtime to the compile-time (from asn1rt_uper_bin to > asn1ct_gen_per and asn1ct_constructed_per)./ > /The bit number information is added to the SizeConstraint and > ValueRange constraints when possible, and as another parameter in > getchoice/3 and set_choice/3 (now getchoice/4 and set_choice/4 for the > uper encoding). > > git fetch git://github.com/Kwisatx/otp.git > move_num_bits_call_to_compilation > > https://github.com/Kwisatx/otp/compare/maint...move_num_bits_call_to_compilation > https://github.com/Kwisatx/otp/compare/maint...move_num_bits_call_to_compilation.patch > > I tested the patch with an example written to call heavily on the > num_bits function and got encouraging results (time measured with > timer:tc to encode was 5 to 15% faster, and to decode was 3 to 4 times > faster with the patch). > > Best regards, > Jeremy Heater. > > PS: here's the ASN.1 grammar I used to test: > > NumBitsBench DEFINITIONS AUTOMATIC TAGS ::= BEGIN > TestType ::= SEQUENCE { > a SEQUENCE (SIZE (1..1000)) OF INTEGER(0..1000), > b SEQUENCE (SIZE (1..100000)) OF INTEGER(0..100000), > c SEQUENCE (SIZE (1..10000000)) OF INTEGER(0..10000000), > d SEQUENCE (SIZE (1..1000000000)) OF INTEGER(0..1000000000), > e SEQUENCE (SIZE (1..100000000000)) OF INTEGER(0..100000000000) > } END/ > / > > > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Mon Nov 26 10:50:29 2012 From: henrik@REDACTED (Henrik Nord) Date: Mon, 26 Nov 2012 10:50:29 +0100 Subject: [erlang-patches] ODBC extended error information In-Reply-To: <31E741CCEAAEA641930B48274B5C9840324E329E@SVLITMX02.shoretel.com> References: , <5072C95E.1020806@erlang.org> <31E741CCEAAEA641930B48274B5C9840324E329E@SVLITMX02.shoretel.com> Message-ID: <50B33B65.8090009@erlang.org> Thank you! I will run this and see. On 11/26/2012 03:40 AM, Bernie Duggan wrote: > Hi Henrik, > My colleague Franko has done the hard work of getting the test cases up and running, and writing up a test for this. You can re-fetch it from my repo: > > git fetch git://github.com/bernardd/otp.git odbc_extended_errors > > Please let us know if that's sufficient or whether there's more specific cases you'd like to see tested. > > Cheers, > > Bernard > > ________________________________________ > From: Henrik Nord [henrik@REDACTED] > Sent: Monday, 8 October 2012 11:38 PM > To: Bernie Duggan > Cc: erlang-patches@REDACTED > Subject: Re: [erlang-patches] ODBC extended error information > > Hi! > > We would like some tests for this. > Maby a test to check the extended error handling some operation with a > expected error and some without, and then check for the correct type of > return value, instead of a hard match for the returned value > > Below follows instructions as how to get the odbc SUIT up and running. > > Thank you for your contribution! > > On 07/25/2012 09:44 AM, Bernie Duggan wrote: >> I did my best to figure out how to add some tests for this change, but >> from talking to a couple of other people I'm not alone in having >> difficulty even getting the ODBC suite running:) Following the >> instructions on the github wiki page just gives me a >> port_program_executable_not_found error. I'm happy to try harder to >> add some tests if someone can give me a hand with this. > The odbc test suite is not as straight forward as other test suits to > run as it depends > on so many third part products. In odbc_test.hrl there is a macro > defined that > will determine which backed database should be used (you may need to > change it to suite your circumstances). > Also you need to set up an SQL-data base and an .odbc-ini file for the user > running the test suit. Ex: > ------------------- > [Postgres] > Driver=/usr/lib/psqlodbc.so > Description=Postgres driver > ServerName=server1 > Database=odbctest > Port=5432 > LogonID=odbctest > Password=gurka > > [MySQL] > Driver = /opt/local/lib/libmyodbc5.so Description=MYSQL driver > Server= server2 > Database=odbctest > Port=3306 > ----------------------- > > And in the callback-file sqlserver.erl/postgres.erl/mysql.erl/oracle.erl > you may have to alter the connection-string returned by the funtion > connection_string/0. > If you want some other backed you will have to make your own > callback-module. > > -- > /Henrik Nord Erlang/OTP > > > ________________________________ > > This e-mail and any attachments are confidential. If it is not intended for you, please notify the sender, and please erase and ignore the contents. -- /Henrik Nord Erlang/OTP From dch@REDACTED Tue Nov 27 14:40:31 2012 From: dch@REDACTED (Dave Cottlehuber) Date: Tue, 27 Nov 2012 14:40:31 +0100 Subject: [erlang-patches] escript does not parse supplied vm args on Windows Message-ID: On Windows, the vmargs are not passed through from the 2nd or 3rd line of the escript file if the shebang syntax is not the unix shell style. Which it often isn't, as you'd expect. On unix, this produces the expected output of init-debug before requesting beer: ## ./icanhaz #!/usr/bin/env escript %% -*- erlang -*- %%! -init_debug -smp enable main(_) -> io:format("I CAN HAZ BEER?~n", []). On Windows, only the BEER is requested: ## icanhaz.cmd @echo off & setlocal & path=%~dp0;%path%; & escript.exe "%~dpn0.cmd" %* & goto :eof %% -*- erlang -*- %%! -init_debug -smp enable main(_) -> io:format("I CAN HAZ BEER?~n", []). NB: the somewhat cryptic sequence above tells a windows .cmd script to suppress printing the batch file commands as they are processed, so this @ would be a very common approach on windows. The path juggling inside allows you distribute an escript with a NIF-based DLL alongside in the same directory and have it "just work" without altering the system or shell path. Here's a small patch, accepting that the @ format is common on windows https://gist.github.com/4189389ecd2bf1ca8163 diff --git i/erts/etc/common/escript.c w/erts/etc/common/escript.c index 9e80ec6..dcb1c85 100644 --- i/erts/etc/common/escript.c +++ w/erts/etc/common/escript.c @@ -264,7 +264,8 @@ append_shebang_args(char* scriptname) static char linebuf[LINEBUFSZ]; char* ptr = fgets(linebuf, LINEBUFSZ, fd); - if (ptr != NULL && linebuf[0] == '#' && linebuf[1] == '!') { + /* Acceptable Shebang syntax is #/ for unix or @ for windows */ + if (ptr != NULL && ((linebuf[0] == '#' && linebuf[1] == '!') || linebuf[0] == '@')) { /* Try to find args on second or third line */ ptr = fgets(linebuf, LINEBUFSZ, fd); if (ptr != NULL && linebuf[0] == '%' && linebuf[1] == '%' && linebuf[2] == '!') { NBB: the whitespace in escript.c is inconsistent. The patch reflects this. NBBB: This yak was brought to you fully shaved whilst trying to understand why `-detached` wasn't working in escript on Windows. A+ Dave From henrik@REDACTED Tue Nov 27 15:42:48 2012 From: henrik@REDACTED (Henrik Nord) Date: Tue, 27 Nov 2012 15:42:48 +0100 Subject: [erlang-patches] odbc:auto_commit/{2,3} In-Reply-To: <5090D18A.2010006@gmail.com> References: <50855ACE.2090700@gmail.com> <5088D883.30308@gmail.com> <508F9F3C.3020604@erlang.org> <5090D18A.2010006@gmail.com> Message-ID: <50B4D168.1030109@erlang.org> Still failing **** User 2012-11-27 03:02:58.465 **** odbc_query_SUITE:auto_commit failed on line 1483 Reason: {badmatch,{ok,1}} **** User 2012-11-27 07:02:53.526 **** odbc_query_SUITE:auto_commit failed on line 1483 Reason: {badmatch,{ok,1}} On 10/31/2012 08:21 AM, Martynas Pumputis wrote: > Hi again, > > It seems that the problem is with odbc-mysql driver: when there are > two simultaneous connections (auto_commit=off) and one commits a > transaction, then the other one won't see any changes introduced by > the transaction. But this is out of scope problem. > > Anyway, I've fixed the test case, so, please, re-merge it: > > git fetch git://github.com/brb/otp.git odbc_autocommit > > https://github.com/brb/otp/compare/odbc_autocommit > https://github.com/brb/otp/compare/odbc_autocommit.patch > > Thanks, > Martynas > > On 10/30/2012 11:34 AM, Henrik Nord wrote: >> Hi You have introduced a few test case fails. >> >> odbc_query_SUITE:auto_commit failed on line 1483 >> Reason: {badmatch,{ok,1}} >> >> Solaris 2.10 and linux 32 bit, skipped on 64 >> >> ---------------------------------------------------------------- >> >> >> ODBCINI = false >> >> **** User 2012-10-30 04:53:24.303 **** >> odbc_connect_SUITE:control_process_dies failed on line 296 Reason: >> {badmatch,{connected,<0.309.0>}} >> >> Drop table: "test_serverAtelendur" {error, >> "[MySQL][ODBC 5.1 >> Driver][mysqld-5.1.41-3ubuntu12.10]Unknown table >> 'test_serverAtelendur' SQLSTATE IS: 42S02"} >> >> >> >> This is on Linux 32 bit, skipped on 64 >> >> ---------------------------------------------------------------- >> >> ODBCINI = false >> >> **** User 2012-10-30 04:53:24.222 **** odbc_connect_SUITE:port_dies >> failed on line 286 Reason: {badmatch,{status,waiting}} >> >> Drop table: "test_serverAtelendur" {error, >> "[MySQL][ODBC 5.1 >> Driver][mysqld-5.1.41-3ubuntu12.10]Unknown table >> 'test_serverAtelendur' SQLSTATE IS: 42S02"} >> >> >> same Linux as before 32 bit, skipped on 64 >> >> >> On 10/25/2012 08:13 AM, Martynas Pumputis wrote: >>> Hello, >>> >>> I'm sending my patch: >>> >>> git fetch git://github.com/brb/otp.git odbc_autocommit >>> >>> https://github.com/brb/otp/compare/odbc_autocommit >>> https://github.com/brb/otp/compare/odbc_autocommit.patch >>> >>> Best, >>> Martynas >>> >>> >>> _______________________________________________ >>> erlang-patches mailing list >>> erlang-patches@REDACTED >>> http://erlang.org/mailman/listinfo/erlang-patches >> >> -- >> /Henrik Nord Erlang/OTP >> -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From hm@REDACTED Wed Nov 28 09:57:55 2012 From: hm@REDACTED (=?ISO-8859-1?Q?H=E5kan_Mattsson?=) Date: Wed, 28 Nov 2012 09:57:55 +0100 Subject: [erlang-patches] escript does not parse supplied vm args on Windows In-Reply-To: References: Message-ID: If you want to extend the escript syntax it does not suffice to just fix escript.c. Besides documentation and test suites, you need to fix ALL code that is dependent of the escript syntax, such as the functions escript:create/2 and escript:extract/2. /H?kan On Tue, Nov 27, 2012 at 2:40 PM, Dave Cottlehuber wrote: > On Windows, the vmargs are not passed through from the 2nd or 3rd > line of the escript file if the shebang syntax is not the unix shell > style. Which it often isn't, as you'd expect. > > On unix, this produces the expected output of init-debug before requesting beer: > > ## ./icanhaz > > #!/usr/bin/env escript > %% -*- erlang -*- > %%! -init_debug -smp enable > main(_) -> io:format("I CAN HAZ BEER?~n", []). > > On Windows, only the BEER is requested: > > ## icanhaz.cmd > > @echo off & setlocal & path=%~dp0;%path%; & escript.exe > "%~dpn0.cmd" %* & goto :eof > %% -*- erlang -*- > %%! -init_debug -smp enable > main(_) -> io:format("I CAN HAZ BEER?~n", []). > > NB: the somewhat cryptic sequence above tells a windows .cmd script to > suppress printing the batch file commands as they are processed, so > this @ would be a very common approach on windows. The path juggling > inside allows you distribute an escript with a NIF-based DLL alongside > in the same directory and have it "just work" without altering the > system or shell path. > > Here's a small patch, accepting that the @ format is common on windows > https://gist.github.com/4189389ecd2bf1ca8163 > > diff --git i/erts/etc/common/escript.c w/erts/etc/common/escript.c > index 9e80ec6..dcb1c85 100644 > --- i/erts/etc/common/escript.c > +++ w/erts/etc/common/escript.c > @@ -264,7 +264,8 @@ append_shebang_args(char* scriptname) > static char linebuf[LINEBUFSZ]; > char* ptr = fgets(linebuf, LINEBUFSZ, fd); > > - if (ptr != NULL && linebuf[0] == '#' && linebuf[1] == '!') { > + /* Acceptable Shebang syntax is #/ for unix or @ for windows */ > + if (ptr != NULL && ((linebuf[0] == '#' && linebuf[1] == '!') || > linebuf[0] == '@')) { > /* Try to find args on second or third line */ > ptr = fgets(linebuf, LINEBUFSZ, fd); > if (ptr != NULL && linebuf[0] == '%' && linebuf[1] == '%' && > linebuf[2] == '!') { > > NBB: the whitespace in escript.c is inconsistent. The patch reflects this. > > NBBB: This yak was brought to you fully shaved whilst trying to > understand why `-detached` wasn't working in escript on Windows. > > A+ > Dave > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches From dch@REDACTED Wed Nov 28 13:13:55 2012 From: dch@REDACTED (Dave Cottlehuber) Date: Wed, 28 Nov 2012 13:13:55 +0100 Subject: [erlang-patches] escript does not parse supplied vm args on Windows In-Reply-To: References: Message-ID: On 28 November 2012 09:57, H?kan Mattsson wrote: > If you want to extend the escript syntax it does not suffice to > just fix escript.c. Besides documentation and test suites, you > need to fix ALL code that is dependent of the escript syntax, > such as the functions escript:create/2 and escript:extract/2. > > /H?kan Hi H?kan I'm not extending escript syntax, just ensuring that the functionality of parsing vm args is consistent across platforms as implied in the documentation. In fact the code is much more constrained, and the vm args will only be read if the first line matches /^#!/. Clearly Windows will not accept a script that has #! as the first line, it's not valid syntax. The documentation has been amended as you suggest, https://gist.github.com/4189389ecd2bf1ca8163 thanks for the prompting. I don't think escript:create and extract need to be altered in this case. A+ Dave From jose.valim@REDACTED Wed Nov 28 14:11:21 2012 From: jose.valim@REDACTED (=?ISO-8859-1?Q?Jos=E9_Valim?=) Date: Wed, 28 Nov 2012 14:11:21 +0100 Subject: [erlang-patches] Bug fixes for cover Message-ID: Hello, I am sending a couple bug fixes for cover. I have broken those fixes into three granular commits. The commit messages contains the rationale behind them. One of the commits changes cover to get the source from "Module:module_info(compile)" if the current heuristic that traverses directories fails. In my opinion, we could rely solely on the source information and remove the heuristic completely but I have kept the current heuristic as the first mechanism in order to minimize the impact of the changes. As such, I would appreciate if those changes could be merged into maint. :) git fetch git://github.com/josevalim/otp.git cover-patches https://github.com/josevalim/otp/compare/cover-patches https://github.com/josevalim/otp/compare/cover-patches.patch Thank you, *Jos? Valim* www.plataformatec.com.br Skype: jv.ptec Founder and Lead Developer -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Wed Nov 28 15:05:43 2012 From: henrik@REDACTED (Henrik Nord) Date: Wed, 28 Nov 2012 15:05:43 +0100 Subject: [erlang-patches] Bug fixes for cover In-Reply-To: References: Message-ID: <50B61A37.9000705@erlang.org> Thank you for your contribution, I have added this to 'master-pu' On 11/28/2012 02:11 PM, Jos? Valim wrote: > into maint. :) > > git fetch git://github.com/josevalim/otp.git > cover-patches > > https://github.com/josevalim/otp/compare/cover-patches > https://github.com/josevalim/otp/compare/cover-patches.patch > -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: From n.oxyde@REDACTED Wed Nov 28 15:39:59 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Wed, 28 Nov 2012 15:39:59 +0100 Subject: [erlang-patches] Implement ./otp_build configure --enable-silent-rules Message-ID: <22B4C91F-13C6-4899-9DD9-8A1566146848@gmail.com> Hi, I got bored of the too verbose output of the build process, so I added automake's silent rules to Erlang/OTP. Here is an example of output produced with silent rules: https://gist.github.com/4160201 I may have missed some build tools' invocations as I can only compile Erlang on my Mac. https://github.com/nox/otp/compare/erlang:master...enable-silent-rules https://github.com/nox/otp/compare/erlang:master...enable-silent-rules.patch git fetch https://github.com/nox/otp enable-silent-rules Regards, -- Anthony Ramine From tuncer.ayaz@REDACTED Wed Nov 28 15:59:52 2012 From: tuncer.ayaz@REDACTED (Tuncer Ayaz) Date: Wed, 28 Nov 2012 15:59:52 +0100 Subject: [erlang-patches] Implement ./otp_build configure --enable-silent-rules In-Reply-To: <22B4C91F-13C6-4899-9DD9-8A1566146848@gmail.com> References: <22B4C91F-13C6-4899-9DD9-8A1566146848@gmail.com> Message-ID: On Wed, Nov 28, 2012 at 3:39 PM, Anthony Ramine wrote: > Hi, > > I got bored of the too verbose output of the build process, so I added > automake's silent rules to Erlang/OTP. > > Here is an example of output produced with silent rules: > https://gist.github.com/4160201 > > I may have missed some build tools' invocations as I can only compile > Erlang on my Mac. > > https://github.com/nox/otp/compare/erlang:master...enable-silent-rules > https://github.com/nox/otp/compare/erlang:master...enable-silent-rules.patch > > git fetch https://github.com/nox/otp enable-silent-rules Nice patch, but I would prefer to make the default be silent. From n.oxyde@REDACTED Wed Nov 28 16:05:40 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Wed, 28 Nov 2012 16:05:40 +0100 Subject: [erlang-patches] Implement ./otp_build configure --enable-silent-rules In-Reply-To: References: <22B4C91F-13C6-4899-9DD9-8A1566146848@gmail.com> Message-ID: <24FF56D5-A4DD-48DA-A16F-A497264016B7@gmail.com> My (and automake's) rationale about making it non-default is that if people compile Erlang/OTP just to use Erlang the language and the build fails because of a compile error, we will have to tell them to post again with a new verbose build log. IMO, this feature should be used only by people who recompile often. -- Anthony Ramine Le 28 nov. 2012 ? 15:59, Tuncer Ayaz a ?crit : > On Wed, Nov 28, 2012 at 3:39 PM, Anthony Ramine wrote: >> Hi, >> >> I got bored of the too verbose output of the build process, so I added >> automake's silent rules to Erlang/OTP. >> >> Here is an example of output produced with silent rules: >> https://gist.github.com/4160201 >> >> I may have missed some build tools' invocations as I can only compile >> Erlang on my Mac. >> >> https://github.com/nox/otp/compare/erlang:master...enable-silent-rules >> https://github.com/nox/otp/compare/erlang:master...enable-silent-rules.patch >> >> git fetch https://github.com/nox/otp enable-silent-rules > > Nice patch, but I would prefer to make the default be silent. From freza@REDACTED Wed Nov 28 17:31:24 2012 From: freza@REDACTED (Jachym Holecek) Date: Wed, 28 Nov 2012 11:31:24 -0500 Subject: [erlang-patches] Implement ./otp_build configure --enable-silent-rules In-Reply-To: References: <22B4C91F-13C6-4899-9DD9-8A1566146848@gmail.com> Message-ID: <20121128163124.GA29480@circlewave.net> # Tuncer Ayaz 2012-11-28: > On Wed, Nov 28, 2012 at 3:39 PM, Anthony Ramine wrote: > > I got bored of the too verbose output of the build process, The output isn't there to amuse you but to give you information for troubleshooting in case things go wrong. ;-) > > so I added automake's silent rules to Erlang/OTP. I never understood the point of a build process generating incomplete progress report. Either I wan't all the details (almost always) or just the final outcome -- something you can do without any patching: $ if ! make > /tmp/build.log 2>&1 ;then echo "BUILD FAILED!!!" ; fi > > Here is an example of output produced with silent rules: > > https://gist.github.com/4160201 > > > > I may have missed some build tools' invocations as I can only compile > > Erlang on my Mac. > > > > https://github.com/nox/otp/compare/erlang:master...enable-silent-rules > > https://github.com/nox/otp/compare/erlang:master...enable-silent-rules.patch > > > > git fetch https://github.com/nox/otp enable-silent-rules > > Nice patch, but I would prefer to make the default be silent. That's actively harmful -- a build failing on you with useless output is already bad enough, having to re-run the build is annoying on its own, having to additionally figure out the option that will give you useful output is almost insulting. Maybe it's just me... BR, -- Jachym From essen@REDACTED Wed Nov 28 20:06:39 2012 From: essen@REDACTED (=?ISO-8859-1?Q?Lo=EFc_Hoguin?=) Date: Wed, 28 Nov 2012 20:06:39 +0100 Subject: [erlang-patches] Reclaim the 'query' keyword Message-ID: <50B660BF.6060507@ninenines.eu> Hello, I want to reclaim the 'query' word for everyone to use. This word is much too important to keep it reserved forever. Use includes anything you can query, from databases to web services to hardware. Since I was at it I also removed most of what remains from Mnemosyne. What's left is the :- operator, and its associated rules. I didn't want to remove these because they do relate to the Prolog origins of the language and this was a too big decision for me to take. I tested most of the suites but since I wasn't able to run the test suite entirely because Mnesia was timeouting all the time, I may have forgotten something. So please: git fetch git://github.com/essen/otp.git forget-mnemosyne https://github.com/essen/otp/compare/erlang:master...forget-mnemosyne https://github.com/essen/otp/compare/erlang:master...forget-mnemosyne.patch And keep me informed! -- Lo?c Hoguin Erlang Cowboy Nine Nines http://ninenines.eu From tuncer.ayaz@REDACTED Wed Nov 28 23:29:36 2012 From: tuncer.ayaz@REDACTED (Tuncer Ayaz) Date: Wed, 28 Nov 2012 23:29:36 +0100 Subject: [erlang-patches] Implement ./otp_build configure --enable-silent-rules In-Reply-To: <20121128163124.GA29480@circlewave.net> References: <22B4C91F-13C6-4899-9DD9-8A1566146848@gmail.com> <20121128163124.GA29480@circlewave.net> Message-ID: On Wed, Nov 28, 2012 at 5:31 PM, Jachym Holecek wrote: > # Tuncer Ayaz 2012-11-28: > > On Wed, Nov 28, 2012 at 3:39 PM, Anthony Ramine wrote: > > > I got bored of the too verbose output of the build process, > > The output isn't there to amuse you but to give you information for > troubleshooting in case things go wrong. ;-) > > > > so I added automake's silent rules to Erlang/OTP. > > I never understood the point of a build process generating > incomplete progress report. Either I wan't all the details (almost > always) or just the final outcome -- something you can do without > any patching: > > $ if ! make > /tmp/build.log 2>&1 ;then echo "BUILD FAILED!!!" ; fi > > > > Here is an example of output produced with silent rules: > > > https://gist.github.com/4160201 > > > > > > I may have missed some build tools' invocations as I can only > > > compile Erlang on my Mac. > > > > > > git fetch https://github.com/nox/otp enable-silent-rules > > > > Nice patch, but I would prefer to make the default be silent. > > That's actively harmful -- a build failing on you with useless > output is already bad enough, having to re-run the build is annoying > on its own, having to additionally figure out the option that will > give you useful output is almost insulting. > > Maybe it's just me... Anthony's patch doesn't silence the build as it seems to me you are thinking it does, does it? The patch reduces the various cc, ld, erlc calls to CC foo/bar/baz by not printing the complete command. You do of course still get errors and warnings in both modes. If the build fails, you can also make it print the complete failed command. The same 'silencing' mechanism is used by many mainstream projects and enabled by default. From kino@REDACTED Thu Nov 29 08:22:23 2012 From: kino@REDACTED (satoshi kinoshita) Date: Thu, 29 Nov 2012 16:22:23 +0900 Subject: [erlang-patches] (no subject) Message-ID: I found antoher 64bit related bug in odbcserver.c. It affects only param_query for stored-procedure with OUT parameter of SQL_C_SLONG type. ---Patch-------------------------------------------------- git fetch git://github.com/kinogmt/otp.git odbc64 https://github.com/kinogmt/otp/compare/maint...odbc64 https://github.com/kinogmt/otp/compare/maint...odbc64.patch ----------------------------------------------------------- Thanks, Kinoshtia From n.oxyde@REDACTED Thu Nov 29 10:49:43 2012 From: n.oxyde@REDACTED (Anthony Ramine) Date: Thu, 29 Nov 2012 10:49:43 +0100 Subject: [erlang-patches] Implement ./otp_build configure --enable-silent-rules In-Reply-To: <20121128163124.GA29480@circlewave.net> References: <22B4C91F-13C6-4899-9DD9-8A1566146848@gmail.com> <20121128163124.GA29480@circlewave.net> Message-ID: Le 28 nov. 2012 ? 17:31, Jachym Holecek a ?crit : > # Tuncer Ayaz 2012-11-28: >> On Wed, Nov 28, 2012 at 3:39 PM, Anthony Ramine wrote: >>> I got bored of the too verbose output of the build process, > > The output isn't there to amuse you but to give you information for > troubleshooting in case things go wrong. ;-) I never said I did this patch to have a fancy output or to be amused by it. In my quest to EEP20: Split the atoms [1], I need to update a lot of files without ever messing with the Makefiles nor adding any file to the build process or even to the Git repository. Should I be bothered by obscure GCC flags that don't concern me while doing so? Should I not be able to view the various warnings caused by my changes with just a glance? I could use GCC's -Werror but what should I do about warnings that are independent of my tinkering? >>> so I added automake's silent rules to Erlang/OTP. > > I never understood the point of a build process generating incomplete > progress report. Either I wan't all the details (almost always) or > just the final outcome -- something you can do without any patching: > > $ if ! make > /tmp/build.log 2>&1 ;then echo "BUILD FAILED!!!" ; fi I could just do make "2>&1 | tee make.log" but it is still a pain to find the relevant warnings in the produced make.log file. >>> Here is an example of output produced with silent rules: >>> https://gist.github.com/4160201 >>> >>> I may have missed some build tools' invocations as I can only compile >>> Erlang on my Mac. >>> >>> https://github.com/nox/otp/compare/erlang:master...enable-silent-rules >>> https://github.com/nox/otp/compare/erlang:master...enable-silent-rules.patch >>> >>> git fetch https://github.com/nox/otp enable-silent-rules >> >> Nice patch, but I would prefer to make the default be silent. > > That's actively harmful -- a build failing on you with useless output > is already bad enough, having to re-run the build is annoying on its > own, having to additionally figure out the option that will give you > useful output is almost insulting. I'm with you on letting it non-default; I sometimes yell at rebar for this very reason when I want to see its erlc invocations. [1] You can follow my progress on this on https://github.com/nox/otp/compare/erlang:master...eep20 -- Anthony Ramine From henrik@REDACTED Fri Nov 30 10:29:13 2012 From: henrik@REDACTED (Henrik Nord) Date: Fri, 30 Nov 2012 10:29:13 +0100 Subject: [erlang-patches] Optimize handling of local fun variables in v3_kernel In-Reply-To: References: Message-ID: <50B87C69.1030406@erlang.org> in master-pu On 11/10/2012 04:35 PM, Anthony Ramine wrote: > Hi, > > This branch removes the so-called "reverse etha-conversion" from v3_kernel and > replaces it by a proper call to the make_fun internal BIF without the need of a > redundant lambda function every time the local fun variable is referenced. > > There may be some test suites related to this in lib/compiler/test/ > but I couldn't > find one; feel free to point me to them if any. > > https://github.com/nox/otp/compare/rm-reverse-eta-conversion > https://github.com/nox/otp/compare/rm-reverse-eta-conversion.patch > > git fetch https://github.com/nox/otp/ rm-reverse-eta-conversion > > Regards, > -- /Henrik Nord Erlang/OTP From aronisstav@REDACTED Fri Nov 30 10:48:37 2012 From: aronisstav@REDACTED (Stavros Aronis) Date: Fri, 30 Nov 2012 10:48:37 +0100 Subject: [erlang-patches] Dialyzer's record field type warnings Message-ID: Sometimes Dialyzer would report violations of the expected types in some record fields when this was not guaranteed to be the case. This patch fixes this problem. git fetch git://github.com/aronisstav/otp.git dialyzer-record-pattern Regards, Stavros -------------- next part -------------- An HTML attachment was scrubbed... URL: From henrik@REDACTED Fri Nov 30 12:48:17 2012 From: henrik@REDACTED (Henrik Nord) Date: Fri, 30 Nov 2012 12:48:17 +0100 Subject: [erlang-patches] Dialyzer's record field type warnings In-Reply-To: References: Message-ID: <50B89D01.7070005@erlang.org> great, thanks! On 11/30/2012 10:48 AM, Stavros Aronis wrote: > Sometimes Dialyzer would report violations of the expected types in > some record fields when this was not guaranteed to be the case. This > patch fixes this problem. > > git fetch git://github.com/aronisstav/otp.git > dialyzer-record-pattern > > Regards, > > Stavros > > > _______________________________________________ > erlang-patches mailing list > erlang-patches@REDACTED > http://erlang.org/mailman/listinfo/erlang-patches -- /Henrik Nord Erlang/OTP -------------- next part -------------- An HTML attachment was scrubbed... URL: