Yeah, this should be ok to backport. On Thu, Feb 16, 2012 at 11:11 AM, Mark Miesfeld <[email protected]> wrote: > Hi Rick, > > For bug: > > 3137873 rxapi looping > > You applied r6571 to trunk, which you were 99% sure fixed the problem. > Rainer built a 64-bit test build for Henning and eventually Henning > said it fixed the problem for him on his 64 bit systems. > > Do you think it is okay for me to back port that commit to the 4.1 bug > fixes branch? > > The commit diff looks like this: > > Modified Paths: > -------------- > main/trunk/rexxapi/server/QueueManager.cpp > main/trunk/rexxapi/server/QueueManager.hpp > > Modified: main/trunk/rexxapi/server/QueueManager.cpp > =================================================================== > --- main/trunk/rexxapi/server/QueueManager.cpp 2011-01-10 06:07:59 > UTC (rev 6570) > +++ main/trunk/rexxapi/server/QueueManager.cpp 2011-01-11 14:10:18 > UTC (rev 6571) > @@ -306,8 +306,22 @@ > } > > /** > - * locate a named data queue > + * locate a named data queue, with session manager locking > * > + * @param name The target data queue name. > + * > + * @return The DataQueue descriptor, or NULL if it does not > + * exist. > + */ > +DataQueue *QueueTable::synchronizedLocate(ServerQueueManager > *manager, const char *name) > +{ > + Lock managerLock(manager->lock); // this needs synchronization here > + return locate(name); > +} > + > +/** > + * locate a session data queue > + * > * @param id The session ID of the queue. > * > * @return The DataQueue for the session, which will be created > @@ -333,7 +347,21 @@ > return NULL; // return NULL if not located > } > > +/** > + * locate a session data queue, with session manager locking > + * > + * @param id The session ID of the queue. > + * > + * @return The DataQueue for the session, which will be created > + * if needed. > + */ > +DataQueue *QueueTable::synchronizedLocate(ServerQueueManager > *manager, SessionID id) > +{ > + Lock managerLock(manager->lock); // this needs synchronization here > + return locate(id); > +} > > + > /** > * locate and remove a named data queue > * > @@ -484,7 +512,11 @@ > // nameArg -- ASCII-Z name of the queue > void ServerQueueManager::pullFromNamedQueue(ServiceMessage &message) > { > - DataQueue *queue = namedQueues.locate(message.nameArg); > + // we're holding the lock yet, so we need to use the locate > + // method that grabs the lock first. If we don't, then we run > + // the risk that the queue will be reordered while we're searching. > + // The results will be bad, definitely very bad. > + DataQueue *queue = namedQueues.synchronizedLocate(this, message.nameArg); > // not previously created? > if (queue == NULL) > { > @@ -503,6 +535,10 @@ > // parameter1 -- caller's session id (replaced by queue handle on return); > DataQueue *ServerQueueManager::getSessionQueue(SessionID session) > { > + // this could be redundant, but if called as a result of a PULL > operation, > + // we're not holding the lock yet. We need to nest the call. > + Lock managerLock(lock); > + > DataQueue *queue = sessionQueues.locate(session); > // not previously created? > if (queue == NULL) > > Modified: main/trunk/rexxapi/server/QueueManager.hpp > =================================================================== > --- main/trunk/rexxapi/server/QueueManager.hpp 2011-01-10 06:07:59 > UTC (rev 6570) > +++ main/trunk/rexxapi/server/QueueManager.hpp 2011-01-11 14:10:18 > UTC (rev 6571) > @@ -199,7 +199,11 @@ > // locate a named data queue > DataQueue *locate(const char *name); > // locate a named data queue > + DataQueue *synchronizedLocate(ServerQueueManager *manager, const > char *name); > + // locate a session data queue > DataQueue *locate(SessionID id); > + // locate a session data queue > + DataQueue *synchronizedLocate(ServerQueueManager *manager, SessionID id); > // locate and remove a named data queue > DataQueue *remove(const char *name); > // locate a named data queue > @@ -246,6 +250,7 @@ > class ServerQueueManager > { > friend class DataQueue; // needs access to the instance lock > + friend class QueueTable; // needs access to the instance lock > public: > ServerQueueManager() : namedQueues(), sessionQueues(), lock() { > lock.create(); } > > -- > Mark Miesfeld > > ------------------------------------------------------------------------------ > Virtualization & Cloud Management Using Capacity Planning > Cloud computing makes use of virtualization - but cloud computing > also focuses on allowing computing to be delivered as a service. > http://www.accelacomm.com/jaw/sfnl/114/51521223/ > _______________________________________________ > Oorexx-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/oorexx-devel
------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ Oorexx-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/oorexx-devel
