Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 8f4ce08

Browse files
authored
Merge pull request #53 from aconchillo/multiple-backends
add support for multiple backend (epoll, libevent...)
2 parents 0fa712e + 0be1359 commit 8f4ce08

50 files changed

Lines changed: 1213 additions & 283 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/guile2.2.yml

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ on:
88

99
jobs:
1010
build:
11-
1211
runs-on: ubuntu-22.04
13-
1412
steps:
1513
- name: Install dependencies
1614
run: |
@@ -24,9 +22,24 @@ jobs:
2422
run: ./autogen.sh
2523
- name: Configure
2624
run: ./configure
27-
- name: Make
28-
run: make
29-
- name: Run tests
30-
run: make check
3125
- name: Make distribution
3226
run: make distcheck
27+
28+
build-libevent:
29+
runs-on: ubuntu-22.04
30+
steps:
31+
- name: Install dependencies
32+
run: |
33+
sudo apt update
34+
sudo apt install automake autoconf libtool pkg-config make gcc
35+
sudo apt install guile-2.2 guile-2.2-libs guile-2.2-dev
36+
sudo apt install gettext texinfo texlive
37+
sudo apt install libevent-dev
38+
- name: Checkout repository
39+
uses: actions/checkout@v2
40+
- name: Autogen
41+
run: ./autogen.sh
42+
- name: Configure
43+
run: ./configure --disable-epoll
44+
- name: Make distribution
45+
run: make distcheck DISTCHECK_CONFIGURE_FLAGS=--disable-epoll

.github/workflows/guile3.0.yml

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ on:
88

99
jobs:
1010
build:
11-
1211
runs-on: ubuntu-22.04
13-
1412
steps:
1513
- name: Install dependencies
1614
run: |
@@ -24,9 +22,24 @@ jobs:
2422
run: ./autogen.sh
2523
- name: Configure
2624
run: ./configure
27-
- name: Make
28-
run: make
29-
- name: Run tests
30-
run: make check
3125
- name: Make distribution
3226
run: make distcheck
27+
28+
build-libevent:
29+
runs-on: ubuntu-22.04
30+
steps:
31+
- name: Install dependencies
32+
run: |
33+
sudo apt update
34+
sudo apt install automake autoconf libtool pkg-config make gcc
35+
sudo apt install guile-3.0 guile-3.0-libs guile-3.0-dev
36+
sudo apt install gettext texinfo texlive
37+
sudo apt install libevent-dev
38+
- name: Checkout repository
39+
uses: actions/checkout@v2
40+
- name: Autogen
41+
run: ./autogen.sh
42+
- name: Configure
43+
run: ./configure --disable-epoll
44+
- name: Make distribution
45+
run: make distcheck DISTCHECK_CONFIGURE_FLAGS=--disable-epoll

.gitignore

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
.deps
2+
.libs
3+
.dirstamp
4+
build/
15
/INSTALL
26
/Makefile
37
/Makefile.in
@@ -15,6 +19,8 @@
1519
/config.log
1620
/config.status
1721
/configure
22+
/configure~
23+
/configure.ac~
1824
/env
1925
/libtool
2026
/m4/libtool.m4
@@ -23,12 +29,15 @@
2329
/m4/ltversion.m4
2430
/m4/lt~obsolete.m4
2531
/stamp-h1
26-
/.deps
27-
/.libs
32+
/build-aux/ar-lib
2833
/build-aux/depcomp
29-
/epoll.la
30-
/epoll_la-epoll.lo
31-
*.go
32-
/fibers.info
3334
/build-aux/texinfo.tex
35+
/fibers.info
36+
/fibers/affinity.scm
3437
/fibers/config.scm
38+
/fibers/posix-clocks.scm
39+
/fibers/events-impl.scm
40+
*.la
41+
*.lo
42+
*.go
43+
*.o

Makefile.am

Lines changed: 82 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# fibers
2-
# Copyright (C) 2016 Andy Wingo <wingo@pobox.com>
2+
# Copyright (C) 2016 Andy Wingo <wingo@pobox.com>
3+
# Copyright (C) 2020 Abdulrahman Semrie <hsamireh@gmail.com>
4+
# Copyright (C) 2020-2022 Aleix Conchillo Flaqué <aconchillo@gmail.com>
35
#
46
# This program is free software: you can redistribute it and/or modify
57
# it under the terms of the GNU Lesser General Public License as
@@ -26,42 +28,85 @@ info_TEXINFOS=fibers.texi
2628

2729
SOURCES = \
2830
fibers.scm \
31+
fibers/affinity.scm \
2932
fibers/channels.scm \
3033
fibers/conditions.scm \
3134
fibers/config.scm \
3235
fibers/counter.scm \
36+
fibers/events-impl.scm \
3337
fibers/deque.scm \
34-
fibers/epoll.scm \
3538
fibers/interrupts.scm \
3639
fibers/io-wakeup.scm \
3740
fibers/nameset.scm \
3841
fibers/operations.scm \
3942
fibers/posix-clocks.scm \
4043
fibers/psq.scm \
44+
fibers/repl.scm \
4145
fibers/scheduler.scm \
4246
fibers/stack.scm \
43-
fibers/repl.scm \
4447
fibers/timers.scm \
4548
fibers/web/server.scm \
4649
web/server/fibers.scm
4750

48-
BUILT_SOURCES = fibers/config.scm
51+
BUILT_SOURCES = \
52+
fibers/affinity.scm \
53+
fibers/config.scm \
54+
fibers/events-impl.scm \
55+
fibers/posix-clocks.scm
4956

5057
extlibdir = $(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/extensions
51-
extlib_LTLIBRARIES = epoll.la
5258
AM_CFLAGS = -I$(srcdir) $(WARN_CFLAGS) $(DEBUG_CFLAGS)
53-
epoll_la_SOURCES = epoll.c
54-
epoll_la_CFLAGS = $(AM_CFLAGS) $(GUILE_CFLAGS)
55-
epoll_la_LIBADD = $(GUILE_LIBS)
56-
epoll_la_LDFLAGS = -export-dynamic -module
57-
$(GOBJECTS): epoll.la
59+
60+
extlib_LTLIBRARIES =
61+
62+
if HAVE_LIBEVENT
63+
extlib_LTLIBRARIES += fibers-libevent.la
64+
fibers_libevent_la_SOURCES = extensions/libevent.c
65+
fibers_libevent_la_CFLAGS = $(AM_CFLAGS) $(GUILE_CFLAGS) $(LIBEVENT_CFLAGS) -I$(top_srcdir)/extensions
66+
fibers_libevent_la_LDFLAGS = -module -no-undefined $(LIBEVENT_LIBS) $(GUILE_LDFLAGS)
67+
$(GOBJECTS): fibers-libevent.la
68+
69+
fibers/events-impl.scm: Makefile fibers/libevent.scm
70+
cp -f $(abs_top_srcdir)/fibers/libevent.scm $(abs_top_builddir)/fibers/events-impl.scm
71+
else
72+
if HAVE_EPOLL_WAIT
73+
extlib_LTLIBRARIES += fibers-epoll.la
74+
fibers_epoll_la_SOURCES = extensions/epoll.c
75+
fibers_epoll_la_CFLAGS = $(AM_CFLAGS) $(GUILE_CFLAGS) -I$(top_srcdir)/extensions
76+
fibers_epoll_la_LIBADD = $(GUILE_LIBS)
77+
fibers_epoll_la_LDFLAGS = -export-dynamic -module
78+
$(GOBJECTS): fibers-epoll.la
79+
80+
fibers/events-impl.scm: Makefile fibers/epoll.scm
81+
cp -f $(abs_top_srcdir)/fibers/epoll.scm $(abs_top_builddir)/fibers/events-impl.scm
82+
endif
83+
endif
84+
85+
if ! HAVE_CLOCK_NANOSLEEP
86+
extlib_LTLIBRARIES += fibers-clocks.la
87+
fibers_clocks_la_SOURCES = extensions/$(PLATFORM)/clock-nanosleep.c
88+
fibers_clocks_la_CFLAGS = $(AM_CFLAGS) $(GUILE_CFLAGS) -I$(top_srcdir)/extensions
89+
fibers_clocks_la_LDFLAGS = -module -no-undefined $(GUILE_LDFLAGS)
90+
endif
5891

5992
fibers/config.scm: Makefile fibers/config.scm.in
6093
mkdir -p fibers
6194
sed -e "s|@extlibdir\@|$(extlibdir)|" \
6295
$(srcdir)/fibers/config.scm.in > fibers/config.scm
6396

64-
CLEANFILES += fibers/config.scm
97+
fibers/affinity.scm: Makefile fibers/affinity-$(PLATFORM).scm
98+
mkdir -p $(abs_top_builddir)/fibers
99+
cp -f $(abs_top_srcdir)/fibers/affinity-$(PLATFORM).scm $(abs_top_builddir)/fibers/affinity.scm
100+
101+
fibers/posix-clocks.scm: Makefile fibers/posix-clocks-$(PLATFORM).scm
102+
mkdir -p $(abs_top_builddir)/fibers
103+
cp -f $(abs_top_srcdir)/fibers/posix-clocks-$(PLATFORM).scm $(abs_top_builddir)/fibers/posix-clocks.scm
104+
105+
CLEANFILES += \
106+
fibers/affinity.scm \
107+
fibers/config.scm \
108+
fibers/events-impl.scm \
109+
fibers/posix-clocks.scm
65110

66111
TESTS = \
67112
tests/basic.scm \
@@ -70,19 +115,40 @@ TESTS = \
70115
tests/foreign.scm \
71116
tests/io-wakeup.scm \
72117
tests/parameters.scm \
73-
tests/ports.scm \
74118
tests/preemption.scm \
75-
tests/speedup.scm \
119+
tests/speedup.scm
120+
121+
# The following tests require SOCK_NONBLOCK and SOCK_CLOEXEC. For now we just
122+
# run them on a platform that supports epoll (probably Linux).
123+
if HAVE_EPOLL_WAIT
124+
TESTS += \
125+
tests/ports.scm \
76126
tests/concurrent-web-server.scm
127+
endif
128+
77129
TESTS_ENVIRONMENT=top_srcdir="$(abs_top_srcdir)" ./env $(GUILE) -s
78130

79131
EXTRA_DIST += \
132+
$(bin_SCRIPTS) \
133+
$(TESTS) \
80134
env.in \
81-
fibers/config.scm.in \
82135
HACKING \
83136
COPYING.LESSER \
84137
README.md \
85138
TODO.md \
86-
$(bin_SCRIPTS) \
87-
$(TESTS) \
139+
fibers/config.scm.in \
140+
fibers/epoll.scm \
141+
fibers/libevent.scm \
142+
fibers/affinity-darwin.scm \
143+
fibers/affinity-generic.scm \
144+
fibers/posix-clocks-darwin.scm \
145+
fibers/posix-clocks-generic.scm \
88146
examples
147+
148+
# List all extension files here.
149+
EXTRA_DIST += \
150+
extensions/epoll.c \
151+
extensions/libevent.c \
152+
extensions/clock-nanosleep.h \
153+
extensions/darwin/clock-nanosleep.c \
154+
extensions/generic/clock-nanosleep.c

build-aux/guile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ EXTRA_DIST = $(SOURCES) $(NOCOMP_SOURCES)
2222
GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat
2323
SUFFIXES = .scm .go
2424
.scm.go:
25-
$(AM_V_GEN)$(CROSS_COMPILING_VARIABLE)$(top_builddir)/env \
25+
$(AM_V_GEN)$(CROSS_COMPILING_VARIABLE) $(top_builddir)/env \
2626
$(GUILE_TOOLS) compile $(GUILE_TARGET) -L "$(abs_top_srcdir)" \
2727
$(GUILE_WARNINGS) -o "$@" "$<"

configure.ac

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
define(FIBERS_CONFIGURE_COPYRIGHT,[[
22
3-
Copyright (C) 2016-2022 Andy Wingo <wingo@pobox.com>
3+
Copyright (C) 2016 Andy Wingo <wingo@pobox.com>
4+
Copyright (C) 2020 Abdulrahman Semrie <hsamireh@gmail.com>
5+
Copyright (C) 2020-2022 Aleix Conchillo Flaqué <aconchillo@gmail.com>
46
57
This program is free software: you can redistribute it and/or modify
68
it under the terms of the GNU Lesser General Public License as
@@ -18,39 +20,65 @@ License along with this program. If not, see
1820
1921
]])
2022

21-
AC_PREREQ(2.52)
22-
AC_INIT([fibers], [1.1.1])
23+
AC_PREREQ([2.71])
24+
AC_INIT([fibers],[1.1.1])
2325
AC_CONFIG_SRCDIR([env.in])
2426
AC_CONFIG_AUX_DIR([build-aux])
2527
AC_CONFIG_MACRO_DIRS([m4])
26-
AM_INIT_AUTOMAKE([serial-tests])
28+
AM_INIT_AUTOMAKE([subdir-objects serial-tests -Werror foreign])
2729
AC_COPYRIGHT(FIBERS_CONFIGURE_COPYRIGHT)
28-
AM_CONFIG_HEADER(config.h)
30+
AC_CONFIG_HEADERS([config.h])
2931

30-
AC_DISABLE_STATIC
31-
32-
AC_ISC_POSIX
3332
AC_PROG_CC
34-
AC_STDC_HEADERS
35-
AC_PROG_LIBTOOL
3633

37-
AC_CHECK_HEADERS([sys/epoll.h])
38-
AC_CHECK_FUNCS([epoll_create epoll_create1])
34+
LT_INIT([disable-static])
3935

4036
AM_CONDITIONAL([CROSS_COMPILING], [test "x$cross_compiling" = "xyes"])
4137

42-
if test "$cross_compiling" = "no"; then
38+
if test "x$cross_compiling" = "xno"; then
4339
GUILE_TARGET=""
4440
else
4541
GUILE_TARGET="--target=$host_alias"
4642
fi
4743
AC_SUBST([GUILE_TARGET])
4844

4945
WARN_CFLAGS=-Wall
50-
AC_ARG_ENABLE([Werror], AC_HELP_STRING([--disable-Werror],[Don't stop the build on errors]),
51-
[], WARN_CFLAGS="-Wall -Werror")
46+
AC_ARG_ENABLE([Werror], AS_HELP_STRING([--disable-Werror],[Don't stop the build on errors]),
47+
[], WARN_CFLAGS="-Wall -Werror")
5248
AC_SUBST(WARN_CFLAGS)
5349

50+
AC_ARG_ENABLE([epoll], AS_HELP_STRING([--disable-epoll],[Disable epoll support]),
51+
[disable_epoll=yes], [disable_epoll=no])
52+
53+
AC_CHECK_FUNCS(epoll_wait)
54+
AM_CONDITIONAL([HAVE_EPOLL_WAIT], [test "x$ac_cv_func_epoll_wait" = "xyes"])
55+
56+
AC_CHECK_FUNCS(clock_nanosleep)
57+
AM_CONDITIONAL([HAVE_CLOCK_NANOSLEEP], [test "x$ac_cv_func_clock_nanosleep" = "xyes"])
58+
59+
# We should update `native_support` variable to yes if any native system
60+
# (e.g. epoll, kqueue) was found and not disabled.
61+
AS_IF([test "x$ac_cv_func_epoll_wait" = "xyes"],
62+
[AS_IF([test "x$disable_epoll" = "xyes"], [native_support=no],[native_support=yes])],[native_support=no])
63+
64+
# If there's no native support or it was disabled, try libevent.
65+
AS_IF([test "x$native_support" = "xno"],
66+
[PKG_CHECK_MODULES([LIBEVENT], [libevent >= 2.1.0],[have_libevent=yes],
67+
[AC_MSG_ERROR([Not found or disabled native support, and libevent was not found either])])])
68+
69+
AM_CONDITIONAL([HAVE_LIBEVENT], [test "x$have_libevent" = "xyes"])
70+
71+
# Detect the target system
72+
case "$host_os" in
73+
*darwin*)
74+
PLATFORM=darwin
75+
;;
76+
*)
77+
PLATFORM=generic
78+
;;
79+
esac
80+
AC_SUBST(PLATFORM)
81+
5482
#
5583
# Check for Guile
5684
#

env.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ else
3333
GUILE_LOAD_COMPILED_PATH=@abs_top_builddir@:$GUILE_LOAD_COMPILED_PATH
3434
fi
3535

36+
if test "$GUILE_EXTENSIONS_PATH" = ""; then
37+
GUILE_EXTENSIONS_PATH=@abs_top_builddir@/.libs
38+
else
39+
GUILE_EXTENSIONS_PATH=@abs_top_builddir@/.libs:$GUILE_EXTENSIONS_PATH
40+
fi
41+
3642
if test "$LTDL_LIBRARY_PATH" = ""; then
3743
LTDL_LIBRARY_PATH=@abs_top_builddir@/.libs
3844
else
@@ -49,6 +55,7 @@ FIBERS_BUILD_DIR=@abs_top_builddir@
4955

5056
export GUILE_LOAD_PATH
5157
export GUILE_LOAD_COMPILED_PATH
58+
export GUILE_EXTENSIONS_PATH
5259
export LTDL_LIBRARY_PATH
5360
export PATH
5461
export FIBERS_BUILD_DIR

examples/memcached-client.scm

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@
1212
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1313
;; Lesser General Public License for more details.
1414
;;
15-
;; You should have received a copy of the GNU Lesser General Public
16-
;; License along with this library; if not, write to the Free Software
17-
;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18-
;; 02110-1301 USA
15+
;; You should have received a copy of the GNU Lesser General Public License
16+
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
1917

2018
(use-modules (rnrs bytevectors)
2119
(fibers)

0 commit comments

Comments
 (0)