[Boost-bugs] [Boost C++ Libraries] #2570: boost::interprocess::message_queue::timed_send and timed_receive bug

Subject: [Boost-bugs] [Boost C++ Libraries] #2570: boost::interprocess::message_queue::timed_send and timed_receive bug
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2008-12-05 19:53:46


#2570: boost::interprocess::message_queue::timed_send and timed_receive bug
---------------------------------------------------+------------------------
 Reporter: Tony Astolfi <aastolfi_at_[hidden]> | Owner: igaztanaga
     Type: Bugs | Status: new
Milestone: Boost 1.38.0 | Component: interprocess
  Version: Boost 1.37.0 | Severity: Showstopper
 Keywords: |
---------------------------------------------------+------------------------
 In boost::interprocess::message_queue, the timed_send and timed_receive
 methods may return true without actually performing the send or receive
 operation.

 The problem lies in boost/interprocess/ipc/message_queue.hpp, in the logic
 that handles blocking behavior for these two methods. Both
 implementations have the same form:

 if (<operation-would-block>) {
   switch(block){
     ...
     case timed :
     do{
       if(!<condition-variable>.timed_wait(lock, abs_time))
         return !<operation-would-block>;
     }
     while (<operation-would-block>);
     break;
     ...
   }
 }

 The problem is that when timed_wait returns false, it might be possible to
 complete the operation without blocking (i.e. there might be something in
 the queue in the case of receive, or the queue might not be full in the
 case of send). Therefore, in rare cases, timed_send/timed_receive return
 true, without having actually done any work.

 My proposed fix is to change the timed case to:

     do{
       if(!<condition-variable>.timed_wait(lock, abs_time)) {
         if(<operation-would-block>) {
           return false;
         }
         break;
       }
     }
     while (<operation-would-block>);

 After I apply this change to my own boost install, the problem disappears.

 I observed this bug on Linux (some Debian 4 flavor, 32-bit)

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/2570>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:49:59 UTC