changeset 34704:cc658103f214

Allow using a cache size of up to 4 TB. Obviously anything close to 4 GB will always fail on 32 bit systems.
author reimar
date Sun, 04 Mar 2012 14:47:37 +0000
parents 4ccdcd1ff6ba
children ba926fab9550
files cfg-common.h mencoder.c mplayer.c osdep/shmem.c osdep/shmem.h stream/cache2.c stream/stream.h
diffstat 7 files changed, 38 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/cfg-common.h	Sun Mar 04 14:37:31 2012 +0000
+++ b/cfg-common.h	Sun Mar 04 14:47:37 2012 +0000
@@ -315,7 +315,7 @@
 // ------------------------- stream options --------------------
 
 #ifdef CONFIG_STREAM_CACHE
-    {"cache", &stream_cache_size, CONF_TYPE_INT, CONF_RANGE, 32, 1048576, NULL},
+    {"cache", &stream_cache_size, CONF_TYPE_INT, CONF_RANGE, 32, 0x7fffffff, NULL},
     {"nocache", &stream_cache_size, CONF_TYPE_FLAG, 0, 1, 0, NULL},
     {"cache-min", &stream_cache_min_percent, CONF_TYPE_FLOAT, CONF_RANGE, 0, 99, NULL},
     {"cache-seek-min", &stream_cache_seek_min_percent, CONF_TYPE_FLOAT, CONF_RANGE, 0, 99, NULL},
--- a/mencoder.c	Sun Mar 04 14:37:31 2012 +0000
+++ b/mencoder.c	Sun Mar 04 14:47:37 2012 +0000
@@ -678,7 +678,7 @@
 
   stream->start_pos+=seek_to_byte;
 
-  if(stream_cache_size>0) stream_enable_cache(stream,stream_cache_size*1024,0,0);
+  if(stream_cache_size>0) stream_enable_cache(stream,stream_cache_size*1024ull,0,0);
 
   if(demuxer2) audio_id=-2; /* do NOT read audio packets... */
 
--- a/mplayer.c	Sun Mar 04 14:37:31 2012 +0000
+++ b/mplayer.c	Sun Mar 04 14:47:37 2012 +0000
@@ -3298,9 +3298,9 @@
     if (stream_cache_size > 0) {
         int res;
         current_module = "enable_cache";
-        res = stream_enable_cache(mpctx->stream, stream_cache_size * 1024,
-                                  stream_cache_size * 1024 * (stream_cache_min_percent / 100.0),
-                                  stream_cache_size * 1024 * (stream_cache_seek_min_percent / 100.0));
+        res = stream_enable_cache(mpctx->stream, stream_cache_size * 1024ull,
+                                  stream_cache_size * 1024ull * (stream_cache_min_percent / 100.0),
+                                  stream_cache_size * 1024ull * (stream_cache_seek_min_percent / 100.0));
         if (res == 0)
             if ((mpctx->eof = libmpdemux_was_interrupted(PT_NEXT_ENTRY)))
                 goto goto_next_file;
--- a/osdep/shmem.c	Sun Mar 04 14:37:31 2012 +0000
+++ b/osdep/shmem.c	Sun Mar 04 14:47:37 2012 +0000
@@ -36,6 +36,7 @@
 #endif
 #include <sys/socket.h>
 #include <fcntl.h>
+#include <inttypes.h>
 
 #include "mp_msg.h"
 #include "shmem.h"
@@ -55,16 +56,21 @@
 
 static int shmem_type=0;
 
-void* shmem_alloc(int size){
+void* shmem_alloc(int64_t size){
 void* p;
 static int devzero = -1;
+if (size > SIZE_MAX) {
+  mp_msg(MSGT_OSDEP, MSGL_FATAL,
+         "Shared memory allocation larger than system max. allocation size.\n");
+  return NULL;
+}
 while(1){
   switch(shmem_type){
   case 0:  // ========= MAP_ANON|MAP_SHARED ==========
 #ifdef MAP_ANON
     p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0);
     if(p==MAP_FAILED) break; // failed
-    mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using mmap anon (%p)\n",size,p);
+    mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %"PRId64" bytes allocated using mmap anon (%p)\n",size,p);
     return p;
 #else
 // system does not support MAP_ANON at all (e.g. solaris 2.5.1/2.6), just fail
@@ -75,7 +81,7 @@
     if (devzero == -1 && (devzero = open("/dev/zero", O_RDWR, 0)) == -1) break;
     p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,devzero,0);
     if(p==MAP_FAILED) break; // failed
-    mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using mmap /dev/zero (%p)\n",size,p);
+    mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %"PRId64" bytes allocated using mmap /dev/zero (%p)\n",size,p);
     return p;
   case 2: { // ========= shmget() ==========
 #ifdef HAVE_SHM
@@ -92,7 +98,7 @@
       if (shmdt(p) == -1) perror ("shmdt()");
       break;
     }
-    mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using SHM (%p)\n",size,p);
+    mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %"PRId64" bytes allocated using SHM (%p)\n",size,p);
     return p;
 #else
     mp_msg(MSGT_OSDEP, MSGL_FATAL, "shmem: no SHM support was compiled in!\n");
@@ -101,19 +107,19 @@
     }
   default:
     mp_msg(MSGT_OSDEP, MSGL_FATAL,
-	"FATAL: Cannot allocate %d bytes of shared memory :(\n",size);
+	"FATAL: Cannot allocate %"PRId64" bytes of shared memory :(\n",size);
     return NULL;
   }
   ++shmem_type;
 }
 }
 
-void shmem_free(void* p,int size){
+void shmem_free(void* p,int64_t size){
   switch(shmem_type){
     case 0:
     case 1:
 	    if(munmap(p,size)) {
-		mp_msg(MSGT_OSDEP, MSGL_ERR, "munmap failed on %p %d bytes: %s\n",
+		mp_msg(MSGT_OSDEP, MSGL_ERR, "munmap failed on %p %"PRId64" bytes: %s\n",
 		    p,size,strerror(errno));
 	    }
       break;
--- a/osdep/shmem.h	Sun Mar 04 14:37:31 2012 +0000
+++ b/osdep/shmem.h	Sun Mar 04 14:47:37 2012 +0000
@@ -19,7 +19,7 @@
 #ifndef MPLAYER_SHMEM_H
 #define MPLAYER_SHMEM_H
 
-void* shmem_alloc(int size);
-void shmem_free(void* p,int size);
+void* shmem_alloc(int64_t size);
+void shmem_free(void* p,int64_t size);
 
 #endif /* MPLAYER_SHMEM_H */
--- a/stream/cache2.c	Sun Mar 04 14:37:31 2012 +0000
+++ b/stream/cache2.c	Sun Mar 04 14:47:37 2012 +0000
@@ -70,11 +70,11 @@
 typedef struct {
   // constats:
   unsigned char *buffer;      // base pointer of the allocated buffer memory
-  int buffer_size; // size of the allocated buffer memory
+  int64_t buffer_size; // size of the allocated buffer memory
   int sector_size; // size of a single sector (2048/2324)
-  int back_size;   // we should keep back_size amount of old bytes for backward seek
-  int fill_limit;  // we should fill buffer only if space>=fill_limit
-  int seek_limit;  // keep filling cache if distance is less that seek limit
+  int64_t back_size;   // we should keep back_size amount of old bytes for backward seek
+  int64_t fill_limit;  // we should fill buffer only if space>=fill_limit
+  int64_t seek_limit;  // keep filling cache if distance is less that seek limit
 #if FORKED_CACHE
   pid_t ppid; // parent PID to detect killed parent
 #endif
@@ -117,9 +117,9 @@
 {
   int total=0;
   int sleep_count = 0;
-  int last_max = s->max_filepos;
+  int64_t last_max = s->max_filepos;
   while(size>0){
-    int pos,newb,len;
+    int64_t pos,newb,len;
 
   //printf("CACHE2_READ: 0x%X <= 0x%X <= 0x%X  \n",s->min_filepos,s->read_filepos,s->max_filepos);
 
@@ -173,7 +173,7 @@
 
 static int cache_fill(cache_vars_t *s)
 {
-  int back,back2,newb,space,len,pos;
+  int64_t back,back2,newb,space,len,pos;
   off_t read=s->read_filepos;
   int read_chunk;
   int wraparound_copy = 0;
@@ -334,7 +334,7 @@
   return 1;
 }
 
-static void *shared_alloc(int size) {
+static void *shared_alloc(int64_t size) {
 #if FORKED_CACHE
     return shmem_alloc(size);
 #else
@@ -342,7 +342,7 @@
 #endif
 }
 
-static void shared_free(void *ptr, int size) {
+static void shared_free(void *ptr, int64_t size) {
 #if FORKED_CACHE
     shmem_free(ptr, size);
 #else
@@ -350,8 +350,8 @@
 #endif
 }
 
-static cache_vars_t* cache_init(int size,int sector){
-  int num;
+static cache_vars_t* cache_init(int64_t size,int sector){
+  int64_t num;
   cache_vars_t* s=shared_alloc(sizeof(cache_vars_t));
   if(s==NULL) return NULL;
 
@@ -441,7 +441,7 @@
 /**
  * \return 1 on success, 0 if the function was interrupted and -1 on error
  */
-int stream_enable_cache(stream_t *stream,int size,int min,int seek_limit){
+int stream_enable_cache(stream_t *stream,int64_t size,int64_t min,int64_t seek_limit){
   int ss = stream->sector_size ? stream->sector_size : STREAM_BUFFER_SIZE;
   int res = -1;
   cache_vars_t* s;
@@ -450,6 +450,10 @@
     mp_msg(MSGT_CACHE,MSGL_STATUS,"\rThis stream is non-cacheable\n");
     return 1;
   }
+  if (size > SIZE_MAX) {
+    mp_msg(MSGT_CACHE, MSGL_FATAL, "Cache size larger than max. allocation size\n");
+    return -1;
+  }
 
   s=cache_init(size,ss);
   if(s == NULL) return -1;
@@ -498,7 +502,7 @@
         goto err_out;
     }
     // wait until cache is filled at least prefill_init %
-    mp_msg(MSGT_CACHE,MSGL_V,"CACHE_PRE_INIT: %"PRId64" [%"PRId64"] %"PRId64"  pre:%d  eof:%d  \n",
+    mp_msg(MSGT_CACHE,MSGL_V,"CACHE_PRE_INIT: %"PRId64" [%"PRId64"] %"PRId64"  pre:%"PRId64"  eof:%d  \n",
 	(int64_t)s->min_filepos,(int64_t)s->read_filepos,(int64_t)s->max_filepos,min,s->eof);
     while(s->read_filepos<s->min_filepos || s->max_filepos-s->read_filepos<min){
 	mp_msg(MSGT_CACHE,MSGL_STATUS,MSGTR_CacheFill,
--- a/stream/stream.h	Sun Mar 04 14:37:31 2012 +0000
+++ b/stream/stream.h	Sun Mar 04 14:47:37 2012 +0000
@@ -191,7 +191,7 @@
 void stream_capture_do(stream_t *s);
 
 #ifdef CONFIG_STREAM_CACHE
-int stream_enable_cache(stream_t *stream,int size,int min,int prefill);
+int stream_enable_cache(stream_t *stream,int64_t size,int64_t min,int64_t prefill);
 int cache_stream_fill_buffer(stream_t *s);
 int cache_stream_seek_long(stream_t *s,off_t pos);
 #else