get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/52845/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 52845,
    "url": "http://patches.dpdk.org/api/patches/52845/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190417041359.45335-4-honnappa.nagarahalli@arm.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20190417041359.45335-4-honnappa.nagarahalli@arm.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190417041359.45335-4-honnappa.nagarahalli@arm.com",
    "date": "2019-04-17T04:13:59",
    "name": "[v6,3/3] doc/rcu: add lib_rcu documentation",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f1b18ddf929a564336aee7f45d60ee34c9373d3d",
    "submitter": {
        "id": 1045,
        "url": "http://patches.dpdk.org/api/people/1045/?format=api",
        "name": "Honnappa Nagarahalli",
        "email": "honnappa.nagarahalli@arm.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20190417041359.45335-4-honnappa.nagarahalli@arm.com/mbox/",
    "series": [
        {
            "id": 4339,
            "url": "http://patches.dpdk.org/api/series/4339/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=4339",
            "date": "2019-04-17T04:13:56",
            "name": "lib/rcu: add RCU library supporting QSBR mechanism",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/4339/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/52845/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/52845/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 52CE61B5AB;\n\tWed, 17 Apr 2019 06:14:23 +0200 (CEST)",
            "from foss.arm.com (foss.arm.com [217.140.101.70])\n\tby dpdk.org (Postfix) with ESMTP id BE0181B5A0\n\tfor <dev@dpdk.org>; Wed, 17 Apr 2019 06:14:18 +0200 (CEST)",
            "from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249])\n\tby usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 386F515A2;\n\tTue, 16 Apr 2019 21:14:18 -0700 (PDT)",
            "from qc2400f-1.austin.arm.com (qc2400f-1.austin.arm.com\n\t[10.118.13.209])\n\tby usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id\n\tB8FAB3F68F; Tue, 16 Apr 2019 21:14:17 -0700 (PDT)"
        ],
        "From": "Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>",
        "To": "konstantin.ananyev@intel.com, stephen@networkplumber.org,\n\tpaulmck@linux.ibm.com, marko.kovacevic@intel.com, dev@dpdk.org",
        "Cc": "honnappa.nagarahalli@arm.com, gavin.hu@arm.com, dharmik.thakkar@arm.com, \n\tmalvika.gupta@arm.com",
        "Date": "Tue, 16 Apr 2019 23:13:59 -0500",
        "Message-Id": "<20190417041359.45335-4-honnappa.nagarahalli@arm.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20190417041359.45335-1-honnappa.nagarahalli@arm.com>",
        "References": "<20181122033055.3431-1-honnappa.nagarahalli@arm.com>\n\t<20190417041359.45335-1-honnappa.nagarahalli@arm.com>",
        "Subject": "[dpdk-dev] [PATCH v6 3/3] doc/rcu: add lib_rcu documentation",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add lib_rcu QSBR API and programmer guide documentation.\n\nSigned-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>\nReviewed-by: Marko Kovacevic <marko.kovacevic@intel.com>\n---\n doc/api/doxy-api-index.md                     |   3 +-\n doc/api/doxy-api.conf.in                      |   1 +\n .../prog_guide/img/rcu_general_info.svg       | 509 ++++++++++++++++++\n doc/guides/prog_guide/index.rst               |   1 +\n doc/guides/prog_guide/rcu_lib.rst             | 185 +++++++\n 5 files changed, 698 insertions(+), 1 deletion(-)\n create mode 100644 doc/guides/prog_guide/img/rcu_general_info.svg\n create mode 100644 doc/guides/prog_guide/rcu_lib.rst",
    "diff": "diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md\nindex de1e215dd..8f0e84de6 100644\n--- a/doc/api/doxy-api-index.md\n+++ b/doc/api/doxy-api-index.md\n@@ -54,7 +54,8 @@ The public API headers are grouped by topics:\n   [memzone]            (@ref rte_memzone.h),\n   [mempool]            (@ref rte_mempool.h),\n   [malloc]             (@ref rte_malloc.h),\n-  [memcpy]             (@ref rte_memcpy.h)\n+  [memcpy]             (@ref rte_memcpy.h),\n+  [rcu]                (@ref rte_rcu_qsbr.h)\n \n - **timers**:\n   [cycles]             (@ref rte_cycles.h),\ndiff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in\nindex 7722fc3e9..b9896cb63 100644\n--- a/doc/api/doxy-api.conf.in\n+++ b/doc/api/doxy-api.conf.in\n@@ -51,6 +51,7 @@ INPUT                   = @TOPDIR@/doc/api/doxy-api-index.md \\\n                           @TOPDIR@/lib/librte_port \\\n                           @TOPDIR@/lib/librte_power \\\n                           @TOPDIR@/lib/librte_rawdev \\\n+                          @TOPDIR@/lib/librte_rcu \\\n                           @TOPDIR@/lib/librte_reorder \\\n                           @TOPDIR@/lib/librte_ring \\\n                           @TOPDIR@/lib/librte_sched \\\ndiff --git a/doc/guides/prog_guide/img/rcu_general_info.svg b/doc/guides/prog_guide/img/rcu_general_info.svg\nnew file mode 100644\nindex 000000000..e7ca1dacb\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/rcu_general_info.svg\n@@ -0,0 +1,509 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n+<!-- Generated by Microsoft Visio, SVG Export rcu_general_info.svg Page-1 -->\n+\n+<!-- SPDX-License-Identifier: BSD-3-Clause -->\n+<!-- Copyright(c) 2019 Arm Limited -->\n+\n+<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:ev=\"http://www.w3.org/2001/xml-events\"\n+\t\txmlns:v=\"http://schemas.microsoft.com/visio/2003/SVGExtensions/\" width=\"21.5in\" height=\"16.5in\" viewBox=\"0 0 1548 1188\"\n+\t\txml:space=\"preserve\" color-interpolation-filters=\"sRGB\" class=\"st21\">\n+\t<v:documentProperties v:langID=\"1033\" v:viewMarkup=\"false\">\n+\t\t<v:userDefs>\n+\t\t\t<v:ud v:nameU=\"msvSubprocessMaster\" v:prompt=\"\" v:val=\"VT4(Rectangle)\"/>\n+\t\t\t<v:ud v:nameU=\"msvNoAutoConnect\" v:val=\"VT0(1):26\"/>\n+\t\t</v:userDefs>\n+\t</v:documentProperties>\n+\n+\t<style type=\"text/css\">\n+\t<![CDATA[\n+\t\t.st1 {fill:#92d050;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}\n+\t\t.st2 {fill:#ff0000;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}\n+\t\t.st3 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}\n+\t\t.st4 {fill:#ffffff;font-family:Calibri;font-size:1.81435em;font-weight:bold}\n+\t\t.st5 {fill:#333e48;font-family:Century Gothic;font-size:1.81435em}\n+\t\t.st6 {fill:#000000;font-family:Calibri;font-size:1.99578em;font-weight:bold}\n+\t\t.st7 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.45071}\n+\t\t.st8 {fill:#000000;font-family:Century Gothic;font-size:1.75001em}\n+\t\t.st9 {font-size:1em}\n+\t\t.st10 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.90143}\n+\t\t.st11 {fill:#333e48;font-family:Calibri;font-size:2.11672em;font-weight:bold}\n+\t\t.st12 {stroke:#651beb;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.90143}\n+\t\t.st13 {stroke:#b31166;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.725356}\n+\t\t.st14 {fill:#000000;font-family:Century Gothic;font-size:1.99999em}\n+\t\t.st15 {fill:#feffff;font-family:Calibri;font-size:1.99999em;font-weight:bold}\n+\t\t.st16 {marker-end:url(#mrkr5-239);marker-start:url(#mrkr5-237);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:3}\n+\t\t.st17 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.54347826086957}\n+\t\t.st18 {marker-end:url(#mrkr5-248);marker-start:url(#mrkr5-246);stroke:#651beb;stroke-linecap:round;stroke-linejoin:round;stroke-width:3}\n+\t\t.st19 {fill:#651beb;fill-opacity:1;stroke:#651beb;stroke-opacity:1;stroke-width:0.67567567567568}\n+\t\t.st20 {marker-end:url(#mrkr5-239);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:3}\n+\t\t.st21 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}\n+\t]]>\n+\t</style>\n+\n+\t<defs id=\"Markers\">\n+\t\t<g id=\"lend5\">\n+\t\t\t<path d=\"M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 \" style=\"stroke:none\"/>\n+\t\t</g>\n+\t\t<marker id=\"mrkr5-237\" class=\"st17\" v:arrowType=\"5\" v:arrowSize=\"2\" v:setback=\"3.1\" refX=\"3.1\" orient=\"auto\"\n+\t\t\t\tmarkerUnits=\"strokeWidth\" overflow=\"visible\">\n+\t\t\t<use xlink:href=\"#lend5\" transform=\"scale(1.84) \"/>\n+\t\t</marker>\n+\t\t<marker id=\"mrkr5-239\" class=\"st17\" v:arrowType=\"5\" v:arrowSize=\"2\" v:setback=\"3.22\" refX=\"-3.22\" orient=\"auto\"\n+\t\t\t\tmarkerUnits=\"strokeWidth\" overflow=\"visible\">\n+\t\t\t<use xlink:href=\"#lend5\" transform=\"scale(-1.84,-1.84) \"/>\n+\t\t</marker>\n+\t\t<marker id=\"mrkr5-246\" class=\"st19\" v:arrowType=\"5\" v:arrowSize=\"0\" v:setback=\"2.47\" refX=\"2.47\" orient=\"auto\"\n+\t\t\t\tmarkerUnits=\"strokeWidth\" overflow=\"visible\">\n+\t\t\t<use xlink:href=\"#lend5\" transform=\"scale(1.48) \"/>\n+\t\t</marker>\n+\t\t<marker id=\"mrkr5-248\" class=\"st19\" v:arrowType=\"5\" v:arrowSize=\"0\" v:setback=\"2.59\" refX=\"-2.59\" orient=\"auto\"\n+\t\t\t\tmarkerUnits=\"strokeWidth\" overflow=\"visible\">\n+\t\t\t<use xlink:href=\"#lend5\" transform=\"scale(-1.48,-1.48) \"/>\n+\t\t</marker>\n+\t</defs>\n+\t<g v:mID=\"0\" v:index=\"1\" v:groupContext=\"foregroundPage\">\n+\t\t<v:userDefs>\n+\t\t\t<v:ud v:nameU=\"msvThemeOrder\" v:val=\"VT0(0):26\"/>\n+\t\t</v:userDefs>\n+\t\t<title>Page-1</title>\n+\t\t<v:pageProperties v:drawingScale=\"1\" v:pageScale=\"1\" v:drawingUnits=\"0\" v:shadowOffsetX=\"9\" v:shadowOffsetY=\"-9\"/>\n+\t\t<v:layer v:name=\"Connector\" v:index=\"0\"/>\n+\t\t<g id=\"shape3-1\" v:mID=\"3\" v:groupContext=\"shape\" transform=\"translate(327.227,-946.908)\">\n+\t\t\t<title>Sheet.3</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L124.27 1132.94 C129.36 1132.94 133.44 1137.08 133.44 1142.11\n+\t\t\t\t\t\t L133.44 1178.82 C133.44 1183.92 129.36 1188 124.27 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape4-3\" v:mID=\"4\" v:groupContext=\"shape\" transform=\"translate(460.665,-944.869)\">\n+\t\t\t<title>Sheet.4</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11\n+\t\t\t\t\t\t L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st2\"/>\n+\t\t</g>\n+\t\t<g id=\"shape5-5\" v:mID=\"5\" v:groupContext=\"shape\" transform=\"translate(519.302,-950.79)\">\n+\t\t\t<title>Sheet.5</title>\n+\t\t\t<desc>D1</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"23.7162\" cy=\"1169.64\" width=\"47.44\" height=\"36.7141\"/>\n+\t\t\t<path d=\"M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"11.34\" y=\"1176.17\" class=\"st4\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>D1</text>\t\t</g>\n+\t\t<g id=\"shape6-9\" v:mID=\"6\" v:groupContext=\"shape\" transform=\"translate(612.438,-944.869)\">\n+\t\t\t<title>Sheet.6</title>\n+\t\t\t<path d=\"M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95\n+\t\t\t\t\t\t 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape7-11\" v:mID=\"7\" v:groupContext=\"shape\" transform=\"translate(664.388,-945.889)\">\n+\t\t\t<title>Sheet.7</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11\n+\t\t\t\t\t\t L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st2\"/>\n+\t\t</g>\n+\t\t<g id=\"shape8-13\" v:mID=\"8\" v:groupContext=\"shape\" transform=\"translate(723.025,-951.494)\">\n+\t\t\t<title>Sheet.8</title>\n+\t\t\t<desc>D2</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"23.7162\" cy=\"1169.64\" width=\"47.44\" height=\"36.7141\"/>\n+\t\t\t<path d=\"M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"11.34\" y=\"1176.17\" class=\"st4\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>D2</text>\t\t</g>\n+\t\t<g id=\"shape9-17\" v:mID=\"9\" v:groupContext=\"shape\" transform=\"translate(814.123,-945.889)\">\n+\t\t\t<title>Sheet.9</title>\n+\t\t\t<path d=\"M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95\n+\t\t\t\t\t\t 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape10-19\" v:mID=\"10\" v:groupContext=\"shape\" transform=\"translate(27,-952.759)\">\n+\t\t\t<title>Sheet.10</title>\n+\t\t\t<desc>Reader Thread 1</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"146.259\" cy=\"1169.64\" width=\"292.52\" height=\"36.7136\"/>\n+\t\t\t<path d=\"M292.52 1151.29 L0 1151.29 L0 1188 L292.52 1188 L292.52 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"58.76\" y=\"1176.17\" class=\"st5\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Reader Thread 1</text>\t\t</g>\n+\t\t<g id=\"shape11-23\" v:mID=\"11\" v:groupContext=\"shape\" transform=\"translate(379.176,-863.295)\">\n+\t\t\t<title>Sheet.11</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L124.27 1132.94 C129.36 1132.94 133.44 1137.08 133.44 1142.11\n+\t\t\t\t\t\t L133.44 1178.82 C133.44 1183.92 129.36 1188 124.27 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape12-25\" v:mID=\"12\" v:groupContext=\"shape\" transform=\"translate(512.614,-861.255)\">\n+\t\t\t<title>Sheet.12</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11\n+\t\t\t\t\t\t L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st2\"/>\n+\t\t</g>\n+\t\t<g id=\"shape13-27\" v:mID=\"13\" v:groupContext=\"shape\" transform=\"translate(561.284,-867.106)\">\n+\t\t\t<title>Sheet.13</title>\n+\t\t\t<desc>D1</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"23.7162\" cy=\"1169.64\" width=\"47.44\" height=\"36.7141\"/>\n+\t\t\t<path d=\"M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"11.34\" y=\"1176.17\" class=\"st4\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>D1</text>\t\t</g>\n+\t\t<g id=\"shape14-31\" v:mID=\"14\" v:groupContext=\"shape\" transform=\"translate(664.388,-861.255)\">\n+\t\t\t<title>Sheet.14</title>\n+\t\t\t<path d=\"M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95\n+\t\t\t\t\t\t 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape15-33\" v:mID=\"15\" v:groupContext=\"shape\" transform=\"translate(716.337,-862.275)\">\n+\t\t\t<title>Sheet.15</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11\n+\t\t\t\t\t\t L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st2\"/>\n+\t\t</g>\n+\t\t<g id=\"shape16-35\" v:mID=\"16\" v:groupContext=\"shape\" transform=\"translate(775.009,-867.81)\">\n+\t\t\t<title>Sheet.16</title>\n+\t\t\t<desc>D2</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"23.7162\" cy=\"1169.64\" width=\"47.44\" height=\"36.7141\"/>\n+\t\t\t<path d=\"M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"11.34\" y=\"1176.17\" class=\"st4\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>D2</text>\t\t</g>\n+\t\t<g id=\"shape17-39\" v:mID=\"17\" v:groupContext=\"shape\" transform=\"translate(866.073,-862.275)\">\n+\t\t\t<title>Sheet.17</title>\n+\t\t\t<path d=\"M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95\n+\t\t\t\t\t\t 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape18-41\" v:mID=\"18\" v:groupContext=\"shape\" transform=\"translate(143.348,-873.294)\">\n+\t\t\t<title>Sheet.18</title>\n+\t\t\t<desc>T 2</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"26.9796\" cy=\"1169.64\" width=\"53.96\" height=\"36.7136\"/>\n+\t\t\t<path d=\"M53.96 1151.29 L0 1151.29 L0 1188 L53.96 1188 L53.96 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"13.3\" y=\"1176.17\" class=\"st5\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>T 2</text>\t\t</g>\n+\t\t<g id=\"shape19-45\" v:mID=\"19\" v:groupContext=\"shape\" transform=\"translate(474.188,-777.642)\">\n+\t\t\t<title>Sheet.19</title>\n+\t\t\t<path d=\"M0 1143.01 C0 1138.04 4.07 1133.96 9.04 1133.96 L124.46 1133.96 C129.43 1133.96 133.44 1138.04 133.44 1143.01\n+\t\t\t\t\t\t L133.44 1179.01 C133.44 1183.99 129.43 1188 124.46 1188 L9.04 1188 C4.07 1188 0 1183.99 0 1179.01 L0 1143.01\n+\t\t\t\t\t\t Z\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape20-47\" v:mID=\"20\" v:groupContext=\"shape\" transform=\"translate(608.645,-775.602)\">\n+\t\t\t<title>Sheet.20</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11\n+\t\t\t\t\t\t L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st2\"/>\n+\t\t</g>\n+\t\t<g id=\"shape21-49\" v:mID=\"21\" v:groupContext=\"shape\" transform=\"translate(666.862,-781.311)\">\n+\t\t\t<title>Sheet.21</title>\n+\t\t\t<desc>D1</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"23.7162\" cy=\"1169.64\" width=\"47.44\" height=\"36.7141\"/>\n+\t\t\t<path d=\"M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"11.34\" y=\"1176.17\" class=\"st4\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>D1</text>\t\t</g>\n+\t\t<g id=\"shape22-53\" v:mID=\"22\" v:groupContext=\"shape\" transform=\"translate(760.418,-775.602)\">\n+\t\t\t<title>Sheet.22</title>\n+\t\t\t<path d=\"M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95\n+\t\t\t\t\t\t 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape23-55\" v:mID=\"23\" v:groupContext=\"shape\" transform=\"translate(812.367,-776.622)\">\n+\t\t\t<title>Sheet.23</title>\n+\t\t\t<path d=\"M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11\n+\t\t\t\t\t\t L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11\n+\t\t\t\t\t\t Z\" class=\"st2\"/>\n+\t\t</g>\n+\t\t<g id=\"shape24-57\" v:mID=\"24\" v:groupContext=\"shape\" transform=\"translate(870.584,-782.015)\">\n+\t\t\t<title>Sheet.24</title>\n+\t\t\t<desc>D2</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"23.7162\" cy=\"1169.64\" width=\"47.44\" height=\"36.7141\"/>\n+\t\t\t<path d=\"M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"11.34\" y=\"1176.17\" class=\"st4\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>D2</text>\t\t</g>\n+\t\t<g id=\"shape25-61\" v:mID=\"25\" v:groupContext=\"shape\" transform=\"translate(962.103,-776.622)\">\n+\t\t\t<title>Sheet.25</title>\n+\t\t\t<path d=\"M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95\n+\t\t\t\t\t\t 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape26-63\" v:mID=\"26\" v:groupContext=\"shape\" transform=\"translate(142.645,-787.5)\">\n+\t\t\t<title>Sheet.26</title>\n+\t\t\t<desc>T 3</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"26.9796\" cy=\"1169.64\" width=\"53.96\" height=\"36.7136\"/>\n+\t\t\t<path d=\"M53.96 1151.29 L0 1151.29 L0 1188 L53.96 1188 L53.96 1151.29\" class=\"st3\"/>\n+\t\t\t<text x=\"13.3\" y=\"1176.17\" class=\"st5\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>T 3</text>\t\t</g>\n+\t\t<g id=\"shape28-67\" v:mID=\"28\" v:groupContext=\"shape\" transform=\"translate(882.826,-574.263)\">\n+\t\t\t<title>Sheet.28</title>\n+\t\t\t<desc>Time</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"45.9546\" cy=\"1166.58\" width=\"91.91\" height=\"42.8314\"/>\n+\t\t\t<path d=\"M91.91 1145.17 L0 1145.17 L0 1188 L91.91 1188 L91.91 1145.17\" class=\"st3\"/>\n+\t\t\t<text x=\"21.32\" y=\"1173.77\" class=\"st6\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Time</text>\t\t</g>\n+\t\t<g id=\"shape29-71\" v:mID=\"29\" v:groupContext=\"shape\" transform=\"translate(419.545,-660.119)\">\n+\t\t\t<title>Sheet.29</title>\n+\t\t\t<path d=\"M0 1145.17 L0 1188 L0 1145.17\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape30-74\" v:mID=\"30\" v:groupContext=\"shape\" transform=\"translate(419.545,-684.783)\">\n+\t\t\t<title>Sheet.30</title>\n+\t\t\t<path d=\"M0 1188 L82.7 1187.36 L151.2 1172.07\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape31-77\" v:mID=\"31\" v:groupContext=\"shape\" transform=\"translate(214.454,-663.095)\">\n+\t\t\t<title>Sheet.31</title>\n+\t\t\t<desc>Remove reference to entry1</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"96.7728\" cy=\"1169.45\" width=\"193.55\" height=\"37.1049\"/>\n+\t\t\t<path d=\"M193.55 1150.9 L0 1150.9 L0 1188 L193.55 1188 L193.55 1150.9\" class=\"st3\"/>\n+\t\t\t<text x=\"2.39\" y=\"1163.15\" class=\"st8\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"2\"/><v:tabList/>Remove reference <tspan\n+\t\t\t\t\t\tx=\"104.08\" dy=\"1.2em\" class=\"st9\">to entry1</tspan></text>\t\t</g>\n+\t\t<g id=\"shape33-82\" v:mID=\"33\" v:groupContext=\"shape\" transform=\"translate(571.287,-681.326)\">\n+\t\t\t<title>Sheet.33</title>\n+\t\t\t<path d=\"M0 738.67 L0 1188\" class=\"st10\"/>\n+\t\t</g>\n+\t\t<g id=\"shape34-85\" v:mID=\"34\" v:groupContext=\"shape\" transform=\"translate(515.013,-1130.65)\">\n+\t\t\t<title>Sheet.34</title>\n+\t\t\t<desc>Delete</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"60.7243\" cy=\"1166.58\" width=\"121.45\" height=\"42.8314\"/>\n+\t\t\t<path d=\"M121.45 1145.17 L0 1145.17 L0 1188 L121.45 1188 L121.45 1145.17\" class=\"st3\"/>\n+\t\t\t<text x=\"26.02\" y=\"1174.2\" class=\"st11\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Delete</text>\t\t</g>\n+\t\t<g id=\"shape35-89\" v:mID=\"35\" v:groupContext=\"shape\" transform=\"translate(434.372,-1096.8)\">\n+\t\t\t<title>Sheet.35</title>\n+\t\t\t<path d=\"M0 1154.35 L0 1188 L0 1154.35\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape36-92\" v:mID=\"36\" v:groupContext=\"shape\" transform=\"translate(434.372,-1100.37)\">\n+\t\t\t<title>Sheet.36</title>\n+\t\t\t<path d=\"M0 1171.88 L84.54 1171.24 L136.43 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape37-95\" v:mID=\"37\" v:groupContext=\"shape\" transform=\"translate(193.5,-1103.76)\">\n+\t\t\t<title>Sheet.37</title>\n+\t\t\t<desc>Delete entry1 from D1</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"114.75\" cy=\"1175.76\" width=\"229.5\" height=\"24.4771\"/>\n+\t\t\t<path d=\"M229.5 1163.52 L0 1163.52 L0 1188 L229.5 1188 L229.5 1163.52\" class=\"st3\"/>\n+\t\t\t<text x=\"3.88\" y=\"1182.06\" class=\"st8\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Delete entry1 from D1</text>\t\t</g>\n+\t\t<g id=\"shape38-99\" v:mID=\"38\" v:groupContext=\"shape\" transform=\"translate(714.3,-675.425)\">\n+\t\t\t<title>Sheet.38</title>\n+\t\t\t<path d=\"M0 732.77 L0 1188\" class=\"st10\"/>\n+\t\t</g>\n+\t\t<g id=\"shape39-102\" v:mID=\"39\" v:groupContext=\"shape\" transform=\"translate(795.979,-637.904)\">\n+\t\t\t<title>Sheet.39</title>\n+\t\t\t<path d=\"M0 1112.54 L0 1188 L0 1112.54\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape40-105\" v:mID=\"40\" v:groupContext=\"shape\" transform=\"translate(716.782,-675.425)\">\n+\t\t\t<title>Sheet.40</title>\n+\t\t\t<path d=\"M79.2 1188 L52.71 1187.94 L0 1147.21\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape41-108\" v:mID=\"41\" v:groupContext=\"shape\" transform=\"translate(803.572,-639.285)\">\n+\t\t\t<title>Sheet.41</title>\n+\t\t\t<desc>Free memory for entries1 and 2 after every reader has gone th...</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"172.421\" cy=\"1152.51\" width=\"344.85\" height=\"70.9752\"/>\n+\t\t\t<path d=\"M344.84 1117.02 L0 1117.02 L0 1188 L344.84 1188 L344.84 1117.02\" class=\"st3\"/>\n+\t\t\t<text x=\"0\" y=\"1133.61\" class=\"st8\" v:langID=\"1033\"><v:paragraph/><v:tabList/>Free memory for entries1 and 2 <tspan\n+\t\t\t\t\t\tx=\"0\" dy=\"1.2em\" class=\"st9\">after every reader has gone </tspan><tspan x=\"0\" dy=\"1.2em\" class=\"st9\">through at least 1 quiescent state </tspan> </text>\t\t</g>\n+\t\t<g id=\"shape46-114\" v:mID=\"46\" v:groupContext=\"shape\" transform=\"translate(680.801,-1130.65)\">\n+\t\t\t<title>Sheet.46</title>\n+\t\t\t<desc>Free</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"42.0169\" cy=\"1166.58\" width=\"84.04\" height=\"42.8314\"/>\n+\t\t\t<path d=\"M84.03 1145.17 L0 1145.17 L0 1188 L84.03 1188 L84.03 1145.17\" class=\"st3\"/>\n+\t\t\t<text x=\"18.89\" y=\"1174.2\" class=\"st11\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Free</text>\t\t</g>\n+\t\t<g id=\"shape48-118\" v:mID=\"48\" v:groupContext=\"shape\" transform=\"translate(811.005,-1110.05)\">\n+\t\t\t<title>Sheet.48</title>\n+\t\t\t<path d=\"M0 1145.17 L0 1188 L0 1145.17\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape49-121\" v:mID=\"49\" v:groupContext=\"shape\" transform=\"translate(658.61,-1083.99)\">\n+\t\t\t<title>Sheet.49</title>\n+\t\t\t<path d=\"M153.05 1149.63 L113.7 1149.57 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape50-124\" v:mID=\"50\" v:groupContext=\"shape\" transform=\"translate(798.359,-1110.46)\">\n+\t\t\t<title>Sheet.50</title>\n+\t\t\t<desc>Grace Period</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"107.799\" cy=\"1167.81\" width=\"215.6\" height=\"40.3845\"/>\n+\t\t\t<path d=\"M215.6 1147.62 L0 1147.62 L0 1188 L215.6 1188 L215.6 1147.62\" class=\"st3\"/>\n+\t\t\t<text x=\"43.79\" y=\"1174.99\" class=\"st6\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Grace Period</text>\t\t</g>\n+\t\t<g id=\"shape51-128\" v:mID=\"51\" v:groupContext=\"shape\" transform=\"translate(599.196,-662.779)\">\n+\t\t\t<title>Sheet.51</title>\n+\t\t\t<path d=\"M0 732.77 L0 1188\" class=\"st12\"/>\n+\t\t</g>\n+\t\t<g id=\"shape52-131\" v:mID=\"52\" v:groupContext=\"shape\" transform=\"translate(464.931,-1052.95)\">\n+\t\t\t<title>Sheet.52</title>\n+\t\t\t<path d=\"M0 1154.35 L0 1188 L0 1154.35\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape53-134\" v:mID=\"53\" v:groupContext=\"shape\" transform=\"translate(464.931,-1056.52)\">\n+\t\t\t<title>Sheet.53</title>\n+\t\t\t<path d=\"M0 1171.88 L84.54 1171.24 L136.43 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape54-137\" v:mID=\"54\" v:groupContext=\"shape\" transform=\"translate(225,-1058.76)\">\n+\t\t\t<title>Sheet.54</title>\n+\t\t\t<desc>Delete entry2 from D1</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"114.75\" cy=\"1175.76\" width=\"229.5\" height=\"24.4771\"/>\n+\t\t\t<path d=\"M229.5 1163.52 L0 1163.52 L0 1188 L229.5 1188 L229.5 1163.52\" class=\"st3\"/>\n+\t\t\t<text x=\"3.88\" y=\"1182.06\" class=\"st8\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Delete entry2 from D1</text>\t\t</g>\n+\t\t<g id=\"shape56-141\" v:mID=\"56\" v:groupContext=\"shape\" transform=\"translate(711.244,-662.779)\">\n+\t\t\t<title>Sheet.56</title>\n+\t\t\t<path d=\"M0 732.77 L0 1188\" class=\"st12\"/>\n+\t\t</g>\n+\t\t<g id=\"shape57-144\" v:mID=\"57\" v:groupContext=\"shape\" transform=\"translate(664.897,-1045.31)\">\n+\t\t\t<title>Sheet.57</title>\n+\t\t\t<path d=\"M-0 1188 L146.76 1112.94\" class=\"st13\"/>\n+\t\t</g>\n+\t\t<g id=\"shape58-147\" v:mID=\"58\" v:groupContext=\"shape\" transform=\"translate(619.059,-848.701)\">\n+\t\t\t<title>Sheet.58</title>\n+\t\t\t<path d=\"M432.2 1184.24 L-0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape59-150\" v:mID=\"59\" v:groupContext=\"shape\" transform=\"translate(1038.62,-837.364)\">\n+\t\t\t<title>Sheet.59</title>\n+\t\t\t<desc>Critical sections</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"130\" cy=\"1167.81\" width=\"260.01\" height=\"40.3845\"/>\n+\t\t\t<path d=\"M260 1147.62 L0 1147.62 L0 1188 L260 1188 L260 1147.62\" class=\"st3\"/>\n+\t\t\t<text x=\"52.25\" y=\"1174.99\" class=\"st6\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Critical sections</text>\t\t</g>\n+\t\t<g id=\"shape60-154\" v:mID=\"60\" v:groupContext=\"shape\" transform=\"translate(621.606,-848.828)\">\n+\t\t\t<title>Sheet.60</title>\n+\t\t\t<path d=\"M0 1173.53 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape61-157\" v:mID=\"61\" v:groupContext=\"shape\" transform=\"translate(824.31,-849.848)\">\n+\t\t\t<title>Sheet.61</title>\n+\t\t\t<path d=\"M0 1173.53 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape62-160\" v:mID=\"62\" v:groupContext=\"shape\" transform=\"translate(345.944,-933.143)\">\n+\t\t\t<title>Sheet.62</title>\n+\t\t\t<path d=\"M705.32 1188 L0 1187.43\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape63-163\" v:mID=\"63\" v:groupContext=\"shape\" transform=\"translate(1038.62,-915.684)\">\n+\t\t\t<title>Sheet.63</title>\n+\t\t\t<desc>Quiescent states</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"137.691\" cy=\"1167.81\" width=\"275.39\" height=\"40.3845\"/>\n+\t\t\t<path d=\"M275.38 1147.62 L0 1147.62 L0 1188 L275.38 1188 L275.38 1147.62\" class=\"st3\"/>\n+\t\t\t<text x=\"55.18\" y=\"1174.99\" class=\"st6\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Quiescent states</text>\t\t</g>\n+\t\t<g id=\"shape64-167\" v:mID=\"64\" v:groupContext=\"shape\" transform=\"translate(346.581,-932.442)\">\n+\t\t\t<title>Sheet.64</title>\n+\t\t\t<path d=\"M0 1173.53 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape65-170\" v:mID=\"65\" v:groupContext=\"shape\" transform=\"translate(621.606,-933.461)\">\n+\t\t\t<title>Sheet.65</title>\n+\t\t\t<path d=\"M0 1173.53 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape66-173\" v:mID=\"66\" v:groupContext=\"shape\" transform=\"translate(856.905,-934.481)\">\n+\t\t\t<title>Sheet.66</title>\n+\t\t\t<path d=\"M0 1173.53 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape67-176\" v:mID=\"67\" v:groupContext=\"shape\" transform=\"translate(472.82,-756.389)\">\n+\t\t\t<title>Sheet.67</title>\n+\t\t\t<path d=\"M578.44 1188 L0 1187.43\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape68-179\" v:mID=\"68\" v:groupContext=\"shape\" transform=\"translate(473.456,-755.688)\">\n+\t\t\t<title>Sheet.68</title>\n+\t\t\t<path d=\"M0 1173.53 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape69-182\" v:mID=\"69\" v:groupContext=\"shape\" transform=\"translate(1016.87,-757.728)\">\n+\t\t\t<title>Sheet.69</title>\n+\t\t\t<path d=\"M0 1173.53 L0 1188\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape70-185\" v:mID=\"70\" v:groupContext=\"shape\" transform=\"translate(1060.04,-738.651)\">\n+\t\t\t<title>Sheet.70</title>\n+\t\t\t<desc>while(1) loop</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"96.7728\" cy=\"1167.81\" width=\"193.55\" height=\"40.3845\"/>\n+\t\t\t<path d=\"M193.55 1147.62 L0 1147.62 L0 1188 L193.55 1188 L193.55 1147.62\" class=\"st3\"/>\n+\t\t\t<text x=\"31.03\" y=\"1174.99\" class=\"st6\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>while(1) loop</text>\t\t</g>\n+\t\t<g id=\"shape71-189\" v:mID=\"71\" v:groupContext=\"shape\" transform=\"translate(190.02,-464.886)\">\n+\t\t\t<title>Sheet.71</title>\n+\t\t\t<path d=\"M0 1151.91 C0 1148.19 3.88 1145.17 8.66 1145.17 L43.29 1145.17 C48.13 1145.17 51.95 1148.19 51.95 1151.91 L51.95\n+\t\t\t\t\t\t 1181.26 C51.95 1185.03 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1185.03 0 1181.26 L0 1151.91 Z\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape72-191\" v:mID=\"72\" v:groupContext=\"shape\" transform=\"translate(259.003,-466.895)\">\n+\t\t\t<title>Sheet.72</title>\n+\t\t\t<desc>Reader thread is not accessing any shared data structure. i.e...</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"344.967\" cy=\"1169.45\" width=\"689.94\" height=\"37.1049\"/>\n+\t\t\t<path d=\"M689.93 1150.9 L0 1150.9 L0 1188 L689.93 1188 L689.93 1150.9\" class=\"st3\"/>\n+\t\t\t<text x=\"0\" y=\"1162.25\" class=\"st14\" v:langID=\"1033\"><v:paragraph/><v:tabList/>Reader thread is not accessing any shared data structure.<v:newlineChar/><tspan\n+\t\t\t\t\t\tx=\"0\" dy=\"1.2em\" class=\"st9\">i.e. non critical section or quiescent state.</tspan></text>\t\t</g>\n+\t\t<g id=\"shape73-196\" v:mID=\"73\" v:groupContext=\"shape\" transform=\"translate(190.02,-389.169)\">\n+\t\t\t<title>Sheet.73</title>\n+\t\t\t<desc>Dx</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(4,4,4,4)\"/>\n+\t\t\t<v:textRect cx=\"25.9746\" cy=\"1166.58\" width=\"51.95\" height=\"42.8314\"/>\n+\t\t\t<path d=\"M0 1152.31 C0 1148.39 1.43 1145.17 3.16 1145.17 L48.79 1145.17 C50.55 1145.17 51.95 1148.39 51.95 1152.31 L51.95\n+\t\t\t\t\t\t 1180.86 C51.95 1184.83 50.55 1188 48.79 1188 L3.16 1188 C1.43 1188 0 1184.83 0 1180.86 L0 1152.31 Z\"\n+\t\t\t\t\tclass=\"st2\"/>\n+\t\t\t<text x=\"12.9\" y=\"1173.78\" class=\"st15\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Dx</text>\t\t</g>\n+\t\t<g id=\"shape74-199\" v:mID=\"74\" v:groupContext=\"shape\" transform=\"translate(259.003,-388.777)\">\n+\t\t\t<title>Sheet.74</title>\n+\t\t\t<desc>Reader thread is accessing the shared data structure Dx. i.e....</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"344.967\" cy=\"1169.45\" width=\"689.94\" height=\"37.1049\"/>\n+\t\t\t<path d=\"M689.93 1150.9 L0 1150.9 L0 1188 L689.93 1188 L689.93 1150.9\" class=\"st3\"/>\n+\t\t\t<text x=\"0\" y=\"1162.25\" class=\"st14\" v:langID=\"1033\"><v:paragraph/><v:tabList/>Reader thread is accessing the shared data structure Dx.<v:newlineChar/><tspan\n+\t\t\t\t\t\tx=\"0\" dy=\"1.2em\" class=\"st9\">i.e. critical section.</tspan></text>\t\t</g>\n+\t\t<g id=\"shape75-204\" v:mID=\"75\" v:groupContext=\"shape\" transform=\"translate(289.017,-301.151)\">\n+\t\t\t<title>Sheet.75</title>\n+\t\t\t<desc>Point in time when the reference to the entry is removed usin...</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"332.491\" cy=\"1160.47\" width=\"664.99\" height=\"55.0626\"/>\n+\t\t\t<path d=\"M664.98 1132.94 L0 1132.94 L0 1188 L664.98 1188 L664.98 1132.94\" class=\"st3\"/>\n+\t\t\t<text x=\"0\" y=\"1153.27\" class=\"st14\" v:langID=\"1033\"><v:paragraph/><v:tabList/>Point in time when the reference to the entry is removed <tspan\n+\t\t\t\t\t\tx=\"0\" dy=\"1.2em\" class=\"st9\">using an atomic operation.</tspan></text>\t\t</g>\n+\t\t<g id=\"shape76-209\" v:mID=\"76\" v:groupContext=\"shape\" transform=\"translate(177.543,-315.596)\">\n+\t\t\t<title>Sheet.76</title>\n+\t\t\t<desc>Delete</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"45.9546\" cy=\"1166.58\" width=\"91.91\" height=\"42.8314\"/>\n+\t\t\t<path d=\"M91.91 1145.17 L0 1145.17 L0 1188 L91.91 1188 L91.91 1145.17\" class=\"st3\"/>\n+\t\t\t<text x=\"11.25\" y=\"1174.2\" class=\"st11\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Delete</text>\t\t</g>\n+\t\t<g id=\"shape77-213\" v:mID=\"77\" v:groupContext=\"shape\" transform=\"translate(288,-239.327)\">\n+\t\t\t<title>Sheet.77</title>\n+\t\t\t<desc>Point in time when the writer can free the deleted entry.</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"328.5\" cy=\"1167.81\" width=\"657\" height=\"40.3845\"/>\n+\t\t\t<path d=\"M657 1147.62 L0 1147.62 L0 1188 L657 1188 L657 1147.62\" class=\"st3\"/>\n+\t\t\t<text x=\"0\" y=\"1175.01\" class=\"st14\" v:langID=\"1033\"><v:paragraph/><v:tabList/>Point in time when the writer can free the deleted entry.</text>\t\t</g>\n+\t\t<g id=\"shape78-217\" v:mID=\"78\" v:groupContext=\"shape\" transform=\"translate(177.543,-240.744)\">\n+\t\t\t<title>Sheet.78</title>\n+\t\t\t<desc>Free</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"34.3786\" cy=\"1166.58\" width=\"68.76\" height=\"42.8314\"/>\n+\t\t\t<path d=\"M68.76 1145.17 L0 1145.17 L0 1188 L68.76 1188 L68.76 1145.17\" class=\"st3\"/>\n+\t\t\t<text x=\"11.25\" y=\"1174.2\" class=\"st11\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Free</text>\t\t</g>\n+\t\t<g id=\"shape79-221\" v:mID=\"79\" v:groupContext=\"shape\" transform=\"translate(289.228,-163.612)\">\n+\t\t\t<title>Sheet.79</title>\n+\t\t\t<desc>Time duration between Delete and Free, during which memory ca...</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"328.5\" cy=\"1167.81\" width=\"657\" height=\"40.3845\"/>\n+\t\t\t<path d=\"M657 1147.62 L0 1147.62 L0 1188 L657 1188 L657 1147.62\" class=\"st3\"/>\n+\t\t\t<text x=\"0\" y=\"1160.61\" class=\"st14\" v:langID=\"1033\"><v:paragraph/><v:tabList/>Time duration between Delete and Free, during which <tspan\n+\t\t\t\t\t\tx=\"0\" dy=\"1.2em\" class=\"st9\">memory cannot be freed.</tspan></text>\t\t</g>\n+\t\t<g id=\"shape80-226\" v:mID=\"80\" v:groupContext=\"shape\" transform=\"translate(187.999,-162)\">\n+\t\t\t<title>Sheet.80</title>\n+\t\t\t<desc>Grace Period</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"39.5985\" cy=\"1166.58\" width=\"79.2\" height=\"42.8314\"/>\n+\t\t\t<path d=\"M79.2 1145.17 L0 1145.17 L0 1188 L79.2 1188 L79.2 1145.17\" class=\"st3\"/>\n+\t\t\t<text x=\"0\" y=\"1158.96\" class=\"st11\" v:langID=\"1033\"><v:paragraph/><v:tabList/>Grace <tspan x=\"0\" dy=\"1.2em\"\n+\t\t\t\t\t\tclass=\"st9\">Period</tspan></text>\t\t</g>\n+\t\t<g id=\"shape83-231\" v:mID=\"83\" v:groupContext=\"shape\" transform=\"translate(572.146,-1080.07)\">\n+\t\t\t<title>Sheet.83</title>\n+\t\t\t<path d=\"M9.3 1188 L9.66 1188 L132.49 1188\" class=\"st16\"/>\n+\t\t</g>\n+\t\t<g id=\"shape84-240\" v:mID=\"84\" v:groupContext=\"shape\" transform=\"translate(599.196,-1042.14)\">\n+\t\t\t<title>Sheet.84</title>\n+\t\t\t<path d=\"M7.41 1188 L7.77 1188 L104.28 1188\" class=\"st18\"/>\n+\t\t</g>\n+\t\t<g id=\"shape85-249\" v:mID=\"85\" v:groupContext=\"shape\" transform=\"translate(980.637,-595.338)\">\n+\t\t\t<title>Sheet.85</title>\n+\t\t\t<path d=\"M0 1188 L92.16 1188\" class=\"st20\"/>\n+\t\t</g>\n+\t\t<g id=\"shape86-254\" v:mID=\"86\" v:groupContext=\"shape\" transform=\"translate(444.835,-603.428)\">\n+\t\t\t<title>Sheet.86</title>\n+\t\t\t<path d=\"M0 1145.17 L0 1188 L0 1145.17\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape87-257\" v:mID=\"87\" v:groupContext=\"shape\" transform=\"translate(444.835,-637.489)\">\n+\t\t\t<title>Sheet.87</title>\n+\t\t\t<path d=\"M0 1188 L84.43 1186.61 L154.36 1153.31\" class=\"st7\"/>\n+\t\t</g>\n+\t\t<g id=\"shape88-260\" v:mID=\"88\" v:groupContext=\"shape\" transform=\"translate(241.369,-607.028)\">\n+\t\t\t<title>Sheet.88</title>\n+\t\t\t<desc>Remove reference to entry2</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(0,0,0,0)\"/>\n+\t\t\t<v:textRect cx=\"96.7728\" cy=\"1169.45\" width=\"193.55\" height=\"37.1049\"/>\n+\t\t\t<path d=\"M193.55 1150.9 L0 1150.9 L0 1188 L193.55 1188 L193.55 1150.9\" class=\"st3\"/>\n+\t\t\t<text x=\"2.39\" y=\"1163.15\" class=\"st8\" v:langID=\"1033\"><v:paragraph v:horizAlign=\"2\"/><v:tabList/>Remove reference <tspan\n+\t\t\t\t\t\tx=\"104.08\" dy=\"1.2em\" class=\"st9\">to entry2</tspan></text>\t\t</g>\n+\t</g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst\nindex 95f5e7964..17df2c563 100644\n--- a/doc/guides/prog_guide/index.rst\n+++ b/doc/guides/prog_guide/index.rst\n@@ -56,6 +56,7 @@ Programmer's Guide\n     metrics_lib\n     bpf_lib\n     ipsec_lib\n+    rcu_lib\n     source_org\n     dev_kit_build_system\n     dev_kit_root_make_help\ndiff --git a/doc/guides/prog_guide/rcu_lib.rst b/doc/guides/prog_guide/rcu_lib.rst\nnew file mode 100644\nindex 000000000..55d44e15d\n--- /dev/null\n+++ b/doc/guides/prog_guide/rcu_lib.rst\n@@ -0,0 +1,185 @@\n+..  SPDX-License-Identifier: BSD-3-Clause\n+    Copyright(c) 2019 Arm Limited.\n+\n+.. _RCU_Library:\n+\n+RCU Library\n+============\n+\n+Lock-less data structures provide scalability and determinism.\n+They enable use cases where locking may not be allowed\n+(for ex: real-time applications).\n+\n+In the following paras, the term 'memory' refers to memory allocated\n+by typical APIs like malloc or anything that is representative of\n+memory, for ex: an index of a free element array.\n+\n+Since these data structures are lock less, the writers and readers\n+are accessing the data structures concurrently. Hence, while removing\n+an element from a data structure, the writers cannot return the memory\n+to the allocator, without knowing that the readers are not\n+referencing that element/memory anymore. Hence, it is required to\n+separate the operation of removing an element into 2 steps:\n+\n+Delete: in this step, the writer removes the reference to the element from\n+the data structure but does not return the associated memory to the\n+allocator. This will ensure that new readers will not get a reference to\n+the removed element. Removing the reference is an atomic operation.\n+\n+Free(Reclaim): in this step, the writer returns the memory to the\n+memory allocator, only after knowing that all the readers have stopped\n+referencing the deleted element.\n+\n+This library helps the writer determine when it is safe to free the\n+memory.\n+\n+This library makes use of thread Quiescent State (QS).\n+\n+What is Quiescent State\n+-----------------------\n+Quiescent State can be defined as 'any point in the thread execution where the\n+thread does not hold a reference to shared memory'. It is up to the application\n+to determine its quiescent state.\n+\n+Let us consider the following diagram:\n+\n+.. figure:: img/rcu_general_info.*\n+\n+\n+As shown, reader thread 1 accesses data structures D1 and D2. When it is\n+accessing D1, if the writer has to remove an element from D1, the\n+writer cannot free the memory associated with that element immediately.\n+The writer can return the memory to the allocator only after the reader\n+stops referencing D1. In other words, reader thread RT1 has to enter\n+a quiescent state.\n+\n+Similarly, since reader thread 2 is also accessing D1, writer has to\n+wait till thread 2 enters quiescent state as well.\n+\n+However, the writer does not need to wait for reader thread 3 to enter\n+quiescent state. Reader thread 3 was not accessing D1 when the delete\n+operation happened. So, reader thread 1 will not have a reference to the\n+deleted entry.\n+\n+It can be noted that, the critical sections for D2 is a quiescent state\n+for D1. i.e. for a given data structure Dx, any point in the thread execution\n+that does not reference Dx is a quiescent state.\n+\n+Since memory is not freed immediately, there might be a need for\n+provisioning of additional memory, depending on the application requirements.\n+\n+Factors affecting RCU mechanism\n+---------------------------------\n+\n+It is important to make sure that this library keeps the overhead of\n+identifying the end of grace period and subsequent freeing of memory,\n+to a minimum. The following paras explain how grace period and critical\n+section affect this overhead.\n+\n+The writer has to poll the readers to identify the end of grace period.\n+Polling introduces memory accesses and wastes CPU cycles. The memory\n+is not available for reuse during grace period. Longer grace periods\n+exasperate these conditions.\n+\n+The length of the critical section and the number of reader threads\n+is proportional to the duration of the grace period. Keeping the critical\n+sections smaller will keep the grace period smaller. However, keeping the\n+critical sections smaller requires additional CPU cycles (due to additional\n+reporting) in the readers.\n+\n+Hence, we need the characteristics of small grace period and large critical\n+section. This library addresses this by allowing the writer to do\n+other work without having to block till the readers report their quiescent\n+state.\n+\n+RCU in DPDK\n+-----------\n+\n+For DPDK applications, the start and end of while(1) loop (where no\n+references to shared data structures are kept) act as perfect quiescent\n+states. This will combine all the shared data structure accesses into a\n+single, large critical section which helps keep the overhead on the\n+reader side to a minimum.\n+\n+DPDK supports pipeline model of packet processing and service cores.\n+In these use cases, a given data structure may not be used by all the\n+workers in the application. The writer does not have to wait for all\n+the workers to report their quiescent state. To provide the required\n+flexibility, this library has a concept of QS variable. The application\n+can create one QS variable per data structure to help it track the\n+end of grace period for each data structure. This helps keep the grace\n+period to a minimum.\n+\n+How to use this library\n+-----------------------\n+\n+The application must allocate memory and initialize a QS variable.\n+\n+Application can call ``rte_rcu_qsbr_get_memsize`` to calculate the size\n+of memory to allocate. This API takes maximum number of reader threads,\n+using this variable, as a parameter. Currently, a maximum of 1024 threads\n+are supported.\n+\n+Further, the application can initialize a QS variable using the API\n+``rte_rcu_qsbr_init``.\n+\n+Each reader thread is assumed to have a unique thread ID. Currently, the\n+management of the thread ID (for ex: allocation/free) is left to the\n+application. The thread ID should be in the range of 0 to\n+maximum number of threads provided while creating the QS variable.\n+The application could also use lcore_id as the thread ID where applicable.\n+\n+``rte_rcu_qsbr_thread_register`` API will register a reader thread\n+to report its quiescent state. This can be called from a reader thread.\n+A control plane thread can also call this on behalf of a reader thread.\n+The reader thread must call ``rte_rcu_qsbr_thread_online`` API to start\n+reporting its quiescent state.\n+\n+Some of the use cases might require the reader threads to make\n+blocking API calls (for ex: while using eventdev APIs). The writer thread\n+should not wait for such reader threads to enter quiescent state.\n+The reader thread must call ``rte_rcu_qsbr_thread_offline`` API, before calling\n+blocking APIs. It can call ``rte_rcu_qsbr_thread_online`` API once the blocking\n+API call returns.\n+\n+The writer thread can trigger the reader threads to report their quiescent\n+state by calling the API ``rte_rcu_qsbr_start``. It is possible for multiple\n+writer threads to query the quiescent state status simultaneously. Hence,\n+``rte_rcu_qsbr_start`` returns a token to each caller.\n+\n+The writer thread must call ``rte_rcu_qsbr_check`` API with the token to\n+get the current quiescent state status. Option to block till all the reader\n+threads enter the quiescent state is provided. If this API indicates that\n+all the reader threads have entered the quiescent state, the application\n+can free the deleted entry.\n+\n+The APIs ``rte_rcu_qsbr_start`` and ``rte_rcu_qsbr_check`` are lock free.\n+Hence, they can be called concurrently from multiple writers even while\n+running as worker threads.\n+\n+The separation of triggering the reporting from querying the status provides\n+the writer threads flexibility to do useful work instead of blocking for the\n+reader threads to enter the quiescent state or go offline. This reduces the\n+memory accesses due to continuous polling for the status.\n+\n+``rte_rcu_qsbr_synchronize`` API combines the functionality of\n+``rte_rcu_qsbr_start`` and blocking ``rte_rcu_qsbr_check`` into a single API.\n+This API triggers the reader threads to report their quiescent state and\n+polls till all the readers enter the quiescent state or go offline. This\n+API does not allow the writer to do useful work while waiting and\n+introduces additional memory accesses due to continuous polling.\n+\n+The reader thread must call ``rte_rcu_qsbr_thread_offline`` and\n+``rte_rcu_qsbr_thread_unregister`` APIs to remove itself from reporting its\n+quiescent state. The ``rte_rcu_qsbr_check`` API will not wait for this reader\n+thread to report the quiescent state status anymore.\n+\n+The reader threads should call ``rte_rcu_qsbr_quiescent`` API to indicate that\n+they entered a quiescent state. This API checks if a writer has triggered a\n+quiescent state query and update the state accordingly.\n+\n+The ``rte_rcu_qsbr_lock`` and ``rte_rcu_qsbr_unlock`` are empty functions.\n+However, when ``CONFIG_RTE_LIBRTE_RCU_DEBUG`` is enabled, these APIs aid\n+in debugging issues. One can mark the access to shared data structures on the\n+reader side using these APIs. The ``rte_rcu_qsbr_quiescent`` will check if\n+all the locks are unlocked.\n",
    "prefixes": [
        "v6",
        "3/3"
    ]
}