[erlang-questions] Recursive Heap Allocation

Joe Armstrong erlang@REDACTED
Wed Jul 25 09:36:02 CEST 2012


It's a bug in the smp handling of io:format.

This program has similar behaviour

  -module(bug1).
  -compile(export_all).

  test(N) ->
          io:format("~p~n", [N]),
          test(N+1).

I  did this:

1 > spawn(fun() -> etop:start() end).
2> bug1:test(0).

You can see that user_drv global process is accumulating messages
faster than it can handle them.
It's in usr_drv:io_request/3.

As far as I'm aware io:format did have flow control so this shouldn't happen

I then changed the program to the following:

test(N) ->
    Len = process_info(whereis(user_drv),[message_queue_len]),
    io:format("~p ~p~n", [N, Len]),
    test(N+1).

The printout from this is weird - the length stays at zero for long
periods - then climbs linearly
up to some number like  180 or 169 then instantaneously goes back to zero

Now I ran with "erl -smp disable"

The counter stays at zero forever.

I think the I/O handling for smp erlang is buggy






On Mon, Jul 23, 2012 at 9:50 PM, Greg Martin <greg@REDACTED> wrote:
> I'm just learning erlang using Erlang R15B01 (erts-5.9.1) on Windows. I'm
> wondering why ipv4_addrs:test(ipv4_addrs:first()) leads to the crash below
> and how it can be called so that it doesn't. Thanks.
>
> {1,2,22,127}
> {1,2,22,128}
> {1,2,22,129}
> {1,2,22,130}
> {1,2,22,131}
> {1,2,22,132}
> {1,2,22,133}
> {1,2,22,134}
>
> Crash dump was written to: erl_crash.dump
> eheap_alloc: Cannot allocate 373662860 bytes of memory (of type "heap").
>
>
> Abnormal termination
>
>
> -module(ipv4_addrs).
>
> -export([first/0, next/1, test/1]).
>
> first()->
>         { 1,1,0,0 }.
>
> next( { 255, 255, 255, 255 } ) -> done;
> next( { 9, 255, 255, 255 } ) -> { 11, 0, 0, 0 };
> next( { 172, 15, 255, 255 } ) -> { 172, 32, 0, 0 };
> next( { 192, 167, 255, 255 } ) -> { 192, 169, 0, 0 };
> next( { First, 255, 255, 255 } ) -> { First + 1, 0, 0, 0 };
> next( { First, Second, 255, 255 } ) -> { First, Second + 1, 0, 0 };
> next( { First, Second, Third, 255 } ) -> { First, Second, Third + 1, 0 };
> next( { First, Second, Third, Fourth } ) -> { First, Second, Third, Fourth +
> 1 }.
>
> test(done) -> done;
> test(Addr) ->
>         io:format("~p~n", [Addr]),
>         Next = next(Addr),
>         test(Next).
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions



More information about the erlang-questions mailing list