Subject: Re: select call implementation and threads
To: Andrey Petrov <petrov@netbsd.org>
From: malleswararao venkatanaga <bobbyavn@yahoo.com>
List: tech-userlevel
Date: 05/25/2003 01:24:40
--- Andrey Petrov <petrov@netbsd.org> wrote:
> On Sat, May 24, 2003 at 04:26:11AM -0700,
> malleswararao venkatanaga wrote:
> > Here is the code i tested with.
> > /* Recv.c This is the code that receives messages
> */
> > #include <stdio.h>
> > #include<fcntl.h>
> > #include<errno.h>
> > #include<sys/types.h>
> > #include<sys/select.h>
> > #include<sys/socket.h>
> > #include<netinet/in.h>
> > #include <pthread.h>
> >
> > void * stub_test (void *p );
> > pthread_t threads[3];
> > int main()
> > {
> > int rc;
> > stub_test2();
> > rc = pthread_create(&threads[0], NULL ,
> stub_test
> > ,(void *) &threads[0]);
>
> Well, well, well. Try to reverse 2 previous lines.
>
Hi Andrey,
I've reversed the above 2 lines. But i still get
non-deterministic results, one of the threads gets
blocked and never comes out of the select call though
it has messages to read.
Probably there is something to do with the scheduling
of the threads as the thread which is receiving and
processing the messages is never yielding the other
thread is never getting a chance to run through its
steps and break out of the select call.
Surprisingly the thread which gets blocked in the
select call should have actually tried to yield to
the others which is not happening.
thanks
>
> > if(rc)
> > {
> > printf("Error in creating thread\n");
> > exit(0);
> > }
> >
> > rc = pthread_join( &threads[0], NULL);
> > if(rc)
> > {
> > printf("Error in creating thread\n");
> > exit(0);
> > }
> > }
> >
> >
> > void * stub_test (void *p )
> > {
> > struct sockaddr_in saddr;
> > int sock_fd, i, nread, ndfs, ret_val;
> > fd_set read_set;
> > char buff[1000];
> > struct timeval timeval;
> >
> > saddr.sin_family = AF_INET;
> > saddr.sin_port = 45000;
> > saddr.sin_addr.s_addr = htonl ( INADDR_ANY);
> > if( (sock_fd = socket( AF_INET , SOCK_DGRAM , 0 )
> ) <
> > 0 )
> > return -1;
> >
> > if ( bind ( sock_fd , (struct sockaddr * )
> &saddr,
> > sizeof(saddr ) ) < 0)
> > return -1;
> >
> > ndfs = sock_fd + 1;
> > while(1)
> > {
> > FD_ZERO ( &read_set);
> > FD_SET (sock_fd , &read_set);
> > ret_val = select(ndfs, &read_set, NULL, NULL,
> > NULL);
> > if(ret_val >0)
> > {
> > if(FD_ISSET(sock_fd, &read_set))
> > {
> >
> > nread = recvfrom ( sock_fd , buff , 10,
> 0
> > ,NULL, NULL);
> > printf("Read bytes thr 2 %d\n", nread);
> > for(i = 0; i <5; i++)
> > {
> > printf("Buff contents = %c\n",
> buff[i]);
> > }
> > }
> > }
> > else
> > {
> > printf("\n failed in select");
> > }
> > }
> > return 0;
> > }
> > void stub_test2()
> > {
> > struct sockaddr_in saddr2;
> > fd_set read_set;
> > int sock_fd, ret_val, ndfs;
> >
> > struct timeval timeval;
> >
> > timeval.tv_sec = 10;
> > timeval.tv_usec = 0;
> >
> > saddr2.sin_family = AF_INET;
> > saddr2.sin_port = 45001;
> > saddr2.sin_addr.s_addr = htonl ( INADDR_ANY);
> >
> > if( (sock_fd = socket( AF_INET , SOCK_DGRAM , 0
> ) )
> > < 0 )
> > return -1;
> >
> > if ( bind ( sock_fd , (struct sockaddr * )
> &saddr2,
> > sizeof(saddr2 ) ) < 0)
> > return -1;
> >
> > ndfs = sock_fd + 1;
> > while(1)
> > {
> > FD_ZERO ( &read_set);
> > FD_SET (sock_fd , &read_set);
> > ret_val = select(ndfs, &read_set, NULL,
> NULL,NULL
> > );
> > if(ret_val >0)
> > {
> > if(FD_ISSET(sock_fd, &read_set))
> > {
> > int nread;
> > char buf[1000];
> > printf("\n Recvd some message main
> thread
> > \n");
> > nread = read(sock_fd, buf,
> sizeof(buf));
> > if(nread>0)
> > {
> > printf("\n read %i bytes", nread);
> > }
> > }
> > }
> > else
> > {
> > printf("\n failed in select 1");
> > }
> > }
> >
> > }
> >
> >
> > /* The code that sends messages on both the ports
> */
> >
> > #include <stdio.h>
> > #include <sys/errno.h>
> > #include <sys/types.h>
> > #include<sys/socket.h>
> > #include<sys/select.h>
> > #include<netinet/in.h>
> >
> >
> >
> > main()
> > {
> > int sockfd,
> > nwritten , i=1;
> > const char on = 1;
> > struct sockaddr_in saddr;
> > unsigned char *pbuf;
> >
> > pbuf = (unsigned char*)malloc(5);
> > strcpy(pbuf, "hello");
> >
> > saddr.sin_family = AF_INET;
> > saddr.sin_addr.s_addr = INADDR_ANY;
> >
> > if ( ( sockfd = socket ( AF_INET,
> SOCK_DGRAM,
> > 0 ) ) < 0 )
> > {
> > return -1;
> > }
> > for ( ; ; )
> > {
> > if(i==0)
> > {
> > saddr.sin_port = 45000;
> > i = 1;
> > }
> > else
> > {
> > {
> > saddr.sin_port = 45001;
> > i=0;
> > }
> > nwritten = sendto ( sockfd, pbuf,
> 5,
> > 0,(struct sockaddr *)&saddr,
> >
>
=== message truncated ===
__________________________________
Do you Yahoo!?
The New Yahoo! Search - Faster. Easier. Bingo.
http://search.yahoo.com