Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ghc/ghc
  • bgamari/ghc
  • syd/ghc
  • ggreif/ghc
  • watashi/ghc
  • RolandSenn/ghc
  • mpickering/ghc
  • DavidEichmann/ghc
  • carter/ghc
  • harpocrates/ghc
  • ethercrow/ghc
  • mijicd/ghc
  • adamse/ghc
  • alexbiehl/ghc
  • gridaphobe/ghc
  • trofi/ghc
  • supersven/ghc
  • ppk/ghc
  • ulysses4ever/ghc
  • AndreasK/ghc
  • ghuntley/ghc
  • shayne-fletcher-da/ghc
  • fgaz/ghc
  • yav/ghc
  • osa1/ghc
  • mbbx6spp/ghc
  • JulianLeviston/ghc
  • reactormonk/ghc
  • rae/ghc
  • takenobu-hs/ghc
  • michalt/ghc
  • andrewthad/ghc
  • hsyl20/ghc
  • scottgw/ghc
  • sjakobi/ghc
  • angerman/ghc
  • RyanGlScott/ghc
  • hvr/ghc
  • howtonotwin/ghc
  • chessai/ghc
  • m-renaud/ghc
  • brprice/ghc
  • stevehartdata/ghc
  • sighingnow/ghc
  • kgardas/ghc
  • ckoparkar/ghc
  • alp/ghc
  • smaeul/ghc
  • kakkun61/ghc
  • sykloid/ghc
  • newhoggy/ghc
  • toonn/ghc
  • nineonine/ghc
  • Phyx/ghc
  • ezyang/ghc
  • tweag/ghc
  • langston/ghc
  • ndmitchell/ghc
  • rockbmb/ghc
  • artempyanykh/ghc
  • mniip/ghc
  • mynguyenbmc/ghc
  • alexfmpe/ghc
  • crockeea/ghc
  • nh2/ghc
  • vaibhavsagar/ghc
  • phadej/ghc
  • Haskell-mouse/ghc
  • lolotp/ghc
  • spacekitteh/ghc
  • michaelpj/ghc
  • mgsloan/ghc
  • HPCohen/ghc
  • tmobile/ghc
  • radrow/ghc
  • simonmar/ghc
  • _deepfire/ghc
  • Ericson2314/ghc
  • leitao/ghc
  • fumieval/ghc
  • trac-isovector/ghc
  • cblp/ghc
  • xich/ghc
  • ciil/ghc
  • erthalion/ghc
  • xldenis/ghc
  • autotaker/ghc
  • haskell-wasm/ghc
  • kcsongor/ghc
  • agander/ghc
  • Baranowski/ghc
  • trac-dredozubov/ghc
  • 23Skidoo/ghc
  • iustin/ghc
  • ningning/ghc
  • josefs/ghc
  • kabuhr/ghc
  • gallais/ghc
  • dten/ghc
  • expipiplus1/ghc
  • Pluralia/ghc
  • rohanjr/ghc
  • intricate/ghc
  • kirelagin/ghc
  • Javran/ghc
  • DanielG/ghc
  • trac-mizunashi_mana/ghc
  • pparkkin/ghc
  • bollu/ghc
  • ntc2/ghc
  • jaspervdj/ghc
  • JoshMeredith/ghc
  • wz1000/ghc
  • zkourouma/ghc
  • code5hot/ghc
  • jdprice/ghc
  • tdammers/ghc
  • J-mie6/ghc
  • trac-lantti/ghc
  • ch1bo/ghc
  • cgohla/ghc
  • lucamolteni/ghc
  • acairncross/ghc
  • amerocu/ghc
  • chreekat/ghc
  • txsmith/ghc
  • trupill/ghc
  • typetetris/ghc
  • sergv/ghc
  • fryguybob/ghc
  • erikd/ghc
  • trac-roland/ghc
  • setupminimal/ghc
  • Friede80/ghc
  • SkyWriter/ghc
  • xplorld/ghc
  • abrar/ghc
  • obsidiansystems/ghc
  • Icelandjack/ghc
  • adinapoli/ghc
  • trac-matthewbauer/ghc
  • heatsink/ghc
  • dwijnand/ghc
  • Cmdv/ghc
  • alinab/ghc
  • pepeiborra/ghc
  • fommil/ghc
  • luochen1990/ghc
  • rlupton20/ghc
  • applePrincess/ghc
  • lehins/ghc
  • ronmrdechai/ghc
  • leeadam/ghc
  • harendra/ghc
  • mightymosquito1991/ghc
  • trac-gershomb/ghc
  • lucajulian/ghc
  • Rizary/ghc
  • VictorCMiraldo/ghc
  • jamesbrock/ghc
  • andrewdmeier/ghc
  • luke/ghc
  • pranaysashank/ghc
  • cocreature/ghc
  • hithroc/ghc
  • obreitwi/ghc
  • slrtbtfs/ghc
  • kaol/ghc
  • yairchu/ghc
  • Mathemagician98/ghc
  • trac-taylorfausak/ghc
  • leungbk/ghc
  • MichaWiedenmann/ghc
  • chris-martin/ghc
  • TDecki/ghc
  • adithyaov/ghc
  • trac-gelisam/ghc
  • Lysxia/ghc
  • complyue/ghc
  • bwignall/ghc
  • sternmull/ghc
  • sonika/ghc
  • leif/ghc
  • broadwaylamb/ghc
  • myszon/ghc
  • danbroooks/ghc
  • Mechachleopteryx/ghc
  • zardyh/ghc
  • trac-vdukhovni/ghc
  • OmarKhaledAbdo/ghc
  • arrowd/ghc
  • Bodigrim/ghc
  • matheus23/ghc
  • cardenaso11/ghc
  • trac-Athas/ghc
  • mb720/ghc
  • DylanZA/ghc
  • liff/ghc
  • typedrat/ghc
  • trac-claude/ghc
  • jbm/ghc
  • Gertjan423/ghc
  • PHO/ghc
  • JKTKops/ghc
  • kockahonza/ghc
  • msakai/ghc
  • Sir4ur0n/ghc
  • barambani/ghc
  • vishnu.c/ghc
  • dcoutts/ghc
  • trac-runeks/ghc
  • trac-MaxGabriel/ghc
  • lexi.lambda/ghc
  • strake/ghc
  • spavikevik/ghc
  • JakobBruenker/ghc
  • rmanne/ghc
  • gdziadkiewicz/ghc
  • ani/ghc
  • iliastsi/ghc
  • smunix/ghc
  • judah/ghc
  • blackgnezdo/ghc
  • emilypi/ghc
  • trac-bpfoley/ghc
  • muesli4/ghc
  • trac-gkaracha/ghc
  • Kleidukos/ghc
  • nek0/ghc
  • TristanCacqueray/ghc
  • dwulive/ghc
  • mbakke/ghc
  • arybczak/ghc
  • Yang123321/ghc
  • maksbotan/ghc
  • QuietMisdreavus/ghc
  • trac-olshanskydr/ghc
  • emekoi/ghc
  • samuela/ghc
  • josephcsible/ghc
  • dramforever/ghc
  • lpsmith/ghc
  • DenisFrezzato/ghc
  • michivi/ghc
  • jneira/ghc
  • jeffhappily/ghc
  • Ivan-Yudin/ghc
  • nakaji-dayo/ghc
  • gdevanla/ghc
  • galen/ghc
  • fendor/ghc
  • yaitskov/ghc
  • rcythr/ghc
  • awpr/ghc
  • jeremyschlatter/ghc
  • Aver1y/ghc
  • mitchellvitez/ghc
  • merijn/ghc
  • tomjaguarpaw1/ghc
  • trac-NoidedSuper/ghc
  • erewok/ghc
  • trac-junji.hashimoto/ghc
  • adamwespiser/ghc
  • bjaress/ghc
  • jhrcek/ghc
  • leonschoorl/ghc
  • lukasz-golebiewski/ghc
  • sheaf/ghc
  • last-g/ghc
  • carassius1014/ghc
  • eschwartz/ghc
  • dwincort/ghc
  • felixwiemuth/ghc
  • TimWSpence/ghc
  • marcusmonteirodesouza/ghc
  • WJWH/ghc
  • vtols/ghc
  • theobat/ghc
  • BinderDavid/ghc
  • ckoparkar0/ghc
  • alexander-kjeldaas/ghc
  • dme2/ghc
  • philderbeast/ghc
  • aaronallen8455/ghc
  • rayshih/ghc
  • benkard/ghc
  • mpardalos/ghc
  • saidelman/ghc
  • leiftw/ghc
  • ca333/ghc
  • bwroga/ghc
  • nmichael44/ghc
  • trac-crobbins/ghc
  • felixonmars/ghc
  • adityagupta1089/ghc
  • hgsipiere/ghc
  • treeowl/ghc
  • alexpeits/ghc
  • CraigFe/ghc
  • dnlkrgr/ghc
  • kerckhove_ts/ghc
  • cptwunderlich/ghc
  • eiais/ghc
  • hahohihu/ghc
  • sanchayan/ghc
  • lemmih/ghc
  • sehqlr/ghc
  • trac-dbeacham/ghc
  • luite/ghc
  • trac-f-a/ghc
  • vados/ghc
  • luntain/ghc
  • fatho/ghc
  • alexbiehl-gc/ghc
  • dcbdan/ghc
  • tvh/ghc
  • liam-ly/ghc
  • timbobbarnes/ghc
  • GovanifY/ghc
  • shanth2600/ghc
  • gliboc/ghc
  • duog/ghc
  • moxonsghost/ghc
  • zander/ghc
  • masaeedu/ghc
  • georgefst/ghc
  • guibou/ghc
  • nicuveo/ghc
  • mdebruijne/ghc
  • stjordanis/ghc
  • emiflake/ghc
  • wygulmage/ghc
  • frasertweedale/ghc
  • coot/ghc
  • aratamizuki/ghc
  • tsandstr/ghc
  • mrBliss/ghc
  • Anton-Latukha/ghc
  • tadfisher/ghc
  • vapourismo/ghc
  • Sorokin-Anton/ghc
  • basile-henry/ghc
  • trac-mightybyte/ghc
  • AbsoluteNikola/ghc
  • cobrien99/ghc
  • songzh/ghc
  • blamario/ghc
  • aj4ayushjain/ghc
  • trac-utdemir/ghc
  • tangcl/ghc
  • hdgarrood/ghc
  • maerwald/ghc
  • arjun/ghc
  • ratherforky/ghc
  • haskieLambda/ghc
  • EmilGedda/ghc
  • Bogicevic/ghc
  • eddiejessup/ghc
  • kozross/ghc
  • AlistairB/ghc
  • 3Rafal/ghc
  • christiaanb/ghc
  • trac-bit/ghc
  • matsumonkie/ghc
  • trac-parsonsmatt/ghc
  • chisui/ghc
  • jaro/ghc
  • trac-kmiyazato/ghc
  • davidsd/ghc
  • Tritlo/ghc
  • I-B-3/ghc
  • lykahb/ghc
  • AriFordsham/ghc
  • turion1/ghc
  • berberman/ghc
  • christiantakle/ghc
  • zyklotomic/ghc
  • trac-ocramz/ghc
  • CSEdd/ghc
  • doyougnu/ghc
  • mmhat/ghc
  • why-not-try-calmer/ghc
  • plutotulp/ghc
  • kjekac/ghc
  • Manvi07/ghc
  • teo/ghc
  • cactus/ghc
  • CarrieMY/ghc
  • abel/ghc
  • yihming/ghc
  • tsakki/ghc
  • jessicah/ghc
  • oliverbunting/ghc
  • meld/ghc
  • friedbrice/ghc
  • Joald/ghc
  • abarbu/ghc
  • DigitalBrains1/ghc
  • sterni/ghc
  • alexDarcy/ghc
  • hexchain/ghc
  • minimario/ghc
  • zliu41/ghc
  • tommd/ghc
  • jazcarate/ghc
  • peterbecich/ghc
  • alirezaghey/ghc
  • solomon/ghc
  • mikael.urankar/ghc
  • davjam/ghc
  • int-index/ghc
  • MorrowM/ghc
  • nrnrnr/ghc
  • Sonfamm/ghc-test-only
  • afzt1/ghc
  • nguyenhaibinh-tpc/ghc
  • trac-lierdakil/ghc
  • MichaWiedenmann1/ghc
  • jmorag/ghc
  • Ziharrk/ghc
  • trac-MitchellSalad/ghc
  • juampe/ghc
  • jwaldmann/ghc
  • snowleopard/ghc
  • juhp/ghc
  • normalcoder/ghc
  • ksqsf/ghc
  • trac-jberryman/ghc
  • roberth/ghc
  • 1ntEgr8/ghc
  • epworth/ghc
  • MrAdityaAlok/ghc
  • JunmingZhao42/ghc
  • jappeace/ghc
  • trac-Gabriel439/ghc
  • alt-romes/ghc
  • HugoPeters1024/ghc
  • 10ne1/ghc-fork
  • agentultra/ghc
  • Garfield1002/ghc
  • ChickenProp/ghc
  • clyring/ghc
  • MaxHearnden/ghc
  • jumper149/ghc
  • vem/ghc
  • ketzacoatl/ghc
  • Rosuavio/ghc
  • jackohughes/ghc
  • p4l1ly/ghc
  • konsumlamm/ghc
  • shlevy/ghc
  • torsten.schmits/ghc
  • andremarianiello/ghc
  • amesgen/ghc
  • googleson78/ghc
  • InfiniteVerma/ghc
  • uhbif19/ghc
  • yiyunliu/ghc
  • raehik/ghc
  • mrkun/ghc
  • telser/ghc
  • 1Jajen1/ghc
  • slotThe/ghc
  • WinstonHartnett/ghc
  • mpilgrem/ghc
  • dreamsmasher/ghc
  • schuelermine/ghc
  • trac-Viwor/ghc
  • undergroundquizscene/ghc
  • evertedsphere/ghc
  • coltenwebb/ghc
  • oberblastmeister/ghc
  • agrue/ghc
  • lf-/ghc
  • zacwood9/ghc
  • steshaw/ghc
  • high-cloud/ghc
  • SkamDart/ghc
  • PiDelport/ghc
  • maoif/ghc
  • RossPaterson/ghc
  • CharlesTaylor7/ghc
  • ribosomerocker/ghc
  • trac-ramirez7/ghc
  • daig/ghc
  • NicolasT/ghc
  • FinleyMcIlwaine/ghc
  • lawtonnichols/ghc
  • jmtd/ghc
  • ozkutuk/ghc
  • wildsebastian/ghc
  • nikshalark/ghc
  • lrzlin/ghc
  • tobias/ghc
  • fw/ghc
  • hawkinsw/ghc
  • type-dance/ghc
  • rui314/ghc
  • ocharles/ghc
  • wavewave/ghc
  • TheKK/ghc
  • nomeata/ghc
  • trac-csabahruska/ghc
  • jonathanjameswatson/ghc
  • L-as/ghc
  • Axman6/ghc
  • barracuda156/ghc
  • trac-jship/ghc
  • jake-87/ghc
  • meooow/ghc
  • rebeccat/ghc
  • hamana55/ghc
  • Enigmage/ghc
  • kokobd/ghc
  • agevelt/ghc
  • gshen42/ghc
  • chrismwendt/ghc
  • MangoIV/ghc
  • teto/ghc
  • Sookr1/ghc
  • trac-thomasjm/ghc
  • barci2/ghc-dev
  • trac-m4dc4p/ghc
  • dixonary/ghc
  • breakerzirconia/ghc
  • alexsio27444/ghc
  • glocq/ghc
  • sourabhxyz/ghc
  • ryantrinkle/ghc
  • Jade/ghc
  • scedfaliako/ghc
  • martijnbastiaan/ghc
  • trac-george.colpitts/ghc
  • ammarbinfaisal/ghc
  • mimi.vx/ghc
  • lortabac/ghc
  • trac-zyla/ghc
  • benbellick/ghc
  • aadaa-fgtaa/ghc
  • jvanbruegge/ghc
  • archbung/ghc
  • gilmi/ghc
  • mfonism/ghc
  • alex-mckenna/ghc
  • Ei30metry/ghc
  • DiegoDiverio/ghc
  • jorgecunhamendes/ghc
  • liesnikov/ghc
  • akrmn/ghc
  • trac-simplifierticks/ghc
  • jacco/ghc
  • rhendric/ghc
  • damhiya/ghc
  • ryndubei/ghc
  • DaveBarton/ghc
  • trac-Profpatsch/ghc
  • GZGavinZhao/ghc
  • ncfavier/ghc
  • jameshaydon/ghc
  • ajccosta/ghc
  • dschrempf/ghc
  • cydparser/ghc
  • LinuxUserGD/ghc
  • elodielander/ghc
  • facundominguez/ghc
  • psilospore/ghc
  • lachrimae/ghc
  • dylan-thinnes/ghc-type-errors-plugin
  • hamishmack/ghc
  • Leary/ghc
  • lzszt/ghc
  • lyokha/ghc
  • trac-glaubitz/ghc
  • Rewbert/ghc
  • andreabedini/ghc
  • Jasagredo/ghc
  • sol/ghc
  • OlegAlexander/ghc
  • trac-sthibaul/ghc
  • avdv/ghc
  • Wendaolee/ghc
  • ur4t/ghc
  • daylily/ghc
  • boltzmannrain/ghc
  • mmzk1526/ghc
  • trac-fizzixnerd/ghc
  • soulomoon/ghc
  • rwmjones/ghc
  • j14i/ghc
  • tracsis/ghc
  • gesh/ghc
  • flip101/ghc
  • eldritch-cookie/ghc
  • LemonjamesD/ghc
  • pgujjula/ghc
  • skeuchel/ghc
  • noteed/ghc
  • gulin.serge/ghc
  • Torrekie/ghc
  • jlwoodwa/ghc
  • ayanamists/ghc
  • husong998/ghc
  • trac-edmundnoble/ghc
  • josephf/ghc
  • contrun/ghc
  • baulig/ghc
  • edsko/ghc
  • mzschr/ghc-issue-24732
  • ulidtko/ghc
  • Arsen/ghc
  • trac-sjoerd_visscher/ghc
  • crumbtoo/ghc
  • L0neGamer/ghc
  • DrewFenwick/ghc
  • benz0li/ghc
  • MaciejWas/ghc
  • jordanrule/ghc
  • trac-qqwy/ghc
  • LiamGoodacre/ghc
  • isomorpheme/ghc
  • trac-danidiaz/ghc
  • Kariim/ghc
  • MTaimoorZaeem/ghc
  • hololeap/ghc
  • ticat-fp/ghc
  • meritamen/ghc
  • criskell/ghc
  • trac-kraai/ghc
  • aergus/ghc
  • jdral/ghc
  • SamB/ghc
  • Tristian/ghc
  • ywgrit/ghc
  • KatsuPatrick/ghc
  • OsePedro/ghc
  • mpscholten/ghc
  • fp/ghc
  • zaquest/ghc
  • fangyi-zhou/ghc
  • augyg/ghc
640 results
Show changes
Commits on Source (2)
...@@ -15,33 +15,26 @@ import GHC.Exts ...@@ -15,33 +15,26 @@ import GHC.Exts
import GHC.Base (IO(IO)) import GHC.Base (IO(IO))
-- | Test that we can allocate 'ByteArray#'s outside of the @HEAP_ALLOCED()@ -- | Test that we can allocate 'ByteArray#'s outside of the @HEAP_ALLOCED()@ address space without
-- address space without upsetting the GC. To be extra sure we attach weak -- upsetting the GC. To be extra sure we attach weak pointers with C finalizers to the
-- pointers with C finalizers to the 'ByteArray#'s. We keep them alive and run -- 'ByteArray#'s. We keep them alive and run a major GC so that the GC has to trace the live
-- a major GC so that the GC has to trace the live 'ByteArray#'s. -- 'ByteArray#'s.
-- --
-- On older GHC versions this upsets the GC because it does not expect heap -- On older GHC versions this upsets the GC because it does not expect heap objects with closure
-- objects with closure type @ARR_WORDS@ to exist outside the heap. -- type @ARR_WORDS@ to exist outside the heap.
-- --
-- > internal error: evacuate(static): strange closure type 42 -- > internal error: evacuate(static): strange closure type 42
-- --
-- Finally we allow everything to be GC'd again, and check that the C -- Finally we free the backing memory with `unsafeFreeByteArray`. Then we rerun the GC'd again.
-- finalizers did run. -- Note: When connecting finalizers they seem to fire on shutdown of the RTS not on a major GC
-- invocation.
-- --
main :: IO () main :: IO ()
main = do main = do
heapallocedTest heapallocedTest
n1 <- getMallocByteArrayCount
putStrLn ("malloc_count = " ++ show n1)
bytearrayTest bytearrayTest
-- check that all the C finalizers ran to free() the things we allocated
performMajorGC
n2 <- getMallocByteArrayCount
putStrLn ("malloc_count = " ++ show n1)
-- | This checks that the CMM impl of HEAP_ALLOCED matches the behaviour of -- | This checks that the CMM impl of HEAP_ALLOCED matches the behaviour of
-- the C version. This test lives here since the CMM HEAP_ALLOCED is used by -- the C version. This test lives here since the CMM HEAP_ALLOCED is used by
-- the isByteArrayPinned# primop now that it supports byte arrays that are -- the isByteArrayPinned# primop now that it supports byte arrays that are
...@@ -55,10 +48,17 @@ heapallocedTest = do ...@@ -55,10 +48,17 @@ heapallocedTest = do
putStrLn ("HEAP_ALLOCED = " ++ show same putStrLn ("HEAP_ALLOCED = " ++ show same
++ "\t(c_HEAP_ALLOCED ptr == cmm_HEAP_ALLOCED ptr)") ++ "\t(c_HEAP_ALLOCED ptr == cmm_HEAP_ALLOCED ptr)")
where where
heapStart = 0x4200000000 -- For values selected here see OSMem.c
heapLowerbound = 8 * (2^30) -- 8GB lower bound starting index of the heap
heapDefaultStart = 0x4200000000 -- > 32GB default starting address of the heap
heapSizes = [0 -- Check the heap lower starting bound
, 2^40, 2^38] -- Check the heap upper bounds at both 1TB and 1/4TB of virtual memory
addrs addrs
-- Addresses around the start of the heap -- Addresses around the start of the heap
= [heapStart + offset | offset <- [-1000..1000]] = [heapStart + heapSize + offset
| heapStart <- [heapLowerbound, heapDefaultStart]
, heapSize <- heapSizes
, offset <- [-1000..1000]] -- Area of the bounds check
-- 2k address probes, appropriate to the address space -- 2k address probes, appropriate to the address space
++ case sizeOf (nullPtr :: Ptr ()) of ++ case sizeOf (nullPtr :: Ptr ()) of
4 -> [0, 2^21 .. 2^32-1] -- 0 to 4Gb-1 in 2Mb jumps 4 -> [0, 2^21 .. 2^32-1] -- 0 to 4Gb-1 in 2Mb jumps
...@@ -67,31 +67,48 @@ heapallocedTest = do ...@@ -67,31 +67,48 @@ heapallocedTest = do
bytearrayTest :: IO () bytearrayTest :: IO ()
bytearrayTest = do bytearrayTest = do
printMallocCount "initial"
let byteLengths = [0..99]
-- malloc() a bunch of ByteArray#s on the C heap -- malloc() a bunch of ByteArray#s on the C heap
foreignBAs <- mapM newForeignHeapByteArray [0..99] (foreignPtrs, foreignBAs) <- unzip <$> mapM newForeignHeapByteArray byteLengths
n1 <- getMallocByteArrayCount printMallocCount "alloced"
putStrLn ("malloc_count = " ++ show n1)
-- allocate a bunch of ByteArray#s on the GHC heap -- allocate a bunch of ByteArray#s on the GHC heap
nativeBAs <- mapM newNativeHeapByteArray [0..99] nativeBAs <- mapM newNativeHeapByteArray byteLengths
-- as a sanity check compare them to each other -- as a sanity check compare them to each other
let same = and (zipWith equalByteArrays foreignBAs nativeBAs) let same = and (zipWith equalByteArrays foreignBAs nativeBAs)
putStrLn ("arrays equal = " ++ show same putStrLn ("arrays equal = " ++ show same
++ "\t(and (zipWith equalByteArrays foreignBAs nativeBAs))") ++ "\t(and (zipWith equalByteArrays foreignBAs nativeBAs))")
-- and test the isByteArrayPinned# primop on them all -- and test the isByteArrayPinned# primop on them foreign byte arrays
let pinned = all isByteArrayPinned foreignBAs let pinnedForeign = all isByteArrayPinned foreignBAs
putStrLn ("arrays pinned = " ++ show pinned putStrLn ("arrays pinned = " ++ show pinnedForeign
++ "\t(all isByteArrayPinned foreignBAs)") ++ "\t(all isByteArrayPinned foreignBAs)")
-- and test the isByteArrayPinned# primop on them native byte arrays
let pinnedNative = all isByteArrayPinned nativeBAs
putStrLn ("arrays pinned = " ++ show pinnedNative
++ "\t(all isByteArrayPinned nativeBAs)")
-- while they're still live, have the GC inspect them all -- while they're still live, have the GC inspect them all
performMajorGC performMajorGC
n2 <- getMallocByteArrayCount printMallocCount "alive"
putStrLn ("malloc_count = " ++ show n2)
mapM_ touchByteArray foreignBAs mapM_ touchByteArray foreignBAs
-- after they have been freed, have another GC run
mapM_ unsafeFreeByteArray foreignPtrs
-- WARNING: DO NOT USE `foreignPtrs` OR `foreignBAs` AFTER THIS POINT
-- We have released the memory backing the byte arrays
performMajorGC
printMallocCount "final"
printMallocCount :: String -> IO ()
printMallocCount phase = do
n <- getMallocByteArrayCount
putStrLn ("malloc_count = " ++ show n ++ "\t" ++ phase)
data ByteArray = ByteArray ByteArray# data ByteArray = ByteArray ByteArray#
data MutableByteArray = MutableByteArray (MutableByteArray# RealWorld) data MutableByteArray = MutableByteArray (MutableByteArray# RealWorld)
...@@ -101,12 +118,14 @@ newNativeHeapByteArray n = do ...@@ -101,12 +118,14 @@ newNativeHeapByteArray n = do
mba <- newByteArray n mba <- newByteArray n
fillAndFreezeByteArray mba n fillAndFreezeByteArray mba n
newForeignHeapByteArray :: Int -> IO ByteArray newForeignHeapByteArray :: Int -> IO (Ptr a, ByteArray)
newForeignHeapByteArray n = do newForeignHeapByteArray n = do
-- mallocByteArray also allocates memory for the header of a ByteArray#
ptr <- mallocByteArray (fromIntegral n) ptr <- mallocByteArray (fromIntegral n)
-- placeByteArray# writes the ByteArray# header in this additionally allocated memory
mba <- placeByteArray ptr n mba <- placeByteArray ptr n
addCFinalizerToByteArray mba freeByteArray ptr ba <- fillAndFreezeByteArray mba n
fillAndFreezeByteArray mba n pure (ptr, ba)
newByteArray :: Int -> IO MutableByteArray newByteArray :: Int -> IO MutableByteArray
newByteArray (I# n#) = newByteArray (I# n#) =
...@@ -128,18 +147,6 @@ fillAndFreezeByteArray (MutableByteArray mba#) (I# n#) = ...@@ -128,18 +147,6 @@ fillAndFreezeByteArray (MutableByteArray mba#) (I# n#) =
case unsafeFreezeByteArray# mba# s1 of case unsafeFreezeByteArray# mba# s1 of
(# s2, ba# #) -> (# s2, ByteArray ba# #) (# s2, ba# #) -> (# s2, ByteArray ba# #)
addCFinalizerToByteArray :: MutableByteArray
-> FunPtr (Ptr a -> IO ())
-> Ptr a
-> IO ()
addCFinalizerToByteArray (MutableByteArray ba#) (FunPtr cfunptr#) (Ptr ptr#) =
IO $ \s0 ->
case mkWeakNoFinalizer# ba# () s0 of
(# s1, weak# #) ->
-- 0# flag here means don't pass any env ptr to the finalizer
case addCFinalizerToWeak# cfunptr# ptr# 0# nullAddr# weak# s1 of
(# s2, _success# #) -> (# s2, () #)
touchByteArray :: ByteArray -> IO () touchByteArray :: ByteArray -> IO ()
touchByteArray (ByteArray ba#) = touchByteArray (ByteArray ba#) =
IO $ \s0 -> IO $ \s0 ->
...@@ -164,8 +171,8 @@ cmm_HEAP_ALLOCED (Ptr addr#) = I# (cmm_HEAP_ALLOCED# addr#) ...@@ -164,8 +171,8 @@ cmm_HEAP_ALLOCED (Ptr addr#) = I# (cmm_HEAP_ALLOCED# addr#)
foreign import ccall unsafe "mallocByteArray" foreign import ccall unsafe "mallocByteArray"
mallocByteArray :: CInt -> IO (Ptr a) mallocByteArray :: CInt -> IO (Ptr a)
foreign import ccall unsafe "&freeByteArray" foreign import ccall unsafe "unsafeFreeByteArray"
freeByteArray :: FunPtr (Ptr a -> IO ()) unsafeFreeByteArray :: Ptr a -> IO ()
foreign import ccall unsafe "getMallocByteArrayCount" foreign import ccall unsafe "getMallocByteArrayCount"
getMallocByteArrayCount :: IO CInt getMallocByteArrayCount :: IO CInt
...@@ -175,4 +182,3 @@ foreign import ccall unsafe "c_HEAP_ALLOCED" ...@@ -175,4 +182,3 @@ foreign import ccall unsafe "c_HEAP_ALLOCED"
foreign import prim "cmm_HEAP_ALLOCED" foreign import prim "cmm_HEAP_ALLOCED"
cmm_HEAP_ALLOCED# :: Addr# -> Int# cmm_HEAP_ALLOCED# :: Addr# -> Int#
HEAP_ALLOCED = True (c_HEAP_ALLOCED ptr == cmm_HEAP_ALLOCED ptr) HEAP_ALLOCED = True (c_HEAP_ALLOCED ptr == cmm_HEAP_ALLOCED ptr)
malloc_count = 0 malloc_count = 0 initial
malloc_count = 100 malloc_count = 100 alloced
arrays equal = True (and (zipWith equalByteArrays foreignBAs nativeBAs)) arrays equal = True (and (zipWith equalByteArrays foreignBAs nativeBAs))
arrays pinned = True (all isByteArrayPinned foreignBAs) arrays pinned = True (all isByteArrayPinned foreignBAs)
malloc_count = 100 arrays pinned = False (all isByteArrayPinned nativeBAs)
malloc_count = 0 malloc_count = 100 alive
malloc_count = 0 final
...@@ -11,7 +11,7 @@ void *mallocByteArray (StgWord len) ...@@ -11,7 +11,7 @@ void *mallocByteArray (StgWord len)
return malloc(sizeof(StgArrBytes) + len); return malloc(sizeof(StgArrBytes) + len);
} }
void freeByteArray (void *arr) void unsafeFreeByteArray (void *arr)
{ {
free(arr); free(arr);
malloc_count--; malloc_count--;
...@@ -26,4 +26,3 @@ int c_HEAP_ALLOCED(void * p) ...@@ -26,4 +26,3 @@ int c_HEAP_ALLOCED(void * p)
{ {
return HEAP_ALLOCED(p); return HEAP_ALLOCED(p);
} }
...@@ -532,7 +532,10 @@ test('T17747', ...@@ -532,7 +532,10 @@ test('T17747',
[# This test tries to allocate virtual memory outside of the managed heap. [# This test tries to allocate virtual memory outside of the managed heap.
# The required primops are not available on the following platforms: # The required primops are not available on the following platforms:
when(arch('javascript'), expect_fail), when(arch('javascript'), expect_fail),
when(arch('wasm32'), expect_fail)], when(arch('wasm32'), expect_fail),
# Cross compiling fails for:
# x86_64-linux-alpine3_17-wasm-cross_wasm32-wasi-release+fully_static
when(isCross(), expect_fail)],
makefile_test, makefile_test,
['T17747']) ['T17747'])
......