mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-17 10:07:27 +00:00
91 lines
1.7 KiB
C++
91 lines
1.7 KiB
C++
|
/**
|
|||
|
* \file forkedcallqueue.C
|
|||
|
* This file is part of LyX, the document processor.
|
|||
|
* Licence details can be found in the file COPYING.
|
|||
|
*
|
|||
|
* \author Alfredo Braunstein (based on an idea from Angus Leeming)
|
|||
|
*
|
|||
|
* Full author contact details are available in file CREDITS
|
|||
|
*/
|
|||
|
|
|||
|
#include "forkedcallqueue.h"
|
|||
|
|
|||
|
#include "debug.h"
|
|||
|
|
|||
|
#include <boost/bind.hpp>
|
|||
|
#include <boost/signals/signal2.hpp>
|
|||
|
|
|||
|
using std::endl;
|
|||
|
using std::queue;
|
|||
|
|
|||
|
ForkedCallQueue & ForkedCallQueue::get()
|
|||
|
{
|
|||
|
static ForkedCallQueue singleton;
|
|||
|
return singleton;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Forkedcall::SignalTypePtr ForkedCallQueue::add(string const & process)
|
|||
|
{
|
|||
|
Forkedcall::SignalTypePtr ptr;
|
|||
|
ptr.reset(new Forkedcall::SignalType);
|
|||
|
callQueue_.push(Process(process, ptr));
|
|||
|
if (!running_) {
|
|||
|
startCaller();
|
|||
|
}
|
|||
|
return ptr;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void ForkedCallQueue::callNext()
|
|||
|
{
|
|||
|
if (callQueue_.empty())
|
|||
|
return;
|
|||
|
Process pro = callQueue_.front();
|
|||
|
callQueue_.pop();
|
|||
|
// Bind our chain caller
|
|||
|
pro.second->connect(boost::bind(&ForkedCallQueue::callback,
|
|||
|
this, _1, _2));
|
|||
|
Forkedcall call;
|
|||
|
//<2F>If<49>we<77>fail<69>to<74>fork<72>the<68>process,<2C>then<65>emit<69>the<68>signal
|
|||
|
//<2F>to<74>tell<6C>the<68>outside<64>world<6C>that<61>it<69>failed.
|
|||
|
if (call.startscript(pro.first, pro.second) > 0) {
|
|||
|
pro.second->operator()(0,1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void ForkedCallQueue::callback(pid_t, int)
|
|||
|
{
|
|||
|
if(callQueue_.empty()) {
|
|||
|
stopCaller();
|
|||
|
} else {
|
|||
|
callNext();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ForkedCallQueue::ForkedCallQueue() : running_(false)
|
|||
|
{}
|
|||
|
|
|||
|
|
|||
|
void ForkedCallQueue::startCaller()
|
|||
|
{
|
|||
|
lyxerr[Debug::GRAPHICS] << "ForkedCallQueue: waking up" << endl;
|
|||
|
running_ = true ;
|
|||
|
callNext();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void ForkedCallQueue::stopCaller()
|
|||
|
{
|
|||
|
running_ = false ;
|
|||
|
lyxerr[Debug::GRAPHICS] << "ForkedCallQueue: I'm going to sleep"
|
|||
|
<< endl;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
bool ForkedCallQueue::running() const
|
|||
|
{
|
|||
|
return running_ ;
|
|||
|
}
|