Patch from Eric Norum <eric@skatter.usask.ca>:

Remember the test to see if a socket could be read and written at
    the same time by two different tasks?  I discovered that if both
    tasks attempt to close the socket a panic can occur from inside the
    BSD code.

    Closing the same socket twice from two different threads is
    certainly an error, but a panic is not the greatest error reporting
    method :-)

    The following small change to the socket close routine should reduce
    the chances of the panic.
This commit is contained in:
Joel Sherrill
1998-09-29 12:15:08 +00:00
parent d7fcc1d40a
commit 766ed7c0f1
4 changed files with 8 additions and 12 deletions

View File

@@ -683,16 +683,15 @@ rtems_bsdnet_close (int fd)
rtems_bsdnet_semaphore_release ();
return -1;
}
error = soclose (so);
i = rtems_file_descriptor_base(fd);
fdsock[i].indexFreeNext = indexFreeHead;;
indexFreeHead = i;
error = soclose (so);
rtems_bsdnet_semaphore_release ();
if (error) {
errno = error;
rtems_bsdnet_semaphore_release ();
return -1;
}
rtems_bsdnet_semaphore_release ();
return 0;
}

View File

@@ -683,16 +683,15 @@ rtems_bsdnet_close (int fd)
rtems_bsdnet_semaphore_release ();
return -1;
}
error = soclose (so);
i = rtems_file_descriptor_base(fd);
fdsock[i].indexFreeNext = indexFreeHead;;
indexFreeHead = i;
error = soclose (so);
rtems_bsdnet_semaphore_release ();
if (error) {
errno = error;
rtems_bsdnet_semaphore_release ();
return -1;
}
rtems_bsdnet_semaphore_release ();
return 0;
}

View File

@@ -683,16 +683,15 @@ rtems_bsdnet_close (int fd)
rtems_bsdnet_semaphore_release ();
return -1;
}
error = soclose (so);
i = rtems_file_descriptor_base(fd);
fdsock[i].indexFreeNext = indexFreeHead;;
indexFreeHead = i;
error = soclose (so);
rtems_bsdnet_semaphore_release ();
if (error) {
errno = error;
rtems_bsdnet_semaphore_release ();
return -1;
}
rtems_bsdnet_semaphore_release ();
return 0;
}