You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Steve Huston (JIRA)" <qp...@incubator.apache.org> on 2008/10/31 21:07:44 UTC

[jira] Created: (QPID-1424) Compile error in C++ broker, SessionManager.cpp

Compile error in C++ broker, SessionManager.cpp
-----------------------------------------------

                 Key: QPID-1424
                 URL: https://issues.apache.org/jira/browse/QPID-1424
             Project: Qpid
          Issue Type: Bug
          Components: C++ Broker
    Affects Versions: M4
         Environment: Windows, Visual Studio .NET 2005 (VC8) and 2008 (VC9)
            Reporter: Steve Huston
             Fix For: M4


In this method in cpp/src/qpid/broker/SessionManager.cpp there's a compile error on Windows:

void SessionManager::eraseExpired() {
    // Called with lock held.
    if (!detached.empty()) {
        Detached::iterator keep = std::lower_bound(
            detached.begin(), detached.end(), now(),
            boost::bind(std::less<AbsTime>(), boost::bind(&SessionState::expiry, _1), _2));

It doesn't like the boost::bind(&SessionState::expiry, _1):

C:\Program Files (x86)\boost\boost_1_35_0\boost/bind.hpp(279) : error C2664: 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const' : cannot convert parameter 2 from 'qpid::broker::SessionState' to 'const qpid::sys::AbsTime &'
1>        with
1>        [
1>            _Ty=qpid::sys::AbsTime
1>        ]
1>        Reason: cannot convert from 'qpid::broker::SessionState' to 'const qpid::sys::AbsTime'
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>        C:\Program Files (x86)\boost\boost_1_35_0\boost/bind/bind_template.hpp(76) : see reference to function template instantiation 'R boost::_bi::list2<A1,A2>::operator ()<bool,F,boost::_bi::list2<const qpid::sys::AbsTime &,qpid::broker::SessionState &>>(boost::_bi::type<T>,F &,A &,long)' being compiled
1>        with
1>        [
1>            R=bool,
1>            A1=boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,
1>            A2=boost::arg<2>,
1>            F=std::less<qpid::sys::AbsTime>,
1>            T=bool,
1>            A=boost::_bi::list2<const qpid::sys::AbsTime &,qpid::broker::SessionState &>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xutility(314) : see reference to function template instantiation 'bool boost::_bi::bind_t<R,F,L>::operator ()<_Ty2,_Ty1>(const A1 &,A2 &)' being compiled
1>        with
1>        [
1>            R=boost::_bi::unspecified,
1>            F=std::less<qpid::sys::AbsTime>,
1>            L=boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>,
1>            _Ty2=qpid::sys::AbsTime,
1>            _Ty1=qpid::broker::SessionState,
1>            A1=qpid::sys::AbsTime,
1>            A2=qpid::broker::SessionState
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm(2304) : see reference to function template instantiation 'bool std::_Debug_lt_pred<_Pr,T,_Ty>(_Pr,_Ty1 &,const _Ty2 &,const wchar_t *,unsigned int)' being compiled
1>        with
1>        [
1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>,
1>            T=qpid::broker::SessionState,
1>            _Ty=qpid::sys::AbsTime,
1>            _Ty1=qpid::broker::SessionState,
1>            _Ty2=qpid::sys::AbsTime
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm(2318) : see reference to function template instantiation '_FwdIt std::_Lower_bound<boost::void_ptr_iterator<VoidIter,T>,_Ty,__w64 int,_Pr>(_FwdIt,_FwdIt,const _Ty &,_Pr,_Diff *)' being compiled
1>        with
1>        [
1>            _FwdIt=boost::void_ptr_iterator<std::_Vector_iterator<void *,std::allocator<void *>>,qpid::broker::SessionState>,
1>            VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
1>            T=qpid::broker::SessionState,
1>            _Ty=qpid::sys::AbsTime,
1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>,
1>            _Diff=__w64 int
1>        ]
1>        .\qpid\broker\SessionManager.cpp(91) : see reference to function template instantiation '_FwdIt std::lower_bound<boost::void_ptr_iterator<VoidIter,T>,qpid::sys::AbsTime,boost::_bi::bind_t<R,F,L>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
1>        with
1>        [
1>            _FwdIt=boost::void_ptr_iterator<std::_Vector_iterator<void *,std::allocator<void *>>,qpid::broker::SessionState>,
1>            VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
1>            T=qpid::broker::SessionState,
1>            R=boost::_bi::unspecified,
1>            F=std::less<qpid::sys::AbsTime>,
1>            L=boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>,
1>            _Ty=qpid::sys::AbsTime,
1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>
1>        ]



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (QPID-1424) Compile error in C++ broker, SessionManager.cpp

Posted by "Cliff Jansen (JIRA)" <qp...@incubator.apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-1424?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Cliff Jansen updated QPID-1424:
-------------------------------

    Attachment: SessionManager.cpp.diff

This patch fixes an incorrect use of lower_bound() that relaxes the
requirement for a "strict weak ordering" in the comp() function.  Most
compilers don't enforce this requirement, but the debug version of the
VC++ compiler performs extra checks on comp() that requires the
argument types to match correctly.

The replacement code uses a simple linear search to find the first
non-expired session on the list.  Note that since anything not "kept"
is deleted, the list is traversed in its entirety exactly once.

While broker performance is probably negligibly impacted by this
portion of code, it is worth noting that lower_bound() does the full
binary search even when there are 1 or 0 sessions to trim.  Simple
instrumentation of the broker on Fedora indicates that the linear
search performs fewer time comparisons, and its advantage increases as
the list gets longer (by a factor of 1.2 for small lists <= 3, to a
factor of 5 for lists with around 300 sessions waiting to expire).


> Compile error in C++ broker, SessionManager.cpp
> -----------------------------------------------
>
>                 Key: QPID-1424
>                 URL: https://issues.apache.org/jira/browse/QPID-1424
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Broker
>    Affects Versions: M4
>         Environment: Windows, Visual Studio .NET 2005 (VC8) and 2008 (VC9)
>            Reporter: Steve Huston
>             Fix For: M4
>
>         Attachments: SessionManager.cpp.diff
>
>
> In this method in cpp/src/qpid/broker/SessionManager.cpp there's a compile error on Windows:
> void SessionManager::eraseExpired() {
>     // Called with lock held.
>     if (!detached.empty()) {
>         Detached::iterator keep = std::lower_bound(
>             detached.begin(), detached.end(), now(),
>             boost::bind(std::less<AbsTime>(), boost::bind(&SessionState::expiry, _1), _2));
> It doesn't like the boost::bind(&SessionState::expiry, _1):
> C:\Program Files (x86)\boost\boost_1_35_0\boost/bind.hpp(279) : error C2664: 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const' : cannot convert parameter 2 from 'qpid::broker::SessionState' to 'const qpid::sys::AbsTime &'
> 1>        with
> 1>        [
> 1>            _Ty=qpid::sys::AbsTime
> 1>        ]
> 1>        Reason: cannot convert from 'qpid::broker::SessionState' to 'const qpid::sys::AbsTime'
> 1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
> 1>        C:\Program Files (x86)\boost\boost_1_35_0\boost/bind/bind_template.hpp(76) : see reference to function template instantiation 'R boost::_bi::list2<A1,A2>::operator ()<bool,F,boost::_bi::list2<const qpid::sys::AbsTime &,qpid::broker::SessionState &>>(boost::_bi::type<T>,F &,A &,long)' being compiled
> 1>        with
> 1>        [
> 1>            R=bool,
> 1>            A1=boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,
> 1>            A2=boost::arg<2>,
> 1>            F=std::less<qpid::sys::AbsTime>,
> 1>            T=bool,
> 1>            A=boost::_bi::list2<const qpid::sys::AbsTime &,qpid::broker::SessionState &>
> 1>        ]
> 1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xutility(314) : see reference to function template instantiation 'bool boost::_bi::bind_t<R,F,L>::operator ()<_Ty2,_Ty1>(const A1 &,A2 &)' being compiled
> 1>        with
> 1>        [
> 1>            R=boost::_bi::unspecified,
> 1>            F=std::less<qpid::sys::AbsTime>,
> 1>            L=boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>,
> 1>            _Ty2=qpid::sys::AbsTime,
> 1>            _Ty1=qpid::broker::SessionState,
> 1>            A1=qpid::sys::AbsTime,
> 1>            A2=qpid::broker::SessionState
> 1>        ]
> 1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm(2304) : see reference to function template instantiation 'bool std::_Debug_lt_pred<_Pr,T,_Ty>(_Pr,_Ty1 &,const _Ty2 &,const wchar_t *,unsigned int)' being compiled
> 1>        with
> 1>        [
> 1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>,
> 1>            T=qpid::broker::SessionState,
> 1>            _Ty=qpid::sys::AbsTime,
> 1>            _Ty1=qpid::broker::SessionState,
> 1>            _Ty2=qpid::sys::AbsTime
> 1>        ]
> 1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm(2318) : see reference to function template instantiation '_FwdIt std::_Lower_bound<boost::void_ptr_iterator<VoidIter,T>,_Ty,__w64 int,_Pr>(_FwdIt,_FwdIt,const _Ty &,_Pr,_Diff *)' being compiled
> 1>        with
> 1>        [
> 1>            _FwdIt=boost::void_ptr_iterator<std::_Vector_iterator<void *,std::allocator<void *>>,qpid::broker::SessionState>,
> 1>            VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
> 1>            T=qpid::broker::SessionState,
> 1>            _Ty=qpid::sys::AbsTime,
> 1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>,
> 1>            _Diff=__w64 int
> 1>        ]
> 1>        .\qpid\broker\SessionManager.cpp(91) : see reference to function template instantiation '_FwdIt std::lower_bound<boost::void_ptr_iterator<VoidIter,T>,qpid::sys::AbsTime,boost::_bi::bind_t<R,F,L>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
> 1>        with
> 1>        [
> 1>            _FwdIt=boost::void_ptr_iterator<std::_Vector_iterator<void *,std::allocator<void *>>,qpid::broker::SessionState>,
> 1>            VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
> 1>            T=qpid::broker::SessionState,
> 1>            R=boost::_bi::unspecified,
> 1>            F=std::less<qpid::sys::AbsTime>,
> 1>            L=boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>,
> 1>            _Ty=qpid::sys::AbsTime,
> 1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>
> 1>        ]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (QPID-1424) Compile error in C++ broker, SessionManager.cpp

Posted by "Steve Huston (JIRA)" <qp...@incubator.apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-1424?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Steve Huston resolved QPID-1424.
--------------------------------

    Resolution: Fixed
      Assignee: Steve Huston

Fixed - thanks, Cliff!
Committed in svn revision 719133

> Compile error in C++ broker, SessionManager.cpp
> -----------------------------------------------
>
>                 Key: QPID-1424
>                 URL: https://issues.apache.org/jira/browse/QPID-1424
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Broker
>    Affects Versions: M4
>         Environment: Windows, Visual Studio .NET 2005 (VC8) and 2008 (VC9)
>            Reporter: Steve Huston
>            Assignee: Steve Huston
>             Fix For: M4
>
>         Attachments: SessionManager.cpp.diff
>
>
> In this method in cpp/src/qpid/broker/SessionManager.cpp there's a compile error on Windows:
> void SessionManager::eraseExpired() {
>     // Called with lock held.
>     if (!detached.empty()) {
>         Detached::iterator keep = std::lower_bound(
>             detached.begin(), detached.end(), now(),
>             boost::bind(std::less<AbsTime>(), boost::bind(&SessionState::expiry, _1), _2));
> It doesn't like the boost::bind(&SessionState::expiry, _1):
> C:\Program Files (x86)\boost\boost_1_35_0\boost/bind.hpp(279) : error C2664: 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const' : cannot convert parameter 2 from 'qpid::broker::SessionState' to 'const qpid::sys::AbsTime &'
> 1>        with
> 1>        [
> 1>            _Ty=qpid::sys::AbsTime
> 1>        ]
> 1>        Reason: cannot convert from 'qpid::broker::SessionState' to 'const qpid::sys::AbsTime'
> 1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
> 1>        C:\Program Files (x86)\boost\boost_1_35_0\boost/bind/bind_template.hpp(76) : see reference to function template instantiation 'R boost::_bi::list2<A1,A2>::operator ()<bool,F,boost::_bi::list2<const qpid::sys::AbsTime &,qpid::broker::SessionState &>>(boost::_bi::type<T>,F &,A &,long)' being compiled
> 1>        with
> 1>        [
> 1>            R=bool,
> 1>            A1=boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,
> 1>            A2=boost::arg<2>,
> 1>            F=std::less<qpid::sys::AbsTime>,
> 1>            T=bool,
> 1>            A=boost::_bi::list2<const qpid::sys::AbsTime &,qpid::broker::SessionState &>
> 1>        ]
> 1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xutility(314) : see reference to function template instantiation 'bool boost::_bi::bind_t<R,F,L>::operator ()<_Ty2,_Ty1>(const A1 &,A2 &)' being compiled
> 1>        with
> 1>        [
> 1>            R=boost::_bi::unspecified,
> 1>            F=std::less<qpid::sys::AbsTime>,
> 1>            L=boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>,
> 1>            _Ty2=qpid::sys::AbsTime,
> 1>            _Ty1=qpid::broker::SessionState,
> 1>            A1=qpid::sys::AbsTime,
> 1>            A2=qpid::broker::SessionState
> 1>        ]
> 1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm(2304) : see reference to function template instantiation 'bool std::_Debug_lt_pred<_Pr,T,_Ty>(_Pr,_Ty1 &,const _Ty2 &,const wchar_t *,unsigned int)' being compiled
> 1>        with
> 1>        [
> 1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>,
> 1>            T=qpid::broker::SessionState,
> 1>            _Ty=qpid::sys::AbsTime,
> 1>            _Ty1=qpid::broker::SessionState,
> 1>            _Ty2=qpid::sys::AbsTime
> 1>        ]
> 1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm(2318) : see reference to function template instantiation '_FwdIt std::_Lower_bound<boost::void_ptr_iterator<VoidIter,T>,_Ty,__w64 int,_Pr>(_FwdIt,_FwdIt,const _Ty &,_Pr,_Diff *)' being compiled
> 1>        with
> 1>        [
> 1>            _FwdIt=boost::void_ptr_iterator<std::_Vector_iterator<void *,std::allocator<void *>>,qpid::broker::SessionState>,
> 1>            VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
> 1>            T=qpid::broker::SessionState,
> 1>            _Ty=qpid::sys::AbsTime,
> 1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>,
> 1>            _Diff=__w64 int
> 1>        ]
> 1>        .\qpid\broker\SessionManager.cpp(91) : see reference to function template instantiation '_FwdIt std::lower_bound<boost::void_ptr_iterator<VoidIter,T>,qpid::sys::AbsTime,boost::_bi::bind_t<R,F,L>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
> 1>        with
> 1>        [
> 1>            _FwdIt=boost::void_ptr_iterator<std::_Vector_iterator<void *,std::allocator<void *>>,qpid::broker::SessionState>,
> 1>            VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
> 1>            T=qpid::broker::SessionState,
> 1>            R=boost::_bi::unspecified,
> 1>            F=std::less<qpid::sys::AbsTime>,
> 1>            L=boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>,
> 1>            _Ty=qpid::sys::AbsTime,
> 1>            _Pr=boost::_bi::bind_t<boost::_bi::unspecified,std::less<qpid::sys::AbsTime>,boost::_bi::list2<boost::_bi::bind_t<const qpid::sys::AbsTime &,boost::_mfi::dm<qpid::sys::AbsTime,qpid::broker::SessionState>,boost::_bi::list1<boost::arg<1>>>,boost::arg<2>>>
> 1>        ]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.