diff options
author | Facundo Domínguez <facundo.dominguez@tweag.io> | 2014-01-29 12:43:03 -0200 |
---|---|---|
committer | Facundo Domínguez <facundo.dominguez@tweag.io> | 2014-12-02 12:55:30 -0200 |
commit | 79c87c039c47be0baf7a6dd33ecf5434daa1501c (patch) | |
tree | d8d97a28d3989bf7848a5c3f8f6a4697de72fd5c /includes | |
parent | a2c0a8dd15de2023e17078fa5f421ba581b3a5fa (diff) | |
download | haskell-wip/static-pointers.tar.gz |
Implement -XStaticValues.wip/static-pointers
Contains contributions from Alexander Vershilov and Mathieu Boespflug.
As proposed in [1], this extension introduces a new syntactic form
`static e`, where `e :: a` can be any closed expression. The static form
produces a value of type `StaticPtr a`, which works as a reference that
programs can "dereference" to get the value of `e` back. References are
like `Ptr`s, except that they are stable across invocations of a
program.
In essence the extension collects the arguments of the static form into
a global static pointer table. The expressions can be looked up by a
fingerprint computed from the package, the module and a fresh name
given to the expression. For more details we refer to the users guide
section contained in the patch.
The extension is a contribution to the Cloud Haskell ecosystem
(distributed-process and related), and thus has the potential to foster
Haskell as a programming language for distributed systems.
The immediate improvement brought by the extension is the elimination of
remote tables from Cloud Haskell applications. Such applications contain
table fragments spread throughout multiple modules and packages.
Eliminating these fragments saves the programmer the burden required to
construct and assemble the global remote table, a verbose and
error-prone process, even with the help of Template Haskell, that
moreover pollutes the export lists of all modules.
[1] Jeff Epstein, Andrew P. Black, and Simon Peyton-Jones. Towards
Haskell in the cloud. SIGPLAN Not., 46(12):118–129, September 2011. ISSN
0362-1340.
Diffstat (limited to 'includes')
-rw-r--r-- | includes/HsFFI.h | 2 | ||||
-rw-r--r-- | includes/Rts.h | 1 | ||||
-rw-r--r-- | includes/rts/SPT.h | 32 |
3 files changed, 35 insertions, 0 deletions
diff --git a/includes/HsFFI.h b/includes/HsFFI.h index d51ee04b67..f778478e11 100644 --- a/includes/HsFFI.h +++ b/includes/HsFFI.h @@ -161,6 +161,8 @@ extern void hs_free_stable_ptr_unsafe (HsStablePtr sp); extern void hs_free_stable_ptr (HsStablePtr sp); extern void hs_free_fun_ptr (HsFunPtr fp); +extern StgPtr hs_spt_lookup(StgWord64 key[2]); + /* -------------------------------------------------------------------------- */ #ifdef __cplusplus diff --git a/includes/Rts.h b/includes/Rts.h index 6bf7650f69..6869cc384b 100644 --- a/includes/Rts.h +++ b/includes/Rts.h @@ -238,6 +238,7 @@ INLINE_HEADER Time fsecondsToTime (double t) #include "rts/Utils.h" #include "rts/PrimFloat.h" #include "rts/Main.h" +#include "rts/SPT.h" /* Misc stuff without a home */ DLL_IMPORT_RTS extern char **prog_argv; /* so we can get at these from Haskell */ diff --git a/includes/rts/SPT.h b/includes/rts/SPT.h new file mode 100644 index 0000000000..8c5f8ab1a9 --- /dev/null +++ b/includes/rts/SPT.h @@ -0,0 +1,32 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 2008-2009 + * + * Initialization of the Static Pointer Table + * + * Do not #include this file directly: #include "Rts.h" instead. + * + * To understand the structure of the RTS headers, see the wiki: + * http://ghc.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes + * + * -------------------------------------------------------------------------- */ + +#ifndef RTS_SPT_H +#define RTS_SPT_H + +/** Inserts an entry in the Static Pointer Table. + * + * The key is a fingerprint computed from the StaticName of a static pointer + * and the spe_closure is a pointer to the closure defining the table entry + * (GHC.SptEntry). + * + * A stable pointer to the closure is made to prevent it from being garbage + * collected while the entry exists on the table. + * + * This function is called from the code generated by + * compiler/deSugar/SPT.sptInitCode + * + * */ +void hs_spt_insert (StgWord64 key[2],void* spe_closure); + +#endif /* RTS_HPC_H */ |