]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2003-10-26 Michael Chastain <mec@shout.net>
authorMichael Chastain <mec@google.com>
Mon, 27 Oct 2003 13:59:08 +0000 (13:59 +0000)
committerMichael Chastain <mec@google.com>
Mon, 27 Oct 2003 13:59:08 +0000 (13:59 +0000)
* gdb.texinfo (Thread Stops): Document the issue with
premature return from system calls in multi-threaded programs.

gdb/doc/ChangeLog
gdb/doc/gdb.texinfo

index 2e72df77c158ae05b944e5cac6e997d77f67ec67..04bfa95e746bed50776d09db732e816bcd139a3d 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-26  Michael Chastain  <mec@shout.net>
+
+       * gdb.texinfo (Thread Stops): Document the issue with
+       premature return from system calls in multi-threaded programs.
+
 2003-10-24  Andrew Cagney  <cagney@redhat.com>
 
        * annotate.texinfo: Fix "fortunatly"[sic].
index 83faf2979bb29140acae02cc2349e018d2e50f23..1567f66dd24ce03be0ac4a97082ba31ba6e0d0f1 100644 (file)
@@ -3761,6 +3761,47 @@ allows you to examine the overall state of the program, including
 switching between threads, without worrying that things may change
 underfoot.
 
+@cindex thread breakpoints and system calls
+@cindex system calls and thread breakpoints
+@cindex premature return from system calls
+There is an unfortunate side effect.  If one thread stops for a
+breakpoint, or for some other reason, and another thread is blocked in a
+system call, then the system call may return prematurely.  This is a
+consequence of the interaction between multiple threads and the signals
+that @value{GDBN} uses to implement breakpoints and other events that
+stop execution.
+
+To handle this problem, your program should check the return value of
+each system call and react appropriately.  This is good programming
+style anyways.
+
+For example, do not write code like this:
+
+@smallexample
+  sleep (10);
+@end smallexample
+
+The call to @code{sleep} will return early if a different thread stops
+at a breakpoint or for some other reason.
+
+Instead, write this:
+
+@smallexample
+  int unslept = 10;
+  while (unslept > 0)
+    unslept = sleep (unslept);
+@end smallexample
+
+A system call is allowed to return early, so the system is still
+conforming to its specification.  But @value{GDBN} does cause your
+multi-threaded program to behave differently than it would without
+@value{GDBN}.
+
+Also, @value{GDBN} uses internal breakpoints in the thread library to
+monitor certain events such as thread creation and thread destruction.
+When such an event happens, a system call in another thread may return
+prematurely, even though your program does not appear to stop.
+
 @cindex continuing threads
 @cindex threads, continuing
 Conversely, whenever you restart the program, @emph{all} threads start