From: Andre Noll Date: Mon, 10 Oct 2011 20:01:22 +0000 (+0200) Subject: Merge branch 't/uptime_cleanup' X-Git-Tag: v0.4.9~20 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=c5670af5c1f784fe6c3d46d0281f2ba7c47af75e;hp=5b1a844f375cc5e0303d9118ae0fc4a311c616d3 Merge branch 't/uptime_cleanup' --- diff --git a/NEWS b/NEWS index 50f9b699..6db72253 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,14 @@ 0.4.9 (to be announced) "hybrid causality" ------------------------------------------ + - Fix for an endless loop in the mp3 decoder for certain + (corrupt) mp3 files. + - autogen.sh now detects a distcc setup and adjusts the + parameter for the -j option of make accordingly. + - Shared memory areas are no longer restricted to 64K. We now + detect the maximal size of a shared memory area at runtime. + - cleanup of the internal uptime API. + -------------------------------------- 0.4.8 (2011-08-19) "nested assignment" -------------------------------------- diff --git a/afs.c b/afs.c index 755537da..955b8f20 100644 --- a/afs.c +++ b/afs.c @@ -537,7 +537,7 @@ static int activate_mood_or_playlist(char *arg, int *num_admissible) static void com_select_callback(int fd, const struct osl_object *query) { struct para_buffer pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm }; diff --git a/aft.c b/aft.c index f4080233..e91d734f 100644 --- a/aft.c +++ b/aft.c @@ -1037,7 +1037,7 @@ static int make_status_items(struct audio_file_data *afd, .flags = LS_FLAG_FULL_PATH | LS_FLAG_ADMISSIBLE_ONLY, .mode = LS_MODE_VERBOSE, }; - struct para_buffer pb = {.max_size = SHMMAX - 1}; + struct para_buffer pb = {.max_size = shm_get_shmmax() - 1}; time_t current_time; int ret; @@ -1048,7 +1048,7 @@ static int make_status_items(struct audio_file_data *afd, free(status_items); status_items = pb.buf; memset(&pb, 0, sizeof(pb)); - pb.max_size = SHMMAX - 1; + pb.max_size = shm_get_shmmax() - 1; pb.flags = PBF_SIZE_PREFIX; ret = print_list_item(&d, &opts, &pb, current_time); if (ret < 0) { @@ -1343,7 +1343,7 @@ static void com_ls_callback(int fd, const struct osl_object *query) { struct ls_options *opts = query->data; char *p, *pattern_start = (char *)query->data + sizeof(*opts); - struct para_buffer b = {.max_size = SHMMAX, + struct para_buffer b = {.max_size = shm_get_shmmax(), .flags = (opts->mode == LS_MODE_PARSER)? PBF_SIZE_PREFIX : 0, .max_size_handler = pass_buffer_as_shm, .private_data = &fd}; int i = 0, ret; @@ -1665,7 +1665,7 @@ static void com_add_callback(int fd, const struct osl_object *query) char afsi_buf[AFSI_SIZE]; uint32_t flags = read_u32(buf + CAB_FLAGS_OFFSET); struct afs_info default_afsi = {.last_played = 0}; - struct para_buffer msg = {.max_size = SHMMAX, + struct para_buffer msg = {.max_size = shm_get_shmmax(), .max_size_handler = pass_buffer_as_shm, .private_data = &fd}; uint16_t afhi_offset, chunks_offset; @@ -2080,7 +2080,7 @@ static void com_touch_callback(int fd, const struct osl_object *query) { struct touch_action_data tad = {.cto = query->data, .pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm } @@ -2226,7 +2226,7 @@ static void com_rm_callback(int fd, const struct osl_object *query) { struct com_rm_action_data crd = {.flags = *(uint32_t *)query->data, .pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm } @@ -2371,7 +2371,7 @@ static void com_cpsi_callback(int fd, const struct osl_object *query) struct cpsi_action_data cad = { .flags = *(unsigned *)query->data, .pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm } @@ -2543,7 +2543,7 @@ static int check_audio_file(struct osl_row *row, void *data) void aft_check_callback(int fd, __a_unused const struct osl_object *query) { struct para_buffer pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm }; diff --git a/attribute.c b/attribute.c index 42fa421c..f36f4e7d 100644 --- a/attribute.c +++ b/attribute.c @@ -149,7 +149,7 @@ static void com_lsatt_callback(int fd, const struct osl_object *query) struct lsatt_action_data laad = { .flags = *(unsigned *) query->data, .pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm } @@ -295,7 +295,7 @@ static void com_addatt_callback(int fd, const struct osl_object *query) char *p; int ret = 1, ret2 = 0; struct para_buffer pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm }; @@ -378,7 +378,7 @@ static void com_mvatt_callback(int fd, const struct osl_object *query) struct osl_object obj = {.data = old, .size = size}; struct osl_row *row; struct para_buffer pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm }; @@ -448,7 +448,7 @@ static void com_rmatt_callback(int fd, const struct osl_object *query) struct remove_attribute_action_data raad = { .num_removed = 0, .pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm } diff --git a/autogen.sh b/autogen.sh index e5000a6f..ea38dbf7 100755 --- a/autogen.sh +++ b/autogen.sh @@ -5,6 +5,11 @@ if [ -z "$n" ]; then n=$(grep ^processor /proc/cpuinfo 2>/dev/null | wc -l) [ $n -eq 0 ] && n=1 fi +# If we are compiling with distcc, try to guess a reasonable number +# based on (a) the number of cores on this machine and (b) the number +# of words in the DISTCC_HOSTS variable. +d="$(echo $DISTCC_HOSTS | wc -w)" +n=$(($n + 2 * $n * $d)) echo preparing, parallel=$n... if test -f Makefile; then make maintainer-clean > /dev/null 2>&1 diff --git a/blob.c b/blob.c index 25aa2a6d..707c6c62 100644 --- a/blob.c +++ b/blob.c @@ -80,12 +80,13 @@ static struct osl_column_description blob_cols[] = { DEFINE_BLOB_TABLE_DESC(table_name); \ DEFINE_BLOB_TABLE_PTR(table_name); -/** \cond doxygen isn't smart enough to recognize these */ +/* doxygen isn't smart enough to recognize these */ +/** \cond blob_table */ INIT_BLOB_TABLE(lyrics); INIT_BLOB_TABLE(images); INIT_BLOB_TABLE(moods); INIT_BLOB_TABLE(playlists); -/** \endcond */ +/** \endcond blob_table */ /** Flags that may be passed to the \p ls functions of each blob type. */ enum blob_ls_flags { @@ -130,7 +131,7 @@ static void com_lsblob_callback(struct osl_table *table, struct lsblob_action_data lbad = { .flags = *(uint32_t *)query->data, .pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm } @@ -261,7 +262,7 @@ static void com_rmblob_callback(struct osl_table *table, int fd, struct rmblob_data rmbd = { .num_removed = 0, .pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm } @@ -662,9 +663,10 @@ static int blob_open(struct osl_table **table, DEFINE_GET_DEF_BY_NAME(table_name, cmd_prefix); \ DEFINE_GET_NAME_AND_DEF_BY_ROW(table_name, cmd_prefix); \ -/** \cond doxygen isn't smart enough to recognize these */ +/* doxygen isn't smart enough to recognize these */ +/** \cond blob_function */ DEFINE_BLOB_FUNCTIONS(lyrics, lyr); DEFINE_BLOB_FUNCTIONS(images, img); DEFINE_BLOB_FUNCTIONS(moods, mood); DEFINE_BLOB_FUNCTIONS(playlists, pl); -/** \endcond */ +/** \endcond blob_function */ diff --git a/crypt.c b/crypt.c index 5b7029d3..7b7c16d3 100644 --- a/crypt.c +++ b/crypt.c @@ -306,7 +306,7 @@ int sc_send_bin_buffer(struct stream_cipher_context *scc, char *buf, int sc_recv_bin_buffer(struct stream_cipher_context *scc, char *buf, size_t size) { - unsigned char *tmp = para_malloc(size); + unsigned char *tmp = para_malloc(ROUND_UP(size, RC4_ALIGN)); ssize_t ret = recv(scc->fd, tmp, size, 0); if (ret > 0) diff --git a/crypt.h b/crypt.h index 4696ee4a..833bbf1b 100644 --- a/crypt.h +++ b/crypt.h @@ -7,13 +7,14 @@ /** \file crypt.h Public crypto interface. */ -/** \cond used to distinguish between loading of private/public key */ +/* These are used to distinguish between loading of private/public key. */ + +/** The key to load is a public key. */ #define LOAD_PUBLIC_KEY 0 +/** The key to load is a private key. */ #define LOAD_PRIVATE_KEY 1 +/** The size of the challenge sent to the client. */ #define CHALLENGE_SIZE 64 -/** \endcond **/ - -/* asymetric (public key) crypto */ /** Opaque structure for public and private keys. */ struct asymmetric_key; diff --git a/error.h b/error.h index 306546d6..65494131 100644 --- a/error.h +++ b/error.h @@ -6,7 +6,7 @@ /** \file error.h List of error messages for all subsystems. */ -/** \cond */ +/** \cond errors */ /* List of all subsystems that use paraslash's error facility. */ DEFINE_ERRLIST_OBJECT_ENUM; @@ -455,7 +455,7 @@ extern const char **para_errlist[]; PARA_ERROR(QUEUE, "packet queue overrun"), \ -/** \endcond */ +/** \endcond errors */ /** * The subsystem shift. diff --git a/ggo/afh.m4 b/ggo/afh.m4 index 80df8948..ba7d7901 100644 --- a/ggo/afh.m4 +++ b/ggo/afh.m4 @@ -16,7 +16,7 @@ files. It can be used to an audio file. - write selected parts of the given audio files 'just in time' - to sdout. This may be useful for third-party software that + to stdout. This may be useful for third-party software that is capable of reading from stdin. " @@ -117,7 +117,7 @@ dependon="stream" details=" Write the specified chunks of data 'just in time', i.e. the write of each chunk is delayed until the time it is needed - by the decoder/player in order to guarantee an uninterupted + by the decoder/player in order to guarantee an uninterrupted audio stream. " diff --git a/ipc.c b/ipc.c index c1069ad9..674d1cb0 100644 --- a/ipc.c +++ b/ipc.c @@ -9,6 +9,10 @@ #include "para.h" #include "error.h" #include "ipc.h" +#include +#include +#include + #include #include #include @@ -171,3 +175,45 @@ int shm_detach(void *addr) int ret = shmdt(addr); return ret < 0? -ERRNO_TO_PARA_ERROR(errno) : 1; } + +# if defined __FreeBSD__ || defined __NetBSD__ +# define SYSCTL_SHMMAX_VARIABLE "kern.ipc.shmmax" +# elif defined __APPLE__ +# define SYSCTL_SHMMAX_VARIABLE "kern.sysv.shmmax" +# else +# undef SYSCTL_SHMMAX_VARIABLE +# endif + +size_t shm_get_shmmax(void) +{ + static size_t shmmax; + + if (shmmax > 0) /* only dance once */ + return shmmax; +#ifdef __linux__ /* get it from proc fs */ + { + int fd = open("/proc/sys/kernel/shmmax", O_RDONLY); + if (fd >= 0) { + char buf[100] = ""; + int ret = read(fd, buf, sizeof(buf) - 1); + if (ret > 0) { + buf[ret] = '\0'; + shmmax = strtoul(buf, NULL, 10); + } + } + } +#elif defined SYSCTL_SHMMAX_VARIABLE + { + size_t len = sizeof(shmmax); + sysctlbyname(SYSCTL_SHMMAX_VARIABLE, &shmmax, &len, NULL, 0); + } +#elif defined SHMMAX + shmmax = SHMMAX; +#endif + if (shmmax == 0) { + PARA_WARNING_LOG("unable to determine shmmax\n"); + shmmax = 65535; /* last ressort */ + } + PARA_INFO_LOG("shmmax: %zu\n", shmmax); + return shmmax; +} diff --git a/ipc.h b/ipc.h index 71e09ec1..c8d31c0c 100644 --- a/ipc.h +++ b/ipc.h @@ -11,7 +11,4 @@ int shm_new(size_t size); int shm_attach(int id, enum shm_attach_mode mode, void **result); int shm_detach(void *addr); int shm_destroy(int id); - -#ifndef SHMMAX -#define SHMMAX 65535 -#endif +size_t shm_get_shmmax(void); diff --git a/mood.c b/mood.c index 93461ee8..d9ae48bf 100644 --- a/mood.c +++ b/mood.c @@ -422,7 +422,7 @@ out: void mood_check_callback(int fd, __a_unused const struct osl_object *query) { struct para_buffer pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm }; diff --git a/mp3_afh.c b/mp3_afh.c index b0d44ec9..d72d85e7 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -23,8 +23,6 @@ #include "afh.h" #include "string.h" -/** \cond some defines and structs which are only used in this file */ - /* * MIN_CONSEC_GOOD_FRAMES defines how many consecutive valid MP3 frames we need * to see before we decide we are looking at a real MP3 file @@ -47,7 +45,6 @@ struct mp3header { unsigned int emphasis; }; -/** \endcond */ static const int frequencies[3][4] = { {22050,24000,16000,50000}, /* MPEG 2.0 */ {44100,48000,32000,50000}, /* MPEG 1.0 */ diff --git a/para.h b/para.h index 5dc39124..bc6aa929 100644 --- a/para.h +++ b/para.h @@ -229,12 +229,12 @@ _static_inline_ long int para_random(unsigned max) SAMPLE_FORMAT(SF_U16_LE, "16 bit unsigned, little endian"), \ SAMPLE_FORMAT(SF_U16_BE, "16 bit unsigned, big endian"), \ -/** \cond */ +/** \cond sample_format */ #define SAMPLE_FORMAT(a, b) a enum sample_format {SAMPLE_FORMATS}; #undef SAMPLE_FORMAT #define SAMPLE_FORMAT(a, b) b -/** \endcond */ +/** \endcond sample_format */ /** Debug loglevel, gets really noisy. */ #define LL_DEBUG 0 @@ -256,7 +256,7 @@ enum sample_format {SAMPLE_FORMATS}; /** Log messages with lower priority than that will not be compiled in. */ #define COMPILE_TIME_LOGLEVEL 0 -/** \cond */ +/** \cond log */ #if LL_DEBUG >= COMPILE_TIME_LOGLEVEL #define PARA_DEBUG_LOG(f,...) para_log(LL_DEBUG, "%s: " f, __FUNCTION__, ## __VA_ARGS__) #else @@ -298,4 +298,4 @@ enum sample_format {SAMPLE_FORMATS}; #else #define PARA_EMERG_LOG(...) #endif -/** \endcond */ +/** \endcond log */ diff --git a/playlist.c b/playlist.c index 2d2f23b4..806e49d5 100644 --- a/playlist.c +++ b/playlist.c @@ -131,7 +131,7 @@ static int check_playlist(struct osl_row *row, void *data) void playlist_check_callback(int fd, __a_unused const struct osl_object *query) { struct para_buffer pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm }; diff --git a/recv.h b/recv.h index ee8138f9..7555dfb4 100644 --- a/recv.h +++ b/recv.h @@ -121,7 +121,7 @@ void *check_receiver_arg(char *ra, int *receiver_num); void print_receiver_helps(int detailed); int generic_recv_pre_select(struct sched *s, struct task *t); -/** \cond */ +/** \cond receiver */ extern void http_recv_init(struct receiver *r); #define HTTP_RECEIVER {.name = "http", .init = http_recv_init}, extern void dccp_recv_init(struct receiver *r); @@ -130,5 +130,5 @@ extern void udp_recv_init(struct receiver *r); #define UDP_RECEIVER {.name = "udp", .init = udp_recv_init}, extern struct receiver receivers[]; -/** \endcond */ +/** \endcond receiver */ diff --git a/recv_common.c b/recv_common.c index f38184b4..53a105df 100644 --- a/recv_common.c +++ b/recv_common.c @@ -133,7 +133,8 @@ void print_receiver_helps(int detailed) * tree node indicates an error/eof condition. No file descriptors are added to * the fd sets of \a s. * - * \return Standard. + * \return The status of the btr node of the receiver node, i.e. the return + * value of the underlying call to \ref btr_node_status(). */ int generic_recv_pre_select(struct sched *s, struct task *t) { diff --git a/string.c b/string.c index 0a32c0f4..cefb45d6 100644 --- a/string.c +++ b/string.c @@ -521,14 +521,15 @@ __printf_2_3 int para_printf(struct para_buffer *b, const char *fmt, ...) } } -/** \cond LLONG_MAX and LLONG_MIN might not be defined. */ +/** \cond llong_minmax */ +/* LLONG_MAX and LLONG_MIN might not be defined. */ #ifndef LLONG_MAX #define LLONG_MAX 9223372036854775807LL #endif #ifndef LLONG_MIN #define LLONG_MIN (-LLONG_MAX - 1LL) #endif -/** \endcond */ +/** \endcond llong_minmax */ /** * Convert a string to a 64-bit signed integer value. diff --git a/time.c b/time.c index 3ec2a2d4..d7d803d9 100644 --- a/time.c +++ b/time.c @@ -82,7 +82,7 @@ int tv_diff(const struct timeval *b, const struct timeval *a, struct timeval *di * * \param a First addend. * \param b Second addend. - * \param sum Contains the sum \a + \a b on return. + * \param sum Contains the sum \a a + \a b on return. */ void tv_add(const struct timeval *a, const struct timeval *b, struct timeval *sum) @@ -180,7 +180,7 @@ int tv_convex_combination(const long a, const struct timeval *tv1, * \param stream_start When the first chunk was sent. * \param result The time when to send chunk number \a chunk_num. * - * This function computes stream_start + chunk_num * chunk_time. + * This function computes \a stream_start + \a chunk_num * \a chunk_time. */ void compute_chunk_time(long unsigned chunk_num, struct timeval *chunk_tv, struct timeval *stream_start,