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
|
--- libports/manage-multithread.c.orig 2005-08-10 13:38:18.000000000 +0200
+++ libports/manage-multithread.c 2005-08-10 13:34:30.000000000 +0200
@@ -23,6 +23,19 @@
#include <assert.h>
#include <cthreads.h>
#include <mach/message.h>
+#include <unistd.h> /* For sleep() */
+
+#define LP_DEBUG 0
+
+#if LP_DEBUG
+#include <stdio.h> /* For printf() */
+#endif
+
+#define THREAD_MAX 250 /* Maximum number of threads */
+#define THREAD_DELAY 64 /* Number of threads created as needed
+ without delay */
+#define DELAY 2 /* Time to sleep() each delayed thread
+ (in seconds) */
void
ports_manage_port_operations_multithread (struct port_bucket *bucket,
@@ -43,6 +56,7 @@
{
int spawn = 0;
int status;
+ int type = 0; /* 0 = standard, 1 = master, 2 = delayed */
struct port_info *pi;
struct rpc_info link;
register mig_reply_header_t *outp = (mig_reply_header_t *) outheadp;
@@ -59,8 +73,11 @@
spin_lock (&lock);
assert (nreqthreads);
nreqthreads--;
- if (nreqthreads == 0)
- spawn = 1;
+ if (nreqthreads == 0 && totalthreads <= THREAD_MAX) {
+ spawn = 1;
+ if (totalthreads >= THREAD_DELAY)
+ type = 2;
+ }
spin_unlock (&lock);
if (spawn)
@@ -69,7 +86,8 @@
totalthreads++;
nreqthreads++;
spin_unlock (&lock);
- cthread_detach (cthread_fork ((cthread_fn_t) thread_function, 0));
+ cthread_detach (cthread_fork ((cthread_fn_t) thread_function,
+ (any_t)(intptr_t) type));
}
/* Fill in default response. */
@@ -117,15 +135,31 @@
}
int
- thread_function (int master)
+ thread_function (int type)
{
int timeout;
error_t err;
-
+
+ if (type == 2) {
+#if LP_DEBUG
+ printf("libports: delayed thread number: %d || ", totalthreads);
+ fflush(stdout);
+#endif
+ sleep(DELAY); /* Take a little break */
+#if LP_DEBUG
+ printf("libports: delayed thread running (%d)\n", totalthreads);
+ fflush(stdout);
+#endif
+ }
+#if LP_DEBUG
+ else {
+ printf("libports: new thread without delay running\n");
+ }
+#endif
if (hook)
(*hook) ();
- if (master)
+ if (type == 1)
timeout = global_timeout;
else
timeout = thread_timeout;
@@ -138,7 +172,7 @@
timeout);
while (err != MACH_RCV_TIMED_OUT);
- if (master)
+ if (type == 1)
{
spin_lock (&lock);
if (totalthreads != 1)
|