<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Yi Zhang's MSDN Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/yizhang/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/yizhang/feed.xml</link>
    <description>Everything about the CLR - interop / WinRT / and other random stuff</description>
    <lastBuildDate>Thu, 08 Feb 2018 09:01:13 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Top secret .NET handles - Part 1 - Dependent handles</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/top-secret-net-handles-part-1-dependent-handles</link>
      <pubDate>Thu, 08 Feb 2018 09:00:50 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=225</guid>
      <description><![CDATA[.NET publicly has documented 4 kind of handles:

 	Weak (also called Short Weak) - Don’t keep...]]></description>
      <content:encoded><![CDATA[.NET publicly has documented 4 kind of handles:
<ol>
 	<li><em>Weak</em><span> </span>(also called Short Weak) - Don’t keep target object alive and will return null when object is gone. The target will become null when the object enters for finalization.</li>
 	<li><em>WeakTrackResurrection</em><span> </span>(also called Long Weak) - Don’t keep target object alive and will return null when object is gone. It’ll return the object even when the object is being finalized or resurrected.</li>
 	<li><em>Normal</em><span> </span>(also called strong) - keeps target object alive. If you are not careful, you may leak the object.</li>
 	<li><em>Pinned</em><span> </span>- Keeps the target object alive and prevents GC from moving this object around. Useful when you are passing this object to native code, as native code won’t know if GC moved it. Note that using a lot of pinning handles may degrade GC performance. The most common offender is pinned strings/arrays in interop calls.</li>
</ol>
You can also find them described in<span> </span><a href="https://msdn.microsoft.com/en-us/library/83y4ak54.aspx">GCHandle enumeration</a>.

However, besides these 4 types, there are actually more secret internal handle types that are not exposed. In this post I’ll be talking about dependent handle, and why it is totally awesome.
<h2 id="caching-without-leaks">Caching without leaks</h2>
Let’s say you want to implement the best cache ever for your customer. Naturally you start with a<span> </span><code class="highlighter-rouge">Dictionary&lt;Customer, CustomerData&gt;</code><span> </span>and start adding things into it. So far so good. Except that all of your customers are now leaking. It’s obvious - they are being held by the dictionary! If you are in total control of the lifetime of the<span> </span><code class="highlighter-rouge">Customer</code><span> </span>object (for example, you have a dispose), it’s straigh-forward to automatically remove it from cache when it disposes. However, this may not always be possible. Another obvious choice is to resort back to finalizers - adding a finalizer to<span> </span><code class="highlighter-rouge">Customer</code><span> </span>type which removes itself from the cache when it finalizes. It works, but it means you now have potentially lots of objects that are finalizable, and there is only one finalizer thread. There is something called finalizer starvation - meaning finalizer couldn’t catch up with the objects that are finalized. Oops.

Now, what if the key is not held alive by the Dictionary, and instead is a<span> </span><code class="highlighter-rouge">WeakReference&lt;Customer&gt;</code>? But this doens’t really work - you are no longer leaking<span> </span><code class="highlighter-rouge">WeakReference&lt;Customer&gt;</code>, but you are still leaking<span> </span><code class="highlighter-rouge">CustomerData</code>, and what if<span> </span><code class="highlighter-rouge">CustomerData</code><span> </span>has a reference back to Customer? You are back to square one.

Before we give up, let’s try one more thing - let’s make both key and value to a<span> </span><code class="highlighter-rouge">WeakReference&lt;T&gt;</code>. Now we no longer leak<span> </span><code class="highlighter-rouge">Customer</code><span> </span>nor<span> </span><code class="highlighter-rouge">CustomerData</code>. However, the cache doesn’t work quite right, some times you’d have null keys, or you have null values.

You can keep trying, but the real problem is that we need two simple things:
<ul>
 	<li>Key and Value should both be alive, or not alive</li>
 	<li>If Key is not alive, we should allow key to be collected as if key is held by a weak reference</li>
</ul>
Now if this were custom data structure, this is easy to implement - just have the key reference the value thorugh a field, and have a WeakReference to the key. Done.

But what if we want a general purpose data structure? You can’t exactly add a new field to arbitary T.
<h2 id="dependenthandle-to-the-rescue">DependentHandle to the rescue</h2>
<code class="highlighter-rouge">Dependent handle</code><span> </span>is designed to solve these kind of problems - creating a<span> </span><em>dependency</em>between lifetime of two separate objects. Unlike regular handles, a dependent handle has two targets - primary and secondary. It has the same effect as a field reference - GC will scan primary and secondary, and will keep secondary alive if primary is alive.

If you are familiar with GC in a high-level (there aren’t many true GC experts out there and I’m not one of them), you’ll know that .NET GC scans live objects by<span> </span><em>tracing</em><span> </span>through object references, starting from roots - that is static variables, thread locals, stack variables, and strong (normal) handles, and going object to object, field by field. Dependent handle are kinda special by itself - GC will scan a list of dependent handle, and will mark secondary (making it alive, surviving this GC) alive if primary is alive.

Note that GC may have to scan the dependent handle list multiple times. If C -&gt; A, A -&gt; D, B -&gt; C, the first scan may skip C -&gt; A but would mark C eventually due to B is alive, then it has to come back and mark C -&gt; A, A -&gt; D, basically marking new objects. So GC will keep scanning the dependent handle list until there are no more new objects being marked (alive). Another reason that GC may need to do this is due to mark stack overflow (when GC ran out of stack space during mark).

You might think this is not very efficient, and it is not super efficient indeed. In theory you could get rid of this multiple scan, because the problem is you don’t have all the edge information as you go. This is solvable by essentially traverse the list of dependent handles and builds up a graph - thus avoiding traversing the same node twice as you already have all the edges, similar to the regular object graph traversing case (you’d have all the fields that are your edges). However, because the list of dependent handles, and the objects they point to are dynamic, building up this graph can be expensive, and you would be doing this work pretty much every GC (since the graph could easily change). In practice, a complicated graph between dependent handles are not common, so the trade-off works out in our favor. But this implementation for sure may subject to future change.

If you are curious you can refer to<span> </span><a href="https://github.com/dotnet/coreclr/blob/release/2.0.0/src/gc/objecthandle.cpp#L1267">https://github.com/dotnet/coreclr/blob/release/2.0.0/src/gc/objecthandle.cpp#L1267</a>:
<div class="language-cpp highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="c1">// Scan the dependent handle table promoting any secondary object whose associated primary object is promoted.
//
// Multiple scans may be required since (a) secondary promotions made during one scan could cause the primary
// of another handle to be promoted and (b) the GC may not have marked all promoted objects at the time it
// initially calls us.
//
// Returns true if any promotions resulted from this scan.
</span><span class="kt">bool</span> <span class="nf">Ref_ScanDependentHandlesForPromotion</span><span class="p">(</span><span class="n">DhContext</span> <span class="o">*</span><span class="n">pDhContext</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">LOG</span><span class="p">((</span><span class="n">LF_GC</span><span class="p">,</span> <span class="n">LL_INFO10000</span><span class="p">,</span> <span class="s">"Checking liveness of referents of dependent handles in generation %u</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_iCondemned</span><span class="p">));</span>
    <span class="kt">uint32_t</span> <span class="n">type</span> <span class="o">=</span> <span class="n">HNDTYPE_DEPENDENT</span><span class="p">;</span>
    <span class="kt">uint32_t</span> <span class="n">flags</span> <span class="o">=</span> <span class="p">(</span><span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_pScanContext</span><span class="o">-&gt;</span><span class="n">concurrent</span><span class="p">)</span> <span class="o">?</span> <span class="n">HNDGCF_ASYNC</span> <span class="o">:</span> <span class="n">HNDGCF_NORMAL</span><span class="p">;</span>
    <span class="n">flags</span> <span class="o">|=</span> <span class="n">HNDGCF_EXTRAINFO</span><span class="p">;</span>

    <span class="c1">// Keep a note of whether we promoted anything over the entire scan (not just the last iteration). We need
</span>    <span class="c1">// to return this data since under server GC promotions from this table may cause further promotions in
</span>    <span class="c1">// tables handled by other threads.
</span>    <span class="kt">bool</span> <span class="n">fAnyPromotions</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>

    <span class="c1">// Keep rescanning the table while both the following conditions are true:
</span>    <span class="c1">//  1) There's at least primary object left that could have been promoted.
</span>    <span class="c1">//  2) We performed at least one secondary promotion (which could have caused a primary promotion) on the
</span>    <span class="c1">//     last scan.
</span>    <span class="c1">// Note that even once we terminate the GC may call us again (because it has caused more objects to be
</span>    <span class="c1">// marked as promoted). But we scan in a loop here anyway because it is cheaper for us to loop than the GC
</span>    <span class="c1">// (especially on server GC where each external cycle has to be synchronized between GC worker threads).
</span>    <span class="k">do</span>
    <span class="p">{</span>
        <span class="c1">// Assume the conditions for re-scanning are both false initially. The scan callback below
</span>        <span class="c1">// (PromoteDependentHandle) will set the relevant flag on the first unpromoted primary it sees or
</span>        <span class="c1">// secondary promotion it performs.
</span>        <span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_fUnpromotedPrimaries</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
        <span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_fPromoted</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>

        <span class="n">HandleTableMap</span> <span class="o">*</span><span class="n">walk</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">g_HandleTableMap</span><span class="p">;</span>
        <span class="k">while</span> <span class="p">(</span><span class="n">walk</span><span class="p">)</span> 
        <span class="p">{</span>
            <span class="k">for</span> <span class="p">(</span><span class="kt">uint32_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">INITIAL_HANDLE_TABLE_ARRAY_SIZE</span><span class="p">;</span> <span class="n">i</span> <span class="o">++</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">walk</span><span class="o">-&gt;</span><span class="n">pBuckets</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
                <span class="p">{</span>
                    <span class="n">HHANDLETABLE</span> <span class="n">hTable</span> <span class="o">=</span> <span class="n">walk</span><span class="o">-&gt;</span><span class="n">pBuckets</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">pTable</span><span class="p">[</span><span class="n">getSlotNumber</span><span class="p">(</span><span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_pScanContext</span><span class="p">)];</span>
                    <span class="k">if</span> <span class="p">(</span><span class="n">hTable</span><span class="p">)</span>
                    <span class="p">{</span>
                        <span class="n">HndScanHandlesForGC</span><span class="p">(</span><span class="n">hTable</span><span class="p">,</span>
                                            <span class="n">PromoteDependentHandle</span><span class="p">,</span>
                                            <span class="kt">uintptr_t</span><span class="p">(</span><span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_pScanContext</span><span class="p">),</span>
                                            <span class="kt">uintptr_t</span><span class="p">(</span><span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_pfnPromoteFunction</span><span class="p">),</span>
                                            <span class="o">&amp;</span><span class="n">type</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span>
                                            <span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_iCondemned</span><span class="p">,</span>
                                            <span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_iMaxGen</span><span class="p">,</span>
                                            <span class="n">flags</span> <span class="p">);</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="n">walk</span> <span class="o">=</span> <span class="n">walk</span><span class="o">-&gt;</span><span class="n">pNext</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_fPromoted</span><span class="p">)</span>
            <span class="n">fAnyPromotions</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>

    <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_fUnpromotedPrimaries</span> <span class="o">&amp;&amp;</span> <span class="n">pDhContext</span><span class="o">-&gt;</span><span class="n">m_fPromoted</span><span class="p">);</span>

    <span class="k">return</span> <span class="n">fAnyPromotions</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
<h2 id="conditionalweaktable">ConditionalWeakTable</h2>
Now you might wonder: if dependent handle is totally awesome but why is it hidden and not used? That’s actually not quite correct. It is true that dependent handles are not directly exposed to developers, they are actually available through the<span> </span><a href="https://msdn.microsoft.com/en-us/library/dd287757.aspx"><code class="highlighter-rouge">ConditionalWeakTable</code></a><span> </span>class.

In the future, I’m also planning to write a series of post talking about the implementations of .NET concurrent data structures. A natural first post would be talking about how the<span> </span><code class="highlighter-rouge">ConditionalWeakTable</code><span> </span>is implemented - how it is using DependentHandle, how it supports thread-safety, etc. You can find its implementation<span> </span><a href="https://github.com/dotnet/coreclr/blob/release/2.0.0/src/mscorlib/src/System/Runtime/CompilerServices/ConditionalWeakTable.cs">here</a><span> </span>if you are interested to take a look yourself first. (I must confess that I added the<span> </span><code class="highlighter-rouge">FindEquivalentKeyUnsafe</code><span> </span>method and I’m not proud of it).

Besides<span> </span><code class="highlighter-rouge">ConditionalWeakTable</code>, dependent handle is also used internally in the .NET runtime to report missing references in native code to GC so that GC can resolve cycles between native WinRT objects and managed objects. But that itself is a rather involved topic and deserve its own post.
<h2 id="whats-next">What’s next</h2>
In the next Secret .NET handles post, I’ll talk about my favorite handle type (I’m certainly baised on this one) - a ref counted handle. It’s used in<span> </span><a href="https://docs.microsoft.com/en-us/dotnet/framework/interop/com-callable-wrapper">Com Callable Wrappers</a>.

For a complete list of handle types, see

<a href="https://github.com/dotnet/coreclr/blob/release/2.0.0/src/gc/gcinterface.h#L241">https://github.com/dotnet/coreclr/blob/release/2.0.0/src/gc/gcinterface.h#L241</a>]]></content:encoded>
    </item>
    <item>
      <title>Calling C functions from Python - part 3 - deep dive into ctypes implementation in CPython</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/calling-c-functions-from-python-part-3-deep-dive-into-ctypes-implementation-in-cpython</link>
      <pubDate>Fri, 02 Feb 2018 17:00:03 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=215</guid>
      <description><![CDATA[Last time we’ve looked at using ctypes to call C API, and writing extension module using Python/C...]]></description>
      <content:encoded><![CDATA[Last time we’ve looked at using ctypes to call C API, and writing extension module using Python/C API. Now we can finally tie these two together - looking at how ctypes is actually implemented using mix of Python/C API and Python code.
<ul>
 	<li>You can find CPython source code<span> </span><a href="https://github.com/python/cpython">here</a>.</li>
 	<li>ctypes’ C implementation is<span> </span><a href="https://github.com/python/cpython/tree/master/Modules/_ctypes">here</a></li>
 	<li>ctypes’ python implementation is<span> </span><a href="https://github.com/python/cpython/tree/master/Lib/ctypes">here</a>.</li>
</ul>
<h2 id="loading-libraries">Loading libraries</h2>
Recall that in<span> </span><code class="highlighter-rouge">ctypes</code><span> </span>we have<span> </span><code class="highlighter-rouge">cdll</code>,<span> </span><code class="highlighter-rouge">windll</code>,<span> </span><code class="highlighter-rouge">oledll</code><span> </span>object to help loading libraries. They are really LibraryLoader objects:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cdll</span>
<span class="o">&lt;</span><span class="n">ctypes</span><span class="o">.</span><span class="n">LibraryLoader</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x000000000592F470</span><span class="o">&gt;</span>
</code></pre>
</div>
</div>
And that type is just plain python code:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">class</span> <span class="nc">LibraryLoader</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dlltype</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_dlltype</span> <span class="o">=</span> <span class="n">dlltype</span>

    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">'_'</span><span class="p">:</span>
            <span class="k">raise</span> <span class="nb">AttributeError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="n">dll</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dlltype</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">dll</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">dll</span>

    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">LoadLibrary</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dlltype</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</code></pre>
</div>
</div>
The<span> </span><code class="highlighter-rouge">__getattr__</code><span> </span>is the magic that implements attribute-based library loading. Note that if the attribute is already there, CPython returns that attribute immediately without calling<span> </span><code class="highlighter-rouge">__getattr__</code>. Otherwise you would end up with multiple copies of the same attribute, or keeping creating new library objects and discarding old ones - not very efficent.

<code class="highlighter-rouge">dlltype</code><span> </span>is the type for each kind of DLL, such as<span> </span><code class="highlighter-rouge">CDLL</code>,<span> </span><code class="highlighter-rouge">PyDll</code>,<span> </span><code class="highlighter-rouge">WinDll</code>,<span> </span><code class="highlighter-rouge">OleDll</code>.<span> </span><code class="highlighter-rouge">__getattr__</code><span> </span>creates new instances of these types as needed.

<code class="highlighter-rouge">cdll</code>,<span> </span><code class="highlighter-rouge">pydll</code>,<span> </span><code class="highlighter-rouge">windll</code>,<span> </span><code class="highlighter-rouge">oledll</code><span> </span>are simply instances of<span> </span><code class="highlighter-rouge">LibraryLoader</code><span> </span>class, which are created with corresponding dlltype.
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">cdll</span> <span class="o">=</span> <span class="n">LibraryLoader</span><span class="p">(</span><span class="n">CDLL</span><span class="p">)</span>
<span class="n">pydll</span> <span class="o">=</span> <span class="n">LibraryLoader</span><span class="p">(</span><span class="n">PyDLL</span><span class="p">)</span>

<span class="k">if</span> <span class="n">_os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">"nt"</span><span class="p">:</span>
    <span class="n">pythonapi</span> <span class="o">=</span> <span class="n">PyDLL</span><span class="p">(</span><span class="s">"python dll"</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="n">_sys</span><span class="o">.</span><span class="n">dllhandle</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">_sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s">"cygwin"</span><span class="p">:</span>
    <span class="n">pythonapi</span> <span class="o">=</span> <span class="n">PyDLL</span><span class="p">(</span><span class="s">"libpython</span><span class="si">%</span><span class="s">d.</span><span class="si">%</span><span class="s">d.dll"</span> <span class="o">%</span> <span class="n">_sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[:</span><span class="mi">2</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
    <span class="n">pythonapi</span> <span class="o">=</span> <span class="n">PyDLL</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>

<span class="k">if</span> <span class="n">_os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">"nt"</span><span class="p">:</span>
    <span class="n">windll</span> <span class="o">=</span> <span class="n">LibraryLoader</span><span class="p">(</span><span class="n">WinDLL</span><span class="p">)</span>
    <span class="n">oledll</span> <span class="o">=</span> <span class="n">LibraryLoader</span><span class="p">(</span><span class="n">OleDLL</span><span class="p">)</span>
</code></pre>
</div>
</div>
Let’s look at<span> </span><code class="highlighter-rouge">CDLL</code><span> </span>first - its init does a<span> </span><code class="highlighter-rouge">dlopen</code><span> </span>to load the library:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">class</span> <span class="nc">CDLL</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="n">DEFAULT_MODE</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
        <span class="k">if</span> <span class="n">handle</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_handle</span> <span class="o">=</span> <span class="n">_dlopen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_handle</span> <span class="o">=</span> <span class="n">handle</span>
</code></pre>
</div>
</div>
The attribute access are defined in<span> </span><code class="highlighter-rouge">__getattr__</code><span> </span>as well - it gets translated to<span> </span><code class="highlighter-rouge">__getitem__</code>call which creates a new<span> </span><code class="highlighter-rouge">_FuncPtr</code><span> </span>instance.
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'__'</span><span class="p">)</span> <span class="ow">and</span> <span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s">'__'</span><span class="p">):</span>
            <span class="k">raise</span> <span class="nb">AttributeError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="n">func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">func</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">func</span>
    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name_or_ordinal</span><span class="p">):</span>
        <span class="n">func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_FuncPtr</span><span class="p">((</span><span class="n">name_or_ordinal</span><span class="p">,</span> <span class="bp">self</span><span class="p">))</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name_or_ordinal</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
            <span class="n">func</span><span class="o">.</span><span class="n">__name__</span> <span class="o">=</span> <span class="n">name_or_ordinal</span>
        <span class="k">return</span> <span class="n">func</span>
</code></pre>
</div>
</div>
We’ll look at<span> </span><code class="highlighter-rouge">_FuncPtr</code><span> </span>later - for now it’s good enough to know it represents function pointer.

The difference between OleDll and WinDll is simply the default settings:

For<span> </span><code class="highlighter-rouge">CDLL</code><span> </span>- the base class:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">class</span> <span class="nc">CDLL</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="n">_func_flags_</span> <span class="o">=</span> <span class="n">_FUNCFLAG_CDECL</span>
    <span class="n">_func_restype_</span> <span class="o">=</span> <span class="n">c_int</span>
</code></pre>
</div>
</div>
<code class="highlighter-rouge">WinDll</code><span> </span>has<span> </span><code class="highlighter-rouge">StdCall</code><span> </span>as default calling convention, and deriving from<span> </span><code class="highlighter-rouge">CDLL</code>:
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="k">class</span> <span class="nc">WinDLL</span><span class="p">(</span><span class="n">CDLL</span><span class="p">):</span>
        <span class="n">_func_flags_</span> <span class="o">=</span> <span class="n">_FUNCFLAG_STDCALL</span>
</code></pre>
</div>
</div>
<code class="highlighter-rouge">OleDll</code><span> </span>is like<span> </span><code class="highlighter-rouge">WinDll</code><span> </span>(in terms of calling convention), but the default return type is<span> </span><code class="highlighter-rouge">HRESULT</code>.
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="k">class</span> <span class="nc">OleDLL</span><span class="p">(</span><span class="n">CDLL</span><span class="p">):</span>
        <span class="n">_func_flags_</span> <span class="o">=</span> <span class="n">_FUNCFLAG_STDCALL</span>
        <span class="n">_func_restype_</span> <span class="o">=</span> <span class="n">HRESULT</span>
</code></pre>
</div>
</div>
<h2 id="calling-the-function">Calling the function</h2>
In last section we discussed the how library are loaded and we didn’t talk about functions yet. Functions are presented as<span> </span><code class="highlighter-rouge">_FuncPtr</code><span> </span>which is basically a<span> </span><code class="highlighter-rouge">_CFuncPtr</code><span> </span>in _ctypes module:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>        <span class="k">class</span> <span class="nc">_FuncPtr</span><span class="p">(</span><span class="n">_CFuncPtr</span><span class="p">):</span>
            <span class="n">_flags_</span> <span class="o">=</span> <span class="n">flags</span>
            <span class="n">_restype_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_func_restype_</span>
</code></pre>
</div>
</div>
Now it’s type to put our Python/C API knowledge to good use -<span> </span><code class="highlighter-rouge">_CFuncPtr</code><span> </span>is implemented in C:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">PyTypeObject</span> <span class="n">PyCFuncPtr_Type</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">PyVarObject_HEAD_INIT</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="s">"_ctypes.PyCFuncPtr"</span><span class="p">,</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">PyCFuncPtrObject</span><span class="p">),</span>                           <span class="cm">/* tp_basicsize */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_itemsize */</span>
    <span class="p">(</span><span class="n">destructor</span><span class="p">)</span><span class="n">PyCFuncPtr_dealloc</span><span class="p">,</span>             <span class="cm">/* tp_dealloc */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_print */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_getattr */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_setattr */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_reserved */</span>
    <span class="p">(</span><span class="n">reprfunc</span><span class="p">)</span><span class="n">PyCFuncPtr_repr</span><span class="p">,</span>                  <span class="cm">/* tp_repr */</span>
    <span class="o">&amp;</span><span class="n">PyCFuncPtr_as_number</span><span class="p">,</span>                      <span class="cm">/* tp_as_number */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_as_sequence */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_as_mapping */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_hash */</span>
    <span class="p">(</span><span class="n">ternaryfunc</span><span class="p">)</span><span class="n">PyCFuncPtr_call</span><span class="p">,</span>               <span class="cm">/* tp_call */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_str */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_getattro */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_setattro */</span>
    <span class="o">&amp;</span><span class="n">PyCData_as_buffer</span><span class="p">,</span>                         <span class="cm">/* tp_as_buffer */</span>
    <span class="n">Py_TPFLAGS_DEFAULT</span> <span class="o">|</span> <span class="n">Py_TPFLAGS_BASETYPE</span><span class="p">,</span> <span class="cm">/* tp_flags */</span>
    <span class="s">"Function Pointer"</span><span class="p">,</span>                         <span class="cm">/* tp_doc */</span>
    <span class="p">(</span><span class="n">traverseproc</span><span class="p">)</span><span class="n">PyCFuncPtr_traverse</span><span class="p">,</span>          <span class="cm">/* tp_traverse */</span>
    <span class="p">(</span><span class="n">inquiry</span><span class="p">)</span><span class="n">PyCFuncPtr_clear</span><span class="p">,</span>                  <span class="cm">/* tp_clear */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_richcompare */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_weaklistoffset */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_iter */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_iternext */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_methods */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_members */</span>
    <span class="n">PyCFuncPtr_getsets</span><span class="p">,</span>                         <span class="cm">/* tp_getset */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_base */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_dict */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_descr_get */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_descr_set */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_dictoffset */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_init */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_alloc */</span>
    <span class="n">PyCFuncPtr_new</span><span class="p">,</span>                             <span class="cm">/* tp_new */</span>
    <span class="mi">0</span><span class="p">,</span>                                          <span class="cm">/* tp_free */</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
Let’s look at the<span> </span><code class="highlighter-rouge">tp_new</code><span> </span>function<span> </span><code class="highlighter-rouge">PyCFuncPtr_new</code><span> </span>first:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">PyCFuncPtr_new</span><span class="p">(</span><span class="n">PyTypeObject</span> <span class="o">*</span><span class="n">type</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// ...
</span>
    <span class="k">if</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">PyTuple_GET_SIZE</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">PyTuple_Check</span><span class="p">(</span><span class="n">PyTuple_GET_ITEM</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
        <span class="k">return</span> <span class="n">PyCFuncPtr_FromDll</span><span class="p">(</span><span class="n">type</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwds</span><span class="p">);</span>
</code></pre>
</div>
</div>
PyCFuncPtr_FromDll has quite a bit of code, but in the end these two lines are the most important:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">PyCFuncPtr_FromDll</span><span class="p">(</span><span class="n">PyTypeObject</span> <span class="o">*</span><span class="n">type</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// ...
</span>
<span class="cp">#ifdef MS_WIN32
</span>    <span class="n">address</span> <span class="o">=</span> <span class="n">FindAddress</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">type</span><span class="p">);</span>
    <span class="c1">// ...
</span><span class="cp">#else
</span>    <span class="n">address</span> <span class="o">=</span> <span class="p">(</span><span class="n">PPROC</span><span class="p">)</span><span class="n">ctypes_dlsym</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="p">);</span>
    <span class="c1">// ...
</span></code></pre>
</div>
</div>
In Windows it does a<span> </span><code class="highlighter-rouge">GetProcAddress</code><span> </span>and in linux/mac it does<span> </span><code class="highlighter-rouge">dlsym</code>.

As far as calling function goes, calling the<span> </span><code class="highlighter-rouge">_CFuncPtr</code><span> </span>effectively calls<span> </span><code class="highlighter-rouge">tp_call</code><span> </span>field which is<span> </span><code class="highlighter-rouge">PyCFuncPtr_call</code>:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">PyCFuncPtr_call</span><span class="p">(</span><span class="n">PyCFuncPtrObject</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">inargs</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// ...
</span>    <span class="n">callargs</span> <span class="o">=</span> <span class="n">_build_callargs</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">argtypes</span><span class="p">,</span>
                               <span class="n">inargs</span><span class="p">,</span> <span class="n">kwds</span><span class="p">,</span>
                               <span class="o">&amp;</span><span class="n">outmask</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">inoutmask</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">numretvals</span><span class="p">);</span> 
    <span class="c1">// ...
</span>    <span class="n">result</span> <span class="o">=</span> <span class="n">_ctypes_callproc</span><span class="p">(</span><span class="n">pProc</span><span class="p">,</span>
                       <span class="n">callargs</span><span class="p">,</span>
<span class="cp">#ifdef MS_WIN32
</span>                       <span class="n">piunk</span><span class="p">,</span>
                       <span class="n">self</span><span class="o">-&gt;</span><span class="n">iid</span><span class="p">,</span>
<span class="cp">#endif
</span>                       <span class="n">dict</span><span class="o">-&gt;</span><span class="n">flags</span><span class="p">,</span>
                       <span class="n">converters</span><span class="p">,</span>
                       <span class="n">restype</span><span class="p">,</span>
                       <span class="n">checker</span><span class="p">);</span>
    <span class="c1">// ...
</span>    <span class="k">return</span> <span class="n">_build_result</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">callargs</span><span class="p">,</span>
                         <span class="n">outmask</span><span class="p">,</span> <span class="n">inoutmask</span><span class="p">,</span> <span class="n">numretvals</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
There are a lot of code in the function above, but it basically does 3 steps - preparing the arguments, making the call, and building the result and propagating the arguments back (for out/inout parameters).

Eventually it uses ffi_call from<span> </span><a href="https://sourceware.org/libffi/">FFI</a><span> </span>to make the call.
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="k">if</span> <span class="p">(</span><span class="n">FFI_OK</span> <span class="o">!=</span> <span class="n">ffi_prep_cif</span><span class="p">(</span><span class="o">&amp;</span><span class="n">cif</span><span class="p">,</span>
                               <span class="n">cc</span><span class="p">,</span>
                               <span class="n">argcount</span><span class="p">,</span>
                               <span class="n">restype</span><span class="p">,</span>
                               <span class="n">atypes</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">PyErr_SetString</span><span class="p">(</span><span class="n">PyExc_RuntimeError</span><span class="p">,</span>
                        <span class="s">"ffi_prep_cif failed"</span><span class="p">);</span>
        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>


    <span class="n">ffi_call</span><span class="p">(</span><span class="o">&amp;</span><span class="n">cif</span><span class="p">,</span> <span class="p">(</span><span class="n">void</span> <span class="o">*</span><span class="p">)</span><span class="n">pProc</span><span class="p">,</span> <span class="n">resmem</span><span class="p">,</span> <span class="n">avalues</span><span class="p">);</span>
</code></pre>
</div>
</div>
<code class="highlighter-rouge">FFI</code><span> </span>itself is quite complicated as it needs to understand all calling conventions and for different CPUs as well (for example, procedure calls in amd64 is drastically different in SPARC) - for now just think of it as a way of being able to say “I want to make a CDecl call to this function using these arguments”, without worrying about all the details in the ABI (Application Binary Interface) level.
<h2 id="structs-and-metaclasses">Structs and metaclasses</h2>
Now that we’ve looked at library loading and function loading/calling, let’s take a look at how structure is implemented. Recall how you write a structure:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">class</span> <span class="nc">VECTOR3</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span>
    <span class="n">_fields_</span> <span class="o">=</span> <span class="p">[(</span><span class="s">"x"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"y"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"z"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">)]</span>
</code></pre>
</div>
</div>
Somehow the VECTOR3 class gets the magic x, y, z attributes. How does this work?

The magic is in the<span> </span><code class="highlighter-rouge">PyCStructType</code><span> </span>metaclass.
<blockquote>Metaclass is a type used to create other types - it is an alternative way of doing subclassing / inheritance in Python, and a very powerful one too. If you understand metaclass you understand Python’s type system. If you are curious, see<span> </span><a href="https://jakevdp.github.io/blog/2012/12/01/a-primer-on-python-metaclasses/">Primer on metaclasses</a><span> </span>on a excellent explanation on metaclasses and<span> </span><a href="https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/">Understanding Python Metaclasses</a><span> </span>for a deeper dive. There is also a<span> </span><a href="https://blog.ionelmc.ro/presentations/metaclase/">presentation version</a><span> </span>as well.</blockquote>
<code class="highlighter-rouge">ctypes.Structure</code><span> </span>is implemented in<span> </span><code class="highlighter-rouge">_ctypes</code><span> </span>module as<span> </span><code class="highlighter-rouge">Struct_Type</code>, and type of<span> </span><code class="highlighter-rouge">Struct_Type</code><span> </span>is<span> </span><code class="highlighter-rouge">PyCStructType</code><span> </span>(<code class="highlighter-rouge">PyCStructType_Type</code><span> </span>object).
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="n">Py_TYPE</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Struct_Type</span><span class="p">)</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">PyCStructType_Type</span><span class="p">;</span>
    <span class="n">Struct_Type</span><span class="p">.</span><span class="n">tp_base</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">PyCData_Type</span><span class="p">;</span>
</code></pre>
</div>
</div>
This makes PyCStructType` a<span> </span><em>metaclass</em>.

Whenever you are deriving from<span> </span><code class="highlighter-rouge">ctypes.Strucuture</code><span> </span>like following:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">class</span> <span class="nc">VECTOR3</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span>
    <span class="n">_fields_</span> <span class="o">=</span> <span class="p">[(</span><span class="s">"x"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"y"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"z"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">)]</span>
</code></pre>
</div>
</div>
This effectively becomes:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">VECTOR3</span> <span class="o">=</span> <span class="n">PyCStructType</span><span class="p">(</span><span class="s">'VECTOR3'</span><span class="p">,</span> <span class="p">(</span><span class="n">Structure</span><span class="p">),</span> <span class="p">{</span> <span class="s">'fields'</span> <span class="p">:</span> <span class="p">[(</span><span class="s">"x"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"y"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"z"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">)]</span>
<span class="p">})</span>
</code></pre>
</div>
</div>
Note that<span> </span><code class="highlighter-rouge">tp_new</code><span> </span>of<span> </span><code class="highlighter-rouge">PyCStructType_Type</code><span> </span>is PyCStructType_new:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">PyTypeObject</span> <span class="n">PyCStructType_Type</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">PyVarObject_HEAD_INIT</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="s">"_ctypes.PyCStructType"</span><span class="p">,</span>                            <span class="cm">/* tp_name */</span>
    <span class="n">PyCStructType_setattro</span><span class="p">,</span>                     <span class="cm">/* tp_setattro */</span>
    <span class="n">CDataType_methods</span><span class="p">,</span>                          <span class="cm">/* tp_methods */</span>
    <span class="n">PyCStructType_new</span><span class="p">,</span>                                  <span class="cm">/* tp_new */</span>
<span class="p">};</span>
</code></pre>
</div>
</div>
So this ends up calling PyCStructType_new with those arguments, which retrieves the<span> </span><code class="highlighter-rouge">_fields_</code><span> </span>from supplied dictionary, and assign it to<span> </span><code class="highlighter-rouge">_fields_</code><span> </span>attribute, triggering<span> </span><code class="highlighter-rouge">PyCStructType_setattro</code>:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">PyCStructType_new</span><span class="p">(</span><span class="n">PyTypeObject</span> <span class="o">*</span><span class="n">type</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">StructUnionType_new</span><span class="p">(</span><span class="n">type</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwds</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">StructUnionType_new</span><span class="p">(</span><span class="n">PyTypeObject</span> <span class="o">*</span><span class="n">type</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">,</span> <span class="kt">int</span> <span class="n">isStruct</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">PyTypeObject</span> <span class="o">*</span><span class="n">result</span><span class="p">;</span>
    <span class="n">PyObject</span> <span class="o">*</span><span class="n">fields</span><span class="p">;</span>
    <span class="n">StgDictObject</span> <span class="o">*</span><span class="n">dict</span><span class="p">;</span>

    <span class="n">result</span> <span class="o">=</span> <span class="p">(</span><span class="n">PyTypeObject</span> <span class="o">*</span><span class="p">)</span><span class="n">PyType_Type</span><span class="p">.</span><span class="n">tp_new</span><span class="p">(</span><span class="n">type</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwds</span><span class="p">);</span>
    <span class="c1">//...
</span>    <span class="n">PyDict_Update</span><span class="p">((</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">dict</span><span class="p">,</span> <span class="n">result</span><span class="o">-&gt;</span><span class="n">tp_dict</span><span class="p">));</span>
    <span class="c1">//...
</span>    <span class="n">fields</span> <span class="o">=</span> <span class="n">PyDict_GetItemString</span><span class="p">((</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">dict</span><span class="p">,</span> <span class="s">"_fields_"</span><span class="p">);</span>
    <span class="c1">//...
</span>    <span class="n">fields</span> <span class="o">=</span> <span class="n">PyDict_GetItemString</span><span class="p">((</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">dict</span><span class="p">,</span> <span class="s">"_fields_"</span><span class="p">);</span>
    <span class="c1">//...
</span>    <span class="n">PyObject_SetAttrString</span><span class="p">((</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">result</span><span class="p">,</span> <span class="s">"_fields_"</span><span class="p">,</span> <span class="n">fields</span><span class="p">));</span>
</code></pre>
</div>
</div>
<code class="highlighter-rouge">tp_setattro</code><span> </span>catch the<span> </span><code class="highlighter-rouge">_field_</code><span> </span>access (from<span> </span><code class="highlighter-rouge">PyObject_SetAttrString</code><span> </span>call) and update the internal dictionary on the newly created<span> </span><code class="highlighter-rouge">VECTOR3</code><span> </span>type:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="kt">int</span>
<span class="nf">PyCStructType_setattro</span><span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">key</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">value</span><span class="p">)</span>
<span class="p">{</span>
    <span class="cm">/* XXX Should we disallow deleting _fields_? */</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="n">PyType_Type</span><span class="p">.</span><span class="n">tp_setattro</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="n">PyUnicode_Check</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="o">&amp;&amp;</span>
        <span class="n">_PyUnicode_EqualToASCIIString</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="s">"_fields_"</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">PyCStructUnionType_update_stgdict</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
<code class="highlighter-rouge">PyCStructUnionType_update_stgdict</code><span> </span>mostly traverse the list of fields and create necessary PyCField instances as corresponding attributes. Interestingly, the attribute assignment also triggers setattro, which simply let it through as it only cares about<span> </span><code class="highlighter-rouge">_fields_</code><span> </span>access (otherwise this would be an infinite loop). When you are accessing<span> </span><code class="highlighter-rouge">myVector3.x</code>, you are setting/getting PyCField instance, which are descriptor classes that binds to the owner class, which is the structure itself.
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">PyTypeObject</span> <span class="n">PyCField_Type</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">PyVarObject_HEAD_INIT</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="s">"_ctypes.CField"</span><span class="p">,</span>                                   <span class="cm">/* tp_name */</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">CFieldObject</span><span class="p">),</span>                       <span class="cm">/* tp_basicsize */</span>
    <span class="p">(</span><span class="n">reprfunc</span><span class="p">)</span><span class="n">PyCField_repr</span><span class="p">,</span>                            <span class="cm">/* tp_repr */</span>
    <span class="s">"Structure/Union member"</span><span class="p">,</span>                   <span class="cm">/* tp_doc */</span>
    <span class="p">(</span><span class="n">descrgetfunc</span><span class="p">)</span><span class="n">PyCField_get</span><span class="p">,</span>                 <span class="cm">/* tp_descr_get */</span>
    <span class="p">(</span><span class="n">descrsetfunc</span><span class="p">)</span><span class="n">PyCField_set</span><span class="p">,</span>                 <span class="cm">/* tp_descr_set */</span>
</code></pre>
</div>
</div>
<code class="highlighter-rouge">PyCField_repr</code><span> </span>provides the nice output you see here:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">VECTOR3</span><span class="o">.</span><span class="n">x</span>
<span class="o">&lt;</span><span class="n">Field</span> <span class="nb">type</span><span class="o">=</span><span class="n">c_long</span><span class="p">,</span> <span class="n">ofs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">4</span><span class="o">&gt;</span>
</code></pre>
</div>
</div>
While<span> </span><code class="highlighter-rouge">PyCField_get</code>/<code class="highlighter-rouge">PyCField_set</code><span> </span>provides access to the field on this structure (<code class="highlighter-rouge">myVector3.x</code>) through descriptor class and bindings to the structure instance:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="kt">int</span>
<span class="nf">PyCField_set</span><span class="p">(</span><span class="n">CFieldObject</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">inst</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">value</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">CDataObject</span> <span class="o">*</span><span class="n">dst</span><span class="p">;</span>
    <span class="kt">char</span> <span class="o">*</span><span class="n">ptr</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">CDataObject_Check</span><span class="p">(</span><span class="n">inst</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">PyErr_SetString</span><span class="p">(</span><span class="n">PyExc_TypeError</span><span class="p">,</span>
                        <span class="s">"not a ctype instance"</span><span class="p">);</span>
        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">dst</span> <span class="o">=</span> <span class="p">(</span><span class="n">CDataObject</span> <span class="o">*</span><span class="p">)</span><span class="n">inst</span><span class="p">;</span>
    <span class="n">ptr</span> <span class="o">=</span> <span class="n">dst</span><span class="o">-&gt;</span><span class="n">b_ptr</span> <span class="o">+</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">offset</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">value</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">PyErr_SetString</span><span class="p">(</span><span class="n">PyExc_TypeError</span><span class="p">,</span>
                        <span class="s">"can't delete attribute"</span><span class="p">);</span>
        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">PyCData_set</span><span class="p">(</span><span class="n">inst</span><span class="p">,</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">proto</span><span class="p">,</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">setfunc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span>
                     <span class="n">self</span><span class="o">-&gt;</span><span class="n">index</span><span class="p">,</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">,</span> <span class="n">ptr</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
In the above function,<span> </span><code class="highlighter-rouge">self</code><span> </span>is the<span> </span><code class="highlighter-rouge">PyCField</code><span> </span>instance,<span> </span><code class="highlighter-rouge">inst</code><span> </span>is<span> </span><code class="highlighter-rouge">VECTOR3</code><span> </span>(or whatever structure you have), and<span> </span><code class="highlighter-rouge">value</code><span> </span>is the new value you are assigning with. Eventually it got set on the pointer to the structure + field offset, basically<span> </span><code class="highlighter-rouge">*(ptr + offset) = value</code>.

But where is that ptr come from?

<code class="highlighter-rouge">ctypes.Structure</code><span> </span>are essentially CDataObject*:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="c1">// Fields omitted for clarity 
</span><span class="k">static</span> <span class="n">PyTypeObject</span> <span class="n">Struct_Type</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">PyVarObject_HEAD_INIT</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="s">"_ctypes.Structure"</span><span class="p">,</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">CDataObject</span><span class="p">),</span>                        <span class="cm">/* tp_basicsize */</span>
    <span class="n">GenericPyCData_new</span><span class="p">,</span>                         <span class="cm">/* tp_new */</span>
<span class="p">};</span>
</code></pre>
</div>
</div>
A<span> </span><code class="highlighter-rouge">CDataObject</code><span> </span>looks like this:
<div class="highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>struct tagCDataObject {
    PyObject_HEAD
    char *b_ptr;                /* pointer to memory block */
    int  b_needsfree;           /* need _we_ free the memory? */
    CDataObject *b_base;        /* pointer to base object or NULL */
    Py_ssize_t b_size;          /* size of memory block in bytes */
    Py_ssize_t b_length;        /* number of references we need */
    Py_ssize_t b_index;         /* index of this object into base's
                               b_object list */
    PyObject *b_objects;        /* dictionary of references we need to keep, or Py_None */
    union value b_value;
};
</code></pre>
</div>
</div>
Just think of it as a generic holder of any value - like VARIANT (if COM is your thing). In particular,<span> </span><code class="highlighter-rouge">b_value</code><span> </span>field holds the well known simple data values (it’s a union) and<span> </span><code class="highlighter-rouge">b_ptr</code>points to the underlying data if it is a more complex type, like structures.

GenericPyCData_new is fairly straight-forward - it allocates enough memory as described by the internal<span> </span><code class="highlighter-rouge">stgdict</code><span> </span>dictionary, which you can treat it as physical layout information about its fields and total size, which is calculated when<span> </span><code class="highlighter-rouge">_fields_</code><span> </span>get assigned.
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">GenericPyCData_new</span><span class="p">(</span><span class="n">PyTypeObject</span> <span class="o">*</span><span class="n">type</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">CDataObject</span> <span class="o">*</span><span class="n">obj</span><span class="p">;</span>
    <span class="n">StgDictObject</span> <span class="o">*</span><span class="n">dict</span><span class="p">;</span>

    <span class="n">dict</span> <span class="o">=</span> <span class="n">PyType_stgdict</span><span class="p">((</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">type</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">dict</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">PyErr_SetString</span><span class="p">(</span><span class="n">PyExc_TypeError</span><span class="p">,</span>
                        <span class="s">"abstract class"</span><span class="p">);</span>
        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">dict</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">|=</span> <span class="n">DICTFLAG_FINAL</span><span class="p">;</span>

    <span class="n">obj</span> <span class="o">=</span> <span class="p">(</span><span class="n">CDataObject</span> <span class="o">*</span><span class="p">)</span><span class="n">type</span><span class="o">-&gt;</span><span class="n">tp_alloc</span><span class="p">(</span><span class="n">type</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">obj</span><span class="p">)</span>
        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>

    <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_base</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
    <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_objects</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
    <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_length</span> <span class="o">=</span> <span class="n">dict</span><span class="o">-&gt;</span><span class="n">length</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="n">PyCData_MallocBuffer</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">dict</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">Py_DECREF</span><span class="p">(</span><span class="n">obj</span><span class="p">);</span>
        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">obj</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
PyCData_MallocBuffer handles two cases - if it is referring to a simple type (like<span> </span><code class="highlighter-rouge">c_int</code>, etc), there is no need to allocate the int dynamically as it fits perfectly well in the<span> </span><code class="highlighter-rouge">b_value</code><span> </span>union field. Otherwise, it allocates the correct buffer size and assign to<span> </span><code class="highlighter-rouge">b_ptr</code>.
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="kt">int</span> <span class="nf">PyCData_MallocBuffer</span><span class="p">(</span><span class="n">CDataObject</span> <span class="o">*</span><span class="n">obj</span><span class="p">,</span> <span class="n">StgDictObject</span> <span class="o">*</span><span class="n">dict</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">((</span><span class="kt">size_t</span><span class="p">)</span><span class="n">dict</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">&lt;=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_value</span><span class="p">))</span> <span class="p">{</span>
        <span class="cm">/* No need to call malloc, can use the default buffer */</span>
        <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_ptr</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_value</span><span class="p">;</span>
        <span class="cm">/* The b_needsfree flag does not mean that we actually did
           call PyMem_Malloc to allocate the memory block; instead it
           means we are the *owner* of the memory and are responsible
           for freeing resources associated with the memory.  This is
           also the reason that b_needsfree is exposed to Python.
         */</span>
        <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_needsfree</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="cm">/* In python 2.4, and ctypes 0.9.6, the malloc call took about
           33% of the creation time for c_int().
        */</span>
        <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_ptr</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">PyMem_Malloc</span><span class="p">(</span><span class="n">dict</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_ptr</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">PyErr_NoMemory</span><span class="p">();</span>
            <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_needsfree</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">memset</span><span class="p">(</span><span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_ptr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dict</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">obj</span><span class="o">-&gt;</span><span class="n">b_size</span> <span class="o">=</span> <span class="n">dict</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
You might already noticed that the buffer is 0 initialized, and gets freed when it gets finalized. The finalization happens in<span> </span><code class="highlighter-rouge">PyCData_dealloc</code><span> </span>which does a free if needed.
<h2 id="next-in-the-series">Next in the series</h2>
Originally I was planning to write 3 part series. But then I got interested in<span> </span><a href="http://yizhang82.me/www.pypy.org">PyPy</a><span> </span>and decided to research into PyPy a bit more. In particular I suspect CFFI might have much better perf (at least in theory) than ctypes with a proper JIT implementation since the arguments “marshaling” can be pretty much “inlined”, but that also requires JIT to be aware of various calling conventions, which is also a pretty daunting task as well (essentially implementing FFI in the JIT).

I’ll update them with links once they become available:
<ul>
 	<li><a href="http://yizhang82.me/python-interop-ctypes">Part 1 - CTypes</a></li>
 	<li><a href="http://yizhang82.me/python-interop-capi">Part 2 - writing CPython extensions using Python/C API</a></li>
 	<li><a href="http://yizhang82.me/python-interop-inside-ctypes">Part 3 - Deep dive into ctypes implementation in CPython</a></li>
 	<li>Part 4 - PyPy and CFFI</li>
</ul>
You can also find this post in <a href="http://yizhang82.me/python-interop-inside-ctypes">http://yizhang82.me/python-interop-inside-ctypes</a>]]></content:encoded>
    </item>
    <item>
      <title>Calling C functions from Python - part 2 - writing CPython extensions using Python/C API</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/calling-c-functions-from-python-part-2-writing-cpython-extensions-using-pythonc-api</link>
      <pubDate>Sat, 27 Jan 2018 17:00:58 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=195</guid>
      <description><![CDATA[In my previous post we’ve briefly looked at using ctypes module to call C APIs. In this post let’s...]]></description>
      <content:encoded><![CDATA[In my<span> </span><a href="http://yizhang82.me/python-interop-ctypes">previous post</a><span> </span>we’ve briefly looked at using ctypes module to call C APIs. In this post let’s dive into a completely different approach - writing a C extension using Python/C API. From the C extension you can then call whatever C/C++ code you want. This is a pretty popular approach to expose a 3rd party C library as python module. The downside is this module would only be loaded by CPython, which is usually not a big issue - unless you use other Python implementation like<span> </span><a href="http://pypy.org/">PyPy</a>.

Imagine if we want to build a better integer library supporting faster integer operations. In this example it won’t be really faster - just a hypothetical example :)
<h1 id="its-all-c-code">It’s all C code</h1>
CPython, as the name suggests, is written in C (mostly). It has a set of data types describes what are python objects, defines a set of operations on python objects, and use those definition + operations to implement core language functionality and internal modules. A subset of those APIs are opened for extension module writers to access the interpreter directly, pretty much like internal modules. Not surprisingly, this is extremely powerful - you have almost the same power as the interpreter itself.

Unfortunately, this also means:
<ul>
 	<li>the extension module is bound to CPython. In theory another Python implementation could implement the entire CPython API surface area - but that effectively means that you are rewriting a significant part of CPython from scratch with the same interface, implementing it with your own Python implementation - a daunting (if not challenging) task for sure.</li>
 	<li>CPython always needs to implement those APIs which means that overhauling the interpreter is now more difficult and needs to happen incrementally while maintaining compatibility of the C API.</li>
</ul>
<h1 id="a-module-with-only-static-methods">A module with only static methods</h1>
Let’s jump right in. Any Python/C extension module needs to start by including<span> </span><code class="highlighter-rouge">python.h</code><span> </span>to get all the definitions of Python/C API and types. Don’t worry about details of building yet - we’ll get to that later.
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="cp">#include &lt;Python.h&gt;
</span></code></pre>
</div>
</div>
Now we need to define what the static method looks like:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyMethodDef</span> <span class="n">FastIntModule_StaticMethods</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="p">{</span> <span class="s">"add"</span><span class="p">,</span> <span class="n">FastInt_Add</span><span class="p">,</span> <span class="n">METH_VARARGS</span><span class="p">,</span> <span class="s">"Add two integers"</span> <span class="p">},</span>
    <span class="p">{</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span> <span class="p">}</span>
<span class="p">};</span>
</code></pre>
</div>
</div>
<code class="highlighter-rouge">PyMethodDef</code><span> </span>is the C struct type describing python methods. You need to supply:
<ul>
 	<li>the name - “add”</li>
 	<li>the actual C function implementation -<span> </span><code class="highlighter-rouge">FastInt_Add</code>. We’ll fill it in later.</li>
 	<li>flags -<span> </span><code class="highlighter-rouge">METH_VARARGS</code><span> </span>meaning it accepts arbitary number of arguments via tuples</li>
 	<li>doc - “Add two integers”</li>
</ul>
The last one with all NULLs is a sentinel tell Python to stop looking at more entries, kinda like a<span> </span><code class="highlighter-rouge">\0</code><span> </span>terminator. It’s a convention that you’ll need to remember. This way you don’t have to pass size around.

Now we need to tell Python that we have a module with these static functions:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">PYMODINIT_FUNC</span> <span class="nf">initfastint</span><span class="p">()</span>
<span class="p">{</span>
    <span class="n">Py_InitModule</span><span class="p">(</span><span class="s">"fastint"</span><span class="p">,</span> <span class="n">FastIntModule_StaticMethods</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
All python initialization module functions need to be named<span> </span><code class="highlighter-rouge">init&lt;module_name&gt;</code><span> </span>- this is how python knows which function to call in your extension module. All it needs to do right now is to register the module with the list of static methods you supplied.

With all the setup, now all we need to do is to add the real method:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span><span class="nf">FastInt_Add</span><span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">PyArg_ParseTuple</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="s">"ii"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">))</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="n">Py_BuildValue</span><span class="p">(</span><span class="s">"i"</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
There are quite a few things here and can look a bit scary first time. Let’s go through this one thing at a time.

First, all Python objects are<span> </span><code class="highlighter-rouge">PyObject*</code>.

You can think this as the “base class pointer” as every python object are “derived” from PyObject. The code is written using C so the inheritance is really built by hand through inserting a PyObject field into all the subclasses. We’ll see more of that later.

A<span> </span><code class="highlighter-rouge">PyObject</code><span> </span>is really a ref count + its type.
<div class="highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;
</code></pre>
</div>
</div>
Then, in<span> </span><code class="highlighter-rouge">FastInt_Add</code>, it accepts<span> </span><code class="highlighter-rouge">self</code><span> </span>and rest of the arguments in<span> </span><code class="highlighter-rouge">args</code><span> </span>as a tuple.<span> </span><code class="highlighter-rouge">PyArg_ParseTuple</code><span> </span>is used to parse the arguments and break them down into dividual local variables, using a printf/scanf style format -<span> </span><code class="highlighter-rouge">ii</code><span> </span>means following two pointers are int*. The result is added together, and then returned in the same manner constructing a Python integer object.

That’s it!
<h1 id="buliding-the-module">Buliding the module</h1>
In this case I’m using CMake. You can use whatever you want but CMake makes it pretty easy to build it in multiple platforms.

First, you need to let CMakfind_package(PythonLibs 2.7 REQUIRED)e find the python package:
<div class="highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>find_package(PythonLibs 2.7 REQUIRED)
</code></pre>
</div>
</div>
This sets necessary<span> </span><code class="highlighter-rouge">PYTHON_INCLUDE_DIRS</code><span> </span>and<span> </span><code class="highlighter-rouge">PYTHON_LIBRARIES</code><span> </span>variables that you can use later.

One interesting problem you might run into is that you need to have a matching bitness of python with your build. For example, if you are building x86 and yet your python is 64-bit, you may see a package lookup failure. Try adding<span> </span><code class="highlighter-rouge">-DCMAKE_GENERATOR_PLATFORM=x64</code><span> </span>to building as 64-bit instead.
<div class="highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>include_directories(${PYTHON_INCLUDE_DIRS})target_link_libraries(FASTINT_DLL ${PYTHON_LIBRARIES})
</code></pre>
</div>
</div>
To build your code as a python extension module, it obviously needs to be a shared library (<code class="highlighter-rouge">DLL</code>/<code class="highlighter-rouge">dylib</code>/<code class="highlighter-rouge">so</code>), and should have the extension<span> </span><code class="highlighter-rouge">.pyd</code>:
<div class="highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>add_library(FASTINT_DLL SHARED main.c)
set_target_properties(FASTINT_DLL PROPERTIES SUFFIX ".pyd")
</code></pre>
</div>
</div>
One interesting problem that I ran into in Windows 64-bit python 2.7 is that Python.h tries to redirect your lib to the debug lib python27_d.lib which doesn’t really exist in python distribution by default unless you build your own debug python. This is done in<span> </span><code class="highlighter-rouge">pyconfig.h</code>:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="cm">/* For an MSVC DLL, we can nominate the .lib files used by extensions */</span>
<span class="cp">#ifdef MS_COREDLL
#	ifndef Py_BUILD_CORE </span><span class="cm">/* not building the core - must be an ext */</span><span class="cp">
#		if defined(_MSC_VER)
</span>			<span class="cm">/* So MSVC users need not specify the .lib file in
			their Makefile (other compilers are generally
			taken care of by distutils.) */</span>
<span class="cp">#			ifdef _DEBUG
#				pragma comment(lib,"python27_d.lib")
#			else
#				pragma comment(lib,"python27.lib")
#			endif </span><span class="cm">/* _DEBUG */</span><span class="cp">
#		endif </span><span class="cm">/* _MSC_VER */</span><span class="cp">
#	endif </span><span class="cm">/* Py_BUILD_CORE */</span><span class="cp">
#endif </span><span class="cm">/* MS_COREDLL */</span><span class="cp">
</span></code></pre>
</div>
</div>
This is unnecessary in my opinion as it should be perfectly OK to build your extension as debug and use Python/C API as release. I tried to use some knobs such as<span> </span><code class="highlighter-rouge">MS_COREDLL</code><span> </span>but having _DEBUG flag ultimately force Python.h go down the path of linking against debug version of API:
<div class="highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>main.obj : error LNK2019: unresolved external symbol Py_InitModule4TraceRefs_64 referenced in function initFastInt
</code></pre>
</div>
</div>
Turns out<span> </span><code class="highlighter-rouge">Py_InitModule4TraceRefs_64</code><span> </span>only exists in debug libs.

The simpliest thing to do is to stick with release build - and use debug build of Python if you want to build your extension as debug. In my opinion this is not designed properly - _DEBUG should control debug-ness of the module and python itself should use a different one, but this is probably topic for another day.
<h1 id="trying-it-out">Trying it out</h1>
Once we build the module using cmake, we can finally give this a try:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">import</span> <span class="nn">fastint</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">fastint</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
<span class="mi">30</span>
</code></pre>
</div>
</div>
If Python refuse to load the module, you might need to tweak<span> </span><code class="highlighter-rouge">syspath</code>, such as:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'path/to/my/module'</span><span class="p">)</span>
</code></pre>
</div>
</div>
Or, load it directly:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">fastint</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">load_dynamic</span><span class="p">(</span><span class="s">'fastint'</span><span class="p">,</span> <span class="s">r'path/to/my/module/fastint.pyd'</span><span class="p">)</span>
</code></pre>
</div>
</div>
<h1 id="defining-a-fastint-class">Defining a fastint class</h1>
If we want to define a fastint type, it is a bit more involved.

Let’s start by defining our own PyObject “subclass”:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">PyObject_HEAD</span>
    <span class="kt">int</span> <span class="n">value</span><span class="p">;</span>
<span class="p">}</span> <span class="n">FastIntObject</span><span class="p">;</span>
</code></pre>
</div>
</div>
Recall our earlier discussion on<span> </span><code class="highlighter-rouge">PyObject</code><span> </span>“manual” inheritance -<span> </span><code class="highlighter-rouge">PyObject_HEAD</code><span> </span>is the magic that inserts the<span> </span><code class="highlighter-rouge">PyObject</code><span> </span>fields:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="cp">#define PyObject_HEAD                   \
    _PyObject_HEAD_EXTRA                \
    Py_ssize_t ob_refcnt;               \
    struct _typeobject *ob_type;
</span></code></pre>
</div>
</div>
And all what we need in addition to that is a int field.

Once we have the object definition, let’s define the type:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyTypeObject</span> <span class="n">FastIntType</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">PyVarObject_HEAD_INIT</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="s">"fastint.fastInt"</span><span class="p">,</span>         <span class="cm">/* tp_name */</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">FastIntObject</span><span class="p">),</span>     <span class="cm">/* tp_basicsize */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_itemsize */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_dealloc */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_print */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_getattr */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_setattr */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_reserved */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_repr */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_as_number */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_as_sequence */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_as_mapping */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_hash  */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_call */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_str */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_getattro */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_setattro */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_as_buffer */</span>
    <span class="n">Py_TPFLAGS_DEFAULT</span><span class="p">,</span>        <span class="cm">/* tp_flags */</span>
    <span class="s">"Fast int object"</span><span class="p">,</span>         <span class="cm">/* tp_doc */</span>    
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_traverse */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_clear */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_richcompare */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_weaklistoffset */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_iter */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_iternext */</span>
    <span class="n">FastInt_methods</span><span class="p">,</span>           <span class="cm">/* tp_methods */</span>
    <span class="n">FastInt_members</span><span class="p">,</span>           <span class="cm">/* tp_members */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_getset */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_base */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_dict */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_descr_get */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_descr_set */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_dictoffset */</span>
    <span class="p">(</span><span class="n">initproc</span><span class="p">)</span><span class="n">FastInt_init</span><span class="p">,</span>    <span class="cm">/* tp_init */</span>
    <span class="mi">0</span><span class="p">,</span>                         <span class="cm">/* tp_alloc */</span>
    <span class="n">FastInt_new</span><span class="p">,</span>               <span class="cm">/* tp_new */</span>
<span class="p">};</span>
</code></pre>
</div>
</div>
Although this looks rather intimidating at first, this is simply a struct with a bunch of fields that defines what this type is. This defines a type object - an object that represents the fastint type.
<h2 id="every-field-is-a-well-defined-operation">Every field is a well-defined operation</h2>
Every single field here is a well-defined operation understood by the interpreter. For example,<span> </span><code class="highlighter-rouge">tp_alloc</code><span> </span>is for memory allocation, and<span> </span><code class="highlighter-rouge">tp_new</code><span> </span>and<span> </span><code class="highlighter-rouge">tp_init</code><span> </span>is for object initialization (including initialization for its fields). If you are familiar with COM or C++, you’ll quickly notice that this is simply a v-table with function pointers. By providing field values, you are effectively<span> </span><em>overriding</em><span> </span>the base implementation. Oh, where is the actual inheritance, you say? It is handled by<span> </span><code class="highlighter-rouge">PyType_Ready</code><span> </span>helper - we need to call<span> </span><code class="highlighter-rouge">PyType_Ready</code><span> </span>to fill in the blanks - initializing fields from base type.
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="k">if</span> <span class="p">(</span><span class="n">PyType_Ready</span><span class="p">(</span><span class="o">&amp;</span><span class="n">FastIntType</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>
        <span class="k">return</span><span class="p">;</span>
</code></pre>
</div>
</div>
<h2 id="fastinttype-itself-is-an-pyobject">FastIntType itself is an PyObject</h2>
Take a look at the<span> </span><code class="highlighter-rouge">PyVarObject_HEAD_INIT</code><span> </span>macro that initializes PyObject’s fields:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="cp">#define PyObject_HEAD_INIT(type)        \
    _PyObject_EXTRA_INIT                \
    1, type,
</span>
<span class="cp">#define PyVarObject_HEAD_INIT(type, size)       \
    PyObject_HEAD_INIT(type) size,
</span></code></pre>
</div>
</div>
As you can see above, it is giving a 1 ref count and NULL type (which we’ll fill in later). All Python objects are ref-counted and as a extension writer we need to maintain ref count correctly. A new object starts with 1, not surprisingly.
<blockquote>In theory CPython could be designed with a garbage collector and avoid ref counting. There are quite a few challenges implementing a real garbage collector, such as reducing stop-othe-world collections, fine-tune memory growth policy, knowing where stack and static objects are at all times, avoiding fragmentation, finding the right balance between keeping objects alive vs reclaiming objects, etc. At the end of the day, implementing ref counting is the simplest thing to do, and it stuck. In practice it works usually pretty well, except for cycles (and the perf cost of ref-counting). Python does have a cycle detection algorithm and<span> </span><code class="highlighter-rouge">tp_traverse</code><span> </span>to help with pointer traversal, but it’s optional.</blockquote>
<h2 id="tp_new-field-defines-the-new-function"><code class="highlighter-rouge">tp_new</code><span> </span>field defines the new function</h2>
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">FastInt_new</span><span class="p">(</span><span class="n">PyTypeObject</span> <span class="o">*</span><span class="n">type</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">FastIntObject</span> <span class="o">*</span><span class="n">self</span><span class="p">;</span>

    <span class="n">self</span> <span class="o">=</span> <span class="p">(</span><span class="n">FastIntObject</span> <span class="o">*</span><span class="p">)</span><span class="n">type</span><span class="o">-&gt;</span><span class="n">tp_alloc</span><span class="p">(</span><span class="n">type</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">self</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">self</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">self</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
The new function does the allocation and minimum initialization. Conveniently, we’ll use the type object of fastint type to allocate a type object, using the<span> </span><code class="highlighter-rouge">tp_alloc</code><span> </span>helper. As mentioned previously,<span> </span><code class="highlighter-rouge">tp_alloc</code><span> </span>wasn’t provided by us but rather filled-in by<span> </span><code class="highlighter-rouge">PyType_Ready</code>, kinda like calling the base constructor.

Note that we also has a init function:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="kt">int</span>
<span class="nf">FastInt_init</span><span class="p">(</span><span class="n">FastIntObject</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">kwds</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span> <span class="n">PyArg_ParseTuple</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="s">"i"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">self</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">))</span>
        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
It calls<span> </span><code class="highlighter-rouge">PyArg_ParseTuple</code><span> </span>to assign the internal value with the supplied int argument. Intuitively, you might think<span> </span><code class="highlighter-rouge">tp_init</code><span> </span>is the<span> </span><code class="highlighter-rouge">__init__</code><span> </span>function and<span> </span><code class="highlighter-rouge">tp_new</code><span> </span>is the<span> </span><code class="highlighter-rouge">__new__</code>function, and you are right.<span> </span><code class="highlighter-rouge">__new__</code><span> </span>is the creation method while<span> </span><code class="highlighter-rouge">__init__</code><span> </span>is the initialization method.
<h2 id="tp_methods-define-list-of-methods"><code class="highlighter-rouge">tp_methods</code><span> </span>define list of methods</h2>
We only have one:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyMethodDef</span> <span class="n">FastInt_methods</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="p">{</span> <span class="s">"inc"</span><span class="p">,</span> <span class="p">(</span><span class="n">PyCFunction</span><span class="p">)</span> <span class="n">FastInt_inc</span><span class="p">,</span> <span class="n">METH_VARARGS</span><span class="p">,</span> <span class="s">"inc method"</span> <span class="p">},</span>
    <span class="p">{</span> <span class="nb">NULL</span> <span class="p">}</span>
<span class="p">};</span>
</code></pre>
</div>
</div>
Again, NULLs are the sentinel.

The inc method looks like this - and is pretty straight-forward:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">FastInt_inc</span><span class="p">(</span><span class="n">FastIntObject</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">int</span> <span class="n">operand</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span> <span class="n">PyArg_ParseTuple</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="s">"i"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">operand</span><span class="p">))</span>
        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>

    <span class="n">self</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">+=</span> <span class="n">operand</span><span class="p">;</span>

    <span class="n">Py_INCREF</span><span class="p">(</span><span class="n">self</span><span class="p">);</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="n">self</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
Note that it returns<span> </span><code class="highlighter-rouge">self</code><span> </span>back to the caller. In Python, returning a object needs to come with an add ref (just like COM). So we need to call Py_INCREF. If you think about it, there is a good reason for it - the caller needs to be sure that the returned object is usable (otherwise the object could be gone after the return, or even before), and having a usable object meaning doing an explicit<span> </span><code class="highlighter-rouge">Py_INCREF</code>. The caller can then use it knowing it is always safe, and release it by calling<span> </span><code class="highlighter-rouge">Py_DECREF</code><span> </span>when it’s done. There are exceptions to this rule - if by certain implied contract that the caller knows the returned object is always going to be alive (usually tied to a<span> </span><em>parent</em><span> </span>object), it can return the object without a addref (one such example being<span> </span><code class="highlighter-rouge">PyTuple_GetItem</code>). Always consult the documentation.
<h2 id="tp_members-define-its-members">tp_members define its members</h2>
We have one member - the value field:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">static</span> <span class="n">PyMemberDef</span> <span class="n">FastInt_members</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="p">{</span> <span class="s">"value"</span><span class="p">,</span> <span class="n">T_INT</span><span class="p">,</span> <span class="n">offsetof</span><span class="p">(</span><span class="n">FastIntObject</span><span class="p">,</span> <span class="n">value</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="s">"value of the integer"</span> <span class="p">},</span>
    <span class="p">{</span> <span class="nb">NULL</span> <span class="p">}</span>  <span class="cm">/* Sentinel */</span>
<span class="p">};</span>
</code></pre>
</div>
</div>
We basically tell python - here is a field with this offset and you can show it as a member called “value”. The struct field name can be whatever name you want since python doesn’t care what you call your struct fields - meaning that they don’t have to match, but it is nice that they do.
<h1 id="initializing-the-type">Initializing the type</h1>
Now that we have the type with all its members, we need to tell Python that it is there. Not surprisingly, the best place to do so is the module init function:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">PYMODINIT_FUNC</span> <span class="nf">initfastint</span><span class="p">()</span>
<span class="p">{</span>
    <span class="n">PyObject</span> <span class="o">*</span><span class="n">m</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">PyType_Ready</span><span class="p">(</span><span class="o">&amp;</span><span class="n">FastIntType</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>
        <span class="k">return</span><span class="p">;</span>

    <span class="n">m</span> <span class="o">=</span> <span class="n">Py_InitModule</span><span class="p">(</span><span class="s">"fastint"</span><span class="p">,</span> <span class="n">FastIntModule_StaticMethods</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">m</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
        <span class="k">return</span><span class="p">;</span>

    <span class="n">Py_INCREF</span><span class="p">(</span><span class="o">&amp;</span><span class="n">FastIntType</span><span class="p">);</span>
    <span class="n">PyModule_AddObject</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="s">"fastInt"</span><span class="p">,</span> <span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">FastIntType</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
<ul>
 	<li><code class="highlighter-rouge">PyType_Ready</code><span> </span>initialize the type object by assigning its fields with base and other necessary adjustments and error checking</li>
 	<li><code class="highlighter-rouge">PyModule_AddObject</code><span> </span>registers the type on the module so that Python knows this module now has this type.</li>
</ul>
<h1 id="trying-out-fastint-type">Trying out fastInt type</h1>
Now it’s time to try out our new (not at all) fastint type.
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">import</span> <span class="nn">fastint</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">fastint</span><span class="o">.</span><span class="n">fastInt</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">i</span><span class="o">.</span><span class="n">value</span>
<span class="mi">10</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">i</span><span class="o">.</span><span class="n">inc</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
<span class="o">&lt;</span><span class="n">fastint</span><span class="o">.</span><span class="n">fastInt</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x0000000004A610D8</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">i</span><span class="o">.</span><span class="n">value</span>
<span class="mi">30</span>
</code></pre>
</div>
</div>
<h1 id="where-is-the-code">Where is the code</h1>
You can find the code at<span> </span><a href="https://github.com/yizhang82/bindings_example/tree/master/python/fastint">github</a>
<h1 id="whats-next">What’s next</h1>
As previously mentioned, I’ll cover Python C API in the next post and dive into ctypes implementation in CPython (which are written using python C API).

I’ll update them with links once they become available:
<ul>
 	<li><a href="http://yizhang82.me/python-interop-ctypes">Part 1 - CTypes</a></li>
 	<li><a href="http://yizhang82.me/python-interop-capi">Part 2 - writing CPython extensions using Python/C API</a></li>
 	<li>Part 3 - Deep dive into ctypes module in CPython</li>
</ul>
You can also find this post in <a href="http://yizhang82.me/python-interop-capi">http://yizhang82.me/python-interop-capi</a>

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Calling C functions from Python - part 1 - using ctypes</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/calling-c-functions-from-python-part-1-using-ctypes</link>
      <pubDate>Sat, 20 Jan 2018 17:00:40 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=185</guid>
      <description><![CDATA[Recently I’ve been evaluating Python interop technologies for a project at work and I think it’ll...]]></description>
      <content:encoded><![CDATA[Recently I’ve been evaluating Python interop technologies for a project at work and I think it’ll made an interesting blog series.

Let’s say your have following C code (add<span> </span><code class="highlighter-rouge">extern "C"</code><span> </span>if you are in C++ land) and compile it into a dynamic library (<code class="highlighter-rouge">dll</code>/<code class="highlighter-rouge">.so</code>/<code class="highlighter-rouge">.dylib</code>):
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="kt">int</span> <span class="nf">Print</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">msg</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%s"</span><span class="p">,</span> <span class="n">msg</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    
    <span class="kt">int</span> <span class="nf">Add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
    <span class="p">}</span>
    
    <span class="k">struct</span> <span class="n">Vector</span>
    <span class="p">{</span>
        <span class="kt">int</span> <span class="n">x</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">y</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">z</span><span class="p">;</span>
    <span class="p">};</span>

    <span class="k">struct</span> <span class="n">Vector</span> <span class="nf">AddVector</span><span class="p">(</span><span class="k">struct</span> <span class="n">Vector</span> <span class="n">a</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="n">b</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Vector</span> <span class="n">v</span><span class="p">;</span>
        <span class="n">v</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">a</span><span class="p">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">b</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
        <span class="n">v</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">a</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">b</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
        <span class="n">v</span><span class="p">.</span><span class="n">z</span> <span class="o">=</span> <span class="n">a</span><span class="p">.</span><span class="n">z</span> <span class="o">+</span> <span class="n">b</span><span class="p">.</span><span class="n">z</span><span class="p">;</span>
        <span class="k">return</span> <span class="n">v</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">typedef</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="p">(</span><span class="o">*</span><span class="n">pfnAddVectorCallback</span><span class="p">)(</span><span class="k">struct</span> <span class="n">Vector</span> <span class="n">a</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="n">b</span><span class="p">);</span>

    <span class="k">struct</span> <span class="n">Vector</span> <span class="nf">AddVectorCallback</span><span class="p">(</span><span class="n">pfnAddVectorCallback</span> <span class="n">callback</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="n">a</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="n">b</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">callback</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
    <span class="p">}</span>
</code></pre>
</div>
</div>
One of the ways to call C API from Python is to use<span> </span><a href="https://docs.python.org/2/library/ctypes.html">ctypes</a><span> </span>module. The tutorial in docs.python.org is fairly comprehensive and I certainly don’t intend to cover everything in the tutorial.

Instead, I’ll cover it in a exploratory style to show you how what I did to understand these API, and add some fairly interesting details of the API not quite covered by the tutorial (some of the behavior of the API are a bit obscure).

In a future post I’ll also deep dive into ctypes implementation in<span> </span><a href="https://github.com/python/cpython">CPython</a>, but for me to get to that, I need to cover the Python C API first in part 2 first, which makes the deep dive part 3. :)

Anyway, let’s get started.
<h2 id="getting-started">Getting started</h2>
First let’s import the ctypes module:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ctypes</span> <span class="kn">import</span> <span class="o">*</span>
</code></pre>
</div>
</div>
To load a module, you can use<span> </span><code class="highlighter-rouge">cdll</code>,<span> </span><code class="highlighter-rouge">windll</code>,<span> </span><code class="highlighter-rouge">oledll</code><span> </span>library loader objects.

For example, to load kernel32, you can do:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">cdll</span><span class="o">.</span><span class="n">kernel32</span>
<span class="o">&lt;</span><span class="n">CDLL</span> <span class="s">'kernel32'</span><span class="p">,</span> <span class="n">handle</span> <span class="mi">56930000</span> <span class="n">at</span> <span class="mi">508</span><span class="n">eb70</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="nb">vars</span><span class="p">(</span><span class="n">cdll</span><span class="p">)</span>
<span class="p">{</span><span class="s">'kernel32'</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">CDLL</span> <span class="s">'kernel32'</span><span class="p">,</span> <span class="n">handle</span> <span class="mi">56930000</span> <span class="n">at</span> <span class="mi">508</span><span class="n">eb70</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">'_dlltype'</span><span class="p">:</span> <span class="o">&lt;</span><span class="k">class</span> <span class="err">'</span><span class="nc">ctypes</span><span class="o">.</span><span class="n">CDLL</span><span class="s">'&gt;}</span><span class="err">
</span></code></pre>
</div>
</div>
Basically accessing its attribute would automatically load a DLL by name. This is implemented in Python by overriding<span> </span><a href="https://docs.python.org/2/reference/datamodel.html#object.__getattr__"><code class="highlighter-rouge">__getattr__</code></a><span> </span>and does a LoadLibrary. Obviously this either requires the DLL to be already loaded or searchable using various rules. Since every process effectively has kernel32.dll loaded in the process, you’ll always load kernel32 successfully.

Let’s say we built our dll as MyDll, and try to load it:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">cdll</span><span class="o">.</span><span class="n">MyDll</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
  <span class="n">File</span> <span class="s">"&lt;stdin&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">module</span><span class="o">&gt;</span>
  <span class="n">File</span> <span class="s">"C:</span><span class="err">\</span><span class="s">Python27</span><span class="err">\</span><span class="s">lib</span><span class="err">\</span><span class="s">ctypes</span><span class="err">\</span><span class="s">__init__.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">436</span><span class="p">,</span> <span class="ow">in</span> <span class="n">__getattr__</span>
    <span class="n">dll</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dlltype</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
  <span class="n">File</span> <span class="s">"C:</span><span class="err">\</span><span class="s">Python27</span><span class="err">\</span><span class="s">lib</span><span class="err">\</span><span class="s">ctypes</span><span class="err">\</span><span class="s">__init__.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">366</span><span class="p">,</span> <span class="ow">in</span> <span class="n">__init__</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">_handle</span> <span class="o">=</span> <span class="n">_dlopen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
<span class="nb">WindowsError</span><span class="p">:</span> <span class="p">[</span><span class="n">Error</span> <span class="mi">126</span><span class="p">]</span> <span class="n">The</span> <span class="n">specified</span> <span class="n">module</span> <span class="n">could</span> <span class="ow">not</span> <span class="n">be</span> <span class="n">found</span>
</code></pre>
</div>
</div>
Well, that didn’t work. This is because MyDll is not locatable in path, application directory, nor system32.

OK. Let’s try again using<span> </span><code class="highlighter-rouge">cdll.LoadLibrary</code>:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">cdll</span><span class="o">.</span><span class="n">LoadLibrary</span><span class="p">(</span><span class="s">r"D:\Projects\MyDll\Debug\mydll.dll"</span><span class="p">)</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
  <span class="n">File</span> <span class="s">"&lt;stdin&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">module</span><span class="o">&gt;</span>
  <span class="n">File</span> <span class="s">"C:</span><span class="err">\</span><span class="s">Python27</span><span class="err">\</span><span class="s">lib</span><span class="err">\</span><span class="s">ctypes</span><span class="err">\</span><span class="s">__init__.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">444</span><span class="p">,</span> <span class="ow">in</span> <span class="n">LoadLibrary</span>
    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dlltype</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
  <span class="n">File</span> <span class="s">"C:</span><span class="err">\</span><span class="s">Python27</span><span class="err">\</span><span class="s">lib</span><span class="err">\</span><span class="s">ctypes</span><span class="err">\</span><span class="s">__init__.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">366</span><span class="p">,</span> <span class="ow">in</span> <span class="n">__init__</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">_handle</span> <span class="o">=</span> <span class="n">_dlopen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
<span class="nb">WindowsError</span><span class="p">:</span> <span class="p">[</span><span class="n">Error</span> <span class="mi">193</span><span class="p">]</span> <span class="o">%</span><span class="mi">1</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">a</span> <span class="n">valid</span> <span class="n">Win32</span> <span class="n">application</span>
</code></pre>
</div>
</div>
Hmm.. That didn’t work either. Unfortunately the error didn’t provide a good description of the actual problem. The problem is that I’ve compiled my dll as a 32-bit DLL while Python.exe is 64-bit, so it doesn’t think it’s a valid (64-bit) application (win32 application is just a general term for 32-bit/64-bit windows applications, as opposed to 16-bit windows).

Recompiling the DLL as 64-bit fixed it:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">cdll</span><span class="o">.</span><span class="n">LoadLibrary</span><span class="p">(</span><span class="s">r"D:\Projects\MyDll\x64\Debug\mydll.dll"</span><span class="p">)</span>
<span class="o">&lt;</span><span class="n">CDLL</span> <span class="s">'D:</span><span class="err">\</span><span class="s">Projects</span><span class="err">\</span><span class="s">MyDll</span><span class="se">\x64</span><span class="err">\</span><span class="s">Debug</span><span class="err">\</span><span class="s">mydll.dll'</span><span class="p">,</span> <span class="n">handle</span> <span class="mi">4</span><span class="n">cae0000</span> <span class="n">at</span> <span class="mi">5064</span><span class="n">ac8</span><span class="o">&gt;</span>
</code></pre>
</div>
</div>
Interestingly, it doesn’t really show up in cdll, until you access<span> </span><code class="highlighter-rouge">cdll.mydll</code>:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="nb">vars</span><span class="p">(</span><span class="n">cdll</span><span class="p">)</span>
<span class="p">{</span><span class="s">'kernel32'</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">CDLL</span> <span class="s">'kernel32'</span><span class="p">,</span> <span class="n">handle</span> <span class="mi">56930000</span> <span class="n">at</span> <span class="mi">508</span><span class="n">eb70</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">'_dlltype'</span><span class="p">:</span> <span class="o">&lt;</span><span class="k">class</span> <span class="err">'</span><span class="nc">ctypes</span><span class="o">.</span><span class="n">CDLL</span><span class="s">'&gt;}</span><span class="err">
</span><span class="s">&gt;&gt;&gt; cdll.mydll</span><span class="err">
</span><span class="s">&lt;CDLL '</span><span class="n">mydll</span><span class="s">', handle 4cae0000 at 509d5f8&gt;</span><span class="err">
</span></code></pre>
</div>
</div>
This is because<span> </span><code class="highlighter-rouge">cdll.LoadLibrary</code><span> </span>only returns a new instance of<span> </span><code class="highlighter-rouge">CDLL</code><span> </span>object. Because garbage collector didn’t kick in yet, the DLL is still loaded in this process, and therefore accessing cdll.mydll would “just work”. However, do note that these two mydlls are separate Python objects (<code class="highlighter-rouge">5064ac8</code><span> </span>vs<span> </span><code class="highlighter-rouge">509d5f8</code>), but pointing to the same library (<code class="highlighter-rouge">56930000</code>).

However, the best way is to keep the instance in a variable - there is no point loading this library twice (there is no harm though as DLL has a ref-count maintained by the OS and you wouldn’t load two copies - there is just one as long as it is the same one).
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">mydll</span> <span class="o">=</span> <span class="n">cdll</span><span class="o">.</span><span class="n">LoadLibrary</span><span class="p">(</span><span class="s">r"D:\Projects\MyDll\x64\Debug\mydll.dll"</span><span class="p">)</span>
</code></pre>
</div>
</div>
<h2 id="calling-the-function">Calling the function</h2>
Let’s try calling<span> </span><code class="highlighter-rouge">Print</code><span> </span>- just call it as a magic attribute:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="nb">vars</span><span class="p">(</span><span class="n">mydll</span><span class="p">)</span>
<span class="p">{</span><span class="s">'_FuncPtr'</span><span class="p">:</span> <span class="o">&lt;</span><span class="k">class</span> <span class="err">'</span><span class="nc">ctypes</span><span class="o">.</span><span class="n">_FuncPtr</span><span class="s">'&gt;, '</span><span class="n">_handle</span><span class="s">': 140734480777216L, '</span><span class="n">_name</span><span class="s">': '</span><span class="n">D</span><span class="p">:</span>\\<span class="n">Projects</span>\\<span class="n">MyDll</span>\\<span class="n">x64</span>\\<span class="n">Debug</span>\\<span class="n">mydll</span><span class="o">.</span><span class="n">dll</span><span class="s">'}</span><span class="err">

</span><span class="s">&gt;&gt;&gt; ret = mydll.Print("abc</span><span class="se">\n</span><span class="s">")</span><span class="err">
</span><span class="s">abc</span><span class="err">

</span><span class="s">&gt;&gt;&gt; print vars(mydll)</span><span class="err">
</span><span class="s">{'</span><span class="n">Print</span><span class="s">': &lt;_FuncPtr object at 0x0000000005501528&gt;, '</span><span class="n">_FuncPtr</span><span class="s">': &lt;class '</span><span class="n">ctypes</span><span class="o">.</span><span class="n">_FuncPtr</span><span class="s">'&gt;, '</span><span class="n">_handle</span><span class="s">': 140734480777216L, '</span><span class="n">_name</span><span class="s">': '</span><span class="n">D</span><span class="p">:</span>\\<span class="n">Projects</span>\\<span class="n">MyDll</span>\\<span class="n">x64</span>\\<span class="n">Debug</span>\\<span class="n">mydll</span><span class="o">.</span><span class="n">dll</span><span class="s">'}</span><span class="err">
</span></code></pre>
</div>
</div>
Note that calling mydll.Print magically inserts a new attribute on the mydll object. Again, this is achieved through<span> </span><a href="https://docs.python.org/2/reference/datamodel.html#object.__getattr__"><code class="highlighter-rouge">__getattr__</code></a>

So how does ctypes call Print internally? A few things happens:
<ul>
 	<li>ctypes does a GetProcAddress (or<span> </span><code class="highlighter-rouge">dlsym</code>) on<span> </span><code class="highlighter-rouge">Print</code><span> </span>to get the internal address</li>
 	<li>ctypes automatically recognize that you are passing a “abc”, and converts it to a char *</li>
 	<li>ctypes uses<span> </span><a href="https://sourceware.org/libffi/">FFI</a><span> </span>to make the call, using<span> </span><code class="highlighter-rouge">cdecl</code><span> </span>calling convention. CDll by default uses cdecl.</li>
</ul>
Now let’s try doing an<span> </span><code class="highlighter-rouge">Add</code>:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">mydll</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="mi">3</span>
</code></pre>
</div>
</div>
There is a bit ctypes magic at play: by default ctypes assumes every function returns a int, so this works out fairly well. If you want a different return type, you can change it by assigning a type to<span> </span><code class="highlighter-rouge">restype</code><span> </span>attribute. In this case, what we need is ctypes.c_char, which is the 1-byte char type in C.
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">mydll</span><span class="o">.</span><span class="n">Add</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">c_char</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">mydll</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="mi">97</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>  <span class="c"># this can be dangerous!</span>
<span class="s">'b'</span>
</code></pre>
</div>
</div>
Now Add would interpret the returned int automatically as a char. Note that this can be dangerous as the size of int and char aren’t exactly the same. However, in most platforms / calling conventions, return value are returned via a register (EAX/RAX in intel platforms), so this simply involves a truncation and work out fine. But again, you don’t want to make such assumptions. So this is just for illustration purpose only.

Besides CDLL, there is also<span> </span><code class="highlighter-rouge">windll</code><span> </span>and<span> </span><code class="highlighter-rouge">oledll</code>.<span> </span><code class="highlighter-rouge">windll</code><span> </span>by default treat the function as stdcall, and<span> </span><code class="highlighter-rouge">oledll</code><span> </span>would treat it as a COM function, which means accessing the function by an vtable offset, with stdcall, and returning HRESULT.
<h2 id="define-your-own-struct">Define your own struct</h2>
Let’s take a look at how to define your own struct. You can do that by deriving from<span> </span><code class="highlighter-rouge">ctypes.Structure</code><span> </span>type, and supply a set of fields through the magic<span> </span><code class="highlighter-rouge">_fields_</code><span> </span>attribute:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">class</span> <span class="nc">VECTOR</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span>
<span class="o">...</span>     <span class="n">_fields_</span> <span class="o">=</span> <span class="p">[(</span><span class="s">"x"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"y"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">),</span> <span class="p">(</span><span class="s">"z"</span><span class="p">,</span> <span class="n">c_int</span><span class="p">)]</span>
<span class="o">...</span>
</code></pre>
</div>
</div>
If you print out the individual fields in the<span> </span><code class="highlighter-rouge">VECTOR</code><span> </span>type, you’ll see magic attributes showing up:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">VECTOR</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">VECTOR</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">VECTOR</span><span class="o">.</span><span class="n">z</span>
<span class="o">&lt;</span><span class="n">Field</span> <span class="nb">type</span><span class="o">=</span><span class="n">c_long</span><span class="p">,</span> <span class="n">ofs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">4</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="n">Field</span> <span class="nb">type</span><span class="o">=</span><span class="n">c_long</span><span class="p">,</span> <span class="n">ofs</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">4</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="n">Field</span> <span class="nb">type</span><span class="o">=</span><span class="n">c_long</span><span class="p">,</span> <span class="n">ofs</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">4</span><span class="o">&gt;</span>
</code></pre>
</div>
</div>
Note that the individual fields are nicely laid out sequentially (ofs=0, 4, 8), just what you would expect from a good old C struct.

Now we can create new instances of VECTOR and return back VECTOR:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">vector_a</span> <span class="o">=</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">vector_b</span> <span class="o">=</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">mydll</span><span class="o">.</span><span class="n">AddVector</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">VECTOR</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">vector_c</span> <span class="o">=</span> <span class="n">mydll</span><span class="o">.</span><span class="n">AddVector</span><span class="p">(</span><span class="n">vector_a</span><span class="p">,</span> <span class="n">vector_b</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">vector_c</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">vector_c</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">vector_c</span><span class="o">.</span><span class="n">z</span>
<span class="mi">3</span> <span class="mi">5</span> <span class="mi">7</span>
</code></pre>
</div>
</div>
<h2 id="calling-python-code-from-c-and-some-surpises">Calling python code from C and some surpises</h2>
Let’s make this a bit more interesting. Let’s try to call AddVectorCallback while passinging a python function. To do this you need to make a callback function type first:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">ADDVECTORCALLBACK</span> <span class="o">=</span> <span class="n">CFUNCTYPE</span><span class="p">(</span><span class="n">VECTOR</span><span class="p">,</span> <span class="n">VECTOR</span><span class="p">,</span> <span class="n">VECTOR</span><span class="p">)</span>
</code></pre>
</div>
</div>
With this type we can then define a Python function that does the add:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">def</span> <span class="nf">AddVectorImpl</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="o">...</span>     <span class="k">return</span> <span class="n">VECTOR</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">z</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">z</span><span class="p">)</span>
<span class="o">...</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">mydll</span><span class="o">.</span><span class="n">AddVectorCallback</span><span class="p">(</span><span class="n">ADDVECTORCALLBACK</span><span class="p">(</span><span class="n">AddVectorImpl</span><span class="p">),</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
  <span class="n">File</span> <span class="s">"&lt;stdin&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">module</span><span class="o">&gt;</span>
<span class="nb">TypeError</span><span class="p">:</span> <span class="n">invalid</span> <span class="n">result</span> <span class="nb">type</span> <span class="k">for</span> <span class="n">callback</span> <span class="n">function</span>
</code></pre>
</div>
</div>
Unfortunately, this doesn’t work. Only simple data types like c_int are supported. Complex data types like struct/union are not, because they didn’t provide a setfunc. We’ll cover more of these details in a future deepdive ctypes post.
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>        <span class="n">StgDictObject</span> <span class="o">*</span><span class="n">dict</span> <span class="o">=</span> <span class="n">PyType_stgdict</span><span class="p">(</span><span class="n">restype</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">dict</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="o">||</span> <span class="n">dict</span><span class="o">-&gt;</span><span class="n">setfunc</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
          <span class="n">PyErr_SetString</span><span class="p">(</span><span class="n">PyExc_TypeError</span><span class="p">,</span>
                          <span class="s">"invalid result type for callback function"</span><span class="p">);</span>
          <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
        <span class="p">}</span>
</code></pre>
</div>
</div>
The workaround is to pass in a pointer instead:
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="k">typedef</span> <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">pfnAddVectorCallback</span><span class="p">)(</span><span class="k">struct</span> <span class="n">Vector</span> <span class="n">a</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="n">b</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="o">*</span><span class="n">c</span><span class="p">);</span>

    <span class="k">struct</span> <span class="n">Vector</span> <span class="nf">AddVectorCallback</span><span class="p">(</span><span class="n">pfnAddVectorCallback</span> <span class="n">callback</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="n">a</span><span class="p">,</span> <span class="k">struct</span> <span class="n">Vector</span> <span class="n">b</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Vector</span> <span class="n">c</span><span class="p">;</span>
        <span class="n">callback</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">c</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">c</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre>
</div>
</div>
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">ADDVECTORCALLBACK</span> <span class="o">=</span> <span class="n">CFUNCTYPE</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">VECTOR</span><span class="p">,</span> <span class="n">VECTOR</span><span class="p">,</span> <span class="n">POINTER</span><span class="p">(</span><span class="n">VECTOR</span><span class="p">))</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">def</span> <span class="nf">AddVectorImpl</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
<span class="o">...</span>     <span class="n">c</span><span class="o">.</span><span class="n">contents</span> <span class="o">=</span> <span class="n">VECTOR</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">z</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">z</span><span class="p">)</span>
</code></pre>
</div>
</div>
And let’s see if it works:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">vector</span> <span class="o">=</span> <span class="n">mydll</span><span class="o">.</span><span class="n">AddVectorCallback</span><span class="p">(</span><span class="n">ADDVECTORCALLBACK</span><span class="p">(</span><span class="n">AddVectorImpl</span><span class="p">),</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">))</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">vector</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">vector</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">vector</span><span class="o">.</span><span class="n">z</span>
<span class="o">-</span><span class="mi">858993460</span> <span class="o">-</span><span class="mi">858993460</span> <span class="o">-</span><span class="mi">858993460</span>
</code></pre>
</div>
</div>
OK. So nope. Appears that setting<span> </span><code class="highlighter-rouge">contents</code><span> </span>doesn’t do what we want. Reading the code - it actually simply swap the internal pointers of the pointer object and doesn’t do any assignment!
<div class="language-c highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>    <span class="o">*</span><span class="p">(</span><span class="kt">void</span> <span class="o">**</span><span class="p">)</span><span class="n">self</span><span class="o">-&gt;</span><span class="n">b_ptr</span> <span class="o">=</span> <span class="n">dst</span><span class="o">-&gt;</span><span class="n">b_ptr</span><span class="p">;</span>
</code></pre>
</div>
</div>
The correct way is to assign it on the VECTOR object returned from<span> </span><code class="highlighter-rouge">contents</code><span> </span>attribute directly:
<div class="language-py highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">def</span> <span class="nf">AddVectorImpl</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
<span class="o">...</span>     <span class="n">c</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">x</span>
<span class="o">...</span>     <span class="n">c</span><span class="o">.</span><span class="n">contexts</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">y</span>
<span class="o">...</span>     <span class="n">c</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">z</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">z</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">z</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">vector</span> <span class="o">=</span> <span class="n">mydll</span><span class="o">.</span><span class="n">AddVectorCallback</span><span class="p">(</span><span class="n">ADDVECTORCALLBACK</span><span class="p">(</span><span class="n">AddVectorImpl</span><span class="p">),</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="n">VECTOR</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">))</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">vector</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">vector</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">vector</span><span class="o">.</span><span class="n">z</span>
<span class="mi">3</span> <span class="mi">5</span> <span class="mi">7</span>
</code></pre>
</div>
</div>
The reason this works is that the VECTOR object internal b_str pointer points directly to the Vector struct pointed by Vector*, so changing this VECTOR object changes the output Vector struct.
<h2 id="whats-next">What’s next</h2>
As previously mentioned, I’ll cover Python C API in the next post and dive into ctypes implementation in CPython (which are written using python C API).

I’ll update them with links once they become available:
<ul>
 	<li><a href="http://yizhang82.me/python-interop-ctypes">Part 1 - CTypes</a></li>
 	<li><a href="http://yizhang82.me/python-interop-capi">Part 2 - writing CPython extensions using Python/C API</a></li>
 	<li>Part 3 - Deep dive into ctypes module in CPython</li>
</ul>
You can also find this post in <a href="http://yizhang82.me/python-interop-ctypes">http://yizhang82.me/python-interop-ctypes</a>]]></content:encoded>
    </item>
    <item>
      <title>Calling node.js sqlite callback function using promise and await</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/calling-node-js-sqlite-callback-function-using-promise-and-await</link>
      <pubDate>Wed, 17 Jan 2018 05:33:41 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=165</guid>
      <description><![CDATA[Callback pain
I was experimenting with sqlite package with node.js the other day and the async...]]></description>
      <content:encoded><![CDATA[<h2 id="callback-pain">Callback pain</h2>
I was experimenting with<span> </span><a href="https://github.com/mapbox/node-sqlite3">sqlite package</a><span> </span>with node.js the other day and the async programming style is rather painful, so I did some experiment to wrap it with promise + async/await to make it easier to use. This post shows you how to do that.

For example, let’s say I’m working with a database with a<span> </span><code class="highlighter-rouge">Voters</code><span> </span>table that has two fields -<span> </span><code class="highlighter-rouge">Name</code><span> </span>and<span> </span><code class="highlighter-rouge">Count</code>.
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kd">var</span> <span class="nx">sqlite</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'sqlite3'</span><span class="p">).</span><span class="nx">verbose</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">db</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">sqlite</span><span class="p">.</span><span class="nx">Database</span><span class="p">(</span><span class="s1">'test_db'</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'sqlite3...'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">stmt</span> <span class="o">=</span> <span class="s2">"CREATE TABLE IF NOT EXISTS Voters (Name TEXT, Count int)"</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stmt</span><span class="p">);</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">stmt</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">err</span><span class="p">));</span>                        
        <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="nx">vote</span><span class="p">(</span><span class="s2">"john doe"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">err</span><span class="p">));</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">`New vote for John Doe is </span><span class="p">${</span><span class="nx">val</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
    <span class="p">});</span>
<span class="p">});</span>
</code></pre>
</div>
</div>
And I need to write a function that increase the vote count by 1 or add a new voter entry for a specific voter:
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kd">function</span> <span class="nx">vote</span><span class="p">(</span><span class="nx">voter</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">val</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">getStmt</span> <span class="o">=</span> <span class="s2">`SELECT Name, Count FROM Voters WHERE Name="</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">"`</span><span class="p">;</span>
    <span class="nx">db</span><span class="p">.</span><span class="kd">get</span><span class="p">(</span><span class="nx">getStmt</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">row</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">row</span><span class="p">)</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">insertSql</span> <span class="o">=</span> <span class="s2">`INSERT INTO Voters (Name, Count) VALUES ("</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">", 1)`</span><span class="p">;</span>
            <span class="nx">db</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">insertSql</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">val</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span>    
            <span class="p">});</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="p">{</span>
            <span class="nx">val</span> <span class="o">=</span> <span class="nx">row</span><span class="p">[</span><span class="s2">"Count"</span><span class="p">];</span>
            <span class="nx">val</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="kd">var</span> <span class="nx">updateSql</span> <span class="o">=</span> <span class="s2">`UPDATE Voters SET Count = </span><span class="p">${</span><span class="nx">val</span><span class="p">}</span><span class="s2"> WHERE Name = "</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">"`</span><span class="p">;</span>
            <span class="nx">db</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">updateSql</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span>
            <span class="p">});</span>
        <span class="p">}</span>
    <span class="p">});</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
As you can see, the async callback style gets pretty painful here. You need to pass a callback to every function that returns an error or result, and within that callback you need to nest your remaining logic, and on and on. Writing a custom function<span> </span><code class="highlighter-rouge">vote</code><span> </span>also need to pass a callback and call when the final callback is done. The code is difficult to read and maintain.
<h2 id="the-promise-land">The promise land</h2>
In ES6, you can wrap callback based functions with Promise, which are essentially a return value with state (pending, resolved, rejected). If a function returns a Promise, it’s the function’s job to either resolve or reject it eventually, so that the caller knows when it’s done - either successfully or unsuccessfully.

It’s best to demonstrate this with an example:
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="nx">db</span><span class="p">.</span><span class="nx">getAsync</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">sql</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">that</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">that</span><span class="p">.</span><span class="kd">get</span><span class="p">(</span><span class="nx">sql</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">row</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span>
                <span class="nx">reject</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
            <span class="k">else</span>
                <span class="nx">resolve</span><span class="p">(</span><span class="nx">row</span><span class="p">);</span>
        <span class="p">});</span>
    <span class="p">});</span>
<span class="p">};</span>
</code></pre>
</div>
</div>
In this function, we are wrapping sqlite<span> </span><code class="highlighter-rouge">get</code><span> </span>method and make it returns a promise. When do we know the promise is going to be fullfilled? When the callback arrives. If it fails, call reject and pass the error. If it succeeded, pass the result.

Once you have getAsync, you can now call the function like this:
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="nx">db</span><span class="p">.</span><span class="nx">getAsync</span><span class="p">(</span><span class="nx">stmt</span><span class="p">).</span><span class="nx">then</span><span class="p">((</span><span class="nx">row</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="c1">// print row</span>
<span class="p">}).</span><span class="k">catch</span><span class="p">((</span><span class="nx">err</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="c1">// handle error</span>
<span class="p">});</span>    
</code></pre>
</div>
</div>
With the returned promise, you need to chain the promise with the next work using<span> </span><code class="highlighter-rouge">then</code>, and handle the unhandled error with<span> </span><code class="highlighter-rouge">catch</code>. The way to think about the<span> </span><code class="highlighter-rouge">then</code><span> </span>function is to treat them as a list of work - the next work inside the<span> </span><code class="highlighter-rouge">then</code><span> </span>callback will only get executed when the previous promise gets fullfilled. If it succeeded, then will get called next, otherwise<span> </span><code class="highlighter-rouge">catch</code><span> </span>is called with the error. If your<span> </span><code class="highlighter-rouge">then</code><span> </span>callback wants to do more work, it needs to return another promise that you can chain further using then.

With this, our vote code would look like this:
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kd">function</span> <span class="nx">voteAsync</span><span class="p">(</span><span class="nx">voter</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">val</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">getStmt</span> <span class="o">=</span> <span class="s2">`SELECT Name, Count FROM Voters WHERE Name="</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">"`</span><span class="p">;</span>
    <span class="k">return</span> <span class="nx">db</span><span class="p">.</span><span class="nx">getAsync</span><span class="p">(</span><span class="nx">getStmt</span><span class="p">).</span><span class="nx">then</span><span class="p">((</span><span class="nx">row</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">row</span><span class="p">)</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">insertSql</span> <span class="o">=</span> <span class="s2">`INSERT INTO Voters (Name, Count) VALUES ("</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">", 1)`</span><span class="p">;</span>
            <span class="nx">val</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="k">return</span> <span class="nx">db</span><span class="p">.</span><span class="nx">runAsync</span><span class="p">(</span><span class="nx">insertSql</span><span class="p">);</span>  <span class="c1">// more work to do</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="p">{</span>
            <span class="nx">val</span> <span class="o">=</span> <span class="nx">row</span><span class="p">[</span><span class="s2">"Count"</span><span class="p">];</span>
            <span class="nx">val</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="kd">var</span> <span class="nx">updateSql</span> <span class="o">=</span> <span class="s2">`UPDATE Voters SET Count = </span><span class="p">${</span><span class="nx">val</span><span class="p">}</span><span class="s2"> WHERE Name = "</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">"`</span><span class="p">;</span>
            <span class="k">return</span> <span class="nx">db</span><span class="p">.</span><span class="nx">runAsync</span><span class="p">(</span><span class="nx">updateSql</span><span class="p">);</span>  <span class="c1">// more work to do</span>
        <span class="p">}</span>
    <span class="p">}).</span><span class="nx">then</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="k">return</span> <span class="nx">val</span><span class="p">;</span>     <span class="c1">// when runAsync is done</span>
    <span class="p">});</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
Note how voteAsync chains multiple promise together by returning another promise (from<span> </span><code class="highlighter-rouge">runAsync</code>) and then applying<span> </span><code class="highlighter-rouge">then</code><span> </span>on top of that promise.

To call the code, it looks like this:
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kd">var</span> <span class="nx">stmt</span> <span class="o">=</span> <span class="s2">"CREATE TABLE IF NOT EXISTS Voters (Name TEXT, Count int)"</span><span class="p">;</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">runAsync</span><span class="p">(</span><span class="nx">stmt</span><span class="p">).</span><span class="nx">then</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="k">return</span> <span class="nx">voteAsync</span><span class="p">(</span><span class="s2">"john doe"</span><span class="p">);</span>
<span class="p">}).</span><span class="nx">then</span><span class="p">((</span><span class="nx">val</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">`New vote for John Doe is </span><span class="p">${</span><span class="nx">val</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">}).</span><span class="k">catch</span><span class="p">((</span><span class="nx">err</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">err</span><span class="p">));</span>
<span class="p">});</span>    
</code></pre>
</div>
</div>
This is an improvement, but still not quite as natural as you need to explicitly chain then using promise functions and follow those pattern.
<h2 id="asyncaawait">Async/Aawait</h2>
Fortunately, there are better ways to do this. With async/await support in node.js, you can write these async code just like how you would write regular synchronous code. That is, all javascript statements are<span> </span><em>serialized</em>. The async/await infrastructure makes sure your code is split into multiple “phases” just like how you would write it in an promise<span> </span><code class="highlighter-rouge">then</code><span> </span>pattern, except that compiler does all the job for you. And all you need to do is to write this:
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nx">voteAsync</span><span class="p">(</span><span class="nx">voter</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">val</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">getStmt</span> <span class="o">=</span> <span class="s2">`SELECT Name, Count FROM Voters WHERE Name="</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">"`</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">row</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">db</span><span class="p">.</span><span class="nx">getAsync</span><span class="p">(</span><span class="nx">getStmt</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">row</span><span class="p">)</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">insertSql</span> <span class="o">=</span> <span class="s2">`INSERT INTO Voters (Name, Count) VALUES ("</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">", 1)`</span><span class="p">;</span>
        <span class="kr">await</span> <span class="nx">db</span><span class="p">.</span><span class="nx">runAsync</span><span class="p">(</span><span class="nx">insertSql</span><span class="p">);</span>
        <span class="nx">val</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="p">{</span>
        <span class="nx">val</span> <span class="o">=</span> <span class="nx">row</span><span class="p">[</span><span class="s2">"Count"</span><span class="p">];</span>
        <span class="nx">val</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="kd">var</span> <span class="nx">updateSql</span> <span class="o">=</span> <span class="s2">`UPDATE Voters SET Count = </span><span class="p">${</span><span class="nx">val</span><span class="p">}</span><span class="s2"> WHERE Name = "</span><span class="p">${</span><span class="nx">voter</span><span class="p">}</span><span class="s2">"`</span><span class="p">;</span>
        <span class="kr">await</span> <span class="nx">db</span><span class="p">.</span><span class="nx">runAsync</span><span class="p">(</span><span class="nx">updateSql</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">val</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
The code isn’t significantly smaller, but the logic is much simplified. You don’t need to think in terms of promise chaining - you just write the code without worrying about the underlying “async-ness” of those calls. You do need to call<span> </span><code class="highlighter-rouge">await</code><span> </span>operator on functions that returns promise, and the compiler automatically
<ul>
 	<li>suspends the execution when the promise is in-progress but not done. This is very important as you don’t want to block node.js main event loop.</li>
 	<li>resumes execution when the promise resolves</li>
 	<li>throw exception when promise rejects.</li>
</ul>
The function also needs to have<span> </span><code class="highlighter-rouge">async</code><span> </span>keyword to indicate it is a async function. Without it compiler will refuse to understand await keyword.

To call the async version, just call the function like a normal person (with await, of course):
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">try</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">stmt</span> <span class="o">=</span> <span class="s2">"CREATE TABLE IF NOT EXISTS Voters (Name TEXT, Count int)"</span><span class="p">;</span>
        <span class="kr">await</span> <span class="nx">db</span><span class="p">.</span><span class="nx">runAsync</span><span class="p">(</span><span class="nx">stmt</span><span class="p">);</span>
        <span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">voteAsync</span><span class="p">(</span><span class="s2">"john doe"</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">`New vote for John Doe is </span><span class="p">${</span><span class="nx">val</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
    <span class="p">}</span> 
    <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">ex</span><span class="p">));</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
Again, this is slightly more code due to the try/catch and function goo (javascript doesn’t let you call await without an async function), but the concepts are significantly simpler to understand and code much easier to write.
<h2 id="conclusion">Conclusion</h2>
Javascript promise and async/await is reasonably straight-forward abstraction for async programming once you get used to the model. Wrapping an “classic” callback model API with promise then calling it with async/await greatly simplifies your client code.

For your reference, I’m put 3 versions of javascript code that runs (provided that you created a npm and added sqlite package):
<ol>
 	<li><a href="https://gist.github.com/yizhang82/e0cf283340860710cdc7ed54131d200a">Callback version</a></li>
 	<li><a href="https://gist.github.com/yizhang82/2ab802f1439490984eb998af3d96b16b">Promise version</a></li>
 	<li><a href="https://gist.github.com/yizhang82/26101c92faeea19568e48224b09e2d1c">Await version</a></li>
</ol>
BTW, in the upcoming C++ coroutine series, I’ll be talking about how to wrap C async API with C++ coroutines, which are much more involved but would greatly help understand async/await model in a much deeper level.

Hope this helps.

You can also find this post in <a href="http://yizhang82.me/async-sqlite-as-promise">http://yizhang82.me/async-sqlite-as-promise</a>.

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>C++ coroutine tutorial</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/c-coroutine-tutorial</link>
      <pubDate>Sat, 28 Oct 2017 07:32:25 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=157</guid>
      <description><![CDATA[I’ve been experimenting with coroutines recently and I found that information on C++ coroutines are...]]></description>
      <content:encoded><![CDATA[I’ve been experimenting with coroutines recently and I found that information on C++ coroutines are very difficult to find. I’m planning to write a series of C++ coroutine blogs on how to use C++ coroutines, how they work, and how to write your own library that uses C++ coroutines. My last post Basic Concepts are probably a bit too high-level and is not really meant for people who are new to C++ coroutines. So I’m going to start over with a simple C++ coroutine tutorial instead.

&nbsp;
<h2 id="enough-talking-show-me-the-code">Enough talking. Show me the code</h2>
OK. I’m not going to bore you with the technical details (any more), and let’s jump straight into some sample code!
<div class="language-c++ highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">async_fib</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">2</span><span class="p">)</span>
        <span class="n">co_return</span> <span class="mi">1</span><span class="p">;</span>

    <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>

    <span class="c1">// iterate computing fib(n)
</span>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="n">co_await</span> <span class="n">async_add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
        <span class="n">a</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span>
        <span class="n">b</span> <span class="o">=</span> <span class="n">c</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">co_return</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
As you can see, this code simply calculates fibonacci, and it’s not a very good one either (again, coroutine != performance). But it’s a good one to show some basic concepts:
<ul>
 	<li>A C++ coroutine (such as async_fib) returns a coroutine type.</li>
</ul>
In this case, we are returning<span> </span><a href="http://en.cppreference.com/w/cpp/thread/future"><code class="highlighter-rouge">std::future&lt;T&gt;</code></a>. This is a standard C++ library type. Unfortunately the default implementation in most compilers don’t support using future<span> </span>as a coroutine type. VC++ has its own extension that adds coroutine support to std::future. For the purpose of showing what coroutine is, we are going to assume `std::future` has that support. To run this code, you'll need VC++.

So what is a coroutine type anyway? It is a type that is aware of coroutines and implements a bunch of contracts required by C++ compilers. Most these contracts are (synchronous) callback that compiler will call when it’s about to suspend, to resume, to retrieve return value, to record exception, etc. Again, we’ll talk about details in future posts.
<ul>
 	<li>C++ coroutines uses<span> </span><code class="highlighter-rouge">co_await</code><span> </span>/<span> </span><code class="highlighter-rouge">co_return</code><span> </span>operators</li>
</ul>
co_await operator means “fire this async operation, suspend my code (if necessary), and resume execution with the return value”. So in this case, when calling co_await async_add(a, b), it’ll let the “expensive” add operation happen in another thread, suspend the execution, and resume the c = asignment with return value, and proceed with next execution. The async operation itself needs to return a awaitable expression. But for now, let’s simplify this to say it has to return a coroutine type. Not quite correct, but for the purpose of this tutorial, this is good enough at the moment.

co_return operator simply returns a return value to the coroutine, just like any other function. Note that for coroutines, you typically return the value type T in the coroutine type. In this case, the function signature returns<span> </span><code class="highlighter-rouge">future&lt;int&gt;</code>, so you need to return int.<span> </span><code class="highlighter-rouge">std::future&lt;int&gt;</code>here means : I promise I’ll give you a int value in the future when I’m done.
<h2 id="i-get-it-now-but-how-do-i-implement-an-async-operation-that-returns-a-coroutine-type">I get it now, but how do I implement an async operation that returns a coroutine type?</h2>
async_add is a good example:
<div class="language-c++ highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">async_add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">auto</span> <span class="n">fut</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">async</span><span class="p">([</span><span class="o">=</span><span class="p">]()</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
        <span class="k">return</span> <span class="n">c</span><span class="p">;</span>
    <span class="p">});</span>

    <span class="k">return</span> <span class="n">fut</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
</div>
<ul>
 	<li>async_add returns a<span> </span><code class="highlighter-rouge">future&lt;int&gt;</code><span> </span>type (note that this is different than earlier - it actually returns the<span> </span><em>correct</em><span> </span>type!)</li>
</ul>
This is effectively saying: I’m returning an object back to you, promising that I’ll give you an int when I’m done. That’s exactly what co_await operator needs.
<ul>
 	<li>The real operation is done inside std::async, which conveniently returns a future, that’ll resolve/complete when the async operation is finished. The async operation is running in another thread.</li>
</ul>
<h2 id="how-do-i-run-this-thing">How do I run this thing?</h2>
I’m testing this on VC++ on VS 2017 for now. In order to compile the code, you need to pass<span> </span><code class="highlighter-rouge">/await</code><span> </span>as a compiler switch:

<img src="http://yizhang82.me/assets/images/coroutine-await-option.PNG" alt="Adding /Await Option" />

For your convenience, I’ve shared the entire cpp file<span> </span><a href="https://gist.github.com/yizhang82/28842f7dbae34b59fcd7b4d74b4a19d4#file-coroutine-simple-cpp">here</a>

If you want to use clang, you need to do a bit more work because most importantly<span> </span><code class="highlighter-rouge">future&lt;T&gt;</code>isn’t a coroutine type there. I’ll have another post talk about how to run it in clang5.
<h2 id="whats-next">What’s next</h2>
OK. I’m going to stop here for now. A few things I’d planning to cover in the future (no pun intended):
<ul>
 	<li>How to augment<span> </span><code class="highlighter-rouge">std::future&lt;T&gt;</code><span> </span>to be a coroutine type, and running coroutines in clang 5</li>
 	<li>What’s an awaitable, and how to wrap your own async functions using your own awaitable</li>
 	<li>How to write your own version of<span> </span><code class="highlighter-rouge">future&lt;T&gt;</code><span> </span>- let’s call it<span> </span><code class="highlighter-rouge">task&lt;T&gt;</code></li>
 	<li>Gory details - what does compiler codegen looks like, how suspension/resume works, some additional subtle issues to consider</li>
</ul>
Hope this helps.

You can also find this post in <a href="http://yizhang82.me/cpp-coroutines-async-fibonacci">http://yizhang82.me/cpp-coroutines-async-fibonacci</a>

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Writing your own lock-free reader/writer lock</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/writing-your-own-lock-free-readerwriter-lock</link>
      <pubDate>Sat, 07 Oct 2017 20:52:58 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=155</guid>
      <description><![CDATA[It is sort of puzzling for me why C++ standard doesn't have a implementation of reader/writer...]]></description>
      <content:encoded><![CDATA[<div>
<div><span><span>It is sort of puzzling for me why C++ standard doesn't have a implementation of reader/writer lock. So just like every other C++ developer, I've decided to roll my own. </span></span></div>
<div>
<div>
<div></div>
<div><span>A typical implementation might be using semaphore / mutex</span><span>. However, this has a major disadvantage that it requires entering a lock mutex every time a reader comes in, and this can be expensive as this usually leads to a kernel transition that are costly and can become a bottle neck when multiple readers are trying to access. A lock-free implementation avoids these overhead/bottleneck and allows for better throughput.  </span></div>
<div></div>
</div>
</div>
</div>
<span>I've moved my blog over to yizhang82.me. You can find the full post here: </span><a href="http://yizhang82.me/lock-free-rw-lock">http://yizhang82.me/lock-free-rw-lock</a>]]></content:encoded>
    </item>
    <item>
      <title>Sharing .NET generic code under the hood</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/sharing-net-generic-code-under-the-hood</link>
      <pubDate>Sat, 01 Apr 2017 18:26:07 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=145</guid>
      <description><![CDATA[If you come from a C++ programming background, you are most likely already familiar with C++’s...]]></description>
      <content:encoded><![CDATA[If you come from a C++ programming background, you are most likely already familiar with C++’s template code bloat problem. Each template instantiation gets its own copy of the code (of course, compiler/linker can optimize by throwing away unused methods). The reason being that C++ template are more like C macro on steriods. I know this is a great simplification, but at the end of the day, it is pretty much a code expansion feature with type safety. This grants C++ some powerful capabilities that C# developers don’t have - like template specialization, or calling arbitary methods on a template class, or a whole different programming paradigm that’s known as template meta-programming. On the other hand, .NET generics require you to define what operations can be perform on T using constraints (otherwise you are limited to a small set of operations such as casts, assignments, etc). However, this does give .NET a unique advantage - it can do a better job at code sharing.

I've moved my blog over to yizhang82.me. You can find the full post here: <a href="http://yizhang82.me/dotnet-generics-sharing">http://yizhang82.me/dotnet-generics-sharing</a>]]></content:encoded>
    </item>
    <item>
      <title>C# value type boxing under the hood</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/c-value-type-boxing-under-the-hood</link>
      <pubDate>Sun, 19 Mar 2017 07:42:25 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=126</guid>
      <description><![CDATA[I recently had some really interesting discussion with a .NET typesystem expert in the team, and...]]></description>
      <content:encoded><![CDATA[I recently had some really interesting discussion with a .NET typesystem expert in the team, and during the conversation he had pointed out an interesting aspect of .NET value type boxing when using constraints. Intrigued by that discussion, I decided to take a further look.

See the <a href="http://yizhang82.me/value-type-boxing">full article here </a>in my new blog yizhang82.me

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Moving my blog to GitHub pages - http://yizhang82.me</title>
      <link>https://docs.microsoft.com/archive/blogs/yizhang/moving-my-blog-to-github-pages-httpyizhang82-me</link>
      <pubDate>Sun, 12 Mar 2017 06:34:39 GMT</pubDate>
      <dc:creator><![CDATA[Yi Zhang - CLR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yizhang/?p=125</guid>
      <description><![CDATA[I haven't posted in a good while - it's because I've been busy working on .NET native! Now that...]]></description>
      <content:encoded><![CDATA[I haven't posted in a good while - it's because I've been busy working on .NET native! Now that things has settled down for a bit, I've decided to resume writing posts. After spending some time thinking, I've decided that I prefer writing my blog posts in plain text/markdown and working on Git repos, rather than wordpress (which MSDN blog has migrated to). Case in point, I have to write this post twice because I've lost the first draft when I'm working on the web editor after I hit publish! Anyway, the new blog is <a href="http://yizhang82.me">http://yizhang82.me</a> where I'll keep writing about .NET / CLR, COM / WinRT, and many other things I've been looking into. See you there!]]></content:encoded>
    </item>
  </channel>
</rss>