[PATCH] Re: [kaffe] darwin6 problems

Guilhem Lavaux guilhem at kaffe.org
Thu Sep 16 23:59:08 PDT 2004


Noa Resare wrote:
> On tor, 2004-09-16 at 19:35 +0200, Guilhem Lavaux wrote:
> 
>>I fear "poll" is not implemented on darwin6. This was the patch about 
>>jthreadedRecvFrom. We must implement a backup code.
>>
> 
> 
> Here's a patch that uses select() instead of poll() in
> jthreadedRecvFrom. WorksForMe^TM, but on the other hand I don't have
> access to any darwin6 systems.
> 
> cheers/noa

Great !

I'm merging it and maybe add a condition if poll is available...

Cheers,

Guilhem.

> 
> 
> 
> ------------------------------------------------------------------------
> 
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/kaffe/kaffe/ChangeLog,v
> retrieving revision 1.2732
> diff -u -r1.2732 ChangeLog
> --- ChangeLog	16 Sep 2004 23:19:23 -0000	1.2732
> +++ ChangeLog	17 Sep 2004 06:09:02 -0000
> @@ -1,3 +1,8 @@
> +2004-09-17  Noa Resare  <noa at resare.com>
> +
> +	* kaffe/kaffevm/systems/unix-pthreads/syscalls.c:
> +	(jthreadedRecvfrom) use select() instead of poll()
> +
>  2004-09-16  Noa Resare  <noa at resare.com>
>  
>  	* kaffe/kaffevm/kaffe-gc/gc-mem.c (gc_block_alloc):
> Index: kaffe/kaffevm/systems/unix-pthreads/syscalls.c
> ===================================================================
> RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c,v
> retrieving revision 1.20
> diff -u -r1.20 syscalls.c
> --- kaffe/kaffevm/systems/unix-pthreads/syscalls.c	10 Sep 2004 00:34:24 -0000	1.20
> +++ kaffe/kaffevm/systems/unix-pthreads/syscalls.c	17 Sep 2004 06:09:05 -0000
> @@ -19,9 +19,21 @@
>  #include "jsyscall.h"
>  #include "jsignal.h"
>  #include "nets.h"
> -#if defined(HAVE_SYS_POLL_H)
> -#include <sys/poll.h>
> +
> +#if defined(HAVE_SYS_SELECT_H)
> +#include <sys/select.h>
> +#else /* HAVE_SYS_SELECT_H */
> +#if defined(HAVE_SYS_TIME_H)
> +#include <sys/time.h>
> +#endif
> +#if defined(HAVE_SYS_TYPES_H)
> +#include <sys/types.h>
>  #endif
> +#if defined(HAVE_UNISTD_H)
> +#include <unistd.h>
> +#endif
> +#endif /* HAVE_SYS_SELECT_H */
> +
>  #if defined(HAVE_SYS_WAIT_H)
>  #include <sys/wait.h>
>  #endif
> @@ -609,6 +621,31 @@
>  }
>  
>  /*
> + * Blocks until there is data available to read or the timeout expires. 
> + * Signals causes the function to return, so you can't be certain that
> + * there is data to read, or that a timeout occured upon return.
> + *
> + * @param fd the file descriptor to check for available data
> + * @param timeout the number of milliseconds to wait before a timeout
> + */
> +static void
> +read_timeout(int fd, int timeout)
> +{
> +	fd_set set;
> +	struct timeval tv;
> +
> +	assert(timeout > 0);
> +
> +	FD_ZERO(&set);
> +	FD_SET (fd, &set);
> +	
> +	tv.tv_sec = timeout / 1000;
> +	tv.tv_usec = timeout % 1000;
> +
> +	select(fd, &set, NULL, NULL, &tv);
> +}
> +
> +/*
>   * Threaded recvfrom 
>   */
>  static int 
> @@ -617,13 +654,10 @@
>  {
>  	int r;
>  	jlong deadline = 0;
> -	int fd_flags;
>  	int poll_timeout;
>  
> -	struct pollfd sp = {fd, POLLIN|POLLPRI, 0};
>   
> -	fd_flags = fcntl(fd, F_GETFL);
> -	fcntl(fd, F_SETFL, fd_flags|O_NONBLOCK);
> +	jthread_set_blocking(fd, 0);
>  	SET_DEADLINE(deadline, timeout)
>  	for (;;) {
>  		r = recvfrom(fd, buf, len, flags, from, fromlen);
> @@ -634,11 +668,11 @@
>  		IGNORE_EINTR(r)
>  		poll_timeout = deadline - currentTime();
>  		if (poll_timeout > 0) {
> -			poll(&sp, 1, poll_timeout);
> +			read_timeout(fd, poll_timeout);
>  		}
>  		BREAK_IF_LATE(deadline, timeout)
>  	}
> -	fcntl(fd, F_SETFL, fd_flags);
> +	jthread_set_blocking(fd, 1);
>  	SET_RETURN_OUT(r, out, r)
>  	return (r);
>  }
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> kaffe mailing list
> kaffe at kaffe.org
> http://kaffe.org/cgi-bin/mailman/listinfo/kaffe





More information about the kaffe mailing list