Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
GHC
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
jberryman
GHC
Commits
40114073
Commit
40114073
authored
Jul 24, 2010
by
tibbe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Integrate new I/O manager, with signal support
parent
0cbdc7b1
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
92 additions
and
73 deletions
+92
-73
configure.ac
configure.ac
+4
-0
includes/rts/Globals.h
includes/rts/Globals.h
+6
-5
includes/rts/IOManager.h
includes/rts/IOManager.h
+2
-2
rts/Globals.c
rts/Globals.c
+22
-15
rts/Linker.c
rts/Linker.c
+8
-8
rts/Prelude.h
rts/Prelude.h
+6
-6
rts/package.conf.in
rts/package.conf.in
+6
-6
rts/posix/Signals.c
rts/posix/Signals.c
+34
-27
rts/win32/ThrIOManager.c
rts/win32/ThrIOManager.c
+2
-2
rts/win32/libHSbase.def
rts/win32/libHSbase.def
+2
-2
No files found.
configure.ac
View file @
40114073
...
...
@@ -878,6 +878,10 @@ AC_TRY_LINK_FUNC(printf\$LDBLStub,
[Define to 1 if we have printf$LDBLStub (Apple Mac OS >= 10.4, PPC).])
])
dnl ** check for eventfd which is needed by the I/O manager
AC_CHECK_HEADERS([sys/eventfd.h])
AC_CHECK_FUNCS([eventfd])
# test for GTK+
AC_PATH_PROGS([GTK_CONFIG], [pkg-config])
if test -n "$GTK_CONFIG"; then
...
...
includes/rts/Globals.h
View file @
40114073
...
...
@@ -18,10 +18,11 @@
#define RTS_GLOBALS_H
StgStablePtr
getOrSetTypeableStore
(
StgStablePtr
value
);
StgStablePtr
getOrSetGHCConcSignalHandlerStore
(
StgStablePtr
value
);
StgStablePtr
getOrSetGHCConcPendingEventsStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetGHCConcPendingDelaysStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetGHCConcIOManagerThreadStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetGHCConcProddingStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetGHCConcSignalSignalHandlerStore
(
StgStablePtr
value
);
StgStablePtr
getOrSetGHCConcWindowsPendingDelaysStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetGHCConcWindowsIOManagerThreadStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetGHCConcWindowsProddingStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetSystemEventThreadEventManagerStore
(
StgStablePtr
ptr
);
StgStablePtr
getOrSetSystemEventThreadIOManagerThreadStore
(
StgStablePtr
ptr
);
#endif
/* RTS_GLOBALS_H */
includes/rts/IOManager.h
View file @
40114073
...
...
@@ -26,8 +26,8 @@ void sendIOManagerEvent (HsWord32 event);
#else
void
setIOManager
Pipe
(
int
fd
);
void
ioManagerSync
(
voi
d
);
void
setIOManager
ControlFd
(
int
fd
);
void
setIOManagerWakeupFd
(
int
f
d
);
#endif
...
...
rts/Globals.c
View file @
40114073
...
...
@@ -20,11 +20,12 @@
typedef
enum
{
TypeableStore
,
GHCConcSignalHandlerStore
,
GHCConcPendingEventsStore
,
GHCConcPendingDelaysStore
,
GHCConcIOManagerThreadStore
,
GHCConcProddingStore
,
GHCConcSignalSignalHandlerStore
,
GHCConcWindowsPendingDelaysStore
,
GHCConcWindowsIOManagerThreadStore
,
GHCConcWindowsProddingStore
,
SystemEventThreadEventManagerStore
,
SystemEventThreadIOManagerThreadStore
,
MaxStoreKey
}
StoreKey
;
...
...
@@ -87,31 +88,37 @@ getOrSetTypeableStore(StgStablePtr ptr)
}
StgStablePtr
getOrSetGHCConcSignalHandlerStore
(
StgStablePtr
ptr
)
getOrSetGHCConcSignal
Signal
HandlerStore
(
StgStablePtr
ptr
)
{
return
getOrSetKey
(
GHCConcSignalHandlerStore
,
ptr
);
return
getOrSetKey
(
GHCConcSignal
Signal
HandlerStore
,
ptr
);
}
StgStablePtr
getOrSetGHCConc
PendingEvent
sStore
(
StgStablePtr
ptr
)
getOrSetGHCConc
WindowsPendingDelay
sStore
(
StgStablePtr
ptr
)
{
return
getOrSetKey
(
GHCConc
PendingEvent
sStore
,
ptr
);
return
getOrSetKey
(
GHCConc
WindowsPendingDelay
sStore
,
ptr
);
}
StgStablePtr
getOrSetGHCConc
PendingDelays
Store
(
StgStablePtr
ptr
)
getOrSetGHCConc
WindowsIOManagerThread
Store
(
StgStablePtr
ptr
)
{
return
getOrSetKey
(
GHCConc
PendingDelays
Store
,
ptr
);
return
getOrSetKey
(
GHCConc
WindowsIOManagerThread
Store
,
ptr
);
}
StgStablePtr
getOrSetGHCConc
IOManagerThread
Store
(
StgStablePtr
ptr
)
getOrSetGHCConc
WindowsProdding
Store
(
StgStablePtr
ptr
)
{
return
getOrSetKey
(
GHCConc
IOManagerThread
Store
,
ptr
);
return
getOrSetKey
(
GHCConc
WindowsProdding
Store
,
ptr
);
}
StgStablePtr
getOrSet
GHCConcProdding
Store
(
StgStablePtr
ptr
)
getOrSet
SystemEventThreadEventManager
Store
(
StgStablePtr
ptr
)
{
return
getOrSetKey
(
GHCConcProddingStore
,
ptr
);
return
getOrSetKey
(
SystemEventThreadEventManagerStore
,
ptr
);
}
StgStablePtr
getOrSetSystemEventThreadIOManagerThreadStore
(
StgStablePtr
ptr
)
{
return
getOrSetKey
(
SystemEventThreadIOManagerThreadStore
,
ptr
);
}
rts/Linker.c
View file @
40114073
...
...
@@ -519,9 +519,9 @@ typedef struct _RtsSymbolVal {
#if !defined(mingw32_HOST_OS)
#define RTS_USER_SIGNALS_SYMBOLS \
SymI_HasProto(setIOManagerPipe) \
SymI_HasProto(setIOManagerControlFd) \
SymI_HasProto(setIOManagerWakeupFd) \
SymI_HasProto(ioManagerWakeup) \
SymI_HasProto(ioManagerSync) \
SymI_HasProto(blockUserSignals) \
SymI_HasProto(unblockUserSignals)
#else
...
...
@@ -770,11 +770,12 @@ typedef struct _RtsSymbolVal {
SymI_HasProto(forkOS_createThread) \
SymI_HasProto(freeHaskellFunctionPtr) \
SymI_HasProto(getOrSetTypeableStore) \
SymI_HasProto(getOrSetGHCConcSignalHandlerStore) \
SymI_HasProto(getOrSetGHCConcPendingEventsStore) \
SymI_HasProto(getOrSetGHCConcPendingDelaysStore) \
SymI_HasProto(getOrSetGHCConcIOManagerThreadStore) \
SymI_HasProto(getOrSetGHCConcProddingStore) \
SymI_HasProto(getOrSetGHCConcSignalSignalHandlerStore) \
SymI_HasProto(getOrSetGHCConcWindowsPendingDelaysStore) \
SymI_HasProto(getOrSetGHCConcWindowsIOManagerThreadStore) \
SymI_HasProto(getOrSetGHCConcWindowsProddingStore) \
SymI_HasProto(getOrSetSystemEventThreadEventManagerStore) \
SymI_HasProto(getOrSetSystemEventThreadIOManagerThreadStore) \
SymI_HasProto(genSymZh) \
SymI_HasProto(genericRaise) \
SymI_HasProto(getProgArgv) \
...
...
@@ -4877,4 +4878,3 @@ static int machoGetMisalignment( FILE * f )
#endif
#endif
rts/Prelude.h
View file @
40114073
...
...
@@ -43,9 +43,9 @@ PRELUDE_CLOSURE(base_GHCziIOziException_blockedIndefinitelyOnSTM_closure);
PRELUDE_CLOSURE
(
base_ControlziExceptionziBase_nonTermination_closure
);
PRELUDE_CLOSURE
(
base_ControlziExceptionziBase_nestedAtomically_closure
);
PRELUDE_CLOSURE
(
base_GHCziConc_runSparks_closure
);
PRELUDE_CLOSURE
(
base_GHCziConc_ensureIOManagerIsRunning_closure
);
PRELUDE_CLOSURE
(
base_GHCziConc_runHandlers_closure
);
PRELUDE_CLOSURE
(
base_GHCziConc
ziSync
_runSparks_closure
);
PRELUDE_CLOSURE
(
base_GHCziConc
ziIO
_ensureIOManagerIsRunning_closure
);
PRELUDE_CLOSURE
(
base_GHCziConc
ziSignal
_runHandlers_closure
);
PRELUDE_INFO
(
ghczmprim_GHCziTypes_Czh_static_info
);
PRELUDE_INFO
(
ghczmprim_GHCziTypes_Izh_static_info
);
...
...
@@ -88,9 +88,9 @@ PRELUDE_INFO(base_GHCziStable_StablePtr_con_info);
#define runFinalizerBatch_closure DLL_IMPORT_DATA_REF(base_GHCziWeak_runFinalizzerBatch_closure)
#define mainIO_closure (&ZCMain_main_closure)
#define runSparks_closure DLL_IMPORT_DATA_REF(base_GHCziConc_runSparks_closure)
#define ensureIOManagerIsRunning_closure DLL_IMPORT_DATA_REF(base_GHCziConc_ensureIOManagerIsRunning_closure)
#define runHandlers_closure DLL_IMPORT_DATA_REF(base_GHCziConc_runHandlers_closure)
#define runSparks_closure DLL_IMPORT_DATA_REF(base_GHCziConc
ziSync
_runSparks_closure)
#define ensureIOManagerIsRunning_closure DLL_IMPORT_DATA_REF(base_GHCziConc
ziIO
_ensureIOManagerIsRunning_closure)
#define runHandlers_closure DLL_IMPORT_DATA_REF(base_GHCziConc
ziSignal
_runHandlers_closure)
#define stackOverflow_closure DLL_IMPORT_DATA_REF(base_GHCziIOziException_stackOverflow_closure)
#define heapOverflow_closure DLL_IMPORT_DATA_REF(base_GHCziIOziException_heapOverflow_closure)
...
...
rts/package.conf.in
View file @
40114073
...
...
@@ -95,9 +95,9 @@ ld-options:
, "-u", "_base_GHCziWeak_runFinalizzerBatch_closure"
, "-u", "_base_GHCziTopHandler_runIO_closure"
, "-u", "_base_GHCziTopHandler_runNonIO_closure"
, "-u", "_base_GHCziConc_ensureIOManagerIsRunning_closure"
, "-u", "_base_GHCziConc_runSparks_closure"
, "-u", "_base_GHCziConc_runHandlers_closure"
, "-u", "_base_GHCziConc
ziIO
_ensureIOManagerIsRunning_closure"
, "-u", "_base_GHCziConc
ziSync
_runSparks_closure"
, "-u", "_base_GHCziConc
ziSignal
_runHandlers_closure"
#else
"-u", "ghczmprim_GHCziTypes_Izh_static_info"
, "-u", "ghczmprim_GHCziTypes_Czh_static_info"
...
...
@@ -133,9 +133,9 @@ ld-options:
, "-u", "base_GHCziWeak_runFinalizzerBatch_closure"
, "-u", "base_GHCziTopHandler_runIO_closure"
, "-u", "base_GHCziTopHandler_runNonIO_closure"
, "-u", "base_GHCziConc_ensureIOManagerIsRunning_closure"
, "-u", "base_GHCziConc_runSparks_closure"
, "-u", "base_GHCziConc_runHandlers_closure"
, "-u", "base_GHCziConc
ziIO
_ensureIOManagerIsRunning_closure"
, "-u", "base_GHCziConc
ziSync
_runSparks_closure"
, "-u", "base_GHCziConc
ziSignal
_runHandlers_closure"
#endif
/* Pick up static libraries in preference over dynamic if in earlier search
...
...
rts/posix/Signals.c
View file @
40114073
...
...
@@ -36,6 +36,10 @@
# include <errno.h>
#endif
#ifdef HAVE_EVENTFD_H
# include <sys/eventfd.h>
#endif
#include <stdlib.h>
#include <string.h>
...
...
@@ -82,41 +86,43 @@ more_handlers(int sig)
}
// Here's the pipe into which we will send our signals
static
int
io_manager_pipe
=
-
1
;
static
int
io_manager_wakeup_fd
=
-
1
;
static
int
io_manager_control_fd
=
-
1
;
#define IO_MANAGER_WAKEUP 0xff
#define IO_MANAGER_DIE 0xfe
#define IO_MANAGER_SYNC 0xfd
void
setIOManager
Pipe
(
int
fd
)
setIOManager
WakeupFd
(
int
fd
)
{
// only called when THREADED_RTS, but unconditionally
// compiled here because
GHC.Conc
depends on it.
io_manager_
pipe
=
fd
;
// compiled here because
System.Event.Control
depends on it.
io_manager_
wakeup_fd
=
fd
;
}
void
ioManagerWakeup
(
voi
d
)
setIOManagerControlFd
(
int
f
d
)
{
int
r
;
// Wake up the IO Manager thread by sending a byte down its pipe
if
(
io_manager_pipe
>=
0
)
{
StgWord8
byte
=
(
StgWord8
)
IO_MANAGER_WAKEUP
;
r
=
write
(
io_manager_pipe
,
&
byte
,
1
);
if
(
r
==
-
1
)
{
sysErrorBelch
(
"ioManagerWakeup: write"
);
}
}
// only called when THREADED_RTS, but unconditionally
// compiled here because System.Event.Control depends on it.
io_manager_control_fd
=
fd
;
}
void
ioManager
Sync
(
void
)
ioManager
Wakeup
(
void
)
{
int
r
;
// Wake up the IO Manager thread by sending a byte down its pipe
if
(
io_manager_pipe
>=
0
)
{
StgWord8
byte
=
(
StgWord8
)
IO_MANAGER_SYNC
;
r
=
write
(
io_manager_pipe
,
&
byte
,
1
);
if
(
r
==
-
1
)
{
sysErrorBelch
(
"ioManagerSync: write"
);
}
if
(
io_manager_wakeup_fd
>=
0
)
{
#if defined(HAVE_EVENTFD)
StgWord64
n
=
(
StgWord64
)
IO_MANAGER_WAKEUP
;
r
=
write
(
io_manager_wakeup_fd
,
(
char
*
)
&
n
,
8
);
#else
StgWord8
byte
=
(
StgWord8
)
IO_MANAGER_WAKEUP
;
r
=
write
(
io_manager_wakeup_fd
,
&
byte
,
1
);
#endif
if
(
r
==
-
1
)
{
sysErrorBelch
(
"ioManagerWakeup: write"
);
}
}
}
...
...
@@ -126,19 +132,20 @@ ioManagerDie (void)
{
int
r
;
// Ask the IO Manager thread to exit
if
(
io_manager_
pipe
>=
0
)
{
if
(
io_manager_
control_fd
>=
0
)
{
StgWord8
byte
=
(
StgWord8
)
IO_MANAGER_DIE
;
r
=
write
(
io_manager_
pipe
,
&
byte
,
1
);
r
=
write
(
io_manager_
control_fd
,
&
byte
,
1
);
if
(
r
==
-
1
)
{
sysErrorBelch
(
"ioManagerDie: write"
);
}
close
(
io_manager_pipe
)
;
io_manager_
pipe
=
-
1
;
io_manager_control_fd
=
-
1
;
io_manager_
wakeup_fd
=
-
1
;
}
}
Capability
*
ioManagerStartCap
(
Capability
*
cap
)
{
return
rts_evalIO
(
cap
,
&
base_GHCziConc_ensureIOManagerIsRunning_closure
,
NULL
);
return
rts_evalIO
(
cap
,
&
base_GHCziConcziIO_ensureIOManagerIsRunning_closure
,
NULL
);
}
void
...
...
@@ -146,7 +153,7 @@ ioManagerStart (void)
{
// Make sure the IO manager thread is running
Capability
*
cap
;
if
(
io_manager_
pipe
<
0
)
{
if
(
io_manager_
control_fd
<
0
||
io_manager_wakeup_fd
<
0
)
{
cap
=
rts_lock
();
cap
=
ioManagerStartCap
(
cap
);
rts_unlock
(
cap
);
...
...
@@ -177,7 +184,7 @@ generic_handler(int sig USED_IF_THREADS,
{
#if defined(THREADED_RTS)
if
(
io_manager_
pipe
!=
-
1
)
if
(
io_manager_
control_fd
!=
-
1
)
{
StgWord8
buf
[
sizeof
(
siginfo_t
)
+
1
];
int
r
;
...
...
@@ -191,7 +198,7 @@ generic_handler(int sig USED_IF_THREADS,
memcpy
(
buf
+
1
,
info
,
sizeof
(
siginfo_t
));
}
r
=
write
(
io_manager_
pipe
,
buf
,
sizeof
(
siginfo_t
)
+
1
);
r
=
write
(
io_manager_
control_fd
,
buf
,
sizeof
(
siginfo_t
)
+
1
);
if
(
r
==
-
1
&&
errno
==
EAGAIN
)
{
errorBelch
(
"lost signal due to full pipe: %d
\n
"
,
sig
);
...
...
@@ -258,7 +265,7 @@ initUserSignals(void)
{
sigemptyset
(
&
userSignals
);
#ifndef THREADED_RTS
getStablePtr
((
StgPtr
)
&
base_GHCziConc
_runHandlers_closure
);
getStablePtr
((
StgPtr
)
&
base_GHCziConc
ziSignal_runHandlers_closure
);
// needed to keep runHandler alive
#endif
}
...
...
@@ -412,7 +419,7 @@ startSignalHandlers(Capability *cap)
RtsFlags
.
GcFlags
.
initialStkSize
,
rts_apply
(
cap
,
rts_apply
(
cap
,
&
base_GHCziConc_runHandlers_closure
,
&
base_GHCziConc
ziSignal
_runHandlers_closure
,
rts_mkPtr
(
cap
,
info
)),
rts_mkInt
(
cap
,
info
->
si_signo
))));
}
...
...
rts/win32/ThrIOManager.c
View file @
40114073
...
...
@@ -153,9 +153,9 @@ ioManagerStart (void)
if
(
io_manager_event
==
INVALID_HANDLE_VALUE
)
{
cap
=
rts_lock
();
#if defined(mingw32_HOST_OS) && defined(__PIC__)
rts_evalIO
(
cap
,
_imp__base_GHCziConc_ensureIOManagerIsRunning_closure
,
NULL
);
rts_evalIO
(
cap
,
_imp__base_GHCziConc
ziIO
_ensureIOManagerIsRunning_closure
,
NULL
);
#else
rts_evalIO
(
cap
,
&
base_GHCziConc_ensureIOManagerIsRunning_closure
,
NULL
);
rts_evalIO
(
cap
,
&
base_GHCziConc
ziIO
_ensureIOManagerIsRunning_closure
,
NULL
);
#endif
rts_unlock
(
cap
);
}
...
...
rts/win32/libHSbase.def
View file @
40114073
...
...
@@ -27,8 +27,8 @@ EXPORTS
base_GHCziPtr_Ptr_con_info
base_GHCziPtr_FunPtr_con_info
base_GHCziConc_ensureIOManagerIsRunning_closure
base_GHCziConc_runSparks_closure
base_GHCziConc
ziIO
_ensureIOManagerIsRunning_closure
base_GHCziConc
ziSync
_runSparks_closure
base_GHCziWeak_runFinalizzerBatch_closure
base_GHCziPack_unpackCString_closure
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment