[トップ][ノート][編集履歴][一覧][最近の更新][->English]

Erlang

Category of Erlang

並列関数型言語Erlangのねた。

つくったもの

Link

Programming/Erlang/udpmsg

Category of Programming
Category of Erlang

せっかくだからErlang版も貼っとく。 じつはずっと昔に書いたコードだったりする。

-module(udpmsg).
-export([send/2]).

-include_lib("kernel/include/inet.hrl").

-define(IPMSG_VERSION,      16#0001).
-define(IPMSG_DEFAULT_PORT, 16#0979).
-define(IPMSG_SENDMSG,      16#020).

-define(DEFAULT_UDP_OPTS, [
                           {active, false},
%                          {broadcast, true},
                           {reuseaddr, true}
                          ]).

send_format(Num, Host, User, Cmd) ->
    lists:flatten(io_lib:format("~.10b:~.10b:~s:~s:~.10b:",   [?IPMSG_VERSION, Num, User, Host, Cmd])).
send_format(Num, Host, User, Cmd, Extra) ->
    lists:flatten(io_lib:format("~.10b:~.10b:~s:~s:~.10b:~s", [?IPMSG_VERSION, Num, User, Host, Cmd, Extra])).

send(Host, Msg) ->
    Num = erlang:phash(erlang:localtime(), 16777215),
    case gen_udp:open(0, ?DEFAULT_UDP_OPTS) of
        {ok, Socket} ->
            EntMsg = send_format(Num, "myhost", "myname", ?IPMSG_SENDMSG, Msg),
            gen_udp:send(Socket, Host, ?IPMSG_DEFAULT_PORT, EntMsg),
            gen_udp:close(Socket);
        Error ->
            Error
    end.

OpenBSD/Erlang/hipe

Category of OpenBSD
Category of Erlang

ErlangHiPE(High Performance Erlang) beam(erlangvm)(hipe)
FreeBSDx86hipe(FreeBSD-cvs:ports/lang/erlang/) OpenBSDotp-R11B-1

Erlanghipe./configure--enable-hipeOpenBSD-cvs:ports/lang/erlang/Makefile
./configure --disable-jinterface --disable-odbc --enable-threads --enable-kernel-poll --enable-hipe


erts/emulator/hipe/hipe_x86_signal.c OpenBSD-man:sigaltstackdlsymsigaltstack
(OpenBSD/2006/07/27/dlopen) : files:openbsd/otp_src_R11B-1-patch-erts_emulator_hipe_hipe_x86_signal.c
hipe_x86_signal.c
$ cat sigstack.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>

/*
 * Set alternate signal stack for the invoking thread.
 */
static void set_sigaltstack(void *ss_sp)
{
    struct sigaltstack ss;

    ss.ss_sp = ss_sp;
    ss.ss_flags = SS_ONSTACK;
    ss.ss_size = SIGSTKSZ;
    if (sigaltstack(&ss, NULL) < 0) {
    /* might be a broken pre-2.4 Linux kernel, try harder */
    ss.ss_flags = 0;
    if (sigaltstack(&ss, NULL) < 0) {
        perror("sigaltstack");
        abort();
    }
    }
}

main()
{
        static unsigned long my_sigstack[SIGSTKSZ/sizeof(long)];

        set_sigaltstack(my_sigstack);
}

-pthread
$ cc sigstack.c
$ ./a.out
$
$ cc sigstack.c -pthread
$ ./a.out
sigaltstack: Invalid argument
$

 OpenBSD-cvs:src/lib/libpthread/uthread/uthread_sigaltstack.c33
        if (ss == NULL) {


libpthreadErlang
$ erl
Erlang (BEAM) emulator version 5.5.1 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.5.1  (abort with ^G)
1>

hipe hipebeam
$ erlc +native file

erl
> c(module, [native, {hipe, ['O3']}]).


Erlang/side-effect

Category of Erlang

Erlang

Erlang(call/cc)
Erlang2()
gen_serversupervisorworker (CJava) ()
worker
 -behaviour(gen_server).

gen_server
gen_server5 supervisor
Erlang
 Pid = spawn(?MODULE, foo, []),
 Pid ! Message,
 ...

gen_server() (gen_serversupervisor)

-module(inc).
-behaviour(gen_server).

-export([start_link/0]).
-export([inc/0]).
-export([init/1, handle_call/3]).

start_link() ->
    gen_server:start_link({local, inc}, inc, [], []).

inc() ->
    gen_server:call(?MODULE, inc).

init(_Args) ->
    process_flag(trap_exit, true),
    {ok, 0}.

handle_call(inc, _From, State) ->
    Reply = State,
    {reply, Reply, State + 1}.

5 init/1handle_call/3使
start_link/0inc/0 handle_call/3

1> inc:start_link().
{ok,<x.x.x>}
2> inc:inc().
0
3> inc:inc().
1
4> inc:inc().
2

Erlangに関する全てのエントリ