We needed to turn some inline C functions and C macros into either
real C functions or C-- macros.
#include "DerivedConstants.h"
#include "ClosureTypes.h"
#include "StgFun.h"
#include "DerivedConstants.h"
#include "ClosureTypes.h"
#include "StgFun.h"
+#include "OSThreads.h"
+#include "SMP.h"
/*
* Need MachRegs, because some of the RTS code is conditionally
/*
* Need MachRegs, because some of the RTS code is conditionally
# if defined(HAVE_PTHREAD_H) && !defined(WANT_NATIVE_WIN32_THREADS)
# if defined(HAVE_PTHREAD_H) && !defined(WANT_NATIVE_WIN32_THREADS)
+#if CMINUSMINUS
+
+#define ACQUIRE_LOCK(mutex) pthread_mutex_lock(mutex)
+#define RELEASE_LOCK(mutex) pthread_mutex_unlock(mutex)
+#define ASSERT_LOCK_HELD(mutex) /* nothing */
+
+#else
+
#include <pthread.h>
typedef pthread_cond_t Condition;
#include <pthread.h>
typedef pthread_cond_t Condition;
# elif defined(HAVE_WINDOWS_H)
#include <windows.h>
# elif defined(HAVE_WINDOWS_H)
#include <windows.h>
# error "Threads not supported"
# endif
# error "Threads not supported"
# endif
//
// General thread operations
//
//
// General thread operations
//
void setThreadLocalVar (ThreadLocalKey *key, void *value);
void freeThreadLocalKey (ThreadLocalKey *key);
void setThreadLocalVar (ThreadLocalKey *key, void *value);
void freeThreadLocalKey (ThreadLocalKey *key);
+#endif // !CMINUSMINUS
+
#else
#define ACQUIRE_LOCK(l)
#else
#define ACQUIRE_LOCK(l)
* Unregisterised builds are ok, but only 1 CPU supported.
*/
* Unregisterised builds are ok, but only 1 CPU supported.
*/
+#ifdef CMINUSMINUS
+
+#define unlockClosure(ptr,info) \
+ prim %write_barrier() []; \
+ StgHeader_info(ptr) = info;
+
+#else
+
#if defined(THREADED_RTS)
#if defined(TICKY_TICKY)
#if defined(THREADED_RTS)
#if defined(TICKY_TICKY)
-INLINE_HEADER StgInfoTable *
+#ifdef KEEP_LOCKCLOSURE
+// We want a callable copy of lockClosure() so that we can refer to it
+// from .cmm files compiled using the native codegen.
+extern StgInfoTable *lockClosure(StgClosure *p);
+INLINE_ME
+#else
+INLINE_HEADER
+#endif
+StgInfoTable *
lockClosure(StgClosure *p)
{
StgWord info;
lockClosure(StgClosure *p)
{
StgWord info;
{ unlockClosure((StgClosure*)tso, (StgInfoTable*)&stg_TSO_info); }
#endif /* SMP_H */
{ unlockClosure((StgClosure*)tso, (StgInfoTable*)&stg_TSO_info); }
#endif /* SMP_H */
+
+#endif /* CMINUSMINUS */
stg_block_takemvar_finally
{
#ifdef THREADED_RTS
stg_block_takemvar_finally
{
#ifdef THREADED_RTS
- foreign "C" unlockClosure(R3 "ptr", stg_EMPTY_MVAR_info);
+ unlockClosure(R3, stg_EMPTY_MVAR_info);
stg_block_putmvar_finally
{
#ifdef THREADED_RTS
stg_block_putmvar_finally
{
#ifdef THREADED_RTS
- foreign "C" unlockClosure(R3 "ptr", stg_FULL_MVAR_info);
+ unlockClosure(R3, stg_FULL_MVAR_info);
}
#if defined(THREADED_RTS)
}
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_FULL_MVAR_info) [];
+ unlockClosure(mvar, stg_FULL_MVAR_info);
StgMVar_value(mvar) = stg_END_TSO_QUEUE_closure;
#if defined(THREADED_RTS)
StgMVar_value(mvar) = stg_END_TSO_QUEUE_closure;
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_EMPTY_MVAR_info) [];
+ unlockClosure(mvar, stg_EMPTY_MVAR_info);
#else
SET_INFO(mvar,stg_EMPTY_MVAR_info);
#endif
#else
SET_INFO(mvar,stg_EMPTY_MVAR_info);
#endif
if (info == stg_EMPTY_MVAR_info) {
#if defined(THREADED_RTS)
if (info == stg_EMPTY_MVAR_info) {
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_EMPTY_MVAR_info) [];
+ unlockClosure(mvar, stg_EMPTY_MVAR_info);
#endif
/* HACK: we need a pointer to pass back,
* so we abuse NO_FINALIZER_closure
#endif
/* HACK: we need a pointer to pass back,
* so we abuse NO_FINALIZER_closure
StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure;
}
#if defined(THREADED_RTS)
StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure;
}
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_FULL_MVAR_info) [];
+ unlockClosure(mvar, stg_FULL_MVAR_info);
/* No further putMVars, MVar is now empty */
StgMVar_value(mvar) = stg_END_TSO_QUEUE_closure;
#if defined(THREADED_RTS)
/* No further putMVars, MVar is now empty */
StgMVar_value(mvar) = stg_END_TSO_QUEUE_closure;
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_EMPTY_MVAR_info) [];
+ unlockClosure(mvar, stg_EMPTY_MVAR_info);
#else
SET_INFO(mvar,stg_EMPTY_MVAR_info);
#endif
#else
SET_INFO(mvar,stg_EMPTY_MVAR_info);
#endif
}
#if defined(THREADED_RTS)
}
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_EMPTY_MVAR_info) [];
+ unlockClosure(mvar, stg_EMPTY_MVAR_info);
#endif
jump %ENTRY_CODE(Sp(0));
}
#endif
jump %ENTRY_CODE(Sp(0));
}
StgMVar_value(mvar) = R2;
#if defined(THREADED_RTS)
StgMVar_value(mvar) = R2;
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_FULL_MVAR_info) [];
+ unlockClosure(mvar, stg_FULL_MVAR_info);
#else
SET_INFO(mvar,stg_FULL_MVAR_info);
#endif
#else
SET_INFO(mvar,stg_FULL_MVAR_info);
#endif
if (info == stg_FULL_MVAR_info) {
#if defined(THREADED_RTS)
if (info == stg_FULL_MVAR_info) {
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_FULL_MVAR_info) [];
+ unlockClosure(mvar, stg_FULL_MVAR_info);
}
#if defined(THREADED_RTS)
}
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_EMPTY_MVAR_info) [];
+ unlockClosure(mvar, stg_EMPTY_MVAR_info);
StgMVar_value(mvar) = R2;
#if defined(THREADED_RTS)
StgMVar_value(mvar) = R2;
#if defined(THREADED_RTS)
- foreign "C" unlockClosure(mvar "ptr", stg_FULL_MVAR_info) [];
+ unlockClosure(mvar, stg_FULL_MVAR_info);
#else
SET_INFO(mvar,stg_FULL_MVAR_info);
#endif
#else
SET_INFO(mvar,stg_FULL_MVAR_info);
#endif
* --------------------------------------------------------------------------*/
#include "PosixSource.h"
* --------------------------------------------------------------------------*/
#include "PosixSource.h"
+#define KEEP_LOCKCLOSURE
#include "Rts.h"
#include "SchedAPI.h"
#include "RtsUtils.h"
#include "Rts.h"
#include "SchedAPI.h"
#include "RtsUtils.h"