diff options
Diffstat (limited to 'mit-pthreads/patches')
-rwxr-xr-x | mit-pthreads/patches/Streepy.html | 2873 | ||||
-rwxr-xr-x | mit-pthreads/patches/Streepy2.html | 93 | ||||
-rwxr-xr-x | mit-pthreads/patches/bill_lear | 70 | ||||
-rwxr-xr-x | mit-pthreads/patches/chris_demetriou | 149 | ||||
-rwxr-xr-x | mit-pthreads/patches/mevans | 642 | ||||
-rwxr-xr-x | mit-pthreads/patches/p153 | 90 | ||||
-rwxr-xr-x | mit-pthreads/patches/p155 | 96 |
7 files changed, 0 insertions, 4013 deletions
diff --git a/mit-pthreads/patches/Streepy.html b/mit-pthreads/patches/Streepy.html deleted file mode 100755 index a3b4faa815f..00000000000 --- a/mit-pthreads/patches/Streepy.html +++ /dev/null @@ -1,2873 +0,0 @@ -diff -c -r1.1.1.1 pthread.h -*** pthread.h 1996/03/13 04:30:57 1.1.1.1 ---- pthread.h 1996/10/02 17:52:47 -*************** -*** 35,40 **** ---- 35,43 ---- - * - * 1.00 93/07/20 proven - * -Started coding this file. -+ * -+ * 93/9/28 streepy - Added support for pthread cancel -+ * - */ - - #ifndef _PTHREAD_H_ -*************** -*** 65,70 **** ---- 68,82 ---- - /* More includes, that need size_t */ - #include <pthread/pthread_attr.h> - -+ /* Constants for use with pthread_setcancelstate and pthread_setcanceltype */ -+ #define PTHREAD_CANCEL_DISABLE 0 -+ #define PTHREAD_CANCEL_ENABLE 1 -+ #define PTHREAD_CANCEL_DEFERRED 0 -+ #define PTHREAD_CANCEL_ASYNCHRONOUS 1 -+ -+ #define PTHREAD_CANCELLED (void *)1 /* Exit status of a cancelled thread */ -+ -+ - #ifdef PTHREAD_KERNEL - - #include <signal.h> /* for sigset_t */ -*************** -*** 78,120 **** - PS_STATE_MAX - }; - -- #define PF_WAIT_EVENT 0x01 -- #define PF_DONE_EVENT 0x02 -- - /* Put PANIC inside an expression that evaluates to non-void type, to - make it easier to combine it in expressions. */ -! #define DO_PANIC() (PANIC (), 0) -! #define PANICIF(x) ((x) ? DO_PANIC () : 0) - -! #define SET_PF_DONE_EVENT(x) \ -! ( !(x->flags & PF_DONE_EVENT) \ -! ? ( (x->flags & PF_WAIT_EVENT) \ -! ? (x->flags = PF_DONE_EVENT, OK) \ -! : DO_PANIC ()) \ - : NOTOK ) - -! #define SET_PF_WAIT_EVENT(x) \ -! ( PANICIF (x->flags & (PF_WAIT_EVENT | PF_DONE_EVENT)), \ -! (x->flags = PF_WAIT_EVENT), 0) -! -! #define CLEAR_PF_DONE_EVENT(x) \ -! ( PANICIF (!(x->flags & PF_DONE_EVENT)), \ -! x->flags = 0 ) - - struct pthread_select_data { -! int nfds; -! fd_set readfds; -! fd_set writefds; -! fd_set exceptfds; - }; - - union pthread_wait_data { -! pthread_mutex_t * mutex; -! pthread_cond_t * cond; -! const sigset_t * sigwait; /* Waiting on a signal in sigwait */ - struct { -! short fd; /* Used when thread waiting on fd */ -! short branch; /* line number, for debugging */ - } fd; - struct pthread_select_data * select_data; - }; ---- 90,185 ---- - PS_STATE_MAX - }; - - /* Put PANIC inside an expression that evaluates to non-void type, to - make it easier to combine it in expressions. */ -! #define DO_PANIC() (PANIC (), 0) -! #define PANICIF(x) ((x) ? DO_PANIC () : 0) -! -! /* In the thread flag field, we use a series of bit flags. Flags can -! * organized into "groups" of mutually exclusive flags. Other flags -! * are unrelated and can be set and cleared with a single bit operation. -! */ - -! #define PF_WAIT_EVENT 0x01 -! #define PF_DONE_EVENT 0x02 -! #define PF_EVENT_GROUP 0x03 /* All event bits */ -! -! #define PF_CANCEL_STATE 0x04 /* cancellability state */ -! #define PF_CANCEL_TYPE 0x08 /* cancellability type */ -! #define PF_THREAD_CANCELLED 0x10 /* thread has been cancelled */ -! #define PF_RUNNING_TO_CANCEL 0x20 /* Thread is running so it can cancel*/ -! #define PF_AT_CANCEL_POINT 0x40 /* Thread is at a cancel point */ -! -! /* Flag operations */ -! -! #define SET_PF_FLAG(x,f) ( (x)->flags |= (f) ) -! #define TEST_PF_FLAG(x,f) ( (x)->flags & (f) ) -! #define CLEAR_PF_FLAG(x,f) ( (x)->flags &= ~(f) ) -! #define CLEAR_PF_GROUP(x,g) ( (x)->flags &= ~(g) ) -! #define SET_PF_FLAG_IN_GROUP(x,g,f) ( CLEAR_PF_GROUP(x,g),SET_PF_FLAG(x,f)) -! #define TEST_PF_GROUP(x,g) ( (x)->flags & (g) ) -! -! #define SET_PF_DONE_EVENT(x) \ -! ( !TEST_PF_FLAG(x,PF_DONE_EVENT) \ -! ? ( TEST_PF_FLAG(x,PF_WAIT_EVENT) \ -! ? (SET_PF_FLAG_IN_GROUP(x,PF_EVENT_GROUP,PF_DONE_EVENT), OK) \ -! : DO_PANIC ()) \ - : NOTOK ) - -! #define SET_PF_WAIT_EVENT(x) \ -! ( PANICIF (TEST_PF_GROUP(x,PF_EVENT_GROUP) ), \ -! SET_PF_FLAG_IN_GROUP(x,PF_EVENT_GROUP,PF_WAIT_EVENT), 0) -! -! #define CLEAR_PF_DONE_EVENT(x) \ -! ( PANICIF (!TEST_PF_FLAG(x,PF_DONE_EVENT)), \ -! CLEAR_PF_GROUP(x,PF_EVENT_GROUP) ) -! -! #define SET_PF_CANCELLED(x) ( SET_PF_FLAG(x,PF_THREAD_CANCELLED) ) -! #define TEST_PF_CANCELLED(x) ( TEST_PF_FLAG(x,PF_THREAD_CANCELLED) ) -! -! #define SET_PF_RUNNING_TO_CANCEL(x) ( SET_PF_FLAG(x,PF_RUNNING_TO_CANCEL) ) -! #define CLEAR_PF_RUNNING_TO_CANCEL(x)( CLEAR_PF_FLAG(x,PF_RUNNING_TO_CANCEL) ) -! #define TEST_PF_RUNNING_TO_CANCEL(x)( TEST_PF_FLAG(x,PF_RUNNING_TO_CANCEL) ) -! -! #define SET_PF_AT_CANCEL_POINT(x) ( SET_PF_FLAG(x,PF_AT_CANCEL_POINT) ) -! #define CLEAR_PF_AT_CANCEL_POINT(x) ( CLEAR_PF_FLAG(x,PF_AT_CANCEL_POINT) ) -! #define TEST_PF_AT_CANCEL_POINT(x) ( TEST_PF_FLAG(x,PF_AT_CANCEL_POINT) ) -! -! #define SET_PF_CANCEL_STATE(x,f) \ -! ( (f) ? SET_PF_FLAG(x,PF_CANCEL_STATE) : CLEAR_PF_FLAG(x,PF_CANCEL_STATE) ) -! #define TEST_PF_CANCEL_STATE(x) \ -! ( (TEST_PF_FLAG(x,PF_CANCEL_STATE)) ? PTHREAD_CANCEL_ENABLE \ -! : PTHREAD_CANCEL_DISABLE ) -! -! #define SET_PF_CANCEL_TYPE(x,f) \ -! ( (f) ? SET_PF_FLAG(x,PF_CANCEL_TYPE) : CLEAR_PF_FLAG(x,PF_CANCEL_TYPE) ) -! #define TEST_PF_CANCEL_TYPE(x) \ -! ( (TEST_PF_FLAG(x,PF_CANCEL_TYPE)) ? PTHREAD_CANCEL_ASYNCHRONOUS \ -! : PTHREAD_CANCEL_DEFERRED ) -! -! /* See if a thread is in a state that it can be cancelled */ -! #define TEST_PTHREAD_IS_CANCELLABLE(x) \ -! ( (TEST_PF_CANCEL_STATE(x) == PTHREAD_CANCEL_ENABLE && TEST_PF_CANCELLED(x)) \ -! ? ((TEST_PF_CANCEL_TYPE(x) == PTHREAD_CANCEL_ASYNCHRONOUS) \ -! ? 1 \ -! : TEST_PF_AT_CANCEL_POINT(x)) \ -! : 0 ) -! - - struct pthread_select_data { -! int nfds; -! fd_set readfds; -! fd_set writefds; -! fd_set exceptfds; - }; - - union pthread_wait_data { -! pthread_mutex_t * mutex; -! pthread_cond_t * cond; -! const sigset_t * sigwait; /* Waiting on a signal in sigwait */ - struct { -! short fd; /* Used when thread waiting on fd */ -! short branch; /* line number, for debugging */ - } fd; - struct pthread_select_data * select_data; - }; -*************** -*** 122,143 **** - #define PTT_USER_THREAD 0x0001 - - struct pthread { -! int thread_type; - struct machdep_pthread machdep_data; -! pthread_attr_t attr; - - /* Signal interface */ -! sigset_t sigmask; -! sigset_t sigpending; -! int sigcount; /* Number of signals pending */ - - /* Timeout time */ -! struct timespec wakeup_time; - - /* Join queue for waiting threads */ - struct pthread_queue join_queue; - -- - /* - * Thread implementations are just multiple queue type implemenations, - * Below are the various link lists currently necessary ---- 187,207 ---- - #define PTT_USER_THREAD 0x0001 - - struct pthread { -! int thread_type; - struct machdep_pthread machdep_data; -! pthread_attr_t attr; - - /* Signal interface */ -! sigset_t sigmask; -! sigset_t sigpending; -! int sigcount; /* Number of signals pending */ - - /* Timeout time */ -! struct timespec wakeup_time; - - /* Join queue for waiting threads */ - struct pthread_queue join_queue; - - /* - * Thread implementations are just multiple queue type implemenations, - * Below are the various link lists currently necessary -*************** -*** 152,165 **** - * ALL threads, in any state. - * Must lock kernel lock before manipulating. - */ -! struct pthread * pll; - - /* - * Standard link list for running threads, mutexes, etc ... - * It can't be on both a running link list and a wait queue. - * Must lock kernel lock before manipulating. - */ -! struct pthread * next; - union pthread_wait_data data; - - /* ---- 216,229 ---- - * ALL threads, in any state. - * Must lock kernel lock before manipulating. - */ -! struct pthread * pll; - - /* - * Standard link list for running threads, mutexes, etc ... - * It can't be on both a running link list and a wait queue. - * Must lock kernel lock before manipulating. - */ -! struct pthread * next; - union pthread_wait_data data; - - /* -*************** -*** 167,197 **** - * (Note: "priority" is a reserved word in Concurrent C, please - * don't use it. --KR) - */ -! struct pthread_queue * queue; -! enum pthread_state state; -! char flags; -! char pthread_priority; - - /* - * Sleep queue, this is different from the standard link list - * because it is possible to be on both (pthread_cond_timedwait(); - * Must lock sleep mutex before manipulating - */ -! struct pthread *sll; /* For sleeping threads */ - - /* - * Data that doesn't need to be locked -! * Mostly it's because only the thread owning the data can manipulate it - */ -! void * ret; -! int error; -! int * error_p; -! const void ** specific_data; -! int specific_data_count; - - /* Cleanup handlers Link List */ - struct pthread_cleanup *cleanup; -- - }; - - #else /* not PTHREAD_KERNEL */ ---- 231,261 ---- - * (Note: "priority" is a reserved word in Concurrent C, please - * don't use it. --KR) - */ -! struct pthread_queue * queue; -! enum pthread_state state; -! enum pthread_state old_state; /* Used when cancelled */ -! char flags; -! char pthread_priority; - - /* - * Sleep queue, this is different from the standard link list - * because it is possible to be on both (pthread_cond_timedwait(); - * Must lock sleep mutex before manipulating - */ -! struct pthread *sll; /* For sleeping threads */ - - /* - * Data that doesn't need to be locked -! * Mostly because only the thread owning the data can manipulate it - */ -! void * ret; -! int error; -! int * error_p; -! const void ** specific_data; -! int specific_data_count; - - /* Cleanup handlers Link List */ - struct pthread_cleanup *cleanup; - }; - - #else /* not PTHREAD_KERNEL */ -*************** -*** 200,223 **** - - #endif - -! typedef struct pthread * pthread_t; - - /* - * Globals - */ - #ifdef PTHREAD_KERNEL - -! extern struct pthread * pthread_run; -! extern struct pthread * pthread_initial; -! extern struct pthread * pthread_link_list; - extern struct pthread_queue pthread_dead_queue; - extern struct pthread_queue pthread_alloc_queue; - -! extern pthread_attr_t pthread_attr_default; -! extern volatile int fork_lock; -! extern pthread_size_t pthread_pagesize; -! -! extern sigset_t * uthread_sigmask; - - #endif - ---- 264,293 ---- - - #endif - -! typedef struct pthread *pthread_t; - - /* - * Globals - */ - #ifdef PTHREAD_KERNEL - -! extern struct pthread * pthread_run; -! extern struct pthread * pthread_initial; -! extern struct pthread * pthread_link_list; - extern struct pthread_queue pthread_dead_queue; - extern struct pthread_queue pthread_alloc_queue; - -! extern pthread_attr_t pthread_attr_default; -! extern volatile int fork_lock; -! extern pthread_size_t pthread_pagesize; -! -! extern sigset_t * uthread_sigmask; -! -! /* Kernel global functions */ -! extern void pthread_sched_prevent(void); -! extern void pthread_sched_resume(void); -! extern int __pthread_is_valid( pthread_t ); -! extern void pthread_cancel_internal( int freelocks ); - - #endif - -*************** -*** 229,271 **** - - #if defined(DCE_COMPAT) - -! typedef void * (*pthread_startroutine_t)(void *) -! typedef void * pthread_addr_t - -! int pthread_create __P((pthread_t *, pthread_attr_t, -! pthread_startroutine_t, -! pthread_addr_t)); -! void pthread_exit __P((pthread_addr_t)); -! int pthread_join __P((pthread_t, pthread_addr_t *)); - - #else - -! void pthread_init __P((void)); -! int pthread_create __P((pthread_t *, -! const pthread_attr_t *, -! void * (*start_routine)(void *), -! void *)); -! void pthread_exit __P((void *)); -! pthread_t pthread_self __P((void)); -! int pthread_equal __P((pthread_t, pthread_t)); -! int pthread_join __P((pthread_t, void **)); -! int pthread_detach __P((pthread_t)); -! void pthread_yield __P((void)); -! -! int pthread_setschedparam __P((pthread_t pthread, int policy, -! struct sched_param * param)); -! int pthread_getschedparam __P((pthread_t pthread, int * policy, -! struct sched_param * param)); -! -! int pthread_kill __P((struct pthread *, int)); -! int pthread_signal __P((int, void (*)(int))); - - #endif - - #if defined(PTHREAD_KERNEL) - - /* Not valid, but I can't spell so this will be caught at compile time */ -! #define pthread_yeild(notvalid) - - #endif - ---- 299,343 ---- - - #if defined(DCE_COMPAT) - -! typedef void * (*pthread_startroutine_t)(void *); -! typedef void * pthread_addr_t; - -! int pthread_create __P((pthread_t *, pthread_attr_t, -! pthread_startroutine_t, pthread_addr_t)); -! void pthread_exit __P((pthread_addr_t)); -! int pthread_join __P((pthread_t, pthread_addr_t *)); - - #else - -! void pthread_init __P((void)); -! int pthread_create __P((pthread_t *, const pthread_attr_t *, -! void * (*start_routine)(void *), void *)); -! void pthread_exit __P((void *)); -! pthread_t pthread_self __P((void)); -! int pthread_equal __P((pthread_t, pthread_t)); -! int pthread_join __P((pthread_t, void **)); -! int pthread_detach __P((pthread_t)); -! void pthread_yield __P((void)); -! -! int pthread_setschedparam __P((pthread_t pthread, int policy, -! struct sched_param * param)); -! int pthread_getschedparam __P((pthread_t pthread, int * policy, -! struct sched_param * param)); -! -! int pthread_kill __P((struct pthread *, int)); -! int pthread_signal __P((int, void (*)(int))); -! -! int pthread_cancel __P(( pthread_t pthread )); -! int pthread_setcancelstate __P(( int state, int *oldstate )); -! int pthread_setcanceltype __P(( int type, int *oldtype )); -! void pthread_testcancel __P(( void )); - - #endif - - #if defined(PTHREAD_KERNEL) - - /* Not valid, but I can't spell so this will be caught at compile time */ -! #define pthread_yeild(notvalid) - - #endif - -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/include/signal.h,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 signal.h -*** signal.h 1995/12/25 03:03:09 1.1.1.1 ---- signal.h 1996/09/26 21:46:04 -*************** -*** 43,48 **** ---- 43,49 ---- - __BEGIN_DECLS - - int raise __P((int)); -+ __sighandler_t signal __P((int __sig, __sighandler_t)); - - #ifndef _ANSI_SOURCE - -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/include/pthread/kernel.h,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 kernel.h -*** kernel.h 1994/12/13 07:09:01 1.1.1.1 ---- kernel.h 1996/10/02 19:08:41 -*************** -*** 42,48 **** - */ - #if defined(PTHREAD_KERNEL) - -! #define PANIC() abort() - - /* Time each rr thread gets */ - #define PTHREAD_RR_TIMEOUT 100000000 ---- 42,54 ---- - */ - #if defined(PTHREAD_KERNEL) - -! #ifdef __GNUC__ -! #include <assert.h> -! #define PANIC() panic_kernel( __FILE__, __LINE__, __ASSERT_FUNCTION ) -! #else -! #define PANIC() panic_kernel( __FILE__, __LINE__, (const char *)0 ) -! #endif -! - - /* Time each rr thread gets */ - #define PTHREAD_RR_TIMEOUT 100000000 -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/machdep/syscall-i386-linux-1.0.S,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 syscall-i386-linux-1.0.S -*** syscall-i386-linux-1.0.S 1995/09/27 04:38:55 1.1.1.1 ---- syscall-i386-linux-1.0.S 1996/06/04 19:20:17 -*************** -*** 147,154 **** - - /* ========================================================================= - * exit 1 select 82 -! * fork 2 socketcall 102 -! * read 3 - * write 4 - * open 5 - * creat 8 ---- 147,154 ---- - - /* ========================================================================= - * exit 1 select 82 -! * fork 2 fstatfs 100 -! * read 3 socketcall 102 - * write 4 - * open 5 - * creat 8 -*************** -*** 160,166 **** - * chown 16 - * lseek 19 - * rename 38 -! * dup 41 - * pipe 42 - * ioctl 54 - * fcntl 55 ---- 160,166 ---- - * chown 16 - * lseek 19 - * rename 38 -! * dup 41 - * pipe 42 - * ioctl 54 - * fcntl 55 -*************** -*** 302,314 **** - #endif - - /* ========================================================================== -! * machdep_sys_fstat() - */ - #ifdef __ELF__ - STATCALL2(lstat) - #else - SYSCALL2(lstat) - #endif - - /* ========================================================================== - * machdep_sys_ftruncate() ---- 302,320 ---- - #endif - - /* ========================================================================== -! * machdep_sys_lstat() - */ - #ifdef __ELF__ - STATCALL2(lstat) - #else - SYSCALL2(lstat) - #endif -+ -+ /* ========================================================================== -+ * machdep_sys_fstatfs() -+ */ -+ SYSCALL2(fstatfs) -+ - - /* ========================================================================== - * machdep_sys_ftruncate() -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/machdep/linux-1.0/socket.h,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 socket.h -*** socket.h 1995/12/26 02:28:03 1.1.1.1 ---- socket.h 1996/09/27 18:12:45 -*************** -*** 26,32 **** - - #endif - -! /* #include <asm/socket.h> /* arch-dependent defines */ - #include <linux/sockios.h> /* the SIOCxxx I/O controls */ - #include <pthread/posix.h> - ---- 26,32 ---- - - #endif - -! /* #include <asm/socket.h> arch-dependent defines */ - #include <linux/sockios.h> /* the SIOCxxx I/O controls */ - #include <pthread/posix.h> - -*************** -*** 161,166 **** ---- 161,188 ---- - int connect __P((int, const struct sockaddr *, int)); - int listen __P((int, int)); - int socket __P((int, int, int)); -+ -+ int getsockopt __P ((int __s, int __level, int __optname, -+ void *__optval, int *__optlen)); -+ int setsockopt __P ((int __s, int __level, int __optname, -+ __const void *__optval, int optlen)); -+ int getsockname __P ((int __sockfd, struct sockaddr *__addr, -+ int *__paddrlen)); -+ int getpeername __P ((int __sockfd, struct sockaddr *__peer, -+ int *__paddrlen)); -+ ssize_t send __P ((int __sockfd, __const void *__buff, size_t __len, int __flags)); -+ ssize_t recv __P ((int __sockfd, void *__buff, size_t __len, int __flags)); -+ ssize_t sendto __P ((int __sockfd, __const void *__buff, size_t __len, -+ int __flags, __const struct sockaddr *__to, -+ int __tolen)); -+ ssize_t recvfrom __P ((int __sockfd, void *__buff, size_t __len, -+ int __flags, struct sockaddr *__from, -+ int *__fromlen)); -+ extern ssize_t sendmsg __P ((int __fd, __const struct msghdr *__message, -+ int __flags)); -+ extern ssize_t recvmsg __P ((int __fd, struct msghdr *__message, -+ int __flags)); -+ int shutdown __P ((int __sockfd, int __how)); - - __END_DECLS - -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/machdep/linux-1.0/timers.h,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 timers.h -*** timers.h 1996/03/05 08:28:36 1.1.1.1 ---- timers.h 1996/05/25 21:30:08 -*************** -*** 43,52 **** ---- 43,54 ---- - #include <sys/types.h> - #include <time.h> - -+ #ifndef _LINUX_TIME_H - struct timespec { - time_t tv_sec; - long tv_nsec; - }; -+ #endif /* _LINUX_TIME_H */ - - #define TIMEVAL_TO_TIMESPEC(tv, ts) { \ - (ts)->tv_sec = (tv)->tv_sec; \ -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/net/getprotoent.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 getprotoent.c -*** getprotoent.c 1996/02/09 05:39:41 1.1.1.1 ---- getprotoent.c 1996/05/27 01:11:27 -*************** -*** 128,135 **** - if (p != NULL) - *p++ = '\0'; - } -! if (p && *p); -! break; - } - *alias = NULL; - pthread_mutex_unlock(&proto_file_lock); ---- 128,135 ---- - if (p != NULL) - *p++ = '\0'; - } -! if (p && *p) -! break; - } - *alias = NULL; - pthread_mutex_unlock(&proto_file_lock); -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/net/proto_internal.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 proto_internal.c -*** proto_internal.c 1996/02/09 05:39:49 1.1.1.1 ---- proto_internal.c 1996/06/04 16:25:57 -*************** -*** 49,55 **** - static int init_status; - - /* Performs global initialization. */ -! char *_proto_init() - { - char *buf; - ---- 49,55 ---- - static int init_status; - - /* Performs global initialization. */ -! char *_proto_buf() - { - char *buf; - -*************** -*** 75,78 **** - { - init_status = pthread_key_create(&key, free); - } -- ---- 75,77 ---- -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/net/res_internal.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 res_internal.c -*** res_internal.c 1996/02/09 05:39:53 1.1.1.1 ---- res_internal.c 1996/09/25 23:31:11 -*************** -*** 144,149 **** ---- 144,150 ---- - break; - cp += n; - result->h_name = bp; -+ bp += strlen(bp) + 1; - iquery_done = 1; - break; - } -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/GNUmakefile.inc,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 GNUmakefile.inc -*** GNUmakefile.inc 1995/08/30 22:27:04 1.1.1.1 ---- GNUmakefile.inc 1996/10/02 19:04:29 -*************** -*** 8,14 **** - syscall.S pthread_join.c pthread_detach.c pthread_once.c sleep.c \ - specific.c process.c wait.c errno.c schedparam.c _exit.c prio_queue.c \ - pthread_init.c init.cc sig.c info.c mutexattr.c select.c wrapper.c \ -! dump_state.c pthread_kill.c stat.c readv.c writev.c condattr.c $(SRCS) - - ifeq ($(HAVE_SYSCALL_TEMPLATE),yes) - SYSCALL_FILTER_RULE= for s in $(AVAILABLE_SYSCALLS) ; do \ ---- 8,15 ---- - syscall.S pthread_join.c pthread_detach.c pthread_once.c sleep.c \ - specific.c process.c wait.c errno.c schedparam.c _exit.c prio_queue.c \ - pthread_init.c init.cc sig.c info.c mutexattr.c select.c wrapper.c \ -! dump_state.c pthread_kill.c stat.c readv.c writev.c condattr.c \ -! pthread_cancel.c panic.c $(SRCS) - - ifeq ($(HAVE_SYSCALL_TEMPLATE),yes) - SYSCALL_FILTER_RULE= for s in $(AVAILABLE_SYSCALLS) ; do \ -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/Makefile.inc,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 Makefile.inc -*** Makefile.inc 1995/08/22 22:09:07 1.1.1.1 ---- Makefile.inc 1996/10/02 19:04:38 -*************** -*** 8,14 **** - pthread_join.c pthread_detach.c pthread_once.c sleep.c specific.c \ - process.c wait.c errno.c schedparam.c _exit.c prio_queue.c \ - pthread_init.c init.cc sig.c info.c mutexattr.c select.c wrapper.c \ -! dump_state.c pthread_kill.c condattr.c - - .if $(HAVE_SYSCALL_TEMPLATE) == yes - OBJS+= syscalls.o ---- 8,14 ---- - pthread_join.c pthread_detach.c pthread_once.c sleep.c specific.c \ - process.c wait.c errno.c schedparam.c _exit.c prio_queue.c \ - pthread_init.c init.cc sig.c info.c mutexattr.c select.c wrapper.c \ -! dump_state.c pthread_kill.c condattr.c pthread_cancel.c panic.c - - .if $(HAVE_SYSCALL_TEMPLATE) == yes - OBJS+= syscalls.o -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/cond.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 cond.c -*** cond.c 1996/03/05 08:29:12 1.1.1.1 ---- cond.c 1996/10/03 18:19:04 -*************** -*** 188,197 **** ---- 188,204 ---- - pthread_queue_enq(&cond->c_queue, pthread_run); - pthread_mutex_unlock(mutex); - -+ pthread_run->data.mutex = mutex; -+ - SET_PF_WAIT_EVENT(pthread_run); -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - /* Reschedule will unlock pthread_run */ - pthread_resched_resume(PS_COND_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ - CLEAR_PF_DONE_EVENT(pthread_run); -+ -+ pthread_run->data.mutex = NULL; -+ - rval = pthread_mutex_lock(mutex); - return(rval); - break; -*************** -*** 203,212 **** ---- 210,226 ---- - pthread_mutex_unlock(mutex); - mutex->m_data.m_count = 1; - -+ pthread_run->data.mutex = mutex; -+ - SET_PF_WAIT_EVENT(pthread_run); -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - /* Reschedule will unlock pthread_run */ - pthread_resched_resume(PS_COND_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ - CLEAR_PF_DONE_EVENT(pthread_run); -+ -+ pthread_run->data.mutex = NULL; -+ - rval = pthread_mutex_lock(mutex); - mutex->m_data.m_count = count; - return(rval); -*************** -*** 258,265 **** ---- 272,285 ---- - SET_PF_WAIT_EVENT(pthread_run); - pthread_mutex_unlock(mutex); - -+ pthread_run->data.mutex = mutex; -+ -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - /* Reschedule will unlock pthread_run */ - pthread_resched_resume(PS_COND_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ -+ -+ pthread_run->data.mutex = NULL; - - /* Remove ourselves from sleep queue. If we fail then we timedout */ - if (sleep_cancel(pthread_run) == NOTOK) { -*************** -*** 285,292 **** ---- 305,318 ---- - SET_PF_WAIT_EVENT(pthread_run); - pthread_mutex_unlock(mutex); - -+ pthread_run->data.mutex = mutex; -+ -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - /* Reschedule will unlock pthread_run */ - pthread_resched_resume(PS_COND_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ -+ -+ pthread_run->data.mutex = NULL; - - /* Remove ourselves from sleep queue. If we fail then we timedout */ - if (sleep_cancel(pthread_run) == NOTOK) { -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/fd.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 fd.c -*** fd.c 1996/02/09 02:54:19 1.1.1.1 ---- fd.c 1996/10/03 01:33:03 -*************** -*** 48,54 **** ---- 48,59 ---- - #include <sys/types.h> - #include <sys/stat.h> - #include <sys/uio.h> -+ #include <sys/ioctl.h> -+ #if __STDC__ - #include <stdarg.h> -+ #else -+ #include <varargs.h> -+ #endif - #include <fcntl.h> - #include <errno.h> - #include <pthread/posix.h> -*************** -*** 62,67 **** ---- 67,74 ---- - static const int dtablecount = 4096/sizeof(struct fd_table_entry); - int dtablesize; - -+ static int fd_get_pthread_fd_from_kernel_fd( int ); -+ - /* ========================================================================== - * Allocate dtablecount entries at once and populate the fd_table. - * -*************** -*** 199,204 **** ---- 206,244 ---- - return(NOTOK); - } - -+ /*---------------------------------------------------------------------- -+ * Function: fd_get_pthread_fd_from_kernel_fd -+ * Purpose: get the fd_table index of a kernel fd -+ * Args: fd = kernel fd to convert -+ * Returns: fd_table index, -1 if not found -+ * Notes: -+ *----------------------------------------------------------------------*/ -+ static int -+ fd_get_pthread_fd_from_kernel_fd( int kfd ) -+ { -+ int j; -+ -+ /* This is *SICK*, but unless there is a faster way to -+ * turn a kernel fd into an fd_table index, this has to do. -+ */ -+ for( j=0; j < dtablesize; j++ ) { -+ if( fd_table[j] && -+ fd_table[j]->type != FD_NT && -+ fd_table[j]->type != FD_NIU && -+ fd_table[j]->fd.i == kfd ) { -+ return j; -+ } -+ } -+ -+ /* Not listed byfd, Check for kernel fd == pthread fd */ -+ if( fd_table[kfd] == NULL || fd_table[kfd]->type == FD_NT ) { -+ /* Assume that the kernel fd is the same */ -+ return kfd; -+ } -+ -+ return NOTOK; /* Not found */ -+ } -+ - /* ========================================================================== - * fd_basic_basic_unlock() - * -*************** -*** 288,293 **** ---- 328,334 ---- - switch (fd_table[fd]->type) { - case FD_NIU: - /* If not in use return EBADF error */ -+ SET_ERRNO(EBADF); - return(NOTOK); - break; - case FD_NT: -*************** -*** 297,302 **** ---- 338,344 ---- - */ - fd_kern_init(fd); - if (fd_table[fd]->type == FD_NIU) { -+ SET_ERRNO(EBADF); - return(NOTOK); - } - break; -*************** -*** 409,414 **** ---- 451,545 ---- - return(OK); - } - -+ /*---------------------------------------------------------------------- -+ * Function: fd_unlock_for_cancel -+ * Purpose: Unlock all fd locks held prior to being cancelled -+ * Args: void -+ * Returns: -+ * OK or NOTOK -+ * Notes: -+ * Assumes the kernel is locked on entry -+ *----------------------------------------------------------------------*/ -+ int -+ fd_unlock_for_cancel( void ) -+ { -+ int i, fd; -+ struct pthread_select_data *data; -+ int rdlk, wrlk, lktype; -+ int found; -+ -+ /* What we do depends on the previous state of the thread */ -+ switch( pthread_run->old_state ) { -+ case PS_RUNNING: -+ case PS_JOIN: -+ case PS_SLEEP_WAIT: -+ case PS_WAIT_WAIT: -+ case PS_SIGWAIT: -+ case PS_FDLR_WAIT: -+ case PS_FDLW_WAIT: -+ case PS_DEAD: -+ case PS_UNALLOCED: -+ break; /* Nothing to do */ -+ -+ case PS_COND_WAIT: -+ CLEAR_PF_GROUP( pthread_run, PF_EVENT_GROUP ); -+ /* Must reaquire the mutex according to the standard */ -+ if( pthread_run->data.mutex == NULL ) { -+ PANIC(); -+ } -+ pthread_mutex_lock( pthread_run->data.mutex ); -+ break; -+ -+ case PS_FDR_WAIT: -+ CLEAR_PF_GROUP( pthread_run, PF_EVENT_GROUP); -+ /* Free the lock on the fd being used */ -+ fd = fd_get_pthread_fd_from_kernel_fd( pthread_run->data.fd.fd ); -+ if( fd == NOTOK ) { -+ PANIC(); /* Can't find fd */ -+ } -+ fd_unlock( fd, FD_READ ); -+ break; -+ -+ case PS_FDW_WAIT: /* Waiting on i/o */ -+ CLEAR_PF_GROUP( pthread_run, PF_EVENT_GROUP); -+ /* Free the lock on the fd being used */ -+ fd = fd_get_pthread_fd_from_kernel_fd( pthread_run->data.fd.fd ); -+ if( fd == NOTOK ) { -+ PANIC(); /* Can't find fd */ -+ } -+ fd_unlock( fd, FD_WRITE ); -+ break; -+ -+ case PS_SELECT_WAIT: -+ data = pthread_run->data.select_data; -+ -+ CLEAR_PF_GROUP( pthread_run, PF_EVENT_GROUP); -+ -+ for( i = 0; i < data->nfds; i++) { -+ rdlk =(FD_ISSET(i,&data->readfds) -+ || FD_ISSET(i,&data->exceptfds)); -+ wrlk = FD_ISSET(i, &data->writefds); -+ lktype = rdlk ? (wrlk ? FD_RDWR : FD_READ) : FD_WRITE; -+ -+ if( ! (rdlk || wrlk) ) -+ continue; /* No locks, no unlock */ -+ -+ if( (fd = fd_get_pthread_fd_from_kernel_fd( i )) == NOTOK ) { -+ PANIC(); /* Can't find fd */ -+ } -+ -+ fd_unlock( fd, lktype ); -+ } -+ break; -+ -+ case PS_MUTEX_WAIT: -+ PANIC(); /* Should never cancel a mutex wait */ -+ -+ default: -+ PANIC(); /* Unknown thread status */ -+ } -+ } -+ - /* ========================================================================== - * fd_lock() - */ -*************** -*** 476,481 **** ---- 607,616 ---- - ret = fd_table[fd]->ops->read(fd_table[fd]->fd, - fd_table[fd]->flags, buf, nbytes, timeout); - fd_unlock(fd, FD_READ); -+ if( ret < 0 ) { -+ SET_ERRNO(-ret); -+ ret = NOTOK; -+ } - } - return(ret); - } -*************** -*** 500,505 **** ---- 635,644 ---- - ret = fd_table[fd]->ops->readv(fd_table[fd]->fd, - fd_table[fd]->flags, iov, iovcnt, timeout); - fd_unlock(fd, FD_READ); -+ if( ret < 0 ) { -+ SET_ERRNO(-ret); -+ ret = NOTOK; -+ } - } - return(ret); - } -*************** -*** 524,529 **** ---- 663,672 ---- - ret = fd_table[fd]->ops->write(fd_table[fd]->fd, - fd_table[fd]->flags, buf, nbytes, timeout); - fd_unlock(fd, FD_WRITE); -+ if( ret < 0 ) { -+ SET_ERRNO(-ret); -+ ret = NOTOK; -+ } - } - return(ret); - } -*************** -*** 548,553 **** ---- 691,700 ---- - ret = fd_table[fd]->ops->writev(fd_table[fd]->fd, - fd_table[fd]->flags, iov, iovcnt, timeout); - fd_unlock(fd, FD_WRITE); -+ if( ret < 0 ) { -+ SET_ERRNO(-ret); -+ ret = NOTOK; -+ } - } - return(ret); - } -*************** -*** 599,677 **** - union fd_data realfd; - int ret, flags; - - /* Need to lock the newfd by hand */ -! if (fd < dtablesize) { -! pthread_mutex_lock(&fd_table_mutex); -! if (fd_table[fd]) { -! pthread_mutex_unlock(&fd_table_mutex); -! mutex = &(fd_table[fd]->mutex); -! pthread_mutex_lock(mutex); - -! /* -! * XXX Gross hack ... because of fork(), any fd closed by the -! * parent should not change the fd of the child, unless it owns it. - */ -! switch(fd_table[fd]->type) { -! case FD_NIU: -! pthread_mutex_unlock(mutex); -! ret = -EINVAL; -! break; -! case FD_NT: -! /* -! * If it's not tested then the only valid possibility is it's -! * kernel fd. -! */ -! ret = machdep_sys_close(fd); -! fd_table[fd]->type = FD_NIU; -! pthread_mutex_unlock(mutex); -! break; -! case FD_TEST_FULL_DUPLEX: -! case FD_TEST_HALF_DUPLEX: - realfd = fd_table[fd]->fd; - flags = fd_table[fd]->flags; - if ((entry = fd_free(fd)) == NULL) { -! ret = fd_table[fd]->ops->close(realfd, flags); - } else { -! /* There can't be any others waiting for fd. */ - pthread_mutex_unlock(&entry->mutex); - /* Note: entry->mutex = mutex */ -- mutex = &(fd_table[fd]->mutex); - } - pthread_mutex_unlock(mutex); -- break; -- default: -- ret = fd_basic_lock(fd, FD_RDWR, mutex, NULL); -- if (ret == OK) { -- realfd = fd_table[fd]->fd; -- flags = fd_table[fd]->flags; -- pthread_mutex_unlock(mutex); -- if ((entry = fd_free(fd)) == NULL) { -- ret = fd_table[fd]->ops->close(realfd, flags); -- } else { -- fd_basic_basic_unlock(entry, FD_RDWR); -- pthread_mutex_unlock(&entry->mutex); -- /* Note: entry->mutex = mutex */ -- } -- fd_unlock(fd, FD_RDWR); -- } else { -- pthread_mutex_unlock(mutex); -- } -- break; - } -! } else { -! /* Don't bother creating a table entry */ -! pthread_mutex_unlock(&fd_table_mutex); -! ret = machdep_sys_close(fd); - } -! return(ret); - } -! return(-EINVAL); - } - - /* ========================================================================== - * fd_basic_dup() - * - * Might need to do more than just what's below. - */ - static inline void fd_basic_dup(int fd, int newfd) - { ---- 746,836 ---- - union fd_data realfd; - int ret, flags; - -+ if( fd < 0 || fd >= dtablesize ) { -+ SET_ERRNO(EBADF); -+ return -1; -+ } -+ - /* Need to lock the newfd by hand */ -! pthread_mutex_lock(&fd_table_mutex); -! if (fd_table[fd]) { -! pthread_mutex_unlock(&fd_table_mutex); -! mutex = &(fd_table[fd]->mutex); -! pthread_mutex_lock(mutex); - -! /* -! * XXX Gross hack ... because of fork(), any fd closed by the -! * parent should not change the fd of the child, unless it owns it. -! */ -! switch(fd_table[fd]->type) { -! case FD_NIU: -! pthread_mutex_unlock(mutex); -! ret = -EBADF; -! break; -! case FD_NT: -! /* -! * If it's not tested then the only valid possibility is it's -! * kernel fd. - */ -! ret = machdep_sys_close(fd); -! fd_table[fd]->type = FD_NIU; -! pthread_mutex_unlock(mutex); -! break; -! case FD_TEST_FULL_DUPLEX: -! case FD_TEST_HALF_DUPLEX: -! realfd = fd_table[fd]->fd; -! flags = fd_table[fd]->flags; -! if ((entry = fd_free(fd)) == NULL) { -! ret = fd_table[fd]->ops->close(realfd, flags); -! } else { -! /* There can't be any others waiting for fd. */ -! pthread_mutex_unlock(&entry->mutex); -! /* Note: entry->mutex = mutex */ -! mutex = &(fd_table[fd]->mutex); -! } -! pthread_mutex_unlock(mutex); -! break; -! default: -! ret = fd_basic_lock(fd, FD_RDWR, mutex, NULL); -! if (ret == OK) { - realfd = fd_table[fd]->fd; - flags = fd_table[fd]->flags; -+ pthread_mutex_unlock(mutex); - if ((entry = fd_free(fd)) == NULL) { -! ret = fd_table[fd]->ops->close(realfd, flags); - } else { -! fd_basic_basic_unlock(entry, FD_RDWR); - pthread_mutex_unlock(&entry->mutex); - /* Note: entry->mutex = mutex */ - } -+ fd_unlock(fd, FD_RDWR); -+ } else { - pthread_mutex_unlock(mutex); - } -! break; - } -! } else { -! /* Don't bother creating a table entry */ -! pthread_mutex_unlock(&fd_table_mutex); -! ret = machdep_sys_close(fd); -! } -! -! if( ret < 0 ) { -! SET_ERRNO(-ret); -! ret = -1; - } -! -! return ret; - } - - /* ========================================================================== - * fd_basic_dup() - * - * Might need to do more than just what's below. -+ * -+ * This is a MAJOR guess!! I don't know if the mutext unlock is valid -+ * in the BIG picture. But it seems to be needed to avoid deadlocking -+ * with ourselves when we try to close the duped file descriptor. - */ - static inline void fd_basic_dup(int fd, int newfd) - { -*************** -*** 679,684 **** ---- 838,845 ---- - fd_table[fd]->next = fd_table[newfd]; - fd_table[newfd] = fd_table[fd]; - fd_table[fd]->count++; -+ pthread_mutex_unlock(&fd_table[newfd]->next->mutex); -+ - } - - /* ========================================================================== -*************** -*** 896,904 **** - * ala select()... --SNL - */ - int -! ioctl(int fd, unsigned long request, caddr_t arg) - { - int ret; - - if (fd < 0 || fd >= dtablesize) - ret = NOTOK; ---- 1057,1071 ---- - * ala select()... --SNL - */ - int -! ioctl(int fd, int request, ...) - { - int ret; -+ pthread_va_list ap; -+ caddr_t arg; -+ -+ va_start( ap, request ); /* Get the arg */ -+ arg = va_arg(ap,caddr_t); -+ va_end( ap ); - - if (fd < 0 || fd >= dtablesize) - ret = NOTOK; -*************** -*** 906,911 **** ---- 1073,1086 ---- - ret = machdep_sys_ioctl(fd, request, arg); - else if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { - ret = machdep_sys_ioctl(fd_table[fd]->fd.i, request, arg); -+ if( ret == 0 && request == FIONBIO ) { -+ /* Properly set NONBLOCK flag */ -+ int v = *(int *)arg; -+ if( v ) -+ fd_table[fd]->flags |= __FD_NONBLOCK; -+ else -+ fd_table[fd]->flags &= ~__FD_NONBLOCK; -+ } - fd_unlock(fd, FD_RDWR); - } - return ret; -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/fd_kern.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 fd_kern.c -*** fd_kern.c 1996/02/12 00:58:30 1.1.1.1 ---- fd_kern.c 1996/10/03 01:54:15 -*************** -*** 128,134 **** - - - if ((count = machdep_sys_select(dtablesize, &fd_set_read, -! &fd_set_write, NULL, &__fd_kern_poll_timeout)) < OK) { - if (count == -EINTR) { - return; - } ---- 128,134 ---- - - - if ((count = machdep_sys_select(dtablesize, &fd_set_read, -! &fd_set_write, &fd_set_except, &__fd_kern_poll_timeout)) < OK) { - if (count == -EINTR) { - return; - } -*************** -*** 167,200 **** - - for (pthread = fd_wait_select.q_next; count && pthread; ) { - int found_one = 0; - - for (i = 0; i < pthread->data.select_data->nfds; i++) { - int count_dec = 0; - -! if ((FD_ISSET(i, &pthread->data.select_data->exceptfds) && -! ! FD_ISSET(i, &fd_set_except))) { -! FD_CLR(i, &pthread->data.select_data->exceptfds); -! } else { -! count_dec++; - } -! if ((FD_ISSET(i, &pthread->data.select_data->writefds) && -! ! FD_ISSET(i, &fd_set_write))) { -! FD_CLR(i, &pthread->data.select_data->writefds); -! } else { -! count_dec++; - } -! if ((FD_ISSET(i, &pthread->data.select_data->readfds) && -! ! FD_ISSET(i, &fd_set_read))) { -! FD_CLR(i, &pthread->data.select_data->readfds); -! } else { -! count_dec++; - } - if (count_dec) { - found_one++; - count--; - } - } - if (found_one) { - deq = pthread; - pthread = pthread->next; - pthread_queue_remove(&fd_wait_select, deq); ---- 167,223 ---- - - for (pthread = fd_wait_select.q_next; count && pthread; ) { - int found_one = 0; -+ fd_set tmp_readfds, tmp_writefds, tmp_exceptfds; -+ -+ memcpy(&tmp_readfds, &pthread->data.select_data->readfds, -+ sizeof(fd_set)); -+ memcpy(&tmp_writefds, &pthread->data.select_data->writefds, -+ sizeof(fd_set)); -+ memcpy(&tmp_exceptfds, &pthread->data.select_data->exceptfds, -+ sizeof(fd_set)); - - for (i = 0; i < pthread->data.select_data->nfds; i++) { - int count_dec = 0; - -! if( (FD_ISSET(i, &tmp_exceptfds)) ) { -! if( FD_ISSET(i, &fd_set_except) ) { -! count_dec++; /* got a hit */ -! } else { -! FD_CLR(i, &tmp_exceptfds); -! } - } -! -! if( (FD_ISSET(i, &tmp_writefds)) ) { -! if( FD_ISSET(i, &fd_set_write) ) { -! count_dec++; /* got a hit */ -! } else { -! FD_CLR(i, &tmp_writefds); -! } - } -! -! if( (FD_ISSET(i, &tmp_readfds)) ) { -! if( FD_ISSET(i, &fd_set_read) ) { -! count_dec++; /* got a hit */ -! } else { -! FD_CLR(i, &tmp_readfds); -! } - } -+ - if (count_dec) { - found_one++; - count--; - } - } -+ - if (found_one) { -+ /* Update the threads saved select data fd sets */ -+ memcpy(&pthread->data.select_data->readfds, &tmp_readfds, -+ sizeof(fd_set)); -+ memcpy(&pthread->data.select_data->writefds, &tmp_writefds, -+ sizeof(fd_set)); -+ memcpy(&pthread->data.select_data->exceptfds, &tmp_exceptfds, -+ sizeof(fd_set)); -+ - deq = pthread; - pthread = pthread->next; - pthread_queue_remove(&fd_wait_select, deq); -*************** -*** 266,272 **** - */ - - while ((count = machdep_sys_select(dtablesize, &fd_set_read, -! &fd_set_write, NULL, &__fd_kern_wait_timeout)) < OK) { - if (count == -EINTR) { - return; - } ---- 289,295 ---- - */ - - while ((count = machdep_sys_select(dtablesize, &fd_set_read, -! &fd_set_write, &fd_set_except, &__fd_kern_wait_timeout)) < OK) { - if (count == -EINTR) { - return; - } -*************** -*** 305,338 **** - - for (pthread = fd_wait_select.q_next; count && pthread; ) { - int found_one = 0; - - for (i = 0; i < pthread->data.select_data->nfds; i++) { - int count_dec = 0; - -! if ((FD_ISSET(i, &pthread->data.select_data->exceptfds) && -! ! FD_ISSET(i, &fd_set_except))) { -! FD_CLR(i, &pthread->data.select_data->exceptfds); -! } else { -! count_dec++; - } -! if ((FD_ISSET(i, &pthread->data.select_data->writefds) && -! ! FD_ISSET(i, &fd_set_write))) { -! FD_CLR(i, &pthread->data.select_data->writefds); -! } else { -! count_dec++; - } -! if ((FD_ISSET(i, &pthread->data.select_data->readfds) && -! ! FD_ISSET(i, &fd_set_read))) { -! FD_CLR(i, &pthread->data.select_data->readfds); -! } else { -! count_dec++; - } - if (count_dec) { - found_one++; - count--; - } - } - if (found_one) { - deq = pthread; - pthread = pthread->next; - pthread_queue_remove(&fd_wait_select, deq); ---- 328,383 ---- - - for (pthread = fd_wait_select.q_next; count && pthread; ) { - int found_one = 0; -+ fd_set tmp_readfds, tmp_writefds, tmp_exceptfds; -+ -+ memcpy(&tmp_readfds, &pthread->data.select_data->readfds, -+ sizeof(fd_set)); -+ memcpy(&tmp_writefds, &pthread->data.select_data->writefds, -+ sizeof(fd_set)); -+ memcpy(&tmp_exceptfds, &pthread->data.select_data->exceptfds, -+ sizeof(fd_set)); - - for (i = 0; i < pthread->data.select_data->nfds; i++) { - int count_dec = 0; - -! if( (FD_ISSET(i, &tmp_exceptfds)) ) { -! if( FD_ISSET(i, &fd_set_except) ) { -! count_dec++; /* got a hit */ -! } else { -! FD_CLR(i, &tmp_exceptfds); -! } - } -! -! if( (FD_ISSET(i, &tmp_writefds)) ) { -! if( FD_ISSET(i, &fd_set_write) ) { -! count_dec++; /* got a hit */ -! } else { -! FD_CLR(i, &tmp_writefds); -! } - } -! -! if( (FD_ISSET(i, &tmp_readfds)) ) { -! if( FD_ISSET(i, &fd_set_read) ) { -! count_dec++; /* got a hit */ -! } else { -! FD_CLR(i, &tmp_readfds); -! } - } -+ - if (count_dec) { - found_one++; - count--; - } - } - if (found_one) { -+ /* Update the threads saved select data fd sets */ -+ memcpy(&pthread->data.select_data->readfds, &tmp_readfds, -+ sizeof(fd_set)); -+ memcpy(&pthread->data.select_data->writefds, &tmp_writefds, -+ sizeof(fd_set)); -+ memcpy(&pthread->data.select_data->exceptfds, &tmp_exceptfds, -+ sizeof(fd_set)); -+ - deq = pthread; - pthread = pthread->next; - pthread_queue_remove(&fd_wait_select, deq); -*************** -*** 380,404 **** - machdep_gettimeofday(¤t_time); - sleep_schedule(¤t_time, timeout); - - pthread_resched_resume(PS_FDR_WAIT); - - /* We're awake */ - pthread_sched_prevent(); - if (sleep_cancel(pthread_run) == NOTOK) { - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); -- SET_ERRNO(ETIMEDOUT); - ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); - } else { - pthread_resched_resume(PS_FDR_WAIT); - } - CLEAR_PF_DONE_EVENT(pthread_run); - } else { -- SET_ERRNO(-ret); -- ret = NOTOK; - break; - } - } ---- 425,450 ---- - machdep_gettimeofday(¤t_time); - sleep_schedule(¤t_time, timeout); - -+ SET_PF_AT_CANCEL_POINT(pthread_run); - pthread_resched_resume(PS_FDR_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); - - /* We're awake */ - pthread_sched_prevent(); - if (sleep_cancel(pthread_run) == NOTOK) { - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); - } else { -+ SET_PF_AT_CANCEL_POINT(pthread_run); - pthread_resched_resume(PS_FDR_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); - } - CLEAR_PF_DONE_EVENT(pthread_run); - } else { - break; - } - } -*************** -*** 437,443 **** - if (sleep_cancel(pthread_run) == NOTOK) { - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); -- SET_ERRNO(ETIMEDOUT); - ret = -ETIMEDOUT; - break; - } ---- 483,488 ---- -*************** -*** 447,454 **** - } - CLEAR_PF_DONE_EVENT(pthread_run); - } else { -- SET_ERRNO(-ret); -- ret = NOTOK; - break; - } - } ---- 492,497 ---- -*************** -*** 480,504 **** - machdep_gettimeofday(¤t_time); - sleep_schedule(¤t_time, timeout); - - pthread_resched_resume(PS_FDW_WAIT); - - /* We're awake */ - pthread_sched_prevent(); - if (sleep_cancel(pthread_run) == NOTOK) { - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); -- SET_ERRNO(ETIMEDOUT); - ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); - } else { - pthread_resched_resume(PS_FDW_WAIT); - } - CLEAR_PF_DONE_EVENT(pthread_run); - } else { -- SET_ERRNO(-ret); -- ret = NOTOK; - break; - } - } ---- 523,548 ---- - machdep_gettimeofday(¤t_time); - sleep_schedule(¤t_time, timeout); - -+ SET_PF_AT_CANCEL_POINT(pthread_run); - pthread_resched_resume(PS_FDW_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); - - /* We're awake */ - pthread_sched_prevent(); - if (sleep_cancel(pthread_run) == NOTOK) { - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); - } else { -+ SET_PF_AT_CANCEL_POINT(pthread_run); - pthread_resched_resume(PS_FDW_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); - } - CLEAR_PF_DONE_EVENT(pthread_run); - } else { - break; - } - } -*************** -*** 537,543 **** - if (sleep_cancel(pthread_run) == NOTOK) { - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); -- SET_ERRNO(ETIMEDOUT); - ret = -ETIMEDOUT; - break; - } ---- 581,586 ---- -*************** -*** 547,554 **** - } - CLEAR_PF_DONE_EVENT(pthread_run); - } else { -- SET_ERRNO(-ret); -- ret = NOTOK; - break; - } - } ---- 590,595 ---- -*************** -*** 662,668 **** - */ - int create(const char *path, mode_t mode) - { -! return creat (path, mode); - } - - /* ========================================================================== ---- 703,709 ---- - */ - int create(const char *path, mode_t mode) - { -! return creat (path, mode); - } - - /* ========================================================================== -*************** -*** 672,678 **** - - int creat(const char *path, mode_t mode) - { -! return open (path, O_CREAT | O_TRUNC | O_WRONLY, mode); - } - - /* ========================================================================== ---- 713,719 ---- - - int creat(const char *path, mode_t mode) - { -! return open (path, O_CREAT | O_TRUNC | O_WRONLY, mode); - } - - /* ========================================================================== -*************** -*** 1079,1090 **** - int bind(int fd, const struct sockaddr *name, int namelen) - { - /* Not much to do in bind */ -- semaphore *plock; - int ret; - - if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { - if ((ret = machdep_sys_bind(fd_table[fd]->fd.i, name, namelen)) < OK) { - SET_ERRNO(-ret); - } - fd_unlock(fd, FD_RDWR); - } ---- 1120,1131 ---- - int bind(int fd, const struct sockaddr *name, int namelen) - { - /* Not much to do in bind */ - int ret; - - if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { - if ((ret = machdep_sys_bind(fd_table[fd]->fd.i, name, namelen)) < OK) { - SET_ERRNO(-ret); -+ ret = NOTOK; - } - fd_unlock(fd, FD_RDWR); - } -*************** -*** 1100,1113 **** - */ - int connect(int fd, const struct sockaddr *name, int namelen) - { -! struct sockaddr tmpname; -! int ret, tmpnamelen; - -! if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { - if ((ret = machdep_sys_connect(fd_table[fd]->fd.i, name, namelen)) < OK) { - if (!(fd_table[fd]->flags & __FD_NONBLOCK) && -! ((ret == -EWOULDBLOCK) || (ret == -EINPROGRESS) || -! (ret == -EALREADY) || (ret == -EAGAIN))) { - pthread_sched_prevent(); - - /* queue pthread for a FDW_WAIT */ ---- 1141,1154 ---- - */ - int connect(int fd, const struct sockaddr *name, int namelen) - { -! struct sockaddr tmpname; -! int ret, tmpnamelen; - -! if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { - if ((ret = machdep_sys_connect(fd_table[fd]->fd.i, name, namelen)) < OK) { - if (!(fd_table[fd]->flags & __FD_NONBLOCK) && -! ((ret == -EWOULDBLOCK) || (ret == -EINPROGRESS) || -! (ret == -EALREADY) || (ret == -EAGAIN))) { - pthread_sched_prevent(); - - /* queue pthread for a FDW_WAIT */ -*************** -*** 1121,1131 **** - tmpnamelen = sizeof(tmpname); - /* OK now lets see if it really worked */ - if (((ret = machdep_sys_getpeername(fd_table[fd]->fd.i, -! &tmpname, &tmpnamelen)) < OK) && (ret == -ENOTCONN)) { - - /* Get the error, this function should not fail */ - machdep_sys_getsockopt(fd_table[fd]->fd.i, SOL_SOCKET, -! SO_ERROR, &pthread_run->error, &tmpnamelen); - } - } else { - SET_ERRNO(-ret); ---- 1162,1180 ---- - tmpnamelen = sizeof(tmpname); - /* OK now lets see if it really worked */ - if (((ret = machdep_sys_getpeername(fd_table[fd]->fd.i, -! &tmpname, &tmpnamelen)) < OK) -! && (ret == -ENOTCONN)) { - - /* Get the error, this function should not fail */ - machdep_sys_getsockopt(fd_table[fd]->fd.i, SOL_SOCKET, -! SO_ERROR, &ret, &tmpnamelen); -! SET_ERRNO(-ret); -! ret = NOTOK; -! } else { -! if( ret < 0 ) { -! SET_ERRNO(-ret); -! ret = NOTOK; -! } - } - } else { - SET_ERRNO(-ret); -*************** -*** 1133,1140 **** - } - } - fd_unlock(fd, FD_RDWR); -! } -! return(ret); - } - - #endif ---- 1182,1189 ---- - } - } - fd_unlock(fd, FD_RDWR); -! } -! return(ret); - } - - #endif -*************** -*** 1164,1170 **** - } else { - fd_unlock(fd, FD_RDWR); - SET_ERRNO(-fd_kern); -! return(fd_kern); - } - } - fd_unlock(fd, FD_RDWR); ---- 1213,1219 ---- - } else { - fd_unlock(fd, FD_RDWR); - SET_ERRNO(-fd_kern); -! return(NOTOK); - } - } - fd_unlock(fd, FD_RDWR); -*************** -*** 1198,1205 **** - int ret; - - if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { -! ret = machdep_sys_listen(fd_table[fd]->fd.i, backlog); -! if ((ret = machdep_sys_listen(fd_table[fd]->fd.i, backlog)) < OK) { - SET_ERRNO(-ret); - ret = NOTOK; - } ---- 1247,1253 ---- - int ret; - - if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { -! if ((ret = machdep_sys_listen(fd_table[fd]->fd.i, backlog)) < OK) { - SET_ERRNO(-ret); - ret = NOTOK; - } -*************** -*** 1246,1252 **** - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); ---- 1294,1300 ---- - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = NOTOK; - break; - } - pthread_sched_resume(); -*************** -*** 1311,1317 **** - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); ---- 1359,1365 ---- - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = NOTOK; - break; - } - pthread_sched_resume(); -*************** -*** 1405,1411 **** - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); ---- 1453,1459 ---- - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = NOTOK; - break; - } - pthread_sched_resume(); -*************** -*** 1471,1477 **** - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); ---- 1519,1525 ---- - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = NOTOK; - break; - } - pthread_sched_resume(); -*************** -*** 1536,1542 **** - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); ---- 1584,1590 ---- - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = NOTOK; - break; - } - pthread_sched_resume(); -*************** -*** 1603,1609 **** - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = -ETIMEDOUT; - break; - } - pthread_sched_resume(); ---- 1651,1657 ---- - CLEAR_PF_DONE_EVENT(pthread_run); - pthread_sched_resume(); - SET_ERRNO(ETIMEDOUT); -! ret = NOTOK; - break; - } - pthread_sched_resume(); -*************** -*** 1734,1744 **** - */ - int getsockopt(int fd, int level, int optname, void * optval, int * optlen) - { -! int ret; - -! if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) { - if ((ret = machdep_sys_getsockopt(fd_table[fd]->fd.i, level, -! optname, optval, optlen)) < OK) { - SET_ERRNO(-ret); - ret = NOTOK; - } ---- 1782,1792 ---- - */ - int getsockopt(int fd, int level, int optname, void * optval, int * optlen) - { -! int ret; - -! if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) { - if ((ret = machdep_sys_getsockopt(fd_table[fd]->fd.i, level, -! optname, optval, optlen)) < OK) { - SET_ERRNO(-ret); - ret = NOTOK; - } -*************** -*** 1756,1772 **** - */ - int getsockname(int fd, struct sockaddr * name, int * naddrlen) - { -! int ret; - -! if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) { -! if ((ret = machdep_sys_getsockname(fd_table[fd]->fd.i, -! name, naddrlen)) < OK) { -! SET_ERRNO(-ret); -! ret = NOTOK; -! } -! fd_unlock(fd, FD_RDWR); -! } -! return ret; - } - - #endif ---- 1804,1820 ---- - */ - int getsockname(int fd, struct sockaddr * name, int * naddrlen) - { -! int ret; - -! if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) { -! if ((ret = machdep_sys_getsockname(fd_table[fd]->fd.i, -! name, naddrlen)) < OK) { -! SET_ERRNO(-ret); -! ret = NOTOK; -! } -! fd_unlock(fd, FD_RDWR); -! } -! return ret; - } - - #endif -*************** -*** 1778,1793 **** - */ - int getpeername(int fd, struct sockaddr * peer, int * paddrlen) - { -! int ret; - -! if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) { -! if ((ret = machdep_sys_getpeername(fd_table[fd]->fd.i, -! peer, paddrlen)) < OK) { - SET_ERRNO(-ret); - ret = NOTOK; -! } -! fd_unlock(fd, FD_READ); -! } - return ret; - } - ---- 1826,1841 ---- - */ - int getpeername(int fd, struct sockaddr * peer, int * paddrlen) - { -! int ret; - -! if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) { -! if ((ret = machdep_sys_getpeername(fd_table[fd]->fd.i, -! peer, paddrlen)) < OK) { - SET_ERRNO(-ret); - ret = NOTOK; -! } -! fd_unlock(fd, FD_READ); -! } - return ret; - } - -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/pthread.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 pthread.c -*** pthread.c 1995/12/13 05:53:01 1.1.1.1 ---- pthread.c 1996/10/01 21:42:01 -*************** -*** 129,134 **** ---- 129,160 ---- - - } - -+ /*---------------------------------------------------------------------- -+ * Function: __pthread_is_valid -+ * Purpose: Scan the list of threads to see if a specified thread exists -+ * Args: -+ * pthread = The thread to scan for -+ * Returns: -+ * int = 1 if found, 0 if not -+ * Notes: -+ * The kernel is assumed to be locked -+ *----------------------------------------------------------------------*/ -+ int -+ __pthread_is_valid( pthread_t pthread ) -+ { -+ int rtn = 0; /* Assume not found */ -+ pthread_t t; -+ -+ for( t = pthread_link_list; t; t = t->pll ) { -+ if( t == pthread ) { -+ rtn = 1; /* Found it */ -+ break; -+ } -+ } -+ -+ return rtn; -+ } -+ - /* ========================================================================== - * __pthread_free() - */ -*************** -*** 242,247 **** ---- 268,277 ---- - new_thread->next = NULL; - new_thread->flags = 0; - -+ /* PTHREADS spec says we start with cancellability on and deferred */ -+ SET_PF_CANCEL_STATE(new_thread, PTHREAD_CANCEL_ENABLE); -+ SET_PF_CANCEL_TYPE(new_thread, PTHREAD_CANCEL_DEFERRED); -+ - new_thread->error_p = NULL; - new_thread->sll = NULL; - -*************** -*** 261,269 **** - } - return(retval); - } -- -- /* ========================================================================== -- * pthread_cancel() -- * -- * This routine will also require a sig_prevent/sig_check_and_resume() -- */ ---- 291,293 ---- -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/pthread_init.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 pthread_init.c -*** pthread_init.c 1996/03/13 04:33:10 1.1.1.1 ---- pthread_init.c 1996/10/01 21:43:59 -*************** -*** 92,99 **** - pthread_initial->next = NULL; - pthread_initial->flags = 0; - pthread_initial->pll = NULL; -- pthread_initial->flags = 0; - pthread_initial->sll = NULL; - - /* Ugly errno hack */ - pthread_initial->error_p = &errno; ---- 92,103 ---- - pthread_initial->next = NULL; - pthread_initial->flags = 0; - pthread_initial->pll = NULL; - pthread_initial->sll = NULL; -+ -+ /* PTHREADS spec says we start with cancellability on and deferred */ -+ SET_PF_CANCEL_STATE(pthread_initial, PTHREAD_CANCEL_ENABLE); -+ SET_PF_CANCEL_TYPE(pthread_initial, PTHREAD_CANCEL_DEFERRED); -+ - - /* Ugly errno hack */ - pthread_initial->error_p = &errno; -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/pthread_join.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 pthread_join.c -*** pthread_join.c 1995/12/13 05:53:07 1.1.1.1 ---- pthread_join.c 1996/10/02 16:54:36 -*************** -*** 42,47 **** ---- 42,49 ---- - #include <pthread.h> - #include <errno.h> - -+ static int testDeadlock( struct pthread_queue *queue, pthread_t target ); -+ - /* ========================================================================== - * pthread_join() - */ -*************** -*** 51,56 **** ---- 53,64 ---- - - pthread_sched_prevent(); - -+ /* Ensure they gave us a legal pthread pointer */ -+ if( ! __pthread_is_valid( pthread ) ) { -+ pthread_sched_resume(); -+ return(EINVAL); -+ } -+ - /* Check that thread isn't detached already */ - if (pthread->attr.flags & PTHREAD_DETACHED) { - pthread_sched_resume(); -*************** -*** 62,81 **** - * Note: This must happen after checking detached state. - */ - if (pthread_queue_remove(&pthread_dead_queue, pthread) != OK) { -! pthread_queue_enq(&(pthread->join_queue), pthread_run); -! pthread_resched_resume(PS_JOIN); -! pthread_sched_prevent(); -! -! if (pthread_queue_remove(&pthread_dead_queue, pthread) == OK) { -! pthread_queue_enq(&pthread_alloc_queue, pthread); -! pthread->attr.flags |= PTHREAD_DETACHED; -! pthread->state = PS_UNALLOCED; -! if (thread_return) { -! *thread_return = pthread->ret; -! } -! ret = OK; - } else { -! ret = ESRCH; - } - } else { - /* Just get the return value and detach the thread */ ---- 70,98 ---- - * Note: This must happen after checking detached state. - */ - if (pthread_queue_remove(&pthread_dead_queue, pthread) != OK) { -! -! /* Before we pend on the join, ensure there is no dead lock */ -! -! if( testDeadlock( &pthread_run->join_queue, pthread ) == NOTOK ) { -! ret = EDEADLK; - } else { -! pthread_queue_enq(&(pthread->join_queue), pthread_run); -! SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ -! pthread_resched_resume(PS_JOIN); -! CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ -! pthread_sched_prevent(); -! -! if (pthread_queue_remove(&pthread_dead_queue, pthread) == OK) { -! pthread_queue_enq(&pthread_alloc_queue, pthread); -! pthread->attr.flags |= PTHREAD_DETACHED; -! pthread->state = PS_UNALLOCED; -! if (thread_return) { -! *thread_return = pthread->ret; -! } -! ret = OK; -! } else { -! ret = ESRCH; -! } - } - } else { - /* Just get the return value and detach the thread */ -*************** -*** 89,92 **** ---- 106,139 ---- - } - pthread_sched_resume(); - return(ret); -+ } -+ -+ /*---------------------------------------------------------------------- -+ * Function: testDeadlock -+ * Purpose: recursive queue walk to check for deadlocks -+ * Args: -+ * queue = the queue to walk -+ * pthread = target to scan for -+ * Returns: -+ * OK = no deadlock, NOTOK = deadlock -+ * Notes: -+ *----------------------------------------------------------------------*/ -+ static int -+ testDeadlock( struct pthread_queue *queue, pthread_t target ) -+ { -+ pthread_t t; -+ -+ if( queue == NULL ) -+ return OK; /* Empty queue, obviously ok */ -+ -+ for( t = queue->q_next; t; t = t->next ) { -+ if( t == target ) -+ return NOTOK; /* bang, your dead */ -+ -+ if( testDeadlock( &t->join_queue, target ) == NOTOK ) { -+ return NOTOK; -+ } -+ } -+ -+ return OK; /* No deadlock */ - } -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/select.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 select.c -*** select.c 1996/03/05 08:29:14 1.1.1.1 ---- select.c 1996/10/02 16:56:27 -*************** -*** 56,220 **** - int select(int numfds, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds, struct timeval *timeout) - { -! fd_set real_exceptfds, real_readfds, real_writefds; /* mapped fd_sets */ -! fd_set * real_readfds_p, * real_writefds_p, * real_exceptfds_p; -! fd_set read_locks, write_locks, rdwr_locks; -! struct timespec timeout_time, current_time; -! struct timeval zero_timeout = { 0, 0 }; -! int i, j, ret = 0, got_all_locks = 1; -! struct pthread_select_data data; -! -! if (numfds > dtablesize) { -! numfds = dtablesize; -! } -! -! data.nfds = 0; -! FD_ZERO(&data.readfds); -! FD_ZERO(&data.writefds); -! FD_ZERO(&data.exceptfds); - -! /* Do this first */ -! if (timeout) { - machdep_gettimeofday(¤t_time); -! timeout_time.tv_sec = current_time.tv_sec + timeout->tv_sec; -! if ((timeout_time.tv_nsec = current_time.tv_nsec + -! (timeout->tv_usec * 1000)) > 1000000000) { -! timeout_time.tv_nsec -= 1000000000; -! timeout_time.tv_sec++; -! } -! } -! -! FD_ZERO(&read_locks); -! FD_ZERO(&write_locks); -! FD_ZERO(&rdwr_locks); -! FD_ZERO(&real_readfds); -! FD_ZERO(&real_writefds); -! FD_ZERO(&real_exceptfds); -! -! /* lock readfds */ -! if (readfds || writefds || exceptfds) { -! for (i = 0; i < numfds; i++) { -! if ((readfds && (FD_ISSET(i, readfds))) || -! (exceptfds && FD_ISSET(i, exceptfds))) { -! if (writefds && FD_ISSET(i ,writefds)) { -! if ((ret = fd_lock(i, FD_RDWR, NULL)) != OK) { -! got_all_locks = 0; -! break; -! } -! FD_SET(i, &rdwr_locks); -! FD_SET(fd_table[i]->fd.i,&real_writefds); -! } else { -! if ((ret = fd_lock(i, FD_READ, NULL)) != OK) { -! got_all_locks = 0; -! break; -! } -! FD_SET(i, &read_locks); -! } -! if (readfds && FD_ISSET(i,readfds)) { -! FD_SET(fd_table[i]->fd.i, &real_readfds); -! } -! if (exceptfds && FD_ISSET(i,exceptfds)) { -! FD_SET(fd_table[i]->fd.i, &real_exceptfds); -! } -! if (fd_table[i]->fd.i >= data.nfds) { -! data.nfds = fd_table[i]->fd.i + 1; -! } -! } else { -! if (writefds && FD_ISSET(i, writefds)) { -! if ((ret = fd_lock(i, FD_WRITE, NULL)) != OK) { -! got_all_locks = 0; -! break; -! } -! FD_SET(i, &write_locks); -! FD_SET(fd_table[i]->fd.i,&real_writefds); -! } -! if (fd_table[i]->fd.i >= data.nfds) { -! data.nfds = fd_table[i]->fd.i + 1; -! } -! } -! } -! } -! -! if (got_all_locks) { -! -! memcpy(&data.readfds,&real_readfds,sizeof(fd_set)); -! memcpy(&data.writefds,&real_writefds,sizeof(fd_set)); -! memcpy(&data.exceptfds,&real_exceptfds,sizeof(fd_set)); -! -! real_readfds_p = (readfds == NULL) ? NULL : &real_readfds; -! real_writefds_p = (writefds == NULL) ? NULL : &real_writefds; -! real_exceptfds_p = (exceptfds == NULL) ? NULL : &real_exceptfds; -! -! if ((ret = machdep_sys_select(data.nfds, real_readfds_p, -! real_writefds_p, real_exceptfds_p, &zero_timeout)) == OK) { -! -! pthread_sched_prevent(); -! -! real_exceptfds_p = (exceptfds == NULL) ? NULL : &data.exceptfds; -! real_writefds_p = (writefds == NULL) ? NULL : &data.writefds; -! real_readfds_p = (readfds == NULL) ? NULL : &data.readfds; -! -! pthread_queue_enq(&fd_wait_select, pthread_run); -! pthread_run->data.select_data = &data; -! SET_PF_WAIT_EVENT(pthread_run); -! -! if (timeout) { -! machdep_gettimeofday(¤t_time); -! sleep_schedule(¤t_time, &timeout_time); -! -! pthread_resched_resume(PS_SELECT_WAIT); -! -! /* We're awake */ -! CLEAR_PF_DONE_EVENT(pthread_run); -! if (sleep_cancel(pthread_run) == NOTOK) { -! ret = OK; -! } else { -! ret = data.nfds; -! } -! } else { -! pthread_resched_resume(PS_SELECT_WAIT); -! CLEAR_PF_DONE_EVENT(pthread_run); -! ret = data.nfds; /* XXX ??? snl */ -! } -! } else if (ret < 0) { -! SET_ERRNO(-ret); -! ret = NOTOK; -! } -! } -! -! /* clean up the locks */ -! for (i = 0; i < numfds; i++) -! if (FD_ISSET(i,&read_locks)) fd_unlock(i,FD_READ); -! for (i = 0; i < numfds; i++) -! if (FD_ISSET(i,&rdwr_locks)) fd_unlock(i,FD_RDWR); -! for (i = 0; i < numfds; i++) -! if (FD_ISSET(i,&write_locks)) fd_unlock(i,FD_WRITE); -! -! if (ret > 0) { -! if (readfds != NULL) { -! for (i = 0; i < numfds; i++) { -! if (! (FD_ISSET(i,readfds) && -! FD_ISSET(fd_table[i]->fd.i,real_readfds_p))) -! FD_CLR(i,readfds); -! } -! } -! if (writefds != NULL) { -! for (i = 0; i < numfds; i++) -! if (! (FD_ISSET(i,writefds) && -! FD_ISSET(fd_table[i]->fd.i,real_writefds_p))) -! FD_CLR(i,writefds); -! } -! if (exceptfds != NULL) { -! for (i = 0; i < numfds; i++) -! if (! (FD_ISSET(i,exceptfds) && -! FD_ISSET(fd_table[i]->fd.i,real_exceptfds_p))) -! FD_CLR(i,exceptfds); -! } -! } else { -! if (exceptfds != NULL) FD_ZERO(exceptfds); -! if (writefds != NULL) FD_ZERO(writefds); -! if (readfds != NULL) FD_ZERO(readfds); - } - -! return(ret); - } ---- 56,223 ---- - int select(int numfds, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds, struct timeval *timeout) - { -! fd_set real_exceptfds, real_readfds, real_writefds; /* mapped fd_sets */ -! fd_set * real_readfds_p, * real_writefds_p, * real_exceptfds_p; -! fd_set read_locks, write_locks, rdwr_locks; -! struct timespec timeout_time, current_time; -! struct timeval zero_timeout = { 0, 0 }; -! int i, j, ret = 0, got_all_locks = 1; -! struct pthread_select_data data; -! -! if (numfds > dtablesize) { -! numfds = dtablesize; -! } -! -! data.nfds = 0; -! FD_ZERO(&data.readfds); -! FD_ZERO(&data.writefds); -! FD_ZERO(&data.exceptfds); -! -! /* Do this first */ -! if (timeout) { -! machdep_gettimeofday(¤t_time); -! timeout_time.tv_sec = current_time.tv_sec + timeout->tv_sec; -! if ((timeout_time.tv_nsec = current_time.tv_nsec + -! (timeout->tv_usec * 1000)) > 1000000000) { -! timeout_time.tv_nsec -= 1000000000; -! timeout_time.tv_sec++; -! } -! } -! -! FD_ZERO(&read_locks); -! FD_ZERO(&write_locks); -! FD_ZERO(&rdwr_locks); -! FD_ZERO(&real_readfds); -! FD_ZERO(&real_writefds); -! FD_ZERO(&real_exceptfds); -! -! /* lock readfds */ -! if (readfds || writefds || exceptfds) { -! for (i = 0; i < numfds; i++) { -! if ((readfds && (FD_ISSET(i, readfds))) || -! (exceptfds && FD_ISSET(i, exceptfds))) { -! if (writefds && FD_ISSET(i ,writefds)) { -! if ((ret = fd_lock(i, FD_RDWR, NULL)) != OK) { -! got_all_locks = 0; -! break; -! } -! FD_SET(i, &rdwr_locks); -! FD_SET(fd_table[i]->fd.i,&real_writefds); -! } else { -! if ((ret = fd_lock(i, FD_READ, NULL)) != OK) { -! got_all_locks = 0; -! break; -! } -! FD_SET(i, &read_locks); -! } -! if (readfds && FD_ISSET(i,readfds)) { -! FD_SET(fd_table[i]->fd.i, &real_readfds); -! } -! if (exceptfds && FD_ISSET(i,exceptfds)) { -! FD_SET(fd_table[i]->fd.i, &real_exceptfds); -! } -! if (fd_table[i]->fd.i >= data.nfds) { -! data.nfds = fd_table[i]->fd.i + 1; -! } -! } else { -! if (writefds && FD_ISSET(i, writefds)) { -! if ((ret = fd_lock(i, FD_WRITE, NULL)) != OK) { -! got_all_locks = 0; -! break; -! } -! FD_SET(i, &write_locks); -! FD_SET(fd_table[i]->fd.i,&real_writefds); -! if (fd_table[i]->fd.i >= data.nfds) { -! data.nfds = fd_table[i]->fd.i + 1; -! } -! } -! } -! } -! } -! -! if (got_all_locks) { -! memcpy(&data.readfds,&real_readfds,sizeof(fd_set)); -! memcpy(&data.writefds,&real_writefds,sizeof(fd_set)); -! memcpy(&data.exceptfds,&real_exceptfds,sizeof(fd_set)); -! -! real_readfds_p = (readfds == NULL) ? NULL : &real_readfds; -! real_writefds_p = (writefds == NULL) ? NULL : &real_writefds; -! real_exceptfds_p = (exceptfds == NULL) ? NULL : &real_exceptfds; -! -! if ((ret = machdep_sys_select(data.nfds, real_readfds_p, -! real_writefds_p, real_exceptfds_p, -! &zero_timeout)) == OK) { -! pthread_sched_prevent(); -! -! real_exceptfds_p = (exceptfds == NULL) ? NULL : &data.exceptfds; -! real_writefds_p = (writefds == NULL) ? NULL : &data.writefds; -! real_readfds_p = (readfds == NULL) ? NULL : &data.readfds; -! -! pthread_queue_enq(&fd_wait_select, pthread_run); -! pthread_run->data.select_data = &data; -! SET_PF_WAIT_EVENT(pthread_run); - -! if (timeout) { - machdep_gettimeofday(¤t_time); -! sleep_schedule(¤t_time, &timeout_time); -! -! SET_PF_AT_CANCEL_POINT(pthread_run); -! pthread_resched_resume(PS_SELECT_WAIT); -! CLEAR_PF_AT_CANCEL_POINT(pthread_run); -! -! /* We're awake */ -! CLEAR_PF_DONE_EVENT(pthread_run); -! if (sleep_cancel(pthread_run) == NOTOK) { -! ret = OK; -! } else { -! ret = data.nfds; -! } -! } else { -! SET_PF_AT_CANCEL_POINT(pthread_run); -! pthread_resched_resume(PS_SELECT_WAIT); -! CLEAR_PF_AT_CANCEL_POINT(pthread_run); -! CLEAR_PF_DONE_EVENT(pthread_run); -! ret = data.nfds; /* XXX ??? snl */ -! } -! } else if (ret < 0) { -! SET_ERRNO(-ret); -! ret = NOTOK; -! } -! } -! -! /* clean up the locks */ -! for (i = 0; i < numfds; i++) -! if (FD_ISSET(i,&read_locks)) fd_unlock(i,FD_READ); -! for (i = 0; i < numfds; i++) -! if (FD_ISSET(i,&rdwr_locks)) fd_unlock(i,FD_RDWR); -! for (i = 0; i < numfds; i++) -! if (FD_ISSET(i,&write_locks)) fd_unlock(i,FD_WRITE); -! -! if (ret > 0) { -! if (readfds != NULL) { -! for (i = 0; i < numfds; i++) { -! if (! (FD_ISSET(i,readfds) && -! FD_ISSET(fd_table[i]->fd.i,real_readfds_p))) -! FD_CLR(i,readfds); -! } -! } -! if (writefds != NULL) { -! for (i = 0; i < numfds; i++) -! if (! (FD_ISSET(i,writefds) && -! FD_ISSET(fd_table[i]->fd.i,real_writefds_p))) -! FD_CLR(i,writefds); -! } -! if (exceptfds != NULL) { -! for (i = 0; i < numfds; i++) -! if (! (FD_ISSET(i,exceptfds) && -! FD_ISSET(fd_table[i]->fd.i,real_exceptfds_p))) -! FD_CLR(i,exceptfds); - } -+ } else { -+ if (exceptfds != NULL) FD_ZERO(exceptfds); -+ if (writefds != NULL) FD_ZERO(writefds); -+ if (readfds != NULL) FD_ZERO(readfds); -+ } - -! return(ret); - } -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/sig.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 sig.c -*** sig.c 1996/03/13 04:33:13 1.1.1.1 ---- sig.c 1996/10/03 01:07:54 -*************** -*** 301,307 **** ---- 301,310 ---- - pthread_run->data.sigwait = set; - pthread_run->ret = sig; - -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - pthread_resched_resume(PS_SIGWAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ -+ - return(OK); - } - -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/signal.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 signal.c -*** signal.c 1996/03/13 04:33:17 1.1.1.1 ---- signal.c 1996/10/03 17:30:16 -*************** -*** 72,77 **** ---- 72,78 ---- - - static void sig_handler(int signal); - static void set_thread_timer(); -+ static void __cleanup_after_resume( void ); - void sig_prevent(void); - void sig_resume(void); - -*************** -*** 482,502 **** - } - } - -! /* Only bother if we are truly unlocking the kernel */ -! while (!(--pthread_kernel_lock)) { -! if (sig_to_process) { -! /* if (SIG_ANY(sig_to_process)) { */ -! pthread_kernel_lock++; -! sig_handler(0); -! continue; -! } -! if (pthread_run && pthread_run->sigcount) { -! pthread_kernel_lock++; -! pthread_sig_process(); -! continue; -! } -! break; -! } - } - - /* ========================================================================== ---- 483,489 ---- - } - } - -! __cleanup_after_resume(); - } - - /* ========================================================================== -*************** -*** 508,530 **** - void pthread_resched_resume(enum pthread_state state) - { - pthread_run->state = state; -- sig_handler(SIGVTALRM); - -! /* Only bother if we are truely unlocking the kernel */ -! while (!(--pthread_kernel_lock)) { -! if (sig_to_process) { -! /* if (SIG_ANY(sig_to_process)) { */ -! pthread_kernel_lock++; -! sig_handler(0); -! continue; -! } -! if (pthread_run && pthread_run->sigcount) { -! pthread_kernel_lock++; -! pthread_sig_process(); -! continue; -! } -! break; - } - } - - /* ========================================================================== ---- 495,523 ---- - void pthread_resched_resume(enum pthread_state state) - { - pthread_run->state = state; - -! /* Since we are about to block this thread, lets see if we are -! * at a cancel point and if we've been cancelled. -! * Avoid cancelling dead or unalloced threads. -! */ -! if( ! TEST_PF_RUNNING_TO_CANCEL(pthread_run) && -! TEST_PTHREAD_IS_CANCELLABLE(pthread_run) && -! state != PS_DEAD && state != PS_UNALLOCED ) { -! -! /* Set this flag to avoid recursively calling pthread_exit */ -! /* We have to set this flag here because we will unlock the -! * kernel prior to calling pthread_cancel_internal. -! */ -! SET_PF_RUNNING_TO_CANCEL(pthread_run); -! -! pthread_run->old_state = state; /* unlock needs this data */ -! pthread_sched_resume(); /* Unlock kernel before cancel */ -! pthread_cancel_internal( 1 ); /* free locks and exit */ - } -+ -+ sig_handler(SIGVTALRM); -+ -+ __cleanup_after_resume(); - } - - /* ========================================================================== -*************** -*** 532,537 **** ---- 525,543 ---- - */ - void pthread_sched_resume() - { -+ __cleanup_after_resume(); -+ } -+ -+ /*---------------------------------------------------------------------- -+ * Function: __cleanup_after_resume -+ * Purpose: cleanup kernel locks after a resume -+ * Args: void -+ * Returns: void -+ * Notes: -+ *----------------------------------------------------------------------*/ -+ static void -+ __cleanup_after_resume( void ) -+ { - /* Only bother if we are truely unlocking the kernel */ - while (!(--pthread_kernel_lock)) { - /* if (SIG_ANY(sig_to_process)) { */ -*************** -*** 546,551 **** ---- 552,568 ---- - continue; - } - break; -+ } -+ -+ if( pthread_run == NULL ) -+ return; /* Must be during init processing */ -+ -+ /* Test for cancel that should be handled now */ -+ -+ if( ! TEST_PF_RUNNING_TO_CANCEL(pthread_run) && -+ TEST_PTHREAD_IS_CANCELLABLE(pthread_run) ) { -+ /* Kernel is already unlocked */ -+ pthread_cancel_internal( 1 ); /* free locks and exit */ - } - } - -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/sleep.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 sleep.c -*** sleep.c 1996/03/11 08:33:32 1.1.1.1 ---- sleep.c 1996/10/03 01:14:58 -*************** -*** 249,255 **** ---- 249,257 ---- - - /* Reschedule thread */ - SET_PF_WAIT_EVENT(pthread_run); -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - pthread_resched_resume(PS_SLEEP_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ - CLEAR_PF_DONE_EVENT(pthread_run); - - /* Return actual time slept */ -*************** -*** 332,338 **** - current_time.tv_sec++; - } - machdep_start_timer(&(current_time), -! &(pthread_sleep->wakeup_time)); - } - } else { - for (pthread_last = pthread_sleep; pthread_last; ---- 334,340 ---- - current_time.tv_sec++; - } - machdep_start_timer(&(current_time), -! &(pthread_sleep->wakeup_time)); - } - } else { - for (pthread_last = pthread_sleep; pthread_last; -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/stat.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 stat.c -*** stat.c 1995/09/21 02:36:05 1.1.1.1 ---- stat.c 1996/06/04 19:17:33 -*************** -*** 43,48 **** ---- 43,49 ---- - #include <errno.h> - - struct stat; -+ struct statfs; - - /* ========================================================================== - * fstat() -*************** -*** 91,95 **** ---- 92,115 ---- - } - return(ret); - -+ } -+ -+ /* ========================================================================== -+ * fstatfs() -+ * -+ * Might want to indirect this. -+ */ -+ int fstatfs(int fd, struct statfs *buf) -+ { -+ int ret; -+ -+ if ((ret = fd_lock(fd, FD_READ, NULL)) == OK) { -+ if ((ret = machdep_sys_fstatfs(fd_table[fd]->fd.i, buf)) < OK) { -+ SET_ERRNO(-ret); -+ ret = NOTOK; -+ } -+ fd_unlock(fd, FD_READ); -+ } -+ return(ret); - } - -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/wait.c,v retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 wait.c -*** wait.c 1995/02/21 08:07:24 1.1.1.1 ---- wait.c 1996/10/03 01:20:02 -*************** -*** 103,109 **** ---- 103,111 ---- - pthread_queue_enq(&wait_queue, pthread_run); - - /* reschedule unlocks scheduler */ -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - pthread_resched_resume(PS_WAIT_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ - - pthread_sched_prevent(); - } -*************** -*** 126,132 **** ---- 128,136 ---- - pthread_queue_enq(&wait_queue, pthread_run); - - /* reschedule unlocks scheduler */ -+ SET_PF_AT_CANCEL_POINT(pthread_run); /* This is a cancel point */ - pthread_resched_resume(PS_WAIT_WAIT); -+ CLEAR_PF_AT_CANCEL_POINT(pthread_run); /* No longer at cancel point */ - - pthread_sched_prevent(); - } -<pre><font size=-1> diff --git a/mit-pthreads/patches/Streepy2.html b/mit-pthreads/patches/Streepy2.html deleted file mode 100755 index 80d44d6440c..00000000000 --- a/mit-pthreads/patches/Streepy2.html +++ /dev/null @@ -1,93 +0,0 @@ -<html> -<head> - <title>Diffs on diffs :-) by Larry V. Streepy, Jr.</title> - <base target=_top> - <meta name="GENERATOR" content="FindMail Communications"> - <meta name="Date" content="Monday, October 07, 1996 02:03 PM PST"> - <meta name="Author" content="Larry V. Streepy, Jr."> -</head> -<body background="/gifs/betafm.gif" bgcolor="#ffffff" text="#000000" link="#0000ee" vlink="#ff0000" alink="#000099"> -<h3>Diffs on diffs :-)</h3> -Larry V. Streepy, Jr. (<a href="mailto.html?mid=2079859748&num=398" target="_top">@healthcare.com</a>)<br>Monday, October 07, 1996 02:03 PM PST<br> -<p> -This is a multi-part message in MIME format.<p> ---------------65BE18E23639BCDD7BE55F7F <br> -Content-Type: text/plain; charset=us-ascii <br> -Content-Transfer-Encoding: 7bit<p> -Unfortunately, there are a couple of bugs in my pthread_cancel support (no, say it isn't so :-)<p> -Oh well, I cam across a couple of cases that I missed in my testing last week. Here are the bugs:<p> -1. If a thread calls pthread_testcancel during it's cleanup processing after being cancelled, the pthread kernel would hang.<p> -2. I didn't realize that threads in PS_SLEEP_WAIT state are *NOT* on any queue, they are handled using a linked list. So, when cancelling a thread that was sleeping, a PANIC() I put in possiblymakeRunnable would go off.<p> -Both of these are fixed. The diffs are attached.<br> --- <br> -Larry V. Streepy, Jr. <br> -Chief Technical Officer, Healthcare Communications, Inc. mailto:<a href="mailto.html?mid=2079859748&num=398" target="_top">@healthcare.com</a> <br> -(214) 851-7033 (Dallas Main #) <br> -(970) 626-5028 (My office #) (970) 626-4425 (Fax)<p> ---------------65BE18E23639BCDD7BE55F7F <br> -Content-Type: text/plain; charset=us-ascii; name="cancel.diffs" Content-Transfer-Encoding: 7bit <br> -Content-Disposition: inline; filename="cancel.diffs"<p> -Index: pthread_cancel.c<br> -=================================================================== RCS file: /usr/cvssrc/pthreads-1_60_beta5/pthreads/pthread_cancel.c,v retrieving revision 1.1 <br> -diff -c -r1.1 pthread_cancel.c<br> -*** pthread_cancel.c 1996/10/06 00:31:27 1.1<br> ---- pthread_cancel.c 1996/10/07 18:33:27<br> -***************<br> -*** 187,192 ****<br> ---- 187,197 ----<br> - return; /* Can't be cancelled */<br> - }<br> - <br> -+ /* Ensure that we aren't in the process of exiting already */<br> -+ if( TEST_PF_RUNNING_TO_CANCEL(pthread_run) ) {<br> -+ return;<br> -+ }<br> -+ <br> - /* See if we have been cancelled */<br> - if( TEST_PF_CANCELLED(pthread_run) ) {<br> - /* Set this flag to avoid recursively calling pthread_exit */<br> -***************<br> -*** 266,277 ****<br> - if( pthread->state == PS_RUNNING )<br> - return; /* will happen at context switch */<br> - <br> -! /* Otherwise, we need to take it off the queue and make it runnable */<br> -! if( pthread->queue == NULL ) {<br> -! PANIC(); /* Must be on a queue */<br> -! }<br> - <br> -- pthread_queue_remove(pthread->queue, pthread);<br> - pthread_prio_queue_enq(pthread_current_prio_queue, pthread);<br> - pthread->old_state = pthread->state;<br> - pthread->state = PS_RUNNING;<br> ---- 271,291 ----<br> - if( pthread->state == PS_RUNNING )<br> - return; /* will happen at context switch */<br> - <br> -! /* If the thread is sleeping, the it isn't on a queue. */<br> -! if( pthread->state == PS_SLEEP_WAIT ) {<br> -! sleep_cancel( pthread ); /* Remove from sleep list */<br> -! } else {<br> -! /* Otherwise, we need to take it off the queue and make it runnable */<br> -! <br> -! if( pthread->queue == NULL ) {<br> -! PANIC(); /* Must be on a queue */<br> -! }<br> -! <br> -! pthread_queue_remove(pthread->queue, pthread);<br> -! }<br> -! <br> -! /* And make it runnable */<br> - <br> - pthread_prio_queue_enq(pthread_current_prio_queue, pthread);<br> - pthread->old_state = pthread->state;<br> - pthread->state = PS_RUNNING;<p> -<pre><font size=-1> ---------------65BE18E23639BCDD7BE55F7F-- - -</pre><p></pre> -<hr> -<a href="http://www.findmail.com/" target="_top"><font size=-1>Powered by FindMail Communications</font><br></a> -<br>Please email comments and suggestions to:<a href="/cgi-bin/comments.py" target="_top">comments@findmail.com</a> -<br><font size=-3 color="#ffffff">xmlarchive</font> -</body></html>
\ No newline at end of file diff --git a/mit-pthreads/patches/bill_lear b/mit-pthreads/patches/bill_lear deleted file mode 100755 index f49b79c4272..00000000000 --- a/mit-pthreads/patches/bill_lear +++ /dev/null @@ -1,70 +0,0 @@ -From rael@dejanews.com Wed Jan 29 06:06:14 1997 -X-VM-v5-Data: ([nil nil nil t nil nil nil nil nil] - ["1497" "Tue" "28" "January" "1997" "21:52:57" "-0600" "William S. Lear" "rael@dejanews.com" "<199701290352.VAA08678@homer.dejanews.com>" "53" "Patches for linux2.0" "^From:" nil nil "1" "1997012903:52:57" "Patches for linux2.0" nil nil] - nil) -Received: from MIT.EDU (PACIFIC-CARRIER-ANNEX.MIT.EDU [18.69.0.28]) - by analytik.analytikerna.se (8.8.4/8.8.4) with SMTP - id GAA23245 for <monty@analytikerna.se>; Wed, 29 Jan 1997 06:06:12 +0100 (MET) -Received: from host-205-238-143-2.dejanews.com by MIT.EDU with SMTP - id AA25254; Tue, 28 Jan 97 22:53:08 EST -Received: (from rael@localhost) by homer.dejanews.com (8.7.6/8.6.12) id VAA08678 for pthreads@mit.edu; Tue, 28 Jan 1997 21:52:57 -0600 (CST) -Message-Id: <199701290352.VAA08678@homer.dejanews.com> -Content-Length: 1496 -From: "William S. Lear" <rael@dejanews.com> -To: pthreads@MIT.EDU -Subject: Patches for linux2.0 -Date: Tue, 28 Jan 1997 21:52:57 -0600 (CST) - - -The following are some patches I found necessary to run smoothly -under linux2.0. The PTEST directory below refers to the original -pthreads 1.60 beta 6 release. Of course, the '-O2' "fix" is not strictly -needed. - -#============================================================ -# < pthreads-1_60beta6/config/configure -# > PTEST/pthreads-1_60beta6/config/configure -#------------------------------------------------------------ -642c642 -< CFLAGS="-g -O2" ---- -> CFLAGS="-g -O" -1104,1106d1103 -< cat >> confdefs.h <<EOF -< #define BSD_TM 1 -< EOF - -# Diff for: -#============================================================ -# < pthreads-1_60beta6/config/config.h.in -# > PTEST/pthreads-1_60beta6/config/config.h.in -#------------------------------------------------------------ -3,8d2 -< /* Does the OS have tm needing bsd'ish initialization? */ -< #undef BSD_TM -< -< /* Does the OS already support struct timespec */ -< #undef _OS_HAS_TIMESPEC -< - -# Diff for: -#============================================================ -# < pthreads-1_60beta6/gen/ctime.c -# > PTEST/pthreads-1_60beta6/gen/ctime.c -#------------------------------------------------------------ -49c49 -< #include "config.h" ---- -> - -# Diff for: -#============================================================ -# < pthreads-1_60beta6/include/math.h -# > PTEST/pthreads-1_60beta6/include/math.h -#------------------------------------------------------------ -54d53 -< double hypot __P((double, double)); - - -Bill Lear (rael@dejanews.com) - diff --git a/mit-pthreads/patches/chris_demetriou b/mit-pthreads/patches/chris_demetriou deleted file mode 100755 index 283d6c1999c..00000000000 --- a/mit-pthreads/patches/chris_demetriou +++ /dev/null @@ -1,149 +0,0 @@ -From cgd@pa.dec.com Fri Aug 15 04:22:21 1997 -X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil] - ["3982" "Thu" "14" "August" "1997" "18:57:55" "-0700" "Chris G. Demetriou" "cgd@pa.dec.com" "<15218.871610275@dnaunix.pa.dec.com>" "126" "patches to get 1.60 beta6 to build on ELF NetBSD/alpha systems" "^From:" nil nil "8" "1997081501:57:55" "patches to get 1.60 beta6 to build on ELF NetBSD/alpha systems" nil nil] - nil) -Received: from MIT.EDU (PACIFIC-CARRIER-ANNEX.MIT.EDU [18.69.0.28]) - by analytik.analytikerna.se (8.8.4/8.8.4) with SMTP - id EAA10207 for <monty@analytikerna.se>; Fri, 15 Aug 1997 04:22:19 +0200 (MET DST) -Received: from mail2.digital.com by MIT.EDU with SMTP - id AA13470; Thu, 14 Aug 97 22:01:37 EDT -Received: from dnaunix.pa.dec.com (dnaunix.pa.dec.com [16.4.208.21]) - by mail2.digital.com (8.7.5/UNX 1.5/1.0/WV) with SMTP id SAA15366; - Thu, 14 Aug 1997 18:58:16 -0700 (PDT) -Received: by dnaunix.pa.dec.com; id AA15044; Thu, 14 Aug 1997 18:57:56 -0700 -Message-Id: <15218.871610275@dnaunix.pa.dec.com> -X-Mts: smtp -Content-Length: 3981 -From: "Chris G. Demetriou" <cgd@pa.dec.com> -Sender: cgd@pa.dec.com -To: pthreads-bugs@MIT.EDU -Cc: "Chris G. Demetriou" <cgd@pa.dec.com>, pthreads@MIT.EDU -Subject: patches to get 1.60 beta6 to build on ELF NetBSD/alpha systems -Date: Thu, 14 Aug 97 18:57:55 -0700 - -Enclosed below are patches to pthreads 1.60 beta6 to build on -current NetBSD/alpha systems (which use ELF). With these patches, -pthreads passes 'make check.' - -As an aside, the test_switch test generates _340k_ of output ("a" -for a while, then "ab" for a while) when run one the machine I was -testing on. In my opinion, that's a ... bit excessive, especially -since 'make check' has to be run interactively! - - - -chris -============================================================================ -diff -rc pthreads-1_60_beta6.orig/config/Makefile.in pthreads-1_60_beta6/config/Makefile.in -*** pthreads-1_60_beta6.orig/config/Makefile.in Thu Mar 21 20:29:54 1996 ---- pthreads-1_60_beta6/config/Makefile.in Thu Aug 14 17:56:55 1997 -*************** -*** 29,35 **** - # pathname for srcdir here, and live with it. - srcdir = $(srctop) - -! beforeinstall:: install-dirs - - .include "${srcdir}/pthreads/Makefile.inc" - .include "${srcdir}/stdlib/Makefile.inc" ---- 29,35 ---- - # pathname for srcdir here, and live with it. - srcdir = $(srctop) - -! beforeinstall: install-dirs - - .include "${srcdir}/pthreads/Makefile.inc" - .include "${srcdir}/stdlib/Makefile.inc" -diff -rc pthreads-1_60_beta6.orig/machdep/syscall-alpha-netbsd-1.1.S pthreads-1_60_beta6/machdep/syscall-alpha-netbsd-1.1.S -*** pthreads-1_60_beta6.orig/machdep/syscall-alpha-netbsd-1.1.S Wed Nov 13 13:03:28 1996 ---- pthreads-1_60_beta6/machdep/syscall-alpha-netbsd-1.1.S Thu Aug 14 18:03:27 1997 -*************** -*** 35,54 **** - .frame sp,0,ra ;\ - ldiq v0, CONCAT(SYS_,x) ;\ - CHMK() ;\ -! beq a3, 2f ;\ -! br gp, 1f ;\ -! 1: ;\ - /* Load gp so we can find cerror to jump to. */;\ - ldgp gp, 0(gp) ;\ -! jmp zero, machdep_cerror ;\ -! 2: - - #define XSYSCALL(x) SYSCALL(x) ; RET ; .end CONCAT(machdep_sys_,x) - - .globl machdep_cerror - machdep_cerror: -! br t0, 1f -! 1: - ldgp gp, 0(t0) - stl v0, errno - #if 0 ---- 35,54 ---- - .frame sp,0,ra ;\ - ldiq v0, CONCAT(SYS_,x) ;\ - CHMK() ;\ -! beq a3, CONCAT(Lsys_noerr_,x) ;\ -! br gp, CONCAT(Lsys_err_,x) ;\ -! CONCAT(Lsys_err_,x): ;\ - /* Load gp so we can find cerror to jump to. */;\ - ldgp gp, 0(gp) ;\ -! jmp zero, machdep_cerror ;\ -! CONCAT(Lsys_noerr_,x): - - #define XSYSCALL(x) SYSCALL(x) ; RET ; .end CONCAT(machdep_sys_,x) - - .globl machdep_cerror - machdep_cerror: -! br t0, Lmachdep_cerror_setgp -! Lmachdep_cerror_setgp: - ldgp gp, 0(t0) - stl v0, errno - #if 0 -diff -rc pthreads-1_60_beta6.orig/machdep/syscall-template-alpha-netbsd-1.1.S pthreads-1_60_beta6/machdep/syscall-template-alpha-netbsd-1.1.S -*** pthreads-1_60_beta6.orig/machdep/syscall-template-alpha-netbsd-1.1.S Mon Apr 22 23:15:42 1996 ---- pthreads-1_60_beta6/machdep/syscall-template-alpha-netbsd-1.1.S Thu Aug 14 17:58:14 1997 -*************** -*** 31,43 **** - .frame sp,0,ra ;\ - ldiq v0, SYS_##x ;\ - CHMK() ;\ -! beq a3, 2f ;\ -! br gp, 1f ;\ -! 1: ;\ - /* Load gp so we can find cerror to jump to. */;\ - ldgp gp, 0(gp) ;\ -! jmp zero, machdep_cerror ;\ -! 2: - - #define SIMPLE_SYSCALL(x) SYSCALL(x) ; ret ; .end machdep_sys_##x - ---- 31,43 ---- - .frame sp,0,ra ;\ - ldiq v0, SYS_##x ;\ - CHMK() ;\ -! beq a3, Lsys_noerr_##x ;\ -! br gp, Lsys_err_##x ;\ -! Lsys_err_##x: ;\ - /* Load gp so we can find cerror to jump to. */;\ - ldgp gp, 0(gp) ;\ -! jmp zero, machdep_cerror ;\ -! Lsys_noerr_##x: - - #define SIMPLE_SYSCALL(x) SYSCALL(x) ; ret ; .end machdep_sys_##x - -diff -rc pthreads-1_60_beta6.orig/pthreads/process.c pthreads-1_60_beta6/pthreads/process.c -*** pthreads-1_60_beta6.orig/pthreads/process.c Tue Nov 12 05:45:16 1996 ---- pthreads-1_60_beta6/pthreads/process.c Thu Aug 14 18:12:49 1997 -*************** -*** 40,45 **** ---- 40,47 ---- - #include <stdarg.h> - #include <unistd.h> - -+ extern void *alloca(); -+ - #ifndef lint - static const char rcsid[] = "$Id$"; - #endif - diff --git a/mit-pthreads/patches/mevans b/mit-pthreads/patches/mevans deleted file mode 100755 index d5ff2f27610..00000000000 --- a/mit-pthreads/patches/mevans +++ /dev/null @@ -1,642 +0,0 @@ -=A0 -Attached are several patches for pthreads-1_60_beta6. The patches fall -into 3 catagories: - - 1. Crashes and hangs. - 2. Missing functionality (namely flock()) - 3. Use of POSIX reentrant safe routines. - -Most of the patches contain a comment as to why the change was made. -The one major exception is to fd_kern.c at line 257 (unpatched). The -change to that line is to fix a "hang" that prevents threads for -scheduling for an hour if there is no external I/O event. - -I also include patches that modify several functions to use POSIX -reentrant safe routines. I know that MIT pthreads implements routine -like gethostbyname in a thread safe manner, but we're pretty, um, anal -about trying to keep our code as portable as possible. By excluding -using routines that are not reentrant safe according to the PTHREAD -safe, it's easy for us to stub out the unsafe routines and catch -non-compliant code. I almost left these patches out, but I'm hoping -they'll be adopted. :-) - -WARNING: None of the MIT pthreads routines that convert floats/doubles -between their native forms and strings are thread safe! (i.e printf, -sprintf, fprintf, atod, strtod, etc) I have replacements, but I need to -check with the author of the replacements and my employer. - -Mark Evans - -------------69CDAAF52A3566916F8ED01A0 -Content-Disposition: inline; filename="pthreads-1_60_beta6.patch" -Content-Type: text/plain; charset=us-ascii; name="pthreads-1_60_beta6.patch" -Content-Transfer-Encoding: 7bit - -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/config/config.h.in pthreads-1_60_beta6+/config/config.h.in -*** pthreads-1_60_beta6/config/config.h.in Thu Mar 21 21:30:04 1996 ---- pthreads-1_60_beta6+/config/config.h.in Sat Mar 15 14:08:55 1997 -*************** -*** 137,142 **** ---- 137,145 ---- - /* Define if you have the syscall_ftruncate function. */ - #undef HAVE_SYSCALL_FTRUNCATE - -+ /* Define if you have the syscall_flock function. */ -+ #undef HAVE_SYSCALL_FLOCK -+ - /* Define if you have the syscall_getdents function. */ - #undef HAVE_SYSCALL_GETDENTS - -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/config/configure.in pthreads-1_60_beta6+/config/configure.in -*** pthreads-1_60_beta6/config/configure.in Wed Nov 13 14:03:08 1996 ---- pthreads-1_60_beta6+/config/configure.in Sat Mar 15 14:08:55 1997 -*************** -*** 241,247 **** - - PTHREADS_CHECK_SYSCALLS(open write read creat close fcntl lseek dup2 dup pipe - fchmod fchown execve fstat lstat link unlink chdir chown chmod stat -! rename select getdtablesize ioctl ftruncate - dnl - signals - sigsuspend sigaction sigpause sigprocmask ksigaction - dnl - directory reading ---- 241,247 ---- - - PTHREADS_CHECK_SYSCALLS(open write read creat close fcntl lseek dup2 dup pipe - fchmod fchown execve fstat lstat link unlink chdir chown chmod stat -! rename select getdtablesize ioctl ftruncate flock - dnl - signals - sigsuspend sigaction sigpause sigprocmask ksigaction - dnl - directory reading -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/gen/directory.c pthreads-1_60_beta6+/gen/directory.c -*** pthreads-1_60_beta6/gen/directory.c Sat May 20 10:55:34 1995 ---- pthreads-1_60_beta6+/gen/directory.c Sat Mar 15 14:08:55 1997 -*************** -*** 251,262 **** ---- 251,266 ---- - /* - * Seek to an entry in a directory. - * _seekdir is in telldir.c so that it can share opaque data structures. -+ * -+ * Use the POSIX reentrant safe readdir_r to simplify varifying POSIX -+ * thread-safe compliance. - */ - void seekdir(DIR * dirp, long loc) - { - register struct ddloc ** prevlp; - register struct ddloc * lp; - struct dirent * dp; -+ struct dirent de; - - pthread_mutex_lock (dirp->dd_lock); - prevlp = (struct ddloc **)&(dirp->dd_ddloc); -*************** -*** 277,283 **** - dirp->dd_seek = lp->loc_seek; - dirp->dd_loc = 0; - while (dirp->dd_loc < lp->loc_loc) { -! if (!(dp = readdir(dirp))) { - *prevlp = lp->loc_next; - break; - } ---- 281,287 ---- - dirp->dd_seek = lp->loc_seek; - dirp->dd_loc = 0; - while (dirp->dd_loc < lp->loc_loc) { -! if (readdir_r(dirp, &de, &dp)) { - *prevlp = lp->loc_next; - break; - } -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/gen/getcwd.c pthreads-1_60_beta6+/gen/getcwd.c -*** pthreads-1_60_beta6/gen/getcwd.c Sat Sep 2 17:39:30 1995 ---- pthreads-1_60_beta6+/gen/getcwd.c Sat Mar 15 14:08:55 1997 -*************** -*** 50,67 **** - (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \ - dp->d_name[1] == '.' && dp->d_name[2] == '\0')) - - char * - getcwd(pt, size) - char *pt; - size_t size; - { -- register struct dirent *dp; - register DIR *dir; - register dev_t dev; - register ino_t ino; - register int first; - register char *bpt, *bup; - struct stat s; - dev_t root_dev; - ino_t root_ino; - size_t ptsize, upsize; ---- 50,71 ---- - (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \ - dp->d_name[1] == '.' && dp->d_name[2] == '\0')) - -+ /* Only use reentrant safe routines to simplify varifying POSIX thread-safe -+ * compliance. (mevans). -+ */ - char * - getcwd(pt, size) - char *pt; - size_t size; - { - register DIR *dir; - register dev_t dev; - register ino_t ino; - register int first; - register char *bpt, *bup; - struct stat s; -+ struct dirent *dp; -+ struct dirent de; - dev_t root_dev; - ino_t root_ino; - size_t ptsize, upsize; -*************** -*** 166,179 **** - save_errno = 0; - if (s.st_dev == dev) { - for (;;) { -! if (!(dp = readdir(dir))) - goto notfound; - if (dp->d_fileno == ino) - break; - } - } else - for (;;) { -! if (!(dp = readdir(dir))) - goto notfound; - if (ISDOT(dp)) - continue; ---- 170,183 ---- - save_errno = 0; - if (s.st_dev == dev) { - for (;;) { -! if (readdir_r(dir, &de, &dp)) - goto notfound; - if (dp->d_fileno == ino) - break; - } - } else - for (;;) { -! if (readdir_r(dir, &de, &dp)) - goto notfound; - if (ISDOT(dp)) - continue; -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/include/syslog.h pthreads-1_60_beta6+/include/syslog.h -*** pthreads-1_60_beta6/include/syslog.h Mon Sep 26 21:26:29 1994 ---- pthreads-1_60_beta6+/include/syslog.h Sat Mar 15 14:08:56 1997 -*************** -*** 9,14 **** ---- 9,16 ---- - #ifndef SYSLOG_H - #define SYSLOG_H - -+ /* Added __[BEGIN/END]_DECLS so this file would work with C++. (mevans) */ -+ #include <sys/cdefs.h> - #include <stdarg.h> - - /* Discipline: openlog(), closelog(), and setlogmask() are not thread-safe -*************** -*** 84,95 **** ---- 86,101 ---- - #define LOG_NDELAY 0x08 /* don't delay open */ - #define LOG_NOWAIT 0x10 /* if forking to log on console, don't wait() */ - -+ __BEGIN_DECLS -+ - /* Syslogging functions. */ - void syslog(int pri, char *fmt, ...); - void vsyslog(int pri, char *fmt, va_list args); - void openlog(char *ident, int logstat, int logfac); - void closelog(void); - int setlogmask(int pmask); -+ -+ __END_DECLS - - #endif - -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/machdep/engine-i386-linux-1.0.c pthreads-1_60_beta6+/machdep/engine-i386-linux-1.0.c -*** pthreads-1_60_beta6/machdep/engine-i386-linux-1.0.c Mon Oct 21 20:39:13 1996 ---- pthreads-1_60_beta6+/machdep/engine-i386-linux-1.0.c Sat Mar 15 14:08:56 1997 -*************** -*** 142,147 **** ---- 142,149 ---- - * machdep_pthread_start(). - */ - machdep_pthread->machdep_state->__pc = (char *)machdep_pthread_start; -+ machdep_pthread->machdep_state->__bp = (char *)0;/* So the backtrace -+ * is sensible (mevans) */ - - /* Stack starts high and builds down. */ - machdep_pthread->machdep_state->__sp = -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/machdep/syscall-i386-linux-1.0.S pthreads-1_60_beta6+/machdep/syscall-i386-linux-1.0.S -*** pthreads-1_60_beta6/machdep/syscall-i386-linux-1.0.S Mon Oct 21 22:17:32 1996 ---- pthreads-1_60_beta6+/machdep/syscall-i386-linux-1.0.S Sat Mar 15 14:08:56 1997 -*************** -*** 148,156 **** - /* ========================================================================= - * exit 1 select 82 - * fork 2 socketcall 102 -! * read 3 readv 145 -! * write 4 writev 146 -! * open 5 - * creat 8 - * link 9 - * unlink 10 ---- 148,156 ---- - /* ========================================================================= - * exit 1 select 82 - * fork 2 socketcall 102 -! * read 3 flock 143 -! * write 4 readv 145 -! * open 5 writev 146 - * creat 8 - * link 9 - * unlink 10 -*************** -*** 390,394 **** ---- 390,401 ---- - */ - #ifdef HAVE_SYSCALL_WRITEV - SYSCALL3(writev) -+ #endif -+ -+ /* ========================================================================== -+ * machdep_sys_flock() -+ */ -+ #ifdef HAVE_SYSCALL_FLOCK -+ SYSCALL2(flock) - #endif - -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/net/gethostbyname.c pthreads-1_60_beta6+/net/gethostbyname.c -*** pthreads-1_60_beta6/net/gethostbyname.c Mon Apr 22 22:41:21 1996 ---- pthreads-1_60_beta6+/net/gethostbyname.c Sat Mar 15 14:08:58 1997 -*************** -*** 146,161 **** - { - char **alias; - FILE *fp = NULL; - - pthread_mutex_lock(&host_iterate_lock); - sethostent(0); -! while ((result = gethostent_r(result, buf, bufsize, errval)) != NULL) { - /* Check the entry's name and aliases against the given name. */ - if (strcasecmp(result->h_name, name) == 0) - break; - for (alias = result->h_aliases; *alias; alias++) { -! if (strcasecmp(*alias, name) == 0) - break; - } - } - pthread_mutex_unlock(&host_iterate_lock); ---- 146,166 ---- - { - char **alias; - FILE *fp = NULL; -+ int fFound = FALSE; - - pthread_mutex_lock(&host_iterate_lock); - sethostent(0); -! while (!fFound && (result = gethostent_r(result, buf, bufsize, errval)) -! != NULL) { - /* Check the entry's name and aliases against the given name. */ - if (strcasecmp(result->h_name, name) == 0) - break; - for (alias = result->h_aliases; *alias; alias++) { -! if (strcasecmp(*alias, name) == 0) { -! /* fFound will exit while loop. (mevans). */ -! fFound = TRUE; - break; -+ } - } - } - pthread_mutex_unlock(&host_iterate_lock); -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/net/res_debug.c pthreads-1_60_beta6+/net/res_debug.c -*** pthreads-1_60_beta6/net/res_debug.c Thu Feb 23 22:42:35 1995 ---- pthreads-1_60_beta6+/net/res_debug.c Sat Mar 15 14:08:58 1997 -*************** -*** 375,380 **** ---- 375,383 ---- - - /* - * Print resource record fields in human readable form. -+ * -+ * Removed calls to non-reentrant routines to simplify varifying -+ * POSIX thread-safe implementations. (mevans). - */ - char * - p_rr(cp, msg, file) -*************** -*** 386,391 **** ---- 389,395 ---- - char *cp1, *cp2; - u_long tmpttl, t; - int lcnt; -+ char buf[32]; - - if ((cp = p_fqname(cp, msg, file)) == NULL) - return (NULL); /* compression error */ -*************** -*** 413,426 **** - case C_HS: - bcopy(cp, (char *)&inaddr, sizeof(inaddr)); - if (dlen == 4) { -! fprintf(file,"\t%s", inet_ntoa(inaddr)); - cp += dlen; - } else if (dlen == 7) { - char *address; - u_char protocol; - u_short port; - -! address = inet_ntoa(inaddr); - cp += sizeof(inaddr); - protocol = *(u_char*)cp; - cp += sizeof(u_char); ---- 417,432 ---- - case C_HS: - bcopy(cp, (char *)&inaddr, sizeof(inaddr)); - if (dlen == 4) { -! fprintf(file,"\t%s", -! inet_ntoa_r(inaddr, buf, sizeof(buf))); - cp += dlen; - } else if (dlen == 7) { - char *address; - u_char protocol; - u_short port; - -! address = inet_ntoa_r(inaddr, -! buf, sizeof(buf)); - cp += sizeof(inaddr); - protocol = *(u_char*)cp; - cp += sizeof(u_char); -*************** -*** 524,530 **** - bcopy(cp, (char *)&inaddr, sizeof(inaddr)); - cp += sizeof(u_long); - fprintf(file, "\t%s %s ( ", -! inet_ntoa(inaddr), - deproto((int) *cp)); - cp += sizeof(u_char); - n = 0; ---- 530,536 ---- - bcopy(cp, (char *)&inaddr, sizeof(inaddr)); - cp += sizeof(u_long); - fprintf(file, "\t%s %s ( ", -! inet_ntoa_r(inaddr, buf, sizeof(buf)), - deproto((int) *cp)); - cp += sizeof(u_char); - n = 0; -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/pthreads/fd_kern.c pthreads-1_60_beta6+/pthreads/fd_kern.c -*** pthreads-1_60_beta6/pthreads/fd_kern.c Tue Oct 1 12:26:48 1996 ---- pthreads-1_60_beta6+/pthreads/fd_kern.c Sat Mar 15 14:09:00 1997 -*************** -*** 215,221 **** - * Called when there is no active thread to run. - */ - extern struct timeval __fd_kern_wait_timeout; -! - void fd_kern_wait() - { - fd_set fd_set_read, fd_set_write, fd_set_except; ---- 215,221 ---- - * Called when there is no active thread to run. - */ - extern struct timeval __fd_kern_wait_timeout; -! extern volatile sig_atomic_t sig_to_process; - void fd_kern_wait() - { - fd_set fd_set_read, fd_set_write, fd_set_except; -*************** -*** 254,260 **** - - machdep_unset_thread_timer(NULL); - __fd_kern_wait_timeout.tv_usec = 0; -! __fd_kern_wait_timeout.tv_sec = 3600; - - machdep_sys_sigprocmask(SIG_UNBLOCK, &sig_to_block, &oset); - ---- 254,260 ---- - - machdep_unset_thread_timer(NULL); - __fd_kern_wait_timeout.tv_usec = 0; -! __fd_kern_wait_timeout.tv_sec = (sig_to_process) ? 0 : 3600; - - machdep_sys_sigprocmask(SIG_UNBLOCK, &sig_to_block, &oset); - -*************** -*** 726,731 **** ---- 726,753 ---- - return(ret); - } - -+ #if defined (HAVE_SYSCALL_FLOCK) -+ /* ========================================================================== -+ * flock() -+ * -+ * Added (mevans) -+ */ -+ int flock(int fd, int operation) -+ { -+ int ret; -+ -+ if ((ret = fd_lock(fd, FD_RDWR, NULL)) == OK) { -+ if ((ret = machdep_sys_flock(fd_table[fd]->fd.i, -+ operation)) < OK) { -+ SET_ERRNO(-ret); -+ ret = NOTOK; -+ } -+ fd_unlock(fd, FD_RDWR); -+ } -+ return(ret); -+ } -+ #endif -+ - /* ========================================================================== - * pipe() - */ -*************** -*** 1126,1132 **** - /* Get the error, this function should not fail */ - machdep_sys_getsockopt(fd_table[fd]->fd.i, SOL_SOCKET, - SO_ERROR, &ret, &tmpnamelen); -! SET_ERRNO(-ret); - ret = NOTOK; - } - } else { ---- 1148,1155 ---- - /* Get the error, this function should not fail */ - machdep_sys_getsockopt(fd_table[fd]->fd.i, SOL_SOCKET, - SO_ERROR, &ret, &tmpnamelen); -! /* ret is already positive (mevans) */ -! SET_ERRNO(ret); - ret = NOTOK; - } - } else { -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/pthreads/malloc.c pthreads-1_60_beta6+/pthreads/malloc.c -*** pthreads-1_60_beta6/pthreads/malloc.c Thu Mar 9 21:06:43 1995 ---- pthreads-1_60_beta6+/pthreads/malloc.c Sat Mar 15 14:09:00 1997 -*************** -*** 196,204 **** - else - n = n - x; - if (n) { -! if (sbrk(n) == (char *)-1) - return (NULL); - } - bucket = 0; - amt = 8; - while (pagesz > amt) { ---- 196,207 ---- - else - n = n - x; - if (n) { -! if (sbrk(n) == (char *)-1) { -! /* Unlock before returning (mevans) */ -! pthread_mutex_unlock(mutex); - return (NULL); - } -+ } - bucket = 0; - amt = 8; - while (pagesz > amt) { -*************** -*** 363,366 **** ---- 366,382 ---- - free(cp); - - return (res); -+ } -+ /* ========================================================================== -+ * calloc() -+ * -+ * Added to ensure pthread's allocation is used (mevans). -+ */ -+ void *calloc(size_t nmemb, size_t size) -+ { -+ void *p; -+ size *= nmemb; -+ p = malloc(size); -+ if (p) memset(p, 0, size); -+ return (p); - } -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/pthreads/select.c pthreads-1_60_beta6+/pthreads/select.c -*** pthreads-1_60_beta6/pthreads/select.c Sat Jul 6 21:58:55 1996 ---- pthreads-1_60_beta6+/pthreads/select.c Sat Mar 15 14:09:00 1997 -*************** -*** 165,176 **** - pthread_resched_resume(PS_SELECT_WAIT); - - /* We're awake */ -- CLEAR_PF_DONE_EVENT(pthread_run); - if (sleep_cancel(pthread_run) == NOTOK) { - ret = OK; - } else { - ret = data.nfds; - } - } else { - pthread_resched_resume(PS_SELECT_WAIT); - CLEAR_PF_DONE_EVENT(pthread_run); ---- 165,180 ---- - pthread_resched_resume(PS_SELECT_WAIT); - - /* We're awake */ - if (sleep_cancel(pthread_run) == NOTOK) { - ret = OK; - } else { - ret = data.nfds; - } -+ /* Moving this after the sleep_cancel() seemed -+ * to fix intermittent crashes during heavy -+ * socket use. (mevans) -+ */ -+ CLEAR_PF_DONE_EVENT(pthread_run); - } else { - pthread_resched_resume(PS_SELECT_WAIT); - CLEAR_PF_DONE_EVENT(pthread_run); -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/pthreads/signal.c pthreads-1_60_beta6+/pthreads/signal.c -*** pthreads-1_60_beta6/pthreads/signal.c Tue Mar 12 21:33:17 1996 ---- pthreads-1_60_beta6+/pthreads/signal.c Sat Mar 15 14:09:00 1997 -*************** -*** 65,71 **** - */ - - static sig_atomic_t signum_to_process[SIGMAX + 1] = { 0, }; -! static sig_atomic_t sig_to_process = 0; - - /* static volatile sigset_t sig_to_process; */ - static volatile int sig_count = 0; ---- 65,71 ---- - */ - - static sig_atomic_t signum_to_process[SIGMAX + 1] = { 0, }; -! volatile sig_atomic_t sig_to_process = 0; - - /* static volatile sigset_t sig_to_process; */ - static volatile int sig_count = 0; -*************** -*** 303,309 **** - break; - case NOTOK: - /* Do the registered action, no threads were sleeping */ -! sigdefault(sig); - break; - } - break; ---- 303,317 ---- - break; - case NOTOK: - /* Do the registered action, no threads were sleeping */ -! /* There is a timing window that gets -! * here when no threads are on the -! * sleep queue. This is a quick fix. -! * The real problem is possibly related -! * to heavy use of condition variables -! * with time outs. -! * (mevans) -! *sigdefault(sig); -! */ - break; - } - break; -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/stdio/setvbuf.c pthreads-1_60_beta6+/stdio/setvbuf.c -*** pthreads-1_60_beta6/stdio/setvbuf.c Sat Sep 3 20:58:36 1994 ---- pthreads-1_60_beta6+/stdio/setvbuf.c Sat Mar 15 14:09:00 1997 -*************** -*** 142,148 **** - flags |= __SLBF; - if (flags & __SRW) - flags &= ~(__SRD | __SWR); -! fp->_w = 0; - fp->_flags = flags; - fp->_bf._base = fp->_p = (unsigned char *)buf; - fp->_bf._size = size; ---- 142,148 ---- - flags |= __SLBF; - if (flags & __SRW) - flags &= ~(__SRD | __SWR); -! fp->_w = size; /* Was 0 (mevans) */ - fp->_flags = flags; - fp->_bf._base = fp->_p = (unsigned char *)buf; - fp->_bf._size = size; -diff -c -b -r -d -I .*$Id:.* pthreads-1_60_beta6/stdlib/system.c pthreads-1_60_beta6+/stdlib/system.c -*** pthreads-1_60_beta6/stdlib/system.c Wed Apr 24 21:18:56 1996 ---- pthreads-1_60_beta6+/stdlib/system.c Sat Mar 15 14:09:01 1997 -*************** -*** 62,68 **** - argp[2] = (char *) command; - sigemptyset(&tmp_mask); - sigaddset(&tmp_mask, SIGCHLD); -! pthread_sigmask(SIG_BLOCK, tmp_mask, &old_mask); - switch(pid = fork()) { - case -1: /* error */ - (void)pthread_sigmask(SIG_SETMASK, &old_mask, NULL); ---- 62,69 ---- - argp[2] = (char *) command; - sigemptyset(&tmp_mask); - sigaddset(&tmp_mask, SIGCHLD); -! /* Pass the address of tmp_mask to avoid a sigfault. (mevans). */ -! pthread_sigmask(SIG_BLOCK, &tmp_mask, &old_mask); - switch(pid = fork()) { - case -1: /* error */ - (void)pthread_sigmask(SIG_SETMASK, &old_mask, NULL); diff --git a/mit-pthreads/patches/p153 b/mit-pthreads/patches/p153 deleted file mode 100755 index 4e374e29a10..00000000000 --- a/mit-pthreads/patches/p153 +++ /dev/null @@ -1,90 +0,0 @@ -<HEAD><TITLE>discuss@charon.mit.edu: [153] in "Pthreads Bugs"</TITLE> -<H1>[153] in Pthreads Bugs</H1></HEAD> -<A HREF="/"><IMG SRC="/i-d.gif" ALT="root"></A> -<A HREF="?153"><IMG SRC="/i-back.gif" ALT="meeting"></A> -<A HREF="/help.html"><IMG SRC="/i-help.gif" ALT="help"></A> -<A HREF="1"><IMG SRC="/i-first.gif" ALT="first"></A> -<A HREF="151"><IMG SRC="/i-fref.gif" ALT="first in chain"></A> -<A HREF="152"><IMG SRC="/i-pref.gif" ALT="previous in chain"></A> -<A HREF="152"><IMG SRC="/i-prev.gif" ALT="previous"></A> -<A HREF="154"><IMG SRC="/i-next.gif" ALT="next"></A> -<IMG SRC="/n-nref.gif" ALT=""> -<IMG SRC="/n-lref.gif" ALT=""> -<A HREF="161"><IMG SRC="/i-last.gif" ALT="last"></A> -<HR><H2>Re: sleep / SIGALRM problem in 1_60_beta6</H2> -<H3>daemon@ATHENA.MIT.EDU (Mon Dec 9 19:32:22 1996 -)</H3> -<PRE> -Date: Mon, 09 Dec 1996 17:22:50 -0700 -From: "Mark M. Evans" <mevans@cti-ltd.com> -To: Tim Hinderliter <kyd@internap.com> -Cc: pthreads-bugs@MIT.EDU - -I think I found what caused fd_kern_wait() to block for the entire -hour (instead of waking up due to the SIGALRM). Basically, the -SIGALRM that would move the sleeping thread to the run queue occurs -while pthread_kernel_lock is set, but *before* the critical section in -fd_kern_wait() that sets __fd_kern_wait_timeout.tv_sec to 3600. So, -sig_handler_real() clears __fd_kern_wait_timeout.tv_sec "too soon." - -I've worked around this by checking sig_to_process in the critical -section to determine if we are truly idle. To do this I had to make -sig_to_process publicly available. - -Here are the diffs (relative to the pthreads/pthreads directory): - -diff -c -r1.2 -r1.3 -*** signal.c 1996/11/20 05:09:50 1.2 ---- signal.c 1996/12/09 23:14:52 1.3 -*************** -*** 65,71 **** - */ - - static sig_atomic_t signum_to_process[SIGMAX + 1] = { 0, }; -! static sig_atomic_t sig_to_process = 0; - - /* static volatile sigset_t sig_to_process; */ - static volatile int sig_count = 0; ---- 65,71 ---- - */ - - static sig_atomic_t signum_to_process[SIGMAX + 1] = { 0, }; -! sig_atomic_t sig_to_process = 0; - - /* static volatile sigset_t sig_to_process; */ - static volatile int sig_count = 0; -*** fd_kern.c 1996/12/03 04:14:59 1.6 ---- fd_kern.c 1996/12/09 23:14:51 1.7 -*************** -*** 215,221 **** - * Called when there is no active thread to run. - */ - extern struct timeval __fd_kern_wait_timeout; -! - void fd_kern_wait() - { - fd_set fd_set_read, fd_set_write, fd_set_except; ---- 215,221 ---- - * Called when there is no active thread to run. - */ - extern struct timeval __fd_kern_wait_timeout; -! extern volatile sig_atomic_t sig_to_process; - void fd_kern_wait() - { - fd_set fd_set_read, fd_set_write, fd_set_except; -*************** -*** 254,260 **** - - machdep_unset_thread_timer(NULL); - __fd_kern_wait_timeout.tv_usec = 0; -! __fd_kern_wait_timeout.tv_sec = 3600; - - machdep_sys_sigprocmask(SIG_UNBLOCK, &sig_to_block, &oset); - ---- 254,260 ---- - - machdep_unset_thread_timer(NULL); - __fd_kern_wait_timeout.tv_usec = 0; -! __fd_kern_wait_timeout.tv_sec = (sig_to_process) ? 0 : 3600; - - machdep_sys_sigprocmask(SIG_UNBLOCK, &sig_to_block, &oset); diff --git a/mit-pthreads/patches/p155 b/mit-pthreads/patches/p155 deleted file mode 100755 index dbdfa7de899..00000000000 --- a/mit-pthreads/patches/p155 +++ /dev/null @@ -1,96 +0,0 @@ -<HEAD><TITLE>discuss@charon.mit.edu: [155] in "Pthreads Bugs"</TITLE> -<H1>[155] in Pthreads Bugs</H1></HEAD> -<A HREF="/"><IMG SRC="/i-d.gif" ALT="root"></A> -<A HREF="?155"><IMG SRC="/i-back.gif" ALT="meeting"></A> -<A HREF="/help.html"><IMG SRC="/i-help.gif" ALT="help"></A> -<A HREF="1"><IMG SRC="/i-first.gif" ALT="first"></A> -<IMG SRC="/n-fref.gif" ALT=""> -<IMG SRC="/n-pref.gif" ALT=""> -<A HREF="154"><IMG SRC="/i-prev.gif" ALT="previous"></A> -<A HREF="156"><IMG SRC="/i-next.gif" ALT="next"></A> -<IMG SRC="/n-nref.gif" ALT=""> -<IMG SRC="/n-lref.gif" ALT=""> -<A HREF="161"><IMG SRC="/i-last.gif" ALT="last"></A> -<HR><H2>pthread_kill() Bug</H2> -<H3>daemon@ATHENA.MIT.EDU (Thu Dec 26 20:34:45 1996 -)</H3> -<PRE> -From: Chris Colohan <colohan@eecg.toronto.edu> -To: pthreads-bugs@MIT.EDU, proven@MIT.EDU -Date: Thu, 26 Dec 1996 20:33:48 -0500 - -pthread_kill() has a problem in PThreads 1.60beta6. It checks to see -if the target thread is in the state PS_SIGWAIT, and if it is it -reschedules it. But it does not check if there is more than one -thread in the PS_SIGWAIT state, and hence mangles the pthread_sigwait -linked list, potentially resulting in threads getting blocked forever, -and signals never being delivered. I have a *very* contrived test -case that demonstrates this problem if you would like it. Please let -me know... - -Chris -=== - -Diffs created with diff -c: - -*** /home/colohan/thesis/t/pthreads-1_60_beta6/pthreads/pthread_kill.c Tue Feb 21 03:07:18 1995 ---- pthread_kill.c Thu Dec 26 19:50:22 1996 -*************** -*** 41,51 **** ---- 41,58 ---- - - #include <pthread.h> - -+ /* Defined in sig.c, a linked list of threads currently -+ * blocked in sigwait(): */ -+ extern struct pthread * pthread_sigwait; -+ -+ - /* ========================================================================== - * pthread_kill() - */ - int pthread_kill(struct pthread * pthread, int sig) - { -+ struct pthread ** pthread_ptr; -+ - pthread_sched_prevent(); - - /* Check who is the current owner of pthread */ -*************** -*** 53,62 **** - if (0) { - } else { - if (pthread->state == PS_SIGWAIT) { -! if (sigismember(pthread->data.sigwait, sig)) { -! *(int *)(pthread->ret) = sig; -! pthread_sched_other_resume(pthread); -! return(OK); - } - } - sigaddset(&(pthread->sigpending), sig); ---- 60,84 ---- - if (0) { - } else { - if (pthread->state == PS_SIGWAIT) { -! if(sigismember(pthread->data.sigwait, sig)) { -! for (pthread_ptr = &pthread_sigwait; -! (*pthread_ptr); -! pthread_ptr = &((*pthread_ptr)->next)) { -! if ((*pthread_ptr) == pthread) { -! -! /* Take the thread out of the -! * pthread_sigwait linked list: */ -! *pthread_ptr=(*pthread_ptr)->next; -! -! *(int *)(pthread->ret) = sig; -! pthread_sched_other_resume(pthread); -! return(OK); -! } -! } -! /* A thread should not be in the state PS_SIGWAIT -! * without being in the pthread_sigwait linked -! * list: */ -! PANIC(); - } - } - sigaddset(&(pthread->sigpending), sig); |