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