{"action":"created","comment":{"url":"https://api.github.com/repos/pmem/pmdk/pulls/comments/188526445","pull_request_review_id":120520579,"id":188526445,"diff_hunk":"@@ -0,0 +1,279 @@\n+/*\n+ * Copyright 2018, Intel Corporation\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions\n+ * are met:\n+ *\n+ *     * Redistributions of source code must retain the above copyright\n+ *       notice, this list of conditions and the following disclaimer.\n+ *\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *       notice, this list of conditions and the following disclaimer in\n+ *       the documentation and/or other materials provided with the\n+ *       distribution.\n+ *\n+ *     * Neither the name of the copyright holder nor the names of its\n+ *       contributors may be used to endorse or promote products derived\n+ *       from this software without specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+/*\n+ * queue.c -- array based queue example\n+ */\n+\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <assert.h>\n+#include <libpmemobj.h>\n+\n+POBJ_LAYOUT_BEGIN(queue);\n+POBJ_LAYOUT_ROOT(queue, struct root);\n+POBJ_LAYOUT_TOID(queue, struct entry);\n+POBJ_LAYOUT_TOID(queue, struct queue);\n+POBJ_LAYOUT_END(queue);\n+\n+struct entry { /* queue entry that contains arbitrary data */\n+\tsize_t len; /* length of the data buffer */\n+\tchar data[];\n+};\n+\n+struct queue { /* array-based queue container */\n+\tsize_t front; /* position of the first entry */\n+\tsize_t rear; /* position of the last entry */\n+\n+\tsize_t capacity; /* size of the entries array, must be power of two */\n+\tTOID(struct entry) entries[];\n+};\n+\n+struct root {\n+\tTOID(struct queue) queue;\n+};\n+\n+/*\n+ * queue_constructor -- constructor of the queue container\n+ */\n+static int\n+queue_constructor(PMEMobjpool *pop, void *ptr, void *arg)\n+{\n+\tstruct queue *q = ptr;\n+\tsize_t *capacity = arg;\n+\tq->front = 0;\n+\tq->rear = 0;\n+\tq->capacity = *capacity;\n+\n+\t/* atomic API requires that objects are persisted in the constructor */\n+\tpmemobj_persist(pop, q, sizeof(*q));\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * queue_new -- allocates a new queue container using the atomic API\n+ */\n+static int\n+queue_new(PMEMobjpool *pop, TOID(struct queue) *q, size_t nentries)\n+{\n+\treturn POBJ_ALLOC(pop, q, struct queue,\n+\t\tsizeof(struct queue) + sizeof(TOID(struct entry)) * nentries,\n+\t\tqueue_constructor, &nentries);\n+}\n+\n+/*\n+ * queue_nentries -- returns the number of entries\n+ */\n+static size_t\n+queue_nentries(struct queue *queue)\n+{\n+\treturn queue->rear - queue->front;\n+}\n+\n+/*\n+ * queue_push -- allocates and inserts a new entry into the queue\n+ */\n+static int\n+queue_push(PMEMobjpool *pop, struct queue *queue, char *data, size_t len)\n+{\n+\tif (queue->capacity - queue_nentries(queue) == 0)\n+\t\treturn -1; /* at capacity */\n+\n+\t/* rear is never decreased, need to calculate the real position */\n+\tsize_t pos = queue->rear & (queue->capacity - 1);\n+\n+\tint ret = 0;\n+\n+\tTX_BEGIN(pop) {\n+\t\t/* let's first reserve the space at the end of the queue */\n+\t\tTX_ADD_FIELD_DIRECT(queue, rear);\n+\t\tqueue->rear += 1;\n+\n+\t\t/* and then snapshot the queue entry that we will allocate to */\n+\t\tpmemobj_tx_add_range_direct(&queue->entries[pos],\n+\t\t\tsizeof(TOID(struct entry)));\n+\n+\t\t/* now we can safely allocate and initialize the new entry */\n+\t\tqueue->entries[pos] = TX_ALLOC(struct entry,\n+\t\t\tsizeof(struct entry) + len);\n+\t\tmemcpy(D_RW(queue->entries[pos])->data, data, len);\n+\t} TX_ONABORT { /* don't forget about error handling! ;) */\n+\t\tret = -1;\n+\t} TX_END\n+\n+\treturn ret;\n+}\n+\n+/*\n+ * queue_pop - removes and frees the first element from the queue\n+ */\n+static int\n+queue_pop(PMEMobjpool *pop, struct queue *queue)\n+{\n+\tif (queue_nentries(queue) == 0)\n+\t\treturn -1; /* no entries to remove */\n+\n+\t/* front is also never decreased */\n+\tsize_t pos = queue->front & (queue->capacity - 1);\n+\n+\tint ret = 0;\n+\n+\tTX_BEGIN(pop) {\n+\t\t/* move the queue forward */\n+\t\tTX_ADD_FIELD_DIRECT(queue, front);\n+\t\tqueue->front += 1;\n+\t\t/* and since this entry is now unreachable, free it */\n+\t\tTX_FREE(queue->entries[pos]);\n+\t} TX_ONABORT {\n+\t\tret = -1;\n+\t} TX_END\n+\n+\treturn ret;\n+}\n+\n+/*\n+ * queue_show -- prints all queue entries\n+ */\n+static void\n+queue_show(PMEMobjpool *pop, struct queue *queue)\n+{\n+\tsize_t nentries = queue_nentries(queue);\n+\tprintf(\"Entries %zu/%zu\\n\", nentries, queue->capacity);\n+\tfor (size_t i = queue->front; i < queue->rear; ++i) {\n+\t\tsize_t pos = i & (queue->capacity - 1);\n+\t\tprintf(\"%zu: %s\\n\", pos, D_RW(queue->entries[pos])->data);\n+\t}\n+}\n+\n+/* available queue operations */\n+enum queue_op {\n+\tUNKNOWN_QUEUE_OP,\n+\tQUEUE_NEW,\n+\tQUEUE_PUSH,\n+\tQUEUE_POP,\n+\tQUEUE_SHOW,\n+\n+\tMAX_QUEUE_OP,\n+};\n+\n+/* queue operations strings */\n+const char *ops_str[MAX_QUEUE_OP] = {\"\", \"new\", \"push\", \"pop\", \"show\"};\n+\n+/*\n+ * parse_queue_op -- parses the operation string and returns matching queue_op\n+ */\n+static enum queue_op\n+queue_op_parse(const char *str)\n+{\n+\tfor (int i = 0; i < MAX_QUEUE_OP; ++i)\n+\t\tif (strcmp(str, ops_str[i]) == 0)\n+\t\t\treturn (enum queue_op)i;\n+\n+\treturn UNKNOWN_QUEUE_OP;\n+}\n+\n+/*\n+ * fail -- helper function to exit the application in the event of an error\n+ */\n+static void __attribute__((noreturn))\n+fail(const char *msg)\n+{\n+\tfprintf(stderr, \"%s\\n\", msg);\n+\texit(EXIT_FAILURE);\n+}\n+\n+int\n+main(int argc, char *argv[])\n+{\n+\tenum queue_op op;\n+\tif (argc < 3 || (op = queue_op_parse(argv[2])) == UNKNOWN_QUEUE_OP)\n+\t\tfail(\"usage: file-name [new <n>|show|push <data>|pop]\");\n+\n+\tPMEMobjpool *pop = pmemobj_open(argv[1], POBJ_LAYOUT_NAME(queue));\n+\tif (pop == NULL)\n+\t\tfail(\"failed to open the pool\");\n+\n+\tTOID(struct root) root = POBJ_ROOT(pop, struct root);\n+\tstruct root *rootp = D_RW(root);\n+\tsize_t capacity;\n+\n+\tswitch (op) {\n+\t\tcase QUEUE_NEW:\n+\t\t\tif (argc != 4)\n+\t\t\t\tfail(\"missing size of the queue\");\n+\n+\t\t\terrno = 0;\n+\t\t\tcapacity = strtoll(argv[3], NULL, 10);","path":"src/examples/libpmemobj/queue/queue.c","position":null,"original_position":237,"commit_id":"2014f17695c3a9aa5c8c5bbc17a64b409d29bda7","original_commit_id":"4e9a0ec0a45ae647e54d0d8b1adec65c0470a857","user":{"login":"pbalcer","id":8775610,"avatar_url":"https://avatars1.githubusercontent.com/u/8775610?v=4","gravatar_id":"","url":"https://api.github.com/users/pbalcer","html_url":"https://github.com/pbalcer","followers_url":"https://api.github.com/users/pbalcer/followers","following_url":"https://api.github.com/users/pbalcer/following{/other_user}","gists_url":"https://api.github.com/users/pbalcer/gists{/gist_id}","starred_url":"https://api.github.com/users/pbalcer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pbalcer/subscriptions","organizations_url":"https://api.github.com/users/pbalcer/orgs","repos_url":"https://api.github.com/users/pbalcer/repos","events_url":"https://api.github.com/users/pbalcer/events{/privacy}","received_events_url":"https://api.github.com/users/pbalcer/received_events","type":"User","site_admin":false},"body":"done, but I have been bitten by automatic base detection before, so I'm not a fan :D","created_at":"2018-05-16T07:31:17Z","updated_at":"2018-05-16T07:31:18Z","html_url":"https://github.com/pmem/pmdk/pull/2925#discussion_r188526445","pull_request_url":"https://api.github.com/repos/pmem/pmdk/pulls/2925","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/pmem/pmdk/pulls/comments/188526445"},"html":{"href":"https://github.com/pmem/pmdk/pull/2925#discussion_r188526445"},"pull_request":{"href":"https://api.github.com/repos/pmem/pmdk/pulls/2925"}},"in_reply_to_id":188307826},"pull_request":{"url":"https://api.github.com/repos/pmem/pmdk/pulls/2925","id":188119927,"html_url":"https://github.com/pmem/pmdk/pull/2925","diff_url":"https://github.com/pmem/pmdk/pull/2925.diff","patch_url":"https://github.com/pmem/pmdk/pull/2925.patch","issue_url":"https://api.github.com/repos/pmem/pmdk/issues/2925","number":2925,"state":"open","locked":false,"title":"examples: array-based queue libpmemobj example","user":{"login":"pbalcer","id":8775610,"avatar_url":"https://avatars1.githubusercontent.com/u/8775610?v=4","gravatar_id":"","url":"https://api.github.com/users/pbalcer","html_url":"https://github.com/pbalcer","followers_url":"https://api.github.com/users/pbalcer/followers","following_url":"https://api.github.com/users/pbalcer/following{/other_user}","gists_url":"https://api.github.com/users/pbalcer/gists{/gist_id}","starred_url":"https://api.github.com/users/pbalcer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pbalcer/subscriptions","organizations_url":"https://api.github.com/users/pbalcer/orgs","repos_url":"https://api.github.com/users/pbalcer/repos","events_url":"https://api.github.com/users/pbalcer/events{/privacy}","received_events_url":"https://api.github.com/users/pbalcer/received_events","type":"User","site_admin":false},"body":"This is a very simple example demonstrating the usage of both\r\natomic and transactional APIs. It's conviently structured so\r\nthat it is easy to demonstrate what happens when one omits\r\ncertain critical functions (persists or add range).\n\n<!-- Reviewable:start -->\n---\nThis change is [<img src=\"https://reviewable.io/review_button.svg\" height=\"34\" align=\"absmiddle\" alt=\"Reviewable\"/>](https://reviewable.io/reviews/pmem/pmdk/2925)\n<!-- Reviewable:end -->\n","created_at":"2018-05-15T12:59:53Z","updated_at":"2018-05-16T07:31:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cf21fa9dd1db6b5735051b0092da5046f7f3bd4f","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/pmem/pmdk/pulls/2925/commits","review_comments_url":"https://api.github.com/repos/pmem/pmdk/pulls/2925/comments","review_comment_url":"https://api.github.com/repos/pmem/pmdk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pmem/pmdk/issues/2925/comments","statuses_url":"https://api.github.com/repos/pmem/pmdk/statuses/2014f17695c3a9aa5c8c5bbc17a64b409d29bda7","head":{"label":"pbalcer:webinar-example","ref":"webinar-example","sha":"2014f17695c3a9aa5c8c5bbc17a64b409d29bda7","user":{"login":"pbalcer","id":8775610,"avatar_url":"https://avatars1.githubusercontent.com/u/8775610?v=4","gravatar_id":"","url":"https://api.github.com/users/pbalcer","html_url":"https://github.com/pbalcer","followers_url":"https://api.github.com/users/pbalcer/followers","following_url":"https://api.github.com/users/pbalcer/following{/other_user}","gists_url":"https://api.github.com/users/pbalcer/gists{/gist_id}","starred_url":"https://api.github.com/users/pbalcer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pbalcer/subscriptions","organizations_url":"https://api.github.com/users/pbalcer/orgs","repos_url":"https://api.github.com/users/pbalcer/repos","events_url":"https://api.github.com/users/pbalcer/events{/privacy}","received_events_url":"https://api.github.com/users/pbalcer/received_events","type":"User","site_admin":false},"repo":{"id":30190222,"name":"nvml","full_name":"pbalcer/nvml","owner":{"login":"pbalcer","id":8775610,"avatar_url":"https://avatars1.githubusercontent.com/u/8775610?v=4","gravatar_id":"","url":"https://api.github.com/users/pbalcer","html_url":"https://github.com/pbalcer","followers_url":"https://api.github.com/users/pbalcer/followers","following_url":"https://api.github.com/users/pbalcer/following{/other_user}","gists_url":"https://api.github.com/users/pbalcer/gists{/gist_id}","starred_url":"https://api.github.com/users/pbalcer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pbalcer/subscriptions","organizations_url":"https://api.github.com/users/pbalcer/orgs","repos_url":"https://api.github.com/users/pbalcer/repos","events_url":"https://api.github.com/users/pbalcer/events{/privacy}","received_events_url":"https://api.github.com/users/pbalcer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pbalcer/nvml","description":"NVM Library","fork":true,"url":"https://api.github.com/repos/pbalcer/nvml","forks_url":"https://api.github.com/repos/pbalcer/nvml/forks","keys_url":"https://api.github.com/repos/pbalcer/nvml/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pbalcer/nvml/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pbalcer/nvml/teams","hooks_url":"https://api.github.com/repos/pbalcer/nvml/hooks","issue_events_url":"https://api.github.com/repos/pbalcer/nvml/issues/events{/number}","events_url":"https://api.github.com/repos/pbalcer/nvml/events","assignees_url":"https://api.github.com/repos/pbalcer/nvml/assignees{/user}","branches_url":"https://api.github.com/repos/pbalcer/nvml/branches{/branch}","tags_url":"https://api.github.com/repos/pbalcer/nvml/tags","blobs_url":"https://api.github.com/repos/pbalcer/nvml/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pbalcer/nvml/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pbalcer/nvml/git/refs{/sha}","trees_url":"https://api.github.com/repos/pbalcer/nvml/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pbalcer/nvml/statuses/{sha}","languages_url":"https://api.github.com/repos/pbalcer/nvml/languages","stargazers_url":"https://api.github.com/repos/pbalcer/nvml/stargazers","contributors_url":"https://api.github.com/repos/pbalcer/nvml/contributors","subscribers_url":"https://api.github.com/repos/pbalcer/nvml/subscribers","subscription_url":"https://api.github.com/repos/pbalcer/nvml/subscription","commits_url":"https://api.github.com/repos/pbalcer/nvml/commits{/sha}","git_commits_url":"https://api.github.com/repos/pbalcer/nvml/git/commits{/sha}","comments_url":"https://api.github.com/repos/pbalcer/nvml/comments{/number}","issue_comment_url":"https://api.github.com/repos/pbalcer/nvml/issues/comments{/number}","contents_url":"https://api.github.com/repos/pbalcer/nvml/contents/{+path}","compare_url":"https://api.github.com/repos/pbalcer/nvml/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pbalcer/nvml/merges","archive_url":"https://api.github.com/repos/pbalcer/nvml/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pbalcer/nvml/downloads","issues_url":"https://api.github.com/repos/pbalcer/nvml/issues{/number}","pulls_url":"https://api.github.com/repos/pbalcer/nvml/pulls{/number}","milestones_url":"https://api.github.com/repos/pbalcer/nvml/milestones{/number}","notifications_url":"https://api.github.com/repos/pbalcer/nvml/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pbalcer/nvml/labels{/name}","releases_url":"https://api.github.com/repos/pbalcer/nvml/releases{/id}","deployments_url":"https://api.github.com/repos/pbalcer/nvml/deployments","created_at":"2015-02-02T14:16:28Z","updated_at":"2015-03-09T08:53:28Z","pushed_at":"2018-05-16T07:30:49Z","git_url":"git://github.com/pbalcer/nvml.git","ssh_url":"git@github.com:pbalcer/nvml.git","clone_url":"https://github.com/pbalcer/nvml.git","svn_url":"https://github.com/pbalcer/nvml","homepage":"pmem.io","size":22734,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"pmalloc_ct"}},"base":{"label":"pmem:master","ref":"master","sha":"88d33bf3097a7524b422338b0e05fad187c1ca48","user":{"login":"pmem","id":4894933,"avatar_url":"https://avatars1.githubusercontent.com/u/4894933?v=4","gravatar_id":"","url":"https://api.github.com/users/pmem","html_url":"https://github.com/pmem","followers_url":"https://api.github.com/users/pmem/followers","following_url":"https://api.github.com/users/pmem/following{/other_user}","gists_url":"https://api.github.com/users/pmem/gists{/gist_id}","starred_url":"https://api.github.com/users/pmem/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmem/subscriptions","organizations_url":"https://api.github.com/users/pmem/orgs","repos_url":"https://api.github.com/users/pmem/repos","events_url":"https://api.github.com/users/pmem/events{/privacy}","received_events_url":"https://api.github.com/users/pmem/received_events","type":"Organization","site_admin":false},"repo":{"id":23637153,"name":"pmdk","full_name":"pmem/pmdk","owner":{"login":"pmem","id":4894933,"avatar_url":"https://avatars1.githubusercontent.com/u/4894933?v=4","gravatar_id":"","url":"https://api.github.com/users/pmem","html_url":"https://github.com/pmem","followers_url":"https://api.github.com/users/pmem/followers","following_url":"https://api.github.com/users/pmem/following{/other_user}","gists_url":"https://api.github.com/users/pmem/gists{/gist_id}","starred_url":"https://api.github.com/users/pmem/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmem/subscriptions","organizations_url":"https://api.github.com/users/pmem/orgs","repos_url":"https://api.github.com/users/pmem/repos","events_url":"https://api.github.com/users/pmem/events{/privacy}","received_events_url":"https://api.github.com/users/pmem/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pmem/pmdk","description":"PMDK main source repo","fork":false,"url":"https://api.github.com/repos/pmem/pmdk","forks_url":"https://api.github.com/repos/pmem/pmdk/forks","keys_url":"https://api.github.com/repos/pmem/pmdk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pmem/pmdk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pmem/pmdk/teams","hooks_url":"https://api.github.com/repos/pmem/pmdk/hooks","issue_events_url":"https://api.github.com/repos/pmem/pmdk/issues/events{/number}","events_url":"https://api.github.com/repos/pmem/pmdk/events","assignees_url":"https://api.github.com/repos/pmem/pmdk/assignees{/user}","branches_url":"https://api.github.com/repos/pmem/pmdk/branches{/branch}","tags_url":"https://api.github.com/repos/pmem/pmdk/tags","blobs_url":"https://api.github.com/repos/pmem/pmdk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pmem/pmdk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pmem/pmdk/git/refs{/sha}","trees_url":"https://api.github.com/repos/pmem/pmdk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pmem/pmdk/statuses/{sha}","languages_url":"https://api.github.com/repos/pmem/pmdk/languages","stargazers_url":"https://api.github.com/repos/pmem/pmdk/stargazers","contributors_url":"https://api.github.com/repos/pmem/pmdk/contributors","subscribers_url":"https://api.github.com/repos/pmem/pmdk/subscribers","subscription_url":"https://api.github.com/repos/pmem/pmdk/subscription","commits_url":"https://api.github.com/repos/pmem/pmdk/commits{/sha}","git_commits_url":"https://api.github.com/repos/pmem/pmdk/git/commits{/sha}","comments_url":"https://api.github.com/repos/pmem/pmdk/comments{/number}","issue_comment_url":"https://api.github.com/repos/pmem/pmdk/issues/comments{/number}","contents_url":"https://api.github.com/repos/pmem/pmdk/contents/{+path}","compare_url":"https://api.github.com/repos/pmem/pmdk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pmem/pmdk/merges","archive_url":"https://api.github.com/repos/pmem/pmdk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pmem/pmdk/downloads","issues_url":"https://api.github.com/repos/pmem/pmdk/issues{/number}","pulls_url":"https://api.github.com/repos/pmem/pmdk/pulls{/number}","milestones_url":"https://api.github.com/repos/pmem/pmdk/milestones{/number}","notifications_url":"https://api.github.com/repos/pmem/pmdk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pmem/pmdk/labels{/name}","releases_url":"https://api.github.com/repos/pmem/pmdk/releases{/id}","deployments_url":"https://api.github.com/repos/pmem/pmdk/deployments","created_at":"2014-09-03T20:55:23Z","updated_at":"2018-05-15T10:50:42Z","pushed_at":"2018-05-16T07:30:56Z","git_url":"git://github.com/pmem/pmdk.git","ssh_url":"git@github.com:pmem/pmdk.git","clone_url":"https://github.com/pmem/pmdk.git","svn_url":"https://github.com/pmem/pmdk","homepage":"http://pmem.io","size":53746,"stargazers_count":415,"watchers_count":415,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":192,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":192,"open_issues":14,"watchers":415,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pmem/pmdk/pulls/2925"},"html":{"href":"https://github.com/pmem/pmdk/pull/2925"},"issue":{"href":"https://api.github.com/repos/pmem/pmdk/issues/2925"},"comments":{"href":"https://api.github.com/repos/pmem/pmdk/issues/2925/comments"},"review_comments":{"href":"https://api.github.com/repos/pmem/pmdk/pulls/2925/comments"},"review_comment":{"href":"https://api.github.com/repos/pmem/pmdk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pmem/pmdk/pulls/2925/commits"},"statuses":{"href":"https://api.github.com/repos/pmem/pmdk/statuses/2014f17695c3a9aa5c8c5bbc17a64b409d29bda7"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"pbalcer"}}