tsan_fd.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //===-- tsan_fd.h -----------------------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file is a part of ThreadSanitizer (TSan), a race detector.
  10. //
  11. // This file handles synchronization via IO.
  12. // People use IO for synchronization along the lines of:
  13. //
  14. // int X;
  15. // int client_socket; // initialized elsewhere
  16. // int server_socket; // initialized elsewhere
  17. //
  18. // Thread 1:
  19. // X = 42;
  20. // send(client_socket, ...);
  21. //
  22. // Thread 2:
  23. // if (recv(server_socket, ...) > 0)
  24. // assert(X == 42);
  25. //
  26. // This file determines the scope of the file descriptor (pipe, socket,
  27. // all local files, etc) and executes acquire and release operations on
  28. // the scope as necessary. Some scopes are very fine grained (e.g. pipe
  29. // operations synchronize only with operations on the same pipe), while
  30. // others are corse-grained (e.g. all operations on local files synchronize
  31. // with each other).
  32. //===----------------------------------------------------------------------===//
  33. #ifndef TSAN_FD_H
  34. #define TSAN_FD_H
  35. #include "tsan_rtl.h"
  36. namespace __tsan {
  37. void FdInit();
  38. void FdAcquire(ThreadState *thr, uptr pc, int fd);
  39. void FdRelease(ThreadState *thr, uptr pc, int fd);
  40. void FdAccess(ThreadState *thr, uptr pc, int fd);
  41. void FdClose(ThreadState *thr, uptr pc, int fd, bool write = true);
  42. void FdFileCreate(ThreadState *thr, uptr pc, int fd);
  43. void FdDup(ThreadState *thr, uptr pc, int oldfd, int newfd, bool write);
  44. void FdPipeCreate(ThreadState *thr, uptr pc, int rfd, int wfd);
  45. void FdEventCreate(ThreadState *thr, uptr pc, int fd);
  46. void FdSignalCreate(ThreadState *thr, uptr pc, int fd);
  47. void FdInotifyCreate(ThreadState *thr, uptr pc, int fd);
  48. void FdPollCreate(ThreadState *thr, uptr pc, int fd);
  49. void FdPollAdd(ThreadState *thr, uptr pc, int epfd, int fd);
  50. void FdSocketCreate(ThreadState *thr, uptr pc, int fd);
  51. void FdSocketAccept(ThreadState *thr, uptr pc, int fd, int newfd);
  52. void FdSocketConnecting(ThreadState *thr, uptr pc, int fd);
  53. void FdSocketConnect(ThreadState *thr, uptr pc, int fd);
  54. bool FdLocation(uptr addr, int *fd, Tid *tid, StackID *stack, bool *closed);
  55. void FdOnFork(ThreadState *thr, uptr pc);
  56. uptr File2addr(const char *path);
  57. uptr Dir2addr(const char *path);
  58. } // namespace __tsan
  59. #endif // TSAN_INTERFACE_H