W3C home > Mailing lists > Public > www-lib@w3.org > October to December 1996

Crash in HTDoConnect

From: BAUJARD Olivier 26272 <Olivier.Baujard@dim.hcuge.ch>
Date: Thu, 24 Oct 1996 09:46:16 +0200 (MET DST)
Message-Id: <9610240946.ZM3403@uin-ws06.hcuge.ch>
To: www-lib@w3.org
Hi,

I'm writting a robot using libwww5.0a and I got the following problem.
My compiler is the last Sun C++ compiler (release SC4.0). I'm
interested in putting timeout on my requests. So,
I'm using non preemptive requests and I issue new requests from the
terminate after callback. The robot works fine for the first n requests
but a crash happens in some cases in the HTDoConnect function:

signal PIPE (Broken Pipe) in sigprocmask at 0xef5b7f98
sigprocmask+0x8:	bgeu    sigprocmask+0x30
Current function is HTDoConnect

at the line:

case TCP_NEED_CONNECT:
	    status = connect(net->sockfd, (struct sockaddr *)
&net->sock_addr,sizeof(net->sock_addr));

Any help is welcomed: what's wrong with my code ? Are there
any simpliest means to do non preemptive request or to
put a timeout one requests.

Here are the main functions I'm using. Basically, the successive calls
are:

1- Initialisation
2- First request
3- Loop  ---> 4- NextRequest in Terminate callbacks

Initialisation:
---------------

MHTTPConnection::MHTTPConnection()
{
	HTProfile_newRobot(APP_NAME,APP_VERSION);
	HTAlert_setInteractive(NO);
	HTUserProfile* aProfile=HTLib_userProfile();
	if (aProfile)
	{
		if ((HTUserProfile_setEmail(aProfile,DEFAULT_EMAIL)==NO)
|| (HTLib_setUserProfile(aProfile)==NO))
		{
			if (SHOW_MSG) HTTrace("Can't set Email in user
profile\n");
		}
	}
#ifdef CATCH_SIG
	SetSignal();
#endif
	HTNet_addAfter(ErrorHandler,NULL,NULL,HT_ERROR,HT_FILTER_LAST);
	HTNet_addAfter(TerminateHandler,NULL,NULL,HT_ALL,HT_FILTER_LAST);
}

First request:
--------------

void MHTTPConnection::FirstRequest(const RWCString& anUrl,int aTimeout)
{
	cout << "Accessing " << anUrl << " in max " << aTimeout << "
seconds." << endl;
	theInitialRequest=HTRequest_new();
	HTRequest_setOutputFormat(theInitialRequest,DEFAULT_FORMAT);
	HTRequest_setPreemptive(theInitialRequest,NO);
	HTRequest_setOutputStream(theInitialRequest,HTContentCounter(HTBlackHole(),theInitialRequest,0x2000));
	HTRequest_setContext(theInitialRequest,this);
	char* theCurrentDirectory=HTGetCurrentDirectoryURL();
	char* theAbsoluteUrl=HTParse(anUrl,theCurrentDirectory,PARSE_ALL);
	theAnchor=(HTParentAnchor*)HTAnchor_findAddress(theAbsoluteUrl);
	HT_FREE(theAbsoluteUrl);
	HT_FREE(theCurrentDirectory);
	theTimeout.tv_sec=(aTimeout) ? aTimeout : DEFAULT_TIMEOUT;
	HTEventrg_registerTimeout((struct
timeval*)&theTimeout,theInitialRequest,TimeoutHandler,YES);
	if (theAnchor)
theText=HTLoadAnchorToChunk((HTAnchor*)theAnchor,theInitialRequest);
}


Next request:
-------------

void MHTTPConnection::NextRequest(const RWCString& anUrl)
{
	cout << "Accessing " << anUrl << " in max " << theTimeout.tv_sec
<< " seconds." << endl;
	if (theText) HTChunk_delete(theText);
	theInitialRequest=HTRequest_new();
	HTRequest_setOutputFormat(theInitialRequest,DEFAULT_FORMAT);
	HTRequest_setPreemptive(theInitialRequest,NO);
	HTRequest_setOutputStream(theInitialRequest,HTContentCounter(HTBlackHole(),theInitialRequest,0x2000));
	HTRequest_setContext(theInitialRequest,this);
	char* theCurrentDirectory=HTGetCurrentDirectoryURL();
	char* theAbsoluteUrl=HTParse(anUrl,theCurrentDirectory,PARSE_ALL);
	theAnchor=(HTParentAnchor*)HTAnchor_findAddress(theAbsoluteUrl);
	HT_FREE(theAbsoluteUrl);
	HT_FREE(theCurrentDirectory);
	HTEventrg_registerTimeout((struct
timeval*)&theTimeout,theInitialRequest,TimeoutHandler,YES);
	if (theAnchor)
theText=HTLoadAnchorToChunk((HTAnchor*)theAnchor,theInitialRequest);
}

Terminate and Timeout callbacks (static callbacks call these
methods from the pointer passed in the request context member).
---------------------------------------------------------------

int MHTTPConnection::Terminate(HTRequest* aRequest,HTResponse*
aResponse,void* aParameter,int aStatus)
{
	if (aStatus==HT_LOADED)
	{
		if (theAnchor)
		{
			SetDate(HTAnchor_date(theAnchor));
			SetLastDate(HTAnchor_lastModified(theAnchor));
			SetType(HTAnchor_format(theAnchor));
			SetLength(HTAnchor_length(theAnchor));
			SetInputStream(theText);
			try {
				theStatus=aStatus;
				ProcessDocument(theStatus);
				cout << "Document Indexed." << endl;
			}
			catch (MParseUrlException* anException)
			{
				if (aRequest) HTRequest_delete(aRequest);
				cout << "Exception in
MHTTPConnection::Terminate-->" << anException->GetMessage() << endl;
				delete anException;
			}
		}
	}
	try {
		MAccess::Close();
		MAccess::Open();
		RWCString anUrl;
		if (NextUrl(anUrl)) NextRequest(anUrl);
		else Cleanup(0,aRequest);
	}
	catch (MParseUrlException* anException)
	{
		cout << "Exception in MHTTPConnection::Terminate-->" <<
anException->GetMessage() << endl;
		delete anException;
		Cleanup(0,aRequest);
	}
	if (aRequest) HTRequest_delete(aRequest);
	return HT_OK;
}

int MHTTPConnection::Timeout(HTRequest* aRequest)
{
	try {
		cout << "Request timeout...\n" << endl;
		theStatus=-1;
		ProcessError(theStatus);
	}
	catch (MException* anException)
	{
		cout << "Exception in MHTTPConnection::Timeout-->" <<
anException->GetMessage() << endl;
		delete anException;
	}
	HTRequest_kill(aRequest);
	return HT_OK;
}



-- 
--------------------------------------------------------------------
*  Olivier Baujard  Ph.D.     /    UIN-CIH Geneva Hospital         *
*  Tel : (41 22) 372 62 72                                         *
*  Fax : (41 22) 372 61 98                                         *
*  Email : Olivier.Baujard@dim.hcuge.ch / Olivier.Baujard@imag.fr  *
*  URL: http://expasy.hcuge.ch/sgaico/html/olb/baujard.html        *
*  Interests : DAI, Vision, Classification, Artificial Life        *
--------------------------------------------------------------------
Received on Thursday, 24 October 1996 03:50:59 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 23 April 2007 18:18:27 GMT