int SLNFilterWriteURIs(SLNFilterRef const filter, SLNSessionRef const session, SLNFilterPosition *const pos, bool const meta, uint64_t const max, bool const wait, SLNFilterWriteCB const writecb, void *ctx) { uint64_t remaining = max; for(;;) { ssize_t const count = SLNFilterWriteURIBatch(filter, session, pos, meta, remaining, writecb, ctx); if(count < 0) return count; remaining -= count; if(!remaining) return 0; if(!count) break; } if(!wait || pos->dir < 0) return 0; SLNRepoRef const repo = SLNSessionGetRepo(session); for(;;) { uint64_t const timeout = uv_now(async_loop)+(1000 * 30); int rc = SLNRepoSubmissionWait(repo, pos->sortID, timeout); if(UV_ETIMEDOUT == rc) { uv_buf_t const parts[] = { uv_buf_init((char *)STR_LEN("\r\n")) }; rc = writecb(ctx, parts, numberof(parts)); if(rc < 0) break; continue; } assert(rc >= 0); // TODO: Handle cancellation? for(;;) { ssize_t const count = SLNFilterWriteURIBatch(filter, session, pos, meta, remaining, writecb, ctx); if(count < 0) return count; remaining -= count; if(!remaining) return 0; } } return 0; }
int SLNFilterWriteURIs(SLNFilterRef const filter, SLNSessionRef const session, SLNFilterPosition *const pos, bool const meta, uint64_t const max, bool const wait, SLNFilterWriteCB const writecb, SLNFilterFlushCB const flushcb, void *ctx) { uint64_t remaining = max; for(;;) { ssize_t const count = SLNFilterWriteURIBatch(filter, session, pos, meta, remaining, writecb, ctx); if(count < 0) return count; remaining -= count; if(!remaining) return 0; if(!count) break; } if(!wait || pos->dir < 0) return 0; SLNRepoRef const repo = SLNSessionGetRepo(session); for(;;) { int rc = flushcb ? flushcb(ctx) : 0; if(rc < 0) return rc; uint64_t latest = pos->sortID; uint64_t const timeout = uv_now(async_loop)+(1000 * 30); rc = SLNRepoSubmissionWait(repo, &latest, timeout); if(UV_ETIMEDOUT == rc) { uv_buf_t const parts[] = { uv_buf_init((char *)STR_LEN("\r\n")) }; rc = writecb(ctx, parts, numberof(parts)); if(rc < 0) break; continue; } assert(rc >= 0); // TODO: Handle cancellation? for(;;) { ssize_t const count = SLNFilterWriteURIBatch(filter, session, pos, meta, remaining, writecb, ctx); if(count < 0) return count; remaining -= count; if(!remaining) return 0; if(count < BATCH_SIZE) break; } // This is how far we scanned, even if we didn't find anything. if(pos->sortID < latest) { pos->sortID = latest; pos->fileID = 0; } } return 0; }