[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Problems with OpenOffice.org and gcc-3.1 on PowerPC and perhaps on intel, too! [was: kevin.hendricks@sympatico.ca: [dev] question on cppuhelper throwException and double TYPELIB_DANGER_RELEASE]



Hi .. 

I mailed with Kevin B. Hendricks this weekend and we tried to find out,
why the OpenOffice.org binaries did not work under a normal
Debian-System.

Kevin build his OpenOffice.org with gcc-3.1 and glibc2.2.5 and
binutils2.12.90.0.7, but we got a SIGKILL after the splash screen comes.

Beside Jack Howorth he found out, that this code on the bottom is
breaking the functionality of OpenOffice.org on Debian for PowerPC and
SuSE ... 

We are working on it, but we are not really sure, where the bug comes
from. If Kevin builds the libcppuhelper3.so lib (which location is in
/usr/lib/openoffice/program) with -O0, then OpenOffice.org starts and
works (up to choosing a connection for the external adressdatabase, then
you got a SIGKILL)

It seems also, that the libc6 is broken on PowerPC. I send Ben Collins a
patch and I think he will apply this to the next glibc-package. You can
have a look to "my" libc6 here:
  http://bourbaki.math.uni-kiel.de/~jpalic/debian/pool/main/l/libc6/
 
I have to check out, what are the differences be between Kevins
toolchain and ours.

Haggai, you tried to build OOo with gcc-3.1 on Intel and got a similar
SIGKILL as we on PowerPC. I wonder, if the build of libcppuhelper3.so
with -O0 instead of -O2 will work for you, too.

Below the mail from Kevin B. Hendrick about the PowerPC issue .... 


	regards
		Jan

----- Forwarded message from "Kevin B. Hendricks" <kevin.hendricks@sympatico.ca> -----

Reply-To: dev@openoffice.org
From: "Kevin B. Hendricks" <kevin.hendricks@sympatico.ca>
To: dev@udk.openoffice.org, dev@openoffice.org
Date: Fri, 5 Jul 2002 23:50:55 -0400
X-Mailer: KMail [version 1.4]
Subject: [dev] question on cppuhelper throwException and double TYPELIB_DANGER_RELEASE

Hi,

In cppuhelper/source/exc_thrower.cxx is the routine cppu::throwException().  I have a backtrace 
showing we are actually invoking TYPELIB_DANGER_RELEASE(pComp) twice.  
That macro does *not* check if pComp exists before invoking its release method.  
This is results in a jump into the weeds that is generating a SIGILL on Debian ppc Linux machines.

So I have some questions.

1. can xThrower->throwException(rExc) actually return?

TYPELIB_DANGER_RELEASE( pComp );
xThrower->throwException( rExc );
                                
2. if so, then why are we not checking if pComp still exists (or if it has
already been released) before we call  

TYPELIB_DANGER_RELEASE( pComp );

the second time.

3. If not, could this be a race in that xThrower->throwException may actually return 
briefly until the excetion that is thrown is actually caught.  If it should not ever 
return perhaps we should put an infinite loop there to prevent a race.

Here is the full routine.

void SAL_CALL throwException( const Any & rExc ) SAL_THROW( (Exception) )
{
        if (rExc.getValueTypeClass() == TypeClass_EXCEPTION)
        {
                OUString aExceptionName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.Exception") );
                typelib_TypeDescription * pComp = 0;
                TYPELIB_DANGER_GET( &pComp, rExc.getValueTypeRef() );
                // must be derived from com.sun.star.uno.Exception
                for ( typelib_CompoundTypeDescription * pTD = (typelib_CompoundTypeDescription *)pComp;
                          pTD; pTD = pTD->pBaseTypeDescription )
                {
                        if (aExceptionName == rtl::OUString(((typelib_TypeDescription *)pTD)->pTypeName))
                        {
                                Mapping aUno2Cpp( OUString( RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO) ),
                                                                  OUString( RTL_CONSTASCII_USTRINGPARAM(CPPU_CURRENT_LANGUAGE_BINDING_NAME) ) );
                                OSL_ENSURE( aUno2Cpp.is(), "### cannot get uno to cpp mapping!" );
                                if (aUno2Cpp.is())
                                {
                                        uno_Interface * pUnoI = new ExceptionThrower();
                                        (*pUnoI->acquire)( pUnoI );
                                        Reference< XThrower > xThrower;
                                        aUno2Cpp.mapInterface(
                                                reinterpret_cast< void ** >( &xThrower ),
                                                pUnoI, ::cppu::getCppuType( (const Reference< XThrower > *)0 ) );
                                        (*pUnoI->release)( pUnoI );

                                        if (xThrower.is())
                                        {
                                                TYPELIB_DANGER_RELEASE( pComp );
                                                xThrower->throwException( rExc );
                                        }
                                }
                                break;
                        }
                }
                TYPELIB_DANGER_RELEASE( pComp );
        }
        throw RuntimeException(
                OUString( RTL_CONSTASCII_USTRINGPARAM("failed throwing exception generically!") ),
                Reference< XInterface >() );
}


Any guidance would be greatly appreciated.

Thanks,

Kevin


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@openoffice.org
For additional commands, e-mail: dev-help@openoffice.org


----- End forwarded message -----

-- 
  .''`.    Jan-Hendrik Palic     |
 : :' : ** Debian GNU/ Linux **  |   ** OpenOffice.org **       ,.. ,..
 `. `'   http://www.debian.org   | http://www.openoffice.org  ,: ..`   `
   `-  jan.palic@linux-debian.de |                           '  `  `

Attachment: pgpjzl_A2fvSR.pgp
Description: PGP signature


Reply to: