{"action":"created","comment":{"url":"https://api.github.com/repos/mono/debugger-libs/pulls/comments/95749203","pull_request_review_id":16313121,"id":95749203,"diff_hunk":"@@ -27,215 +27,172 @@\n \n using System;\n using System.Collections.Generic;\n-using ST = System.Threading;\n+using System.Linq;\n+using System.Threading;\n+using System.Threading.Tasks;\n using Mono.Debugging.Client;\n \n namespace Mono.Debugging.Evaluation\n {\n-\tpublic class AsyncOperationManager: IDisposable\n+\tpublic class AsyncOperationManager : IDisposable\n \t{\n-\t\tList<AsyncOperation> operationsToCancel = new List<AsyncOperation> ();\n-\t\tinternal bool Disposing;\n-\n-\t\tpublic void Invoke (AsyncOperation methodCall, int timeout)\n+\t\tclass OperationData\n \t\t{\n-\t\t\tmethodCall.Aborted = false;\n-\t\t\tmethodCall.Manager = this;\n+\t\t\tpublic IAsyncOperationBase Operation { get; private set; }\n+\t\t\tpublic CancellationTokenSource TokenSource { get; private set; }\n \n-\t\t\tlock (operationsToCancel) {\n-\t\t\t\toperationsToCancel.Add (methodCall);\n-\t\t\t\tmethodCall.Invoke ();\n+\t\t\tpublic OperationData (IAsyncOperationBase operation, CancellationTokenSource tokenSource)\n+\t\t\t{\n+\t\t\t\tOperation = operation;\n+\t\t\t\tTokenSource = tokenSource;\n \t\t\t}\n+\t\t}\n \n-\t\t\tif (timeout > 0) {\n-\t\t\t\tif (!methodCall.WaitForCompleted (timeout)) {\n-\t\t\t\t\tbool wasAborted = methodCall.Aborted;\n-\t\t\t\t\tmethodCall.InternalAbort ();\n-\t\t\t\t\tlock (operationsToCancel) {\n-\t\t\t\t\t\toperationsToCancel.Remove (methodCall);\n-\t\t\t\t\t\tST.Monitor.PulseAll (operationsToCancel);\n-\t\t\t\t\t}\n-\t\t\t\t\tif (wasAborted)\n-\t\t\t\t\t\tthrow new EvaluatorAbortedException ();\n-\t\t\t\t\telse\n-\t\t\t\t\t\tthrow new TimeOutException ();\n+\t\treadonly HashSet<OperationData> currentOperations = new HashSet<OperationData> ();\n+\t\tbool disposed = false;\n+\t\tconst int ShortCancelTimeout = 100;\n+\t\tconst int LongCancelTimeout = 1000;\n+\n+\t\tstatic bool IsOperationCancelledException (Exception e, int depth = 4)\n+\t\t{\n+\t\t\tif (e is OperationCanceledException)\n+\t\t\t\treturn true;\n+\t\t\tvar aggregateException = e as AggregateException;\n+\n+\t\t\tif (depth > 0 && aggregateException != null) {\n+\t\t\t\tforeach (var innerException in aggregateException.InnerExceptions) {\n+\t\t\t\t\tif (IsOperationCancelledException (innerException, depth - 1))\n+\t\t\t\t\t\treturn true;\n \t\t\t\t}\n \t\t\t}\n-\t\t\telse {\n-\t\t\t\tmethodCall.WaitForCompleted (System.Threading.Timeout.Infinite);\n+\t\t\treturn false;\n+\t\t}\n+\n+\t\tpublic OperationResult<TValue> Invoke<TValue> (AsyncOperationBase<TValue> mc, int timeout)\n+\t\t{\n+\t\t\tif (timeout <= 0)\n+\t\t\t\tthrow new ArgumentOutOfRangeException(\"timeout\", timeout, \"timeout must be greater than 0\");\n+\n+\t\t\tTask<OperationResult<TValue>> task;\n+\t\t\tvar description = mc.Description;\n+\t\t\tvar cts = new CancellationTokenSource ();\n+\t\t\tvar operationData = new OperationData (mc, cts);\n+\t\t\tlock (currentOperations) {\n+\t\t\t\tif (disposed)\n+\t\t\t\t\tthrow new ObjectDisposedException (\"Already disposed\");\n+\t\t\t\tDebuggerLoggingService.LogMessage (string.Format(\"Starting invoke for {0}\", description));\n+\t\t\t\ttask = mc.InvokeAsync (cts.Token);\n+\t\t\t\tcurrentOperations.Add (operationData);\n \t\t\t}\n \n-\t\t\tlock (operationsToCancel) {\n-\t\t\t\toperationsToCancel.Remove (methodCall);\n-\t\t\t\tST.Monitor.PulseAll (operationsToCancel);\n-\t\t\t\tif (methodCall.Aborted) {\n+\t\t\tbool cancelledAfterTimeout = false;\n+\t\t\ttry {\n+\t\t\t\tif (task.Wait (timeout)) {\n+\t\t\t\t\tDebuggerLoggingService.LogMessage (string.Format (\"Invoke {0} succeeded in {1} ms\", description, timeout));\n+\t\t\t\t\treturn task.Result;\n+\t\t\t\t}\n+\t\t\t\tDebuggerLoggingService.LogMessage (string.Format (\"Invoke {0} timed out after {1} ms. Cancelling.\", description, timeout));\n+\t\t\t\tcts.Cancel ();\n+\t\t\t\ttry {\n+\t\t\t\t\tWaitAfterCancel (mc);\n+\t\t\t\t}\n+\t\t\t\tcatch (Exception e) {\n+\t\t\t\t\tif (IsOperationCancelledException (e)) {\n+\t\t\t\t\t\tDebuggerLoggingService.LogMessage (string.Format (\"Invoke {0} was cancelled after timeout\", description));\n+\t\t\t\t\t\tcancelledAfterTimeout = true;\n+\t\t\t\t\t}\n+\t\t\t\t\tthrow;\n+\t\t\t\t}\n+\t\t\t\tDebuggerLoggingService.LogMessage (string.Format (\"{0} cancelling timed out\", description));\n+\t\t\t\tthrow new TimeOutException ();\n+\t\t\t}\n+\t\t\tcatch (Exception e) {\n+\t\t\t\tif (IsOperationCancelledException (e)) {\n+\t\t\t\t\tif (cancelledAfterTimeout)\n+\t\t\t\t\t\tthrow new TimeOutException ();\n+\t\t\t\t\tDebuggerLoggingService.LogMessage (string.Format (\"Invoke {0} was cancelled outside before timeout\", description));\n \t\t\t\t\tthrow new EvaluatorAbortedException ();\n \t\t\t\t}\n+\t\t\t\tthrow;\n \t\t\t}\n-\n-\t\t\tif (!string.IsNullOrEmpty (methodCall.ExceptionMessage)) {\n-\t\t\t\tthrow new Exception (methodCall.ExceptionMessage);\n+\t\t\tfinally {\n+\t\t\t\tlock (currentOperations) {\n+\t\t\t\t\tcurrentOperations.Remove (operationData);\n+\t\t\t\t}\n \t\t\t}\n \t\t}\n-\t\t\n-\t\tpublic void Dispose ()\n+\n+\n+\t\tpublic event EventHandler<BusyStateEventArgs> BusyStateChanged = delegate {  };\n+\n+\t\tvoid WaitAfterCancel (IAsyncOperationBase op)\n \t\t{\n-\t\t\tDisposing = true;\n-\t\t\tlock (operationsToCancel) {\n-\t\t\t\tforeach (AsyncOperation op in operationsToCancel) {\n-\t\t\t\t\top.InternalShutdown ();","path":"Mono.Debugging/Mono.Debugging.Evaluation/AsyncOperationManager.cs","position":141,"original_position":141,"commit_id":"bc201d11c92fb0aa5a04560b70a6b389e91aa7ed","original_commit_id":"0657baa7a1c7a6d65831bdfb71a4fbf2d8d87756","user":{"login":"slluis","id":260349,"avatar_url":"https://avatars.githubusercontent.com/u/260349?v=3","gravatar_id":"","url":"https://api.github.com/users/slluis","html_url":"https://github.com/slluis","followers_url":"https://api.github.com/users/slluis/followers","following_url":"https://api.github.com/users/slluis/following{/other_user}","gists_url":"https://api.github.com/users/slluis/gists{/gist_id}","starred_url":"https://api.github.com/users/slluis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slluis/subscriptions","organizations_url":"https://api.github.com/users/slluis/orgs","repos_url":"https://api.github.com/users/slluis/repos","events_url":"https://api.github.com/users/slluis/events{/privacy}","received_events_url":"https://api.github.com/users/slluis/received_events","type":"User","site_admin":false},"body":"If the .Abort() call on the invocation fails, or can't be completed (it can happen, that's why there is all that abort retry and debugger busy mode infrastructure), then the invocation will never end, and EvaluationAbortedException will never be thrown.","created_at":"2017-01-12T09:14:30Z","updated_at":"2017-01-12T09:14:30Z","html_url":"https://github.com/mono/debugger-libs/pull/85#discussion_r95749203","pull_request_url":"https://api.github.com/repos/mono/debugger-libs/pulls/85","_links":{"self":{"href":"https://api.github.com/repos/mono/debugger-libs/pulls/comments/95749203"},"html":{"href":"https://github.com/mono/debugger-libs/pull/85#discussion_r95749203"},"pull_request":{"href":"https://api.github.com/repos/mono/debugger-libs/pulls/85"}}},"pull_request":{"url":"https://api.github.com/repos/mono/debugger-libs/pulls/85","id":98784643,"html_url":"https://github.com/mono/debugger-libs/pull/85","diff_url":"https://github.com/mono/debugger-libs/pull/85.diff","patch_url":"https://github.com/mono/debugger-libs/pull/85.patch","issue_url":"https://api.github.com/repos/mono/debugger-libs/issues/85","number":85,"state":"open","locked":false,"title":"Invocations refactoring","user":{"login":"nerzhulart","id":623624,"avatar_url":"https://avatars.githubusercontent.com/u/623624?v=3","gravatar_id":"","url":"https://api.github.com/users/nerzhulart","html_url":"https://github.com/nerzhulart","followers_url":"https://api.github.com/users/nerzhulart/followers","following_url":"https://api.github.com/users/nerzhulart/following{/other_user}","gists_url":"https://api.github.com/users/nerzhulart/gists{/gist_id}","starred_url":"https://api.github.com/users/nerzhulart/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nerzhulart/subscriptions","organizations_url":"https://api.github.com/users/nerzhulart/orgs","repos_url":"https://api.github.com/users/nerzhulart/repos","events_url":"https://api.github.com/users/nerzhulart/events{/privacy}","received_events_url":"https://api.github.com/users/nerzhulart/received_events","type":"User","site_admin":false},"body":"This refactoring originally was started to fix multiple deadlocks in AsyncOperationManager.\r\nAfter some investigation I've decided to rewrite all of this code to .net Task API to avoid syncronization issues caused by bad desing and wrong using of ManualResetEvents everywhere.\r\nThe main changes:\r\n* I'ive introduced a new EvaluatorExceptionThrownException that wraps target exception object and allows to inspect this object in watch pad when your eval has thrown an exception.\r\n* AsyncOperationManager.Invoke is explicitly synchronous now and returns OperationResult<T>. Also it was synchronous before as well, but returned void and the call site had to obtain the result in other field and it was complicated.\r\n* I've added a lot of logging into this code\r\n\r\nAfter this PR merged I'm going to add the second counterpart PR in monodevelop repo to supply these changes for CorDebug","created_at":"2016-12-20T16:48:01Z","updated_at":"2017-01-12T09:14:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2fe8396f6441bf246f29e8f1771e86266d51858b","assignee":{"login":"slluis","id":260349,"avatar_url":"https://avatars.githubusercontent.com/u/260349?v=3","gravatar_id":"","url":"https://api.github.com/users/slluis","html_url":"https://github.com/slluis","followers_url":"https://api.github.com/users/slluis/followers","following_url":"https://api.github.com/users/slluis/following{/other_user}","gists_url":"https://api.github.com/users/slluis/gists{/gist_id}","starred_url":"https://api.github.com/users/slluis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slluis/subscriptions","organizations_url":"https://api.github.com/users/slluis/orgs","repos_url":"https://api.github.com/users/slluis/repos","events_url":"https://api.github.com/users/slluis/events{/privacy}","received_events_url":"https://api.github.com/users/slluis/received_events","type":"User","site_admin":false},"assignees":[{"login":"slluis","id":260349,"avatar_url":"https://avatars.githubusercontent.com/u/260349?v=3","gravatar_id":"","url":"https://api.github.com/users/slluis","html_url":"https://github.com/slluis","followers_url":"https://api.github.com/users/slluis/followers","following_url":"https://api.github.com/users/slluis/following{/other_user}","gists_url":"https://api.github.com/users/slluis/gists{/gist_id}","starred_url":"https://api.github.com/users/slluis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slluis/subscriptions","organizations_url":"https://api.github.com/users/slluis/orgs","repos_url":"https://api.github.com/users/slluis/repos","events_url":"https://api.github.com/users/slluis/events{/privacy}","received_events_url":"https://api.github.com/users/slluis/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/mono/debugger-libs/pulls/85/commits","review_comments_url":"https://api.github.com/repos/mono/debugger-libs/pulls/85/comments","review_comment_url":"https://api.github.com/repos/mono/debugger-libs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mono/debugger-libs/issues/85/comments","statuses_url":"https://api.github.com/repos/mono/debugger-libs/statuses/bc201d11c92fb0aa5a04560b70a6b389e91aa7ed","head":{"label":"JetBrains:invocationsRefactoring","ref":"invocationsRefactoring","sha":"bc201d11c92fb0aa5a04560b70a6b389e91aa7ed","user":{"login":"JetBrains","id":878437,"avatar_url":"https://avatars.githubusercontent.com/u/878437?v=3","gravatar_id":"","url":"https://api.github.com/users/JetBrains","html_url":"https://github.com/JetBrains","followers_url":"https://api.github.com/users/JetBrains/followers","following_url":"https://api.github.com/users/JetBrains/following{/other_user}","gists_url":"https://api.github.com/users/JetBrains/gists{/gist_id}","starred_url":"https://api.github.com/users/JetBrains/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JetBrains/subscriptions","organizations_url":"https://api.github.com/users/JetBrains/orgs","repos_url":"https://api.github.com/users/JetBrains/repos","events_url":"https://api.github.com/users/JetBrains/events{/privacy}","received_events_url":"https://api.github.com/users/JetBrains/received_events","type":"Organization","site_admin":false},"repo":{"id":55802278,"name":"debugger-libs","full_name":"JetBrains/debugger-libs","owner":{"login":"JetBrains","id":878437,"avatar_url":"https://avatars.githubusercontent.com/u/878437?v=3","gravatar_id":"","url":"https://api.github.com/users/JetBrains","html_url":"https://github.com/JetBrains","followers_url":"https://api.github.com/users/JetBrains/followers","following_url":"https://api.github.com/users/JetBrains/following{/other_user}","gists_url":"https://api.github.com/users/JetBrains/gists{/gist_id}","starred_url":"https://api.github.com/users/JetBrains/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JetBrains/subscriptions","organizations_url":"https://api.github.com/users/JetBrains/orgs","repos_url":"https://api.github.com/users/JetBrains/repos","events_url":"https://api.github.com/users/JetBrains/events{/privacy}","received_events_url":"https://api.github.com/users/JetBrains/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/JetBrains/debugger-libs","description":"Debugger libraries","fork":true,"url":"https://api.github.com/repos/JetBrains/debugger-libs","forks_url":"https://api.github.com/repos/JetBrains/debugger-libs/forks","keys_url":"https://api.github.com/repos/JetBrains/debugger-libs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JetBrains/debugger-libs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JetBrains/debugger-libs/teams","hooks_url":"https://api.github.com/repos/JetBrains/debugger-libs/hooks","issue_events_url":"https://api.github.com/repos/JetBrains/debugger-libs/issues/events{/number}","events_url":"https://api.github.com/repos/JetBrains/debugger-libs/events","assignees_url":"https://api.github.com/repos/JetBrains/debugger-libs/assignees{/user}","branches_url":"https://api.github.com/repos/JetBrains/debugger-libs/branches{/branch}","tags_url":"https://api.github.com/repos/JetBrains/debugger-libs/tags","blobs_url":"https://api.github.com/repos/JetBrains/debugger-libs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JetBrains/debugger-libs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JetBrains/debugger-libs/git/refs{/sha}","trees_url":"https://api.github.com/repos/JetBrains/debugger-libs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JetBrains/debugger-libs/statuses/{sha}","languages_url":"https://api.github.com/repos/JetBrains/debugger-libs/languages","stargazers_url":"https://api.github.com/repos/JetBrains/debugger-libs/stargazers","contributors_url":"https://api.github.com/repos/JetBrains/debugger-libs/contributors","subscribers_url":"https://api.github.com/repos/JetBrains/debugger-libs/subscribers","subscription_url":"https://api.github.com/repos/JetBrains/debugger-libs/subscription","commits_url":"https://api.github.com/repos/JetBrains/debugger-libs/commits{/sha}","git_commits_url":"https://api.github.com/repos/JetBrains/debugger-libs/git/commits{/sha}","comments_url":"https://api.github.com/repos/JetBrains/debugger-libs/comments{/number}","issue_comment_url":"https://api.github.com/repos/JetBrains/debugger-libs/issues/comments{/number}","contents_url":"https://api.github.com/repos/JetBrains/debugger-libs/contents/{+path}","compare_url":"https://api.github.com/repos/JetBrains/debugger-libs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JetBrains/debugger-libs/merges","archive_url":"https://api.github.com/repos/JetBrains/debugger-libs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JetBrains/debugger-libs/downloads","issues_url":"https://api.github.com/repos/JetBrains/debugger-libs/issues{/number}","pulls_url":"https://api.github.com/repos/JetBrains/debugger-libs/pulls{/number}","milestones_url":"https://api.github.com/repos/JetBrains/debugger-libs/milestones{/number}","notifications_url":"https://api.github.com/repos/JetBrains/debugger-libs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JetBrains/debugger-libs/labels{/name}","releases_url":"https://api.github.com/repos/JetBrains/debugger-libs/releases{/id}","deployments_url":"https://api.github.com/repos/JetBrains/debugger-libs/deployments","created_at":"2016-04-08T18:51:50Z","updated_at":"2016-11-10T14:56:25Z","pushed_at":"2017-01-11T19:26:48Z","git_url":"git://github.com/JetBrains/debugger-libs.git","ssh_url":"git@github.com:JetBrains/debugger-libs.git","clone_url":"https://github.com/JetBrains/debugger-libs.git","svn_url":"https://github.com/JetBrains/debugger-libs","homepage":null,"size":3419,"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":"master"}},"base":{"label":"mono:master","ref":"master","sha":"ea9d7f7f724fab4bde3c07bd053e4cf09e56ee70","user":{"login":"mono","id":53395,"avatar_url":"https://avatars.githubusercontent.com/u/53395?v=3","gravatar_id":"","url":"https://api.github.com/users/mono","html_url":"https://github.com/mono","followers_url":"https://api.github.com/users/mono/followers","following_url":"https://api.github.com/users/mono/following{/other_user}","gists_url":"https://api.github.com/users/mono/gists{/gist_id}","starred_url":"https://api.github.com/users/mono/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mono/subscriptions","organizations_url":"https://api.github.com/users/mono/orgs","repos_url":"https://api.github.com/users/mono/repos","events_url":"https://api.github.com/users/mono/events{/privacy}","received_events_url":"https://api.github.com/users/mono/received_events","type":"Organization","site_admin":false},"repo":{"id":10620574,"name":"debugger-libs","full_name":"mono/debugger-libs","owner":{"login":"mono","id":53395,"avatar_url":"https://avatars.githubusercontent.com/u/53395?v=3","gravatar_id":"","url":"https://api.github.com/users/mono","html_url":"https://github.com/mono","followers_url":"https://api.github.com/users/mono/followers","following_url":"https://api.github.com/users/mono/following{/other_user}","gists_url":"https://api.github.com/users/mono/gists{/gist_id}","starred_url":"https://api.github.com/users/mono/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mono/subscriptions","organizations_url":"https://api.github.com/users/mono/orgs","repos_url":"https://api.github.com/users/mono/repos","events_url":"https://api.github.com/users/mono/events{/privacy}","received_events_url":"https://api.github.com/users/mono/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mono/debugger-libs","description":"Debugger libraries","fork":false,"url":"https://api.github.com/repos/mono/debugger-libs","forks_url":"https://api.github.com/repos/mono/debugger-libs/forks","keys_url":"https://api.github.com/repos/mono/debugger-libs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mono/debugger-libs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mono/debugger-libs/teams","hooks_url":"https://api.github.com/repos/mono/debugger-libs/hooks","issue_events_url":"https://api.github.com/repos/mono/debugger-libs/issues/events{/number}","events_url":"https://api.github.com/repos/mono/debugger-libs/events","assignees_url":"https://api.github.com/repos/mono/debugger-libs/assignees{/user}","branches_url":"https://api.github.com/repos/mono/debugger-libs/branches{/branch}","tags_url":"https://api.github.com/repos/mono/debugger-libs/tags","blobs_url":"https://api.github.com/repos/mono/debugger-libs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mono/debugger-libs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mono/debugger-libs/git/refs{/sha}","trees_url":"https://api.github.com/repos/mono/debugger-libs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mono/debugger-libs/statuses/{sha}","languages_url":"https://api.github.com/repos/mono/debugger-libs/languages","stargazers_url":"https://api.github.com/repos/mono/debugger-libs/stargazers","contributors_url":"https://api.github.com/repos/mono/debugger-libs/contributors","subscribers_url":"https://api.github.com/repos/mono/debugger-libs/subscribers","subscription_url":"https://api.github.com/repos/mono/debugger-libs/subscription","commits_url":"https://api.github.com/repos/mono/debugger-libs/commits{/sha}","git_commits_url":"https://api.github.com/repos/mono/debugger-libs/git/commits{/sha}","comments_url":"https://api.github.com/repos/mono/debugger-libs/comments{/number}","issue_comment_url":"https://api.github.com/repos/mono/debugger-libs/issues/comments{/number}","contents_url":"https://api.github.com/repos/mono/debugger-libs/contents/{+path}","compare_url":"https://api.github.com/repos/mono/debugger-libs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mono/debugger-libs/merges","archive_url":"https://api.github.com/repos/mono/debugger-libs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mono/debugger-libs/downloads","issues_url":"https://api.github.com/repos/mono/debugger-libs/issues{/number}","pulls_url":"https://api.github.com/repos/mono/debugger-libs/pulls{/number}","milestones_url":"https://api.github.com/repos/mono/debugger-libs/milestones{/number}","notifications_url":"https://api.github.com/repos/mono/debugger-libs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mono/debugger-libs/labels{/name}","releases_url":"https://api.github.com/repos/mono/debugger-libs/releases{/id}","deployments_url":"https://api.github.com/repos/mono/debugger-libs/deployments","created_at":"2013-06-11T12:03:07Z","updated_at":"2017-01-10T18:56:15Z","pushed_at":"2017-01-11T20:25:44Z","git_url":"git://github.com/mono/debugger-libs.git","ssh_url":"git@github.com:mono/debugger-libs.git","clone_url":"https://github.com/mono/debugger-libs.git","svn_url":"https://github.com/mono/debugger-libs","homepage":null,"size":3016,"stargazers_count":19,"watchers_count":19,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":23,"mirror_url":null,"open_issues_count":7,"forks":23,"open_issues":7,"watchers":19,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mono/debugger-libs/pulls/85"},"html":{"href":"https://github.com/mono/debugger-libs/pull/85"},"issue":{"href":"https://api.github.com/repos/mono/debugger-libs/issues/85"},"comments":{"href":"https://api.github.com/repos/mono/debugger-libs/issues/85/comments"},"review_comments":{"href":"https://api.github.com/repos/mono/debugger-libs/pulls/85/comments"},"review_comment":{"href":"https://api.github.com/repos/mono/debugger-libs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mono/debugger-libs/pulls/85/commits"},"statuses":{"href":"https://api.github.com/repos/mono/debugger-libs/statuses/bc201d11c92fb0aa5a04560b70a6b389e91aa7ed"}}}}
{"actor":{"display_login":"slluis"}}