<p>Hoernchen <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/17805">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, approved
fixeria: Looks good to me, but someone else must approve
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">transceiver: get rid of the ctrl threads<br><br>There is no need to have n threads handle n ctrl sockets, since they all<br>will immediately respond to commands, so handle them from the existing<br>main osmo select loop.<br><br>Care must be taken to ensure that calls from within the command handler<br>do not block, or at least don't block too long, which currently is the<br>case.<br><br>Change-Id: I642a34451e1825eafecf71a902df916ccee7944c<br>---<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/Transceiver.h<br>M Transceiver52M/osmo-trx.cpp<br>3 files changed, 124 insertions(+), 75 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index 36cfa7d..d9bda1d 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -45,6 +45,8 @@</span><br><span> </span><br><span> using namespace GSM;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+Transceiver *transceiver;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define USB_LATENCY_INTRVL 10,0</span><br><span> </span><br><span> /* Number of running values use in noise average */</span><br><span>@@ -151,20 +153,30 @@</span><br><span> close(mClockSocket);</span><br><span> </span><br><span> for (size_t i = 0; i < mChans; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (mControlServiceLoopThreads[i]) {</span><br><span style="color: hsl(0, 100%, 40%);">- mControlServiceLoopThreads[i]->cancel();</span><br><span style="color: hsl(0, 100%, 40%);">- mControlServiceLoopThreads[i]->join();</span><br><span style="color: hsl(0, 100%, 40%);">- delete mControlServiceLoopThreads[i];</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> mTxPriorityQueues[i].clear();</span><br><span style="color: hsl(0, 100%, 40%);">- if (mCtrlSockets[i] >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">- close(mCtrlSockets[i]);</span><br><span> if (mDataSockets[i] >= 0)</span><br><span> close(mDataSockets[i]);</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int Transceiver::ctrl_sock_cb(struct osmo_fd *bfd, unsigned int flags)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ int chan = static_cast<int>(reinterpret_cast<uintptr_t>(bfd->data));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (flags & OSMO_FD_READ)</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = transceiver->ctrl_sock_handle_rx(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (flags & OSMO_FD_WRITE)</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = transceiver->ctrl_sock_write(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span> * Initialize transceiver</span><br><span> *</span><br><span>@@ -193,8 +205,7 @@</span><br><span> mEdge = edge;</span><br><span> </span><br><span> mDataSockets.resize(mChans, -1);</span><br><span style="color: hsl(0, 100%, 40%);">- mCtrlSockets.resize(mChans, -1);</span><br><span style="color: hsl(0, 100%, 40%);">- mControlServiceLoopThreads.resize(mChans);</span><br><span style="color: hsl(120, 100%, 40%);">+ mCtrlSockets.resize(mChans);</span><br><span> mTxPriorityQueueServiceLoopThreads.resize(mChans);</span><br><span> mRxServiceLoopThreads.resize(mChans);</span><br><span> </span><br><span>@@ -216,24 +227,34 @@</span><br><span> return false;</span><br><span> </span><br><span> for (size_t i = 0; i < mChans; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ int rv;</span><br><span> c_srcport = mBasePort + 2 * i + 1;</span><br><span> c_dstport = mBasePort + 2 * i + 101;</span><br><span> d_srcport = mBasePort + 2 * i + 2;</span><br><span> d_dstport = mBasePort + 2 * i + 102;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- mCtrlSockets[i] = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,</span><br><span style="color: hsl(120, 100%, 40%);">+ rv = osmo_sock_init2_ofd(&mCtrlSockets[i].conn_bfd, AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,</span><br><span> mLocalAddr.c_str(), c_srcport,</span><br><span> mRemoteAddr.c_str(), c_dstport,</span><br><span> OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);</span><br><span style="color: hsl(0, 100%, 40%);">- if (mCtrlSockets[i] < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rv < 0)</span><br><span> return false;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ mCtrlSockets[i].conn_bfd.cb = ctrl_sock_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+ mCtrlSockets[i].conn_bfd.data = reinterpret_cast<void*>(i);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> mDataSockets[i] = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,</span><br><span> mLocalAddr.c_str(), d_srcport,</span><br><span> mRemoteAddr.c_str(), d_dstport,</span><br><span> OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT);</span><br><span> if (mDataSockets[i] < 0)</span><br><span> return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i && filler == FILLER_DUMMY)</span><br><span style="color: hsl(120, 100%, 40%);">+ filler = FILLER_ZERO;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mStates[i].init(filler, mSPSTx, txFullScale, rtsc, rach_delay);</span><br><span> }</span><br><span> </span><br><span> /* Randomize the central clock */</span><br><span>@@ -243,21 +264,6 @@</span><br><span> mLastClockUpdateTime = startTime;</span><br><span> mLatencyUpdateTime = startTime;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Start control threads */</span><br><span style="color: hsl(0, 100%, 40%);">- for (size_t i = 0; i < mChans; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- TrxChanThParams *params = (TrxChanThParams *)malloc(sizeof(struct TrxChanThParams));</span><br><span style="color: hsl(0, 100%, 40%);">- params->trx = this;</span><br><span style="color: hsl(0, 100%, 40%);">- params->num = i;</span><br><span style="color: hsl(0, 100%, 40%);">- mControlServiceLoopThreads[i] = new Thread(stackSize);</span><br><span style="color: hsl(0, 100%, 40%);">- mControlServiceLoopThreads[i]->start((void * (*)(void*))</span><br><span style="color: hsl(0, 100%, 40%);">- ControlServiceLoopAdapter, (void*) params);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (i && filler == FILLER_DUMMY)</span><br><span style="color: hsl(0, 100%, 40%);">- filler = FILLER_ZERO;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- mStates[i].init(filler, mSPSTx, txFullScale, rtsc, rach_delay);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> return true;</span><br><span> }</span><br><span> </span><br><span>@@ -719,8 +725,6 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_PACKET_LENGTH 100</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /**</span><br><span> * Matches a buffer with a command.</span><br><span> * @param buf a buffer to look command in</span><br><span>@@ -750,27 +754,77 @@</span><br><span> return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool Transceiver::driveControl(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+void Transceiver::ctrl_sock_send(ctrl_msg& m, int chan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char buffer[MAX_PACKET_LENGTH + 1];</span><br><span style="color: hsl(0, 100%, 40%);">- char response[MAX_PACKET_LENGTH + 1];</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_sock_state& s = mCtrlSockets[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fd *conn_bfd = &s.conn_bfd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ s.txmsgqueue.push_back(m);</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_bfd->when |= OSMO_FD_WRITE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int Transceiver::ctrl_sock_write(int chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_sock_state& s = mCtrlSockets[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (s.conn_bfd.fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ while (s.txmsgqueue.size()) {</span><br><span style="color: hsl(120, 100%, 40%);">+ const ctrl_msg m = s.txmsgqueue.front();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ s.conn_bfd.when &= ~OSMO_FD_WRITE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* try to send it over the socket */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = write(s.conn_bfd.fd, m.data, strlen(m.data) + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (errno == EAGAIN) {</span><br><span style="color: hsl(120, 100%, 40%);">+ s.conn_bfd.when |= OSMO_FD_WRITE;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ s.txmsgqueue.pop_front();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+close:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGCHAN(chan, DTRXCTRL, NOTICE) << "mCtrlSockets write(" << s.conn_bfd.fd << ") failed: " << rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int Transceiver::ctrl_sock_handle_rx(int chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_msg cmd_received;</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_msg cmd_to_send;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *buffer = cmd_received.data;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *response = cmd_to_send.data;</span><br><span> char *command, *params;</span><br><span> int msgLen;</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_sock_state& s = mCtrlSockets[chan];</span><br><span> </span><br><span> /* Attempt to read from control socket */</span><br><span style="color: hsl(0, 100%, 40%);">- msgLen = read(mCtrlSockets[chan], buffer, MAX_PACKET_LENGTH);</span><br><span style="color: hsl(120, 100%, 40%);">+ msgLen = read(s.conn_bfd.fd, buffer, sizeof(cmd_received.data)-1);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (msgLen < 0 && errno == EAGAIN)</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0; /* Try again later */</span><br><span> if (msgLen <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGCHAN(chan, DTRXCTRL, NOTICE) << "mCtrlSockets read(" << mCtrlSockets[chan] << ") failed: " << msgLen;</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGCHAN(chan, DTRXCTRL, NOTICE) << "mCtrlSockets read(" << s.conn_bfd.fd << ") failed: " << msgLen;</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EIO;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Zero-terminate received string */</span><br><span> buffer[msgLen] = '\0';</span><br><span> </span><br><span> /* Verify a command signature */</span><br><span> if (strncmp(buffer, "CMD ", 4)) {</span><br><span> LOGCHAN(chan, DTRXCTRL, NOTICE) << "bogus message on control interface";</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EIO;</span><br><span> }</span><br><span> </span><br><span> /* Set command pointer */</span><br><span>@@ -889,7 +943,7 @@</span><br><span> if ((timeslot < 0) || (timeslot > 7)) {</span><br><span> LOGCHAN(chan, DTRXCTRL, NOTICE) << "bogus message on control interface";</span><br><span> sprintf(response,"RSP SETSLOT 1 %d %d",timeslot,corrCode);</span><br><span style="color: hsl(0, 100%, 40%);">- return true;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> mStates[chan].chanType[timeslot] = (ChannelCombination) corrCode;</span><br><span> setModulus(timeslot, chan);</span><br><span>@@ -921,12 +975,8 @@</span><br><span> }</span><br><span> </span><br><span> LOGCHAN(chan, DTRXCTRL, INFO) << "response is '" << response << "'";</span><br><span style="color: hsl(0, 100%, 40%);">- msgLen = write(mCtrlSockets[chan], response, strlen(response) + 1);</span><br><span style="color: hsl(0, 100%, 40%);">- if (msgLen <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGCHAN(chan, DTRXCTRL, NOTICE) << "mCtrlSockets write(" << mCtrlSockets[chan] << ") failed: " << msgLen;</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return true;</span><br><span style="color: hsl(120, 100%, 40%);">+ transceiver->ctrl_sock_send(cmd_to_send, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span> bool Transceiver::driveTxPriorityQueue(size_t chan)</span><br><span>@@ -1179,28 +1229,6 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void *ControlServiceLoopAdapter(TrxChanThParams *params)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- char thread_name[16];</span><br><span style="color: hsl(0, 100%, 40%);">- Transceiver *trx = params->trx;</span><br><span style="color: hsl(0, 100%, 40%);">- size_t num = params->num;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- free(params);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(thread_name, 16, "CtrlService%zu", num);</span><br><span style="color: hsl(0, 100%, 40%);">- set_selfthread_name(thread_name);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!trx->driveControl(num)) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGCHAN(num, DTRXCTRL, FATAL) << "Something went wrong in thread " << thread_name << ", requesting stop";</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- pthread_testcancel();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> void *TxUpperLoopAdapter(TrxChanThParams *params)</span><br><span> {</span><br><span> char thread_name[16];</span><br><span>diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h</span><br><span>index ed063dd..6e0d157 100644</span><br><span>--- a/Transceiver52M/Transceiver.h</span><br><span>+++ b/Transceiver52M/Transceiver.h</span><br><span>@@ -33,11 +33,14 @@</span><br><span> </span><br><span> extern "C" {</span><br><span> #include <osmocom/core/signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/select.h></span><br><span> #include "config_defs.h"</span><br><span> }</span><br><span> </span><br><span> class Transceiver;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern Transceiver *transceiver;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /** Channel descriptor for transceiver object and channel number pair */</span><br><span> struct TrxChanThParams {</span><br><span> Transceiver *trx;</span><br><span>@@ -142,12 +145,33 @@</span><br><span> } ChannelCombination;</span><br><span> </span><br><span> private:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ctrl_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+ char data[101];</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_msg() {};</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ctrl_sock_state {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fd conn_bfd;</span><br><span style="color: hsl(120, 100%, 40%);">+ std::deque<ctrl_msg> txmsgqueue;</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_sock_state() {</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_bfd.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ ~ctrl_sock_state() {</span><br><span style="color: hsl(120, 100%, 40%);">+ if(conn_bfd.fd >= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ close(conn_bfd.fd);</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_bfd.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fd_unregister(&conn_bfd);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int mBasePort;</span><br><span> std::string mLocalAddr;</span><br><span> std::string mRemoteAddr;</span><br><span> </span><br><span> std::vector<int> mDataSockets; ///< socket for writing to/reading from GSM core</span><br><span style="color: hsl(0, 100%, 40%);">- std::vector<int> mCtrlSockets; ///< socket for writing/reading control commands from GSM core</span><br><span style="color: hsl(120, 100%, 40%);">+ std::vector<ctrl_sock_state> mCtrlSockets; ///< socket for writing/reading control commands from GSM core</span><br><span> int mClockSocket; ///< socket for writing clock updates to GSM core</span><br><span> </span><br><span> std::vector<VectorQueue> mTxPriorityQueues; ///< priority queue of transmit bursts received from GSM core</span><br><span>@@ -156,7 +180,6 @@</span><br><span> std::vector<Thread *> mRxServiceLoopThreads; ///< thread to pull bursts into receive FIFO</span><br><span> Thread *mRxLowerLoopThread; ///< thread to pull bursts into receive FIFO</span><br><span> Thread *mTxLowerLoopThread; ///< thread to push bursts into transmit FIFO</span><br><span style="color: hsl(0, 100%, 40%);">- std::vector<Thread *> mControlServiceLoopThreads; ///< thread to process control messages from GSM core</span><br><span> std::vector<Thread *> mTxPriorityQueueServiceLoopThreads; ///< thread to process transmit bursts from GSM core</span><br><span> </span><br><span> GSM::Time mTransmitLatency; ///< latency between basestation clock and transmit deadline clock</span><br><span>@@ -193,6 +216,12 @@</span><br><span> /** send messages over the clock socket */</span><br><span> bool writeClockInterface(void);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ static int ctrl_sock_cb(struct osmo_fd *bfd, unsigned int flags);</span><br><span style="color: hsl(120, 100%, 40%);">+ int ctrl_sock_write(int chan);</span><br><span style="color: hsl(120, 100%, 40%);">+ void ctrl_sock_send(ctrl_msg& m, int chan);</span><br><span style="color: hsl(120, 100%, 40%);">+ /** drive handling of control messages from GSM core */</span><br><span style="color: hsl(120, 100%, 40%);">+ int ctrl_sock_handle_rx(int chan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int mSPSTx; ///< number of samples per Tx symbol</span><br><span> int mSPSRx; ///< number of samples per Rx symbol</span><br><span> size_t mChans;</span><br><span>@@ -229,9 +258,6 @@</span><br><span> /** drive transmission of GSM bursts */</span><br><span> void driveTxFIFO();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /** drive handling of control messages from GSM core */</span><br><span style="color: hsl(0, 100%, 40%);">- bool driveControl(size_t chan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /**</span><br><span> drive modulation and sorting of GSM bursts from GSM core</span><br><span> @return true if a burst was transferred successfully</span><br><span>@@ -242,7 +268,6 @@</span><br><span> friend void *TxUpperLoopAdapter(TrxChanThParams *params);</span><br><span> friend void *RxLowerLoopAdapter(Transceiver *transceiver);</span><br><span> friend void *TxLowerLoopAdapter(Transceiver *transceiver);</span><br><span style="color: hsl(0, 100%, 40%);">- friend void *ControlServiceLoopAdapter(TrxChanThParams *params);</span><br><span> </span><br><span> </span><br><span> void reset();</span><br><span>@@ -256,8 +281,5 @@</span><br><span> void *RxLowerLoopAdapter(Transceiver *transceiver);</span><br><span> void *TxLowerLoopAdapter(Transceiver *transceiver);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/** control message handler thread loop */</span><br><span style="color: hsl(0, 100%, 40%);">-void *ControlServiceLoopAdapter(TrxChanThParams *params);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /** transmit queueing thread loop */</span><br><span> void *TxUpperLoopAdapter(TrxChanThParams *params);</span><br><span>diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp</span><br><span>index 0ad60ef..9f625eb 100644</span><br><span>--- a/Transceiver52M/osmo-trx.cpp</span><br><span>+++ b/Transceiver52M/osmo-trx.cpp</span><br><span>@@ -79,7 +79,6 @@</span><br><span> </span><br><span> static RadioDevice *usrp;</span><br><span> static RadioInterface *radio;</span><br><span style="color: hsl(0, 100%, 40%);">-static Transceiver *transceiver;</span><br><span> </span><br><span> /* Create radio interface</span><br><span> * The interface consists of sample rate changes, frequency shifts,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/17805">change 17805</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/+/17805"/><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: I642a34451e1825eafecf71a902df916ccee7944c </div>
<div style="display:none"> Gerrit-Change-Number: 17805 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </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: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>