summaryrefslogtreecommitdiffstats
path: root/plzip.h
diff options
context:
space:
mode:
Diffstat (limited to 'plzip.h')
-rw-r--r--plzip.h102
1 files changed, 98 insertions, 4 deletions
diff --git a/plzip.h b/plzip.h
index d7bb760..6615fc1 100644
--- a/plzip.h
+++ b/plzip.h
@@ -1,4 +1,4 @@
-/* Plzip - A parallel version of the lzip data compressor
+/* Plzip - A parallel compressor compatible with lzip
Copyright (C) 2009 Laszlo Ersek.
Copyright (C) 2009, 2010 Antonio Diaz Diaz.
@@ -16,19 +16,113 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+class Pretty_print
+ {
+ const char * const stdin_name;
+ const unsigned int stdin_name_len;
+ unsigned int longest_name;
+ std::string name_;
+ mutable bool first_post;
+
+public:
+ Pretty_print( const std::vector< std::string > & filenames )
+ : stdin_name( "(stdin)" ), stdin_name_len( std::strlen( stdin_name ) ),
+ longest_name( 0 ), first_post( false )
+ {
+ for( unsigned int i = 0; i < filenames.size(); ++i )
+ {
+ const std::string & s = filenames[i];
+ const unsigned int len = ( ( s == "-" ) ? stdin_name_len : s.size() );
+ if( len > longest_name ) longest_name = len;
+ }
+ if( longest_name == 0 ) longest_name = stdin_name_len;
+ }
+
+ void set_name( const std::string & filename )
+ {
+ if( filename.size() && filename != "-" ) name_ = filename;
+ else name_ = stdin_name;
+ first_post = true;
+ }
+
+ void reset() const throw() { if( name_.size() ) first_post = true; }
+ const char * name() const throw() { return name_.c_str(); }
+ void operator()( const char * const msg = 0 ) const throw();
+ };
+
+
+/*--------------------- Defined in compress.cc ---------------------*/
+
+void xinit( pthread_cond_t * cond, pthread_mutex_t * mutex );
+void xdestroy( pthread_cond_t * cond, pthread_mutex_t * mutex );
+void xlock( pthread_mutex_t * mutex );
+void xunlock( pthread_mutex_t * mutex );
+void xwait( pthread_cond_t * cond, pthread_mutex_t * mutex );
+void xsignal( pthread_cond_t * cond );
+void xbroadcast( pthread_cond_t * cond );
+void xcreate( pthread_t *thread, void *(*routine)(void *), void *arg );
+void xjoin( pthread_t thread );
+
+
+class Slot_tally
+ {
+public:
+ unsigned long check_counter;
+ unsigned long wait_counter;
+private:
+ const int num_slots; // total slots
+ int num_free; // remaining free slots
+ pthread_mutex_t mutex;
+ pthread_cond_t slot_av; // free slot available
+
+public:
+ Slot_tally( const int slots )
+ : check_counter( 0 ), wait_counter( 0 ),
+ num_slots( slots ), num_free( slots )
+ { xinit( &slot_av, &mutex ); }
+
+ ~Slot_tally() { xdestroy( &slot_av, &mutex ); }
+
+ bool all_free() { return ( num_free == num_slots ); }
+
+ void get_slot() // wait for a free slot
+ {
+ xlock( &mutex );
+ ++check_counter;
+ while( num_free == 0 )
+ { ++wait_counter; xwait( &slot_av, &mutex ); }
+ --num_free;
+ xunlock( &mutex );
+ }
+
+ void leave_slot() // return a slot to the tally
+ {
+ xlock( &mutex );
+ if( num_free++ == 0 ) xsignal( &slot_av );
+ xunlock( &mutex );
+ }
+ };
+
+
int compress( const int data_size, const int dictionary_size,
const int match_len_limit, const int num_workers,
const int num_slots, const int infd, const int outfd,
const int debug_level );
+/*-------------------- Defined in decompress.cc --------------------*/
+
+int decompress( const int infd, const int outfd, const Pretty_print & pp,
+ const bool testing );
+
+
/*----------------------- Defined in main.cc -----------------------*/
+extern int verbosity;
+
void show_error( const char * msg, const int errcode = 0, const bool help = false ) throw();
+void internal_error( const char * msg );
int readblock( const int fd, uint8_t * buf, const int size ) throw();
int writeblock( const int fd, const uint8_t * buf, const int size ) throw();
-
void fatal(); // Terminate the process
-
-extern int verbosity;