{"action":"created","comment":{"url":"https://api.github.com/repos/jemalloc/jemalloc/pulls/comments/96983037","pull_request_review_id":17579286,"id":96983037,"diff_hunk":"@@ -1352,250 +1352,466 @@ malloc_init_hard(void)\n  */\n /******************************************************************************/\n /*\n- * Begin malloc(3)-compatible functions.\n+ * Begin allocation-path internal functions and data structures.\n  */\n \n-static void *\n-ialloc_prof_sample(tsd_t *tsd, size_t usize, szind_t ind, bool zero,\n-    prof_tctx_t *tctx, bool slow_path)\n-{\n-\tvoid *p;\n+/* Settings determined by the documented behavior of the allocation functions */\n+typedef struct static_opts_s static_opts_t;\n+struct static_opts_s {\n+\t/* Whether or not allocations of size 0 should be treated as size 1. */\n+\tbool bump_empty_alloc;\n+\t/*\n+\t * Whether to assert that allocations are not of size 0 (after any\n+\t * bumping).\n+\t */\n+\tbool assert_nonempty_alloc;\n \n-\tif (tctx == NULL)\n-\t\treturn (NULL);\n-\tif (usize <= SMALL_MAXCLASS) {\n-\t\tszind_t ind_large = size2index(LARGE_MINCLASS);\n-\t\tp = ialloc(tsd, LARGE_MINCLASS, ind_large, zero, slow_path);\n-\t\tif (p == NULL)\n-\t\t\treturn (NULL);\n-\t\tarena_prof_promote(tsd_tsdn(tsd), iealloc(tsd_tsdn(tsd), p), p,\n-\t\t    usize);\n-\t} else\n-\t\tp = ialloc(tsd, usize, ind, zero, slow_path);\n+\t/*\n+\t * Whether or not to modify the 'result' argument to malloc in case of\n+\t * error.\n+\t */\n+\tbool null_out_result_on_error;\n+\t/* Whether to set errno when we encounter an error condition. */\n+\tbool set_errno_on_error;\n \n-\treturn (p);\n-}\n+\t/*\n+\t * The minimum valid alignment for functions requestion aligned storage.\n+\t */\n+\tsize_t min_alignment;\n \n-JEMALLOC_ALWAYS_INLINE_C void *\n-ialloc_prof(tsd_t *tsd, size_t usize, szind_t ind, bool zero, bool slow_path)\n-{\n-\tvoid *p;\n-\tprof_tctx_t *tctx;\n+\t/* The error string to use if we oom.*/\n+\tconst char *oom_string;\n+\t/* The error string to use if the passed-in alignment is invalid. */\n+\tconst char *invalid_alignment_string;\n \n-\ttctx = prof_alloc_prep(tsd, usize, prof_active_get_unlocked(), true);\n-\tif (unlikely((uintptr_t)tctx != (uintptr_t)1U))\n-\t\tp = ialloc_prof_sample(tsd, usize, ind, zero, tctx, slow_path);\n-\telse\n-\t\tp = ialloc(tsd, usize, ind, zero, slow_path);\n-\tif (unlikely(p == NULL)) {\n-\t\tprof_alloc_rollback(tsd, tctx, true);\n-\t\treturn (NULL);\n-\t}\n-\tprof_malloc(tsd_tsdn(tsd), iealloc(tsd_tsdn(tsd), p), p, usize, tctx);\n+\t/*\n+\t * False if we're configured to skip some time-consuming operations.\n+\t *\n+\t * This isn't really a malloc \"behvaior\", but it acts as a useful\n+\t * summary of several other static (or at least, static after program\n+\t * initialization) options.\n+\t *\n+\t * Eventually, it would be better to have a config_opts_t that captures\n+\t * the state of all options and config settings, which can be more\n+\t * quickly initialized depending on the value of initialized_and_fast.\n+\t */\n+\tbool slow;\n+};\n \n-\treturn (p);\n+JEMALLOC_ALWAYS_INLINE_C void\n+static_opts_init(static_opts_t *static_opts) {\n+\tstatic_opts->bump_empty_alloc = false;\n+\tstatic_opts->assert_nonempty_alloc = false;\n+\tstatic_opts->null_out_result_on_error = false;\n+\tstatic_opts->set_errno_on_error = false;\n+\tstatic_opts->min_alignment = 0;\n+\tstatic_opts->oom_string = \"\";\n+\tstatic_opts->invalid_alignment_string = \"\";\n+\tstatic_opts->slow = false;\n }\n \n /*\n- * ialloc_body() is inlined so that fast and slow paths are generated separately\n- * with statically known slow_path.\n- *\n- * This function guarantees that *tsdn is non-NULL on success.\n+ * Note that these must be kept in sync with the macros in\n+ * jemalloc/jemalloc_macros.h.\n  */\n-JEMALLOC_ALWAYS_INLINE_C void *\n-ialloc_body(size_t size, bool zero, tsdn_t **tsdn, size_t *usize,\n-    bool slow_path)\n-{\n-\ttsd_t *tsd;\n-\tszind_t ind;\n+#define TCACHE_IND_NONE ((unsigned)-1)\n+#define TCACHE_IND_AUTOMATIC ((unsigned)-2)\n+#define ARENA_IND_AUTOMATIC ((unsigned)-1)\n+\n+typedef struct dynamic_opts_s dynamic_opts_t;\n+struct dynamic_opts_s {\n+\tvoid **result;\n+\tsize_t num_items;\n+\tsize_t item_size;\n+\tsize_t alignment;\n+\tbool zero;\n+\tunsigned tcache_ind;\n+\tunsigned arena_ind;\n+};\n \n-\tif (slow_path && unlikely(malloc_init())) {\n-\t\t*tsdn = NULL;\n-\t\treturn (NULL);\n-\t}\n+JEMALLOC_ALWAYS_INLINE_C void\n+dynamic_opts_init(dynamic_opts_t *dynamic_opts) {\n+\tdynamic_opts->result = NULL;\n+\tdynamic_opts->num_items = 0;\n+\tdynamic_opts->item_size = 0;\n+\tdynamic_opts->alignment = 0;\n+\tdynamic_opts->zero = false;\n+\tdynamic_opts->tcache_ind = TCACHE_IND_AUTOMATIC;\n+\tdynamic_opts->arena_ind = ARENA_IND_AUTOMATIC;\n+}\n \n-\ttsd = tsd_fetch();\n-\t*tsdn = tsd_tsdn(tsd);\n-\twitness_assert_lockless(tsd_tsdn(tsd));\n+/* ind is ignored if dopts->alignment > 0. */\n+JEMALLOC_ALWAYS_INLINE_C void *\n+imalloc_no_sample(static_opts_t *sopts, dynamic_opts_t *dopts, tsd_t *tsd,\n+    size_t size, size_t usize, szind_t ind) {\n+\ttcache_t *tcache;\n+\tarena_t *arena;\n \n-\tind = size2index(size);\n-\tif (unlikely(ind >= NSIZES))\n-\t\treturn (NULL);\n+\t/* Fill in the tcache. */\n+\tif (dopts->tcache_ind == TCACHE_IND_AUTOMATIC) {\n+\t\ttcache = tcache_get(tsd, true);\n+\t} else if (dopts->tcache_ind == TCACHE_IND_NONE) {\n+\t\ttcache = NULL;\n+\t} else {\n+\t\ttcache = tcaches_get(tsd, dopts->tcache_ind);\n+\t}\n \n-\tif (config_stats || (config_prof && opt_prof)) {\n-\t\t*usize = index2size(ind);\n-\t\tassert(*usize > 0 && *usize <= LARGE_MAXCLASS);\n+\t/* Fill in the arena. */\n+\tif (dopts->arena_ind == ARENA_IND_AUTOMATIC) {\n+\t\t/*\n+\t\t * In case of automatic arena management, we defer arena\n+\t\t * computation until as late as we can, hoping to fill the\n+\t\t * allocation out of the tcache.\n+\t\t */\n+\t\tarena = NULL;\n+\t} else {\n+\t\tarena = arena_get(tsd_tsdn(tsd), dopts->arena_ind, true);\n \t}\n \n-\tif (config_prof && opt_prof)\n-\t\treturn (ialloc_prof(tsd, *usize, ind, zero, slow_path));\n+\tif (unlikely(dopts->alignment != 0)) {\n+\t\treturn ipalloct(tsd_tsdn(tsd), usize, dopts->alignment,\n+\t\t    dopts->zero, tcache, arena);\n+\t}\n \n-\treturn (ialloc(tsd, size, ind, zero, slow_path));\n+\treturn iallocztm(tsd_tsdn(tsd), size, ind, dopts->zero, tcache, false,\n+\t    arena, sopts->slow);\n }\n \n-JEMALLOC_ALWAYS_INLINE_C void\n-ialloc_post_check(void *ret, tsdn_t *tsdn, size_t usize, const char *func,\n-    bool update_errno, bool slow_path)\n-{\n-\tassert(!tsdn_null(tsdn) || ret == NULL);\n+JEMALLOC_ALWAYS_INLINE_C void *\n+imalloc_sample(static_opts_t *sopts, dynamic_opts_t *dopts, tsd_t *tsd,\n+    size_t usize, szind_t ind) {\n+\tvoid *ret;\n \n-\tif (unlikely(ret == NULL)) {\n-\t\tif (slow_path && config_xmalloc && unlikely(opt_xmalloc)) {\n-\t\t\tmalloc_printf(\"<jemalloc>: Error in %s(): out of \"\n-\t\t\t    \"memory\\n\", func);\n-\t\t\tabort();\n+\t/*\n+\t * For small allocations, sampling bumps the usize.  If so, we allocate\n+\t * from the ind_large bucket.\n+\t */\n+\tszind_t ind_large;\n+\tsize_t bumped_usize = usize;\n+\n+\tif (usize <= SMALL_MAXCLASS) {\n+\t\tassert(((dopts->alignment == 0) ? s2u(LARGE_MINCLASS) :\n+\t\t    sa2u(LARGE_MINCLASS, dopts->alignment)) == LARGE_MINCLASS);\n+\t\tind_large = size2index(LARGE_MINCLASS);\n+\t\tbumped_usize = s2u(LARGE_MINCLASS);\n+\t\tret = imalloc_no_sample(sopts, dopts, tsd, bumped_usize,\n+\t\t    bumped_usize, ind_large);\n+\t\tif (unlikely(ret == NULL)) {\n+\t\t\treturn NULL;\n \t\t}\n-\t\tif (update_errno)\n-\t\t\tset_errno(ENOMEM);\n-\t}\n-\tif (config_stats && likely(ret != NULL)) {\n-\t\tassert(usize == isalloc(tsdn, iealloc(tsdn, ret), ret));\n-\t\t*tsd_thread_allocatedp_get(tsdn_tsd(tsdn)) += usize;\n+\t\tarena_prof_promote(tsd_tsdn(tsd), iealloc(tsd_tsdn(tsd), ret),\n+\t\t    ret, usize);\n+\t} else {\n+\t\tret = imalloc_no_sample(sopts, dopts, tsd, usize, usize, ind);\n \t}\n-\twitness_assert_lockless(tsdn);\n+\n+\treturn ret;\n }\n \n-JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN\n-void JEMALLOC_NOTHROW *\n-JEMALLOC_ATTR(malloc) JEMALLOC_ALLOC_SIZE(1)\n-je_malloc(size_t size)\n-{\n-\tvoid *ret;\n-\ttsdn_t *tsdn;\n-\tsize_t usize JEMALLOC_CC_SILENCE_INIT(0);\n+/*\n+ * Returns true if the allocation will overflow, and false otherwise. Sets *size\n+ * to the product either way.\n+ */\n+JEMALLOC_ALWAYS_INLINE_C bool\n+compute_size_with_overflow(dynamic_opts_t *dopts, size_t *size) {\n+\t/*\n+\t * This function is just num_items * item_size, except that we have to\n+\t * check for overflow.\n+\t *\n+\t * TODO(davidtgoldblatt): We ought to use built-in \"multiply with\n+\t * overflow\" intrinsics (where available) instead.\n+\t */\n \n-\tif (size == 0)\n-\t\tsize = 1;\n+\t/* A size_t with its high-half bits all set to 1. */\n+\tconst static size_t high_bits = SIZE_T_MAX >> (sizeof(size_t) * 8 / 2);\n \n-\tif (likely(!malloc_slow)) {\n-\t\tret = ialloc_body(size, false, &tsdn, &usize, false);\n-\t\tialloc_post_check(ret, tsdn, usize, \"malloc\", true, false);\n-\t} else {\n-\t\tret = ialloc_body(size, false, &tsdn, &usize, true);\n-\t\tialloc_post_check(ret, tsdn, usize, \"malloc\", true, true);\n-\t\tUTRACE(0, size, ret);\n+\t*size = dopts->item_size * dopts->num_items;\n+\n+\tif (unlikely(*size == 0)) {\n+\t\tif (dopts->num_items == 0 || dopts->item_size == 0) {","path":"src/jemalloc.c","position":275,"original_position":275,"commit_id":"14cf7909ea3418dbaf72aadadec56d098602a4fc","original_commit_id":"14cf7909ea3418dbaf72aadadec56d098602a4fc","user":{"login":"jasone","id":245970,"avatar_url":"https://avatars.githubusercontent.com/u/245970?v=3","gravatar_id":"","url":"https://api.github.com/users/jasone","html_url":"https://github.com/jasone","followers_url":"https://api.github.com/users/jasone/followers","following_url":"https://api.github.com/users/jasone/following{/other_user}","gists_url":"https://api.github.com/users/jasone/gists{/gist_id}","starred_url":"https://api.github.com/users/jasone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jasone/subscriptions","organizations_url":"https://api.github.com/users/jasone/orgs","repos_url":"https://api.github.com/users/jasone/repos","events_url":"https://api.github.com/users/jasone/events{/privacy}","received_events_url":"https://api.github.com/users/jasone/received_events","type":"User","site_admin":false},"body":"Rewrite as ```return (dopts->num_items != 0 && dopts->item_size != 0);```?","created_at":"2017-01-19T23:27:23Z","updated_at":"2017-01-19T23:39:57Z","html_url":"https://github.com/jemalloc/jemalloc/pull/568#discussion_r96983037","pull_request_url":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568","_links":{"self":{"href":"https://api.github.com/repos/jemalloc/jemalloc/pulls/comments/96983037"},"html":{"href":"https://github.com/jemalloc/jemalloc/pull/568#discussion_r96983037"},"pull_request":{"href":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568"}}},"pull_request":{"url":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568","id":102179688,"html_url":"https://github.com/jemalloc/jemalloc/pull/568","diff_url":"https://github.com/jemalloc/jemalloc/pull/568.diff","patch_url":"https://github.com/jemalloc/jemalloc/pull/568.patch","issue_url":"https://api.github.com/repos/jemalloc/jemalloc/issues/568","number":568,"state":"open","locked":false,"title":"Unify the allocation paths","user":{"login":"davidtgoldblatt","id":1660204,"avatar_url":"https://avatars.githubusercontent.com/u/1660204?v=3","gravatar_id":"","url":"https://api.github.com/users/davidtgoldblatt","html_url":"https://github.com/davidtgoldblatt","followers_url":"https://api.github.com/users/davidtgoldblatt/followers","following_url":"https://api.github.com/users/davidtgoldblatt/following{/other_user}","gists_url":"https://api.github.com/users/davidtgoldblatt/gists{/gist_id}","starred_url":"https://api.github.com/users/davidtgoldblatt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidtgoldblatt/subscriptions","organizations_url":"https://api.github.com/users/davidtgoldblatt/orgs","repos_url":"https://api.github.com/users/davidtgoldblatt/repos","events_url":"https://api.github.com/users/davidtgoldblatt/events{/privacy}","received_events_url":"https://api.github.com/users/davidtgoldblatt/received_events","type":"User","site_admin":false},"body":"This unifies the allocation paths for malloc, posix_memalign, aligned_alloc,\r\ncalloc, memalign, valloc, and mallocx, so that they all share common code where\r\nthey can.\r\n\r\nThere's more work that could be done here, but I think this is the smallest\r\ndiscrete change in this direction.\r\n\r\nThis shows up as a net increase in total LOC, but there's two mitigating factors:\r\n- This will allow us to straightforwardly remove many of the inline functions in jemalloc_internal.h; I'm just saving that for a later diff.\r\n- Many of the added lines are far simpler than many of the removed lines (the allocation functions are now wrappers that do lots of straightforward parameter setting before forwarding to imalloc; the parameter setting costs many lines, but is trivial to understand).","created_at":"2017-01-19T00:34:39Z","updated_at":"2017-01-19T23:39:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a2675281103a9046e7e9602c69abde0062aae0f6","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568/commits","review_comments_url":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568/comments","review_comment_url":"https://api.github.com/repos/jemalloc/jemalloc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jemalloc/jemalloc/issues/568/comments","statuses_url":"https://api.github.com/repos/jemalloc/jemalloc/statuses/14cf7909ea3418dbaf72aadadec56d098602a4fc","head":{"label":"davidtgoldblatt:allocation_unification","ref":"allocation_unification","sha":"14cf7909ea3418dbaf72aadadec56d098602a4fc","user":{"login":"davidtgoldblatt","id":1660204,"avatar_url":"https://avatars.githubusercontent.com/u/1660204?v=3","gravatar_id":"","url":"https://api.github.com/users/davidtgoldblatt","html_url":"https://github.com/davidtgoldblatt","followers_url":"https://api.github.com/users/davidtgoldblatt/followers","following_url":"https://api.github.com/users/davidtgoldblatt/following{/other_user}","gists_url":"https://api.github.com/users/davidtgoldblatt/gists{/gist_id}","starred_url":"https://api.github.com/users/davidtgoldblatt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidtgoldblatt/subscriptions","organizations_url":"https://api.github.com/users/davidtgoldblatt/orgs","repos_url":"https://api.github.com/users/davidtgoldblatt/repos","events_url":"https://api.github.com/users/davidtgoldblatt/events{/privacy}","received_events_url":"https://api.github.com/users/davidtgoldblatt/received_events","type":"User","site_admin":false},"repo":{"id":57924757,"name":"jemalloc","full_name":"davidtgoldblatt/jemalloc","owner":{"login":"davidtgoldblatt","id":1660204,"avatar_url":"https://avatars.githubusercontent.com/u/1660204?v=3","gravatar_id":"","url":"https://api.github.com/users/davidtgoldblatt","html_url":"https://github.com/davidtgoldblatt","followers_url":"https://api.github.com/users/davidtgoldblatt/followers","following_url":"https://api.github.com/users/davidtgoldblatt/following{/other_user}","gists_url":"https://api.github.com/users/davidtgoldblatt/gists{/gist_id}","starred_url":"https://api.github.com/users/davidtgoldblatt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidtgoldblatt/subscriptions","organizations_url":"https://api.github.com/users/davidtgoldblatt/orgs","repos_url":"https://api.github.com/users/davidtgoldblatt/repos","events_url":"https://api.github.com/users/davidtgoldblatt/events{/privacy}","received_events_url":"https://api.github.com/users/davidtgoldblatt/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/davidtgoldblatt/jemalloc","description":null,"fork":true,"url":"https://api.github.com/repos/davidtgoldblatt/jemalloc","forks_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/forks","keys_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/teams","hooks_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/hooks","issue_events_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/issues/events{/number}","events_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/events","assignees_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/assignees{/user}","branches_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/branches{/branch}","tags_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/tags","blobs_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/git/refs{/sha}","trees_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/statuses/{sha}","languages_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/languages","stargazers_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/stargazers","contributors_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/contributors","subscribers_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/subscribers","subscription_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/subscription","commits_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/commits{/sha}","git_commits_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/git/commits{/sha}","comments_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/comments{/number}","issue_comment_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/issues/comments{/number}","contents_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/contents/{+path}","compare_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/merges","archive_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/downloads","issues_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/issues{/number}","pulls_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/pulls{/number}","milestones_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/milestones{/number}","notifications_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/labels{/name}","releases_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/releases{/id}","deployments_url":"https://api.github.com/repos/davidtgoldblatt/jemalloc/deployments","created_at":"2016-05-02T22:15:47Z","updated_at":"2016-05-02T22:15:49Z","pushed_at":"2017-01-19T00:23:58Z","git_url":"git://github.com/davidtgoldblatt/jemalloc.git","ssh_url":"git@github.com:davidtgoldblatt/jemalloc.git","clone_url":"https://github.com/davidtgoldblatt/jemalloc.git","svn_url":"https://github.com/davidtgoldblatt/jemalloc","homepage":"http://www.canonware.com/jemalloc/","size":5833,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"jemalloc:dev","ref":"dev","sha":"58424e679d7c1095c0ac2f148ee558d6a067f577","user":{"login":"jemalloc","id":5606968,"avatar_url":"https://avatars.githubusercontent.com/u/5606968?v=3","gravatar_id":"","url":"https://api.github.com/users/jemalloc","html_url":"https://github.com/jemalloc","followers_url":"https://api.github.com/users/jemalloc/followers","following_url":"https://api.github.com/users/jemalloc/following{/other_user}","gists_url":"https://api.github.com/users/jemalloc/gists{/gist_id}","starred_url":"https://api.github.com/users/jemalloc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jemalloc/subscriptions","organizations_url":"https://api.github.com/users/jemalloc/orgs","repos_url":"https://api.github.com/users/jemalloc/repos","events_url":"https://api.github.com/users/jemalloc/events{/privacy}","received_events_url":"https://api.github.com/users/jemalloc/received_events","type":"Organization","site_admin":false},"repo":{"id":13310527,"name":"jemalloc","full_name":"jemalloc/jemalloc","owner":{"login":"jemalloc","id":5606968,"avatar_url":"https://avatars.githubusercontent.com/u/5606968?v=3","gravatar_id":"","url":"https://api.github.com/users/jemalloc","html_url":"https://github.com/jemalloc","followers_url":"https://api.github.com/users/jemalloc/followers","following_url":"https://api.github.com/users/jemalloc/following{/other_user}","gists_url":"https://api.github.com/users/jemalloc/gists{/gist_id}","starred_url":"https://api.github.com/users/jemalloc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jemalloc/subscriptions","organizations_url":"https://api.github.com/users/jemalloc/orgs","repos_url":"https://api.github.com/users/jemalloc/repos","events_url":"https://api.github.com/users/jemalloc/events{/privacy}","received_events_url":"https://api.github.com/users/jemalloc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/jemalloc/jemalloc","description":null,"fork":false,"url":"https://api.github.com/repos/jemalloc/jemalloc","forks_url":"https://api.github.com/repos/jemalloc/jemalloc/forks","keys_url":"https://api.github.com/repos/jemalloc/jemalloc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jemalloc/jemalloc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jemalloc/jemalloc/teams","hooks_url":"https://api.github.com/repos/jemalloc/jemalloc/hooks","issue_events_url":"https://api.github.com/repos/jemalloc/jemalloc/issues/events{/number}","events_url":"https://api.github.com/repos/jemalloc/jemalloc/events","assignees_url":"https://api.github.com/repos/jemalloc/jemalloc/assignees{/user}","branches_url":"https://api.github.com/repos/jemalloc/jemalloc/branches{/branch}","tags_url":"https://api.github.com/repos/jemalloc/jemalloc/tags","blobs_url":"https://api.github.com/repos/jemalloc/jemalloc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jemalloc/jemalloc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jemalloc/jemalloc/git/refs{/sha}","trees_url":"https://api.github.com/repos/jemalloc/jemalloc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jemalloc/jemalloc/statuses/{sha}","languages_url":"https://api.github.com/repos/jemalloc/jemalloc/languages","stargazers_url":"https://api.github.com/repos/jemalloc/jemalloc/stargazers","contributors_url":"https://api.github.com/repos/jemalloc/jemalloc/contributors","subscribers_url":"https://api.github.com/repos/jemalloc/jemalloc/subscribers","subscription_url":"https://api.github.com/repos/jemalloc/jemalloc/subscription","commits_url":"https://api.github.com/repos/jemalloc/jemalloc/commits{/sha}","git_commits_url":"https://api.github.com/repos/jemalloc/jemalloc/git/commits{/sha}","comments_url":"https://api.github.com/repos/jemalloc/jemalloc/comments{/number}","issue_comment_url":"https://api.github.com/repos/jemalloc/jemalloc/issues/comments{/number}","contents_url":"https://api.github.com/repos/jemalloc/jemalloc/contents/{+path}","compare_url":"https://api.github.com/repos/jemalloc/jemalloc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jemalloc/jemalloc/merges","archive_url":"https://api.github.com/repos/jemalloc/jemalloc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jemalloc/jemalloc/downloads","issues_url":"https://api.github.com/repos/jemalloc/jemalloc/issues{/number}","pulls_url":"https://api.github.com/repos/jemalloc/jemalloc/pulls{/number}","milestones_url":"https://api.github.com/repos/jemalloc/jemalloc/milestones{/number}","notifications_url":"https://api.github.com/repos/jemalloc/jemalloc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jemalloc/jemalloc/labels{/name}","releases_url":"https://api.github.com/repos/jemalloc/jemalloc/releases{/id}","deployments_url":"https://api.github.com/repos/jemalloc/jemalloc/deployments","created_at":"2013-10-03T21:37:32Z","updated_at":"2017-01-19T19:12:36Z","pushed_at":"2017-01-19T22:25:30Z","git_url":"git://github.com/jemalloc/jemalloc.git","ssh_url":"git@github.com:jemalloc/jemalloc.git","clone_url":"https://github.com/jemalloc/jemalloc.git","svn_url":"https://github.com/jemalloc/jemalloc","homepage":"http://www.canonware.com/jemalloc/","size":6111,"stargazers_count":1810,"watchers_count":1810,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":415,"mirror_url":null,"open_issues_count":50,"forks":415,"open_issues":50,"watchers":1810,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568"},"html":{"href":"https://github.com/jemalloc/jemalloc/pull/568"},"issue":{"href":"https://api.github.com/repos/jemalloc/jemalloc/issues/568"},"comments":{"href":"https://api.github.com/repos/jemalloc/jemalloc/issues/568/comments"},"review_comments":{"href":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568/comments"},"review_comment":{"href":"https://api.github.com/repos/jemalloc/jemalloc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jemalloc/jemalloc/pulls/568/commits"},"statuses":{"href":"https://api.github.com/repos/jemalloc/jemalloc/statuses/14cf7909ea3418dbaf72aadadec56d098602a4fc"}}}}
{"actor":{"display_login":"jasone"}}