Skip to content

Commit

Permalink
Merge branch 'ae/pack-autothread'
Browse files Browse the repository at this point in the history
* ae/pack-autothread:
  Revert "pack-objects: Print a message describing the number of threads for packing"
  pack-objects: Print a message describing the number of threads for packing
  pack-objects: Add runtime detection of online CPU's
  • Loading branch information
Junio C Hamano committed Feb 27, 2008
2 parents 42dd2cd + 392b78c commit 3c972e1
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 4 deletions.
2 changes: 2 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,8 @@ pack.threads::
warning. This is meant to reduce packing time on multiprocessor
machines. The required amount of memory for the delta search window
is however multiplied by the number of threads.
Specifying 0 will cause git to auto-detect the number of CPU's
and set the number of threads accordingly.

pack.indexVersion::
Specify the default pack index version. Valid values are 1 for
Expand Down
2 changes: 2 additions & 0 deletions Documentation/git-pack-objects.txt
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ base-name::
This is meant to reduce packing time on multiprocessor machines.
The required amount of memory for the delta search window is
however multiplied by the number of threads.
Specifying 0 will cause git to auto-detect the number of CPU's
and set the number of threads accordingly.

--index-version=<version>[,<offset>]::
This is intended to be used by the test suite only. It allows
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,7 @@ endif
ifdef THREADED_DELTA_SEARCH
BASIC_CFLAGS += -DTHREADED_DELTA_SEARCH
EXTLIBS += -lpthread
LIB_OBJS += thread-utils.o
endif

ifeq ($(TCLTK_PATH),)
Expand Down
14 changes: 10 additions & 4 deletions builtin-pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "progress.h"

#ifdef THREADED_DELTA_SEARCH
#include "thread-utils.h"
#include <pthread.h>
#endif

Expand Down Expand Up @@ -1852,11 +1853,11 @@ static int git_pack_config(const char *k, const char *v)
}
if (!strcmp(k, "pack.threads")) {
delta_search_threads = git_config_int(k, v);
if (delta_search_threads < 1)
if (delta_search_threads < 0)
die("invalid number of threads specified (%d)",
delta_search_threads);
#ifndef THREADED_DELTA_SEARCH
if (delta_search_threads > 1)
if (delta_search_threads != 1)
warning("no threads support, ignoring %s", k);
#endif
return 0;
Expand Down Expand Up @@ -2122,10 +2123,10 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
if (!prefixcmp(arg, "--threads=")) {
char *end;
delta_search_threads = strtoul(arg+10, &end, 0);
if (!arg[10] || *end || delta_search_threads < 1)
if (!arg[10] || *end || delta_search_threads < 0)
usage(pack_usage);
#ifndef THREADED_DELTA_SEARCH
if (delta_search_threads > 1)
if (delta_search_threads != 1)
warning("no threads support, "
"ignoring %s", arg);
#endif
Expand Down Expand Up @@ -2235,6 +2236,11 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
if (!pack_to_stdout && thin)
die("--thin cannot be used to build an indexable pack.");

#ifdef THREADED_DELTA_SEARCH
if (!delta_search_threads) /* --threads=0 means autodetect */
delta_search_threads = online_cpus();
#endif

prepare_packed_git();

if (progress)
Expand Down
48 changes: 48 additions & 0 deletions thread-utils.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include "cache.h"

#ifdef _WIN32
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
#elif defined(hpux) || defined(__hpux) || defined(_hpux)
# include <sys/pstat.h>
#endif

/*
* By doing this in two steps we can at least get
* the function to be somewhat coherent, even
* with this disgusting nest of #ifdefs.
*/
#ifndef _SC_NPROCESSORS_ONLN
# ifdef _SC_NPROC_ONLN
# define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN
# elif defined _SC_CRAY_NCPU
# define _SC_NPROCESSORS_ONLN _SC_CRAY_NCPU
# endif
#endif

int online_cpus(void)
{
#ifdef _SC_NPROCESSORS_ONLN
long ncpus;
#endif

#ifdef _WIN32
SYSTEM_INFO info;
GetSystemInfo(&info);

if ((int)info.dwNumberOfProcessors > 0)
return (int)info.dwNumberOfProcessors;
#elif defined(hpux) || defined(__hpux) || defined(_hpux)
struct pst_dynamic psd;

if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0))
return (int)psd.psd_proc_cnt;
#endif

#ifdef _SC_NPROCESSORS_ONLN
if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0)
return (int)ncpus;
#endif

return 1;
}
6 changes: 6 additions & 0 deletions thread-utils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef THREAD_COMPAT_H
#define THREAD_COMPAT_H

extern int online_cpus(void);

#endif /* THREAD_COMPAT_H */

0 comments on commit 3c972e1

Please sign in to comment.