<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div name="messageBodySection" style="font-size: 14px; font-family: -apple-system, BlinkMacSystemFont, sans-serif;">Dear Cafe, 
<div><br /></div>
<div>I am reading an article on HaskellWiki about unsafe IO[1]. It gives the guideline about usage of unsafeDupablePerformIO: "<span style="font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; font-size: medium; background-color: rgb(255, 255, 255);">If you need extra speed, and it's acceptable for the action to be performed multiple times, and it's acceptable if this action is canceled halfway through its execution, use </span><code style="margin: 0px; padding: 0px; line-height: 16.1200008392334px; background-color: rgb(240, 240, 240);">unsafeDupablePerformIO</code><span style="font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; font-size: medium; background-color: rgb(255, 255, 255);">.</span><font face="Helvetica Neue, Arial, Helvetica, sans-serif" size="3">” Inside `</font>ByteStirng` module[2], I noticed that when converting [Char] to ByteString, it uses unsafeDupablePerformIO to allocate space for the ByteString, as the following code shows (important information highlighted): </div>
<div><br /></div>
<div>
<pre style="background-color: rgb(253, 246, 227);">
<span class="hs-identifier" style="color: rgb(7, 54, 66);">packChars</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">::</span> <span class="hs-special" style="color: rgb(220, 50, 47);">[</span><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Char</span><span class="hs-special" style="color: rgb(220, 50, 47);">]</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#ByteString" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">ByteString</span></a>
<a name="line-195" id="line-195"></a><a name="packChars" id="packChars"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#packChars" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">packChars</span></a> <a name="local-6989586621679039859" id="local-6989586621679039859"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039859" class="hover-highlight" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213); background-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">cs</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">=</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#unsafePackLenChars" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);"><b><i>unsafePackLenChars</i></b></span></a> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">List.length</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039859" class="hover-highlight" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213); background-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">cs</span></a><span class="hs-special" style="color: rgb(220, 50, 47);">)</span> <span class="hs-identifier hs-var" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213); background-color: rgb(238, 232, 213); color: rgb(7, 54, 66);"><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039859" class="hover-highlight" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213); background-color: rgb(238, 232, 213);">c</a>s </span><span style="font-family: -apple-system, sans-serif;">:</span>
</pre>
<pre style="background-color: rgb(253, 246, 227);">
</pre>
<pre>
<span class="hs-identifier" style="color: rgb(7, 54, 66);">unsafePackLenBytes</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">::</span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Int</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <span class="hs-special" style="color: rgb(220, 50, 47);">[</span><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Word8</span><span class="hs-special" style="color: rgb(220, 50, 47);">]</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#ByteString" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">ByteString</span></a>
<a name="line-205" id="line-205"></a><a name="unsafePackLenBytes" id="unsafePackLenBytes"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#unsafePackLenBytes" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">unsafePackLenBytes</span></a> <a name="local-6989586621679039860" id="local-6989586621679039860"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039860" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">len</span></a> <a name="local-6989586621679039861" id="local-6989586621679039861"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039861" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">xs0</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">=</span>
<a name="line-206" id="line-206"></a>    <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#unsafeCreate" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);"><b><i>unsafeCreate</i></b></span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039860" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">len</span></a> <span class="hs-operator hs-var" style="color: rgb(211, 54, 130);">$</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">\</span><a name="local-6989586621679039866" id="local-6989586621679039866"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039866" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">p</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039862" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">go</span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039866" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">p</span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039861" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">xs0</span></a>
<a name="line-207" id="line-207"></a>  <span class="hs-keyword" style="color: rgb(175, 0, 95);">where</span>
<a name="line-208" id="line-208"></a>    <a name="local-6989586621679039862" id="local-6989586621679039862"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039862" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">go</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">!</span><span class="hs-identifier" style="color: rgb(7, 54, 66);">_</span> <span class="hs-special" style="color: rgb(220, 50, 47);">[</span><span class="hs-special" style="color: rgb(220, 50, 47);">]</span>     <span class="hs-glyph" style="color: rgb(220, 50, 47);">=</span> <span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">return</span> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><span class="hs-special" style="color: rgb(220, 50, 47);">)</span>
<a name="line-209" id="line-209"></a>    <span class="hs-identifier" style="color: rgb(7, 54, 66);">go</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">!</span><a name="local-6989586621679039863" id="local-6989586621679039863"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039863" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">p</span></a> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><a name="local-6989586621679039864" id="local-6989586621679039864"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039864" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">x</span></a><span class="hs-glyph" style="color: rgb(220, 50, 47);">:</span><a name="local-6989586621679039865" id="local-6989586621679039865"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039865" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">xs</span></a><span class="hs-special" style="color: rgb(220, 50, 47);">)</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">=</span> <span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">poke</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039863" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">p</span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039864" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">x</span></a> <span class="hs-operator hs-var" style="color: rgb(211, 54, 130);">>></span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039862" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">go</span></a> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039863" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">p</span></a> <span class="hs-special" style="color: rgb(220, 50, 47);">`</span><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">plusPtr</span><span class="hs-special" style="color: rgb(220, 50, 47);">`</span> <span class="hs-number" style="color: rgb(38, 139, 210);">1</span><span class="hs-special" style="color: rgb(220, 50, 47);">)</span> <span class="hs-identifier hs-var" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213); color: rgb(7, 54, 66);"><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039865" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);">xs</a></span>
</pre></div>
<div>
<pre style="background-color: rgb(253, 246, 227);">
</pre>
<pre style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);">
</pre>
<pre>
<span class="hs-identifier" style="color: rgb(7, 54, 66);"><b><i>unsafeCreate</i></b></span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">::</span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Int</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Ptr</span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Word8</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">IO</span> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><span class="hs-special" style="color: rgb(220, 50, 47);">)</span><span class="hs-special" style="color: rgb(220, 50, 47);">)</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#ByteString" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">ByteString</span></a>
<a name="line-357" id="line-357"></a><a name="unsafeCreate" id="unsafeCreate"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#unsafeCreate" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);"><b><i>unsafeCreate</i></b></span></a> <a name="local-6989586621679039964" id="local-6989586621679039964"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039964" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">l</span></a> <a name="local-6989586621679039965" id="local-6989586621679039965"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039965" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">f</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">=</span> <span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">unsafeDupablePerformIO</span> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#create" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);"><b><i>create</i></b></span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039964" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">l</span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039965" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">f</span></a><span class="hs-special" style="color: rgb(220, 50, 47);">)</span>
</pre>
<pre style="color: rgb(0, 0, 0);">
<span class="hs-identifier" style="color: rgb(7, 54, 66);"><span class="hs-comment" style="color: rgb(138, 138, 138);">-- | A way of creating ByteStrings outside the IO monad. The @Int@</span>
<a name="line-355" id="line-355"></a><span class="hs-comment" style="color: rgb(138, 138, 138);">-- argument gives the final size of the ByteString.</span></span>
</pre></div>
<div>
<pre style="background-color: rgb(253, 246, 227);">
<span class="hs-comment" style="color: rgb(138, 138, 138);">-- | Create ByteString of size @l@ and use action @f@ to fill it's contents.</span>
<a name="line-373" id="line-373"></a><span class="hs-identifier" style="color: rgb(7, 54, 66);"><b><i>create</i></b></span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">::</span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Int</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Ptr</span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Word8</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">IO</span> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><span class="hs-special" style="color: rgb(220, 50, 47);">)</span><span class="hs-special" style="color: rgb(220, 50, 47);">)</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">IO</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#ByteString" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">ByteString</span></a>
<a name="line-374" id="line-374"></a><a name="create" id="create"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#create" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);"><b><i>create</i></b></span></a> <a name="local-6989586621679039989" id="local-6989586621679039989"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039989" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">l</span></a> <a name="local-6989586621679039990" id="local-6989586621679039990"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039990" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">f</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">=</span> <span class="hs-keyword" style="color: rgb(175, 0, 95);">do</span>
<a name="line-375" id="line-375"></a>    <a name="local-6989586621679039991" id="local-6989586621679039991"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039991" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">fp</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);"><-</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#mallocByteString" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);"><b><i>mallocByteString</i></b></span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039989" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">l</span></a>
<a name="line-376" id="line-376"></a>    <span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">withForeignPtr</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039991" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">fp</span></a> <span class="hs-operator hs-var" style="color: rgb(211, 54, 130);">$</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">\</span><a name="local-6989586621679039992" id="local-6989586621679039992"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039992" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);">p</span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039990" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">f</span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039992" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">p</span></a>
<a name="line-377" id="line-377"></a>    <span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">return</span> <span class="hs-operator hs-var" style="color: rgb(211, 54, 130);">$!</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#PS" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">PS</span></a> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039991" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">fp</span></a> <span class="hs-number" style="color: rgb(38, 139, 210);">0</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679039989" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);">l</span></a>
<a name="line-378" id="line-378"></a><span class="hs-pragma" style="color: rgb(42, 161, 152);">{-# INLINE</span> <span class="hs-pragma" style="color: rgb(42, 161, 152);">create</span> <span class="hs-pragma" style="color: rgb(42, 161, 152);">#-}</span>
</pre></div>
<div>
<pre style="background-color: rgb(253, 246, 227);">
<span class="hs-comment" style="color: rgb(138, 138, 138);">-- | Wrapper of 'mallocForeignPtrBytes' with faster implementation for GHC</span>
<a name="line-427" id="line-427"></a><span class="hs-comment" style="color: rgb(138, 138, 138);">--</span>
<a name="line-428" id="line-428"></a><span class="hs-identifier" style="color: rgb(7, 54, 66);"><b><i>mallocByteString</i></b></span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">::</span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">Int</span> <span class="hs-glyph" style="color: rgb(220, 50, 47);">-></span> <span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">IO</span> <span class="hs-special" style="color: rgb(220, 50, 47);">(</span><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">ForeignPtr</span> <a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#local-6989586621679038880" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier hs-type" style="color: rgb(95, 95, 175);">a</span></a><span class="hs-special" style="color: rgb(220, 50, 47);">)</span>
<a name="line-429" id="line-429"></a><a name="mallocByteString" id="mallocByteString"></a><a href="http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#mallocByteString" class="" style="text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 232, 213);"><span class="hs-identifier" style="color: rgb(7, 54, 66);"><b><i>mallocByteString</i></b></span></a> <span class="hs-glyph" style="color: rgb(220, 50, 47);">=</span> <span class="hs-identifier hs-var" style="color: rgb(7, 54, 66);"><b><i>mallocPlainForeignPtrBytes</i></b></span>
<a name="line-430" id="line-430"></a><span class="hs-pragma" style="color: rgb(42, 161, 152);">{-# INLINE</span> <span class="hs-pragma" style="color: rgb(42, 161, 152);">mallocByteString</span> <span class="hs-pragma" style="color: rgb(42, 161, 152);">#-}</span>
</pre></div>
<div><br /></div>
<div>The doc of `mallocPlainForeignPtrBytes`, however, explicitly says that no finalizer is added for the allocated memory. So my question is: would not the allocation code in ByteString module cause memory leaks? </div>
<div><br /></div>
<div>The doc of `unsafeDupablePerformIO` mentions that it "<span style="background-color: rgb(255, 255, 255);"><font face="sans-serif"><span style="font-size: 15.600000381469727px;">duplicated IO actions is only run partially, and then interrupted in the middle without an exception being raised”. </span></font></span>Thus, it might happen that we have already allocated the memory but then the action is interrupted, without reclaiming the memory. </div>
<div><br /></div>
<div><br /></div>
<div>[1] https://wiki.haskell.org/Evaluation_order_and_state_tokens</div>
<div>[2] http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#ByteString</div>
</div>
<div name="messageSignatureSection" style="font-size: 14px; font-family: -apple-system, BlinkMacSystemFont, sans-serif;"><br />
Best Regards,
<div>Qingbo Liu<br /></div>
</div>
</body>
</html>