<p>Hoernchen <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/14488">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  pespin: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add option to set stack size in config file, default == 0 == OS default<br><br>Change-Id: Id752f6b5ce9a96a67cd1ff835687ce0e03d3a50d<br>---<br>M CommonLibs/Threads.cpp<br>M CommonLibs/Threads.h<br>M CommonLibs/trx_vty.c<br>M CommonLibs/trx_vty.h<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/Transceiver.h<br>M Transceiver52M/osmo-trx.cpp<br>M doc/manuals/vty/trx_vty_reference.xml<br>8 files changed, 38 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CommonLibs/Threads.cpp b/CommonLibs/Threads.cpp</span><br><span>index c056d69..ccea1e7 100644</span><br><span>--- a/CommonLibs/Threads.cpp</span><br><span>+++ b/CommonLibs/Threads.cpp</span><br><span>@@ -135,8 +135,10 @@</span><br><span>    // (pat) Moved initialization to constructor to avoid crash in destructor.</span><br><span>   //res = pthread_attr_init(&mAttrib);</span><br><span>     //assert(!res);</span><br><span style="color: hsl(0, 100%, 40%);">- res = pthread_attr_setstacksize(&mAttrib, mStackSize);</span><br><span style="color: hsl(0, 100%, 40%);">-      assert(!res);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mStackSize != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                res = pthread_attr_setstacksize(&mAttrib, mStackSize);</span><br><span style="color: hsl(120, 100%, 40%);">+            assert(!res);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span>    res = pthread_create(&mThread, &mAttrib, task, arg);</span><br><span>         assert(!res);</span><br><span> }</span><br><span>diff --git a/CommonLibs/Threads.h b/CommonLibs/Threads.h</span><br><span>index 4c5b9ee..8a6ba47 100644</span><br><span>--- a/CommonLibs/Threads.h</span><br><span>+++ b/CommonLibs/Threads.h</span><br><span>@@ -158,7 +158,7 @@</span><br><span>        public:</span><br><span> </span><br><span>  /** Create a thread in a non-running state. */</span><br><span style="color: hsl(0, 100%, 40%);">-  Thread(size_t wStackSize = (65536*4)):mThread((pthread_t)0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Thread(size_t wStackSize = 0):mThread((pthread_t)0) {</span><br><span>                pthread_attr_init(&mAttrib);        // (pat) moved this here.</span><br><span>            mStackSize=wStackSize;</span><br><span>       }</span><br><span>diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c</span><br><span>index 4cc827b..795ec7b 100644</span><br><span>--- a/CommonLibs/trx_vty.c</span><br><span>+++ b/CommonLibs/trx_vty.c</span><br><span>@@ -336,6 +336,18 @@</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_stack_size, cfg_stack_size_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "stack-size <0-2147483647>",</span><br><span style="color: hsl(120, 100%, 40%);">+  "Set the stack size per thread in BYTE, 0 = OS default\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "Stack size per thread in BYTE\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct trx_ctx *trx = trx_from_vty(vty);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    trx->cfg.stack_size = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_filler, cfg_filler_cmd,</span><br><span>        "filler dummy",</span><br><span>    "Enable C0 filler table\n"</span><br><span>@@ -546,6 +558,8 @@</span><br><span>   vty_out(vty, " ext-rach %s%s", trx->cfg.ext_rach ? "enable" : "disable", VTY_NEWLINE);</span><br><span>      if (trx->cfg.sched_rr != 0)</span><br><span>               vty_out(vty, " rt-prio %u%s", trx->cfg.sched_rr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (trx->cfg.stack_size != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, " stack-size %u%s", trx->cfg.stack_size, VTY_NEWLINE);</span><br><span>     trx_rate_ctr_threshold_write_config(vty, " ");</span><br><span> </span><br><span>         for (i = 0; i < trx->cfg.num_chans; i++) {</span><br><span>@@ -585,6 +599,7 @@</span><br><span>       vty_out(vty, " Extended RACH support: %s%s", trx->cfg.ext_rach ? "Enabled" : "Disabled", VTY_NEWLINE);</span><br><span>      vty_out(vty, " Real Time Priority: %u (%s)%s", trx->cfg.sched_rr,</span><br><span>               trx->cfg.sched_rr ? "Enabled" : "Disabled", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_out(vty, " Stack size per Thread in BYTE (0 = OS default): %u%s", trx->cfg.stack_size, VTY_NEWLINE);</span><br><span>        vty_out(vty, " Channels: %u%s", trx->cfg.num_chans, VTY_NEWLINE);</span><br><span>       for (i = 0; i < trx->cfg.num_chans; i++) {</span><br><span>             chan = &trx->cfg.chans[i];</span><br><span>@@ -698,6 +713,7 @@</span><br><span>      install_element(TRX_NODE, &cfg_filler_cmd);</span><br><span>      install_element(TRX_NODE, &cfg_ctr_error_threshold_cmd);</span><br><span>         install_element(TRX_NODE, &cfg_no_ctr_error_threshold_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(TRX_NODE, &cfg_stack_size_cmd);</span><br><span> </span><br><span>      install_element(TRX_NODE, &cfg_chan_cmd);</span><br><span>        install_node(&chan_node, dummy_config_write);</span><br><span>diff --git a/CommonLibs/trx_vty.h b/CommonLibs/trx_vty.h</span><br><span>index 8e91113..d939051 100644</span><br><span>--- a/CommonLibs/trx_vty.h</span><br><span>+++ b/CommonLibs/trx_vty.h</span><br><span>@@ -63,6 +63,7 @@</span><br><span>           bool ext_rach;</span><br><span>               bool egprs;</span><br><span>          unsigned int sched_rr;</span><br><span style="color: hsl(120, 100%, 40%);">+                unsigned int stack_size;</span><br><span>             unsigned int num_chans;</span><br><span>              struct trx_chan chans[TRX_CHAN_MAX];</span><br><span>         } cfg;</span><br><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index 9c55d02..0aa4ff5 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -115,11 +115,11 @@</span><br><span>                          size_t tx_sps, size_t rx_sps, size_t chans,</span><br><span>                          GSM::Time wTransmitLatency,</span><br><span>                          RadioInterface *wRadioInterface,</span><br><span style="color: hsl(0, 100%, 40%);">-                         double wRssiOffset)</span><br><span style="color: hsl(120, 100%, 40%);">+                         double wRssiOffset, int wStackSize)</span><br><span>   : mBasePort(wBasePort), mLocalAddr(TRXAddress), mRemoteAddr(GSMcoreAddress),</span><br><span>     mClockSocket(TRXAddress, wBasePort, GSMcoreAddress, wBasePort + 100),</span><br><span>     mTransmitLatency(wTransmitLatency), mRadioInterface(wRadioInterface),</span><br><span style="color: hsl(0, 100%, 40%);">-    rssiOffset(wRssiOffset),</span><br><span style="color: hsl(120, 100%, 40%);">+    rssiOffset(wRssiOffset), stackSize(wStackSize),</span><br><span>     mSPSTx(tx_sps), mSPSRx(rx_sps), mChans(chans), mEdge(false), mOn(false), mForceClockInterface(false),</span><br><span>     mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0), mMaxExpectedDelayNB(0),</span><br><span>     mWriteBurstToDiskMask(0)</span><br><span>@@ -212,7 +212,7 @@</span><br><span>   /* Start control threads */</span><br><span>   for (size_t i = 0; i < mChans; i++) {</span><br><span>     TransceiverChannel *chan = new TransceiverChannel(this, i);</span><br><span style="color: hsl(0, 100%, 40%);">-    mControlServiceLoopThreads[i] = new Thread(32768);</span><br><span style="color: hsl(120, 100%, 40%);">+    mControlServiceLoopThreads[i] = new Thread(stackSize);</span><br><span>     mControlServiceLoopThreads[i]->start((void * (*)(void*))</span><br><span>                                  ControlServiceLoopAdapter, (void*) chan);</span><br><span> </span><br><span>@@ -254,8 +254,8 @@</span><br><span>   }</span><br><span> </span><br><span>   /* Device is running - launch I/O threads */</span><br><span style="color: hsl(0, 100%, 40%);">-  mRxLowerLoopThread = new Thread(32768);</span><br><span style="color: hsl(0, 100%, 40%);">-  mTxLowerLoopThread = new Thread(32768);</span><br><span style="color: hsl(120, 100%, 40%);">+  mRxLowerLoopThread = new Thread(stackSize);</span><br><span style="color: hsl(120, 100%, 40%);">+  mTxLowerLoopThread = new Thread(stackSize);</span><br><span>   mTxLowerLoopThread->start((void * (*)(void*))</span><br><span>                             TxLowerLoopAdapter,(void*) this);</span><br><span>   mRxLowerLoopThread->start((void * (*)(void*))</span><br><span>@@ -264,12 +264,12 @@</span><br><span>   /* Launch uplink and downlink burst processing threads */</span><br><span>   for (size_t i = 0; i < mChans; i++) {</span><br><span>     TransceiverChannel *chan = new TransceiverChannel(this, i);</span><br><span style="color: hsl(0, 100%, 40%);">-    mRxServiceLoopThreads[i] = new Thread(32768);</span><br><span style="color: hsl(120, 100%, 40%);">+    mRxServiceLoopThreads[i] = new Thread(stackSize);</span><br><span>     mRxServiceLoopThreads[i]->start((void * (*)(void*))</span><br><span>                             RxUpperLoopAdapter, (void*) chan);</span><br><span> </span><br><span>     chan = new TransceiverChannel(this, i);</span><br><span style="color: hsl(0, 100%, 40%);">-    mTxPriorityQueueServiceLoopThreads[i] = new Thread(32768);</span><br><span style="color: hsl(120, 100%, 40%);">+    mTxPriorityQueueServiceLoopThreads[i] = new Thread(stackSize);</span><br><span>     mTxPriorityQueueServiceLoopThreads[i]->start((void * (*)(void*))</span><br><span>                             TxUpperLoopAdapter, (void*) chan);</span><br><span>   }</span><br><span>diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h</span><br><span>index 4614efe..ceb8c4a 100644</span><br><span>--- a/Transceiver52M/Transceiver.h</span><br><span>+++ b/Transceiver52M/Transceiver.h</span><br><span>@@ -108,7 +108,7 @@</span><br><span>               size_t tx_sps, size_t rx_sps, size_t chans,</span><br><span>               GSM::Time wTransmitLatency,</span><br><span>               RadioInterface *wRadioInterface,</span><br><span style="color: hsl(0, 100%, 40%);">-              double wRssiOffset);</span><br><span style="color: hsl(120, 100%, 40%);">+              double wRssiOffset, int stackSize);</span><br><span> </span><br><span>   /** Destructor */</span><br><span>   ~Transceiver();</span><br><span>@@ -178,6 +178,7 @@</span><br><span>   double rxFullScale;                     ///< full scale output to radio</span><br><span> </span><br><span>   double rssiOffset;                      ///< RSSI to dBm conversion offset</span><br><span style="color: hsl(120, 100%, 40%);">+  int stackSize;                      ///< stack size for threads, 0 = OS default</span><br><span> </span><br><span>   /** modulate and add a burst to the transmit queue */</span><br><span>   void addRadioVector(size_t chan, BitVector &bits,</span><br><span>diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp</span><br><span>index 05489bd..06b1a18 100644</span><br><span>--- a/Transceiver52M/osmo-trx.cpp</span><br><span>+++ b/Transceiver52M/osmo-trx.cpp</span><br><span>@@ -145,7 +145,7 @@</span><br><span>     transceiver = new Transceiver(trx->cfg.base_port, trx->cfg.bind_addr,</span><br><span>                        trx->cfg.remote_addr, trx->cfg.tx_sps,</span><br><span>                         trx->cfg.rx_sps, trx->cfg.num_chans, GSM::Time(3,0),</span><br><span style="color: hsl(0, 100%, 40%);">-                              radio, trx->cfg.rssi_offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                              radio, trx->cfg.rssi_offset, trx->cfg.stack_size);</span><br><span>       if (!transceiver->init(trx->cfg.filler, trx->cfg.rtsc,</span><br><span>                     trx->cfg.rach_delay, trx->cfg.egprs, trx->cfg.ext_rach)) {</span><br><span>           LOG(ALERT) << "Failed to initialize transceiver";</span><br><span>diff --git a/doc/manuals/vty/trx_vty_reference.xml b/doc/manuals/vty/trx_vty_reference.xml</span><br><span>index e448a46..ce6d335 100644</span><br><span>--- a/doc/manuals/vty/trx_vty_reference.xml</span><br><span>+++ b/doc/manuals/vty/trx_vty_reference.xml</span><br><span>@@ -1247,6 +1247,12 @@</span><br><span>         <param name='&lt;1-32&gt;' doc='Real time priority' /></span><br><span>       </params></span><br><span>     </command></span><br><span style="color: hsl(120, 100%, 40%);">+    <command id='stack-size &lt;0-2147483647&gt;'></span><br><span style="color: hsl(120, 100%, 40%);">+      <params></span><br><span style="color: hsl(120, 100%, 40%);">+        <param name='stack-size' doc='Set the stack size for the spawned threads' /></span><br><span style="color: hsl(120, 100%, 40%);">+        <param name='&lt;0-2147483647&gt;' doc='Stack size in BYTE' /></span><br><span style="color: hsl(120, 100%, 40%);">+      </params></span><br><span style="color: hsl(120, 100%, 40%);">+    </command></span><br><span>     <command id='filler dummy'></span><br><span>       <params></span><br><span>         <param name='filler' doc='Enable C0 filler table' /></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/14488">change 14488</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-trx/+/14488"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id752f6b5ce9a96a67cd1ff835687ce0e03d3a50d </div>
<div style="display:none"> Gerrit-Change-Number: 14488 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>