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