bool Worker::Attach(ZRef<Starter> iStarter) { ZAcqMtx acq(fMtx); if (not fStarter) { fStarter = iStarter; try { ZRelMtx rel(fMtx); sCall(fCallable_Attached, this); return true; } catch (...) {} fStarter.Clear(); fCnd.Broadcast(); ZRelMtx rel(fMtx); try { sCall(fCallable_Detached, this); } catch (...) {} } return false; }
// // Entry point for the console application. // int _tmain(int argc, _TCHAR* argv[]) { char * pgVimExe = "C:\\Users\\sbenner\\AppData\\Roaming\\Vim\\vim72\\gvim.exe"; /* pgVimExe = std::getenv ("GVIM_EXECUTABLE"); bool bError = false; if (pgVimExe == NULL) { std::cout << "Error: Cannot find environment variable GVIM_EXECUTABLE"; bError = true; } else if (argc < 2) { std::cout << "Error: Invalid number of argument."; bError = true; } if (bError) { return 1; } */ std::string sCall("start \"\" \""); sCall += pgVimExe; sCall += "\" --remote-tab-silent"; for (int i=1; i<argc; ++i) { sCall += " \""; sCall += argv[i]; sCall += "\""; } #ifdef _DEBUG std::cout << "Calling " << sCall.c_str() << "..."; std::cout << "\n"; std::system("pause"); #endif // call system command std::system(sCall.c_str()); return 0; }
ZQ<void> Worker::QCall() { ZAcqMtx acq(fMtx); for (;;) { fWorking = ZThread::sID(); fNextWake = kDistantFuture; ZRelMtx rel(fMtx); ZQ<bool> result; try { result = fCallable_Work->QCall(this); } catch (...) {} ZAcqMtx acq(fMtx); fWorking = 0; if (result && *result) { if (fNextWake < kDistantFuture) { if (fNextWake <= Time::sSystem()) continue; sNextStartAt(fNextWake, Job(fStarter, this)); } return notnull; } fStarter.Clear(); fCnd.Broadcast(); ZRelMtx rel2(fMtx); try { sCall(fCallable_Detached, this); } catch (...) {} return null; } }