Log/Info/Warn/Error are all very repetitive now.

How about using lambda to avoid it?
```C++
void RunOnMain(std::function<void ()> *func)
{
  if (uvThreadID == GetCurrentThreadId()) 
  { // comes in a new line in our C++ style guide
    (*func)();
  }
  else // comes in a new line in our C++ style guide
  {
    uv_async_t* async = new uv_async_t;
    uv_async_init(uv_default_loop(), async , AsyncCb);
    async.data =  func;
    uv_async_send(async);
  }
}

//later 
private: 
static void AsyncCb(uv_async_t *handle, int status)
{
  auto func = static_cast<std::function<void ()> *>(handle->data);
  (*func)();
  delete func;
  delete  handle;
}
```