Shachar Shemesh wrote:
Hi all,
Attached is a non-perfect patch for review. This is a migration of the wineserver to use epoll instead of poll (if it's available).
current known issue with this patch: 1. Will not compile if HAVE_SYS_EPOLL_H is not 1 (i.e. - won't compile if epoll not available at compile time) 2. Segfaults on wine exit. 3. Lots of debug asserts.
Comments welcome. Shachar
The patch is not yet ready for commit, but I do have preliminary benchmarks: The attached program (compiled as winelib) was used. ulimit -n was raised to 10240. With the current wine code: real 0m41.076s user 0m5.070s sys 0m7.722s the main wine process was taking 10% CPU time, and wineserver was taking over 60% cpu time. load average was over 2 With my preliminary path: real 0m20.985s user 0m5.316s sys 0m11.421s main wine process was still taking 10%, but so was wineserver. load average was about 1.5. We can see that there is a significant drop in actual execution time, even though there is an INCREASE in user+system processing time. I believe this is not a fluke (results are pretty consistent), but rather that the poll behavior was taking a huge toll on the system in areas where it wasn't attributed towards wine, even though it was wine related. I would take the real time measurement as the indicative one. Ideas for better benchmarks would be greatly appreciated. Shachar -- Shachar Shemesh Lingnu Open Source Consulting ltd. http://www.lingnu.com/ ### Generated by Winemaker SRCDIR = . SUBDIRS = DLLS = EXES = threadtest.exe ### Common settings #CEXTRA = -mno-cygwin #CXXEXTRA = -mno-cygwin CEXTRA = CXXEXTRA = RCEXTRA = INCLUDE_PATH = -I/home/sun/sources/wine/wine/include DLL_PATH = LIBRARY_PATH = LIBRARIES = ### threadtest.exe sources and settings threadtest_exe_MODULE = threadtest.exe threadtest_exe_C_SRCS = main.c threadtest_exe_CXX_SRCS= threadtest_exe_RC_SRCS= #threadtest_exe_LDFLAGS= -mconsole \ # -mno-cygwin threadtest_exe_LDFLAGS= -mconsole threadtest_exe_DLL_PATH= threadtest_exe_DLLS = threadtest_exe_LIBRARY_PATH= -L/home/sun/sources/wine/wine/libs -L/home/sun/sources/wine/wine/dlls threadtest_exe_LIBRARIES= uuid threadtest_exe_OBJS = $(threadtest_exe_C_SRCS:.c=.o) \ $(threadtest_exe_CXX_SRCS:.cpp=.o) \ $(threadtest_exe_RC_SRCS:.rc=.res) ### Global source lists C_SRCS = $(threadtest_exe_C_SRCS) CXX_SRCS = $(threadtest_exe_CXX_SRCS) RC_SRCS = $(threadtest_exe_RC_SRCS) ### Tools CC = winegcc CXX = winegcc RC = wrc WINEBUILD = winebuild ### Generic targets all: $(SUBDIRS) $(DLLS:%=%.so) $(EXES:%=%.so) ### Build rules .PHONY: all clean dummy $(SUBDIRS): dummy @cd $@ && $(MAKE) # Implicit rules .SUFFIXES: .cpp .rc .res DEFINCL = $(INCLUDE_PATH) $(DEFINES) $(OPTIONS) .c.o: $(CC) -c $(CFLAGS) $(CEXTRA) $(DEFINCL) -o $@ $< .cpp.o: $(CXX) -c $(CXXFLAGS) $(CXXEXTRA) $(DEFINCL) -o $@ $< .cxx.o: $(CXX) -c $(CXXFLAGS) $(CXXEXTRA) $(DEFINCL) -o $@ $< .rc.res: $(RC) $(RCFLAGS) $(RCEXTRA) $(DEFINCL) -fo$@ $< # Rules for cleaning CLEAN_FILES = *.dbg.c y.tab.c y.tab.h lex.yy.c \ core *.orig *.rej \ \\\#*\\\# *~ *% .\\\#* clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__) $(RM) $(CLEAN_FILES) $(RC_SRCS:.rc=.res) $(C_SRCS:.c=.o) $(CXX_SRCS:.cpp=.o) $(RM) $(DLLS:%=%.dbg.o) $(DLLS:%=%.so) $(RM) $(EXES:%=%.dbg.o) $(EXES:%=%.so) $(EXES:%.exe=%) $(SUBDIRS:%=%/__clean__): dummy cd `dirname $@` && $(MAKE) clean $(EXTRASUBDIRS:%=%/__clean__): dummy -cd `dirname $@` && $(RM) $(CLEAN_FILES) ### Target specific build rules $(threadtest_exe_MODULE).dbg.c: $(threadtest_exe_C_SRCS) $(threadtest_exe_CXX_SRCS) $(WINEBUILD) -o $@ --debug -C$(SRCDIR) $(threadtest_exe_C_SRCS) $(threadtest_exe_CXX_SRCS) $(threadtest_exe_MODULE).so: $(threadtest_exe_MODULE).dbg.o $(threadtest_exe_OBJS) $(CXX) $(threadtest_exe_LDFLAGS) -o $@ $(threadtest_exe_OBJS) $(threadtest_exe_MODULE).dbg.o $(threadtest_exe_LIBRARY_PATH) $(LIBRARY_PATH) $(threadtest_exe_DLLS:%=-l%) $(threadtest_exe_LIBRARIES:%=-l%)