Although this isn't yet making any real sense to me I believe I MAY have traced
an elusive problem in code that I ported from clojure 1.1 to 1.2 to the way in
which big integers are handled in 1.2. I've seen (and participated in) some
conversations about handling bignums but I don't recall what particular changes
were slated to happen in the change from 1.1 to 1.2 or to 1.3-in-progress --
can someone point me to a summary?
Regardless of what is supposed to change which each version (and if I recall
correctly some of the changes are things that I won't love...) I think that the
behavior that I've observed may point to a bug because I'm not getting numeric
exceptions or incorrect numeric results but rather hung processes awaiting
agent send results. The computations being performed in the forms that I send
to the agents aren't stuck in infinite computations -- the CPU usage goes to
near zero and eclipse's debugger shows the thread pool threads suspended (but I
don't get any "an agent had errors" messages). They look to me like they're
deadlocked, but I can't understand how they could be, since none of the
computations in the send forms uses any concurrency primitives that might block.
I don't have any direct evidence that it's the numerics at all, and I have not
yet been able to produce a repeatable example that reliably produces the
problem -- this emerges only after a long time in a system that involves a lot
of randomness -- but after exploring many other options I found that if I could
prevent the problem by lowering one of my numeric limits. I think I've ruled
out other obvious candidates for this behavior, and lowering the limits does
seem to fix the problem, so I'm beginning to think that it really might be the
numerics.
Does anyone have an idea of anything in the 1.2 numerics that might be
responsible for this? If so, then I hope I'm correct in assuming that that
should be fixed. Producing an exception or an incorrect result are both bad
enough -- I'd personally have automatic promotion to prevent such things even
at a small cost for all math -- but mysteriously hung processes are certainly
worse.
Here are the stacks as shown in the eclipse debugger when I'm in the hung
state. Each of my thread pool threads looks like this:
Thread [pool-1-thread-2] (Suspended)
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: 158
AbstractQueuedSynchronizer$ConditionObject.await() line: 1925 [local
variables unavailable]
LinkedBlockingQueue<E>.take() line: 399 [local variables unavailable]
ThreadPoolExecutor.getTask() line: 947 [local variables unavailable]
ThreadPoolExecutor$Worker.run() line: 907 [local variables unavailable]
Thread.run() line: 637 [local variables unavailable]
And my main thread -- the one that is stuck at "await" -- looks like this:
Thread [main] (Suspended)
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: 158
CountDownLatch$Sync(AbstractQueuedSynchronizer).parkAndCheckInterrupt()
line: 747
CountDownLatch$Sync(AbstractQueuedSynchronizer).doAcquireSharedInterruptibly(int)
line: 905
CountDownLatch$Sync(AbstractQueuedSynchronizer).acquireSharedInterruptibly(int)
line: 1217
CountDownLatch.await() line: 207 [local variables unavailable]
core.clj line: 2485
core$await(RestFn).applyTo(ISeq) line: 138
core.clj line: 540
clojush.clj line: 1549
clojush$pushgp(RestFn).invoke(Object, Object, Object, Object, Object,
Object, Object, Object, Object, Object, Object, Object, Object, Object, Object,
Object, Object, Object, Object, Object) line: 1178
regression.clj line: 281
Compiler.eval(Object, boolean) line: 5424
Compiler.load(Reader, String, String) line: 5857
RT.loadResourceScript(Class, String, boolean) line: 340
RT.loadResourceScript(String, boolean) line: 327
RT.loadResourceScript(String) line: 319
main.clj line: 220
repl_ln.clj line: 107
repl_ln.clj line: 117
repl_ln.clj line: 144
main.clj line: 193
main.clj line: 192
main$repl(RestFn).invoke(Object, Object, Object, Object, Object,
Object, Object, Object, Object, Object, Object, Object, Object, Object, Object,
Object) line: 906
repl_ln.clj line: 263
repl_ln$repl(RestFn).invoke(Object, Object) line: 422
repl_ln.clj line: 140
repl_ln$_main(RestFn).applyTo(ISeq) line: 138
repl_ln.main(String[]) line: not available
Any help would be appreciated!
Thanks, -Lee
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en