Recently, I find a Small probability thing in thrift-0.8.0.
it ocurred
"apache::thrift::concurrency::Mutex::impl::~impl():
Assertion 'ret == 0' failed."
I just want to start thrift service, and than stop thrift service.
This is my example:
template <class EOFST, class EOFSProcessT>
class ncTEOFSServerThread
{
public:
ncTEOFSServerThread (int port)
: _tid (0)
, _server (0)
, _port (port)
{
}
~ncTEOFSServerThread (void)
{
reinterpret_cast<TThreadPoolServer*>(_server)->stop ();
pthread_join (_tid, NULL); // Error accur
_server = 0;
pthread_cancel (_tid);
}
static String CmdSystem (const String& cmd)
{
String tRet;
FILE *fpRead;
fpRead = ::popen (cmd.getCStr (), _T("r"));
char str [1024] = {0};
while (::fgets (str, 1024 - 1, fpRead) != NULL) {
tRet += String (str);
memset (str, 0, sizeof(str));
}
if (fpRead != NULL)
::pclose (fpRead);
return tRet;
}
static bool HasBindPort (int port)
{
String cmd;
cmd.format (_T("netstat -anp | egrep \"\\\\b(%s)\\\\b\" | egrep
LISTEN"), String::toString (port).getCStr ());
String cmdRet = CmdSystem (cmd);
if (cmdRet.isEmpty ())
return false;
else
return true;
}
class ncEmptyDeleter
{
public:
void operator() (EOFST*)
{
}
};
static void *RunFunc (void* args)
{
try {
ncTEOFSServerThread* pThisThread = static_cast
<ncTEOFSServerThread*> (args);
shared_ptr<TProtocolFactory> protocolFactory (new
TBinaryProtocolFactory ());
shared_ptr<EOFST> handler (EOFST::GetInstance (),
ncEmptyDeleter ());
shared_ptr<TProcessor> processor (new EOFSProcessT
(handler));
shared_ptr<TServerTransport> serverTransport (new
TServerSocket (pThisThread->_port));
shared_ptr<TTransportFactory> transportFactory (new
TBufferedTransportFactory ());
shared_ptr<ThreadManager> threadManager =
ThreadManager::newSimpleThreadManager (15);
shared_ptr<PosixThreadFactory> threadFactory =
shared_ptr<PosixThreadFactory>(new PosixThreadFactory ());
threadManager->threadFactory (threadFactory);
threadManager->start ();
auto_ptr<TThreadPoolServer> server (new
TThreadPoolServer (processor,
serverTransport,
transportFactory,
protocolFactory,
threadManager));
pThisThread->_server = server.get ();
server->serve();
}
catch (ncTEOFSException& e) {
printf ("ncTException Error: %s", e.expMsg.c_str());
}
}
void Start (void)
{
if (pthread_create (&_tid, NULL, RunFunc, this) != 0)
throw ncTEOFSException ("Create thread Error.");
int count = 0;
bool hasBindPort = false;
do {
hasBindPort = HasBindPort (_port);
if (hasBindPort) {
break;
}
Sleep (100);
if (++count == 300) {
break;
}
} while (true);
if (hasBindPort == false) {
throw ncTEOFSException ("Not Bind");
}
}
private:
pthread_t _tid;
void* _server;
int _port;
};
when I do this code:
{
ncTEOFSServerThread<ncTEOFSIfImpl, ncTEOFSProcessor>* thread = new new
ncTEOFSServerThread<ncTEOFSIfImpl, ncTEOFSProcessor> (9061);
delete thread;
}
it sometimes (I use shell script run 500 times, and it will occured 3
times.)occured this error:
apache::thrift::concurrency::Mutex::impl::~impl():
Assertion 'ret == 0' failed.
After debugging, I find it ret equals 16. It is EBUSY.
I find that it happened that SimpleThreadManager destructor function.
How can I resolved it. Think you very much.