1fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//===-- tsan_fd.h -----------------------------------------------*- C++ -*-===//
2fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//
3fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//                     The LLVM Compiler Infrastructure
4fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//
5fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov// This file is distributed under the University of Illinois Open Source
6fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov// License. See LICENSE.TXT for details.
7fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//
8fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//===----------------------------------------------------------------------===//
9fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//
10fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov// This file is a part of ThreadSanitizer (TSan), a race detector.
11fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//
1284cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// This file handles synchronization via IO.
1384cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// People use IO for synchronization along the lines of:
1484cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov//
1584cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// int X;
1684cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// int client_socket;  // initialized elsewhere
1784cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// int server_socket;  // initialized elsewhere
1884cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov//
1984cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// Thread 1:
2084cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// X = 42;
2184cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// send(client_socket, ...);
2284cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov//
2384cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// Thread 2:
2484cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// if (recv(server_socket, ...) > 0)
2584cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov//   assert(X == 42);
2684cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov//
2784cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// This file determines the scope of the file descriptor (pipe, socket,
2884cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// all local files, etc) and executes acquire and release operations on
2984cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// the scope as necessary.  Some scopes are very fine grained (e.g. pipe
3084cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// operations synchronize only with operations on the same pipe), while
3184cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// others are corse-grained (e.g. all operations on local files synchronize
3284cc1ca0b3a0b5004c4d21cf481773aba0971eb2Dmitry Vyukov// with each other).
33fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov//===----------------------------------------------------------------------===//
34fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov#ifndef TSAN_FD_H
35fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov#define TSAN_FD_H
36fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov
37fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov#include "tsan_rtl.h"
38fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov
39fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovnamespace __tsan {
40fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov
41fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdInit();
42fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdAcquire(ThreadState *thr, uptr pc, int fd);
43fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdRelease(ThreadState *thr, uptr pc, int fd);
44a597258803f870d859e2e8b18bbb4fabf4d5a3f8Dmitry Vyukovvoid FdAccess(ThreadState *thr, uptr pc, int fd);
45fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdClose(ThreadState *thr, uptr pc, int fd);
46fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdFileCreate(ThreadState *thr, uptr pc, int fd);
47fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdDup(ThreadState *thr, uptr pc, int oldfd, int newfd);
48fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdPipeCreate(ThreadState *thr, uptr pc, int rfd, int wfd);
49fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdEventCreate(ThreadState *thr, uptr pc, int fd);
5045d4324bf5b0ec282f0a8f96312233e09a882502Dmitry Vyukovvoid FdSignalCreate(ThreadState *thr, uptr pc, int fd);
5145d4324bf5b0ec282f0a8f96312233e09a882502Dmitry Vyukovvoid FdInotifyCreate(ThreadState *thr, uptr pc, int fd);
52fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdPollCreate(ThreadState *thr, uptr pc, int fd);
53fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdSocketCreate(ThreadState *thr, uptr pc, int fd);
54fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdSocketAccept(ThreadState *thr, uptr pc, int fd, int newfd);
55ed513f69b8017a69214509105e7ec59fec77b468Dmitry Vyukovvoid FdSocketConnecting(ThreadState *thr, uptr pc, int fd);
56fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovvoid FdSocketConnect(ThreadState *thr, uptr pc, int fd);
57c2234cd922bbd94e276e0bebb08004d63cbc5cf2Dmitry Vyukovbool FdLocation(uptr addr, int *fd, int *tid, u32 *stack);
584554b7a7b345cd50ff8138b3cda8dd1135b965faDmitry Vyukovvoid FdOnFork(ThreadState *thr, uptr pc);
59fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov
60fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovuptr File2addr(char *path);
61fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukovuptr Dir2addr(char *path);
62fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov
63fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov}  // namespace __tsan
64fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov
65fb8ca8143896ef012d9e2bcb20ff3e4cfed93092Dmitry Vyukov#endif  // TSAN_INTERFACE_H
66