@@ -312,8 +312,27 @@ fn acquire(
312312 let msg = format ! ( "waiting for file lock on {}" , msg) ;
313313 config. shell ( ) . status_with_color ( "Blocking" , & msg, Cyan ) ?;
314314
315- block ( ) . chain_err ( || format ! ( "failed to lock file: {}" , path. display( ) ) ) ?;
316- return Ok ( ( ) ) ;
315+ // We're about to block the current process and not really do anything
316+ // productive for what could possibly be a very long time. We could be
317+ // waiting, for example, on another Cargo to finish a download, finish an
318+ // entire build, etc. Since we're not doing anything productive we're not
319+ // making good use of our jobserver token, if we have one.
320+ //
321+ // This can typically come about if `cargo` is invoked from `make` (or some
322+ // other jobserver-providing system). In this situation it's actually best
323+ // if we release the token back to the original jobserver to let some other
324+ // cpu-hungry work continue to make progress. After we're done blocking
325+ // we'll block waiting to reacquire a token as we'll probably be doing cpu
326+ // hungry work ourselves.
327+ let jobserver = config. jobserver_from_env ( ) ;
328+ if let Some ( server) = jobserver {
329+ server. release_raw ( ) ?;
330+ }
331+ let result = block ( ) . chain_err ( || format ! ( "failed to lock file: {}" , path. display( ) ) ) ;
332+ if let Some ( server) = jobserver {
333+ server. acquire_raw ( ) ?;
334+ }
335+ return Ok ( result?) ;
317336
318337 #[ cfg( all( target_os = "linux" , not( target_env = "musl" ) ) ) ]
319338 fn is_on_nfs_mount ( path : & Path ) -> bool {
0 commit comments