FFmpeg nechal kvůli porušení autorských práv odstranit z GitHubu jeden z repozitářů patřících čínské technologické firmě Rockchip. Důvodem bylo porušení LGPL ze strany Rockchipu. Rockchip byl FFmpegem na porušování LGPL upozorněn již téměř před dvěma roky.
K dispozici je nový CLI nástroj witr sloužící k analýze běžících procesů. Název je zkratkou slov why-is-this-running, 'proč tohle běží'. Klade si za cíl v 'jediném, lidsky čitelném, výstupu vysvětlit odkud daný spuštěný proces pochází, jak byl spuštěn a jaký řetězec systémů je zodpovědný za to, že tento proces právě teď běží'. Witr je napsán v jazyce Go.
Yazi je správce souborů běžící v terminálu. Napsán je v programovacím jazyce Rust. Podporuje asynchronní I/O operace. Vydán byl v nové verzi 25.12.29. Instalovat jej lze také ze Snapcraftu.
Od soboty do úterý probíhá v Hamburku konference 39C3 (Chaos Communication Congress) věnovaná také počítačové bezpečnosti nebo hardwaru. Program (jiná verze) slibuje řadu zajímavých přednášek. Streamy a záznamy budou k dispozici na media.ccc.de.
Byl představen nový Xserver Phoenix, kompletně od nuly vyvíjený v programovacím jazyce Zig. Projekt Phoenix si klade za cíl být moderní alternativou k X.Org serveru.
XLibre Xserver byl 21. prosince vydán ve verzi 25.1.0, 'winter solstice release'. Od založení tohoto forku X.Org serveru se jedná o vůbec první novou minor verzi (inkrementovalo se to druhé číslo v číselném kódu verze).
Wayback byl vydán ve verzi 0.3. Wayback je "tak akorát Waylandu, aby fungoval Xwayland". Jedná se o kompatibilní vrstvu umožňující běh plnohodnotných X11 desktopových prostředí s využitím komponent z Waylandu. Cílem je nakonec nahradit klasický server X.Org, a tím snížit zátěž údržby aplikací X11.
Byla vydána verze 4.0.0 programovacího jazyka Ruby (Wikipedie). S Ruby Box a ZJIT. Ruby lze vyzkoušet na webové stránce TryRuby. U příležitosti 30. narozenin, první veřejná verze Ruby 0.95 byla oznámena 21. prosince 1995, proběhl redesign webových stránek.
Všem čtenářkám a čtenářům AbcLinuxu krásné Vánoce.
Byla vydána nová verze 7.0 linuxové distribuce Parrot OS (Wikipedie). S kódovým názvem Echo. Jedná se o linuxovou distribuci založenou na Debianu a zaměřenou na penetrační testování, digitální forenzní analýzu, reverzní inženýrství, hacking, anonymitu nebo kryptografii. Přehled novinek v příspěvku na blogu.
class Thread{
private:
pthread_t m_tHandle;
unsigned int m_nStatus;
Mutex m_tMutex;
public:
enum Status{
NotRunning = 0,
Running = 1,
Suspended = 2,
Zombie = 3
};
Thread();
virtual ~Thread();
void run();
void kill();
void wait();
pthread_t handle() const { return m_tHandle; };
void handle( pthread_t handle ) { m_tHandle = handle; }
void lock() { m_tMutex.lock(); }
void unlock(){ m_tMutex.unlock(); }
bool tryLock(){ return m_tMutex.tryLock(); }
void status( unsigned int status );
unsigned int status() const { return m_nStatus; }
virtual void start();
virtual void stop();
static void waitForAll();
};
static void *entry_point(void *thread_)
{
Thread* thread = reinterpret_cast<Thread*>(thread_);
signal(SIGQUIT, signal_handler_SIGQUIT);
thread_list_mutex.lock();
thread_list.insert( std::make_pair(pthread_self(), thread) );
thread_list_mutex.unlock();
thread->handle(pthread_self());
thread->start();
thread->stop();
thread->status(Thread::Zombie);
pthread_exit(NULL);
return NULL;
}
void Thread::run()
{
if( status() == NotRunning )
{
label_create:
status(Running);
pthread_create(&m_tHandle, NULL, &entry_point, this);
}
else if( status() == Zombie ){
wait();
goto label_create;
}
}
Ve funkci static void *entry_point(void *thread_) volám thread->start(). Problém je, že se vždy zavolá metoda start() třídy Thread a né metoda odvozené třídy MujThread:
class MujThread: public Thread{
public:
MujThread(){}
virtual ~MujThread(){}
virtual void start()
{
printf("MujThread start()\n");
while(true);
}
virtual void stop()
{
printf("MujThread stop()\n");
}
};
(Thread*)thread_, bezúspěšně. Vím ale, že ten kód ještě nedávno fungoval. Pomalu bych řekl, že přestal fungovat po aktualizaci gcc.
pure virtual method called terminate called without an active exception ./testutk: line 4: 6543 Neúspěšně ukončen (SIGABRT)
Nemáte dohromady ty verze GCC smíchané (že by kus kódu byl zkompilovaný se starou verzí)?
make clean.
MujThread::start() nedávat jako inline. Kompilátor by sice měl být dost chytrý, aby buď ignoroval evidentní chybu programátora, nebo protestoval, jenže právě to ignorování chyby lze provést dvěma způsoby: buď bude ignorovat virtual nebo inline (zde implicitní). Musel bych se podívat, co v takové situaci předepisuje specifikace jazyka, ale v každém případě bude jistější nepožadovat po překladači něco, co je principiálně nemožné.
MujThred::start() jako inline, nefunguje to. Mám jinou třídu (Application):
class Application{
....
public:
....
virtual bool onInit() { return true; }
virtual void onQuit() {}
....
};
Od té odvozuji TestApplication:
class TestApplication: public Application{
protected:
MujThread t;
public:
virtual bool onInit()
{
...
t.run();
return true;
}
virtual void onQuit()
{
t.kill();
}
};
Zde však volání virtuálních metod funguje správně, což popírá vaši domněnku. (Už jste viděl zdrojový kód Qt knihovny? Je tam toho plno.) Problém bude nejspíš jinde. A jak říkám výše, ten kód fungoval naprosto bezchybně, když jsem ho před časem použil (ale na jiné distribuci, s jiným kernelem - 2.6.17, teď 2.6.18 - a s trochu nižší verzí GCC).
Thread::run() (viz. kód výše), konkrétně se zavolá po vytvoření nového vlákna: pthread_create(&m_tHandle, NULL, &entry_point, this).
Tiskni
Sdílej: