Explorar o código

latest osx publish stuff

David Rose %!s(int64=19) %!d(string=hai) anos
pai
achega
8de0914056

+ 1 - 1
direct/metalibs/direct/Sources.pp

@@ -18,7 +18,7 @@
   express:c pstatclient:c prc:c pandabase:c linmath:c \
   putil:c display:c event:c pgraph:c gsgbase:c gobj:c mathutil:c \
   lerp:c downloader:c pnmimage:c chan:c \
-  pipeline:c cull:c
+  pipeline:c cull:c $[if $[HAVE_NET],net:c]
 
 #begin metalib_target
   #define TARGET direct

+ 2 - 2
direct/src/dcparse/Sources.pp

@@ -4,9 +4,9 @@
   express:c pandaexpress:m \
   interrogatedb:c dconfig:c dtoolconfig:m \
   dtoolutil:c dtoolbase:c dtool:m \
-  pystub \
   prc:c pstatclient:c pandabase:c linmath:c putil:c \
-  pipeline:c
+  pipeline:c $[if $[HAVE_NET],net:c] \
+  pystub
 
 #define C++FLAGS -DWITHIN_PANDA
 

+ 1 - 1
direct/src/dcparser/Sources.pp

@@ -3,7 +3,7 @@
     pstatclient:c pipeline:c panda:m \
     interrogatedb:c dconfig:c dtoolconfig:m \
     dtoolutil:c dtoolbase:c dtool:m prc:c pandabase:c \
-    linmath:c putil:c
+    linmath:c putil:c $[if $[HAVE_NET],net:c]
 
 #define LOCAL_LIBS \
     directbase

+ 1 - 1
direct/src/directd/Sources.pp

@@ -6,7 +6,7 @@
 #define LOCAL_LIBS \
     directbase
 #define OTHER_LIBS \
-    net:c linmath:c putil:c express:c panda:m pandaexpress:m dtoolconfig dtool
+    $[if $[HAVE_NET],net:c] linmath:c putil:c express:c panda:m pandaexpress:m dtoolconfig dtool
 #define WIN_SYS_LIBS $[WIN_SYS_LIBS] user32.lib //advapi32.lib
 
 #begin lib_target

+ 1 - 1
direct/src/directdServer/Sources.pp

@@ -6,7 +6,7 @@
 //#define LOCAL_LIBS \
 //    directbase
 #define OTHER_LIBS \
-    net:c linmath:c putil:c express:c panda:m pandaexpress:m dtoolconfig dtool
+    $[if $[HAVE_NET],net:c] linmath:c putil:c express:c panda:m pandaexpress:m dtoolconfig dtool
 #define WIN_SYS_LIBS $[WIN_SYS_LIBS] user32.lib //advapi32.lib
 
 #begin bin_target

+ 1 - 4
direct/src/distributed/Sources.pp

@@ -12,10 +12,7 @@
     interrogatedb:c dconfig:c dtoolconfig:m \
     dtoolutil:c dtoolbase:c dtool:m \
     prc:c pstatclient:c pandabase:c linmath:c putil:c \
-    pipeline:c
-  #if $[and $[HAVE_NET],$[HAVE_NSPR]] \
-    #define OTHER_LIBS net:c $[OTHER_LIBS]
-  #endif
+    pipeline:c $[if $[HAVE_NET],net:c]
 
   #define SOURCES \
     config_distributed.cxx config_distributed.h \

+ 2 - 0
direct/src/ffi/genPyCode.pp

@@ -149,6 +149,7 @@ DoGenPyCode.extensionsDir = os.path.join(directDir, 'src', '$[extensions_name]')
 DoGenPyCode.etcPath = []
 DoGenPyCode.pythonSourcePath = []
 
+#if $[CTA_GENERIC_GENPYCODE]
 # Look for additional packages (other than the basic three)
 # that the user might be dynamically attached to.
 packages = []
@@ -204,6 +205,7 @@ for package in packages:
                     if isModule:
                         if basename not in DoGenPyCode.codeLibs:
                             DoGenPyCode.codeLibs.append(basename)
+#endif  // CTA_GENERIC_GENPYCODE
 #endif  // CTPROJS
 
 DoGenPyCode.run()

+ 1 - 1
direct/src/interval/Sources.pp

@@ -9,7 +9,7 @@
     interrogatedb:c dconfig:c dtoolconfig:m \
     dtoolutil:c dtoolbase:c dtool:m \
     pandabase:c prc:c gsgbase:c pstatclient:c \
-    pipeline:c
+    pipeline:c $[if $[HAVE_NET],net:c]
 
   #define SOURCES \
     config_interval.cxx config_interval.h \

+ 1 - 1
direct/src/showbase/Sources.pp

@@ -9,7 +9,7 @@
     dtoolutil:c dtoolbase:c dtool:m \
     pgraph:c gsgbase:c gobj:c mathutil:c pstatclient:c \
     lerp:c downloader:c pandabase:c pnmimage:c prc:c \
-    pipeline:c cull:c
+    pipeline:c cull:c $[if $[HAVE_NET],net:c]
 
   #define SOURCES \
     showBase.cxx showBase.h

+ 5 - 58
dtool/Config.osxppc.pp → dtool/Config.OSX.pp

@@ -1,5 +1,5 @@
 //
-// Config.osx.pp
+// Config.OSX.pp
 //
 // This file defines some custom config variables for the osx
 // platform.  It makes some initial guesses about compiler features,
@@ -19,67 +19,14 @@
 // to a subsequent version of Panda.
 // *******************************************************************
 
-print $[PLATFORM]
-
-#define PYTHON_IPATH /Library/Frameworks/Python.framework/Headers
-
-#define HAVE_PYTHON 1
-#define PYTHON_FRAMEWORK  Python
-
 // What additional flags should we pass to interrogate?
 #define SYSTEM_IGATE_FLAGS -D__FLT_EVAL_METHOD__=0  -D__i386__ -D__const=const -Dvolatile -D__LITTLE_ENDIAN__ -D__inline__=inline -D__GNUC__
 #define HAVE_GL 1
 #define IS_OSX 1
 
-//#define ZLIB_IPATH /usr/include
-//#define ZLIB_LPATH /usr/lib/
-//#define ZLIB_LIBS  libz.dylib 
-
-#define HAVE_ZLIB 1
-#define HAVE_JPEG 1
-#define HAVE_FREETYPE 1
-#print   Before Configure Miles 
-//#define HAVE_RAD_MSS 1
-//#define RAD_MSS_IPATH  /Users/roger/Documents/M/include 
-//#define RAD_MSS_LPATH  /Users/roger/Documents/M/redist/macho/
-//#define RAD_MSS_LIBS  MilesMachO
-//#define rad_mss_ipath $[RAD_MSS_IPATH]
-//#define rad_mss_lpath $[RAD_MSS_LPATH] 
-//#define rad_mss_libs $[RAD_MSS_LIBS]
-
-
-//#print   -- $[RAD_MSS_IPATH]
-//#print  ---  $[RAD_MSS_LPATH]
-//#print   ----$[RAD_MSS_LIBS]
-
-
-//#print  ---$[rad_mss_ipath]
-//#print  ---$[rad_mss_lpath]
-//#print  ---$[rad_mss_libs]
-
-
-
-#define PNG_IPATH /opt/local/include 
-#define PNG_LPATH /opt/local/lib
-#define PNG_LIBS png
-//#define HAVE_PNG 1
-
-
-#define HAVE_OPENSSL 1
-
-// Is libfftw installed, and where?
-#define FFTW_IPATH /opt/local/include
-#define FFTW_LPATH /opt/local/lib
-#define FFTW_LIBS drfftw dfftw
-//#define HAVE_FFTW 1
-
-
-#define TIFF_IPATH /opt/local/include 
-#define TIFF_LPATH /opt/local/lib
-
-// Is the platform big-endian (like an SGI workstation) or
-// little-endian (like a PC)?  Define this to the empty string to
-// indicate little-endian, or nonempty to indicate big-endian.
+// We don't need worry about defining WORDS_BIGENDIAN (and we
+// shouldn't anyway, since ppc and intel are different).  We rely on
+// dtoolbase.h to determine this at compilation time.
 #define WORDS_BIGENDIAN 
 
 // Does the C++ compiler support namespaces?
@@ -167,7 +114,7 @@ print $[PLATFORM]
 #define HAVE_IO_H
 
 // Do we have <malloc.h>?
-#define HAVE_MALLOC_H 1
+#define HAVE_MALLOC_H
 
 // Do we have <alloca.h>?
 #define HAVE_ALLOCA_H 1

+ 0 - 214
dtool/Config.osxintel.pp

@@ -1,214 +0,0 @@
-//
-// Config.osx.pp
-//
-// This file defines some custom config variables for the osx
-// platform.  It makes some initial guesses about compiler features,
-// etc.
-//
-
-// *******************************************************************
-// NOTE: you should not attempt to copy this file verbatim as your own
-// personal Config.pp file.  Instead, you should start with an empty
-// Config.pp file, and add lines to it when you wish to override
-// settings given in here.  In the normal ppremake system, this file
-// will always be read first, and then your personal Config.pp file
-// will be read later, which gives you a chance to override the
-// default settings found in this file.  However, if you start by
-// copying the entire file, it will be difficult to tell which
-// settings you have customized, and it will be difficult to upgrade
-// to a subsequent version of Panda.
-// *******************************************************************
-
-
-//#define PYTHON_IPATH /Library/Frameworks/Python.framework/Headers
-//#define PYTHON_LPATH /Library/Frameworks/Python.framework/Headers
-
-#define PYTHON_IPATH /Library/Frameworks/Python.framework/Headers
-#define HAVE_PYTHON 1
-#define PYTHON_FRAMEWORK  Python
-
-// What additional flags should we pass to interrogate?
-#define SYSTEM_IGATE_FLAGS -D__FLT_EVAL_METHOD__=0  -D__i386__ -D__const=const -Dvolatile -D__LITTLE_ENDIAN__ -D__inline__=inline -D__GNUC__
-#define HAVE_GL 1
-#define IS_OSX 1
-
-//#define ZLIB_IPATH /usr/include
-//#define ZLIB_LPATH /usr/lib/
-//#define ZLIB_LIBS  libz.dylib 
-
-//#define HAVE_ZLIB 1
-//#define HAVE_JPEG 1
-//#define HAVE_FREETYPE 1
-#print   Before Configure Miles 
-#define HAVE_RAD_MSS 1
-#define RAD_MSS_IPATH  /Users/roger/m/include
-#define RAD_MSS_LPATH  /Users/roger/m/redist/macx86
-#define RAD_MSS_LIBS MilesMachOx86
-#define rad_mss_ipath $[RAD_MSS_IPATH]
-#define rad_mss_lpath $[RAD_MSS_LPATH] 
-#define rad_mss_libs $[RAD_MSS_LIBS]
-
-
-//#print   -- $[RAD_MSS_IPATH]
-//#print  ---  $[RAD_MSS_LPATH]
-//#print   ----$[RAD_MSS_LIBS]
-
-
-//#print  ---$[rad_mss_ipath]
-//#print  ---$[rad_mss_lpath]
-//#print  ---$[rad_mss_libs]
-
-
-
-#define PNG_IPATH /opt/local/include 
-#define PNG_LPATH /opt/local/lib
-#define PNG_LIBS png
-//#define HAVE_PNG 1
-
-
-#define HAVE_OPENSSL 1
-
-// Is libfftw installed, and where?
-#define FFTW_IPATH /opt/local/include
-#define FFTW_LPATH /opt/local/lib
-#define FFTW_LIBS rfftw fftw
-//#define HAVE_FFTW 1
-
-
-#define TIFF_IPATH /opt/local/include 
-#define TIFF_LPATH /opt/local/lib
-
-// Is the platform big-endian (like an SGI workstation) or
-// little-endian (like a PC)?  Define this to the empty string to
-// indicate little-endian, or nonempty to indicate big-endian.
-#define WORDS_BIGENDIAN 
-
-// Does the C++ compiler support namespaces?
-#define HAVE_NAMESPACE 1
-
-// Does the C++ compiler support ios::binary?
-#define HAVE_IOS_BINARY 1
-
-// How about the typename keyword?
-#define HAVE_TYPENAME 1
-
-// Will the compiler avoid inserting extra bytes in structs between a
-// base struct and its derived structs?  It is safe to define this
-// false if you don't know, but if you know that you can get away with
-// this you may gain a tiny performance gain by defining this true.
-// If you define this true incorrectly, you will get lots of
-// assertion failures on execution.
-#define SIMPLE_STRUCT_POINTERS
-
-// Do we have a gettimeofday() function?
-#define HAVE_GETTIMEOFDAY 1
-
-// Does gettimeofday() take only one parameter?
-#define GETTIMEOFDAY_ONE_PARAM
-
-// Do we have getopt() and/or getopt_long_only() built into the
-// system?
-#define HAVE_GETOPT 1
-#define HAVE_GETOPT_LONG_ONLY 
-
-// Are the above getopt() functions defined in getopt.h, or somewhere else?
-#define HAVE_GETOPT_H 1
-
-// Can we determine the terminal width by making an ioctl(TIOCGWINSZ) call?
-#define IOCTL_TERMINAL_WIDTH 1
-
-// Do the system headers define a "streamsize" typedef?  How about the
-// ios::binary enumerated value?  And other ios typedef symbols like
-// ios::openmode and ios::fmtflags?
-#define HAVE_STREAMSIZE 1
-#define HAVE_IOS_BINARY 1
-#define HAVE_IOS_TYPEDEFS 1
-
-// Can we safely call getenv() at static init time?
-#define STATIC_INIT_GETENV 1
-
-// Can we read the file /proc/self/environ to determine our
-// environment variables at static init time?
-#define HAVE_PROC_SELF_ENVIRON 1
-
-// Do we have a global pair of argc/argv variables that we can read at
-// static init time?  Should we prototype them?  What are they called?
-#define HAVE_GLOBAL_ARGV
-#define PROTOTYPE_GLOBAL_ARGV
-#define GLOBAL_ARGV __Argv
-#define GLOBAL_ARGC __Argc
-
-// Can we read the file /proc/self/cmdline to determine our
-// command-line arguments at static init time?
-#define HAVE_PROC_SELF_CMDLINE 
-
-// Should we include <iostream> or <iostream.h>?  Define HAVE_IOSTREAM
-// to nonempty if we should use <iostream>, or empty if we should use
-// <iostream.h>.
-#define HAVE_IOSTREAM 1
-
-// Do we have a true stringstream class defined in <sstream>?
-#define HAVE_SSTREAM 1
-
-// Does fstream::open() require a third parameter, specifying the
-// umask?  Versions of gcc prior to 3.2 had this.
-#define HAVE_OPEN_MASK
-
-// Do the compiler or system libraries define wchar_t for you?
-#define HAVE_WCHAR_T 1
-
-// Does <string> define the typedef wstring?  Most do, but for some
-// reason, versions of gcc before 3.0 didn't do this.
-#define HAVE_WSTRING 1
-
-// Do we have <new>?
-#define HAVE_NEW 1
-
-// Do we have <io.h>?
-#define HAVE_IO_H
-
-// Do we have <malloc.h>?
-#define HAVE_MALLOC_H
-
-// Do we have <alloca.h>?
-#define HAVE_ALLOCA_H 1
-
-// Do we have <locale.h>?
-#define HAVE_LOCALE_H 1
-
-// Do we have <minmax.h>?
-#define HAVE_MINMAX_H
-
-// Do we have <sys/types.h>?
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_SYS_TIME_H 1
-
-// Do we have <unistd.h>?
-#define HAVE_UNISTD_H 1
-
-// Do we have <utime.h>?
-#define HAVE_UTIME_H 1
-
-// Do we have <dirent.h>?
-#define HAVE_DIRENT_H 1
-
-// Do we have <glob.h> (and do we want to use it instead of dirent.h)?
-#define HAVE_GLOB_H 1
-
-// Do we have <sys/soundcard.h> (and presumably a Linux-style audio
-// interface)?
-#define HAVE_SYS_SOUNDCARD_H 1
-
-// Do we have RTTI (and <typeinfo>)?
-#define HAVE_RTTI 1
-
-// Must global operator new and delete functions throw exceptions?
-#define GLOBAL_OPERATOR_NEW_EXCEPTIONS 1
-
-// Modern versions of gcc do support the latest STL allocator
-// definitions.
-#define USE_STL_ALLOCATOR 1
-
-// The dynamic library file extension (usually .so .dll or .dylib):
-#define DYNAMIC_LIB_EXT .dylib
-#define BUNDLE_EXT .so

+ 2 - 6
dtool/Config.pp

@@ -876,12 +876,8 @@
   #define CXX CC
 #endif
 
-#if $[and $[OSX_PLATFORM],$[UNIVERSAL_BINARIES]]
-  // Configure for universal binaries on OSX.
-  #define ARCH_FLAGS -arch i386 -arch ppc
-#else
-  #define ARCH_FLAGS
-#endif
+// Configure for universal binaries on OSX.
+#defer ARCH_FLAGS $[if $[and $[OSX_PLATFORM],$[UNIVERSAL_BINARIES]],-arch i386 -arch ppc,]
 
 // How to compile a C or C++ file into a .o file.  $[target] is the
 // name of the .o file, $[source] is the name of the source file,

+ 1 - 1
dtool/Package.pp

@@ -63,7 +63,7 @@
 #define WINDOWS_PLATFORM $[or $[eq $[PLATFORM],Win32],$[eq $[PLATFORM],Cygwin]]
 
 // True if we are building on some flavor of OS X.
-#define OSX_PLATFORM $[or $[eq $[PLATFORM],Darwin],$[eq $[PLATFORM],osxppc],$[eq $[PLATFORM],osxintel]]
+#define OSX_PLATFORM $[eq $[PLATFORM],OSX]
 
 // True if we are building on some flavor of Unix.
 #define UNIX_PLATFORM $[and $[not $[WINDOWS_PLATFORM]],$[not $[OSX_PLATFORM]]]

+ 2 - 0
dtool/pptempl/Global.pp

@@ -102,6 +102,7 @@
   #define nspr_lpath $[wildcard $[NSPR_LPATH]]
   #define nspr_cflags $[NSPR_CFLAGS]
   #define nspr_libs $[NSPR_LIBS]
+  #define nspr_framework $[NSPR_FRAMEWORK]
 #endif
 
 #if $[HAVE_OPENSSL]
@@ -278,6 +279,7 @@
   #define freetype_lpath $[wildcard $[FREETYPE_LPATH]]
   #define freetype_cflags $[FREETYPE_CFLAGS]
   #define freetype_libs $[FREETYPE_LIBS]
+  #define freetype_framework $[FREETYPE_FRAMEWORK]
 #endif
 
 #if $[and $[HAVE_MAYA],$[MAYA_LOCATION]]

+ 1 - 1
panda/src/audio/config_audio.cxx

@@ -64,7 +64,7 @@ ConfigVariableBool fmod_use_surround_sound
 // Config variables for Miles:
 
 ConfigVariableBool audio_software_midi 
-("audio-software-midi", false);
+("audio-software-midi", true);
 
 ConfigVariableFilename audio_dls_file
 ("audio-dls-file", "");

+ 2 - 8
panda/src/audiotraits/milesAudioManager.cxx

@@ -78,21 +78,15 @@ MilesAudioManager() {
     S32 use_MIDI=(audio_play_midi)?1:0;
     if (audio_play_midi && audio_software_midi) {
       use_MIDI=AIL_QUICK_DLS_ONLY;
-
     }
 
-#ifdef IS_OSX 
-use_MIDI=AIL_QUICK_DLS_ONLY;
-audio_software_midi=true;
-#endif
-
     audio_debug("  use_digital="<<use_digital);
     audio_debug("  use_MIDI="<<use_MIDI);
     audio_debug("  audio_output_rate="<<audio_output_rate);
     audio_debug("  audio_output_bits="<<audio_output_bits);
     audio_debug("  audio_output_channels="<<audio_output_channels);
     audio_debug("  audio_software_midi="<<audio_software_midi);
-    #ifndef NDEBUG //[
+    #if !defined(NDEBUG) && defined(AIL_MSS_version) //[
       char version[8];
       AIL_MSS_version(version, 8);
       audio_debug("  Mss32.dll Version: "<<version);
@@ -136,7 +130,7 @@ audio_software_midi=true;
         audio_info("  using Miles hardware midi");
       }
     } else {
-      audio_debug("  AIL_quick_startup failed: "<<AIL_last_error());
+      audio_error("Unable to init MilesAudioManager.  AIL_quick_startup failed: "<<AIL_last_error());
       _is_valid = false;
     }
   }

+ 12 - 11
panda/src/downloader/config_downloader.cxx

@@ -47,20 +47,21 @@ ConfigVariableInt downloader_timeout
 ConfigVariableInt downloader_timeout_retries
 ("downloader-timeout-retries", 5);
 
-ConfigVariableInt decompressor_buffer_size
-("decompressor-buffer-size", 4096);
+ConfigVariableDouble decompressor_step_time
+("decompressor-step-time", 0.1,
+ PRC_DESC("Specifies the maximum amount of time that should be consumed by "
+          "a single call to Decompressor::run()."));
 
-ConfigVariableDouble decompressor_frequency
-("decompressor-frequency", 0.2);
-
-ConfigVariableInt extractor_buffer_size
-("extractor-buffer-size", 4096);
-
-ConfigVariableDouble extractor_frequency
-("extractor-frequency", 0.2);
+ConfigVariableDouble extractor_step_time
+("extractor-step-time", 0.1,
+ PRC_DESC("Specifies the maximum amount of time that should be consumed by "
+          "a single call to Extractor::step()."));
 
 ConfigVariableInt patcher_buffer_size
-("patcher-buffer-size", 4096);
+("patcher-buffer-size", 16384,
+  PRC_DESC("Limits the size of the buffer used in a single call to "
+           "Patcher::run().  Increasing this may help the Patcher "
+           "perform more work before returning."));
 
 ConfigVariableBool verify_ssl
 ("verify-ssl", true,

+ 2 - 6
panda/src/downloader/config_downloader.h

@@ -38,12 +38,8 @@ extern ConfigVariableDouble downloader_frequency;
 extern ConfigVariableInt downloader_timeout;
 extern ConfigVariableInt downloader_timeout_retries;
 
-extern ConfigVariableInt decompressor_buffer_size;
-extern ConfigVariableDouble decompressor_frequency;
-
-extern ConfigVariableInt extractor_buffer_size;
-extern ConfigVariableDouble extractor_frequency;
-
+extern ConfigVariableDouble decompressor_step_time;
+extern ConfigVariableDouble extractor_step_time;
 extern ConfigVariableInt patcher_buffer_size;
 
 extern ConfigVariableBool verify_ssl;

+ 18 - 9
panda/src/downloader/decompressor.cxx

@@ -27,6 +27,7 @@
 #include "ramfile.h"
 #include "zStream.h"
 #include "config_express.h"
+#include "trueClock.h"
 
 #include "decompressor.h"
 
@@ -159,19 +160,27 @@ run() {
     // Hmm, we were already done.
     return EU_success;
   }
-  
-  // Read a bunch of characters from the decompress stream, but no
-  // more than decompressor_buffer_size.
-  int count = 0;
-  int ch = _decompress->get();
-  while (!_decompress->eof() && !_decompress->fail()) {
-    _dest->put(ch);
-    if (++count >= decompressor_buffer_size) {
+
+  TrueClock *clock = TrueClock::get_global_ptr();
+  double now = clock->get_short_time();
+  double finish = now + decompressor_step_time;
+
+  static const size_t buffer_size = 1024;
+  char buffer[buffer_size];
+
+  _decompress->read(buffer, buffer_size);
+  size_t count = _decompress->gcount();
+  while (count != 0) {
+    _dest->write(buffer, count);
+
+    now = clock->get_short_time();
+    if (now >= finish) {
       // That's enough for now.
       return EU_ok;
     }
 
-    ch = _decompress->get();
+    _decompress->read(buffer, buffer_size);
+    count = _decompress->gcount();
   }
 
   // All done!

+ 95 - 52
panda/src/downloader/extractor.cxx

@@ -155,69 +155,112 @@ step() {
     _initiated = true;
   }
 
-  if (_read == (istream *)NULL) {
-    // Time to open the next subfile.
-    if (_request_index >= (int)_requests.size()) {
-      // All done!
-      reset();
-      return EU_success;
-    }
-
-    _subfile_index = _requests[_request_index];
-    _subfile_filename = Filename(_extract_dir, 
-                                 _multifile->get_subfile_name(_subfile_index));
-    _subfile_filename.set_binary();
-    _subfile_filename.make_dir();
-    if (!_subfile_filename.open_write(_write, true)) {
-      downloader_cat.error()
-        << "Unable to write to " << _subfile_filename << ".\n";
-      reset();
-      return EU_error_abort;
-    }
+  TrueClock *clock = TrueClock::get_global_ptr();
+  double now = clock->get_short_time();
+  double finish = now + extractor_step_time;
 
-    _subfile_length = _multifile->get_subfile_length(_subfile_index);
-    _subfile_pos = 0;
-    _read = _multifile->open_read_subfile(_subfile_index);
+  do {
     if (_read == (istream *)NULL) {
-      downloader_cat.error()
-        << "Unable to read subfile "
-        << _multifile->get_subfile_name(_subfile_index) << ".\n";
-      reset();
-      return EU_error_abort;
-    }
+      // Time to open the next subfile.
+      if (_request_index >= (int)_requests.size()) {
+        // All done!
+        if (downloader_cat.is_debug()) {
+          downloader_cat.debug()
+            << "Finished extracting.\n";
+        }
+        reset();
+        return EU_success;
+      }
+      
+      _subfile_index = _requests[_request_index];
+      _subfile_filename = Filename(_extract_dir, 
+                                   _multifile->get_subfile_name(_subfile_index));
 
-  } else if (_subfile_pos >= _subfile_length) {
-    // Time to close this subfile.
-    delete _read;
-    _read = (istream *)NULL;
-    _write.close();
-    _request_index++;
+      if (downloader_cat.is_debug()) {
+        downloader_cat.debug()
+          << "Extracting " << _subfile_filename << ".\n";
+      }
 
-  } else {
-    // Read a number of bytes from the subfile and write them to the
-    // output.
-    size_t max_bytes = min((size_t)extractor_buffer_size, 
-                           _subfile_length - _subfile_pos);
-    for (size_t p = 0; p < max_bytes; p++) {
-      int byte = _read->get();
-      if (_read->eof() || _read->fail()) {
+      _subfile_filename.set_binary();
+      _subfile_filename.make_dir();
+      if (!_subfile_filename.open_write(_write, true)) {
+        downloader_cat.error()
+          << "Unable to write to " << _subfile_filename << ".\n";
+        reset();
+        return EU_error_abort;
+      }
+      
+      _subfile_length = _multifile->get_subfile_length(_subfile_index);
+      _subfile_pos = 0;
+      _read = _multifile->open_read_subfile(_subfile_index);
+      if (_read == (istream *)NULL) {
+        downloader_cat.error()
+          << "Unable to read subfile "
+          << _multifile->get_subfile_name(_subfile_index) << ".\n";
+        reset();
+        return EU_error_abort;
+      }
+      
+    } else if (_subfile_pos >= _subfile_length) {
+      // Time to close this subfile.
+
+      if (downloader_cat.is_debug()) {
+        downloader_cat.debug()
+          << "Finished current subfile.\n";
+      }
+      delete _read;
+      _read = (istream *)NULL;
+      _write.close();
+      _request_index++;
+      
+    } else {
+      // Read a number of bytes from the subfile and write them to the
+      // output.
+      static const size_t buffer_size = 1024;
+      char buffer[buffer_size];
+      
+      size_t max_bytes = min(buffer_size, _subfile_length - _subfile_pos);
+      _read->read(buffer, max_bytes);
+      size_t count = _read->gcount();
+      while (count != 0) {
+        if (downloader_cat.is_spam()) {
+          downloader_cat.spam()
+            << " . . . read " << count << " bytes.\n";
+        }
+        _write.write(buffer, count);
+        if (!_write) {
+          downloader_cat.error()
+            << "Error writing to " << _subfile_filename << ".\n";
+          reset();
+          return EU_error_abort;
+        }
+        
+        _subfile_pos += count;
+        _total_bytes_extracted += count;
+        
+        now = clock->get_short_time();
+        if (now >= finish) {
+          // That's enough for now.
+          return EU_ok;
+        }
+        
+        max_bytes = min(buffer_size, _subfile_length - _subfile_pos);
+        _read->read(buffer, max_bytes);
+        count = _read->gcount();
+      }
+      
+      if (max_bytes != 0) {
         downloader_cat.error()
           << "Unexpected EOF on multifile " << _multifile_name << ".\n";
         reset();
         return EU_error_abort;
       }
-      _write.put(byte);
-    }
-    if (!_write) {
-      downloader_cat.error()
-        << "Error writing to " << _subfile_filename << ".\n";
-      reset();
-      return EU_error_abort;
     }
-    _subfile_pos += max_bytes;
-    _total_bytes_extracted += max_bytes;
-  }
+  
+    now = clock->get_short_time();
+  } while (now < finish);
 
+  // That's enough for now.
   return EU_ok;
 }
 

+ 0 - 4
panda/src/mathutil/fftCompressor.cxx

@@ -27,7 +27,6 @@
 
 #ifdef HAVE_FFTW
 
-#ifdef IS_OSX
 //  hack.....
 // this is a hack to help interigate sort out a macro 
 // in the system poll and select definitions 
@@ -35,10 +34,7 @@
 #ifdef howmany
 #undef howmany
 #endif
-#include <drfftw.h>
-#else
 #include <rfftw.h>
-#endif 
 
 // These FFTW support objects can only be defined if we actually have
 // the FFTW library available.

+ 3 - 2
panda/src/net/Sources.pp

@@ -1,5 +1,6 @@
-#define OTHER_LIBS interrogatedb:c dconfig:c dtoolconfig:m \
-                   dtoolutil:c dtoolbase:c dtool:m
+#define OTHER_LIBS \
+   interrogatedb:c dconfig:c dtoolconfig:m \
+   dtoolutil:c dtoolbase:c prc:c dtool:m
 #define BUILD_DIRECTORY $[and $[HAVE_NET],$[HAVE_NSPR]]
 #define USE_PACKAGES net nspr