Copyright (C) 1996-2001 by Andrew Tridgell <tridge@samba.org>
Copyright (C) Paul Mackerras 1996
- Copyright (C) 2001 by Martin Pool <mbp@samba.org>
+ Copyright (C) 2001, 2002 by Martin Pool <mbp@samba.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
extern int verbose;
+static void show_malloc_stats(void);
/****************************************************************************
wait for a process to exit, calling io_flush while waiting
extern int remote_version;
int send_stats;
+ if (do_stats) {
+ /* These come out from every process */
+ show_malloc_stats();
+ show_flist_stats();
+ }
+
if (am_daemon) {
log_exit(0, __FILE__, __LINE__);
if (f == -1 || !am_sender) return;
}
+/**
+ * If our C library can get malloc statistics, then show them to FINFO
+ **/
+static void show_malloc_stats(void)
+{
+#ifdef HAVE_MALLINFO
+ struct mallinfo mi;
+ extern int am_server;
+ extern int am_sender;
+ extern int am_daemon;
+
+ mi = mallinfo();
+
+ rprintf(FINFO, RSYNC_NAME "[%d] (%s%s%s) heap statistics:\n",
+ getpid(),
+ am_server ? "server " : "",
+ am_daemon ? "daemon " : "",
+ am_sender ? "sender" : "receiver");
+ rprintf(FINFO, " arena: %10d (bytes from sbrk)\n", mi.arena);
+ rprintf(FINFO, " ordblks: %10d (chunks not in use)\n", mi.ordblks);
+ rprintf(FINFO, " smblks: %10d\n", mi.smblks);
+ rprintf(FINFO, " hblks: %10d (chunks from mmap)\n", mi.hblks);
+ rprintf(FINFO, " hblkhd: %10d (bytes from mmap)\n", mi.hblkhd);
+ rprintf(FINFO, " usmblks: %10d\n", mi.usmblks);
+ rprintf(FINFO, " fsmblks: %10d\n", mi.fsmblks);
+ rprintf(FINFO, " uordblks: %10d (bytes used)\n", mi.uordblks);
+ rprintf(FINFO, " fordblks: %10d (bytes free)\n", mi.fordblks);
+ rprintf(FINFO, " keepcost: %10d (bytes in releasable chunk)\n", mi.keepcost);
+#endif /* HAVE_MALLINFO */
+}
+
+
/* Start the remote shell. cmd may be NULL to use the default. */
static pid_t do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int *f_out)
{
extern int write_batch; /* dw */
extern char *batch_ext; /* dw */
int orig_argc; /* dw */
+ char **orig_argv;
orig_argc = argc; /* dw */
+ orig_argv = argv;
signal(SIGUSR1, sigusr1_handler);
signal(SIGUSR2, sigusr2_handler);
if (write_batch) { /* dw */
create_batch_file_ext();
- write_batch_argvs_file(orig_argc, argc, argv);
+ write_batch_argvs_file(orig_argc, orig_argv);
}
if (read_batch) { /* dw */