source: lib/iow-bzip.c @ 15e9390

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 15e9390 was c66068d, checked in by Perry Lorier <perry@…>, 12 years ago

Rewrite the libtrace io subsystem to use the new wandio abstraction layer.

  • Property mode set to 100644
File size: 2.9 KB
Line 
1#include "wandio.h"
2#include <bzlib.h>
3#include <sys/types.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6#include <stdlib.h>
7#include <string.h>
8
9enum err_t {
10        ERR_OK  = 1,
11        ERR_EOF = 0,
12        ERR_ERROR = -1
13};
14
15struct bzw_t {
16        bz_stream strm;
17        char outbuff[1024*1024];
18        int inoffset;
19        iow_t *child;
20        enum err_t err;
21};
22
23
24extern iow_source_t bz_wsource; 
25
26#define DATA(iow) ((struct bzw_t *)((iow)->data))
27#define min(a,b) ((a)<(b) ? (a) : (b))
28
29iow_t *bz_wopen(iow_t *child, int compress_level)
30{
31        iow_t *iow;
32        if (!child)
33                return NULL;
34        iow = malloc(sizeof(iow_t));
35        iow->source = &bz_wsource;
36        iow->data = malloc(sizeof(struct bzw_t));
37
38        DATA(iow)->child = child;
39
40        DATA(iow)->strm.next_in = NULL;
41        DATA(iow)->strm.avail_in = 0;
42        DATA(iow)->strm.next_out = DATA(iow)->outbuff;
43        DATA(iow)->strm.avail_out = sizeof(DATA(iow)->outbuff);
44        DATA(iow)->strm.bzalloc = NULL;
45        DATA(iow)->strm.bzfree = NULL;
46        DATA(iow)->strm.opaque = NULL;
47        DATA(iow)->err = ERR_OK;
48
49        BZ2_bzCompressInit(&DATA(iow)->strm, 
50                        compress_level, /* Block size */
51                        0,              /* Verbosity */
52                        30);            /* Work factor */
53
54        return iow;
55}
56
57
58static off_t bz_wwrite(iow_t *iow, const char *buffer, off_t len)
59{
60        if (DATA(iow)->err == ERR_EOF) {
61                return 0; /* EOF */
62        }
63        if (DATA(iow)->err == ERR_ERROR) {
64                return -1; /* ERROR! */
65        }
66
67        DATA(iow)->strm.next_in = (char*)buffer;
68        DATA(iow)->strm.avail_in = len;
69
70        while (DATA(iow)->err == ERR_OK && DATA(iow)->strm.avail_in > 0) {
71                while (DATA(iow)->strm.avail_out <= 0) {
72                        int bytes_written = wandio_wwrite(DATA(iow)->child, 
73                                DATA(iow)->outbuff,
74                                sizeof(DATA(iow)->outbuff));
75                        if (bytes_written <= 0) { /* Error */
76                                DATA(iow)->err = ERR_ERROR;
77                                /* Return how much data we managed to write ok */
78                                if (DATA(iow)->strm.avail_in != len) {
79                                        return len-DATA(iow)->strm.avail_in;
80                                }
81                                /* Now return error */
82                                return -1;
83                        }
84                        DATA(iow)->strm.next_out = DATA(iow)->outbuff;
85                        DATA(iow)->strm.avail_out = sizeof(DATA(iow)->outbuff);
86                }
87                /* Decompress some data into the output buffer */
88                int err=BZ2_bzCompress(&DATA(iow)->strm, 0);
89                switch(err) {
90                        case BZ_RUN_OK:
91                        case BZ_OK:
92                                DATA(iow)->err = ERR_OK;
93                                break;
94                        default:
95                                DATA(iow)->err = ERR_ERROR;
96                                break;
97                }
98        }
99        /* Return the number of bytes compressed */
100        return len-DATA(iow)->strm.avail_in;
101}
102
103static void bz_wclose(iow_t *iow)
104{
105        while (BZ2_bzCompress(&DATA(iow)->strm, BZ_FINISH) == BZ_OK) {
106                /* Need to flush the output buffer */
107                wandio_wwrite(DATA(iow)->child, 
108                                DATA(iow)->outbuff,
109                                sizeof(DATA(iow)->outbuff)-DATA(iow)->strm.avail_out);
110                DATA(iow)->strm.next_out = DATA(iow)->outbuff;
111                DATA(iow)->strm.avail_out = sizeof(DATA(iow)->outbuff);
112        }
113        BZ2_bzCompressEnd(&DATA(iow)->strm);
114        wandio_wwrite(DATA(iow)->child, 
115                        DATA(iow)->outbuff,
116                        sizeof(DATA(iow)->outbuff)-DATA(iow)->strm.avail_out);
117        wandio_wdestroy(DATA(iow)->child);
118        free(iow->data);
119        free(iow);
120}
121
122iow_source_t bz_wsource = {
123        "bzw",
124        bz_wwrite,
125        bz_wclose
126};
127
Note: See TracBrowser for help on using the repository browser.