2022-03-15 00:30:04 +01:00
|
|
|
#pragma once
|
|
|
|
|
#ifndef _FILE_QUEUE
|
|
|
|
|
#define _FILE_QUEUE
|
|
|
|
|
|
2022-04-08 21:32:52 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <pthread.h>
|
2022-04-09 00:37:56 +02:00
|
|
|
|
2022-05-07 22:21:20 +02:00
|
|
|
#include "conn.h"
|
2022-03-15 00:30:04 +01:00
|
|
|
|
2022-05-19 21:32:44 +02:00
|
|
|
/* Algoritmo che viene usato per il rimpiazzo dei dati:
|
|
|
|
|
se = 0 -> FIFO
|
|
|
|
|
se = 1 -> LRU
|
|
|
|
|
*/
|
2022-05-20 19:34:54 +02:00
|
|
|
#define ALGORITHM 0
|
2022-05-19 21:32:44 +02:00
|
|
|
|
2022-05-07 22:21:20 +02:00
|
|
|
/* struttura dati per gestire i file in memoria principale */
|
2022-03-15 00:30:04 +01:00
|
|
|
typedef struct {
|
2022-05-07 22:21:20 +02:00
|
|
|
char *filepath; /* path assoluto del file */
|
|
|
|
|
int O_LOCK; /* 1 se il file e' in modalita' locked */
|
|
|
|
|
int owner; /* client che possiede la lock sul file */
|
|
|
|
|
int open; /* 1 se il file e' aperto */
|
|
|
|
|
void *data; /* contenuto del file */
|
|
|
|
|
size_t size; /* dimensione del file in bytes */
|
|
|
|
|
size_t valid; /* posizione fino a cui i dati sono validi */
|
2022-03-15 00:30:04 +01:00
|
|
|
} fileT;
|
|
|
|
|
|
2022-05-07 22:21:20 +02:00
|
|
|
/* nodo di una linked list */
|
2022-03-15 00:30:04 +01:00
|
|
|
typedef struct node {
|
|
|
|
|
fileT *data;
|
|
|
|
|
struct node *next;
|
|
|
|
|
} nodeT;
|
|
|
|
|
|
2022-05-09 00:58:01 +02:00
|
|
|
/* coda */
|
2022-03-15 00:30:04 +01:00
|
|
|
typedef struct {
|
2022-05-07 22:21:20 +02:00
|
|
|
nodeT *head; /* puntatore al primo elemento */
|
|
|
|
|
nodeT *tail; /* puntatore all'ultimo elemento */
|
|
|
|
|
size_t maxLen; /* numero massimo di elementi */
|
|
|
|
|
size_t len; /* numero attuale di elementi */
|
|
|
|
|
size_t maxSize; /* dimensione massima */
|
|
|
|
|
size_t size; /* dimensione attuale */
|
|
|
|
|
pthread_mutex_t m; /* lock sulla coda */
|
2022-03-15 00:30:04 +01:00
|
|
|
} queueT;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creazione di un fileT.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param f string che identifica il fileT tramite il suo path assoluto
|
|
|
|
|
* @param O_LOCK 1 locked, 0 unlocked
|
|
|
|
|
* @param client client associato
|
|
|
|
|
* @param open apertura del file dopo la creazione
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return puntatore al fileT, NULL se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
fileT* createFileT(char *f, int O_LOCK, int client, int open);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Append su un fileT.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param f fileT sul quale scrivere
|
|
|
|
|
* @param data puntatore al buffer da scrivere
|
|
|
|
|
* @param size dimensione in bytes del buffer
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int writeFileT(fileT *f, void *data, size_t size);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Rimozione di un fileT.
|
2022-05-07 22:21:20 +02:00
|
|
|
* @param f
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
void destroyFile(fileT *f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2022-05-17 18:41:50 +02:00
|
|
|
* Alloca ed inizializza una coda di fileT.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param maxLen lunghezza massima della coda
|
|
|
|
|
* @param maxSize dimensione massima della coda in bytes
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return puntatore alla coda allocata, NULL se errore
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
queueT* createQueue(size_t maxLen, size_t maxSize);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Inserisce un fileT nella coda.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda
|
|
|
|
|
* @param data puntatore al fileT da inserire
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int enqueue(queueT *q, fileT* data);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Estrae un fileT dalla coda.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return puntatore al file estratto, NULL se errore
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
fileT* dequeue(queueT *q);
|
|
|
|
|
|
2022-04-04 18:58:40 +02:00
|
|
|
/**
|
|
|
|
|
* Estrae fileT dalla coda fino ad ottenere abbastanza spazio in q.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda
|
|
|
|
|
* @param filepath file a cui bisogna aggiungere s di spazio
|
|
|
|
|
* @param s dimensione da aggiungere al file
|
2022-04-04 18:58:40 +02:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return puntatore alla lista di file estratti (NULL terminated), NULL se errore
|
2022-04-04 18:58:40 +02:00
|
|
|
*/
|
|
|
|
|
fileT ** dequeueN(queueT *q, char *filepath, size_t s);
|
|
|
|
|
|
2022-03-15 00:30:04 +01:00
|
|
|
/**
|
|
|
|
|
* Estrae un fileT dalla coda come la dequeue, ma invece di restituire il
|
|
|
|
|
* file estratto lo distrugge immediatamente, liberandone la memoria.
|
|
|
|
|
*
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
void voidDequeue(queueT *q);
|
|
|
|
|
|
2022-04-09 22:43:26 +02:00
|
|
|
|
2022-03-15 00:30:04 +01:00
|
|
|
/**
|
|
|
|
|
* Stampa l'intero contenuto della coda.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param stream file su cui stampare
|
|
|
|
|
* @param q puntatore alla coda da stampare
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @retval 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int printQueue(FILE *stream, queueT *q);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Cerca di ottenere il lock su un fileT, fallisce se un altro client ha gia'
|
|
|
|
|
* richiesto la lock
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda che contiene il fileT
|
|
|
|
|
* @param filepath path assoluto (identificatore) del fileT
|
|
|
|
|
* @param owner client che ha richiesto l'operazione
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int lockFileInQueue(queueT *q, char *filepath, int owner);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Rilascia il lock di un file, fallisce se non si e' il possessore del lock
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda che contiene il fileT
|
|
|
|
|
* @param filepath path assoluto (identificatore) del fileT
|
|
|
|
|
* @param owner client che ha richiesto l'operazione
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int unlockFileInQueue(queueT *q, char *filepath, int owner);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Apre un fileT contenuto nella coda. Fallisce se il lock appartiene a un
|
|
|
|
|
* client diverso.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda che contiene il fileT da aprire
|
|
|
|
|
* @param filepath path assoluto (identificatore) del fileT da aprire
|
|
|
|
|
* @param O_LOCK 1 locked, 0 unlocked
|
|
|
|
|
* @param owner client che ha richiesto l'apertura
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int openFileInQueue(queueT *q, char *filepath, int O_LOCK, int owner);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Chiude un file contenuto nella coda. Ha successo se fileT non e' stato aperto.
|
|
|
|
|
* Fallisce se il file e' stato messo in modalita' locked da un client diverso.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda che contiene il fileT da chiudere
|
|
|
|
|
* @param filepath path assoluto (identificatore) del fileT da chiudere
|
|
|
|
|
* @param owner client che ha richiesto la chiusura
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int closeFileInQueue(queueT *q, char *filepath, int owner);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Scrive del contenuto su un fileT all'interno della coda. Fallisce se il file
|
|
|
|
|
* non e' stato aperto o se il lock appartiene a un client diverso.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda che contiene il fileT su cui scrivere
|
|
|
|
|
* @param filepath path assoluto (identificatore) del fileT
|
|
|
|
|
* @param data buffer che contiene i dati
|
|
|
|
|
* @param size dimensione in bytes del buffer
|
|
|
|
|
* @param owner client che ha richiesto l'operazione di scrittura
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int writeFileInQueue(queueT *q, char *filepath, void *data, size_t size, int owner);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Scrive del contenuto in append su un fileT all'interno della coda. Fallisce
|
|
|
|
|
* se il file non e' stato aperto o se il lock appartiene a un client diverso.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda che contiene il fileT su cui effettuare l'append
|
|
|
|
|
* @param filepath path assoluto (identificatore) del fileT
|
|
|
|
|
* @param data buffer che contiene i dati
|
|
|
|
|
* @param size dimensione in bytes del buffer
|
|
|
|
|
* @param owner client che ha richiesto l'operazione di append
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (setta errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int appendFileInQueue(queueT *q, char *filepath, void *data, size_t size, int owner);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Rimuove un fileT dalla coda. Fallisce se non si è in possesso della lock o se
|
|
|
|
|
* la lock e' posseduta da un client diverso.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda che contiene il fileT da rimuovere
|
|
|
|
|
* @param filepath path assoluto (identificatore) del fileT da rimuovere
|
|
|
|
|
* @param owner client che ha richiesto la rimozione
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se successo, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
int removeFileFromQueue(queueT *q, char *filepath, int owner);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2022-03-31 22:26:44 +02:00
|
|
|
* Cerca un fileT nella coda e ritorna una copia.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda sulla quale cercare il fileT
|
|
|
|
|
* @param filepath path assoluto del fileT da cercare
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return puntatore a una copia del fileT se trovato, NULL se non trovato o errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
fileT* find(queueT *q, char *filepath);
|
|
|
|
|
|
2022-05-17 18:41:50 +02:00
|
|
|
/**
|
|
|
|
|
* Estrae n fileT dalla coda senza eliminarli
|
|
|
|
|
* @param q puntatore alla coda
|
|
|
|
|
* @param n numero di file da estrarre
|
|
|
|
|
*
|
|
|
|
|
* @return puntatore i file estratti (NULL terminated), NULL se errore
|
|
|
|
|
*/
|
|
|
|
|
fileT ** request(queueT *q, int n);
|
|
|
|
|
|
2022-03-31 22:26:44 +02:00
|
|
|
/**
|
|
|
|
|
* Cerca il fileT nella coda e ritorna il siultato dell'operazione
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda sulla quale cercare il fileT
|
|
|
|
|
* @param filepath path assoluto del fileT da cercare
|
2022-03-31 22:26:44 +02:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return 0 se non trovato, 1 se trovato
|
2022-03-31 22:26:44 +02:00
|
|
|
*/
|
|
|
|
|
int searchFile(queueT *q, char *filepath);
|
|
|
|
|
|
2022-03-15 00:30:04 +01:00
|
|
|
/**
|
|
|
|
|
* Numero di elementi presenti nella coda.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return numero di elementi presenti, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
size_t getLen(queueT *q);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Restituisce la dimensione attuale della coda in bytes.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda
|
2022-03-15 00:30:04 +01:00
|
|
|
*
|
2022-05-07 22:21:20 +02:00
|
|
|
* @return dimensione della coda in bytes, -1 se errore (errno)
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
size_t getSize(queueT *q);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Cancella una coda allocata con createQueue e ne libera la memoria.
|
2022-05-09 00:58:01 +02:00
|
|
|
* @param q puntatore alla coda da distruggere
|
2022-03-15 00:30:04 +01:00
|
|
|
*/
|
|
|
|
|
void destroyQueue(queueT *q);
|
|
|
|
|
|
2022-05-07 22:21:20 +02:00
|
|
|
#endif /* _FILE_QUEUE */
|