On Mon, Apr 11, 2005 at 10:19:59PM +0200, Jakub Bogusz wrote: > On Mon, Apr 11, 2005 at 09:54:40PM +0200, Arkadiusz Miskiewicz wrote: > > Co w takim razie jeszcze z patchem poldek-cookie.patch jest złego? > > Tego jeszcze nie wiem, ale jak na razie dalej wygląda na dziwne > zachowanie glibc, tylko w innym miejscu...
> (gdb) f 6 > #6 0x0805651c in pkgfl_restore_f (stream=0x80c1ad8, dirs=0x0, include=0) at > pkgfl.c:551 > 551 fseek(stream, 1, SEEK_CUR); /* skip final '\n' */ > (gdb) f 0 > #0 gzfseek (stream=0x80bfce0, offset=0xbfffee80, whence=1) at vfile.c:130 > 130 z_off_t rc, off = *offset; > (gdb) n > 132 rc = gzseek(stream, off, whence); > 1: *offset = -4149 > (gdb) p off > $6 = -4149 > > Jak z 1 zrobiło się -4149? Też poprawne. Strumienie są buforowane, fseek przestawia początek bufora na nowy offset. -4149 to 1+aktualna_pozycja_w_buforze-początek_bufora. I ten poldek (z łatą!) chyyyyyyybaaaaaaaaa dziiiiaaaaaaałaaaaaa, ale woooolnooooooo (indeks 55 pakietów czyta w ~3s, 270 pakietów w kilkadziesiąt s, więcej w czasach ->+inf). Problem jest taki, że seek do tyłu w zlibie działa bardzo wolno (=przewinięcie do początku i odczyt danych aż do żądanego offsetu). Przedtem (w 2.3.4) nie każdy seek na strumieniu z fopencookie() powodował wywołanie seek cookie - teraz każdy. I przewijanie do przodu o długość < rozmiar bufora jest wysoce nieopłacalne (powoduje czytanie pliku od początku). Wyłączenie buforowania (setvbuf(vf->vf_stream, NULL, _IONBF, 0)) powoduje wczytywanie indeksów w skończonym czasie, ale czas "Weryfikacji" wzrasta do nieakceptowalnego. Można pokombinować ze zmniejszeniem rozmiaru bufora i wyeliminowaniem nieopłacalnych, krótkich fseeków (w szczególności tego o 1 bajt). -- Jakub Bogusz http://cyber.cs.net.pl/~qboosh/ _______________________________________________ pld-devel-pl mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-devel-pl
