Jeszcze Marcin nie zgin±³...
Marcin Dalecki
dalecki w cs.net.pl
Nie, 21 Lut 1999, 03:21:42 CET
Marcin Dalecki wrote:
>
> Z mi³ym zaskoczeniem stwierdzi³em, ¿e w przeciwieñstwie do serwera
> CVS na PG to ftp.ps.pl jest dla mnie dobrze osiagalny.
>
> Tak czy siak. Powoli czyjê siê znów bardziej ludzko, awiec i
> kolejne ³aty siê sypi±.
> Pierwsza dla speca egcs-a jest drobn± poprawk± wy¿ucaj±c± ³atê
> pgcc z pakietu oraz zapobiegajac± instalacji niezdatnej statycznej
> biblioteki libiberty.
>
> Durga z nich nieco bardziej ciekawa dodaje wyko¿ystywanie
> nowego wywo³ania systemowego, które optymalizuje kopiowanie
> plików to pakietu fileutils. Postaram siê jeszcze dzisiaj w nocy
> tego samego rodzaju modyfikacje zastosowaæ zaróno do komendy cat
> jak i cp wbudowanego do bash-a.
>
> Dodatkowo mam na agendzie rozwi±zanie problemu z klawiszami Home i End
> oraz Delete poprzez wprowadzenie odpowiednich modyfikacji do terminali
> lub biblioteki readline.
>
> Uprzejmie proszê jak zwykle o mo¿liwie rych³e zastosowanie tych ³at.
> --
> Marcin Dalecki
>
>
> --- egcs.spec-orig Sat Feb 20 07:24:04 1999
> +++ egcs.spec Sat Feb 20 07:36:52 1999
> @@ -2,7 +2,7 @@
> Summary(pl): Zaawansowany kompilator GNU
> Name: egcs
> Version: 1.1.1
> -Release: 9d
> +Release: 10
> Copyright: GPL
> Group: Development/Languages
> Group(pl): Programowanie/Jêzyki
> @@ -11,7 +11,6 @@
> Patch0: egcs-libio.patch
> Patch1: egcs-mandir.patch
> Patch2: egcs-info.patch
> -Patch3: egcs-pgcc.patch
> Prereq: /sbin/install-info
> Requires: binutils >= 2.9.1.0.18
> Requires: %{name}-cpp = %{version}
> @@ -229,10 +228,6 @@
> %patch1 -p1
> %patch2 -p1
>
> -%ifarch i386
> -#%patch3 -p1
> -%endif
> -
> %build
> rm -rf obj-$RPM_ARCH-linux
> install -d obj-$RPM_ARCH-linux
> @@ -346,7 +341,6 @@
> %attr(755,root,root) /usr/lib/gcc-lib/%{buildarch}*/egcs-*/*.o
> %endif
>
> -/usr/%{buildarch}*
> %attr(755,root,root) /usr/lib/gcc-lib/%{buildarch}*/egcs-*/collect2
>
> %ifarch ppc
> @@ -443,6 +437,11 @@
> %attr(755,root,root) /usr/lib/gcc-lib/%{buildarch}*/egcs-*/cpp
>
> %changelog
> +* Sat Feb 20 1999 Marcin Dalecki <dalecki w cs.net.pl>
> + [1.1.1-10]
> +- removed finally bogous pgcc patch from distributton,
> +- removed useless static libiberty stuff from installation.
> +
> * Fri Jan 29 1999 Tomasz K³oczko <kloczek w rudy.mif.pg.gda.pl>
> [1.1.1-8d]
> - removed no splitting info files,
>
>
> diff -urN fileutils-4.0/src/copy.c fileutils-4.0-new/src/copy.c
> --- fileutils-4.0/src/copy.c Mon Sep 28 18:09:18 1998
> +++ fileutils-4.0-new/src/copy.c Sun Feb 21 01:03:27 1999
> @@ -26,6 +26,18 @@
> #include <assert.h>
> #include <sys/types.h>
>
> +/*
> + * Check whatever the sendfile(2) system call is supporter on this system.
> + * Actually linux is even learning from NT :-).
> + */
> +#if defined(__linux__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
> +#define HAS_SENDFILE
> +#endif
> +
> +#ifdef HAS_SENDFILE
> +#include <sys/sendfile.h>
> +#endif
> +
> #include "system.h"
> #include "error.h"
> #include "backupfile.h"
> @@ -236,6 +248,14 @@
> }
> #endif
>
> + /*
> + * If we expect to make any holes we resort to normalcopy mode.
> + * Better save then sorry...
> + */
> +#ifdef HAS_SENDFILE
> + if (make_holes) {
> +normal_copy:
> +#endif
> /* Make a buffer with space for a sentinel at the end. */
Szanowni Panowie!
Szanowne Pañstwo!
A oto moje -
Nastêpne Drañstwo:
Czyli ³ata na textutils, wyko¿ystujaca skutecznie pike nowe wywo³anie
systemowe sendfile(2).
No i oczywi¶cie nawet je¶li nie mamy doczynienia
z systemem posiadaj±cym takie zdolno¶ci to nieco przyspieszy³em
cat-a stosuj±c alloca zamiast xmalloc-a. Po pierwsze alloca dzia³a
na stosie i jest kosmicznie szybszy. Po drugie jakie¶ tam kilka
kilo to siê na stosie doskonale mie¶ci, mamy bowiem do dyspozycji
niechlujne 1MB :-).
Je¶li wiêc pragniecie aby PLD faktycznie zas³ugiwa³ na miano
nie tylko b³achego "Tornado", lecz prawdziwego Burana!, to proszê
³askawie o zgrzebne zastosowanie tej ³aty...
Czymprêdzej spieszê aby zaleczyæ równie¿ proftpd tym lekarstwem.
PS. Istniej± równie¿ realne szanse awansu dla apacha.
--Marcin
-------------- nastêpna czê¶æ ---------
diff -urN textutils-1.22/src/cat.c textutils-1.22-new/src/cat.c
--- textutils-1.22/src/cat.c Sat Nov 23 23:00:51 1996
+++ textutils-1.22-new/src/cat.c Sun Feb 21 03:11:50 1999
@@ -30,6 +30,16 @@
#ifndef _POSIX_SOURCE
#include <sys/ioctl.h>
#endif
+
+#if defined(__linux__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
+#define HAS_SENDFILE 1
+#endif
+
+#ifdef HAS_SENDFILE
+#include <sys/sendfile.h>
+#include <sys/user.h> /* needed for PAGE_SIZE */
+#endif
+
#include "system.h"
#include "error.h"
@@ -132,27 +142,64 @@
static void
simple_cat (
- /* Pointer to the buffer, used by reads and writes. */
- unsigned char *buf,
-
/* Number of characters preferably read or written by each read and write
call. */
int bufsize)
{
/* Actual number of characters read, and therefore written. */
int n_read;
+ unsigned char * buf;
- /* Loop until the end of the file. */
+#ifdef HAS_SENDFILE
+ /* I'm not quite sure whatever this due to an error in the
+ * sendfile syscall...
+ * --mdcki
+ */
+ if (input_desc == 0) {
+#endif
+ buf = (unsigned char *) alloca (bufsize);
+ /* Loop until the end of the file. */
- for (;;)
+ for (;;)
+ {
+ /* Read a block of input. */
+
+ n_read = safe_read (input_desc, buf, bufsize);
+ if (n_read < 0)
+ {
+ error (0, errno, "%s", infile);
+ exit_status = 1;
+ return;
+ }
+
+ /* End of this file? */
+
+ if (n_read == 0)
+ break;
+
+ /* Write this block out. */
+
+ if (full_write (output_desc, buf, n_read) < 0)
+ error (EXIT_FAILURE, errno, _("write error"));
+ }
+#ifdef HAS_SENDFILE
+ } else {
+ /*
+ * Sun Feb 21 02:30:47 CET 1999 Marcin Dalecki <dalecki w cs.net.pl>:
+ *
+ * Under Linux we can do better now. We use the brand new sendfile system
+ * call to prevent unnecessary physical data copying.
+ */
+
+ for (;;)
{
/* Read a block of input. */
- n_read = safe_read (input_desc, buf, bufsize);
+
+ n_read = sendfile(output_desc, input_desc, NULL, PAGE_SIZE);
if (n_read < 0)
{
- error (0, errno, "%s", infile);
- exit_status = 1;
+ error (EXIT_FAILURE, errno, "%s", infile);
return;
}
@@ -160,12 +207,9 @@
if (n_read == 0)
break;
-
- /* Write this block out. */
-
- if (full_write (output_desc, buf, n_read) < 0)
- error (EXIT_FAILURE, errno, _("write error"));
}
+ }
+#endif
}
/* Cat the file behind INPUT_DESC to the file behind OUTPUT_DESC.
@@ -176,15 +220,9 @@
static void
cat (
- /* Pointer to the beginning of the input buffer. */
- unsigned char *inbuf,
-
/* Number of characters read in each read call. */
int insize,
- /* Pointer to the beginning of the output buffer. */
- unsigned char *outbuf,
-
/* Number of characters written by each write call. */
int outsize,
@@ -196,6 +234,12 @@
int mark_line_ends,
int squeeze_empty_lines)
{
+ /* Pointer to the beginning of the input buffer. */
+ unsigned char *inbuf;
+
+ /* Pointer to the beginning of the output buffer. */
+ unsigned char *outbuf;
+
/* Last character read from the input buffer. */
unsigned char ch;
@@ -225,6 +269,26 @@
int use_fionread = 1;
#endif
+ inbuf = (unsigned char *) alloca (insize + 1);
+
+ /* Why are (OUTSIZE - 1 + INSIZE * 4 + 13) bytes allocated for
+ the output buffer?
+
+ A test whether output needs to be written is done when the input
+ buffer empties or when a newline appears in the input. After
+ output is written, at most (OUTSIZE - 1) bytes will remain in the
+ buffer. Now INSIZE bytes of input is read. Each input character
+ may grow by a factor of 4 (by the prepending of M-^). If all
+ characters do, and no newlines appear in this block of input, we
+ will have at most (OUTSIZE - 1 + INSIZE) bytes in the buffer. If
+ the last character in the preceding block of input was a
+ newline, a line number may be written (according to the given
+ options) as the first thing in the output buffer. (Done after the
+ new input is read, but before processing of the input begins.) A
+ line number requires seldom more than 13 positions. */
+
+ outbuf = (unsigned char *) alloca (outsize - 1 + insize * 4 + 13);
+
/* The inbuf pointers are initialized so that BPIN > EOB, and thereby input
is read immediately. */
@@ -449,12 +513,6 @@
/* Optimal size of i/o operations of input. */
int insize;
- /* Pointer to the input buffer. */
- unsigned char *inbuf;
-
- /* Pointer to the output buffer. */
- unsigned char *outbuf;
-
int c;
/* Index in argv to processed argument. */
@@ -673,40 +731,14 @@
if (options == 0)
{
insize = max (insize, outsize);
- inbuf = (unsigned char *) xmalloc (insize);
-
- simple_cat (inbuf, insize);
+ simple_cat (insize);
}
else
{
- inbuf = (unsigned char *) xmalloc (insize + 1);
-
- /* Why are (OUTSIZE - 1 + INSIZE * 4 + 13) bytes allocated for
- the output buffer?
-
- A test whether output needs to be written is done when the input
- buffer empties or when a newline appears in the input. After
- output is written, at most (OUTSIZE - 1) bytes will remain in the
- buffer. Now INSIZE bytes of input is read. Each input character
- may grow by a factor of 4 (by the prepending of M-^). If all
- characters do, and no newlines appear in this block of input, we
- will have at most (OUTSIZE - 1 + INSIZE) bytes in the buffer. If
- the last character in the preceding block of input was a
- newline, a line number may be written (according to the given
- options) as the first thing in the output buffer. (Done after the
- new input is read, but before processing of the input begins.) A
- line number requires seldom more than 13 positions. */
-
- outbuf = (unsigned char *) xmalloc (outsize - 1 + insize * 4 + 13);
-
- cat (inbuf, insize, outbuf, outsize, quote,
+ cat (insize, outsize, quote,
output_tabs, numbers, numbers_at_empty_lines, mark_line_ends,
squeeze_empty_lines);
-
- free (outbuf);
}
-
- free (inbuf);
contin:
if (strcmp (infile, "-") && close (input_desc) < 0)
Więcej informacji o liście dyskusyjnej pld-devel-pl