{"action":"created","comment":{"url":"https://api.github.com/repos/open-mpi/ompi/pulls/comments/243468008","pull_request_review_id":187246884,"id":243468008,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MzQ2ODAwOA==","diff_hunk":"@@ -0,0 +1,1345 @@\n+#include \"opal_config.h\"\n+\n+#include \"common_ucx.h\"\n+#include \"common_ucx_wpool.h\"\n+#include \"common_ucx_wpool_int.h\"\n+#include \"opal/mca/base/mca_base_var.h\"\n+#include \"opal/mca/base/mca_base_framework.h\"\n+#include \"opal/mca/pmix/pmix.h\"\n+#include \"opal/memoryhooks/memory.h\"\n+\n+#include <ucm/api/ucm.h>\n+\n+/*******************************************************************************\n+ *******************************************************************************\n+ *\n+ * Worker Pool (wpool) framework\n+ * Used to manage multi-threaded implementation of UCX for ompi/OSC & OSHMEM\n+ *\n+ *******************************************************************************\n+ ******************************************************************************/\n+\n+OBJ_CLASS_INSTANCE(_winfo_list_item_t, opal_list_item_t, NULL, NULL);\n+OBJ_CLASS_INSTANCE(_ctx_record_list_item_t, opal_list_item_t, NULL, NULL);\n+OBJ_CLASS_INSTANCE(_mem_record_list_item_t, opal_list_item_t, NULL, NULL);\n+OBJ_CLASS_INSTANCE(_tlocal_table_t, opal_list_item_t, NULL, NULL);\n+\n+// TODO: Remove once debug is completed\n+#ifdef OPAL_COMMON_UCX_WPOOL_DBG\n+__thread FILE *tls_pf = NULL;\n+__thread int initialized = 0;\n+#endif\n+\n+/* -----------------------------------------------------------------------------\n+ * Worker information (winfo) management functionality\n+ *----------------------------------------------------------------------------*/\n+\n+static opal_common_ucx_winfo_t *\n+_winfo_create(opal_common_ucx_wpool_t *wpool)\n+{\n+    ucp_worker_params_t worker_params;\n+    ucp_worker_h worker;\n+    ucs_status_t status;\n+    opal_common_ucx_winfo_t *winfo = NULL;\n+\n+    memset(&worker_params, 0, sizeof(worker_params));\n+    worker_params.field_mask = UCP_WORKER_PARAM_FIELD_THREAD_MODE;\n+    worker_params.thread_mode = UCS_THREAD_MODE_SINGLE;\n+    status = ucp_worker_create(wpool->ucp_ctx, &worker_params, &worker);\n+    if (UCS_OK != status) {\n+        MCA_COMMON_UCX_ERROR(\"ucp_worker_create failed: %d\", status);\n+        goto exit;\n+    }\n+\n+    winfo = calloc(1, sizeof(*winfo));\n+    if (NULL == winfo) {\n+        MCA_COMMON_UCX_ERROR(\"Cannot allocate memory for worker info\");\n+        goto release_worker;\n+    }\n+\n+    OBJ_CONSTRUCT(&winfo->mutex, opal_recursive_mutex_t);\n+    winfo->worker = worker;\n+    winfo->endpoints = NULL;\n+    winfo->comm_size = 0;\n+    winfo->released = 0;\n+    winfo->inflight_ops = NULL;\n+    winfo->global_inflight_ops = 0;\n+    winfo->inflight_req = UCS_OK;\n+\n+    WPOOL_DBG_OUT(_dbg_winfo, \"winfo = %p, worker = %p\\n\",\n+                  (void*)winfo, (void *)winfo->worker);\n+    return winfo;\n+\n+release_worker:\n+    ucp_worker_destroy(worker);\n+exit:\n+    return winfo;\n+}\n+\n+static void\n+_winfo_reset(opal_common_ucx_winfo_t *winfo)\n+{\n+    if (winfo->inflight_req != UCS_OK) {\n+        opal_common_ucx_wait_request_mt(winfo->inflight_req,\n+                                        \"opal_common_ucx_flush\");\n+        winfo->inflight_req = UCS_OK;\n+    }\n+\n+    assert(winfo->global_inflight_ops == 0);\n+\n+    if(winfo->comm_size != 0) {\n+        size_t i;\n+        for (i = 0; i < winfo->comm_size; i++) {\n+            if (NULL != winfo->endpoints[i]){\n+                ucp_ep_destroy(winfo->endpoints[i]);\n+            }\n+            assert(winfo->inflight_ops[i] == 0);\n+        }\n+        free(winfo->endpoints);\n+        free(winfo->inflight_ops);\n+    }\n+    winfo->endpoints = NULL;\n+    winfo->comm_size = 0;\n+    winfo->released = 0;\n+    WPOOL_DBG_OUT(_dbg_winfo, \"winfo = %p, worker = %p\\n\",\n+                  (void*)winfo, (void*)winfo->worker);\n+}\n+\n+static void\n+_winfo_release(opal_common_ucx_winfo_t *winfo)\n+{\n+    WPOOL_DBG_OUT(_dbg_winfo, \"winfo = %p, worker = %p\\n\",\n+                  (void*)winfo, (void *)winfo->worker);\n+    OBJ_DESTRUCT(&winfo->mutex);\n+    ucp_worker_destroy(winfo->worker);\n+    free(winfo);\n+}\n+\n+/* -----------------------------------------------------------------------------\n+ * Worker Pool management functionality\n+ *----------------------------------------------------------------------------*/\n+\n+OPAL_DECLSPEC opal_common_ucx_wpool_t *\n+opal_common_ucx_wpool_allocate(void)\n+{\n+    opal_common_ucx_wpool_t *ptr = calloc(1, sizeof(opal_common_ucx_wpool_t));\n+    ptr->refcnt = 0;\n+\n+    WPOOL_DBG_OUT(_dbg_wpool, \"wpool = %p\\n\", (void *)ptr);\n+    return ptr;\n+}\n+\n+OPAL_DECLSPEC void\n+opal_common_ucx_wpool_free(opal_common_ucx_wpool_t *wpool)\n+{\n+    assert(wpool->refcnt == 0);\n+    WPOOL_DBG_OUT(_dbg_wpool, \"wpool = %p\\n\", (void *)wpool);\n+    free(wpool);\n+}\n+\n+OPAL_DECLSPEC int\n+opal_common_ucx_wpool_init(opal_common_ucx_wpool_t *wpool,\n+                           int proc_world_size, bool enable_mt)\n+{\n+    ucp_config_t *config = NULL;\n+    ucp_params_t context_params;\n+    opal_common_ucx_winfo_t *winfo;\n+    ucs_status_t status;\n+    int rc = OPAL_SUCCESS;\n+\n+    wpool->refcnt++;\n+    WPOOL_DBG_OUT(_dbg_wpool, \"wpool = %p, refctnrt = %d\\n\",\n+                  (void *)wpool, wpool->refcnt);\n+\n+    if (1 < wpool->refcnt) {\n+        return rc;\n+    }\n+\n+    OBJ_CONSTRUCT(&wpool->mutex, opal_recursive_mutex_t);\n+    OBJ_CONSTRUCT(&wpool->tls_list, opal_list_t);\n+\n+    status = ucp_config_read(\"MPI\", NULL, &config);\n+    if (UCS_OK != status) {\n+        MCA_COMMON_UCX_VERBOSE(1, \"ucp_config_read failed: %d\", status);\n+        return OPAL_ERROR;\n+    }\n+\n+    /* initialize UCP context */\n+    memset(&context_params, 0, sizeof(context_params));\n+    context_params.field_mask = UCP_PARAM_FIELD_FEATURES |\n+                                UCP_PARAM_FIELD_MT_WORKERS_SHARED |\n+                                UCP_PARAM_FIELD_ESTIMATED_NUM_EPS |\n+                                UCP_PARAM_FIELD_REQUEST_INIT |\n+                                UCP_PARAM_FIELD_REQUEST_SIZE;\n+    context_params.features = UCP_FEATURE_RMA | UCP_FEATURE_AMO32 |\n+                              UCP_FEATURE_AMO64;\n+    context_params.mt_workers_shared = (enable_mt ? 1 : 0);\n+    context_params.estimated_num_eps = proc_world_size;\n+    context_params.request_init = opal_common_ucx_req_init;\n+    context_params.request_size = sizeof(opal_common_ucx_request_t);\n+\n+    status = ucp_init(&context_params, config, &wpool->ucp_ctx);\n+    ucp_config_release(config);\n+    if (UCS_OK != status) {\n+        MCA_COMMON_UCX_VERBOSE(1, \"ucp_init failed: %d\", status);\n+        rc = OPAL_ERROR;\n+        goto err_ucp_init;\n+    }\n+\n+    /* create recv worker and add to idle pool */\n+    OBJ_CONSTRUCT(&wpool->idle_workers, opal_list_t);\n+    OBJ_CONSTRUCT(&wpool->active_workers, opal_list_t);\n+\n+    winfo = _winfo_create(wpool);\n+    if (NULL == winfo) {\n+        MCA_COMMON_UCX_ERROR(\"Failed to create receive worker\");\n+        rc = OPAL_ERROR;\n+        goto err_worker_create;\n+    }\n+    wpool->recv_worker = winfo->worker;\n+\n+    status = ucp_worker_get_address(wpool->recv_worker,\n+                                    &wpool->recv_waddr, &wpool->recv_waddr_len);\n+    if (status != UCS_OK) {\n+        MCA_COMMON_UCX_VERBOSE(1, \"ucp_worker_get_address failed: %d\", status);\n+        rc = OPAL_ERROR;\n+        goto err_get_addr;\n+    }\n+\n+    rc = _wpool_list_put(wpool, &wpool->idle_workers, winfo);\n+    if (rc) {\n+        goto err_wpool_add;\n+    }\n+\n+    pthread_key_create(&wpool->tls_key, _tlocal_cleanup);","path":"opal/mca/common/ucx/common_ucx_wpool.c","position":214,"original_position":214,"commit_id":"95f194af3dd51aee05c917890b05b74d685253e1","original_commit_id":"1b40680b79f1dc090ba4cd163e7ccf40337d0938","user":{"login":"artpol84","id":7534910,"node_id":"MDQ6VXNlcjc1MzQ5MTA=","avatar_url":"https://avatars1.githubusercontent.com/u/7534910?v=4","gravatar_id":"","url":"https://api.github.com/users/artpol84","html_url":"https://github.com/artpol84","followers_url":"https://api.github.com/users/artpol84/followers","following_url":"https://api.github.com/users/artpol84/following{/other_user}","gists_url":"https://api.github.com/users/artpol84/gists{/gist_id}","starred_url":"https://api.github.com/users/artpol84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artpol84/subscriptions","organizations_url":"https://api.github.com/users/artpol84/orgs","repos_url":"https://api.github.com/users/artpol84/repos","events_url":"https://api.github.com/users/artpol84/events{/privacy}","received_events_url":"https://api.github.com/users/artpol84/received_events","type":"User","site_admin":false},"body":"> Also note that pthreads does not call the teardown function for the main thread so anything you allocate for it is leaked if you do not call the teardown for that context separately.\r\n\r\nWe cleanup all unreleased resources at the worker pool finalize (as we keep track of all TLS pointers there) [ [link](https://github.com/open-mpi/ompi/pull/6163/files#diff-9227c793e9006a6483ac7a7479b6bbe7R249) ]\r\nWe also considered the case where threads are still active when MPI_Finalize is called and we still have to cleanup.\r\n\r\n> No, you can't use C11 TLS in a structure. You can, however, use opal/tsd to register a cleanup function for anything you put in C11 TLS. That way you still get fast loading of TLS but still get the teardown functionality of pthreads. \r\n\r\nSo we will have to maintain some sort of the table and map the structures tere by the index. Is that correct?\r\nThis will probably be beneficial if something else instead of pthreads is used to implement SW treads.\r\n\r\n>  You can, however, use opal/tsd to register a cleanup function for anything you put in C11 TLS.\r\n\r\nIn the wpool cleanup we currently call pthread_key_deregister and this ensures that if a therad exiting in parallel with MPI_Finalize call there will be no race condition between thread cleanup callback and `opal_common_ucx_wpool_finalize`. Does `opal/tsd` provides this kind of a guarantee?\r\n\r\n","created_at":"2018-12-21T01:34:21Z","updated_at":"2018-12-21T01:34:21Z","html_url":"https://github.com/open-mpi/ompi/pull/6163#discussion_r243468008","pull_request_url":"https://api.github.com/repos/open-mpi/ompi/pulls/6163","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/open-mpi/ompi/pulls/comments/243468008"},"html":{"href":"https://github.com/open-mpi/ompi/pull/6163#discussion_r243468008"},"pull_request":{"href":"https://api.github.com/repos/open-mpi/ompi/pulls/6163"}},"in_reply_to_id":241045629},"pull_request":{"url":"https://api.github.com/repos/open-mpi/ompi/pulls/6163","id":236757333,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM2NzU3MzMz","html_url":"https://github.com/open-mpi/ompi/pull/6163","diff_url":"https://github.com/open-mpi/ompi/pull/6163.diff","patch_url":"https://github.com/open-mpi/ompi/pull/6163.patch","issue_url":"https://api.github.com/repos/open-mpi/ompi/issues/6163","number":6163,"state":"open","locked":false,"title":"Refactoring of osc/ucx component for MT","user":{"login":"artpol84","id":7534910,"node_id":"MDQ6VXNlcjc1MzQ5MTA=","avatar_url":"https://avatars1.githubusercontent.com/u/7534910?v=4","gravatar_id":"","url":"https://api.github.com/users/artpol84","html_url":"https://github.com/artpol84","followers_url":"https://api.github.com/users/artpol84/followers","following_url":"https://api.github.com/users/artpol84/following{/other_user}","gists_url":"https://api.github.com/users/artpol84/gists{/gist_id}","starred_url":"https://api.github.com/users/artpol84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artpol84/subscriptions","organizations_url":"https://api.github.com/users/artpol84/orgs","repos_url":"https://api.github.com/users/artpol84/repos","events_url":"https://api.github.com/users/artpol84/events{/privacy}","received_events_url":"https://api.github.com/users/artpol84/received_events","type":"User","site_admin":false},"body":"This is the first take on osc/ucx optimization. Targeted optimizations will follow.","created_at":"2018-12-07T05:17:32Z","updated_at":"2018-12-21T01:34:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bbbb2027add573630dd337c2dcd4a61e60a55693","assignee":{"login":"artpol84","id":7534910,"node_id":"MDQ6VXNlcjc1MzQ5MTA=","avatar_url":"https://avatars1.githubusercontent.com/u/7534910?v=4","gravatar_id":"","url":"https://api.github.com/users/artpol84","html_url":"https://github.com/artpol84","followers_url":"https://api.github.com/users/artpol84/followers","following_url":"https://api.github.com/users/artpol84/following{/other_user}","gists_url":"https://api.github.com/users/artpol84/gists{/gist_id}","starred_url":"https://api.github.com/users/artpol84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artpol84/subscriptions","organizations_url":"https://api.github.com/users/artpol84/orgs","repos_url":"https://api.github.com/users/artpol84/repos","events_url":"https://api.github.com/users/artpol84/events{/privacy}","received_events_url":"https://api.github.com/users/artpol84/received_events","type":"User","site_admin":false},"assignees":[{"login":"artpol84","id":7534910,"node_id":"MDQ6VXNlcjc1MzQ5MTA=","avatar_url":"https://avatars1.githubusercontent.com/u/7534910?v=4","gravatar_id":"","url":"https://api.github.com/users/artpol84","html_url":"https://github.com/artpol84","followers_url":"https://api.github.com/users/artpol84/followers","following_url":"https://api.github.com/users/artpol84/following{/other_user}","gists_url":"https://api.github.com/users/artpol84/gists{/gist_id}","starred_url":"https://api.github.com/users/artpol84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artpol84/subscriptions","organizations_url":"https://api.github.com/users/artpol84/orgs","repos_url":"https://api.github.com/users/artpol84/repos","events_url":"https://api.github.com/users/artpol84/events{/privacy}","received_events_url":"https://api.github.com/users/artpol84/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"yosefe","id":2255631,"node_id":"MDQ6VXNlcjIyNTU2MzE=","avatar_url":"https://avatars0.githubusercontent.com/u/2255631?v=4","gravatar_id":"","url":"https://api.github.com/users/yosefe","html_url":"https://github.com/yosefe","followers_url":"https://api.github.com/users/yosefe/followers","following_url":"https://api.github.com/users/yosefe/following{/other_user}","gists_url":"https://api.github.com/users/yosefe/gists{/gist_id}","starred_url":"https://api.github.com/users/yosefe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yosefe/subscriptions","organizations_url":"https://api.github.com/users/yosefe/orgs","repos_url":"https://api.github.com/users/yosefe/repos","events_url":"https://api.github.com/users/yosefe/events{/privacy}","received_events_url":"https://api.github.com/users/yosefe/received_events","type":"User","site_admin":false},{"login":"jladd-mlnx","id":8029820,"node_id":"MDQ6VXNlcjgwMjk4MjA=","avatar_url":"https://avatars3.githubusercontent.com/u/8029820?v=4","gravatar_id":"","url":"https://api.github.com/users/jladd-mlnx","html_url":"https://github.com/jladd-mlnx","followers_url":"https://api.github.com/users/jladd-mlnx/followers","following_url":"https://api.github.com/users/jladd-mlnx/following{/other_user}","gists_url":"https://api.github.com/users/jladd-mlnx/gists{/gist_id}","starred_url":"https://api.github.com/users/jladd-mlnx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jladd-mlnx/subscriptions","organizations_url":"https://api.github.com/users/jladd-mlnx/orgs","repos_url":"https://api.github.com/users/jladd-mlnx/repos","events_url":"https://api.github.com/users/jladd-mlnx/events{/privacy}","received_events_url":"https://api.github.com/users/jladd-mlnx/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":129984009,"node_id":"MDU6TGFiZWwxMjk5ODQwMDk=","url":"https://api.github.com/repos/open-mpi/ompi/labels/enhancement","name":"enhancement","color":"84b6eb","default":true},{"id":353324085,"node_id":"MDU6TGFiZWwzNTMzMjQwODU=","url":"https://api.github.com/repos/open-mpi/ompi/labels/%E2%9A%A0%EF%B8%8F%20WIP-DNM!","name":"⚠️ WIP-DNM!","color":"d93f0b","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/open-mpi/ompi/pulls/6163/commits","review_comments_url":"https://api.github.com/repos/open-mpi/ompi/pulls/6163/comments","review_comment_url":"https://api.github.com/repos/open-mpi/ompi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/open-mpi/ompi/issues/6163/comments","statuses_url":"https://api.github.com/repos/open-mpi/ompi/statuses/95f194af3dd51aee05c917890b05b74d685253e1","head":{"label":"artpol84:osc/mt_submission","ref":"osc/mt_submission","sha":"95f194af3dd51aee05c917890b05b74d685253e1","user":{"login":"artpol84","id":7534910,"node_id":"MDQ6VXNlcjc1MzQ5MTA=","avatar_url":"https://avatars1.githubusercontent.com/u/7534910?v=4","gravatar_id":"","url":"https://api.github.com/users/artpol84","html_url":"https://github.com/artpol84","followers_url":"https://api.github.com/users/artpol84/followers","following_url":"https://api.github.com/users/artpol84/following{/other_user}","gists_url":"https://api.github.com/users/artpol84/gists{/gist_id}","starred_url":"https://api.github.com/users/artpol84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artpol84/subscriptions","organizations_url":"https://api.github.com/users/artpol84/orgs","repos_url":"https://api.github.com/users/artpol84/repos","events_url":"https://api.github.com/users/artpol84/events{/privacy}","received_events_url":"https://api.github.com/users/artpol84/received_events","type":"User","site_admin":false},"repo":{"id":24966892,"node_id":"MDEwOlJlcG9zaXRvcnkyNDk2Njg5Mg==","name":"ompi","full_name":"artpol84/ompi","private":false,"owner":{"login":"artpol84","id":7534910,"node_id":"MDQ6VXNlcjc1MzQ5MTA=","avatar_url":"https://avatars1.githubusercontent.com/u/7534910?v=4","gravatar_id":"","url":"https://api.github.com/users/artpol84","html_url":"https://github.com/artpol84","followers_url":"https://api.github.com/users/artpol84/followers","following_url":"https://api.github.com/users/artpol84/following{/other_user}","gists_url":"https://api.github.com/users/artpol84/gists{/gist_id}","starred_url":"https://api.github.com/users/artpol84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artpol84/subscriptions","organizations_url":"https://api.github.com/users/artpol84/orgs","repos_url":"https://api.github.com/users/artpol84/repos","events_url":"https://api.github.com/users/artpol84/events{/privacy}","received_events_url":"https://api.github.com/users/artpol84/received_events","type":"User","site_admin":false},"html_url":"https://github.com/artpol84/ompi","description":"Open MPI main development repository","fork":true,"url":"https://api.github.com/repos/artpol84/ompi","forks_url":"https://api.github.com/repos/artpol84/ompi/forks","keys_url":"https://api.github.com/repos/artpol84/ompi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/artpol84/ompi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/artpol84/ompi/teams","hooks_url":"https://api.github.com/repos/artpol84/ompi/hooks","issue_events_url":"https://api.github.com/repos/artpol84/ompi/issues/events{/number}","events_url":"https://api.github.com/repos/artpol84/ompi/events","assignees_url":"https://api.github.com/repos/artpol84/ompi/assignees{/user}","branches_url":"https://api.github.com/repos/artpol84/ompi/branches{/branch}","tags_url":"https://api.github.com/repos/artpol84/ompi/tags","blobs_url":"https://api.github.com/repos/artpol84/ompi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/artpol84/ompi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/artpol84/ompi/git/refs{/sha}","trees_url":"https://api.github.com/repos/artpol84/ompi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/artpol84/ompi/statuses/{sha}","languages_url":"https://api.github.com/repos/artpol84/ompi/languages","stargazers_url":"https://api.github.com/repos/artpol84/ompi/stargazers","contributors_url":"https://api.github.com/repos/artpol84/ompi/contributors","subscribers_url":"https://api.github.com/repos/artpol84/ompi/subscribers","subscription_url":"https://api.github.com/repos/artpol84/ompi/subscription","commits_url":"https://api.github.com/repos/artpol84/ompi/commits{/sha}","git_commits_url":"https://api.github.com/repos/artpol84/ompi/git/commits{/sha}","comments_url":"https://api.github.com/repos/artpol84/ompi/comments{/number}","issue_comment_url":"https://api.github.com/repos/artpol84/ompi/issues/comments{/number}","contents_url":"https://api.github.com/repos/artpol84/ompi/contents/{+path}","compare_url":"https://api.github.com/repos/artpol84/ompi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/artpol84/ompi/merges","archive_url":"https://api.github.com/repos/artpol84/ompi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/artpol84/ompi/downloads","issues_url":"https://api.github.com/repos/artpol84/ompi/issues{/number}","pulls_url":"https://api.github.com/repos/artpol84/ompi/pulls{/number}","milestones_url":"https://api.github.com/repos/artpol84/ompi/milestones{/number}","notifications_url":"https://api.github.com/repos/artpol84/ompi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/artpol84/ompi/labels{/name}","releases_url":"https://api.github.com/repos/artpol84/ompi/releases{/id}","deployments_url":"https://api.github.com/repos/artpol84/ompi/deployments","created_at":"2014-10-09T00:28:51Z","updated_at":"2016-11-23T18:01:58Z","pushed_at":"2018-12-20T10:30:22Z","git_url":"git://github.com/artpol84/ompi.git","ssh_url":"git@github.com:artpol84/ompi.git","clone_url":"https://github.com/artpol84/ompi.git","svn_url":"https://github.com/artpol84/ompi","homepage":null,"size":110186,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"open-mpi:master","ref":"master","sha":"cf49957af64eba44c29f335b9b0588dbdadb504a","user":{"login":"open-mpi","id":2165682,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxNjU2ODI=","avatar_url":"https://avatars1.githubusercontent.com/u/2165682?v=4","gravatar_id":"","url":"https://api.github.com/users/open-mpi","html_url":"https://github.com/open-mpi","followers_url":"https://api.github.com/users/open-mpi/followers","following_url":"https://api.github.com/users/open-mpi/following{/other_user}","gists_url":"https://api.github.com/users/open-mpi/gists{/gist_id}","starred_url":"https://api.github.com/users/open-mpi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-mpi/subscriptions","organizations_url":"https://api.github.com/users/open-mpi/orgs","repos_url":"https://api.github.com/users/open-mpi/repos","events_url":"https://api.github.com/users/open-mpi/events{/privacy}","received_events_url":"https://api.github.com/users/open-mpi/received_events","type":"Organization","site_admin":false},"repo":{"id":24107001,"node_id":"MDEwOlJlcG9zaXRvcnkyNDEwNzAwMQ==","name":"ompi","full_name":"open-mpi/ompi","private":false,"owner":{"login":"open-mpi","id":2165682,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxNjU2ODI=","avatar_url":"https://avatars1.githubusercontent.com/u/2165682?v=4","gravatar_id":"","url":"https://api.github.com/users/open-mpi","html_url":"https://github.com/open-mpi","followers_url":"https://api.github.com/users/open-mpi/followers","following_url":"https://api.github.com/users/open-mpi/following{/other_user}","gists_url":"https://api.github.com/users/open-mpi/gists{/gist_id}","starred_url":"https://api.github.com/users/open-mpi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-mpi/subscriptions","organizations_url":"https://api.github.com/users/open-mpi/orgs","repos_url":"https://api.github.com/users/open-mpi/repos","events_url":"https://api.github.com/users/open-mpi/events{/privacy}","received_events_url":"https://api.github.com/users/open-mpi/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/open-mpi/ompi","description":"Open MPI main development repository","fork":false,"url":"https://api.github.com/repos/open-mpi/ompi","forks_url":"https://api.github.com/repos/open-mpi/ompi/forks","keys_url":"https://api.github.com/repos/open-mpi/ompi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/open-mpi/ompi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/open-mpi/ompi/teams","hooks_url":"https://api.github.com/repos/open-mpi/ompi/hooks","issue_events_url":"https://api.github.com/repos/open-mpi/ompi/issues/events{/number}","events_url":"https://api.github.com/repos/open-mpi/ompi/events","assignees_url":"https://api.github.com/repos/open-mpi/ompi/assignees{/user}","branches_url":"https://api.github.com/repos/open-mpi/ompi/branches{/branch}","tags_url":"https://api.github.com/repos/open-mpi/ompi/tags","blobs_url":"https://api.github.com/repos/open-mpi/ompi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/open-mpi/ompi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/open-mpi/ompi/git/refs{/sha}","trees_url":"https://api.github.com/repos/open-mpi/ompi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/open-mpi/ompi/statuses/{sha}","languages_url":"https://api.github.com/repos/open-mpi/ompi/languages","stargazers_url":"https://api.github.com/repos/open-mpi/ompi/stargazers","contributors_url":"https://api.github.com/repos/open-mpi/ompi/contributors","subscribers_url":"https://api.github.com/repos/open-mpi/ompi/subscribers","subscription_url":"https://api.github.com/repos/open-mpi/ompi/subscription","commits_url":"https://api.github.com/repos/open-mpi/ompi/commits{/sha}","git_commits_url":"https://api.github.com/repos/open-mpi/ompi/git/commits{/sha}","comments_url":"https://api.github.com/repos/open-mpi/ompi/comments{/number}","issue_comment_url":"https://api.github.com/repos/open-mpi/ompi/issues/comments{/number}","contents_url":"https://api.github.com/repos/open-mpi/ompi/contents/{+path}","compare_url":"https://api.github.com/repos/open-mpi/ompi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/open-mpi/ompi/merges","archive_url":"https://api.github.com/repos/open-mpi/ompi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/open-mpi/ompi/downloads","issues_url":"https://api.github.com/repos/open-mpi/ompi/issues{/number}","pulls_url":"https://api.github.com/repos/open-mpi/ompi/pulls{/number}","milestones_url":"https://api.github.com/repos/open-mpi/ompi/milestones{/number}","notifications_url":"https://api.github.com/repos/open-mpi/ompi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/open-mpi/ompi/labels{/name}","releases_url":"https://api.github.com/repos/open-mpi/ompi/releases{/id}","deployments_url":"https://api.github.com/repos/open-mpi/ompi/deployments","created_at":"2014-09-16T16:08:30Z","updated_at":"2018-12-20T20:20:49Z","pushed_at":"2018-12-20T21:33:24Z","git_url":"git://github.com/open-mpi/ompi.git","ssh_url":"git@github.com:open-mpi/ompi.git","clone_url":"https://github.com/open-mpi/ompi.git","svn_url":"https://github.com/open-mpi/ompi","homepage":null,"size":120419,"stargazers_count":670,"watchers_count":670,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":368,"mirror_url":null,"archived":false,"open_issues_count":394,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":368,"open_issues":394,"watchers":670,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/open-mpi/ompi/pulls/6163"},"html":{"href":"https://github.com/open-mpi/ompi/pull/6163"},"issue":{"href":"https://api.github.com/repos/open-mpi/ompi/issues/6163"},"comments":{"href":"https://api.github.com/repos/open-mpi/ompi/issues/6163/comments"},"review_comments":{"href":"https://api.github.com/repos/open-mpi/ompi/pulls/6163/comments"},"review_comment":{"href":"https://api.github.com/repos/open-mpi/ompi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/open-mpi/ompi/pulls/6163/commits"},"statuses":{"href":"https://api.github.com/repos/open-mpi/ompi/statuses/95f194af3dd51aee05c917890b05b74d685253e1"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"artpol84"}}