Oops, missed your first comment - attached are both corrected files.
________________________________________
From: Jonathan Wakely [jwakely.gcc@xxxxxxxxx]
Sent: Friday, May 11, 2012 3:13 PM
To: Mike Dalpee
Cc: Ian Lance Taylor; gcc-help@xxxxxxxxxxx
Subject: Re: GCC 4.6.2 C++ thread cancellation issue
On 11 May 2012 19:41, Mike Dalpee wrote:
> Ok, I have provided the two examples as attachments. I had to transcribe these from printouts, so I apologize if there are any typos that prevent them from immediately compiling.
Both files need
s/pthread tid;/pthread_t tid;/
For the first program I get no abort:
Thread created
In ThreadRun
In Some3rdPartyFunction
Cancelling Thread
Joining cancelled thread
Rethrowing abi::_forced_unwind
Returning from main
Did you mean to put an empty exception specification on the
Some3rdPartyFunction?
For the second I see an abort
Thread created
In ThreadRun
Handling int exception
In Some3rdPartyFunction
Cancelling Thread
Joining cancelled thread
terminate called after throwing an instance of 'int'
Aborted
> I used the following commands to build these:
>
> gcc -g bug1.cpp -o bug1 -lstdc++ -lpthread
> gcc -g bug2.cpp -o bug2 -lstdc++ -lpthread
It won't change the behaviour, but any reason you don't use these
commands instead?
g++ -g bug1.cpp -o bug1 -pthread
g++ -g bug2.cpp -o bug2 -pthread
i.e. compile with the g++ driver so libstdc++ is linked in
automatically, and use -pthread so _REENTRANT is defined, as well as
linking to libpthread.
#include <cxxabi.h>
#include <pthread.h>
#include <time.h>
#include <iostream>
using namespace std;
// abort does not occur if:
// 1) throw() is removed or
// 2) an exception is specified (i.e., throw(some_exception))
void
Some3rdPartyFunction() throw()
{
cout << "In Some3rdPartyFunction" << endl;
struct timespec delay = {5,0};
int ret =
nanosleep(
&delay,
NULL);
cout << "Returning from Some3rdPartyFunction" << endl;
}
extern "C" void*
ThreadRun(
void* argP)
{
cout << "In ThreadRun" << endl;
Some3rdPartyFunction();
cout << "Returning from ThreadRun" << endl;
return NULL;
}
int
main(
int argc,
char* argv[])
{
pthread_t tid;
int ret =
pthread_create(
&tid,
NULL,
ThreadRun,
NULL);
cout << "Thread created" << endl;
struct timespec delay = {1,0};
ret =
nanosleep(
&delay,
NULL);
cout << "Cancelling Thread" << endl;
ret =
pthread_cancel(
tid);
void* returnValue = NULL;
cout << "Joining cancelled thread" << endl;
ret =
pthread_join(
tid,
&returnValue);
cout << "Returning from main" << endl;
return 0;
}
#include <cxxabi.h>
#include <pthread.h>
#include <time.h>
#include <iostream>
using namespace std;
// abort does not occur if the catch/rethrow
// of abi::__forced_unwind is removed
void
Some3rdPartyFunction()
{
cout << "In Some3rdPartyFunction" << endl;
try
{
struct timespec delay = {5,0};
int ret =
nanosleep(
&delay,
NULL);
}
catch (abi::__forced_unwind&)
{
cout << "Rethrowing abi::_forced_unwind" << endl;
throw;
}
cout << "Returning from Some3rdPartyFunction" << endl;
}
extern "C" void*
ThreadRun(
void* argP)
{
cout << "In ThreadRun" << endl;
try
{
throw 1;
}
catch (int&)
{
cout << "Handling int exception" << endl;
Some3rdPartyFunction();
}
cout << "Returning from ThreadRun" << endl;
return NULL;
}
int
main(
int argc,
char* argv[])
{
pthread_t tid;
int ret =
pthread_create(
&tid,
NULL,
ThreadRun,
NULL);
cout << "Thread created" << endl;
struct timespec delay = {1,0};
ret =
nanosleep(
&delay,
NULL);
cout << "Cancelling Thread" << endl;
ret =
pthread_cancel(
tid);
void* returnValue = NULL;
cout << "Joining cancelled thread" << endl;
ret =
pthread_join(
tid,
&returnValue);
cout << "Returning from main" << endl;
return 0;
}