4a4997d46c
- Mark MAKE_JOBS_UNSAFE, tries to use object file before it's built (cc: match.o: No such file or directory) Suggested by: adamw [1] Approved by: portmgr blanket
98 lines
2.6 KiB
C
98 lines
2.6 KiB
C
--- mmc.c.orig 2014-12-10 20:53:22 UTC
|
|
+++ mmc.c
|
|
@@ -83,6 +83,9 @@ typedef struct MapStruct {
|
|
time_t ct;
|
|
int refcount;
|
|
time_t reftime;
|
|
+#ifdef USE_SENDFILE
|
|
+ int fd;
|
|
+#endif
|
|
void* addr;
|
|
unsigned int hash;
|
|
int hash_idx;
|
|
@@ -149,7 +152,11 @@ mmc_map( char* filename, struct stat* sb
|
|
/* Yep. Just return the existing map */
|
|
++m->refcount;
|
|
m->reftime = now;
|
|
+#ifdef USE_SENDFILE
|
|
+ return (&m->fd);
|
|
+#else
|
|
return m->addr;
|
|
+#endif
|
|
}
|
|
|
|
/* Open the file. */
|
|
@@ -195,7 +202,9 @@ mmc_map( char* filename, struct stat* sb
|
|
else
|
|
{
|
|
size_t size_size = (size_t) m->size; /* loses on files >2GB */
|
|
-#ifdef HAVE_MMAP
|
|
+#ifdef USE_SENDFILE
|
|
+ m->fd = fd;
|
|
+#elif defined(HAVE_MMAP)
|
|
/* Map the file into memory. */
|
|
m->addr = mmap( 0, size_size, PROT_READ, MAP_PRIVATE, fd, 0 );
|
|
if ( m->addr == (void*) -1 && errno == ENOMEM )
|
|
@@ -243,8 +252,9 @@ mmc_map( char* filename, struct stat* sb
|
|
}
|
|
#endif /* HAVE_MMAP */
|
|
}
|
|
+#ifndef USE_SENDFILE
|
|
(void) close( fd );
|
|
-
|
|
+#endif /* !USE_SENDFILE */
|
|
/* Put the Map into the hash table. */
|
|
if ( add_hash( m ) < 0 )
|
|
{
|
|
@@ -262,8 +272,12 @@ mmc_map( char* filename, struct stat* sb
|
|
/* Update the total byte count. */
|
|
mapped_bytes += m->size;
|
|
|
|
+#ifdef USE_SENDFILE
|
|
+ return (&m->fd);
|
|
+#else
|
|
/* And return the address. */
|
|
return m->addr;
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -276,14 +290,18 @@ mmc_unmap( void* addr, struct stat* sbP,
|
|
if ( sbP != (struct stat*) 0 )
|
|
{
|
|
m = find_hash( sbP->st_ino, sbP->st_dev, sbP->st_size, sbP->st_ctime );
|
|
+#ifndef USE_SENDFILE
|
|
if ( m != (Map*) 0 && m->addr != addr )
|
|
m = (Map*) 0;
|
|
+#endif
|
|
}
|
|
+#ifndef USE_SENDFILE
|
|
/* If that didn't work, try a full search. */
|
|
if ( m == (Map*) 0 )
|
|
for ( m = maps; m != (Map*) 0; m = m->next )
|
|
if ( m->addr == addr )
|
|
break;
|
|
+#endif
|
|
if ( m == (Map*) 0 )
|
|
syslog( LOG_ERR, "mmc_unmap failed to find entry!" );
|
|
else if ( m->refcount <= 0 )
|
|
@@ -372,7 +390,9 @@ really_unmap( Map** mm )
|
|
m = *mm;
|
|
if ( m->size != 0 )
|
|
{
|
|
-#ifdef HAVE_MMAP
|
|
+#ifdef USE_SENDFILE
|
|
+ close(m->fd);
|
|
+#elif defined(HAVE_MMAP)
|
|
if ( munmap( m->addr, m->size ) < 0 )
|
|
syslog( LOG_ERR, "munmap - %m" );
|
|
#else /* HAVE_MMAP */
|
|
@@ -523,7 +543,7 @@ void
|
|
mmc_logstats( long secs )
|
|
{
|
|
syslog(
|
|
- LOG_NOTICE, " map cache - %d allocated, %d active (%lld bytes), %d free; hash size: %d; expire age: %ld",
|
|
+ LOG_NOTICE, " map cache - %d allocated, %d active (%lld bytes), %d free; hash size: %d; expire age: %d",
|
|
alloc_count, map_count, (long long) mapped_bytes, free_count, hash_size,
|
|
expire_age );
|
|
if ( map_count + free_count != alloc_count )
|