Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <pthread.h>
- #include <unistd.h>
- #include "sbuffer.h"
- #include "config.h"
- pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER;
- // Declaration of thread condition variable
- pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
- pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
- sbuffer_t * buffer;
- int go = 1;
- FILE * file1;
- FILE * file2;
- FILE * file1_text;
- FILE * file2_text;
- void pthread_err_handler( int err_code, char *msg, char *file_name, char line_nr )
- {
- if ( 0 != err_code )
- {
- fprintf( stderr, "n%s failed with error code %d in file %s at line %dn", msg, err_code, file_name, line_nr );
- }
- }
- void *write1 (void)
- {
- int presult;
- FILE * sensor_datat = fopen("sensor_data", "rb");
- uint16_t sens_ID;
- double temp;
- time_t ts;
- while(fread(&sens_ID, sizeof(uint16_t), 1, sensor_datat) == 1 && fread(&temp, sizeof(double), 1, sensor_datat) == 1 && fread(&ts, sizeof(time_t), 1, sensor_datat) == 1){
- sbuffer_data_t * buffer_data = malloc(sizeof(sbuffer_data_t));
- buffer_data->data.id = sens_ID;
- buffer_data->data.value = temp;
- buffer_data->data.ts = ts;
- buffer_data->datamgr_read = 0;
- buffer_data->storagemgr_read = 0;
- presult = pthread_mutex_lock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_lock", __FILE__, __LINE__ );
- sbuffer_insert(buffer, buffer_data);
- pthread_cond_signal(&cond1);
- presult = pthread_mutex_unlock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_unlock", __FILE__, __LINE__ );
- free(buffer_data);
- }
- fclose(sensor_datat);
- while(1){
- presult = pthread_mutex_lock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_lock", __FILE__, __LINE__ );
- pthread_cond_signal(&cond1);
- presult = pthread_mutex_unlock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_unlock", __FILE__, __LINE__ );
- }
- return NULL;
- }
- void *datamgrf (void)
- {
- int presult;
- file1 = fopen("sensor_data_out", "w");
- file1_text = fopen("sensor_data_text", "w");
- sbuffer_data_t * buffer_data_prev = malloc(sizeof(sbuffer_data_t));
- buffer_data_prev->data.id = 0;
- buffer_data_prev->data.value = 0;
- buffer_data_prev->data.ts = 0;
- buffer_data_prev->datamgr_read = 0;
- buffer_data_prev->storagemgr_read = 0;
- while(go){
- sbuffer_data_t * buffer_data = malloc(sizeof(sbuffer_data_t));
- buffer_data->data.id = 0;
- buffer_data->data.value = 0;
- buffer_data->data.ts = 0;
- buffer_data->datamgr_read = 0;
- buffer_data->storagemgr_read = 0;
- presult = pthread_mutex_lock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_lock", __FILE__, __LINE__ );
- pthread_cond_wait(&cond1, &data_mutex);
- if(sbuffer_read(buffer, buffer_data) == SBUFFER_NO_DATA){
- exit(0);
- }
- pthread_cond_signal(&cond2);
- presult = pthread_mutex_unlock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_unlock", __FILE__, __LINE__ );
- if(!(buffer_data_prev->data.id == buffer_data->data.id && buffer_data_prev->data.ts == buffer_data->data.ts)){
- printf("sensor id van de eerste = %d - temperature = %g - timestamp = %ldn", buffer_data->data.id, buffer_data->data.value, (long int)buffer_data->data.ts);
- fwrite(&buffer_data->data.id, sizeof(buffer_data->data.id), 1, file1);
- fwrite(&buffer_data->data.value, sizeof(buffer_data->data.value), 1, file1);
- fwrite(&buffer_data->data.ts, sizeof(buffer_data->data.ts), 1, file1);
- fprintf(file1_text, "%d %g %ldn", buffer_data->data.id, buffer_data->data.value, buffer_data->data.ts);
- }
- buffer_data_prev = buffer_data;
- free(buffer_data);
- }
- fclose(file1);
- fclose(file1_text);
- free(buffer_data_prev);
- return NULL;
- }
- void *storagemgrf (void)
- {
- int presult;
- file2 = fopen("sensor_data_out2", "w");
- file2_text = fopen("sensor_data_text2", "w");
- while(go){
- sbuffer_data_t * buffer_data = malloc(sizeof(sbuffer_data_t));
- buffer_data->data.id = 0;
- buffer_data->data.value = 0;
- buffer_data->data.ts = 0;
- buffer_data->datamgr_read = 0;
- buffer_data->storagemgr_read = 0;
- presult = pthread_mutex_lock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_lock", __FILE__, __LINE__ );
- pthread_cond_wait(&cond2, &data_mutex);
- if(sbuffer_remove(buffer, buffer_data) == SBUFFER_NO_DATA){
- printf("here now 2");
- go = 0;
- }
- presult = pthread_mutex_unlock( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_unlock", __FILE__, __LINE__ );
- printf("sensor id = %d - temperature = %g - timestamp = %ldn", buffer_data->data.id, buffer_data->data.value, (long int)buffer_data->data.ts);
- fwrite(&buffer_data->data.id, sizeof(buffer_data->data.id), 1, file2);
- fwrite(&buffer_data->data.value, sizeof(buffer_data->data.value), 1, file2);
- fwrite(&buffer_data->data.ts, sizeof(buffer_data->data.ts), 1, file2);
- fprintf(file2_text, "%d %g %ldn", buffer_data->data.id, buffer_data->data.value, buffer_data->data.ts);
- free(buffer_data);
- }
- fclose(file2);
- fclose(file2_text);
- return NULL;
- }
- int main(void)
- {
- pthread_t connmgr, datamgr, storagemgr;
- int presult;
- sbuffer_init(&buffer);
- presult = pthread_create(&connmgr, NULL, (void*)&write1, NULL);
- pthread_err_handler( presult, "pthread_create", __FILE__, __LINE__ );
- presult = pthread_create(&datamgr, NULL, (void*)&datamgrf, NULL);
- pthread_err_handler( presult, "pthread_create", __FILE__, __LINE__ );
- presult = pthread_create(&storagemgr, NULL, (void*)&storagemgrf, NULL);
- pthread_err_handler( presult, "pthread_create", __FILE__, __LINE__ );
- printf("n Created threadn");
- presult = pthread_join(connmgr, NULL);
- pthread_err_handler( presult, "pthread_join", __FILE__, __LINE__ );
- pthread_join(datamgr, NULL);
- pthread_err_handler( presult, "pthread_join", __FILE__, __LINE__ );
- pthread_join(storagemgr, NULL);
- pthread_err_handler( presult, "pthread_join", __FILE__, __LINE__ );
- sbuffer_free(&buffer);
- presult = pthread_mutex_destroy( &data_mutex );
- pthread_err_handler( presult, "pthread_mutex_destroy", __FILE__, __LINE__ );
- return 0;
- }
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include "sbuffer.h"
- typedef struct sbuffer_node {
- struct sbuffer_node * next;
- sbuffer_data_t element;
- } sbuffer_node_t;
- struct sbuffer {
- sbuffer_node_t * head;
- sbuffer_node_t * tail;
- };
- int sbuffer_init(sbuffer_t ** buffer)
- {
- *buffer = malloc(sizeof(sbuffer_t));
- if (*buffer == NULL) return SBUFFER_FAILURE;
- (*buffer)->head = NULL;
- (*buffer)->tail = NULL;
- return SBUFFER_SUCCESS;
- }
- int sbuffer_free(sbuffer_t ** buffer)
- {
- sbuffer_node_t * dummy;
- if ((buffer==NULL) || (*buffer==NULL))
- {
- return SBUFFER_FAILURE;
- }
- while ( (*buffer)->head )
- {
- dummy = (*buffer)->head;
- (*buffer)->head = (*buffer)->head->next;
- free(dummy);
- }
- free(*buffer);
- *buffer = NULL;
- return SBUFFER_SUCCESS;
- }
- int sbuffer_read(sbuffer_t * buffer, sbuffer_data_t * buffer_data)
- {
- if (buffer == NULL) return SBUFFER_FAILURE;
- if (buffer->head == NULL) return SBUFFER_NO_DATA;
- *buffer_data = buffer->head->element;
- return SBUFFER_SUCCESS;
- }
- int sbuffer_remove(sbuffer_t * buffer, sbuffer_data_t * buffer_data)
- {
- sbuffer_node_t * dummy;
- if (buffer == NULL) return SBUFFER_FAILURE;
- if (buffer->head == NULL) return SBUFFER_NO_DATA;
- *buffer_data = buffer->head->element;
- dummy = buffer->head;
- if (buffer->head == buffer->tail) // buffer has only one node
- {
- buffer->head = buffer->tail = NULL;
- }
- else // buffer has many nodes empty
- {
- buffer->head = buffer->head->next;
- }
- free(dummy);
- return SBUFFER_SUCCESS;
- }
- int sbuffer_insert(sbuffer_t * buffer, sbuffer_data_t * buffer_data)
- {
- sbuffer_node_t * dummy;
- if (buffer == NULL) return SBUFFER_FAILURE;
- dummy = malloc(sizeof(sbuffer_node_t));
- if (dummy == NULL) return SBUFFER_FAILURE;
- dummy->element = *buffer_data;
- dummy->next = NULL;
- if (buffer->tail == NULL) // buffer empty (buffer->head should also be NULL
- {
- buffer->head = buffer->tail = dummy;
- }
- else // buffer not empty
- {
- buffer->tail->next = dummy;
- buffer->tail = buffer->tail->next;
- }
- return SBUFFER_SUCCESS;
- }
- int sbuffer_insert_head(sbuffer_t * buffer, sbuffer_data_t * buffer_data){
- sbuffer_node_t * dummy;
- if (buffer == NULL) return SBUFFER_FAILURE;
- dummy = malloc(sizeof(sbuffer_node_t));
- if (dummy == NULL) return SBUFFER_FAILURE;
- dummy->element = *buffer_data;
- if (buffer->tail == NULL) // buffer empty (buffer->head should also be NULL
- {
- buffer->head = buffer->tail = dummy;
- dummy->next = NULL;
- }
- else // buffer not empty
- {
- buffer->head = dummy;
- dummy->next = buffer->head;
- }
- return SBUFFER_SUCCESS;
- }
- #ifndef _SBUFFER_H_
- #define _SBUFFER_H_
- #include "config.h"
- #define SBUFFER_FAILURE -1
- #define SBUFFER_SUCCESS 0
- #define SBUFFER_NO_DATA 1
- typedef struct sbuffer sbuffer_t;
- /*
- * All data that can be stored in the sbuffer should be encapsulated in a
- * structure, this structure can then also hold extra info needed for your implementation
- */
- //typedef struct sbuffer_data sbuffer_data_t;
- typedef struct sbuffer_data {
- sensor_data_t data;
- int datamgr_read;
- int storagemgr_read;
- } sbuffer_data_t;
- /*
- * Allocates and initializes a new shared buffer
- * Returns SBUFFER_SUCCESS on success and SBUFFER_FAILURE if an error occured
- */
- int sbuffer_init(sbuffer_t ** buffer);
- /*
- * All allocated resources are freed and cleaned up
- * Returns SBUFFER_SUCCESS on success and SBUFFER_FAILURE if an error occured
- */
- int sbuffer_free(sbuffer_t ** buffer);
- int sbuffer_read(sbuffer_t * buffer, sbuffer_data_t * buffer_data);
- /*
- * Removes the first data in 'buffer' (at the 'head') and returns this data as '*data'
- * 'data' must point to allocated memory because this functions doesn't allocated memory
- * If 'buffer' is empty, the function doesn't block until new data becomes available but returns SBUFFER_NO_DATA
- * Returns SBUFFER_SUCCESS on success and SBUFFER_FAILURE if an error occured
- */
- int sbuffer_remove(sbuffer_t * buffer, sbuffer_data_t * buffer_data);
- /* Inserts the data in 'data' at the end of 'buffer' (at the 'tail')
- * Returns SBUFFER_SUCCESS on success and SBUFFER_FAILURE if an error occured
- */
- int sbuffer_insert(sbuffer_t * buffer, sbuffer_data_t * data);
- int sbuffer_insert_head(sbuffer_t * buffer, sbuffer_data_t * data);
- #endif //_SBUFFER_H_
Add Comment
Please, Sign In to add comment