/alps/fastwriter

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/fastwriter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#ifndef _FASTWRITER_PRIVATE_H
#define _FASTWRITER_PRIVATE_H

#define FASTWRITER_SYNCIO_ALIGN 512
#define FASTWRITER_DEFAULT_BUFFER_SIZE 134217728 /* 128 MB */
#define FASTWRITER_RESERVE_MEMORY 536870912 /* 512 MB */

#include <pthread.h>
#include "fastwriter.h"

typedef struct {
    fastwriter_flags_t flags;
    size_t buffer_size;
} fastwriter_parameters_t;

typedef enum {
    FASTWRITER_WRITE_FLAGS_DEFAULT = 0,
    FASTWRITER_WRITE_FLAG_FORCE = 1		/**< Force writting all passed data */
} fastwriter_write_flags_t;

typedef struct {
    int (*open)(fastwriter_t *ctx, const char *name, fastwriter_flags_t flags);
    void (*close)(fastwriter_t *ctx);
    int (*write)(fastwriter_t *ctx, fastwriter_write_flags_t flags, size_t size, void *data, size_t *written);
} fastwriter_api_t;

struct fastwrtier_s {
    fastwriter_api_t *api;		/**< Writer API */
    void *ctx;				/**< Writer Context */
    
    fastwriter_flags_t flags;

    int clean_locks;
    volatile int err;		        /**< indicates error reported by the writter backend */
    volatile int run_flag;
    pthread_t wthread;
    pthread_cond_t data_cond;		/**< broadcasted when new data arrives */
    pthread_mutex_t data_cond_mutex;
    pthread_cond_t space_cond;		/**< broadcasted when some space is freed */
    pthread_mutex_t space_cond_mutex;

    void *buffer;
    size_t size;		/**< size of the ring buffer in bytes */
    size_t max_usage;		/**< maximal number of bytes used in ring buffer */
    volatile size_t tail;	/**< first unwritten data in the ring buffer */
    volatile size_t head;	/**< last commited data in the ring buffer */
    size_t pos;			/**< last pushed data in the ring buffer */

    size_t written;		/**< number of bytes written */
    size_t commited;		/**< number of bytes commited */
    size_t chunked;		/**< number of bytes chunked */

    fastwriter_parameters_t params;
};

#endif /* _FASTWRITER_PRIVATE_H */