AMD64 build fixes and parallelism tweaks

TODO: figure out how to autodetect lib vs lib64.

These changes were made some time ago (can't remember when) but didn't
get committed until now.  (Yes, naughty me, but perhaps I was in a rush.)
This commit is contained in:
Stuart Longland 2014-04-06 20:08:54 +10:00
parent 1acd1307c0
commit 9e2ab341ba
4 changed files with 46 additions and 8 deletions

View File

@ -1,16 +1,17 @@
.PHONY: clean install
CS_PATH=/usr
CS_PATH ?= /usr
MY_CFLAGS+=-I$(CS_PATH)/include/ClearSilver $(CFLAGS)
MY_CFLAGS+=$(shell Wand-config --cflags --cppflags)
MY_LDFLAGS+=$(shell Wand-config --ldflags --libs) $(LDFLAGS)
MY_CFLAGS+=$(shell pkg-config --cflags json)
MY_LDFLAGS+=$(shell pkg-config --libs json)
MY_LDFLAGS+=-ljpeg
OBJS=obj/main.o obj/util.o obj/galleries.o obj/gallery.o obj/varray.o \
obj/photo.o obj/hdf-json.o obj/jpeg.o \
$(CS_PATH)/lib/libneo_cgi.a $(CS_PATH)/lib/libneo_cs.a \
$(CS_PATH)/lib/libneo_utl.a
$(CS_PATH)/lib64/libneo_cgi.a $(CS_PATH)/lib64/libneo_cs.a \
$(CS_PATH)/lib64/libneo_utl.a
VERSIONSTAMP=$(shell if [ -d .git ]; then git describe; else cat version; fi)
COMPILESTAMP=$(shell date "+%Y-%m-%d %H:%M:%S %z" )
@ -23,7 +24,7 @@ obj:
obj/%.o: src/%.c include/%.h obj
$(CC) -DCOMPILESTAMP='"$(COMPILESTAMP)"' \
-DVERSIONSTAMP='"$(VERSIONSTAMP)"' \
$(MY_CFLAGS) -I include -o $@ -c $<
$(MY_CFLAGS) -I include $(CPPFLAGS) -o $@ -c $<
clean:
rm -fr obj gallery.cgi

View File

@ -179,4 +179,14 @@ void sort_str_array( char** array, size_t length, int case_insensitive );
void sort_array( void** array, size_t length,
int (*compare)( const void*, const void* ) );
/*!
* Pause if the server load is too high.
* This causes the CGI script to sleep for a second if the load average is
* above MAX_CPU_LOAD.
*/
void wait_cpu_load();
#ifndef MAX_CPU_LOAD
#define MAX_CPU_LOAD (2.0)
#endif
#endif

View File

@ -463,21 +463,25 @@ char* resize_photo( struct photo_meta* dest,
}
}
#ifndef NO_SEMAPHORE
/*
* Check for semaphore... if it exists, wait for it to disappear.
* For this, we use the open() syscall with O_CREAT|O_EXCL, which
* will fail if the file already exists.
*/
char* sem_file = construct_path( "s/s/s", get_cgidir(),
CACHEDIR, "semaphore" );
char* sem_file = construct_path( "s/ss", get_cgidir(),
cache_file, ".sem" );
int fd = open( sem_file, O_CREAT|O_EXCL, S_IRUSR|S_IWUSR );
while( fd == -1 ) {
sleep(1);
fd = open( sem_file, O_CREAT|O_EXCL, S_IRUSR|S_IWUSR );
fprintf( stderr, "resize_photo: waiting for semaphore %s (fd: %d)\n",
sem_file, fd );
dprintf( "resize_photo: waiting for semaphore %s (fd: %d)\n",
sem_file, fd );
}
close(fd);
#endif
MagickWand* wand = NewMagickWand();
dprintf( "resize_photo: wand created at %p\n", wand);
@ -486,11 +490,12 @@ char* resize_photo( struct photo_meta* dest,
char* description=MagickGetException(wand,&severity);
dprintf("%s %s %ld %s\n",GetMagickModule(),description);
gcfree( cache_file );
#ifndef NO_SEMAPHORE
/* Get rid of the semaphore */
unlink( sem_file );
gcfree( sem_file );
#endif
return NULL;
}
@ -521,9 +526,11 @@ char* resize_photo( struct photo_meta* dest,
char* description=MagickGetException(wand,&severity);
dprintf("%s %s %ld %s\n",GetMagickModule(),description);
#ifndef NO_SEMAPHORE
/* Get rid of the semaphore */
unlink( sem_file );
gcfree( sem_file );
#endif
gcfree( cache_file );
cache_file = NULL;
@ -531,9 +538,11 @@ char* resize_photo( struct photo_meta* dest,
DestroyMagickWand( wand );
#ifndef NO_SEMAPHORE
/* Get rid of the semaphore */
unlink( sem_file );
gcfree( sem_file );
#endif
gcfree( cache_path );
dprintf( "resize_photo: resized photo at %s (%p)\n", cache_file, cache_file );

View File

@ -6,6 +6,8 @@
#include <errno.h>
#include <dprintf.h>
#include <unistd.h>
/* Memory management -- helpers */
#ifdef MEMALLOC_TRACK
struct mem_chunk* gc_find_chunk( void* ptr ) {
@ -678,3 +680,19 @@ void sort_str_array( char** array, size_t length, int case_insensitive ) {
else
quicksort_main( (void**)array, 0, length-1, &void_strcmp );
}
void wait_load() {
#ifndef NO_MAX_LOAD
double avg;
if (getloadavg(&avg,1) < 0)
return;
while(avg >= MAX_CPU_LOAD) {
dprintf("Waiting for CPU load %f to drop below %f\n",
avg, MAX_CPU_LOAD);
sleep(1);
if (getloadavg(&avg,1) < 0)
return;
}
#endif
}