<div dir="ltr">Yes, it is easy to get around this, but no it is not. The io module was designed to send the formatting computations to the io-server to be done there. The group leader is an io-server as well as being group leader (see my Erlang Rationale for a bit better explanation). As I see it you have the following options:<br>
<br>- Do not use io:fwrite or other formatting io calls directly but instead do io:put_chars(io_lib:fwrite(Fmt, Args)) instead. This ensures that only an iolist is sent to the group leader.<br>- Modify io.erl to do this for automatically for you and use this private version. This is not difficult and should cause no other problems.<br>
- Modify your program so that you start a local group leader/io-server which does the formatting and just send the output iolists to the <a href="http://otp.net">otp.net</a> process.<br><br>Do you do any input from <a href="http://otp.net">otp.net</a>? If so you will have to do the last option and fix the <a href="http://otp.net">otp.net</a> process a bit.<br>
<br>I hope this helps,<br><br>Robert<br><br><br><div class="gmail_quote">2008/10/8 Serge Aleynikov <span dir="ltr"><<a href="mailto:saleyn@gmail.com">saleyn@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Last weekend I did implement support for monitoring Erlang pids in <a href="http://otp.net" target="_blank">otp.net</a>.  It seems to work ok, though I see Vlad's point in that it's somewhat cumbersome to use Erlang-style message passing in a language that doesn't support native concurrency.<br>

<br>
I faced another "challenge" being that the IO requests in the form of io:format(Fmt, Args) get directed to a group leader in the <a href="http://otp.net" target="_blank">otp.net</a> node as an io_request carrying some {put_chars, io_lib, format, Args} content.  The inconvenience is that <a href="http://otp.net" target="_blank">otp.net</a> node doesn't have any clue of how apply that io:format/2 function to format that output.  Is there a way to force the evaluation to happen on the Erlang side so that it would come to the non-Erlang node as {put_chars, String} of some sort?<br>

<br>
Serge<br>
<br>
Robert Virding wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
That would be a better solution in the long-run, but it is one which,<br>
unfortunately, I can't help you with.<br>
<br>
Robert<br>
<br>
2008/10/4 Serge Aleynikov <<a href="mailto:saleyn@gmail.com" target="_blank">saleyn@gmail.com</a>><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Ah, I see, this makes sense.  Meanwhile, I looked through the distribution<br>
sources, ei, and jinterface and see that it's not that difficult to add some<br>
monitoring support for non-Erlang nodes so that they can monitor Erlang<br>
pids.  I'll patch <a href="http://otp.net" target="_blank">otp.net</a> and later ei if I find time this or next<br>
weekend.<br>
<br>
Serge<br>
<br>
<br>
Robert Virding wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
It's not the io server which tries to setup a monitor, but the io module<br>
itself. These are two separate but cooperating entities. The io module<br>
monitors the io server to make sure that the call will not block if the<br>
process dies. The easiest way around this is to do the send/receive to the<br>
io serv yourself without a monitor.<br>
<br>
Robert<br>
<br>
2008/10/4 Serge Aleynikov <<a href="mailto:saleyn@gmail.com" target="_blank">saleyn@gmail.com</a>><br>
<br>
 One other "nasty" feature is that any attempt to make an RPC call of<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
io:format/2 from a Java/.NET node fails with badarg, because io server<br>
tries to set up a monitor to the remote pid and fails miserably...<br>
<br>
Actually I see what's missing in Java/<a href="http://OTP.NET" target="_blank">OTP.NET</a> implementation.  These<br>
features are documented here:<br>
<a href="http://www.erlang.org/doc/apps/erts/erl_dist_protocol.html#9.7" target="_blank">http://www.erlang.org/doc/apps/erts/erl_dist_protocol.html#9.7</a><br>
<br>
Serge<br>
<br>
<br>
<br>
Paul Guyot wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Date: Sat, 04 Oct 2008 01:32:55 -0400<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
From: Serge Aleynikov <<a href="mailto:saleyn@gmail.com" target="_blank">saleyn@gmail.com</a>><br>
Subject: Re: [erlang-questions] jinterface (was: <a href="http://otp.net" target="_blank">otp.net</a>)<br>
<br>
I tried a similar test using jinterface to see if it's possible to<br>
monitor processes running on a Java node and ran into the same failure.<br>
<br>
Can anyone explain what's wrong?<br>
<br>
(server@dev_serge2)10> {test, client@dev_serge2} ! {self(), hello}.<br>
{<0.45.0>,hello}<br>
(server@dev_serge2)11> f(), {Pid, _} = receive M -> M end.<br>
{<5979.1.0>,hello}<br>
(server@dev_serge2)12> erlang:monitor(process, Pid).<br>
** exception error: bad argument<br>
     in function  erlang:monitor/2<br>
        called as erlang:monitor(process,<5979.1.0>)<br>
<br>
</blockquote>
I've seen a comment in stdlib/gen.erl, at line 196, that suggests that<br>
Java and C nodes are featureweak, and processes in such nodes cannot be<br>
monitored. Instead, you have to monitor the whole node with<br>
monitor_node/2. This makes sense because the OTP ei (C library) or<br>
jinterface do not monitor "processes". Indeed, there is only one pid per<br>
node, which is the node's pseudo-pid (even if technically, each<br>
connection can receive messages). I guess you can draw from the code in<br>
gen.erl if you need to monitor either an erlang process or your java<br>
process, or just monitor the node if you only need to monitor java<br>
processes.<br>
<br>
Regards,<br>
<br>
Paul<br>
<br>
<br>
 _______________________________________________<br>
</blockquote>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
<br>
<br>
</blockquote></blockquote></blockquote>
<br>
</blockquote>
<br>
</blockquote></div><br></div>