[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: library/1769: pthreads SEGV in thread_machdep_switch



The following reply was made to PR library/1769; it has been noted by GNATS.

From: "Stephen J. Bevan" <stephen_(_at_)_etunnels_(_dot_)_com>
To: gnats_(_at_)_cvs_(_dot_)_openbsd_(_dot_)_org, bugs_(_at_)_cvs_(_dot_)_openbsd_(_dot_)_org
Cc: stephen_(_at_)_etunnels_(_dot_)_com
Subject: Re: library/1769: pthreads SEGV in thread_machdep_switch
Date: Fri, 13 Apr 2001 12:53:36 -0700

   Looking at the report for 1769 I noticed that I'd omitted to files:
   io.h and io.c :-
 
 $ cat io.h
 #include <stddef.h>
 
 int readn(int, void *, size_t);
 int writen(int, const void *, size_t);
 $ cat io.c
 /*
  * $Id$
  */
 
 #include <errno.h>
 #include <stddef.h>
 #include <unistd.h>
 #include <sys/uio.h>
 #include <sys/types.h>
 #include "io.h"
 
 int readn(int fd, void * buffer, size_t count)
 {
      ssize_t n_read;
      size_t n_to_read = count;
      char * b = (char *)buffer;
 
      for (;;) {
           n_read = read(fd, b, n_to_read);
           if (n_read == n_to_read) {
                break;
           } else if (n_read == 0) {
                return 0;
           } else if (n_read >= 0) {
                b += n_read;
                n_to_read -= n_read;
           } else {
                switch (errno) {
                case EINTR:
                     continue;
                default:
                     return -1;
                }
           }
      }
      return 1;
 }
 
 
 int writen(int fd, const void * buffer, size_t count)
 {
      ssize_t n_written;
      size_t n_to_write = count;
      char * b = (char *)buffer;
 
      for (;;) {
           n_written = write(fd, b, n_to_write);
           if (n_written == n_to_write) {
                break;
           } else if (n_written >= 0) {
                b += n_written;
                n_to_write -= n_written;
           } else {
                switch (errno) {
                case EINTR:
                     continue;
                case EAGAIN:
                     return 0;
                default:
                     return -1;
                }
           }
      }
      return 1;
 }
 $
 



Visit your host, monkey.org