Hallo an alle C-Profis,
1. vorneweg: Ich bin Neuling in C und starte meine ersten Gehversuche.
2. vorneweg: Es gibt bereits Lösungen von Forenmitgliedern und fertige Sachen, die mein Problem lösen. Ich möchte aber zur Bestätigung meiner selbst das auch hinkriegen
Es gibt die Möglichkeit, die Queue aus glib.h zu verwenden. Das funktioniert und wird über die Präprozessor-Direktive hiergesteuert. Um von der Abhängigkeit los zu kommen, möchte habe ich meine eigene kleine Queue geschrieben.
Ausgangssituation:
Das libvdpau-sunxi Backend benötigt zur Darstellung einen fifo-Buffer etc. Ich nenne das hier Queue.
Softhddevice erstellt ein Surface. Das Backend reserviert Speicher für ein Strukt (task) mit den Angaben zum Surface, erstellt einen Zeiger darauf und stellt diesen ans Ende einer Queue (vdp_presentation_queue_display).
Ein eigenständiger Thread arbeitet diese Queue vom Kopf her ab (*presentation_thread) und reicht den Zeiger an die Darstellungsfunktion (do_presentation_queue_display) weiter. Dort wird das Surface angezeigt und danach wird der Speicher auf den der Zeiger zeigt wieder freigegeben.
Dabei möchte ich die Größe der Queue im Vorneherein erstmal nicht festlegen. Eine Bremse kann man immer noch einbauen. Das sollte möglich sein, wenn nur mit den Zeigern (oder -adressen) hantiert wird.
Im Prinzip müsste der ja momentan dynamisch sein und von der Anzahl der offenen Tasks bestimmt werden. Um einen Überlauf zu verhindern, müsste man den natürlich später begrenzen.
Problem:
Irgendwo habe ich hier aber einen Denkfehler. Ich glaube nämlich, dass ich da mit Zeiger auf Zeigern bzw. den Adressen arbeiten müsste?!
Quellcode:
Die reine Queue liegt mit Beispielprogramm hier und funktioniert eigentlich (augenscheinlich mit einem billigem int).
Das habe ich jetzt versucht zu übernehmen und der Code schaut dann so aus. Relevant sind nur queue.c, queue.h und presentation_queue.c
Einige Funktionen im Queue-Code sind dabei ungenutzt. Genutzt werden hier nur q_push_tail, q_extract_head, q_pop_head und q_queue_free, q_queue_init.
Das "pushen" in die Queue funktioniert. Ich kann direkt danach den letzten Eintrag auslesen und der stimmt. Nur im presentation_thread habe ich keinen Zugriff mehr darauf. Hier unterscheiden sich auch die Speicheradressen von diesem &task und diesem hier, wenn ich sie mit
anzeigen lasse.
-> Und ich glaube hier liegt mein Fehler.
Ich weiß, es ist anstrengend, sich in fremden Code reinzudenken, aber vielleicht weiß ja jemand nicht, was er gerade tun soll und kann sich das mal ansehen. Ich jedenfalls bin gerade etwas überfordert damit
Vielen Dank und Gruß
Andreas