Home | History | Annotate | Download | only in rtl

Lines Matching defs:thr

255 static ThreadSignalContext *SigCtx(ThreadState *thr) {
256 ThreadSignalContext *ctx = (ThreadSignalContext*)thr->signal_ctx;
257 if (ctx == 0 && !thr->is_dead) {
259 MemoryResetRange(thr, (uptr)&SigCtx, (uptr)ctx, sizeof(*ctx));
260 thr->signal_ctx = ctx;
269 ScopedInterceptor::ScopedInterceptor(ThreadState *thr, const char *fname,
271 : thr_(thr)
275 Initialize(thr);
276 FuncEntry(thr, pc);
319 #define READ_STRING_OF_LEN(thr, pc, s, len, n) \
320 MemoryAccessRange((thr), (pc), (uptr)(s), \
323 #define READ_STRING(thr, pc, s, n) \
324 READ_STRING_OF_LEN((thr), (pc), (s), internal_strlen(s), (n))
326 #define BLOCK_REAL(name) (BlockingCall(thr), REAL(name))
329 explicit BlockingCall(ThreadState *thr)
330 : thr(thr)
331 , ctx(SigCtx(thr)) {
337 ProcessPendingSignals(thr);
344 thr->ignore_interceptors++;
348 thr->ignore_interceptors--;
352 ThreadState *thr;
359 AfterSleep(thr, pc);
366 AfterSleep(thr, pc);
373 AfterSleep(thr, pc);
385 ThreadState *thr = cur_thread();
387 Acquire(thr, pc, (uptr)arg);
393 static int setup_at_exit_wrapper(ThreadState *thr, uptr pc, void(*f)(),
403 return setup_at_exit_wrapper(thr, pc, (void(*)())f, 0, 0);
411 return setup_at_exit_wrapper(thr, pc, (void(*)())f, arg, dso);
414 static int setup_at_exit_wrapper(ThreadState *thr, uptr pc, void(*f)(),
419 Release(thr, pc, (uptr)ctx);
422 ThreadIgnoreBegin(thr, pc);
424 ThreadIgnoreEnd(thr, pc);
430 ThreadState *thr = cur_thread();
432 Acquire(thr, pc, (uptr)arg);
445 Release(thr, pc, (uptr)ctx);
448 ThreadIgnoreBegin(thr, pc);
450 ThreadIgnoreEnd(thr, pc);
456 static void JmpBufGarbageCollect(ThreadState *thr, uptr sp) {
457 for (uptr i = 0; i < thr->jmp_bufs.Size(); i++) {
458 JmpBuf *buf = &thr->jmp_bufs[i];
460 uptr sz = thr->jmp_bufs.Size();
461 internal_memcpy(buf, &thr->jmp_bufs[sz - 1], sizeof(*buf));
462 thr->jmp_bufs.PopBack();
468 static void SetJmp(ThreadState *thr, uptr sp, uptr mangled_sp) {
469 if (!thr->is_inited) // called from libc guts during bootstrap
472 JmpBufGarbageCollect(thr, sp);
474 JmpBuf *buf = thr->jmp_bufs.PushBack();
477 buf->shadow_stack_pos = thr->shadow_stack_pos;
478 ThreadSignalContext *sctx = SigCtx(thr);
483 buf->in_signal_handler = atomic_load(&thr->in_signal_handler,
487 static void LongJmp(ThreadState *thr, uptr *env) {
500 for (uptr i = 0; i < thr->jmp_bufs.Size(); i++) {
501 JmpBuf *buf = &thr->jmp_bufs[i];
503 CHECK_GE(thr->shadow_stack_pos, buf->shadow_stack_pos);
505 while (thr->shadow_stack_pos > buf->shadow_stack_pos)
506 FuncExit(thr);
507 ThreadSignalContext *sctx = SigCtx(thr);
513 atomic_store(&thr->in_signal_handler, buf->in_signal_handler,
515 JmpBufGarbageCollect(thr, buf->sp - 1); // do not collect buf->sp
596 p = user_alloc(thr, pc, size);
604 return user_alloc(thr, pc, sz, align);
613 p = user_calloc(thr, pc, size, n);
626 p = user_realloc(thr, pc, p, size);
639 user_free(thr, pc, p);
649 user_free(thr, pc, p);
661 MemoryAccessRange(thr, pc, (uptr)s, len + 1, false);
669 MemoryAccessRange(thr, pc, (uptr)dst, size, true);
678 MemoryAccessRange(thr, pc, (uptr)dst, size, true);
679 MemoryAccessRange(thr, pc, (uptr)src, size, false);
690 MemoryAccessRange(thr, pc, (uptr)dst, n, true);
691 MemoryAccessRange(thr, pc, (uptr)src, n, false);
701 READ_STRING_OF_LEN(thr, pc, s, len, n);
710 READ_STRING(thr, pc, s, len);
717 MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s) + 1, false);
724 MemoryAccessRange(thr, pc, (uptr)dst, srclen + 1, true);
725 MemoryAccessRange(thr, pc, (uptr)src, srclen + 1, false);
732 MemoryAccessRange(thr, pc, (uptr)dst, n, true);
733 MemoryAccessRange(thr, pc, (uptr)src, min(srclen + 1, n), false);
765 FdAccess(thr, pc, fd);
766 MemoryRangeImitateWrite(thr, pc, (uptr)res, sz);
780 FdAccess(thr, pc, fd);
781 MemoryRangeImitateWrite(thr, pc, (uptr)res, sz);
795 ctx->metamap.ResetRange(thr, pc, (uptr)addr, (uptr)sz);
804 return user_alloc(thr, pc, sz, align);
814 return user_alloc(thr, pc, sz, align);
819 return user_alloc(thr, pc, sz, GetPageSizeCached());
827 return user_alloc(thr, pc, sz, GetPageSizeCached());
837 *memptr = user_alloc(thr, pc, sz, align);
868 Acquire(thr, pc, (uptr)g);
878 Release(thr, pc, (uptr)g);
889 ThreadState *thr = cur_thread();
890 ThreadFinish(thr);
891 ThreadSignalContext *sctx = thr->signal_ctx;
893 thr->signal_ctx = 0;
927 ThreadState *thr = cur_thread();
931 ThreadIgnoreBegin(thr, 0);
937 ThreadIgnoreEnd(thr, 0);
941 ThreadStart(thr, tid, GetTid());
983 ThreadIgnoreBegin(thr, pc);
985 ThreadIgnoreEnd(thr, pc);
988 int tid = ThreadCreate(thr, pc, *(uptr*)th,
996 // Otherwise, this thread can call pthread_detach and reset thr->sync
1009 int tid = ThreadTid(thr, pc, (uptr)th);
1010 ThreadIgnoreBegin(thr, pc);
1012 ThreadIgnoreEnd(thr, pc);
1014 ThreadJoin(thr, pc, tid);
1023 int tid = ThreadTid(thr, pc, (uptr)th);
1026 ThreadDetach(thr, pc, tid);
1071 ThreadState *thr;
1082 ThreadSignalContext *ctx = SigCtx(arg->thr);
1085 MutexLock(arg->thr, arg->pc, (uptr)arg->m);
1087 arg->thr->ignore_interceptors--;
1094 MemoryAccessRange(thr, pc, (uptr)c, sizeof(uptr), true);
1101 MemoryAccessRange(thr, pc, (uptr)c, sizeof(uptr), false);
1102 MutexUnlock(thr, pc, (uptr)m);
1103 CondMutexUnlockCtx arg = {&si, thr, pc, m};
1109 BlockingCall bc(thr);
1115 MutexRepair(thr, pc, (uptr)m);
1116 MutexLock(thr, pc, (uptr)m);
1123 MemoryAccessRange(thr, pc, (uptr)c, sizeof(uptr), false);
1124 MutexUnlock(thr, pc, (uptr)m);
1125 CondMutexUnlockCtx arg = {&si, thr, pc, m};
1130 BlockingCall bc(thr);
1136 MutexRepair(thr, pc, (uptr)m);
1137 MutexLock(thr, pc, (uptr)m);
1144 MemoryAccessRange(thr, pc, (uptr)c, sizeof(uptr), false);
1151 MemoryAccessRange(thr, pc, (uptr)c, sizeof(uptr), false);
1158 MemoryAccessRange(thr, pc, (uptr)c, sizeof(uptr), true);
1179 MutexCreate(thr, pc, (uptr)m, false, recursive, false);
1188 MutexDestroy(thr, pc, (uptr)m);
1197 MutexRepair(thr, pc, (uptr)m);
1199 MutexLock(thr, pc, (uptr)m, /*rec=*/1, /*try_lock=*/true);
1208 MutexLock(thr, pc, (uptr)m);
1219 MutexCreate(thr, pc, (uptr)m, false, false, false);
1228 MutexDestroy(thr, pc, (uptr)m);
1237 MutexLock(thr, pc, (uptr)m);
1246 MutexLock(thr, pc, (uptr)m, /*rec=*/1, /*try_lock=*/true);
1253 MutexUnlock(thr, pc, (uptr)m);
1263 MutexCreate(thr, pc, (uptr)m, true, false, false);
1272 MutexDestroy(thr, pc, (uptr)m);
1281 MutexReadLock(thr, pc, (uptr)m);
1290 MutexReadLock(thr, pc, (uptr)m, /*try_lock=*/true);
1300 MutexReadLock(thr, pc, (uptr)m);
1310 MutexLock(thr, pc, (uptr)m);
1319 MutexLock(thr, pc, (uptr)m, /*rec=*/1, /*try_lock=*/true);
1329 MutexLock(thr, pc, (uptr)m);
1337 MutexReadOrWriteUnlock(thr, pc, (uptr)m);
1345 MemoryWrite(thr, pc, (uptr)b, kSizeLog1);
1352 MemoryWrite(thr, pc, (uptr)b, kSizeLog1);
1359 Release(thr, pc, (uptr)b);
1360 MemoryRead(thr, pc, (uptr)b, kSizeLog1);
1362 MemoryRead(thr, pc, (uptr)b, kSizeLog1);
1364 Acquire(thr, pc, (uptr)b);
1383 if (!thr->in_ignored_lib)
1384 Release(thr, pc, (uptr)o);
1391 if (!thr->in_ignored_lib)
1392 Acquire(thr, pc, (uptr)o);
1400 READ_STRING(thr, pc, path, 0);
1411 READ_STRING(thr, pc, path, 0);
1415 READ_STRING(thr, pc, path, 0);
1423 READ_STRING(thr, pc, path, 0);
1434 READ_STRING(thr, pc, path, 0);
1445 READ_STRING(thr, pc, path, 0);
1456 READ_STRING(thr, pc, path, 0);
1460 READ_STRING(thr, pc, path, 0);
1468 READ_STRING(thr, pc, path, 0);
1479 READ_STRING(thr, pc, path, 0);
1491 FdAccess(thr, pc, fd);
1503 FdAccess(thr, pc, fd);
1508 FdAccess(thr, pc, fd);
1517 FdAccess(thr, pc, fd);
1529 FdAccess(thr, pc, fd);
1539 READ_STRING(thr, pc, name, 0);
1542 FdFileCreate(thr, pc, fd);
1549 READ_STRING(thr, pc, name, 0);
1552 FdFileCreate(thr, pc, fd);
1562 READ_STRING(thr, pc, name, 0);
1565 FdFileCreate(thr, pc, fd);
1572 READ_STRING(thr, pc, name, 0);
1575 FdFileCreate(thr, pc, fd);
1587 FdDup(thr, pc, oldfd, newfd, true);
1595 FdDup(thr, pc, oldfd, newfd2, false);
1604 FdDup(thr, pc, oldfd, newfd2, false);
1614 FdEventCreate(thr, pc, fd);
1626 FdClose(thr, pc, fd);
1629 FdSignalCreate(thr, pc, fd);
1642 FdInotifyCreate(thr, pc, fd);
1655 FdInotifyCreate(thr, pc, fd);
1667 FdSocketCreate(thr, pc, fd);
1675 FdPipeCreate(thr, pc, fd[0], fd[1]);
1681 FdSocketConnecting(thr, pc, fd);
1684 FdSocketConnect(thr, pc, fd);
1692 FdAccess(thr, pc, fd);
1700 FdAccess(thr, pc, fd);
1709 FdPollCreate(thr, pc, fd);
1722 FdPollCreate(thr, pc, fd);
1733 FdClose(thr, pc, fd);
1741 FdClose(thr, pc, fd);
1757 FdClose(thr, pc, fds[i]);
1770 FdPipeCreate(thr, pc, pipefd[0], pipefd[1]);
1779 FdPipeCreate(thr, pc, pipefd[0], pipefd[1]);
1787 FdAccess(thr, pc, fd);
1788 FdRelease(thr, pc, fd);
1797 FdAccess(thr, pc, fd);
1798 FdRelease(thr, pc, fd);
1807 FdAccess(thr, pc, fd);
1810 FdAcquire(thr, pc, fd);
1817 Release(thr, pc, File2addr(path));
1828 FdFileCreate(thr, pc, fd);
1840 FdFileCreate(thr, pc, fd);
1853 MemoryAccessRange(thr, pc, (uptr)ptr, size * nmemb, true);
1862 MemoryAccessRange(thr, pc, (uptr)p, size * nmemb, false);
1882 MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s), false);
1888 Release(thr, pc, Dir2addr(path));
1896 FdClose(thr, pc, fd);
1904 FdAccess(thr, pc, epfd);
1906 FdAccess(thr, pc, fd);
1908 FdRelease(thr, pc, epfd);
1921 FdAccess(thr, pc, epfd);
1924 FdAcquire(thr, pc, epfd);
1934 static void CallUserSignalHandler(ThreadState *thr, bool sync, bool acquire,
1937 Acquire(thr, 0, (uptr)&sigactions[sig]);
1964 ObtainCurrentStack(thr, StackTrace::GetNextInstructionPc(pc), &stack);
1969 OutputReport(thr, rep);
1975 void ProcessPendingSignals(ThreadState *thr) {
1976 ThreadSignalContext *sctx = SigCtx(thr);
1981 atomic_fetch_add(&thr->in_signal_handler, 1, memory_order_relaxed);
1988 CallUserSignalHandler(thr, false, true, signal->sigaction, sig,
1993 atomic_fetch_add(&thr->in_signal_handler, -1, memory_order_relaxed);
2007 ThreadState *thr = cur_thread();
2008 ThreadSignalContext *sctx = SigCtx(thr);
2020 atomic_fetch_add(&thr->in_signal_handler, 1, memory_order_relaxed);
2024 int const i = thr->ignore_interceptors;
2025 thr->ignore_interceptors = 0;
2027 CallUserSignalHandler(thr, sync, true, sigact, sig, info, ctx);
2028 thr->ignore_interceptors = i;
2037 CallUserSignalHandler(thr, sync, acq, sigact, sig, info, ctx);
2039 atomic_fetch_add(&thr->in_signal_handler, -1, memory_order_relaxed);
2093 ReleaseStore(thr, pc, (uptr)&sigactions[sig]);
2117 ThreadSignalContext *sctx = SigCtx(thr);
2129 ThreadSignalContext *sctx = SigCtx(thr);
2145 ThreadSignalContext *sctx = SigCtx(thr);
2171 ThreadIgnoreBegin(thr, pc);
2173 ThreadIgnoreEnd(thr, pc);
2181 ForkBefore(thr, pc);
2185 ForkChildAfter(thr, pc);
2186 FdOnFork(thr, pc);
2189 ForkParentAfter(thr, pc);
2192 ForkParentAfter(thr, pc);
2218 ThreadState *thr;
2237 MemoryResetRange(cbdata->thr, cbdata->pc, (uptr)info->dlpi_name,
2243 MemoryResetRange(cbdata->thr, cbdata->pc, (uptr)info->dlpi_name,
2251 cbdata.thr = thr;
2260 static int OnExit(ThreadState *thr) {
2261 int status = Finalize(thr);
2267 ThreadState *thr;
2273 static void HandleRecvmsg(ThreadState *thr, uptr pc,
2278 FdEventCreate(thr, pc, fds[i]);
2311 MemoryAccessRange(((TsanInterceptorContext *)ctx)->thr, \
2316 MemoryAccessRange(((TsanInterceptorContext *) ctx)->thr, \
2322 TsanInterceptorContext _ctx = {thr, caller_pc, pc}; \
2328 TsanInterceptorContext _ctx = {thr, caller_pc, pc}; \
2333 Acquire(thr, pc, File2addr(path)); \
2336 if (fd >= 0) FdFileCreate(thr, pc, fd); \
2342 if (fd >= 0) FdClose(thr, pc, fd); \
2352 Acquire(((TsanInterceptorContext *) ctx)->thr, pc, u)
2355 Release(((TsanInterceptorContext *) ctx)->thr, pc, u)
2358 Acquire(((TsanInterceptorContext *) ctx)->thr, pc, Dir2addr(path))
2361 FdAcquire(((TsanInterceptorContext *) ctx)->thr, pc, fd)
2364 FdRelease(((TsanInterceptorContext *) ctx)->thr, pc, fd)
2367 FdAccess(((TsanInterceptorContext *) ctx)->thr, pc, fd)
2370 FdSocketAccept(((TsanInterceptorContext *) ctx)->thr, pc, fd, newfd)
2373 ThreadSetName(((TsanInterceptorContext *) ctx)->thr, name)
2381 OnExit(((TsanInterceptorContext *) ctx)->thr)
2384 MutexLock(((TsanInterceptorContext *)ctx)->thr, \
2388 MutexUnlock(((TsanInterceptorContext *)ctx)->thr, \
2392 MutexRepair(((TsanInterceptorContext *)ctx)->thr, \
2397 HandleRecvmsg(((TsanInterceptorContext *)ctx)->thr, \
2412 ThreadState *thr = cur_thread(); \
2413 if (thr->ignore_interceptors) \
2415 ScopedSyscall scoped_syscall(thr) \
2419 ThreadState *thr;
2421 explicit ScopedSyscall(ThreadState *thr)
2422 : thr(thr) {
2423 Initialize(thr);
2427 ProcessPendingSignals(thr);
2434 MemoryAccessRange(thr, pc, p, s, write);
2439 Acquire(thr, pc, addr);
2446 Release(thr, pc, addr);
2451 FdClose(thr, pc, fd);
2456 FdAcquire(thr, pc, fd);
2463 FdRelease(thr, pc, fd);
2468 ForkBefore(thr, pc);
2475 ForkChildAfter(thr, pc);
2476 FdOnFork(thr, pc);
2479 ForkParentAfter(thr, pc);
2482 ForkParentAfter(thr, pc);
2528 ThreadState *thr = cur_thread();
2529 int status = Finalize(thr);