summaryrefslogtreecommitdiff
path: root/debian/patches/thread-throttle.patch
blob: 9cf10399ff7226238ffce79cff233efdeebb327d (plain)
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)