Rework process_single.c to take advantage of cluster_id() now taking an additional...
authorAndrew Bartlett <abartlet@samba.org>
Mon, 4 Feb 2008 06:53:01 +0000 (17:53 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 4 Feb 2008 06:53:01 +0000 (17:53 +1100)
Andrew Bartlett and David Disseldorp

source/smbd/process_single.c

index 5d3c36adb9faf67cc5364898513eb90f3cc4da5a..2d3c94ca6dda436f0925c813f8d1ce54bd63ec73 100644 (file)
@@ -52,19 +52,26 @@ static void single_accept_connection(struct event_context *ev,
        status = socket_accept(sock, &sock2);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0,("single_accept_connection: accept: %s\n", nt_errstr(status)));
-               /* this looks strange, but is correct. We need to
-                  throttle things until the system clears enough
-                  resources to handle this new socket. If we don't
-                  then we will spin filling the log and causing more
-                  problems. We don't panic as this is probably a
-                  temporary resource constraint */
+               /* this looks strange, but is correct. 
+
+                  We can only be here if woken up from select, due to
+                  an incomming connection.
+
+                  We need to throttle things until the system clears
+                  enough resources to handle this new socket. 
+
+                  If we don't then we will spin filling the log and
+                  causing more problems. We don't panic as this is
+                  probably a temporary resource constraint */
                sleep(1);
                return;
        }
 
        talloc_steal(private, sock);
 
-       new_conn(ev, lp_ctx, sock2, cluster_id(socket_get_fd(sock2)), private);
+       /* The cluster_id(0, fd) cannot collide with the incrementing
+        * task below, as the first component is 0, not 1 */
+       new_conn(ev, lp_ctx, sock2, cluster_id(0, socket_get_fd(sock2)), private);
 }
 
 /*
@@ -72,11 +79,17 @@ static void single_accept_connection(struct event_context *ev,
 */
 static void single_new_task(struct event_context *ev, 
                            struct loadparm_context *lp_ctx, 
+                           const char *service_name,
                            void (*new_task)(struct event_context *, struct loadparm_context *, struct server_id, void *), 
                            void *private)
 {
-       static uint32_t taskid = 0x10000000;
-       new_task(ev, lp_ctx, cluster_id(taskid++), private);
+       static uint32_t taskid = 0;
+       
+       /* We use 1 so we cannot collide in with cluster ids generated
+        * in the accept connection above, and unlikly to collide with
+        * PIDs from process modal standard (don't run samba as
+        * init) */
+       new_task(ev, lp_ctx, cluster_id(1, taskid++), private);
 }