[erlang-questions] how to build erlang system that accesses external resources

Gleb Peregud gleber.p@REDACTED
Tue Jul 21 16:32:08 CEST 2009


All options are described here http://erlang.org/doc/tutorial/part_frame.html

Basically there are 3 (or four if FFI is counted) options (please
correct me if I'm wrong):
1) Ports
2) Linked-in drivers
3) C-nodes
4) FFI

Fourth one is not in official distribution, so I will skip it (you can
read about it here [1]).

Third one is quite complex to be written from scratch, but doable. I
haven't written any C node in Delphi or C, so other would provide more
information. Though writing Python C-nodes with twotp [3] is very easy
:)

Second one is strongly discouraged. It would mean that your Delphi/C
code would be running inside Erlang VM and any single bug can bring
done whole VM [2]. Moreover writing linked-in drivers is cumbersome
and you have to obey few rules (e.g. timing), not to mention pain of
managing threads inside the linked-in driver... Though if you need a
fast and long-term solution you could use it, but cost of development
would be much higher than using ports.

If it is imperative to use Erlang I would go with ports. Ports are
just simple external processes (it could C program, Delphi or even
bash script), which communicates with Erlang using stdio/stdout. You
have to define a communication protocol (it could be simple line text
based protocol or some more complex binary protocol). Or you could use
erl_interface / ei libraries to manage erlang term coding/decoding. It
is really easy to manage ports from within Erlang (text line based
example here [4]). This way you would be able to start multiple
external processes, which will do the job (using existing DLLs) and
you would communicate with them through stdio/stdout.

When ports are used and everything's written according to OTP
principles managing it is a breeze [5].

1: http://muvara.org/crs4/erlang/ffi/
2: http://erlang.org/doc/tutorial/c_portdriver.html
3: https://launchpad.net/twotp
4: http://github.com/gleber/sha1cruncher/blob/d2e8f0b924ed5d16ade815d9a1fd90cd129ebc40/src/main.erl#L160
(beware, it is very young and non-mature code)
5: http://www.trapexit.org/Writing_an_Erlang_Port_using_OTP_Principles

2009/7/21 paweł kamiński <kamiseq@REDACTED>:
> hi all,
> I have a working system written in delphi (and Im not a delphi expert and it
> wasnt my idea :)) that creates few threads (like 10-20) and each thread is
> able to load some dll and then through that dll is performing some action on
> local db or on other resource. the problem is that it is very hard now to
> controll  threads, force them to kill etc and as I can see operating system
> is not helping at all so it is a p.i.t.a. so I was thinking to port the
> system into erlang. but we produced a lot of those dlls so it will be almost
> impossible to rewrite them into erlang once again.
>
> So (as Im quite new to erlang) I imagine that I create a erlang's system
> that starts and manages processes with ease but then I somehow need to load
> dll by some external system proccess and talk with it through ports. so it
> seems to me Im back where I started, doesnt it? again I cant have only one
> proccess for all dll loaded on the OS side, and I really cant figure out how
> I should plan everything.
>
> I havent read much about ports so maybe I should go through the chapter
> again, if so just tell me it is a good direction here.
>
> pozdrawiam
> Paweł Kamiński
>
> kamiseq@REDACTED
> pkaminski.prv@REDACTED
> ______________________
>



-- 
Gleb Peregud
http://gleber.pl/

Every minute is to be grasped.
Time waits for nobody.
-- Inscription on a Zen Gong


More information about the erlang-questions mailing list