Apparent synchronization issue

38 views
Skip to first unread message

Gyuri Grell

unread,
Oct 2, 2012, 9:06:41 AM10/2/12
to robo...@googlegroups.com
As far as I can tell from the source, this shouldn't be happening with all the synchronization added to EventManager, yet here's the call stack:

E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): main java.util.ConcurrentModificationException
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:350)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:370)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.event.EventManager.fire(EventManager.java:129)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at XXX.XXX.XXX.ui.GetMemberDetailsTask.onSuccess(GetMemberDetailsTask.java:38)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at XXX.XXX.XXX.ui.GetMemberDetailsTask.onSuccess(GetMemberDetailsTask.java:1)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.util.SafeAsyncTask$Task$2.call(SafeAsyncTask.java:210)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.util.SafeAsyncTask$Task$6.run(SafeAsyncTask.java:275)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Handler.handleCallback(Handler.java:615)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Handler.dispatchMessage(Handler.java:92)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Looper.loop(Looper.java:137)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invokeNative(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invoke(Method.java:511)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at dalvik.system.NativeStart.main(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at dalvik.system.VMStack.getThreadStackTrace(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.Thread.getStackTrace(Thread.java:591)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:90)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at XXX.XXX.XXX.ui.PassEntryFragment.onActivityResult(PassEntryFragment.java:72)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:153)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.github.rtyley.android.sherlock.roboguice.activity.RoboSherlockFragmentActivity.onActivityResult(RoboSherlockFragmentActivity.java:106)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.Activity.dispatchActivityResult(Activity.java:5192)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.access$1100(ActivityThread.java:130)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Handler.dispatchMessage(Handler.java:99)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Looper.loop(Looper.java:137)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invokeNative(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invoke(Method.java:511)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at dalvik.system.NativeStart.main(Native Method)

The background:
I have an onActivityResult executing a new RoboAsyncTask. In the Task's onSuccess, in fires an event via the EventManager. This event is captured in a couple places: the activity, and the four fragments that are part of the ViewPager in the activity. Here's the sequence of events:
* The event is fired in the onSuccess, probably reaches the activity first, which then flips to the second page of the ViewPager.
* The second page's Fragment is then created along with its View. Since the Fragment also handles the event which is currently being fired, I assume when the View is created, the event handler is registered with the EventManager.
* The event manager tries to get the next object to notify of the event and Boom; ConcurrentModificationException.

As far as I can tell from looking at the EventManager code, the event firing is in a synchronized block, and the collection of observers is a synchronized Set. I have not gotten around to debugging the issue since I need to get caught up on how to get RG's maven build in Eclipse.

Any thoughts on what might be going on?

Michael Burton

unread,
Oct 3, 2012, 11:29:16 AM10/3/12
to robo...@googlegroups.com
Oh, I think I may see the problem.  I'm synchronizing manually on the set, but the set itself is synchronizing on a mutex object, so we're not locking on the same thing.  Can you file a bug on this, Gyuri?

--
You received this message because you are subscribed to the Google Groups "roboguice" group.
To view this discussion on the web visit https://groups.google.com/d/msg/roboguice/-/N5LfomHfyeQJ.
To post to this group, send email to robo...@googlegroups.com.
To unsubscribe from this group, send email to roboguice+...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/roboguice?hl=en.

Gyuri Grell

unread,
Oct 4, 2012, 7:53:55 AM10/4/12
to robo...@googlegroups.com
Thanks Mike. Filed here. Let me know if you need a test app.

Looking at the source for SynchronizedCollection, it defaults to using "this" (the collection itself) as the mutex/lock, and in EventManager code it also synchronizes on the set, so at a first glance, it seems like it should be working.

- Gyuri
Reply all
Reply to author
Forward
0 new messages