Commit c3685050 authored by Simon Marlow's avatar Simon Marlow

Rollback #1185 fix

As far as I can tell, the hack I was using in rts/Linker.c won't work
on OS X.  Back to the drawing board.

rolling back:

Tue Nov  3 16:05:47 GMT 2009  Simon Marlow <marlowsd@gmail.com>
  * Fix #1185 (RTS part, also needs corresponding change to libraries/base)
  GHC.Conc.ensureIOManagerIsRunning now creates an IO manager thread if
  one does not exist or has died/exited.
  
  Unfortunately this exposed a problem caused by the fact that we have
  two base packages, and hence two IO managers, in GHCi: see NOTE
  [io-manager-ghci] in rts/Linker.c.  The workaround can go away if/when
  we switch to a dynamically linked GHCi.
  

    M ./rts/Linker.c -6 +47
    M ./rts/Schedule.c +4
    M ./rts/package.conf.in +16
    M ./rts/posix/Signals.c -1 +7
    M ./rts/posix/Signals.h +2

Wed Nov  4 10:11:03 GMT 2009  Simon Marlow <marlowsd@gmail.com>
  * hopefully fix validate breakage on OS X and Windows

    M ./rts/Linker.c -1 +1

Wed Nov  4 16:27:40 GMT 2009  Simon Marlow <marlowsd@gmail.com>
  * fix build failure on Windows

    M ./rts/Linker.c -1 +1
parent 3035c581
......@@ -957,37 +957,6 @@ typedef struct _RtsSymbolVal {
#define RTS_LIBGCC_SYMBOLS
#endif
/* NOTE [io-manager-ghci]
When GHCi loads the base package, it gets another copy of the CAFs
in GHC.Conc that record the IO manager's ThreadId, and the blocking
queues, so we get another IO manager. This is bad enough, but what
is worse is that GHCi by default reverts all CAFs on every :load,
so we'll get *another* IO manager thread (and an associated pipe)
every time the user does :load. Miraculously, this actually
manages to just about work in GHC 6.10 and earlier, but broke when
I tried to fix #1185 (restarting the IO manager after a fork()).
To work around it and ensure that we only have a single IO manager,
we map the CAFs in the dynamically-loaded GHC.Conc to the
statically-linked GHC.Conc. This is an ugly hack, but it's the
least ugly hack that I could think of (SDM 3/11/2009)
*/
#define RTS_GHC_CONC_SYMBOLS \
SymI_NeedsProto(base_GHCziConc_pendingDelays_closure) \
SymI_NeedsProto(base_GHCziConc_ioManagerThread_closure)
#ifdef mingw32_HOST_OS
#define RTS_GHC_CONC_OS_SYMBOLS /* empty */
#else
#define RTS_GHC_CONC_OS_SYMBOLS \
SymI_NeedsProto(base_GHCziConc_pendingEvents_closure) \
SymI_NeedsProto(base_GHCziConc_prodding_closure) \
SymI_NeedsProto(base_GHCziConc_sync_closure) \
SymI_NeedsProto(base_GHCziConc_stick_closure)
#endif
#if defined(darwin_HOST_OS) && defined(powerpc_HOST_ARCH)
// Symbols that don't have a leading underscore
// on Mac OS X. They have to receive special treatment,
......@@ -1016,8 +985,6 @@ RTS_CYGWIN_ONLY_SYMBOLS
RTS_DARWIN_ONLY_SYMBOLS
RTS_LIBGCC_SYMBOLS
RTS_LIBFFI_SYMBOLS
RTS_GHC_CONC_SYMBOLS
RTS_GHC_CONC_OS_SYMBOLS
#undef SymI_NeedsProto
#undef SymI_HasProto
#undef SymI_HasProto_redirect
......@@ -1053,8 +1020,6 @@ static RtsSymbolVal rtsSyms[] = {
RTS_DARWIN_ONLY_SYMBOLS
RTS_LIBGCC_SYMBOLS
RTS_LIBFFI_SYMBOLS
RTS_GHC_CONC_SYMBOLS
RTS_GHC_CONC_OS_SYMBOLS
#if defined(darwin_HOST_OS) && defined(i386_HOST_ARCH)
// dyld stub code contains references to this,
// but it should never be called because we treat
......@@ -1076,18 +1041,12 @@ static void ghciInsertStrHashTable ( char* obj_name,
void *data
)
{
#define GHC_CONC MAYBE_LEADING_UNDERSCORE_STR("base_GHCziConc")
if (lookupHashTable(table, (StgWord)key) == NULL)
{
if (lookupHashTable(table, (StgWord)key) == NULL)
{
insertStrHashTable(table, (StgWord)key, data);
return;
}
if (strncmp(key, GHC_CONC, strlen(GHC_CONC)) == 0) {
/* see NOTE [io-manager-ghci] */
return;
}
debugBelch(
}
debugBelch(
"\n\n"
"GHCi runtime linker: fatal error: I found a duplicate definition for symbol\n"
" %s\n"
......@@ -1102,8 +1061,8 @@ static void ghciInsertStrHashTable ( char* obj_name,
"\n",
(char*)key,
obj_name
);
exit(1);
);
exit(1);
}
/* -----------------------------------------------------------------------------
* initialize the object linker
......
......@@ -1683,10 +1683,6 @@ forkProcess(HsStablePtr *entry
initTimer();
startTimer();
#if defined(THREADED_RTS)
cap = ioManagerStartCap(cap);
#endif
cap = rts_evalStableIO(cap, entry, NULL); // run the action
rts_checkSchedStatus("forkProcess",cap);
......
......@@ -99,14 +99,6 @@ ld-options:
, "-u", "_base_GHCziConc_ensureIOManagerIsRunning_closure"
, "-u", "_base_GHCziConc_runSparks_closure"
, "-u", "_base_GHCziConc_runHandlers_closure"
, "-u", "_base_GHCziConc_pendingDelays_closure"
, "-u", "_base_GHCziConc_pendingEvents_closure"
, "-u", "_base_GHCziConc_ioManagerThread_closure"
#if !defined(mingw32_HOST_OS)
, "-u", "_base_GHCziConc_prodding_closure"
, "-u", "_base_GHCziConc_sync_closure"
, "-u", "_base_GHCziConc_stick_closure"
#endif
#else
"-u", "ghczmprim_GHCziTypes_Izh_static_info"
, "-u", "ghczmprim_GHCziTypes_Czh_static_info"
......@@ -145,14 +137,6 @@ ld-options:
, "-u", "base_GHCziConc_ensureIOManagerIsRunning_closure"
, "-u", "base_GHCziConc_runSparks_closure"
, "-u", "base_GHCziConc_runHandlers_closure"
, "-u", "base_GHCziConc_pendingDelays_closure"
, "-u", "base_GHCziConc_pendingEvents_closure"
, "-u", "base_GHCziConc_ioManagerThread_closure"
#if !defined(mingw32_HOST_OS)
, "-u", "base_GHCziConc_prodding_closure"
, "-u", "base_GHCziConc_sync_closure"
, "-u", "base_GHCziConc_stick_closure"
#endif
#endif
/* Pick up static libraries in preference over dynamic if in earlier search
......
......@@ -124,12 +124,6 @@ ioManagerDie (void)
}
}
Capability *
ioManagerStartCap (Capability *cap)
{
return rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);
}
void
ioManagerStart (void)
{
......@@ -137,7 +131,7 @@ ioManagerStart (void)
Capability *cap;
if (io_manager_pipe < 0) {
cap = rts_lock();
cap = ioManagerStartCap(cap);
cap = rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);
rts_unlock(cap);
}
}
......
......@@ -24,8 +24,6 @@ extern siginfo_t *next_pending_handler;
void startSignalHandlers(Capability *cap);
#endif
Capability *ioManagerStartCap (Capability *cap);
extern StgInt *signal_handlers;
END_RTS_PRIVATE
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment