1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
diff -ru ../../work.PRE4/linuxthreads-2.2.3_21/freebsd-compat.h ./freebsd-compat.h
--- ../../work.PRE4/linuxthreads-2.2.3_21/freebsd-compat.h Sat Jun 8 20:18:05 2002
+++ ./freebsd-compat.h Mon Mar 19 22:31:38 2007
@@ -4,6 +4,7 @@
#include <sched.h>
#include <sys/types.h>
#include <sys/time.h>
+#include <sys/errno.h>
#if __FreeBSD__ >= 5
@@ -77,6 +78,26 @@
ssize_t __libc_write(int, const void *, size_t);
ssize_t __libc_read(int, void *, size_t);
+static inline ssize_t
+__libc_safe_write(int fd, const void *buf, size_t wsize)
+{
+ ssize_t written;
+
+ do {
+ written = __libc_write(fd, buf, wsize);
+ } while (written < 0 && errno == EINTR);
+ return (written);
+}
+static inline ssize_t
+__libc_safe_read(int fd, void *buf, size_t rsize)
+{
+ ssize_t got;
+
+ do {
+ got = __libc_read(fd, buf, rsize);
+ } while (got < 0 && errno == EINTR);
+ return (got);
+}
pid_t __libc_waitpid(pid_t wpid, int *status, int options);
int __libc_poll(struct pollfd *_pfd, unsigned int _nfsd, int _timeout);
pid_t __libc_getpid(void);
diff -ru ../../work.PRE4/linuxthreads-2.2.3_21/join.c ./join.c
--- ../../work.PRE4/linuxthreads-2.2.3_21/join.c Mon Mar 19 22:29:45 2007
+++ ./join.c Mon Mar 19 22:33:43 2007
@@ -79,7 +79,7 @@
if (self == __pthread_main_thread && __pthread_manager_request >= 0) {
request.req_thread = self;
request.req_kind = REQ_MAIN_THREAD_EXIT;
- __libc_write(__pthread_manager_request, (char *)&request, sizeof(request));
+ __libc_safe_write(__pthread_manager_request, (char *)&request, sizeof(request));
suspend(self);
/* Main thread flushes stdio streams and runs atexit functions.
It also calls a handler within LinuxThreads which sends a process exit
@@ -174,7 +174,7 @@
request.req_thread = self;
request.req_kind = REQ_FREE;
request.req_args.free.thread_id = thread_id;
- __libc_write(__pthread_manager_request,
+ __libc_safe_write(__pthread_manager_request,
(char *) &request, sizeof(request));
}
return 0;
@@ -212,7 +212,7 @@
request.req_thread = thread_self();
request.req_kind = REQ_FREE;
request.req_args.free.thread_id = thread_id;
- __libc_write(__pthread_manager_request,
+ __libc_safe_write(__pthread_manager_request,
(char *) &request, sizeof(request));
}
return 0;
diff -ru ../../work.PRE4/linuxthreads-2.2.3_21/manager.c ./manager.c
--- ../../work.PRE4/linuxthreads-2.2.3_21/manager.c Mon Mar 19 22:29:45 2007
+++ ./manager.c Mon Mar 19 22:33:49 2007
@@ -132,7 +132,7 @@
/* Raise our priority to match that of main thread */
__pthread_manager_adjust_prio(__pthread_main_thread->p_priority);
/* Synchronize debugging of the thread manager */
- n = __libc_read(reqfd, (char *)&request, sizeof(request));
+ n = __libc_safe_read(reqfd, (char *)&request, sizeof(request));
ASSERT(n == sizeof(request) && request.req_kind == REQ_DEBUG);
ufd.fd = reqfd;
ufd.events = POLLIN;
@@ -152,7 +152,7 @@
}
/* Read and execute request */
if (n == 1 && (ufd.revents & POLLIN)) {
- n = __libc_read(reqfd, (char *)&request, sizeof(request));
+ n = __libc_safe_read(reqfd, (char *)&request, sizeof(request));
ASSERT(n == sizeof(request));
switch(request.req_kind) {
case REQ_CREATE:
@@ -268,7 +268,7 @@
if (__pthread_threads_debug && __pthread_sig_debug > 0) {
request.req_thread = self;
request.req_kind = REQ_DEBUG;
- __libc_write(__pthread_manager_request,
+ __libc_safe_write(__pthread_manager_request,
(char *) &request, sizeof(request));
suspend(self);
}
@@ -917,7 +917,7 @@
struct pthread_request request;
request.req_thread = 0;
request.req_kind = REQ_KICK;
- __libc_write(__pthread_manager_request, (char *) &request, sizeof(request));
+ __libc_safe_write(__pthread_manager_request, (char *) &request, sizeof(request));
}
}
diff -ru ../../work.PRE4/linuxthreads-2.2.3_21/pthread.c ./pthread.c
--- ../../work.PRE4/linuxthreads-2.2.3_21/pthread.c Mon Mar 19 22:29:45 2007
+++ ./pthread.c Mon Mar 19 22:34:57 2007
@@ -605,7 +605,7 @@
}
/* Synchronize debugging of the thread manager */
request.req_kind = REQ_DEBUG;
- __libc_write(__pthread_manager_request, (char *) &request, sizeof(request));
+ __libc_safe_write(__pthread_manager_request, (char *) &request, sizeof(request));
return 0;
}
@@ -627,7 +627,7 @@
request.req_args.create.arg = arg;
sigprocmask(SIG_SETMASK, (const sigset_t *) NULL,
&request.req_args.create.mask);
- __libc_write(__pthread_manager_request, (char *) &request, sizeof(request));
+ __libc_safe_write(__pthread_manager_request, (char *) &request, sizeof(request));
suspend(self);
retval = THREAD_GETMEM(self, p_retcode);
if (__builtin_expect (retval, 0) == 0)
@@ -759,7 +759,7 @@
request.req_thread = self;
request.req_kind = REQ_PROCESS_EXIT;
request.req_args.exit.code = 0;
- __libc_write(__pthread_manager_request,
+ __libc_safe_write(__pthread_manager_request,
(char *) &request, sizeof(request));
suspend(self);
/* Main thread should accumulate times for thread manager and its
diff -ru ../../work.PRE4/linuxthreads-2.2.3_21/semaphore.c ./semaphore.c
--- ../../work.PRE4/linuxthreads-2.2.3_21/semaphore.c Mon Mar 19 22:29:45 2007
+++ ./semaphore.c Mon Mar 19 22:34:21 2007
@@ -167,7 +167,7 @@
}
request.req_kind = REQ_POST;
request.req_args.post = sem;
- __libc_write(__pthread_manager_request,
+ __libc_safe_write(__pthread_manager_request,
(char *) &request, sizeof(request));
}
return 0;
|