fix mistake of not checking both parts in
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / cache.C
index 80bf347b677a49d9aee95d011514719aa814f799..9186f1f090b4bd52c0f3f93faf7fd3405102f2d5 100644 (file)
@@ -118,9 +118,13 @@ File* CICache::check_out(Asset *asset, EDL *edl, int block)
 // cache deleted during checkout, destroy this
        if( users == 1 ) {
                remove_user();
+               total_lock->unlock();
                return 0;
        }
 
+       //printf("users: %i \n", users );
+       EDL *parent = edl->parent_edl;
+       if(parent)
        remove_user();
        total_lock->unlock();
 //printf("check out %p %lx %s\n", current, tid, asset->path);
@@ -253,36 +257,29 @@ int CICache::get_oldest()
 int CICache::delete_oldest()
 {
        int result = 0;
-       total_lock->lock("CICache::delete_oldest");
        CICacheItem *oldest = 0;
-// at least 2
-       if( first != last ) {
-               oldest = first;
-               CICacheItem *current = oldest->next;
-               while( current ) {
+       total_lock->lock("CICache::delete_oldest");
+       if( first != last ) { // at least 2
+               CICacheItem *current = first;
+               for( ; !oldest && current; current=current->next )
+                       if( !current->checked_out ) oldest = current;
+               for( ; current; current=current->next ) {
+                       if( current->checked_out ) continue;
                        if( current->age < oldest->age )
                                oldest = current;
-                       current = current->next;
+               }
+// delete oldest of at least 2 cache files
+               if( oldest ) {
+                       remove_pointer(oldest);
+                       result = 1;
                }
        }
 // settle for just deleting one frame
-       else if( first )
+       else if( first && !first->checked_out )
                result = first->file->delete_oldest();
-       if( oldest ) {
-// Got the oldest file.  Try requesting cache purge from it.
-               if( oldest->file )
-                       oldest->file->purge_cache();
-// Delete the file if cache already empty and not checked out.
-               if( !oldest->checked_out )
-                       remove_pointer(oldest);
-               else
-                       oldest = 0;
-       }
        total_lock->unlock();
-       if( oldest ) {
+       if( oldest )
                oldest->Garbage::remove_user();
-               result = 1;
-       }
        return result;
 }