Implementing XPCOM objects in Erlang. (Modificado por Héctor Rivas Gándara)
Héctor Rivas Gándara
keymon@REDACTED
Tue May 31 17:21:34 CEST 2005
El 31/05/2005, a las 14:50, Ulf Wiger (AL/EAB) escribió:
> Why do you want to make the gen_server reentrant
> in the first place?
I'm developing the Erlang XPCOM binding. XPCOM is component tecnology
similar to COM used in Mozilla internals. A lot of interfaces of
mozilla receives an object as parameter and execute callbacks on it.
My first option was implement the component instances as processes.
> Another way to implement objects is to provide a module
> with a set of APIs that operate on an abstract data type.
That's the other option.
If the object is readonly or it will be accesed only by the C++ side
(the C++ will never do concurrent calls), there is no problem, but
there are some otherwise:
- The object will occasionally be passed to the XPCOM side (in C++).
- so a reference to it must be created and the object will be stored
in an ORB to allow the C++ side reference it.
- I can't known when the C++ side (or even a local process) will call
the object and change the object state.
I mean, I can't control the object access to follow the single
assignment rules.
One solution can be create an "object dictionary" with entries like
ObjectReference-ObjectState.
But this have more problems:
- the object support concurrent access (from C++, from Erlang
processes) and
- must allow reentrant calls.
To solve the first I could add some logic to the Object Dictionary to
allow lock the object state until a running method does not returns
(simulate synchronized methods).
But then it is not reentrant, so I should use a monitored lock (the
actual process can do reentrant calls).
But now I have other problem: If I use a monitored lock the
XPCOM-Erlang binding must offer thread consistency (there is a call
from Erlang to C++ and back to erlang again, the process must be the
same)
...
Too complex all. :-/
Anyway, I probably would allow the two options by setting an option in
the object creation function. The programmer can choose:
- use process objects if the object is not readonly and will be accesed
by C++ and Erlang
- use record objects if the object is readonly or only accesed by the
C++ side.
I've implemented my behaviour with callbacks like:
method(MethodName, InParams, From, State) -> {Reply, NewState}
Reply = {ok, OutParams} | noreply | {error, Reason}.
The objects implemented with this callbacks could be easily run with
records by simply change the behaviour code: I only need a dictionary
that could translate ObjectRefence -> {data, ObjectData} | {process,
ObjectPid}.
Please, comments / suggestions?
--
Greets
More information about the erlang-questions
mailing list