- Use atomic ops both to set and reset async_sent flag - Remove the MinGW atomic ops, since Windows intrinsics are supported - Remone thread-unsafe checks from uv_async_send According to MSDN there are no alignment requirements. We could use InterlockedExchange8, but that's only available on Windows >= 8. This change is intended to make uv_async_send more resilient. It has to be thread-safe, and that means that the handle could just have been closed when uv_async_send was called. This case was previously not handles (there is an inherent race condition). The new model is inspired by the one used on the Unix side, which uses a single fd (or overlapped in this case) to wakeup the loop and then process all pending async handles. This makes handling those edge cases a lot simpler: when the handle is closed it's removed from the handle queue, and then it's not processed at all. As a result of this change, async benchmarks work on Windows where they previously failed with assertions. PR-URL: https://github.com/libuv/libuv/pull/980 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
83 lines
2.3 KiB
Makefile
83 lines
2.3 KiB
Makefile
# Copyright (c) 2013, Ben Noordhuis <info@bnoordhuis.nl>
|
|
#
|
|
# Permission to use, copy, modify, and/or distribute this software for any
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
# copyright notice and this permission notice appear in all copies.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
CC ?= gcc
|
|
|
|
CFLAGS += -Wall \
|
|
-Wextra \
|
|
-Wno-unused-parameter \
|
|
-Iinclude \
|
|
-Isrc \
|
|
-Isrc/win \
|
|
-DWIN32_LEAN_AND_MEAN \
|
|
-D_WIN32_WINNT=0x0600
|
|
|
|
INCLUDES = include/tree.h \
|
|
include/uv-errno.h \
|
|
include/uv-threadpool.h \
|
|
include/uv-version.h \
|
|
include/uv-win.h \
|
|
include/uv.h \
|
|
src/heap-inl.h \
|
|
src/queue.h \
|
|
src/uv-common.h \
|
|
src/win/handle-inl.h \
|
|
src/win/internal.h \
|
|
src/win/req-inl.h \
|
|
src/win/stream-inl.h \
|
|
src/win/winapi.h \
|
|
src/win/winsock.h
|
|
|
|
OBJS = src/fs-poll.o \
|
|
src/inet.o \
|
|
src/loop-watcher.o \
|
|
src/threadpool.o \
|
|
src/uv-common.o \
|
|
src/version.o \
|
|
src/win/async.o \
|
|
src/win/core.o \
|
|
src/win/dl.o \
|
|
src/win/error.o \
|
|
src/win/fs-event.o \
|
|
src/win/fs.o \
|
|
src/win/getaddrinfo.o \
|
|
src/win/getnameinfo.o \
|
|
src/win/handle.o \
|
|
src/win/pipe.o \
|
|
src/win/poll.o \
|
|
src/win/process-stdio.o \
|
|
src/win/process.o \
|
|
src/win/req.o \
|
|
src/win/signal.o \
|
|
src/win/stream.o \
|
|
src/win/tcp.o \
|
|
src/win/thread.o \
|
|
src/win/timer.o \
|
|
src/win/tty.o \
|
|
src/win/udp.o \
|
|
src/win/util.o \
|
|
src/win/winapi.o \
|
|
src/win/winsock.o
|
|
|
|
all: libuv.a
|
|
|
|
clean:
|
|
-$(RM) $(OBJS) libuv.a
|
|
|
|
libuv.a: $(OBJS)
|
|
$(AR) crs $@ $^
|
|
|
|
$(OBJS): %.o : %.c $(INCLUDES)
|
|
$(CC) $(CFLAGS) -c -o $@ $<
|