Introduce FEATURE_COPYBUF_KB.
People who want smaller stack at any cost may use it to reduce cp's stack usage (FEATURE_COPYBUF_KB=1). Desktop people may get faster copy of big files (FEATURE_COPYBUF_KB=32 is ~30% faster than 4kb)
This commit is contained in:
parent
e2532ab5f2
commit
4c13922961
@ -110,6 +110,16 @@ config FEATURE_EDITING_FANCY_PROMPT
|
||||
Setting this option allows for prompts to use things like \w and
|
||||
\$ and escape codes.
|
||||
|
||||
config FEATURE_COPYBUF_KB
|
||||
int "Copy buffer size, in kilobytes"
|
||||
range 1 1024
|
||||
default 4
|
||||
help
|
||||
Size of buffer used by cp, mv, install etc.
|
||||
Buffers which are 4 kb or less will be allocated on stack.
|
||||
Bigger buffers will be allocated with mmap, with fallback to 4 kb
|
||||
stack buffer if mmap fails.
|
||||
|
||||
config MONOTONIC_SYSCALL
|
||||
bool "Use clock_gettime(CLOCK_MONOTONIC) syscall"
|
||||
default y
|
||||
|
@ -9,31 +9,42 @@
|
||||
|
||||
#include "libbb.h"
|
||||
|
||||
#if BUFSIZ < 4096
|
||||
#undef BUFSIZ
|
||||
#define BUFSIZ 4096
|
||||
#endif
|
||||
|
||||
/* Used by NOFORK applets (e.g. cat) - must not use xmalloc */
|
||||
|
||||
static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
|
||||
{
|
||||
int status = -1;
|
||||
off_t total = 0;
|
||||
char buffer[BUFSIZ];
|
||||
#if CONFIG_FEATURE_COPYBUF_KB <= 4
|
||||
char buffer[CONFIG_FEATURE_COPYBUF_KB * 1024];
|
||||
enum { buffer_size = sizeof(buffer) };
|
||||
#else
|
||||
char *buffer;
|
||||
int buffer_size;
|
||||
|
||||
buffer = mmap(NULL, CONFIG_FEATURE_COPYBUF_KB * 1024,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANON,
|
||||
/* ignored: */ -1, 0);
|
||||
buffer_size = CONFIG_FEATURE_COPYBUF_KB * 1024;
|
||||
if (buffer == MAP_FAILED) {
|
||||
buffer = alloca(4 * 1024);
|
||||
buffer_size = 4 * 1024;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (src_fd < 0)
|
||||
goto out;
|
||||
|
||||
if (!size) {
|
||||
size = BUFSIZ;
|
||||
size = buffer_size;
|
||||
status = 1; /* copy until eof */
|
||||
}
|
||||
|
||||
while (1) {
|
||||
ssize_t rd;
|
||||
|
||||
rd = safe_read(src_fd, buffer, size > BUFSIZ ? BUFSIZ : size);
|
||||
rd = safe_read(src_fd, buffer, size > buffer_size ? buffer_size : size);
|
||||
|
||||
if (!rd) { /* eof - all done */
|
||||
status = 0;
|
||||
@ -62,6 +73,11 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
|
||||
}
|
||||
}
|
||||
out:
|
||||
|
||||
#if CONFIG_FEATURE_COPYBUF_KB > 4
|
||||
if (buffer_size != 4 * 1024)
|
||||
munmap(buffer, buffer_size);
|
||||
#endif
|
||||
return status ? -1 : total;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user