diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2010-01-28 23:22:42 +0100 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2010-01-28 23:22:42 +0100 |
commit | a1b9ea5d43a335beca7bfdd0f6f12a21f1c7087a (patch) | |
tree | 775947a141e6bedd763088955061dcd867626e28 | |
parent | c0e4cca24d58be685adf79c355dedca5d1885c78 (diff) |
Fixed mutex locks on several objects in process_file().
-rw-r--r-- | parsing.c | 28 |
1 files changed, 20 insertions, 8 deletions
@@ -16,10 +16,10 @@ #define LINE_BUFFER_SIZE 0x400 #define TIME_BUFFER_SIZE 0xf -static pthread_mutex_t user_mutex, word_mutex; +static pthread_mutex_t user_mutex, word_mutex, channel_mutex; static struct user_t *last_user = NULL; -static int in_monolog = 0, monolog_len = 0;; +static int in_monolog = 0, monolog_len = 0; static void process_file(FILE *f, struct channel_t *channel, struct regexset_t *rs) { char line[LINE_BUFFER_SIZE]; @@ -60,13 +60,19 @@ static void process_file(FILE *f, struct channel_t *channel, struct regexset_t * min = atoi(min_s); time_i = hour*4 + min / 15; - user->lines[time_i]++; - channel->hours[time_i]++; - /* Count words. */ wchar_t wtext[TEXT_BUFFER_SIZE]; mbstowcs(wtext, text, TEXT_BUFFER_SIZE); + + pthread_mutex_lock(&user_mutex); user->characters += wcslen(wtext); + user->lines[time_i]++; + pthread_mutex_unlock(&user_mutex); + + pthread_mutex_lock(&channel_mutex); + channel->hours[time_i]++; + pthread_mutex_unlock(&channel_mutex); + wchar_t word[TEXT_BUFFER_SIZE]; wchar_t *end = wcschr(wtext, '\0'); *word = '\0'; @@ -74,14 +80,16 @@ static void process_file(FILE *f, struct channel_t *channel, struct regexset_t * for(wchar_t *pos = wtext; pos < end; pos++) { if(iswblank(*pos)) { if(len) { + pthread_mutex_lock(&user_mutex); user->words++; + pthread_mutex_unlock(&user_mutex); word[len] = '\0'; char mbword[TEXT_BUFFER_SIZE]; wcstombs(mbword, word, TEXT_BUFFER_SIZE); pthread_mutex_lock(&word_mutex); struct word_t *word_s = word_get(mbword); - pthread_mutex_unlock(&word_mutex); word_s->count++; + pthread_mutex_unlock(&word_mutex); } len = 0; *word = '\0'; @@ -93,14 +101,16 @@ static void process_file(FILE *f, struct channel_t *channel, struct regexset_t * } } if(len) { + pthread_mutex_lock(&user_mutex); user->words++; + pthread_mutex_unlock(&user_mutex); word[len] = '\0'; char mbword[TEXT_BUFFER_SIZE]; wcstombs(mbword, word, TEXT_BUFFER_SIZE); pthread_mutex_lock(&word_mutex); struct word_t *word_s = word_get(mbword); - pthread_mutex_unlock(&word_mutex); word_s->count++; + pthread_mutex_unlock(&word_mutex); } continue; } @@ -123,9 +133,9 @@ static void process_file(FILE *f, struct channel_t *channel, struct regexset_t * pthread_mutex_lock(&user_mutex); struct user_t *user = user_get(nick), *victim_user = user_get(victim); - pthread_mutex_unlock(&user_mutex); user->kicks++; victim_user->kicked++; + pthread_mutex_unlock(&user_mutex); continue; } } @@ -145,6 +155,7 @@ static void *thread_func(void *arg) { void process(int thread_n) { pthread_mutex_init(&user_mutex, NULL); pthread_mutex_init(&word_mutex, NULL); + pthread_mutex_init(&channel_mutex, NULL); /* Parsing stuff goes here. */ for(int chan_i = 0; chan_i < channel_get_count(); chan_i++) { user_init(); @@ -188,4 +199,5 @@ void process(int thread_n) { } pthread_mutex_destroy(&user_mutex); pthread_mutex_destroy(&word_mutex); + pthread_mutex_destroy(&channel_mutex); } |