From 542a46125c8ed7010a0d55542a9e6a7d3f70443c Mon Sep 17 00:00:00 2001 From: weiyu Date: Fri, 4 Sep 2020 18:01:16 -0700 Subject: [PATCH] Add support for epoll --- Makefile | 2 +- threads-model.h | 2 ++ threads.cc | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index adb080de..1fdbf702 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ OBJECTS := libthreads.o schedule.o model.o threads.o librace.o action.o \ snapshot.o malloc.o mymemory.o common.o mutex.o conditionvariable.o \ context.o execution.o libannotate.o plugins.o pthread.o futex.o fuzzer.o \ sleeps.o history.o funcnode.o funcinst.o predicate.o printf.o newfuzzer.o \ - concretepredicate.o waitobj.o hashfunction.o pipe.o actionlist.o + concretepredicate.o waitobj.o hashfunction.o pipe.o epoll.o actionlist.o CPPFLAGS += -Iinclude -I. LDFLAGS := -ldl -lrt -rdynamic -lpthread diff --git a/threads-model.h b/threads-model.h index 15dd1515..a99f6619 100644 --- a/threads-model.h +++ b/threads-model.h @@ -13,6 +13,7 @@ #include "context.h" #include "classlist.h" #include "pthread.h" +#include struct thread_params { thrd_start_t func; @@ -232,6 +233,7 @@ static inline int id_to_int(thread_id_t id) return id; } +int real_epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); int real_pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr); int real_pthread_mutex_lock (pthread_mutex_t *__mutex); int real_pthread_mutex_unlock (pthread_mutex_t *__mutex); diff --git a/threads.cc b/threads.cc index e22ffa32..faa49fc5 100644 --- a/threads.cc +++ b/threads.cc @@ -16,8 +16,9 @@ #include "schedule.h" #include "clockvector.h" -#ifdef TLS #include + +#ifdef TLS uintptr_t get_tls_addr() { uintptr_t addr; asm ("mov %%fs:0, %0" : "=r" (addr)); @@ -110,6 +111,13 @@ void thread_startup() #endif } + +static int (*real_epoll_wait_p)(int epfd, struct epoll_event *events, int maxevents, int timeout) = NULL; + +int real_epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) { + return real_epoll_wait_p(epfd, events, maxevents, timeout); +} + static int (*pthread_mutex_init_p)(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) = NULL; int real_pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) { @@ -148,6 +156,13 @@ void real_pthread_exit (void * value_ptr) { void real_init_all() { char * error; + if (!real_epoll_wait_p) { + real_epoll_wait_p = (int (*)(int epfd, struct epoll_event *events, int maxevents, int timeout))dlsym(RTLD_NEXT, "epoll_wait"); + if ((error = dlerror()) != NULL) { + fputs(error, stderr); + exit(EXIT_FAILURE); + } + } if (!pthread_mutex_init_p) { pthread_mutex_init_p = (int (*)(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr))dlsym(RTLD_NEXT, "pthread_mutex_init"); if ((error = dlerror()) != NULL) { -- 2.34.1