[mythtv-commits] mythtv/master commit: 47d67e672 by Daniel Kristjansson (daniel-kristjansson)

MythTV noreply at mythtv.org
Mon Aug 8 14:19:33 UTC 2011


      Author:  Daniel Kristjansson <danielk at cuymedia.net>
 Change Date:  2011-08-08T07:11:53-07:00
   Push Date:  2011/08/08 07:19:23 -0700
  Repository:  mythtv
      Branch:  master
New Revision:  47d67e6722092471069c52d1b0a37509477b5d85
   Changeset:  https://github.com/MythTV/mythtv/commit/47d67e672

Log:

This adds two new classes MThread and MThreadPool to be used instead of QThread and QThreadPool.

These mirror the API's of the Qt classes but also add a requirement for a QString naming
the thread or naming the runnable which are used for debugging. These wrappers also make
sure mysql connections are torn down properly and have a number of safety checks and
assurances. The destructor for MThread also makes sure that a thread has stopped running
before we allow the QThread to be deleted. And MThreaPool makes sure all it's threads
have stopped running. MThread has a Cleanup() method that attempts to shut down any threads
that are running, it only works for threads that exit on a call to exit(), which includes
any threads using the Qt event loop. It will also print out the names of the threads that
are still running for debugging purposes.

MThread has one special constructor. It takes a QRunnable* and runs it instead of the
Qt event loop in the default run() implementation. Unlike MThreadPool and QThreadPool,
MThread does not delete this runnable when it exits. This allows you to run something
with less boilerplate code. Just like with QThread in Qt4 it really is better to use
the Qt event loop rather than write your own. As you don't use the Qt event loop QObject
deleteLater's are not executed until the  thread exits, Qt events and timers do not work
making Qt networking classes misbehave and signals/slots are generally unsafe. However,
many of the threads with event loops in MythTV were written before Qt allowed an event
loop outside the main thread so this syntactic sugar just lets us handle that with less
lines of code.

There are a few other differences with respect to Qt's classes other than requiring a name.
First, MThread does not inherit from QObject, if you need QObject services in a threading
class you will need to inherit from QObject seperately. Note when you inherit from QObject,
you must inherit from no more than one QObject based class and it must be first in the list
of classes your class inherits from (a Qt restriction). Second, QThread doesn't implement
most of QThread's static methods, notably QThread::currentThread(). It does make the
underlying QThread available via the qthread() method.. but the usual reason to use
QThread::currentThread() is to check which thread you are running in.. for this there
is a set of helper functions is_current_thread(MThread&), is_current_thread(QThread*),
and is_current_thread(MThread*) which you can use instead. Finally, MThreadPool does not
have reserveThread() and releaseThread() calls; instead use startReserved(). The
reserveThread() and releaseThread() API is not a good API because it doesn't ensure that
your runnable starts right away even though the thread will eventually not be counted
amoung those forcing other threads to go to the queue rather than running right away.

Added:

   mythtv/libs/libmythbase/mthread.cpp
   mythtv/libs/libmythbase/mthread.h
   mythtv/libs/libmythbase/mthreadpool.cpp
   mythtv/libs/libmythbase/mthreadpool.h

Modified:

   mythplugins/mytharchive/mytharchive/recordingselector.cpp
   mythplugins/mythgallery/mythgallery/galleryfilterdlg.cpp
   mythplugins/mythgallery/mythgallery/glsingleview.cpp
   mythplugins/mythgallery/mythgallery/glsingleview.h
   mythplugins/mythgallery/mythgallery/iconview.cpp
   mythplugins/mythgallery/mythgallery/iconview.h
   mythplugins/mythgallery/mythgallery/thumbgenerator.cpp
   mythplugins/mythgallery/mythgallery/thumbgenerator.h
   mythplugins/mythmusic/mythmusic/avfdecoder.cpp
   mythplugins/mythmusic/mythmusic/cddecoder.cpp
   mythplugins/mythmusic/mythmusic/cdrip.cpp
   mythplugins/mythmusic/mythmusic/cdrip.h
   mythplugins/mythmusic/mythmusic/databasebox.cpp
   mythplugins/mythmusic/mythmusic/databasebox.h
   mythplugins/mythmusic/mythmusic/decoder.cpp
   mythplugins/mythmusic/mythmusic/decoder.h
   mythplugins/mythmusic/mythmusic/importmusic.cpp
   mythplugins/mythmusic/mythmusic/importmusic.h
   mythplugins/mythmusic/mythmusic/metadata.cpp
   mythplugins/mythmusic/mythmusic/metadata.h
   mythplugins/mythmusic/mythmusic/playbackbox.cpp
   mythplugins/mythmusic/mythmusic/playlistcontainer.cpp
   mythplugins/mythmusic/mythmusic/playlistcontainer.h
   mythtv/libs/libmyth/audio/audiooutputbase.cpp
   mythtv/libs/libmyth/audio/audiooutputbase.h
   mythtv/libs/libmyth/audio/audiopulsehandler.cpp
   mythtv/libs/libmyth/audio/audiopulsehandler.h
   mythtv/libs/libmyth/mythcontext.cpp
   mythtv/libs/libmyth/mythmediamonitor.cpp
   mythtv/libs/libmyth/mythmediamonitor.h
   mythtv/libs/libmyth/netgrabbermanager.cpp
   mythtv/libs/libmyth/netgrabbermanager.h
   mythtv/libs/libmyth/programinfoupdater.cpp
   mythtv/libs/libmyth/programinfoupdater.h
   mythtv/libs/libmythbase/libmythbase.pro
   mythtv/libs/libmythbase/logging.cpp
   mythtv/libs/libmythbase/logging.h
   mythtv/libs/libmythbase/mythcorecontext.cpp
   mythtv/libs/libmythbase/mythdb.cpp
   mythtv/libs/libmythbase/mythdbcon.cpp
   mythtv/libs/libmythbase/mythdbcon.h
   mythtv/libs/libmythbase/mythdownloadmanager.cpp
   mythtv/libs/libmythbase/mythdownloadmanager.h
   mythtv/libs/libmythbase/mythsignalingtimer.cpp
   mythtv/libs/libmythbase/mythsignalingtimer.h
   mythtv/libs/libmythbase/mythsocketthread.cpp
   mythtv/libs/libmythbase/mythsocketthread.h
   mythtv/libs/libmythbase/mythsystem.cpp
   mythtv/libs/libmythbase/mythsystem.h
   mythtv/libs/libmythbase/system-unix.cpp
   mythtv/libs/libmythbase/system-unix.h
   mythtv/libs/libmythbase/system-windows.cpp
   mythtv/libs/libmythbase/system-windows.h
   mythtv/libs/libmythmetadata/metadatadownload.cpp
   mythtv/libs/libmythmetadata/metadatadownload.h
   mythtv/libs/libmythmetadata/metadataimagedownload.cpp
   mythtv/libs/libmythmetadata/metadataimagedownload.h
   mythtv/libs/libmythmetadata/videoscan.cpp
   mythtv/libs/libmythmetadata/videoscan.h
   mythtv/libs/libmythprotoserver/mythsocketmanager.cpp
   mythtv/libs/libmythprotoserver/requesthandler/deletethread.cpp
   mythtv/libs/libmythprotoserver/requesthandler/deletethread.h
   mythtv/libs/libmythprotoserver/requesthandler/fileserverhandler.cpp
   mythtv/libs/libmythtv/DeviceReadBuffer.cpp
   mythtv/libs/libmythtv/DeviceReadBuffer.h
   mythtv/libs/libmythtv/NuppelVideoRecorder.cpp
   mythtv/libs/libmythtv/NuppelVideoRecorder.h
   mythtv/libs/libmythtv/ThreadedFileWriter.cpp
   mythtv/libs/libmythtv/ThreadedFileWriter.h
   mythtv/libs/libmythtv/asisignalmonitor.cpp
   mythtv/libs/libmythtv/asistreamhandler.cpp
   mythtv/libs/libmythtv/asistreamhandler.h
   mythtv/libs/libmythtv/bdringbuffer.cpp
   mythtv/libs/libmythtv/channelbase.h
   mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp
   mythtv/libs/libmythtv/channelscan/channelscan_sm.h
   mythtv/libs/libmythtv/dvbcam.cpp
   mythtv/libs/libmythtv/dvbcam.h
   mythtv/libs/libmythtv/dvbsignalmonitor.cpp
   mythtv/libs/libmythtv/dvbstreamhandler.cpp
   mythtv/libs/libmythtv/dvbstreamhandler.h
   mythtv/libs/libmythtv/eitscanner.cpp
   mythtv/libs/libmythtv/eitscanner.h
   mythtv/libs/libmythtv/fifowriter.cpp
   mythtv/libs/libmythtv/fifowriter.h
   mythtv/libs/libmythtv/firewiresignalmonitor.cpp
   mythtv/libs/libmythtv/firewiresignalmonitor.h
   mythtv/libs/libmythtv/hdhrstreamhandler.cpp
   mythtv/libs/libmythtv/hdhrstreamhandler.h
   mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp
   mythtv/libs/libmythtv/iptv/iptvchannelfetcher.h
   mythtv/libs/libmythtv/iptvsignalmonitor.cpp
   mythtv/libs/libmythtv/iptvsignalmonitor.h
   mythtv/libs/libmythtv/jobqueue.cpp
   mythtv/libs/libmythtv/jobqueue.h
   mythtv/libs/libmythtv/linuxfirewiredevice.cpp
   mythtv/libs/libmythtv/linuxfirewiredevice.h
   mythtv/libs/libmythtv/mhi.cpp
   mythtv/libs/libmythtv/mhi.h
   mythtv/libs/libmythtv/mythcommflagplayer.cpp
   mythtv/libs/libmythtv/mythplayer.cpp
   mythtv/libs/libmythtv/mythplayer.h
   mythtv/libs/libmythtv/mythsystemevent.cpp
   mythtv/libs/libmythtv/previewgenerator.cpp
   mythtv/libs/libmythtv/previewgenerator.h
   mythtv/libs/libmythtv/previewgeneratorqueue.cpp
   mythtv/libs/libmythtv/previewgeneratorqueue.h
   mythtv/libs/libmythtv/privatedecoder_crystalhd.cpp
   mythtv/libs/libmythtv/privatedecoder_crystalhd.h
   mythtv/libs/libmythtv/recorderbase.h
   mythtv/libs/libmythtv/ringbuffer.cpp
   mythtv/libs/libmythtv/ringbuffer.h
   mythtv/libs/libmythtv/signalmonitor.cpp
   mythtv/libs/libmythtv/signalmonitor.h
   mythtv/libs/libmythtv/streamhandler.cpp
   mythtv/libs/libmythtv/streamhandler.h
   mythtv/libs/libmythtv/tv_play.cpp
   mythtv/libs/libmythtv/tv_play.h
   mythtv/libs/libmythtv/tv_rec.cpp
   mythtv/libs/libmythtv/tv_rec.h
   mythtv/libs/libmythtv/tvbrowsehelper.cpp
   mythtv/libs/libmythtv/tvbrowsehelper.h
   mythtv/libs/libmythtv/v4lrecorder.h
   mythtv/libs/libmythtv/videosource.h
   mythtv/libs/libmythui/AppleRemote.cpp
   mythtv/libs/libmythui/AppleRemote.h
   mythtv/libs/libmythui/jsmenu.cpp
   mythtv/libs/libmythui/jsmenu.h
   mythtv/libs/libmythui/lirc.cpp
   mythtv/libs/libmythui/lirc.h
   mythtv/libs/libmythui/mythrender_vdpau.cpp
   mythtv/libs/libmythui/mythscreentype.cpp
   mythtv/libs/libmythui/mythuihelper.cpp
   mythtv/libs/libmythui/mythuihelper.h
   mythtv/libs/libmythupnp/ssdp.cpp
   mythtv/libs/libmythupnp/ssdp.h
   mythtv/libs/libmythupnp/taskqueue.cpp
   mythtv/libs/libmythupnp/taskqueue.h
   mythtv/libs/libmythupnp/threadpool.cpp
   mythtv/libs/libmythupnp/threadpool.h
   mythtv/programs/mythbackend/autoexpire.cpp
   mythtv/programs/mythbackend/autoexpire.h
   mythtv/programs/mythbackend/housekeeper.cpp
   mythtv/programs/mythbackend/housekeeper.h
   mythtv/programs/mythbackend/main.cpp
   mythtv/programs/mythbackend/mainserver.cpp
   mythtv/programs/mythbackend/mainserver.h
   mythtv/programs/mythbackend/scheduler.cpp
   mythtv/programs/mythbackend/scheduler.h
   mythtv/programs/mythfrontend/audiogeneralsettings.cpp
   mythtv/programs/mythfrontend/audiogeneralsettings.h
   mythtv/programs/mythfrontend/backendconnectionmanager.cpp
   mythtv/programs/mythfrontend/networkcontrol.cpp
   mythtv/programs/mythfrontend/networkcontrol.h
   mythtv/programs/mythfrontend/playbackboxhelper.cpp
   mythtv/programs/mythfrontend/playbackboxhelper.h
   mythtv/programs/mythfrontend/programinfocache.cpp
   mythtv/programs/mythfrontend/themechooser.cpp
   mythtv/programs/mythfrontend/upnpscanner.cpp
   mythtv/programs/mythfrontend/upnpscanner.h
   mythtv/programs/mythtranscode/mpeg2fix.cpp



More information about the mythtv-commits mailing list