projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Whitespace only
[ghc-hetmet.git]
/
rts
/
PrimOps.cmm
diff --git
a/rts/PrimOps.cmm
b/rts/PrimOps.cmm
index
04a753c
..
06628b9
100644
(file)
--- a/
rts/PrimOps.cmm
+++ b/
rts/PrimOps.cmm
@@
-28,6
+28,7
@@
#include "Cmm.h"
#ifdef __PIC__
#include "Cmm.h"
#ifdef __PIC__
+#ifndef mingw32_HOST_OS
import __gmpz_init;
import __gmpz_add;
import __gmpz_sub;
import __gmpz_init;
import __gmpz_add;
import __gmpz_sub;
@@
-44,6
+45,7
@@
import __gmpz_and;
import __gmpz_xor;
import __gmpz_ior;
import __gmpz_com;
import __gmpz_xor;
import __gmpz_ior;
import __gmpz_com;
+#endif
import base_GHCziIOBase_NestedAtomically_closure;
import pthread_mutex_lock;
import pthread_mutex_unlock;
import base_GHCziIOBase_NestedAtomically_closure;
import pthread_mutex_lock;
import pthread_mutex_unlock;
@@
-920,6
+922,12
@@
forkzh_fast
("ptr" threadid) = foreign "C" createIOThread( MyCapability() "ptr",
RtsFlags_GcFlags_initialStkSize(RtsFlags),
closure "ptr") [];
("ptr" threadid) = foreign "C" createIOThread( MyCapability() "ptr",
RtsFlags_GcFlags_initialStkSize(RtsFlags),
closure "ptr") [];
+
+ /* start blocked if the current thread is blocked */
+ StgTSO_flags(threadid) =
+ StgTSO_flags(threadid) | (StgTSO_flags(CurrentTSO) &
+ (TSO_BLOCKEX::I32 | TSO_INTERRUPTIBLE::I32));
+
foreign "C" scheduleThread(MyCapability() "ptr", threadid "ptr") [];
// switch at the earliest opportunity
foreign "C" scheduleThread(MyCapability() "ptr", threadid "ptr") [];
// switch at the earliest opportunity
@@
-943,6
+951,12
@@
forkOnzh_fast
("ptr" threadid) = foreign "C" createIOThread( MyCapability() "ptr",
RtsFlags_GcFlags_initialStkSize(RtsFlags),
closure "ptr") [];
("ptr" threadid) = foreign "C" createIOThread( MyCapability() "ptr",
RtsFlags_GcFlags_initialStkSize(RtsFlags),
closure "ptr") [];
+
+ /* start blocked if the current thread is blocked */
+ StgTSO_flags(threadid) =
+ StgTSO_flags(threadid) | (StgTSO_flags(CurrentTSO) &
+ (TSO_BLOCKEX::I32 | TSO_INTERRUPTIBLE::I32));
+
foreign "C" scheduleThreadOn(MyCapability() "ptr", cpu, threadid "ptr") [];
// switch at the earliest opportunity
foreign "C" scheduleThreadOn(MyCapability() "ptr", cpu, threadid "ptr") [];
// switch at the earliest opportunity
@@
-1498,7
+1512,7
@@
takeMVarzh_fast
#endif
if (info == stg_MVAR_CLEAN_info) {
#endif
if (info == stg_MVAR_CLEAN_info) {
- foreign "C" dirty_MVAR(BaseReg "ptr", mvar);
+ foreign "C" dirty_MVAR(BaseReg "ptr", mvar "ptr");
}
/* If the MVar is empty, put ourselves on its blocking queue,
}
/* If the MVar is empty, put ourselves on its blocking queue,
@@
-1595,7
+1609,7
@@
tryTakeMVarzh_fast
}
if (info == stg_MVAR_CLEAN_info) {
}
if (info == stg_MVAR_CLEAN_info) {
- foreign "C" dirty_MVAR(BaseReg "ptr", mvar);
+ foreign "C" dirty_MVAR(BaseReg "ptr", mvar "ptr");
}
/* we got the value... */
}
/* we got the value... */
@@
-1661,7
+1675,7
@@
putMVarzh_fast
#endif
if (info == stg_MVAR_CLEAN_info) {
#endif
if (info == stg_MVAR_CLEAN_info) {
- foreign "C" dirty_MVAR(BaseReg "ptr", mvar);
+ foreign "C" dirty_MVAR(BaseReg "ptr", mvar "ptr");
}
if (StgMVar_value(mvar) != stg_END_TSO_QUEUE_closure) {
}
if (StgMVar_value(mvar) != stg_END_TSO_QUEUE_closure) {
@@
-1747,7
+1761,7
@@
tryPutMVarzh_fast
}
if (info == stg_MVAR_CLEAN_info) {
}
if (info == stg_MVAR_CLEAN_info) {
- foreign "C" dirty_MVAR(BaseReg "ptr", mvar);
+ foreign "C" dirty_MVAR(BaseReg "ptr", mvar "ptr");
}
if (StgMVar_head(mvar) != stg_END_TSO_QUEUE_closure) {
}
if (StgMVar_head(mvar) != stg_END_TSO_QUEUE_closure) {