Re: [Powertop] [PATCH v2 2/2] Add stubs to support Android platform

Sergey Senozhatsky <sergey.senozhatsky at gmail.com> Wed, 26 Sep 2012 16:00:20 -0700
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
--===============0836655122460217589==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

On (09/27/12 00:09), Magnus Fromreide wrote:
> That they fail to throw exceptions from new is no reason to disable
> set_new_handler, the newhandler is called by the runtime on out of memory
> and is intended to allow the user to try fixing the issue. This is true f=
or
> the noexcept version as well. Is this yet another incompatibility?
>


right. the funny thing is, guess what, gcc actually has "#ifdef __EXCEPTION=
S"
within operator new()

 44 _GLIBCXX_WEAK_DEFINITION void *
 45 operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
 46 {
 47   void *p;
 48 =

 49   /* malloc (0) is unpredictable; avoid it.  */
 50   if (sz =3D=3D 0)
 51     sz =3D 1;
 52   p =3D (void *) malloc (sz);
 53   while (p =3D=3D 0)
 54     {
 55       new_handler handler =3D __new_handler;
 56       if (! handler)
 57 #ifdef __EXCEPTIONS
 58         throw bad_alloc();
 59 #else
 60         std::abort();
 61 #endif
 62       handler ();
 63       p =3D (void *) malloc (sz);
 64     }
 65 =

 66   return p;
 67 }


It tourned out, that __EXCEPTIONS with us (for operator new and STL) since =
2001
"2001-02-15  Benjamin Kosnik  <bkoz(a)redhat.com>"

So, I guess this is how Google has came up with the idea of C++ w/o excepti=
ons.

Wow.

	-ss

 =

> > +/* define stubs for C++ exception handling */
> > +#define try     	if (true)
> > +#define catch(x) 	if (false)
> =

> If you should do this then I think it should be spelled
> =

> #define try if (true)
> #define catch else if (false)
> =

> in order to not break
> =

> if (condition)
>     try {
>     } catch(type variable) {
>     }
> =

> but it still breaks the syntax for it which can be shown by simply adding=
 an
> else clause to the if statement.
> =

> Oh, and furthermore I consider that Android needs a C++ compiler.
> =

> > +
> > +/* Define __NR_perf_event_open if not already defined */
> > +#if __arm__
> > +#ifndef __NR_perf_event_open
> > +#define __NR_perf_event_open    364
> > +#endif
> > +#endif
> > +
> > +/*
> > + * bionic libc mbstowcs version returns zero when max parameter
> > + * is zero, resulting infinite loops in powertop source. Add
> > + * mbstowcs wrapper to fix it.
> > + */
> > +namespace pandroid {
> > +	extern "C" inline size_t mbstowcs(wchar_t *dst,
> > +			const char *src, size_t len)
> > +	{
> > +		return ::mbstowcs(dst, src, ::strlen(src));
> > +	}
> > +}
> > +
> > +#define mbstowcs(dst, src, len)		pandroid::mbstowcs(dst, src, len)
> =

> Still broken.
> If dst isn't a NULL pointer then len is the limit on the length of the
> destination buffer. In throwing away this you open up for stack smashing
> attacks.
>=20

--===============0836655122460217589==--