- From: Krishna Vedati <kvedati@Rational.Com>
- Date: Thu, 20 Nov 1997 10:17:13 -0500
- To: www-lib@w3.org
- CC: vedati@builder
I am including a sample threaded program using pthreads on UNIX. The program
basically uses a separate thread to download a request.. When I've a single
request (thread) then the program works great but if I've a simultaneous
requests (more than one thread fired at the same time) then the threads don't
connect. I don't have too many thread calls in this program for simplicity!
This program compiles on solaris 2.5.1 if you have pthreads. Can somebody
explain me what I am doing worong here! Do I need to muck with the HTEvent loop
to make my multiple thread model to work ? I am also including instrcutions to
compile this file to run. All you w3 GURUs please shed some light on this code!
========================= ptest.c =================================
#include "WWWLib.h"
#include "HTTP.h"
#include "HTChunk.h"
#include "HTReq.h"
#include "HTFile.h"
#include <pthread.h>
static void AlertInit(); /* sample Alert functions */
static HTAlertCallback AlertProgressCb;
static HTAlertCallback AlertMessageCb;
static HTAlertCallback AlertConfirmCb;
static HTAlertCallback AlertPromptCb;
static HTAlertCallback AlertSecretCb;
static HTAlertCallback AlertUserPwCb;
static BOOL libInitialized = FALSE;
static int FireThread();
static void *StartRequest();
int
main( argc, argv)
int argc;
char *argv[];
{
FireThread(); /* fires a thread to down load a request */
/* If I uncomment the following line thr program does not work */
/* FireThread(); */
while(1) {
fprintf(stderr, "Main: sleeping ...\n");
sleep(20);
fprintf(stderr, "Main: Waking up...\n");
}
fprintf(stdout,"Testing libvuw.a\n");
}
static int
FireThread()
{
pthread_t thr;
pthread_attr_t attr;
/* default main thread */
if(!libInitialized) {
HTLibInit("vuwplayback", "1.0");
HTTransportInit();
HTNetInit();
HTProtocolPreemptiveInit();
HTAAInit();
AlertInit(); WWWTRACE = ((SHOW_ALL_TRACE)&(~SHOW_MEM_TRACE));
}
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(pthread_create(&thr, (pthread_attr_t *)&attr, StartRequest, (void *)NULL))
fprintf(stderr, "failed to create a thread\n");
pthread_attr_destroy(&attr);
}
void *
StartRequest (clientData)
void *clientData;
{
HTRequest *reqPtr = HTRequest_new();
HTList *converters = HTList_new();
HTList *transfer_encodings = HTList_new();
HTList *content_encodings = HTList_new();
fprintf(stderr, "Starting thread with id (%d)\n",pthread_self());
if (!converters) converters = HTList_new();
if (!transfer_encodings) transfer_encodings = HTList_new();
if (!content_encodings) content_encodings = HTList_new();
HTRequest_setOutputFormat(reqPtr, WWW_SOURCE);
HTRequest_setOutputStream(reqPtr, HTFWriter_new(reqPtr, stderr, YES));
HTRequest_setTransfer(reqPtr, transfer_encodings, YES);
HTRequest_setConversion(reqPtr,converters,YES);
HTRequest_setEncoding(reqPtr, content_encodings, YES);
HTRequest_setFlush(reqPtr, YES);
HTLoadAbsolute("http://www.rational.com/",reqPtr);
/* hard coded the address for simplicity */
HTList_delete(converters);
HTList_delete(transfer_encodings);
HTList_delete(content_encodings);
HTRequest_delete(reqPtr);
fprintf(stderr, "Thread (%d) done..\n",pthread_self());
return (void *)NULL;
}
/* sample Alert routines for debugging purposes */
void
AlertInit()
{
HTAlert_add(AlertProgressCb, HT_A_PROGRESS);
HTAlert_add(AlertMessageCb, HT_A_MESSAGE);
HTAlert_add(AlertConfirmCb, HT_A_CONFIRM);
HTAlert_add(AlertPromptCb, HT_A_PROMPT);
HTAlert_add(AlertSecretCb, HT_A_SECRET);
HTAlert_add(AlertUserPwCb, HT_A_USER_PW);
}
static BOOL
AlertProgressCb(reqPtr, opcode, msgNum, dfault, input, reply)
HTRequest *reqPtr;
HTAlertOpcode opcode;
int msgNum;
const char *dfault;
void *input;
HTAlertPar *reply;
{
switch (opcode) {
case HT_PROG_DNS:
fprintf(stderr, "XX>Looking up %s\n", input ? (char *) input : "");
break;
case HT_PROG_CONNECT:
fprintf(stderr, "XX>Contacting %s\n", input ? (char *) input : "");
break;
case HT_PROG_ACCEPT:
fprintf(stderr, "XX>Waiting for connection...\n");
break;
case HT_PROG_READ:
fprintf(stderr, "XX>Reading...\n");
break;
case HT_PROG_WRITE:
fprintf(stderr, "XX>Writing...\n");
break;
case HT_PROG_DONE:
fprintf(stderr, "XX>Connection closed\n");
break;
case HT_PROG_WAIT:
fprintf(stderr, "XX>Waiting for free socket...\n");
break;
case HT_PROG_GC:
fprintf(stderr, "XX>Garbage colleting persistent cache - please wait...\n");
break;
default:
fprintf(stderr, "XX>UNKNOWN PROGRESS STATE\n");
break;
}
return TRUE;
}
static BOOL
AlertMessageCb(reqPtr, opcode, msgNum, dfault, input, reply)
HTRequest *reqPtr;
HTAlertOpcode opcode;
int msgNum;
const char *dfault;
void *input;
HTAlertPar *reply;
{
fprintf(stderr, "XX>AlertMessageCb called with opcode %d\n",opcode);
return TRUE;
}
static BOOL
AlertConfirmCb(reqPtr, opcode, msgNum, dfault, input, reply)
HTRequest *reqPtr;
HTAlertOpcode opcode;
int msgNum;
const char *dfault;
void *input;
HTAlertPar *reply;
{
fprintf(stderr, "XX>AlertConfirmCb called with opcode %d\n",opcode);
return YES;
}
static BOOL
AlertPromptCb(reqPtr, opcode, msgNum, dfault, input, reply)
HTRequest *reqPtr;
HTAlertOpcode opcode;
int msgNum;
const char *dfault;
void *input;
HTAlertPar *reply;
{
fprintf(stderr, "XX>AlertPromptCb called with opcode %d\n",opcode);
return TRUE;
}
static BOOL
AlertSecretCb(reqPtr, opcode, msgNum, dfault, input, reply)
HTRequest *reqPtr;
HTAlertOpcode opcode;
int msgNum;
const char *dfault;
void *input;
HTAlertPar *reply;
{
fprintf(stderr, "XX>AlertSecretCb called with opcode %d\n",opcode);
return TRUE;
}
static BOOL
AlertUserPwCb(reqPtr, opcode, msgNum, dfault, input, reply)
HTRequest *reqPtr;
HTAlertOpcode opcode;
int msgNum;
const char *dfault;
void *input;
HTAlertPar *reply;
{
fprintf(stderr, "XX>AlertUserPwCb called with opcode %d\n",opcode);
return TRUE;
}
================================ end ptest.c =============================
Here is how I compiled ptest.c
gcc -DHAVE_CONFIG_H -I. -Iw3lib/ -g -c ptest.c
gcc -Wall -g -Wpointer-arith -Wcast-qual -Wcast-align -Wconversion -Wwrite-strings -Waggregate-return -o ptest ptest.o -Lw3lib/ -L. -lpthread -lwww -ldl -lnsl -lsocket
w3lib is where I keep all w3-lib sources and libwww.
After compilation just do
> ./ptest
at your unix prompt.
Received on Thursday, 20 November 1997 10:20:22 UTC