Hardware > Emulatoren

AtariX => MagicOnLinux

<< < (67/77) > >>

AndreasKromke:

--- Zitat von: don_apple am Mo 19.01.2026, 12:33:30 ---(..)
Laut https://stackoverflow.com/questions/14320041/pthread-mutex-initializer-vs-pthread-mutex-init-mutex-param wird heutzutage wohl auch empfohlen pthread_mutex_init() anstatt PTHREAD_MUTEX_INITIALIZER zu verwenden.

--- Ende Zitat ---
Probieren geht über Studieren. Und es gibt fast soviele Studierende, die keine Studenten sind, wie es Studenten gibt, die nicht studieren.
Fazit: einfach mal ausprobieren. Wenn es compiliert, wird es vermutlich auch funktionieren.

OT: Mein antiker Mac hat noch Mojave, und ich war erschüttert, als ich neulich mal nachlesen mußte, wie die Amis "Mojave" pronunzieren.

Thorsten Otto:
PTHREAD_MUTEX_INIITIALIZER ist eigentlich nur für statische Variablen gedacht. An der Stelle müsste also tatsächlich

--- Code: ---pthread_mutex_init(criticalRegion, nullptr);

--- Ende Code ---
verwendet werden. Wundert mich eigentlich das es bisher überhaupt funktioniert hat.

don_apple:

--- Zitat von: AndreasKromke am Mo 19.01.2026, 14:31:53 ---Probieren geht über Studieren. Und es gibt fast soviele Studierende, die keine Studenten sind, wie es Studenten gibt, die nicht studieren.
Fazit: einfach mal ausprobieren. Wenn es compiliert, wird es vermutlich auch funktionieren.

--- Ende Zitat ---
Einen Teil der Fehler könnte ich jetzt mit folgenden Änderungen beheben:

--- Code: ---% git diff   
diff --git a/src/MagiC.cpp b/src/MagiC.cpp
index 4666eef..1bf3d6f 100644
--- a/src/MagiC.cpp
+++ b/src/MagiC.cpp
@@ -275,9 +275,9 @@ CMagiC::CMagiC()
     m_EventId = 0;
     m_InterruptEventsId = 0;
 
-    m_KbCriticalRegionId = PTHREAD_MUTEX_INITIALIZER;
+    pthread_mutex_t m_KbCriticalRegionId = PTHREAD_MUTEX_INITIALIZER;
     // m_AECriticalRegionId = PTHREAD_MUTEX_INITIALIZER;    // remnant from MagicMac(X) and AtariX
-    m_ScrCriticalRegionId = PTHREAD_MUTEX_INITIALIZER;
+    pthread_mutex_t m_ScrCriticalRegionId = PTHREAD_MUTEX_INITIALIZER;
 
     //m_iNoOfAtariFiles = 0;  // remnant from MagicMac(X) and AtariX
     m_pKbWrite = m_pKbRead = m_cKeyboardOrMouseData;
@@ -298,9 +298,9 @@ CMagiC::CMagiC()
     m_bEmulatorIsRunning = false;
 
     // inter-thread synchronisation
-    m_EventMutex = PTHREAD_MUTEX_INITIALIZER;
-    m_ConditionMutex = PTHREAD_MUTEX_INITIALIZER;
-    m_Cond = PTHREAD_COND_INITIALIZER;
+    pthread_mutex_t m_EventMutex = PTHREAD_MUTEX_INITIALIZER;
+    pthread_mutex_t m_ConditionMutex = PTHREAD_MUTEX_INITIALIZER;
+    pthread_mutex_t m_Cond = PTHREAD_COND_INITIALIZER;
 
     atomic_init(&gbAtariVideoBufChanged, false);
 }

--- Ende Code ---
Den folgenden Fehler zu beheben übersteigt allerdings meine Kenntnisse:

--- Code: ---/Users/frank/Source/magiclinux/src/MagiC.cpp:138:23: error: expected expression
    *criticalRegion = PTHREAD_MUTEX_INITIALIZER;
                      ^
In file included from /Users/frank/Source/magiclinux/src/MagiC.cpp:32:
In file included from /Users/frank/Source/magiclinux/inc/emulation_globals.h:4:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/include/c++/v1/atomic:526:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/include/c++/v1/__thread/timed_backoff_policy.h:18:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/include/c++/v1/__threading_support:37:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/include/pthread.h:185:35: note:
      expanded from macro 'PTHREAD_MUTEX_INITIALIZER'
#define PTHREAD_MUTEX_INITIALIZER {_PTHREAD_MUTEX_SIG_init, {0}}

--- Ende Code ---
Wenn ich da ebenfalls versuche ein pthread_mutex_t zu ergänzen bekomme ich andere komische Fehler  :(

AndreasKromke:
Ich kann das jetzt auf die Schnelle nicht überprüfen, aber das hier:

 pthread_mutex_t m_EventMutex = PTHREAD_MUTEX_INITIALIZER;

sieht so aus, als hättest Du eine neue (!) Variable eingeführt. Du mußt aber das Attribut verwenden, das zur Klasse gehört (class member), damit die Variable nur einmal existiert, sonst kann man damit nicht die Threads synchronisieren. Klassenattribute werden in der .h-Datei deklariert. Wenn sie statisch sind, also zur Klasse gehören und nicht jeweils zu jedem Objekt der Klasse, müssen sie in der .cpp-Datei noch definiert werden, weil sie nicht Teil eines neu erzeugten Objekts sind.

Thorsten Otto:
Versuchs mal damit:

--- Code: ---diff --git a/src/MagiC.cpp b/src/MagiC.cpp
index bf77758..ba0684d 100644
--- a/src/MagiC.cpp
+++ b/src/MagiC.cpp
@@ -139,7 +139,7 @@ void getActAtariPrg(const char **pName, uint32_t *pact_pd)
 static inline void OS_CreateCriticalRegion(pthread_mutex_t *criticalRegion)
 {
     //DebugInfo2("(%p)", criticalRegion);
-    *criticalRegion = PTHREAD_MUTEX_INITIALIZER;
+    pthread_mutex_init(criticalRegion, nullptr);
 }
 
 
@@ -213,9 +213,9 @@ CMagiC::CMagiC()
     m_EventId = 0;
     m_InterruptEventsId = 0;
 
-    m_KbCriticalRegionId = PTHREAD_MUTEX_INITIALIZER;
-    // m_AECriticalRegionId = PTHREAD_MUTEX_INITIALIZER;    // remnant from MagicMac(X) and AtariX
-    m_ScrCriticalRegionId = PTHREAD_MUTEX_INITIALIZER;
+    pthread_mutex_init(&m_KbCriticalRegionId, NULL);
+    // pthread_mutex_init(&m_AECriticalRegionId, NULL);    // remnant from MagicMac(X) and AtariX
+    pthread_mutex_init(&m_ScrCriticalRegionId, NULL);
 
     //m_iNoOfAtariFiles = 0;  // remnant from MagicMac(X) and AtariX
     m_pKbWrite = m_pKbRead = m_cKeyboardOrMouseData;
@@ -236,9 +236,9 @@ CMagiC::CMagiC()
     m_bEmulatorIsRunning = false;
 
     // inter-thread synchronisation
-    m_EventMutex = PTHREAD_MUTEX_INITIALIZER;
-    m_ConditionMutex = PTHREAD_MUTEX_INITIALIZER;
-    m_Cond = PTHREAD_COND_INITIALIZER;
+    pthread_mutex_init(&m_EventMutex, NULL);
+    pthread_mutex_init(&m_ConditionMutex, NULL);
+    pthread_cond_init(&m_Cond, NULL);
 
     atomic_init(&gbAtariVideoBufChanged, false);
 }

--- Ende Code ---

BTW: bin mir nicht ganz sicher ob pthread_mutex_destroy() auf linux überhaupt was macht, aber ein entsprechender Aufruf fehlt auf jeden Fall. In Windows erzeugt pthread_mutex_init() auf jeden Fall ein HANDLE.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln