Wie prüfe ich, ob es das Event, das von timer->Event(); zurückggegeben wird, noch existiert?

  • Hi,

    Ich schreibe also:

    Code
    LOCK_TIMERS_READ;
    LOCK_SCHEDULES_READ;
    const cTimer *timer = ...
    const cEvent *event = timer->Event();

    Ich darf event also verwenden, da ich einen Lock auf schedules habe.

    Aber Moment, event könnte ja gelöscht worden sein: Aus tools.h:

    Code: tools.h
           ///< You may keep pointers to objects in this list, even after releasing                                                                                                  
           ///< the lock. However, you may only access such objects if you are
           ///< holding a proper lock again. If an object has been deleted from the list                                                                                             
           ///< while you did not hold a lock (for instance by an other thread), the                                                                                                 
           ///< object will still be there, but no longer within this list (it is then                                                                                               
           ///< stored in the ListGarbageCollector). That way even if you access the object                                                                                          
           ///< after it has been deleted, you won't cause a segfault. You can call the                                                                                              
           ///< Contains() function to check whether an object you are holding a pointer                                                                                             
           ///< to is still in the list. Note that the garbage collector is purged when                                                                                              
           ///< the usual housekeeping is done.                                                                                                                                                                                                                                                         

    Ich weiß ja jetzt nicht, ob der garbage collector das event schon gelöscht hat.

    Ich könnte das nun mit Contains() überprüfen, dazu müsste ich aber Contains() auf cSchedule::events; anwenden. Was ich aus 2 Gründen nicht kann:

    1. cSchedule::events ist private
    2. Ich kenne den cSchedule, in dem dieses Event ist, nicht (wäre ev. mit einem Loop über alle schedules lösbar)

    Wie muss ich also vorgehen, um zu prüfen ob der garbage collector das event schon gelöscht hat?


    ~ Markus

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Code
    const cSchedule *schedule = event->Schedule();

    Na, wenn der garbage collector event schon gelöscht hat, sollte ich das lieber nicht aufrufen ...

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Wie muss ich also vorgehen, um zu prüfen ob der garbage collector das event schon gelöscht hat?

    Gar nicht ;-).
    Wenn ein Event in den Garbage-Collector kommt, wird beim nächsten Umlauf (einmal pro Sekunde) der Hauptschleife dem Timer ein neuer (oder kein) Event zugewiesen. Der alte Event bleibt mindestens 5 Sekunden im Garbage-Collector. Wenn also der Timer einen Pointer auf einen Event hat, dann darf der auch dereferenziert werden. Allerdings nur die "erste Stufe". Ich hatte kürzlich einen Fall, wo Timer->event->Schedule()->PresentSeenWithin() in einem Rutsch dereferenziert wurde, aber da der Event bereits aus seinem Schedule entfernt war, war event->Schedule() zu dem Zeitpunkt bereits NULL. Hab's dann gestaffelt abgefragt und das Problem war behoben.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!