MMS, libSDL, events, polling and CPU usage.

Everything about the new development branch of mms

Moderator: Moderator

lorenzodes
master
Posts: 772
Joined: Sun Mar 11, 2007 4:50 pm
Location: move.l 4.w,a6

MMS, libSDL, events, polling and CPU usage.

Postby lorenzodes » Fri Aug 03, 2012 10:15 am

I've spent the last days trying to reduce the number of wakeup events per second caused by the several therads used in MMS. The goal is to make it consume less electricity which, in case of a laptop, also means the battery lasts longer.

I think I made a decent job. Before MMS caused about 70 wakeups per second, now it's less than 30. This with the SDL output plugin and xine as audio player.

I have changed several parts of MMS.

Better handling of spurious wakeups (i.e. when a signal forces pthread_cond_wait() and pthread_cond_timedwait() to return even when the condition is false).

I also have optimized the updater.

More can be done with the notify area, which is next in list.

But SDL is an ungly beast, SDL poll for events every 10 milliseconds. This is what SDL_WaitEvent does in SDL 1.2.x:

Code: Select all

int SDL_WaitEvent (SDL_Event *event)
{
    while ( 1 ) {
       SDL_PumpEvents();
       switch(SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) {
          case -1: return 0;
           case 1: return 1;
           case 0: SDL_Delay(10);
       }
    }
}


Considering SDL_PumpEvents (used to populate the even queue of libSDL) is not multithread safe, since a long time MMS has given up using SDL_WaitEvent() and replaced SDL_PumpEvents() with a a substitute coded by us. In the process, we took the chance to do less polling and call SDL_PeepEvents() every 25 milliseconds instead of 10, but that still meant polling 40 times a seconds forever. Still lots of CPU cycles wasted for nothing.

The current codebase is a little more flexible. It starts by polling every 20 milliseconds (50 times a second) and, if nothing happens after 400 cycles (8 seconds), if no input event can be processed, it takes things slower and waits for 200 milliseconds at each loop.

Now the point is: is this noticeable for the final user? Does it make MMS less responsive and more laggy? In my opinion just slightly, but it is barely noticeable. What do you think?

Other things to try out are audio playback and lyrics.

Hope to get some feedback :)
"I’m not frightened of dying, anytime will do, I don’t mind. Why should I be frightened of dying? There’s no reason for it, you gotta go sometime"

User avatar
Uatschitchun
Overlord
Posts: 3189
Joined: Tue Dec 06, 2005 6:55 pm
Location: Germany
Contact:

Re: MMS, libSDL, events, polling and CPU usage.

Postby Uatschitchun » Thu Sep 13, 2012 3:01 pm

Now the point is: is this noticeable for the final user?


How to test?
Lg
Roman

lorenzodes
master
Posts: 772
Joined: Sun Mar 11, 2007 4:50 pm
Location: move.l 4.w,a6

Re: MMS, libSDL, events, polling and CPU usage.

Postby lorenzodes » Thu Sep 13, 2012 3:11 pm

Uatschitchun wrote:
Now the point is: is this noticeable for the final user?


How to test?



Use the GUI, see if input processing is fast or laggy ;)
"I’m not frightened of dying, anytime will do, I don’t mind. Why should I be frightened of dying? There’s no reason for it, you gotta go sometime"

User avatar
Uatschitchun
Overlord
Posts: 3189
Joined: Tue Dec 06, 2005 6:55 pm
Location: Germany
Contact:

Re: MMS, libSDL, events, polling and CPU usage.

Postby Uatschitchun » Fri Sep 14, 2012 6:06 am

Yes, ok, but there weren't any changes to upstream since 05/12!?
Lg

Roman

lorenzodes
master
Posts: 772
Joined: Sun Mar 11, 2007 4:50 pm
Location: move.l 4.w,a6

Re: MMS, libSDL, events, polling and CPU usage.

Postby lorenzodes » Fri Sep 14, 2012 10:07 am

Uatschitchun wrote:Yes, ok, but there weren't any changes to upstream since 05/12!?


viewtopic.php?f=28&t=2893 ;)

http://bazaar.launchpad.net/~team-mms-n ... revid=2574
"I’m not frightened of dying, anytime will do, I don’t mind. Why should I be frightened of dying? There’s no reason for it, you gotta go sometime"

User avatar
Uatschitchun
Overlord
Posts: 3189
Joined: Tue Dec 06, 2005 6:55 pm
Location: Germany
Contact:

Re: MMS, libSDL, events, polling and CPU usage.

Postby Uatschitchun » Mon Sep 17, 2012 10:39 am

Ah ;)

Found one:

Code: Select all

$ make -C src/plugins/feature/python/
make: Gehe in Verzeichnis '/usr/local/src/mms/mms-1.3.0/src/plugins/feature/python'
/usr/bin/g++ -O3 -pipe -funit-at-a-time -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fPIC  -I/usr/include/python2.7 -I/usr/include/python2.7 -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security\
                  -c -I./ -I../ -I../../ -I../../../  -I/usr/local/src/mms/mms-1.3.0/./libs -I/usr/local/src/mms/mms-1.3.0/./include/mms/ -I./libgui/ -I./libpython/ -I/usr/local/src/mms/mms-1.3.0/./src/plugins/input/ \
                  -MMD -MP -MF"guiwindowscripts.d" -MT"guiwindowscripts.o guiwindowscripts.d" -o"guiwindowscripts.o" "guiwindowscripts.cpp"
cc1plus: Warnung: Kommandozeilenoption »-Wstrict-prototypes« ist gültig für Ada/C/ObjC, aber nicht für C++ [standardmäßig aktiviert]
/usr/bin/g++ -O3 -pipe -funit-at-a-time -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fPIC  -I/usr/include/python2.7 -I/usr/include/python2.7 -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security\
                  -c -I./ -I../ -I../../ -I../../../  -I/usr/local/src/mms/mms-1.3.0/./libs -I/usr/local/src/mms/mms-1.3.0/./include/mms/ -I./libgui/ -I./libpython/ -I/usr/local/src/mms/mms-1.3.0/./src/plugins/input/ \
                  -MMD -MP -MF"python_config.d" -MT"python_config.o python_config.d" -o"python_config.o" "python_config.cpp"
cc1plus: Warnung: Kommandozeilenoption »-Wstrict-prototypes« ist gültig für Ada/C/ObjC, aber nicht für C++ [standardmäßig aktiviert]
/usr/bin/g++ -O3 -pipe -funit-at-a-time -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fPIC  -I/usr/include/python2.7 -I/usr/include/python2.7 -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security\
                  -c -I./ -I../ -I../../ -I../../../  -I/usr/local/src/mms/mms-1.3.0/./libs -I/usr/local/src/mms/mms-1.3.0/./include/mms/ -I./libgui/ -I./libpython/ -I/usr/local/src/mms/mms-1.3.0/./src/plugins/input/ \
                  -MMD -MP -MF"python.d" -MT"python.o python.d" -o"python.o" "python.cpp"
cc1plus: Warnung: Kommandozeilenoption »-Wstrict-prototypes« ist gültig für Ada/C/ObjC, aber nicht für C++ [standardmäßig aktiviert]
In file included from python.cpp:1:0:
python.hpp:16:4: Fehler: expected class-name before »{« token
python.hpp:18:8: Fehler: »Option« bezeichnet keinen Typ
python.hpp:25:20: Fehler: »Option« wurde in diesem Gültigkeitsbereich nicht definiert
python.hpp:25:27: Fehler: Templateargument 1 ist ungültig
python.hpp:25:27: Fehler: Templateargument 2 ist ungültig
python.hpp: In Elementfunktion »int Python::PythonOpts::values()«:
python.hpp:27:18: Fehler: »val« wurde in diesem Gültigkeitsbereich nicht definiert
python.cpp: In Elementfunktion »std::string Python::findResDepCfg(const string&)«:
python.cpp:29:20: Warnung: Vergleich zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlausdrücken [-Wsign-compare]
python.cpp: In Elementfunktion »virtual std::string Python::mainloop()«:
python.cpp:71:12: Warnung: Variable »pGlobal« wird nicht verwendet [-Wunused-variable]
python.cpp: In Konstruktor »Python::PythonOpts::PythonOpts()«:
python.cpp:141:3: Fehler: »header« wurde in diesem Gültigkeitsbereich nicht definiert
python.cpp:142:3: Fehler: »translated_header« wurde in diesem Gültigkeitsbereich nicht definiert
python.cpp:143:3: Fehler: »save_name« wurde in diesem Gültigkeitsbereich nicht definiert
python.cpp:147:3: Fehler: »m_pReload« wurde in diesem Gültigkeitsbereich nicht definiert
python.cpp:147:19: Fehler: expected type-specifier before »Option«
python.cpp:147:19: Fehler: expected »;« before »Option«
python.cpp:149:3: Fehler: »val« wurde in diesem Gültigkeitsbereich nicht definiert
python.cpp:152:17: Fehler: »go« wurde in diesem Gültigkeitsbereich nicht definiert
python.cpp: In Destruktor »Python::PythonOpts::~PythonOpts()«:
python.cpp:166:10: Fehler: »m_pReload« wurde in diesem Gültigkeitsbereich nicht definiert
make: *** [python.o] Fehler 1
make: Verlasse Verzeichnis '/usr/local/src/mms/mms-1.3.0/src/plugins/feature/python'


and another one:

Code: Select all

$ make -C src/plugins/feature/rip/
make: Gehe in Verzeichnis '/usr/local/src/mms/mms-1.3.0/src/plugins/feature/rip'
/usr/bin/g++ -O3 -pipe -funit-at-a-time -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fPIC \
                  -c -I./ -I../ -I../../ -I../../../  -I/usr/local/src/mms/mms-1.3.0/./libs -I/usr/local/src/mms/mms-1.3.0/./include/mms/ -I/usr/include/taglib   \
                  -MMD -MP -MF"cdparanoia.d" -MT"cdparanoia.o cdparanoia.d" -o"cdparanoia.o" "cdparanoia.cpp"
/usr/bin/g++ -O3 -pipe -funit-at-a-time -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fPIC \
                  -c -I./ -I../ -I../../ -I../../../  -I/usr/local/src/mms/mms-1.3.0/./libs -I/usr/local/src/mms/mms-1.3.0/./include/mms/ -I/usr/include/taglib   \
                  -MMD -MP -MF"rip_config.d" -MT"rip_config.o rip_config.d" -o"rip_config.o" "rip_config.cpp"
/usr/bin/g++ -O3 -pipe -funit-at-a-time -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fPIC \
                  -c -I./ -I../ -I../../ -I../../../  -I/usr/local/src/mms/mms-1.3.0/./libs -I/usr/local/src/mms/mms-1.3.0/./include/mms/ -I/usr/include/taglib   \
                  -MMD -MP -MF"rip.d" -MT"rip.o rip.d" -o"rip.o" "rip.cpp"
In file included from rip.cpp:2:0:
rip.hpp:56:5: Fehler: »Options« bezeichnet keinen Typ
rip.cpp: In Elementfunktion »void Rip::WriteAifc(int, long int)«:
rip.cpp:1279:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1281:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1282:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1286:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1291:43: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1293:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1295:35: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1298:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp: In Elementfunktion »void Rip::WriteAiff(int, long int)«:
rip.cpp:1256:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1258:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1260:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1265:43: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1267:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp: In Elementfunktion »void Rip::WriteWav(int, long int)«:
rip.cpp:1236:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1238:28: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
rip.cpp:1246:24: Warnung: Der Rückgabewert von »ssize_t write(int, const void*, size_t)«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert [-Wunused-result]
make: *** [rip.o] Fehler 1
make: Verlasse Verzeichnis '/usr/local/src/mms/mms-1.3.0/src/plugins/feature/rip'
Lg

Roman

lorenzodes
master
Posts: 772
Joined: Sun Mar 11, 2007 4:50 pm
Location: move.l 4.w,a6

Re: MMS, libSDL, events, polling and CPU usage.

Postby lorenzodes » Mon Sep 17, 2012 12:09 pm

I have removed the old option system and global options. Some plugins haven't been fixed to use the new one.

BTW, I wouldn't mind some help on that account :)
"I’m not frightened of dying, anytime will do, I don’t mind. Why should I be frightened of dying? There’s no reason for it, you gotta go sometime"


Return to “1.2.x”

Who is online

Users browsing this forum: No registered users and 1 guest