Hi Ivan, Thanks for the tip. I'll get the polling solution working until Java 7 is supported by Clojure. I really want to see how well I can model different network protocols using Clojure's agents as asynchronous state machines, as this is why I started looking at Clojure in the first place.
I have an partial FTP implementation in C++ using I/O completion ports, but I'm fed up of writing state machines in C++/Java/Python. It's such a hassle and Clojure makes this so natural and easy that they're fun to write! Regards, André On Fri, Apr 15, 2011 at 2:22 PM, Ivan Koblik <ivankob...@gmail.com> wrote: > Hello André, > > Just wanted to mention that Java 7 is feature complete. You can see the > list of approved features here: > http://openjdk.java.net/projects/jdk7/features/ > > It seems that JSR203 was selected for the release, although I remember > reading that Clojure won't support Java 7 for awhile. > > Cheers, > Ivan. > > > On 15 April 2011 02:13, André Caron <andre.l.ca...@gmail.com> wrote: > >> After further analysis, I don't think this is globally a good >> strategy. >> >> I looked into a solution with a "(ref (clojure.lang.PersistentQueue/ >> EMPTY))" in the selector agent. The plan was to have be able to queue >> "updates" to the schedule synchronously. Half-way through the >> implementation, I realized this is equivalent to by-passing the entire >> agent system and still wouldn't work anyways. >> >> Even *if* send/send-off were forced to queue synchronously, the wakeup >> strategy isn't guaranteed to work. There is still the possibility >> that "Selector.wakeup()" will be executed after the "dispatch" action >> has started, but before it calls "Selector.select()". What would be >> necessary is for the agent system to sort-of interrupt calls to >> "dispatch" as soon as something else is sent to the agent. Apart from >> requiring the most insane hack ever, this solution would be nothing >> close to elegant. >> >> Basically, I can't block on "Selector.select()", so I have to poll. >> Can't wait for JSR203 (http://www.jcp.org/en/jsr/detail?id=203) to be >> approved as part of Java 7. Maybe that API will be less of a >> hassle... >> >> By the way, this is all for an open source project. I've got the >> basic parts working, but it's still under heavy architectural >> changes. As soon as version "0.1" is decent, I'll push the repository >> to GitHub and notify you guys. >> >> >> Regards, >> >> André Caron >> >> On Apr 14, 5:58 pm, André Caron <andre.l.ca...@gmail.com> wrote: >> > I've posted this question on StackOverflow[1], but it might be a bit >> > technical, so I'll ask it on the mailing list where I might get more >> > precise expertise on Clojure. >> > >> > [1]: >> http://stackoverflow.com/questions/5669084/clojures-send-is-asynchronous >> > >> > I'm writing a simple networking framework for Clojure using Java's >> > "New I/O" package. It manages a pool of "selector agents", each of >> > which holds a `java.nio.channels.Selector`. >> > >> > I defined a `dispatch` action to for the selector agent. This action >> > blocks on a call to `Selector.select()`. When that returns, the >> > selector agent iterates over the selected keys and performs I/O. When >> > I/O is completed, the selector agent send's itself the dispatch action >> > using `send-off`, effectively looping on calls to `Selector.select()`. >> > >> > When I want to add a new channel or change a channel's interest ops, I >> > send the selector agent the appropriate action and then unblock the >> > selector (it's blocked on `Selector.select()`). This ensures that >> > `(send-off selector-agent dispatch)` in the selector agent is executed >> > after `(send selector-agent add-channel channel)` in whatever agent >> > changed the `SelectionKey.inrestOps()`. >> > >> > I thought this would be bullet-proof since the call to `send-off` is >> > performed before the selector waking up, and thus, before the selector >> > agent send itself the `dispatch` action. However, this yields >> > inconsistent behavior. Sometimes, the `dispatch` action occurs first >> > and sometimes it doesn't. My understanding is that `send` and `send- >> > off` are themselves asynchronous in that they return before the agent >> > action being sent is actually queued in the agent's action backlog. >> > >> > Is this correct? >> > >> > This is normally not an issue; the action dispatch from different >> > agents/threads to the same agent is usually unpredictable and a non- >> > issue. In this case, the real culprit is that I need to block on >> > `Selector.select()`. One obvious workaround is to put a timeout on >> > the sleep operation, so that I don't need to manually unblock the >> > selector. This puts me in the classic polling lose/lose situation, >> > where I need to decide on the polling frequency: too few polls and >> > suffer latency, too many polls and slow down the whole machinery. >> > >> > Does anyone have any better ideas, or can `send`/`send-off` be made to >> > actually queue the actions synchronously such that they are executed >> > int the *exact* order they are sent? >> > >> > Thanks, >> > >> > André Caron >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en