Skip to content

Commit bf04d27

Browse files
committed
First working version, (still coredump sometimes).
1 parent 53d5539 commit bf04d27

File tree

8 files changed

+1110
-42
lines changed

8 files changed

+1110
-42
lines changed

Makefile

+4-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
# =====================================================================================
3232
#
3333

34-
PROGRAMS = dg pr
35-
CFLAGS = -Wall -g -lm
34+
PROGRAMS = dg pr rd
35+
CFLAGS = -Wall -g -lm -DUSE_FLOCK
3636

3737
.PHONY: all tags clean
3838

@@ -49,3 +49,5 @@ dg: dg.c
4949

5050
pr: pr.c ic.c mh.c
5151

52+
rd: rd.c mh.c
53+

dg.c

+18-24
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ char **idname;
4747

4848
void usage(int argc, char *argv[])
4949
{
50-
errx(EXIT_FAILURE, "Usage: %s [-f from] [-t to] [-s step in microsec] [-S state]\n\
50+
errx(EXIT_FAILURE, "Usage: %s [-n number of time] [-s step in microsec] [-S state]\n\
5151
id(s) will be read from stdin\n", basename(argv[0]));
5252
}
5353

@@ -68,20 +68,17 @@ int readids(void)
6868
int main(int argc, char *argv[])
6969
{
7070
int i, opt, idnum = 0;
71-
char *fm = NULL, *to = NULL;
7271
double st = -1.0;
7372
struct tm frtm, totm;
7473
struct timeval frtv, totv;
7574
double t;
76-
int s = 0;
75+
int s = 0, n = 0;
76+
char to[64], fm[64];
7777

78-
while ((opt = getopt(argc, argv, "f:t:s:S:h")) != -1) {
78+
while ((opt = getopt(argc, argv, "n:s:S:h")) != -1) {
7979
switch (opt) {
80-
case 'f':
81-
fm = optarg;
82-
break;
83-
case 't':
84-
to = optarg;
80+
case 'n':
81+
n = atoi(optarg);
8582
break;
8683
case 's':
8784
st = atof(optarg);
@@ -97,27 +94,24 @@ int main(int argc, char *argv[])
9794

9895
idnum = readids();
9996

100-
if (idnum == 0 || fm == NULL || to == NULL || st < 0.0)
97+
if (idnum == 0 || n == 0 || st < 0.0)
10198
usage(argc, argv);
10299

103-
for(i=0; i<idnum; i++)
104-
fprintf(stderr, "id[%5d] == '%s'\n", i, idname[i]);
105-
fprintf(stderr, "from: '%s' to: '%s' step: '%f'microsec\n", fm, to, st);
100+
gettimeofday(&frtv, NULL);
106101

107-
memset(&frtm, 0, sizeof(struct tm));
108-
strptime(fm, "%Y-%m-%d %T", &frtm);
109-
frtv.tv_sec = mktime(&frtm);
110-
frtv.tv_usec = 0;
102+
memcpy(&frtm, gmtime(&frtv.tv_sec), sizeof(frtm));
103+
strftime(fm, sizeof(fm), "%Y-%m-%d %T", &frtm);
111104

112-
memset(&totm, 0, sizeof(struct tm));
113-
strptime(to, "%Y-%m-%d %T", &totm);
114-
totv.tv_sec = mktime(&totm);
105+
totv.tv_sec = frtv.tv_sec + (n * st / 1000000.0);
115106
totv.tv_usec = 0;
116107

117-
/*
118-
printf("fr: %s", ctime(&frtv.tv_sec));
119-
printf("to: %s", ctime(&totv.tv_sec));
120-
*/
108+
memcpy(&totm, gmtime(&totv.tv_sec), sizeof(totm));
109+
strftime(to, sizeof(to), "%Y-%m-%d %T", &totm);
110+
111+
for(i=0; i<idnum; i++)
112+
fprintf(stderr, "id[%5d] == '%s'\n", i, idname[i]);
113+
fprintf(stderr, "from: '%s.%06ld' to: '%s.%06ld' step: '%f'microsec %d times\n",
114+
fm, frtv.tv_usec, to, totv.tv_usec, st, n);
121115

122116
t = frtv.tv_sec;
123117
st /= 1000000.0;

dg.sh

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,4 @@
1414
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515
#
1616

17-
#echo "hehe haha" | ./dg -f "2011-01-02 13:43:00" -t "2011-01-02 13:45:00" -s 133000 -S 123
18-
./dg -f "2011-01-02 13:43:00" -t "2011-01-02 13:45:00" -s 133000 -S 123 <ids
17+
time -p ./dg -n 27000 -s 133000 -S 255 <ids

ic.c

+16
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <sys/stat.h>
4040
#include <fcntl.h>
4141
#include <string.h>
42+
#include <sys/file.h>
4243

4344
#include "ic.h"
4445

@@ -111,9 +112,22 @@ ssize_t ICflush(struct ic *ic, int fd)
111112
{
112113
size_t s;
113114

115+
#ifdef USE_FLOCK
116+
if (flock(ic->fb[fd].fd, LOCK_EX) < 0) {
117+
return IC_ERROR;
118+
}
119+
#endif
120+
114121
if ((s = writen(ic->fb[fd].fd, ic->fb[fd].buf, ic->fb[fd].items * ic->itemsize)) == -1) {
115122
return IC_ERROR;
116123
}
124+
125+
#ifdef USE_FLOCK
126+
if (flock(ic->fb[fd].fd, LOCK_UN) < 0) {
127+
return IC_ERROR;
128+
}
129+
#endif
130+
117131
ic->fb[fd].items = 0;
118132

119133
return s;
@@ -149,6 +163,8 @@ int ICadd(struct ic *ic, int fd, char *item)
149163
ic->fb[fd].items++;
150164

151165
if (ic->fb[fd].items == ic->nitem) ICflush(ic, fd);
166+
//if (ic->fb[fd].items == ic->nitem) ICflushall(ic);
167+
152168
return IC_OK;
153169
}
154170

0 commit comments

Comments
 (0)