)]}'
{
  "commit": "b02db2d9203ccfd1c26e55f7d975f0c05caee0ce",
  "tree": "0fda9f2f8d4c39d9c44a6fcff16f64faac4aa7ca",
  "parents": [
    "1c809fa01df0c638417480dfd446415615bfd217"
  ],
  "author": {
    "name": "Daniel P. Berrange",
    "email": "berrange@redhat.com",
    "time": "Wed Mar 18 17:25:45 2015 +0000"
  },
  "committer": {
    "name": "Daniel P. Berrange",
    "email": "berrange@redhat.com",
    "time": "Fri Dec 18 12:18:30 2015 +0000"
  },
  "message": "io: add QIOTask class for async operations\n\nA number of I/O operations need to be performed asynchronously\nto avoid blocking the main loop. The caller of such APIs need\nto provide a callback to be invoked on completion/error and\nneed access to the error, if any. The small QIOTask provides\na simple framework for dealing with such probes. The API\ndocs inline provide an outline of how this is to be used.\n\nSome functions don\u0027t have the ability to run asynchronously\n(eg getaddrinfo always blocks), so to facilitate their use,\nthe task class provides a mechanism to run a blocking\nfunction in a thread, while triggering the completion\ncallback in the main event loop thread. This easily allows\nany synchronous function to be made asynchronous, albeit\nat the cost of spawning a thread.\n\nIn this series, the QIOTask class will be used for things like\nthe TLS handshake, the websockets handshake and TCP connect()\nprogress.\n\nThe concept of QIOTask is inspired by the GAsyncResult\ninterface / GTask class in the GIO libraries. The min\nversion requirements on glib don\u0027t allow those to be\nused from QEMU, so QIOTask provides a facsimilie which\ncan be easily switched to GTask in the future if the\nmin version is increased.\n\nSigned-off-by: Daniel P. Berrange \u003cberrange@redhat.com\u003e\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2418714156e664a8416cf27ba144c1be9fc17b4a",
      "new_mode": 33188,
      "new_path": "include/io/task.h"
    },
    {
      "type": "modify",
      "old_id": "b02ea908ef2bd461b407b757a322b68839d1eb9d",
      "old_mode": 33188,
      "old_path": "io/Makefile.objs",
      "new_id": "503b95c30b4124579290f3d4e28243f7b6a235be",
      "new_mode": 33188,
      "new_path": "io/Makefile.objs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3127fca77177fc82765f635593d9d61dc2b4d91a",
      "new_mode": 33188,
      "new_path": "io/task.c"
    },
    {
      "type": "modify",
      "old_id": "1e55722b6ac3a48d980caf78fe092373b4414bd4",
      "old_mode": 33188,
      "old_path": "tests/.gitignore",
      "new_id": "eec12cc2dbb082a5fde2b4f1e5f1c8852bcc335d",
      "new_mode": 33188,
      "new_path": "tests/.gitignore"
    },
    {
      "type": "modify",
      "old_id": "053c1ae481334f4feff08d490f0554a5c0c06123",
      "old_mode": 33188,
      "old_path": "tests/Makefile",
      "new_id": "515a7c7c30e24688a2b2b93cec0fcdb2ca27dfd7",
      "new_mode": 33188,
      "new_path": "tests/Makefile"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3344382c7f88dd90ec6817ec9b9117df40fb56ac",
      "new_mode": 33188,
      "new_path": "tests/test-io-task.c"
    },
    {
      "type": "modify",
      "old_id": "fa504cf494fee0f2b84e3cea801cc1f7f8b57f80",
      "old_mode": 33188,
      "old_path": "trace-events",
      "new_id": "acf2484b7d565d8890ce676a33a50ab52141825d",
      "new_mode": 33188,
      "new_path": "trace-events"
    }
  ]
}
