Seems finished
This commit is contained in:
Binary file not shown.
@@ -1,41 +1,27 @@
|
||||
# ninja log v6
|
||||
32 69 1738110893905418822 distributor 94c57781821b8eee
|
||||
0 30 1738105442283119334 CMakeFiles/distributor.dir/zmq_worker.c.o d5e5fcc0aafed156
|
||||
0 30 1738176530746206084 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
0 25 1738174736280547271 CMakeFiles/distributor.dir/key_value_pair.c.o 3e4f10264f7b6f9
|
||||
31 66 1738176530777205855 worker 8cb044e4b1d208e8
|
||||
0 25 1738175279560635771 CMakeFiles/worker.dir/key_value_pair.c.o c815e7263f0d0a22
|
||||
0 36 1738176456536753826 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
0 24 1738158788025158273 build.ninja e4e5b46deb631549
|
||||
1 32 1738110893874419033 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
0 22 1738109440578901248 CMakeFiles/worker.dir/key_value_pair.c.o c815e7263f0d0a22
|
||||
32 69 1738110729233524838 worker 8cb044e4b1d208e8
|
||||
0 22 1738109438872913564 CMakeFiles/distributor.dir/key_value_pair.c.o 3e4f10264f7b6f9
|
||||
0 32 1738110729201525050 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
0 47 1738159115534281752 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
47 88 1738159115581282030 worker 8cb044e4b1d208e8
|
||||
0 31 1738160036073886257 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
31 69 1738160036104886135 worker 8cb044e4b1d208e8
|
||||
0 33 1738160039499872677 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
33 74 1738160039532872546 distributor 94c57781821b8eee
|
||||
0 36 1738160280110822932 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
36 72 1738160280146822763 worker 8cb044e4b1d208e8
|
||||
1 32 1738160366603408106 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
32 67 1738160366634407955 worker 8cb044e4b1d208e8
|
||||
1 36 1738160545081507330 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
36 78 1738160545116507148 worker 8cb044e4b1d208e8
|
||||
1 30 1738161121542863524 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
30 69 1738161121571863155 distributor 94c57781821b8eee
|
||||
0 29 1738161228788554820 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
29 65 1738161228817554481 distributor 94c57781821b8eee
|
||||
0 29 1738161354145148561 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
29 65 1738161354174148249 distributor 94c57781821b8eee
|
||||
0 31 1738161531871329808 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
31 69 1738161531902329505 worker 8cb044e4b1d208e8
|
||||
0 33 1738161877544183345 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
33 70 1738161877577183062 worker 8cb044e4b1d208e8
|
||||
0 30 1738162098218341663 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
30 66 1738162098248341418 distributor 94c57781821b8eee
|
||||
1 30 1738162114935205702 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
30 65 1738162114964205467 distributor 94c57781821b8eee
|
||||
0 29 1738162161079832549 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
29 67 1738162161108832315 distributor 94c57781821b8eee
|
||||
1 33 1738162779063038217 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
33 72 1738162779095037975 distributor 94c57781821b8eee
|
||||
0 30 1738162800215878405 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
30 69 1738162800245878178 distributor 94c57781821b8eee
|
||||
0 30 1738105442283119334 CMakeFiles/distributor.dir/zmq_worker.c.o d5e5fcc0aafed156
|
||||
36 71 1738176456572753560 distributor 94c57781821b8eee
|
||||
1 35 1738176906572438705 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
35 71 1738176906606438454 distributor 94c57781821b8eee
|
||||
0 35 1738177322476383763 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
35 72 1738177322511383506 distributor 94c57781821b8eee
|
||||
0 35 1738177499044986064 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
35 73 1738177499079985789 worker 8cb044e4b1d208e8
|
||||
0 35 1738177504174945811 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
35 70 1738177504209945536 distributor 94c57781821b8eee
|
||||
0 27 1738178070086597299 CMakeFiles/worker.dir/key_value_pair.c.o c815e7263f0d0a22
|
||||
0 30 1738178077557540733 CMakeFiles/worker.dir/zmq_worker.c.o 8c7caa5d8888f06b
|
||||
30 66 1738178077587540506 worker 8cb044e4b1d208e8
|
||||
0 28 1738178081021514508 CMakeFiles/distributor.dir/key_value_pair.c.o 3e4f10264f7b6f9
|
||||
0 37 1738178081021514508 CMakeFiles/distributor.dir/zmq_distributor.c.o 8386b22addd5fe65
|
||||
37 75 1738178081058514228 distributor 94c57781821b8eee
|
||||
0 25 1738178204604580869 CMakeFiles/distributor.dir/key_value_pair.c.o 3e4f10264f7b6f9
|
||||
25 61 1738178204629580680 distributor 94c57781821b8eee
|
||||
0 25 1738178206986562907 CMakeFiles/worker.dir/key_value_pair.c.o c815e7263f0d0a22
|
||||
25 63 1738178207011562718 worker 8cb044e4b1d208e8
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,3 @@
|
||||
Start testing: Jan 29 16:00 CET
|
||||
Start testing: Jan 29 20:17 CET
|
||||
----------------------------------------------------------
|
||||
End testing: Jan 29 16:00 CET
|
||||
End testing: Jan 29 20:17 CET
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
Hallo Welt, ich bin die Beatrice
|
||||
und hier habe ich eine tolle Besipieldatei.
|
||||
Diese ist für meine noch tollerer Hausaufgabe im Modul Rechnernetze und verteilte Systeme!
|
||||
Diese ist fuer meine noch tollerer Hausaufgabe im Modul Rechnernetze und verteilte Systeme!
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,7 +1,6 @@
|
||||
#include "key_value_pair.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -17,6 +16,38 @@ char *key_value_pair_to_string(key_value_pair *kv)
|
||||
return str;
|
||||
}
|
||||
|
||||
char *key_value_pair_list_to_string(key_value_pair **head){
|
||||
key_value_pair *kvp_it = *head;
|
||||
|
||||
char *ret = NULL;
|
||||
|
||||
while(kvp_it != NULL){
|
||||
char *kvp2str = kvp_it->toString(kvp_it);
|
||||
if(kvp2str == NULL){
|
||||
kvp_it = kvp_it->next;
|
||||
continue;
|
||||
}
|
||||
if(!ret){
|
||||
ret = strdup(kvp2str);
|
||||
kvp_it = kvp_it->next;
|
||||
}
|
||||
else{
|
||||
char *tmp = realloc(ret, strlen(ret) + strlen(kvp2str) + 1);
|
||||
if(!tmp){
|
||||
free(ret);
|
||||
perror("Failed to reallocate memory for ret");
|
||||
free(kvp2str);
|
||||
return NULL;
|
||||
}
|
||||
ret = tmp;
|
||||
strcat(ret, kvp2str);
|
||||
free(kvp2str);
|
||||
kvp_it = kvp_it->next;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// initializes a new instance of key_value_pair with given values on given pointer
|
||||
key_value_pair *init_key_value_pair(const char *key, const char *value)
|
||||
{
|
||||
@@ -133,19 +164,25 @@ void remove_key_value_pair(key_value_pair *kv, key_value_pair **head, key_value_
|
||||
}
|
||||
}
|
||||
|
||||
void extract_key_value_pairs(char *red_str, key_value_pair **head, key_value_pair **tail){
|
||||
void extract_key_value_pairs(char *red_str, key_value_pair **head, key_value_pair **tail, bool doReduce){
|
||||
char *it = red_str;
|
||||
bool reading_value = false;
|
||||
char *word_start = it;
|
||||
size_t word_length = 0;
|
||||
size_t value_length = 0;
|
||||
|
||||
while(*it){
|
||||
if(isalpha(*it) && reading_value){
|
||||
while(true){
|
||||
if(!*it || (isalpha(*it) && reading_value)){
|
||||
char key[word_length + 1];
|
||||
strncpy(key, word_start, word_length);
|
||||
key[word_length] = '\0';
|
||||
char value[16];
|
||||
if(doReduce)
|
||||
snprintf(value, 16, "%d", (int)value_length);
|
||||
else{
|
||||
strncpy(value, word_start + word_length, value_length);
|
||||
value[value_length] = '\0';
|
||||
}
|
||||
|
||||
key_value_pair *kv = init_key_value_pair(key, value);
|
||||
add_key_value_pair(kv, head, tail);
|
||||
@@ -155,6 +192,8 @@ void extract_key_value_pairs(char *red_str, key_value_pair **head, key_value_pai
|
||||
value_length = 0;
|
||||
word_start = it;
|
||||
reading_value = false;
|
||||
|
||||
if(!*it) break;
|
||||
continue;
|
||||
}
|
||||
if(isalpha(*it)){
|
||||
@@ -163,7 +202,7 @@ void extract_key_value_pairs(char *red_str, key_value_pair **head, key_value_pai
|
||||
}
|
||||
else{
|
||||
reading_value = true; // reassigning true is faster than if checks every iteration
|
||||
word_length++;
|
||||
value_length++;
|
||||
it++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef KEY_VALUE_PAIR_H
|
||||
#define KEY_VALUE_PAIR_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
// Structures
|
||||
@@ -12,6 +13,9 @@ typedef struct key_value_pair{
|
||||
} key_value_pair;
|
||||
|
||||
// Functions
|
||||
|
||||
char *key_value_pair_list_to_string(key_value_pair **head);
|
||||
|
||||
key_value_pair *init_key_value_pair(const char *key, const char *value);
|
||||
void free_key_value_pair(key_value_pair **kv);
|
||||
void free_key_value_pairs(key_value_pair **head, key_value_pair **tail);
|
||||
@@ -19,6 +23,6 @@ void free_key_value_pairs(key_value_pair **head, key_value_pair **tail);
|
||||
int add_key_value_pair(key_value_pair *kv, key_value_pair **head, key_value_pair **tail);
|
||||
void remove_key_value_pair(key_value_pair *kv, key_value_pair **head, key_value_pair **tail);
|
||||
|
||||
void extract_key_value_pairs(char *red_str, key_value_pair **head, key_value_pair **tail);
|
||||
void extract_key_value_pairs(char *red_str, key_value_pair **head, key_value_pair **tail, bool doReduce);
|
||||
|
||||
#endif //KEY_VALUE_PAIR_H
|
||||
|
||||
+90
-27
@@ -2,7 +2,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <regex.h>
|
||||
#include <zmq.h>
|
||||
@@ -44,7 +43,7 @@ char *get_file_content(FILE *fp)
|
||||
|
||||
if (delimiter_pos < 0)
|
||||
{
|
||||
printf("No delimiting character was found -> taking whole buffer");
|
||||
fprintf(stderr, "No delimiting character was found -> taking whole buffer");
|
||||
delimiter_pos = (int)bytes_read;
|
||||
}
|
||||
|
||||
@@ -88,7 +87,7 @@ void *receiverFunc(void *args)
|
||||
zmq_ctx_destroy(context);
|
||||
return NULL;
|
||||
}
|
||||
printf("[THREAD] Connected to worker: %s\n", addr);
|
||||
fprintf(stderr, "[THREAD] Connected to worker: %s\n", addr);
|
||||
|
||||
size_t len = strlen(params->data) + 4;
|
||||
char *request = (char*)malloc(sizeof(char) * len);
|
||||
@@ -117,7 +116,7 @@ void *receiverFunc(void *args)
|
||||
zmq_ctx_destroy(context);
|
||||
return NULL;
|
||||
}
|
||||
printf("[THREAD] Send request: %s\n", request);
|
||||
fprintf(stderr, "[THREAD] Send request: %s\n", request);
|
||||
if(zmq_send(requester, request, strlen(request), 0) == -1){
|
||||
perror("[THREAD] Failed to send request");
|
||||
free(params);
|
||||
@@ -129,7 +128,7 @@ void *receiverFunc(void *args)
|
||||
|
||||
free(request);
|
||||
|
||||
printf("[THREAD]: Waiting for response\n");
|
||||
fprintf(stderr, "[THREAD]: Waiting for response\n");
|
||||
char reply[MESSAGE_LENGTH];
|
||||
int bytes_recv = zmq_recv(requester, reply, MESSAGE_LENGTH - 1, 0);
|
||||
if (bytes_recv == -1){
|
||||
@@ -143,6 +142,7 @@ void *receiverFunc(void *args)
|
||||
reply[bytes_recv] = '\0';
|
||||
|
||||
if(strcmp(reply, "rip") == 0){
|
||||
perror("[THREAD] Got rip -> shutting down");
|
||||
free(params);
|
||||
zmq_close(requester);
|
||||
zmq_ctx_destroy(context);
|
||||
@@ -153,7 +153,7 @@ void *receiverFunc(void *args)
|
||||
|
||||
len = strlen(reply);
|
||||
if(!words_list){
|
||||
words_list = (char*)malloc(len + 1);
|
||||
words_list = strdup(reply);
|
||||
if(!words_list){
|
||||
perror("[THREAD] Failed to allocate memory for words_list");
|
||||
free(params);
|
||||
@@ -177,8 +177,6 @@ void *receiverFunc(void *args)
|
||||
words_list = tmp;
|
||||
}
|
||||
|
||||
strcat(words_list, reply);
|
||||
|
||||
free(params);
|
||||
|
||||
pthread_mutex_unlock(&words_mutex);
|
||||
@@ -189,7 +187,7 @@ void *receiverFunc(void *args)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *map(size_t worker_count, char **worker_ports, char *filename){
|
||||
void map(size_t worker_count, char **worker_ports, char *filename){
|
||||
FILE *fp = fopen(filename, "r");
|
||||
char *file_content_chunks;
|
||||
int worker_index = 0;
|
||||
@@ -235,7 +233,6 @@ char *map(size_t worker_count, char **worker_ports, char *filename){
|
||||
}
|
||||
|
||||
free(threads);
|
||||
return words_list;
|
||||
}
|
||||
|
||||
char *extract_reduce_string(const char * toExtract){
|
||||
@@ -256,7 +253,7 @@ char *extract_reduce_string(const char * toExtract){
|
||||
return extracted;
|
||||
}
|
||||
|
||||
char *reduce(char *toReduce, size_t worker_count, char **worker_ports){
|
||||
void reduce(char *toReduce, size_t worker_count, char **worker_ports){
|
||||
pthread_t *threads = malloc(sizeof(pthread_t) * worker_count);
|
||||
if(!threads){
|
||||
perror("[MAIN- reduce] Failed to allocate memory for threads");
|
||||
@@ -264,16 +261,10 @@ char *reduce(char *toReduce, size_t worker_count, char **worker_ports){
|
||||
exit(1);
|
||||
}
|
||||
|
||||
key_value_pair *head, *tail;
|
||||
|
||||
extract_key_value_pairs(toReduce, &head, &tail);
|
||||
|
||||
size_t thread_count = 0;
|
||||
key_value_pair *kv_it = head;
|
||||
|
||||
char *extraction_ptr = toReduce;
|
||||
|
||||
for(int i = 0; kv_it && i < worker_count; i++){
|
||||
for(int i = 0; i < worker_count; i++){
|
||||
THREAD_ARGS *args = (THREAD_ARGS*)malloc(sizeof(THREAD_ARGS));
|
||||
if(!args){
|
||||
perror("[MAIN - reduce] Failed to allocate memory for args");
|
||||
@@ -291,7 +282,7 @@ char *reduce(char *toReduce, size_t worker_count, char **worker_ports){
|
||||
continue;
|
||||
}
|
||||
|
||||
extraction_ptr = toReduce + strlen(args->data) + 1;
|
||||
extraction_ptr = toReduce + strlen(args->data);
|
||||
|
||||
if(pthread_create(&threads[thread_count], NULL, receiverFunc, (void*)args) != 0){
|
||||
perror("[MAIN - reduce] Failed to create thread");
|
||||
@@ -299,7 +290,6 @@ char *reduce(char *toReduce, size_t worker_count, char **worker_ports){
|
||||
free(args);
|
||||
continue;
|
||||
}
|
||||
kv_it = kv_it->next;
|
||||
thread_count++;
|
||||
}
|
||||
|
||||
@@ -309,7 +299,65 @@ char *reduce(char *toReduce, size_t worker_count, char **worker_ports){
|
||||
}
|
||||
|
||||
free(threads);
|
||||
return words_list;
|
||||
}
|
||||
|
||||
void rip(size_t worker_count, char **worker_ports){
|
||||
pthread_t *threads = malloc(sizeof(pthread_t) * worker_count);
|
||||
if(!threads){
|
||||
perror("[MAIN- reduce] Failed to allocate memory for threads");
|
||||
pthread_mutex_destroy(&words_mutex);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
size_t thread_count = 0;
|
||||
|
||||
for(int i = 0; i < worker_count; i++){
|
||||
THREAD_ARGS *args = (THREAD_ARGS*)malloc(sizeof(THREAD_ARGS));
|
||||
if(!args){
|
||||
perror("[MAIN - rip] Failed to allocate memory for args");
|
||||
free(threads);
|
||||
pthread_mutex_destroy(&words_mutex);
|
||||
exit(1);
|
||||
}
|
||||
args->port = atol(worker_ports[i]);
|
||||
args->data = strdup("rip");
|
||||
args->type = RIP;
|
||||
|
||||
if (!args->data) {
|
||||
fprintf(stderr, "[MAIN - reduce] Warning: extract_reduce_string() returned NULL\n");
|
||||
free(args->data);
|
||||
free(args);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(pthread_create(&threads[thread_count], NULL, receiverFunc, (void*)args) != 0){
|
||||
perror("[MAIN - reduce] Failed to create thread");
|
||||
free(args);
|
||||
continue;
|
||||
}
|
||||
thread_count++;
|
||||
}
|
||||
|
||||
// wait for workers to finish
|
||||
for(int i = 0; i < thread_count; i++){
|
||||
pthread_join(threads[i], NULL);
|
||||
}
|
||||
|
||||
free(threads);
|
||||
}
|
||||
|
||||
void print_words_list(char *list){
|
||||
key_value_pair *kv, *head = NULL, *tail = NULL;
|
||||
extract_key_value_pairs(list, &head, &tail, false);
|
||||
kv = head;
|
||||
|
||||
printf("word,frequency\n");
|
||||
while(kv){
|
||||
printf("%s,%s\n", kv->key, kv->value);
|
||||
kv = kv->next;
|
||||
}
|
||||
|
||||
free_key_value_pairs(&head, &tail);
|
||||
}
|
||||
|
||||
int main(const int argc, char **argv) {
|
||||
@@ -321,15 +369,30 @@ int main(const int argc, char **argv) {
|
||||
pthread_mutex_init(&words_mutex, NULL);
|
||||
|
||||
// MAP
|
||||
char *word_list_mapped = map(argc - 2, argv + 2, argv[1]);
|
||||
printf("MAP:\n%s\n", word_list_mapped);
|
||||
map(argc - 2, argv + 2, argv[1]);
|
||||
fprintf(stderr, "MAP:\n%s\n", words_list);
|
||||
|
||||
// TODO: REDUCE
|
||||
char *word_list_reduced = reduce(word_list_mapped, argc - 2, argv + 2);
|
||||
char *word_list_mapped = strdup(words_list);
|
||||
free(words_list);
|
||||
words_list = NULL;
|
||||
|
||||
// REDUCE
|
||||
reduce(word_list_mapped, argc - 2, argv + 2);
|
||||
free(word_list_mapped);
|
||||
printf("REDUCE:\n%s\n", word_list_reduced);
|
||||
|
||||
// TODO: RIP
|
||||
char *word_list_reduced = strdup(words_list);
|
||||
free(words_list);
|
||||
words_list = NULL;
|
||||
|
||||
fprintf(stderr, "REDUCE:\n%s\n", word_list_reduced);
|
||||
|
||||
// RIP
|
||||
rip(argc - 2, argv + 2);
|
||||
|
||||
// print words_list
|
||||
print_words_list(word_list_reduced);
|
||||
free(word_list_reduced);
|
||||
|
||||
pthread_mutex_destroy(&words_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+16
-46
@@ -1,7 +1,6 @@
|
||||
#include <zmq.h>
|
||||
#include <ctype.h>
|
||||
#include <pthread.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -21,7 +20,7 @@ int main(int argc, char **argv){
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("Starting...\n");
|
||||
fprintf(stderr, "Starting...\n");
|
||||
|
||||
int worker_index = 1;
|
||||
int worker_count = argc - 1;
|
||||
@@ -38,10 +37,10 @@ int main(int argc, char **argv){
|
||||
exit(1);
|
||||
}
|
||||
worker_index++;
|
||||
printf("Initialized Thread: %d\n", thread_count);
|
||||
fprintf(stderr, "Initialized Thread: %d\n", thread_count);
|
||||
}
|
||||
|
||||
printf("Init DONE\n");
|
||||
fprintf(stderr, "Init DONE\n");
|
||||
|
||||
// wait for workers to finish
|
||||
for(int i = 0; i < thread_count; i++){
|
||||
@@ -102,10 +101,12 @@ void* workerFunc(void *args){
|
||||
continue;
|
||||
}
|
||||
|
||||
request[bytes_recv] = '\0';
|
||||
|
||||
char endpoint[256];
|
||||
size_t endpoint_size = sizeof(endpoint);
|
||||
if (zmq_getsockopt(responder, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_size) == 0) {
|
||||
printf("Got request from: %s\n", endpoint);
|
||||
fprintf(stderr, "Got request from: %s\n", endpoint);
|
||||
}
|
||||
|
||||
const TYPE type = get_request_type(request);
|
||||
@@ -115,17 +116,17 @@ void* workerFunc(void *args){
|
||||
|
||||
switch(type){
|
||||
case MAP:
|
||||
printf("Handling MAP\n");
|
||||
fprintf(stderr, "Handling MAP\n");
|
||||
ret = map(content, &head, &tail);
|
||||
break;
|
||||
case RED:
|
||||
printf("Handling RED\n");
|
||||
fprintf(stderr, "Handling RED\n");
|
||||
ret = reduce(content);
|
||||
break;
|
||||
case RIP:
|
||||
printf("Handling RIP\n");
|
||||
fprintf(stderr, "Handling RIP\n");
|
||||
// send errors are redundant to handle because exit
|
||||
zmq_send(responder, "rip", TYPE_LENGTH, 0);
|
||||
zmq_send(responder, "rip", TYPE_LENGTH + 1, 0);
|
||||
zmq_close(responder);
|
||||
zmq_ctx_destroy(context);
|
||||
exit(0);
|
||||
@@ -136,14 +137,15 @@ void* workerFunc(void *args){
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
printf("Sending content: %s\n", ret);
|
||||
if(zmq_send(responder, ret, strlen(ret), 0) != 0){
|
||||
fprintf(stderr, "Sending content: %s\n", ret);
|
||||
if(zmq_send(responder, ret, strlen(ret), 0) < 0){
|
||||
perror("Failed to send response");
|
||||
zmq_close(responder);
|
||||
zmq_ctx_destroy(context);
|
||||
exit(1);
|
||||
// exit(1);
|
||||
}
|
||||
free(ret); // NULL free is safe
|
||||
ret = NULL;
|
||||
} //loop
|
||||
}
|
||||
|
||||
@@ -151,7 +153,7 @@ void add_word(const char *word, key_value_pair **head, key_value_pair **tail){
|
||||
char *word_copy = strdup(word);
|
||||
tolower_str(word_copy);
|
||||
|
||||
key_value_pair *kv = init_key_value_pair(word, "1");
|
||||
key_value_pair *kv = init_key_value_pair(word_copy, "1");
|
||||
if(kv == NULL){
|
||||
fprintf(stderr, "Failed to allocate memory for key: %s\n", word);
|
||||
free(word_copy);
|
||||
@@ -190,38 +192,6 @@ char* get_word(const char *request){
|
||||
return word;
|
||||
}
|
||||
|
||||
char *key_value_pair_list_to_string(key_value_pair **head){
|
||||
key_value_pair *kvp_it = *head;
|
||||
|
||||
char *ret = NULL;
|
||||
|
||||
while(kvp_it != NULL){
|
||||
char *kvp2str = kvp_it->toString(kvp_it);
|
||||
if(kvp2str == NULL){
|
||||
kvp_it = kvp_it->next;
|
||||
continue;
|
||||
}
|
||||
if(!ret){
|
||||
ret = strdup(kvp2str);
|
||||
kvp_it = kvp_it->next;
|
||||
}
|
||||
else{
|
||||
char *tmp = realloc(ret, strlen(ret) + strlen(kvp2str) + 1);
|
||||
if(!tmp){
|
||||
free(ret);
|
||||
perror("Failed to reallocate memory for ret");
|
||||
free(kvp2str);
|
||||
return NULL;
|
||||
}
|
||||
ret = tmp;
|
||||
strcat(ret, kvp2str);
|
||||
free(kvp2str);
|
||||
kvp_it = kvp_it->next;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
char* map(const char *content, key_value_pair **head, key_value_pair **tail){
|
||||
char *content_iterator = (char*)content;
|
||||
void *content_start_address = (void*)content;
|
||||
@@ -253,7 +223,7 @@ char* reduce(char *content){
|
||||
key_value_pair *head = NULL;
|
||||
key_value_pair *tail = NULL;
|
||||
|
||||
extract_key_value_pairs(content, &head, &tail);
|
||||
extract_key_value_pairs(content, &head, &tail, true);
|
||||
char *ret = key_value_pair_list_to_string(&head);
|
||||
|
||||
free_key_value_pairs(&head, &tail);
|
||||
|
||||
Reference in New Issue
Block a user