Add option to set stack size in config file, default == 0 == OS default
Change-Id: Id752f6b5ce9a96a67cd1ff835687ce0e03d3a50d
This commit is contained in:
parent
6a305feb0f
commit
ac0487eb66
|
@ -135,8 +135,10 @@ void Thread::start(void *(*task)(void*), void *arg)
|
||||||
// (pat) Moved initialization to constructor to avoid crash in destructor.
|
// (pat) Moved initialization to constructor to avoid crash in destructor.
|
||||||
//res = pthread_attr_init(&mAttrib);
|
//res = pthread_attr_init(&mAttrib);
|
||||||
//assert(!res);
|
//assert(!res);
|
||||||
res = pthread_attr_setstacksize(&mAttrib, mStackSize);
|
if (mStackSize != 0) {
|
||||||
assert(!res);
|
res = pthread_attr_setstacksize(&mAttrib, mStackSize);
|
||||||
|
assert(!res);
|
||||||
|
}
|
||||||
res = pthread_create(&mThread, &mAttrib, task, arg);
|
res = pthread_create(&mThread, &mAttrib, task, arg);
|
||||||
assert(!res);
|
assert(!res);
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,7 +158,7 @@ class Thread {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** Create a thread in a non-running state. */
|
/** Create a thread in a non-running state. */
|
||||||
Thread(size_t wStackSize = (65536*4)):mThread((pthread_t)0) {
|
Thread(size_t wStackSize = 0):mThread((pthread_t)0) {
|
||||||
pthread_attr_init(&mAttrib); // (pat) moved this here.
|
pthread_attr_init(&mAttrib); // (pat) moved this here.
|
||||||
mStackSize=wStackSize;
|
mStackSize=wStackSize;
|
||||||
}
|
}
|
||||||
|
|
|
@ -336,6 +336,18 @@ DEFUN(cfg_rt_prio, cfg_rt_prio_cmd,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN(cfg_stack_size, cfg_stack_size_cmd,
|
||||||
|
"stack-size <0-2147483647>",
|
||||||
|
"Set the stack size per thread in BYTE, 0 = OS default\n"
|
||||||
|
"Stack size per thread in BYTE\n")
|
||||||
|
{
|
||||||
|
struct trx_ctx *trx = trx_from_vty(vty);
|
||||||
|
|
||||||
|
trx->cfg.stack_size = atoi(argv[0]);
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUN(cfg_filler, cfg_filler_cmd,
|
DEFUN(cfg_filler, cfg_filler_cmd,
|
||||||
"filler dummy",
|
"filler dummy",
|
||||||
"Enable C0 filler table\n"
|
"Enable C0 filler table\n"
|
||||||
|
@ -546,6 +558,8 @@ static int config_write_trx(struct vty *vty)
|
||||||
vty_out(vty, " ext-rach %s%s", trx->cfg.ext_rach ? "enable" : "disable", VTY_NEWLINE);
|
vty_out(vty, " ext-rach %s%s", trx->cfg.ext_rach ? "enable" : "disable", VTY_NEWLINE);
|
||||||
if (trx->cfg.sched_rr != 0)
|
if (trx->cfg.sched_rr != 0)
|
||||||
vty_out(vty, " rt-prio %u%s", trx->cfg.sched_rr, VTY_NEWLINE);
|
vty_out(vty, " rt-prio %u%s", trx->cfg.sched_rr, VTY_NEWLINE);
|
||||||
|
if (trx->cfg.stack_size != 0)
|
||||||
|
vty_out(vty, " stack-size %u%s", trx->cfg.stack_size, VTY_NEWLINE);
|
||||||
trx_rate_ctr_threshold_write_config(vty, " ");
|
trx_rate_ctr_threshold_write_config(vty, " ");
|
||||||
|
|
||||||
for (i = 0; i < trx->cfg.num_chans; i++) {
|
for (i = 0; i < trx->cfg.num_chans; i++) {
|
||||||
|
@ -585,6 +599,7 @@ static void trx_dump_vty(struct vty *vty, struct trx_ctx *trx)
|
||||||
vty_out(vty, " Extended RACH support: %s%s", trx->cfg.ext_rach ? "Enabled" : "Disabled", VTY_NEWLINE);
|
vty_out(vty, " Extended RACH support: %s%s", trx->cfg.ext_rach ? "Enabled" : "Disabled", VTY_NEWLINE);
|
||||||
vty_out(vty, " Real Time Priority: %u (%s)%s", trx->cfg.sched_rr,
|
vty_out(vty, " Real Time Priority: %u (%s)%s", trx->cfg.sched_rr,
|
||||||
trx->cfg.sched_rr ? "Enabled" : "Disabled", VTY_NEWLINE);
|
trx->cfg.sched_rr ? "Enabled" : "Disabled", VTY_NEWLINE);
|
||||||
|
vty_out(vty, " Stack size per Thread in BYTE (0 = OS default): %u%s", trx->cfg.stack_size, VTY_NEWLINE);
|
||||||
vty_out(vty, " Channels: %u%s", trx->cfg.num_chans, VTY_NEWLINE);
|
vty_out(vty, " Channels: %u%s", trx->cfg.num_chans, VTY_NEWLINE);
|
||||||
for (i = 0; i < trx->cfg.num_chans; i++) {
|
for (i = 0; i < trx->cfg.num_chans; i++) {
|
||||||
chan = &trx->cfg.chans[i];
|
chan = &trx->cfg.chans[i];
|
||||||
|
@ -698,6 +713,7 @@ int trx_vty_init(struct trx_ctx* trx)
|
||||||
install_element(TRX_NODE, &cfg_filler_cmd);
|
install_element(TRX_NODE, &cfg_filler_cmd);
|
||||||
install_element(TRX_NODE, &cfg_ctr_error_threshold_cmd);
|
install_element(TRX_NODE, &cfg_ctr_error_threshold_cmd);
|
||||||
install_element(TRX_NODE, &cfg_no_ctr_error_threshold_cmd);
|
install_element(TRX_NODE, &cfg_no_ctr_error_threshold_cmd);
|
||||||
|
install_element(TRX_NODE, &cfg_stack_size_cmd);
|
||||||
|
|
||||||
install_element(TRX_NODE, &cfg_chan_cmd);
|
install_element(TRX_NODE, &cfg_chan_cmd);
|
||||||
install_node(&chan_node, dummy_config_write);
|
install_node(&chan_node, dummy_config_write);
|
||||||
|
|
|
@ -63,6 +63,7 @@ struct trx_ctx {
|
||||||
bool ext_rach;
|
bool ext_rach;
|
||||||
bool egprs;
|
bool egprs;
|
||||||
unsigned int sched_rr;
|
unsigned int sched_rr;
|
||||||
|
unsigned int stack_size;
|
||||||
unsigned int num_chans;
|
unsigned int num_chans;
|
||||||
struct trx_chan chans[TRX_CHAN_MAX];
|
struct trx_chan chans[TRX_CHAN_MAX];
|
||||||
} cfg;
|
} cfg;
|
||||||
|
|
|
@ -115,11 +115,11 @@ Transceiver::Transceiver(int wBasePort,
|
||||||
size_t tx_sps, size_t rx_sps, size_t chans,
|
size_t tx_sps, size_t rx_sps, size_t chans,
|
||||||
GSM::Time wTransmitLatency,
|
GSM::Time wTransmitLatency,
|
||||||
RadioInterface *wRadioInterface,
|
RadioInterface *wRadioInterface,
|
||||||
double wRssiOffset)
|
double wRssiOffset, int wStackSize)
|
||||||
: mBasePort(wBasePort), mLocalAddr(TRXAddress), mRemoteAddr(GSMcoreAddress),
|
: mBasePort(wBasePort), mLocalAddr(TRXAddress), mRemoteAddr(GSMcoreAddress),
|
||||||
mClockSocket(TRXAddress, wBasePort, GSMcoreAddress, wBasePort + 100),
|
mClockSocket(TRXAddress, wBasePort, GSMcoreAddress, wBasePort + 100),
|
||||||
mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface),
|
mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface),
|
||||||
rssiOffset(wRssiOffset),
|
rssiOffset(wRssiOffset), stackSize(wStackSize),
|
||||||
mSPSTx(tx_sps), mSPSRx(rx_sps), mChans(chans), mEdge(false), mOn(false), mForceClockInterface(false),
|
mSPSTx(tx_sps), mSPSRx(rx_sps), mChans(chans), mEdge(false), mOn(false), mForceClockInterface(false),
|
||||||
mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0), mMaxExpectedDelayNB(0),
|
mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0), mMaxExpectedDelayNB(0),
|
||||||
mWriteBurstToDiskMask(0)
|
mWriteBurstToDiskMask(0)
|
||||||
|
@ -212,7 +212,7 @@ bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay,
|
||||||
/* Start control threads */
|
/* Start control threads */
|
||||||
for (size_t i = 0; i < mChans; i++) {
|
for (size_t i = 0; i < mChans; i++) {
|
||||||
TransceiverChannel *chan = new TransceiverChannel(this, i);
|
TransceiverChannel *chan = new TransceiverChannel(this, i);
|
||||||
mControlServiceLoopThreads[i] = new Thread(32768);
|
mControlServiceLoopThreads[i] = new Thread(stackSize);
|
||||||
mControlServiceLoopThreads[i]->start((void * (*)(void*))
|
mControlServiceLoopThreads[i]->start((void * (*)(void*))
|
||||||
ControlServiceLoopAdapter, (void*) chan);
|
ControlServiceLoopAdapter, (void*) chan);
|
||||||
|
|
||||||
|
@ -254,8 +254,8 @@ bool Transceiver::start()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Device is running - launch I/O threads */
|
/* Device is running - launch I/O threads */
|
||||||
mRxLowerLoopThread = new Thread(32768);
|
mRxLowerLoopThread = new Thread(stackSize);
|
||||||
mTxLowerLoopThread = new Thread(32768);
|
mTxLowerLoopThread = new Thread(stackSize);
|
||||||
mTxLowerLoopThread->start((void * (*)(void*))
|
mTxLowerLoopThread->start((void * (*)(void*))
|
||||||
TxLowerLoopAdapter,(void*) this);
|
TxLowerLoopAdapter,(void*) this);
|
||||||
mRxLowerLoopThread->start((void * (*)(void*))
|
mRxLowerLoopThread->start((void * (*)(void*))
|
||||||
|
@ -264,12 +264,12 @@ bool Transceiver::start()
|
||||||
/* Launch uplink and downlink burst processing threads */
|
/* Launch uplink and downlink burst processing threads */
|
||||||
for (size_t i = 0; i < mChans; i++) {
|
for (size_t i = 0; i < mChans; i++) {
|
||||||
TransceiverChannel *chan = new TransceiverChannel(this, i);
|
TransceiverChannel *chan = new TransceiverChannel(this, i);
|
||||||
mRxServiceLoopThreads[i] = new Thread(32768);
|
mRxServiceLoopThreads[i] = new Thread(stackSize);
|
||||||
mRxServiceLoopThreads[i]->start((void * (*)(void*))
|
mRxServiceLoopThreads[i]->start((void * (*)(void*))
|
||||||
RxUpperLoopAdapter, (void*) chan);
|
RxUpperLoopAdapter, (void*) chan);
|
||||||
|
|
||||||
chan = new TransceiverChannel(this, i);
|
chan = new TransceiverChannel(this, i);
|
||||||
mTxPriorityQueueServiceLoopThreads[i] = new Thread(32768);
|
mTxPriorityQueueServiceLoopThreads[i] = new Thread(stackSize);
|
||||||
mTxPriorityQueueServiceLoopThreads[i]->start((void * (*)(void*))
|
mTxPriorityQueueServiceLoopThreads[i]->start((void * (*)(void*))
|
||||||
TxUpperLoopAdapter, (void*) chan);
|
TxUpperLoopAdapter, (void*) chan);
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ public:
|
||||||
size_t tx_sps, size_t rx_sps, size_t chans,
|
size_t tx_sps, size_t rx_sps, size_t chans,
|
||||||
GSM::Time wTransmitLatency,
|
GSM::Time wTransmitLatency,
|
||||||
RadioInterface *wRadioInterface,
|
RadioInterface *wRadioInterface,
|
||||||
double wRssiOffset);
|
double wRssiOffset, int stackSize);
|
||||||
|
|
||||||
/** Destructor */
|
/** Destructor */
|
||||||
~Transceiver();
|
~Transceiver();
|
||||||
|
@ -178,6 +178,7 @@ private:
|
||||||
double rxFullScale; ///< full scale output to radio
|
double rxFullScale; ///< full scale output to radio
|
||||||
|
|
||||||
double rssiOffset; ///< RSSI to dBm conversion offset
|
double rssiOffset; ///< RSSI to dBm conversion offset
|
||||||
|
int stackSize; ///< stack size for threads, 0 = OS default
|
||||||
|
|
||||||
/** modulate and add a burst to the transmit queue */
|
/** modulate and add a burst to the transmit queue */
|
||||||
void addRadioVector(size_t chan, BitVector &bits,
|
void addRadioVector(size_t chan, BitVector &bits,
|
||||||
|
|
|
@ -145,7 +145,7 @@ int makeTransceiver(struct trx_ctx *trx, RadioInterface *radio)
|
||||||
transceiver = new Transceiver(trx->cfg.base_port, trx->cfg.bind_addr,
|
transceiver = new Transceiver(trx->cfg.base_port, trx->cfg.bind_addr,
|
||||||
trx->cfg.remote_addr, trx->cfg.tx_sps,
|
trx->cfg.remote_addr, trx->cfg.tx_sps,
|
||||||
trx->cfg.rx_sps, trx->cfg.num_chans, GSM::Time(3,0),
|
trx->cfg.rx_sps, trx->cfg.num_chans, GSM::Time(3,0),
|
||||||
radio, trx->cfg.rssi_offset);
|
radio, trx->cfg.rssi_offset, trx->cfg.stack_size);
|
||||||
if (!transceiver->init(trx->cfg.filler, trx->cfg.rtsc,
|
if (!transceiver->init(trx->cfg.filler, trx->cfg.rtsc,
|
||||||
trx->cfg.rach_delay, trx->cfg.egprs, trx->cfg.ext_rach)) {
|
trx->cfg.rach_delay, trx->cfg.egprs, trx->cfg.ext_rach)) {
|
||||||
LOG(ALERT) << "Failed to initialize transceiver";
|
LOG(ALERT) << "Failed to initialize transceiver";
|
||||||
|
|
|
@ -1247,6 +1247,12 @@
|
||||||
<param name='<1-32>' doc='Real time priority' />
|
<param name='<1-32>' doc='Real time priority' />
|
||||||
</params>
|
</params>
|
||||||
</command>
|
</command>
|
||||||
|
<command id='stack-size <0-2147483647>'>
|
||||||
|
<params>
|
||||||
|
<param name='stack-size' doc='Set the stack size for the spawned threads' />
|
||||||
|
<param name='<0-2147483647>' doc='Stack size in BYTE' />
|
||||||
|
</params>
|
||||||
|
</command>
|
||||||
<command id='filler dummy'>
|
<command id='filler dummy'>
|
||||||
<params>
|
<params>
|
||||||
<param name='filler' doc='Enable C0 filler table' />
|
<param name='filler' doc='Enable C0 filler table' />
|
||||||
|
|
Loading…
Reference in New Issue