[erlang-questions] Newbie - eldap and threads
Humaira
humaira.surve@REDACTED
Fri Feb 19 09:17:16 CET 2010
Hi Chandru,
Thanks for the very useful information. I noticed that I have a
different version of eldap than you are referring to. Where would one
find the gen_fsm version? Is there a commonly used repository or is it
the version from ejabberd?
I looked through the version on GitHub and it is not the gen_fsm
version.
Thanks,
Humaira
On Thu, 2010-02-18 at 17:10 +0000, Chandru wrote:
> Hi,
>
> On 18 February 2010 08:21, Humaira Surve <humaira.surve@REDACTED> wrote:
> >
> > Hi,
> >
> > I've recently began playing around with erlang and come from a java
> > background.
> >
> > I was quite impressed by the eldap library and its general simplicity to
> > use. I have a question though.
> > If one opens a single connection and binds, but has multiple clients sending
> > requests through this one connection,
> > is there a possiblity of thread-related issues.
>
> Not really. All requests are multiplexed on to the same connection.
>
> >
> > What guarantees that a client gets the correct response or that a response
> > is not over-written by more than one simultaneous request?
> > I have looked through the eldap code and noticed that a single connection
> > uses a TCP file descriptor.
>
> See the source in eldap_fsm:send_command/3. I've added comments.
>
> send_command(Command, From, S) ->
> %% Assign a unique id for this request which is the messageID in
> the LDAP request
> Id = bump_id(S),
>
> %% Build the request
> {Name, Request} = gen_req(Command),
> Message = #'LDAPMessage'{messageID = Id,
> protocolOp = {Name, Request}},
> log2("~p~n",[{Name, Request}], S),
>
> %% Do ASN.1 encoding
> {ok, Bytes} = asn1rt:encode('ELDAPv3', 'LDAPMessage', Message),
>
> %% Send the request on the socket
> ok = gen_tcp:send(S#eldap.fd, Bytes),
>
> %% Start a timer
> Timer = erlang:start_timer(?CMD_TIMEOUT, self(), {cmd_timeout, Id}),
>
> %% Store the mapping from unique id to 'From' which is a
> reference to the calling process
> New_dict = dict:store(Id, [{Timer, From, Name}], S#eldap.dict),
>
> {ok, S#eldap{id = Id,
> dict = New_dict}}.
>
> When a response is received, the LDAP server will include the
> messageID in the response. The eldap_fsm process looks up its state
> and retrieves the reference to the calling process (assuming the
> request has not timed out), and sends the response out. This is
> handled in eldap_fsm:recvd_packet/2
>
> cheers
> Chandru
More information about the erlang-questions
mailing list