Cygwin: fork: Always pause child after fixups.
Pause the child process after performing fork fixups even if there were no dynamically loaded dlls with extra data/bss transfers to wait for. This allows the parent process to cancel the current fork call even if the child process was successfully initialized already. This is a preparation for when the parent does remember the child no earlier than after successful child initialization.
This commit is contained in:
		
							parent
							
								
									a9c27900e3
								
							
						
					
					
						commit
						a8c23e4423
					
				|  | @ -180,13 +180,10 @@ frok::child (volatile char * volatile here) | ||||||
| 
 | 
 | ||||||
|   cygheap->fdtab.fixup_after_fork (hParent); |   cygheap->fdtab.fixup_after_fork (hParent); | ||||||
| 
 | 
 | ||||||
|   /* If we haven't dynamically loaded any dlls, just signal the parent.
 |   /* Signal that we have successfully initialized, so the parent can
 | ||||||
|      Otherwise, tell the parent that we've loaded all the dlls |      - transfer data/bss for dynamically loaded dlls (if any), or | ||||||
|      and wait for the parent to fill in the loaded dlls' data/bss. */ |      - terminate the current fork call even if the child is initialized. */ | ||||||
|   if (!load_dlls) |   sync_with_parent ("performed fork fixups and dynamic dll loading", true); | ||||||
|     sync_with_parent ("performed fork fixup", false); |  | ||||||
|   else |  | ||||||
|     sync_with_parent ("loaded dlls", true); |  | ||||||
| 
 | 
 | ||||||
|   init_console_handler (myself->ctty > 0); |   init_console_handler (myself->ctty > 0); | ||||||
|   ForceCloseHandle1 (fork_info->forker_finished, forker_finished); |   ForceCloseHandle1 (fork_info->forker_finished, forker_finished); | ||||||
|  | @ -477,7 +474,8 @@ frok::parent (volatile char * volatile stack_here) | ||||||
| 	} | 	} | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   /* Start thread, and then wait for it to reload dlls.  */ |   /* Start the child up, and then wait for it to
 | ||||||
|  |      perform fork fixups and dynamic dll loading (if any). */ | ||||||
|   resume_child (forker_finished); |   resume_child (forker_finished); | ||||||
|   if (!ch.sync (child->pid, hchild, FORK_WAIT_TIMEOUT)) |   if (!ch.sync (child->pid, hchild, FORK_WAIT_TIMEOUT)) | ||||||
|     { |     { | ||||||
|  | @ -508,10 +506,11 @@ frok::parent (volatile char * volatile stack_here) | ||||||
| 	      goto cleanup; | 	      goto cleanup; | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
|       /* Start the child up again. */ |  | ||||||
|       resume_child (forker_finished); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |   /* Finally start the child up. */ | ||||||
|  |   resume_child (forker_finished); | ||||||
|  | 
 | ||||||
|   ForceCloseHandle (forker_finished); |   ForceCloseHandle (forker_finished); | ||||||
|   forker_finished = NULL; |   forker_finished = NULL; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue