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

Reply via email to