static std::map<pid_t, TTask *> Tasks;

TError TTask::Fork(bool detach) {
PORTO_ASSERT(!PostFork);
auto lock = std::unique_lock<std::mutex>(ForkLock);
ForkTime = time(NULL);
localtime_r(&ForkTime, &ForkLocalTime);
pid_t ret = fork();
if (ret < 0)
return TError::System("TTask::Fork");
Pid = ret;
if (!Pid)
PostFork = true;
else if (!detach)
Tasks[Pid] = this;
Running = true;
return OK;
}

TError TTask::Wait() {
auto lock = std::unique_lock<std::mutex>(ForkLock);
if (Running) {
pid_t pid = Pid;
int status;
lock.unlock();
/* main thread could be blocked on lock that we're holding */
if (waitpid(pid, &status, 0) == pid)
pid = 0;
lock.lock();
if (!pid) {
if (Running) {
Tasks.erase(Pid);
Running = false;
}
Status = status;
}
}
while (Running) {
if (kill(Pid, 0) && errno == ESRCH) {
Tasks.erase(Pid);
Running = false;
Status = 100;
return TError("task not found");
}
if (Tasks.find(Pid) == Tasks.end())
return TError("detached task");
TasksCV.wait(lock);
}
if (Status)
return TError(EError::Unknown, FormatExitStatus(Status));
return OK;
}

最新文章

  1. 登陆+注册(三层+sql语句)
  2. 61-umask 简明笔记
  3. [转]浅谈jQuery EasyUI的属性设置
  4. 【转】随机函数的rand、srand用法
  5. Oracle表名、列名、约束名的长度限制
  6. ftp断点续传
  7. postgresql - mac 启动 关闭 postgresql
  8. 关于 python 的 @property总结和思考
  9. HDU3466Proud Merchants(贪心&amp;背包)
  10. iOS缓存框架-PINCache解读
  11. Ibatis学习记录
  12. 手把手教你如何使用webpack+react
  13. 如何设置App的启动图
  14. 微信小程序出现 Expecting &#39;STRING&#39;,&#39;NUMBER&#39;,&#39;NULL&#39;,&#39;TRUE&#39;,&#39;FALSE&#39;,&#39;{&#39;,&#39;[&#39;, got INVALID
  15. activeMQ (一)
  16. seq_file学习(1)—— single_open
  17. JAVA中的糕富帅技术——反射(一)
  18. 自制操作系统Antz -- 系列文章
  19. Centos kernel panic-not syncing:VFS:Unable to mount root fs on unknown block 解决办法
  20. [转]JVM参数设置、分析

热门文章

  1. 2018-2019-2 网络对抗技术 20165230 Exp7 网络欺诈防范
  2. 2018-2019-2 20165315《网络对抗技术》Exp7 网络欺诈防范
  3. mysql主从复制报错解决方案
  4. Python3注解+可变参数实现
  5. C++动态规划实现查找最长公共子序列
  6. Scala Class etc. 2
  7. Docker 安装 Redis, 搭建 Redis 环境
  8. WPF调用C++生成的dll文件(示例)
  9. 用这个模型去理解CPU?
  10. ASP.NET SignalR 系列(九)之源码与总结