I've redesigned the thread synchronization in the session. The session state is now fully synchronized using the session intrinsic lock. I've added tests to ensure that no locks are held during quickfix.Application callbacks. I also do not hold a lock when invoking MINA for output operations. This should eliminate many potential sources of deadlock between MINA, the quickfix.Session, and application threads.
I've also made the dictionary in the session final. This creates a minor functional incompatibility with QF C++. If someone has a use case for modifying the Session's data dictionary after the session is created then I'm open to suggestions.
|