I get a serious beach ball after these changes.

Christiaan

On 20 Jan 2008, at 7:22 PM, [EMAIL PROTECTED] wrote:

> Revision: 12597
>           http://bibdesk.svn.sourceforge.net/bibdesk/? 
> rev=12597&view=rev
> Author:   amaxwell
> Date:     2008-01-20 10:22:13 -0800 (Sun, 20 Jan 2008)
>
> Log Message:
> -----------
> Throttle search/flush in the BDSKSearch so we can just send  
> delegate messages in the index.  This gives good progress bar  
> updates without killing indexing.
>
> Modified Paths:
> --------------
>     trunk/bibdesk/BDSKFileSearch.h
>     trunk/bibdesk/BDSKFileSearch.m
>     trunk/bibdesk/BDSKFileSearchIndex.m
>
> Modified: trunk/bibdesk/BDSKFileSearch.h
> ===================================================================
> --- trunk/bibdesk/BDSKFileSearch.h    2008-01-20 16:20:14 UTC (rev 12596)
> +++ trunk/bibdesk/BDSKFileSearch.h    2008-01-20 18:22:13 UTC (rev 12597)
> @@ -66,6 +66,7 @@
>
>      BDSKSearchPrivateIvars *data;
>      id delegate;
> +    CFAbsoluteTime lastUpdateTime;
>  }
>
>  /*
>
> Modified: trunk/bibdesk/BDSKFileSearch.m
> ===================================================================
> --- trunk/bibdesk/BDSKFileSearch.m    2008-01-20 16:20:14 UTC (rev 12596)
> +++ trunk/bibdesk/BDSKFileSearch.m    2008-01-20 18:22:13 UTC (rev 12597)
> @@ -87,6 +87,7 @@
>
>          data = [[BDSKSearchPrivateIvars alloc] init];
>          [self setDelegate:aDelegate];
> +        lastUpdateTime = CFAbsoluteTimeGetCurrent();
>      }
>      return self;
>  }
> @@ -125,7 +126,8 @@
>
>          // if there's a search in progress, we'll cancel it and re- 
> update
>          // if not, we'll notify the delegate with an empty array,  
> since the index is still working
> -        if (NULL != search) {
> +        // throttle the cancel/flush to 10 Hz, since that slows  
> down indexing
> +        if (NULL != search && (CFAbsoluteTimeGetCurrent() -  
> lastUpdateTime) > 0.1) {
>              [self cancel];
>              [self updateSearchResults];
>          }
> @@ -170,11 +172,13 @@
>      SKIndexRef skIndex = [searchIndex index];
>      NSAssert(NULL != skIndex, @"-[BDSKFileSearchIndex index]  
> returned NULL");
>
> -    if (SKIndexFlush(skIndex) ==  FALSE) {
> +    if (NULL == skIndex || SKIndexFlush(skIndex) ==  FALSE) {
>          NSLog(@"failed to flush index %@", searchIndex);
>          return;
>      }
>
> +    lastUpdateTime = CFAbsoluteTimeGetCurrent();
> +
>      SKSearchRef skSearch = SKSearchCreate(skIndex, (CFStringRef) 
> searchString, options);
>      [self setSearch:skSearch];
>      CFRelease(skSearch);
>
> Modified: trunk/bibdesk/BDSKFileSearchIndex.m
> ===================================================================
> --- trunk/bibdesk/BDSKFileSearchIndex.m       2008-01-20 16:20:14 UTC  
> (rev 12596)
> +++ trunk/bibdesk/BDSKFileSearchIndex.m       2008-01-20 18:22:13 UTC  
> (rev 12597)
> @@ -293,10 +293,6 @@
>          id anItem = nil;
>          BDSKMultiValueDictionary *indexedIdentifierURLs =  
> [[[BDSKMultiValueDictionary alloc] init] autorelease];
>
> -        // see comment later; may need tuning here since this is  
> much faster than adding new docs to the index
> -        const int32_t flushInterval = 100;
> -        int32_t countSinceLastFlush = 10;
> -
>          // update the identifierURLs with the items, find items to  
> add and URLs to remove
>          OSMemoryBarrier();
>          while(flags.shouldKeepRunning == 1 && (anItem = [itemEnum  
> nextObject])) {
> @@ -326,16 +322,13 @@
>                  @synchronized(self) {
>                      progressValue = (numberIndexed /  
> totalObjectCount) * 100;
>                  }
> -                if (countSinceLastFlush-- == 0) {
> -                    // must update before sending the delegate  
> message
> -                    pthread_rwlock_wrlock(&rwlock);
> -                    [identifierURLs  
> addEntriesFromDictionary:indexedIdentifierURLs];
> -                    pthread_rwlock_unlock(&rwlock);
> -                    [indexedIdentifierURLs removeAllObjects];
> -
> -                    [[OFMessageQueue mainQueue]  
> queueSelectorOnce:@selector(searchIndexDidUpdate) forObject:self  
> withObject:nil];
> -                    countSinceLastFlush = flushInterval;
> -                }
> +                // must update before sending the delegate message
> +                pthread_rwlock_wrlock(&rwlock);
> +                [identifierURLs  
> addEntriesFromDictionary:indexedIdentifierURLs];
> +                pthread_rwlock_unlock(&rwlock);
> +                [indexedIdentifierURLs removeAllObjects];
> +
> +                [self performSelectorOnMainThread:@selector 
> (searchIndexDidUpdate) withObject:nil waitUntilDone:NO];
>              }
>
>              OSMemoryBarrier();
> @@ -422,11 +415,7 @@
>
>      NSEnumerator *enumerator = [items objectEnumerator];
>      id anObject = nil;
> -
> -    // This threshold is sort of arbitrary; for small batches,  
> frequent updates are better if the delegate has a progress  
> indicator, but for large batches (initial indexing), it can kill  
> performance to be continually flushing and searching while indexing.
> -    const int32_t flushInterval = [items count] > 20 ? 5 : 1;
> -    int32_t countSinceLastFlush = flushInterval;
> -
> +
>      // Use a local pool since initial indexing can use a fair  
> amount of memory, and it's not released until the thread's run loop  
> starts
>      NSAutoreleasePool *pool = [NSAutoreleasePool new];
>
> @@ -440,13 +429,10 @@
>              progressValue = (numberIndexed / totalObjectCount) * 100;
>          }
>
> -        if (countSinceLastFlush-- == 0) {
> -            [pool release];
> -            pool = [NSAutoreleasePool new];
> -
> -            [self performSelectorOnMainThread:@selector 
> (searchIndexDidUpdate) withObject:nil waitUntilDone:NO];
> -            countSinceLastFlush = flushInterval;
> -        }
> +        [pool release];
> +        pool = [NSAutoreleasePool new];
> +
> +        [self performSelectorOnMainThread:@selector 
> (searchIndexDidUpdate) withObject:nil waitUntilDone:NO];
>          OSMemoryBarrier();
>      }
>
>
>
> This was sent by the SourceForge.net collaborative development  
> platform, the world's largest Open Source development site.
>
> ---------------------------------------------------------------------- 
> ---
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Bibdesk-commit mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/bibdesk-commit


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Bibdesk-develop mailing list
Bibdesk-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bibdesk-develop

Reply via email to