X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=412318b27eb656acabbb5c66faa352c8f56494c3;hp=103373493f8cdadc8a6c5a640041f7453ef1fc30;hb=7e37a7cf49df279b9ab467fa4f62dd376c791a26;hpb=0640d9e42143dedcfffbd496e34431083ba5c917 diff --git a/aft.c b/aft.c index 10337349..412318b2 100644 --- a/aft.c +++ b/aft.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2009 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -21,7 +21,6 @@ #include "afh.h" #include "afs.h" #include "net.h" -#include "vss.h" #include "fd.h" #include "ipc.h" #include "portable_io.h" @@ -435,12 +434,26 @@ static unsigned sizeof_chunk_table(struct afh_info *afhi) return 4 * (afhi->chunks_total + 1); } -static void save_chunk_table(struct afh_info *afhi, char *buf) +static uint32_t save_chunk_table(struct afh_info *afhi, char *buf) { int i; - - for (i = 0; i <= afhi->chunks_total; i++) - write_u32(buf + 4 * i, afhi->chunk_table[i]); + uint32_t max = 0, old = 0; + + for (i = 0; i <= afhi->chunks_total; i++) { + uint32_t val = afhi->chunk_table[i]; + write_u32(buf + 4 * i, val); + /* + * If the first chunk is the header, do not consider it for the + * calculation of the largest chunk size. + */ + if (i == 0 || (i == 1 && afhi->header_len > 0)) { + old = val; + continue; + } + max = PARA_MAX(max, val - old); + old = val; + } + return max; } static void load_chunk_table(struct afh_info *afhi, char *buf) @@ -641,10 +654,10 @@ static int save_afd(struct audio_file_data *afd) ret = shm_attach(shmid, ATTACH_RW, &shm_afd); if (ret < 0) goto err; - *(struct audio_file_data *)shm_afd = *afd; buf = shm_afd; buf += sizeof(*afd); - save_chunk_table(&afd->afhi, buf); + afd->max_chunk_size = save_chunk_table(&afd->afhi, buf); + *(struct audio_file_data *)shm_afd = *afd; shm_detach(shm_afd); return shmid; err: @@ -1082,6 +1095,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score, ret = get_audio_file_path_of_row(aft_row, &path); if (ret < 0) return ret; + PARA_NOTICE_LOG("%s\n", path); ret = get_afsi_object_of_row(aft_row, &afsi_obj); if (ret < 0) return ret; @@ -2458,6 +2472,18 @@ static void afs_stat_callback(int fd, const struct osl_object *query) pass_buffer_as_shm(buf, strlen(buf), &fd); } +/** + * Get the current afs status items from the afs process and send it using RC4. + * + * \param rc4c The rc4 context for data encryption. + * \param parser_friendly Whether parser-friendly output format should be used. + * + * As the contents of the afs status items change in time and the command + * handler only has a COW version created at fork time, it can not send + * up-to-date afs status items directly. Therefore the usual callback mechanism + * is used to pass the status items from the afs process to the command handler + * via a shared memory area and a pipe. + */ int send_afs_status(struct rc4_context *rc4c, int parser_friendly) { struct osl_object query = {.data = &parser_friendly,