Skip to content

Commit f857700

Browse files
committed
10150044
1 parent 76a19bf commit f857700

File tree

5 files changed

+87
-106
lines changed

5 files changed

+87
-106
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.vscode
2-
/build
2+
/build
3+
/src/clocker

.vscode/launch.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"type": "cppdbg",
1010
"request": "launch",
1111
"program": "${fileDirname}/${fileBasenameNoExtension}",
12-
"args": [],
12+
"args": ["--save"],
1313
"stopAtEntry": false,
1414
"cwd": "${fileDirname}",
1515
"environment": [],

src/clocker.c

+5
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ Int32 main(
8383
DataMaster master = data_master_on(no_save);
8484
soft_assert_ret_int(master != 0, "Failed to turning data master on!");
8585

86+
if (argv[1] && strcmp(argv[1], "--clean") == 0) {
87+
88+
data_master_unlock();
89+
}
90+
8691
// signal handling
8792
signal(SIGINT, signal_handler);
8893
signal(SIGSEGV, signal_handler);

src/components/cmd.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ Hndl cmd_run(Hndl arg) {
8686
}
8787

8888
else if (strcmp(input, "save\n") == 0 || (input[0] == 'S' && input[1] == '\n')) {
89-
printf(OK_TXT(" Times saved!\n"));
90-
mutexed_change(command, gen_type(TC_Save));
89+
printf(ERR_TXT(" Not for use yet!\n"));
90+
// mutexed_change(command, gen_type(TC_Save));
9191
}
9292

9393
else if (strcmp(input, "version\n") == 0 || (input[0] == 'v' && input[1] == '\n')) {

src/components/data_master.c

+77-102
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,20 @@ typedef enum {
3939
DFS_Saved,
4040
DFS_NotSaved
4141
}
42-
DataFileState;
42+
DataFileStatus;
43+
44+
typedef struct {
45+
DataFileStatus state;
46+
Bool is_locked;
47+
}
48+
DataFileLock;
49+
50+
typedef struct {
51+
UInt64 total;
52+
UInt64 final;
53+
UInt64 now;
54+
}
55+
DataFileData;
4356

4457
typedef struct {
4558
Str home_dir;
@@ -137,20 +150,39 @@ Bool data_master_lock_init(_DataMaster* master) {
137150
}
138151

139152

153+
Void data_master_get_lock(
154+
_DataMaster* master,
155+
DataFileLock* lock
156+
) {
157+
158+
master->lock_file_handle = fopen(master->paths.lock_file, "r");
159+
soft_assert_ret_id(
160+
master->lock_file_handle != INVALID_HNDL,
161+
"Opening main app lock file failed: (%s)!",
162+
strerror(errno)
163+
);
164+
165+
fgets((Bytes)lock, sizeof(DataFileLock), master->lock_file_handle);
166+
167+
soft_assert_ret_id(
168+
fclose(master->lock_file_handle) == 0,
169+
"Failed to close lock file: (%s)!",
170+
strerror(errno)
171+
);
172+
173+
return;
174+
}
175+
176+
140177
Bool data_master_lock(_DataMaster* master) {
141178

142-
Bool first_time = True;
179+
Bool first_time = True;
180+
DataFileLock lock = {0};
181+
data_master_get_lock(master, &lock);
143182

144183
loop {
145-
master->lock_file_handle = fopen(master->paths.lock_file, "r");
146-
soft_assert_ret_id(
147-
master->lock_file_handle != INVALID_HNDL,
148-
"Opening main app lock file failed: (%s)!",
149-
strerror(errno)
150-
);
151-
152-
Int64 locked = fgetc(master->lock_file_handle);
153-
if (locked == True) {
184+
185+
if (lock.is_locked) {
154186

155187
if (first_time) {
156188
printf(DNG_TXT("Blocked! waiting...")"\n");
@@ -160,17 +192,11 @@ Bool data_master_lock(_DataMaster* master) {
160192
first_time = False;
161193
}
162194

195+
data_master_get_lock(master, &lock);
163196
sleep(5);
164-
165-
soft_assert_ret_id(
166-
fclose(master->lock_file_handle) == 0,
167-
"Failed to close lock file: (%s)!",
168-
strerror(errno)
169-
);
170197
}
171198

172199
else {
173-
fclose(master->lock_file_handle);
174200

175201
master->lock_file_handle = fopen(master->paths.lock_file, "w");
176202
soft_assert_ret_id(
@@ -179,7 +205,13 @@ Bool data_master_lock(_DataMaster* master) {
179205
strerror(errno)
180206
);
181207

182-
fputc(True, master->lock_file_handle);
208+
lock.state = (lock.state == DFS_Nothing) ? DFS_NotSaved : lock.state;
209+
lock.is_locked = True;
210+
211+
for (Idx idx = 0; idx < sizeof(DataFileLock); idx++) {
212+
fputc(((Bytes)&lock)[idx], master->lock_file_handle);
213+
}
214+
183215
break;
184216
}
185217
}
@@ -203,7 +235,14 @@ Bool data_master_unlock(_DataMaster* master) {
203235
strerror(errno)
204236
);
205237

206-
fputc(False, master->lock_file_handle);
238+
DataFileLock lock = {
239+
.state = DFS_Saved,
240+
.is_locked = False
241+
};
242+
243+
for (Idx idx = 0; idx < sizeof(DataFileLock); idx++) {
244+
fputc(((Bytes)&lock)[idx], master->lock_file_handle);
245+
}
207246

208247
soft_assert_ret_id(
209248
fclose(master->lock_file_handle) == 0,
@@ -215,39 +254,6 @@ Bool data_master_unlock(_DataMaster* master) {
215254
}
216255

217256

218-
DataFileState data_master_check_data(_DataMaster* master) {
219-
220-
master->data_file_handle = fopen(master->paths.data_file, "r");
221-
soft_assert_ret_id(
222-
master->data_file_handle != INVALID_HNDL,
223-
"Opening main app data file failed: (%s)!",
224-
strerror(errno)
225-
);
226-
227-
DataFileState ret = DFS_Nothing;
228-
229-
Bool state = (Bool) (fgetc(master->data_file_handle) - '0');
230-
switch (state) {
231-
case True:
232-
ret = DFS_Saved;
233-
break;
234-
case False:
235-
ret = DFS_NotSaved;
236-
break;
237-
default:
238-
break;
239-
};
240-
241-
soft_assert_ret_id(
242-
fclose(master->data_file_handle) == 0,
243-
"Failed to close lock file: (%s)!",
244-
strerror(errno)
245-
);
246-
247-
return ret;
248-
}
249-
250-
251257
Bool data_master_read_data(_DataMaster* master) {
252258

253259
master->data_file_handle = fopen(master->paths.data_file, "r");
@@ -257,45 +263,10 @@ Bool data_master_read_data(_DataMaster* master) {
257263
strerror(errno)
258264
);
259265

260-
Char buff[32] = {'\000'};
261-
fgets(buff, 32, master->data_file_handle);
262-
263-
Str cur = buff;
264-
265-
Char total[8] = {0};
266-
Char final[8] = {0};
267-
Char now[16] = {0};
268-
Str tmp = INVALID_HNDL;
269-
Idx last = 0;
270-
271-
for (Idx idx = 0;; cur++, idx++) {
272-
273-
if (*cur == '>') {
274-
tmp = cur + 1;
275-
last = idx + 1;
276-
}
277-
278-
else if (*cur == '/') {
279-
memcpy(now, tmp, idx - last);
280-
tmp = cur + 1;
281-
last = idx + 1;
282-
}
283-
284-
else if (*cur == '-') {
285-
memcpy(total, tmp, idx - last);
286-
tmp = cur + 1;
287-
last = idx + 1;
288-
}
289-
290-
else if (*cur == '\000') {
291-
memcpy(final, tmp, idx - last);
292-
tmp = cur + 1;
293-
last = idx + 1;
294-
break;
295-
}
296-
}
266+
DataFileData data = {0};
267+
fgets((Bytes)& data, sizeof(DataFileData), master->data_file_handle);
297268

298-
master->timer = timer_init(atol(total), atol(final));
269+
master->timer = timer_init(data.total, data.final);
299270
soft_assert_ret_id(master->timer != 0, "Initializing new timer failed!");
300271

301272
soft_assert_ret_id(
@@ -325,16 +296,17 @@ Bool data_master_save_data(
325296
);
326297

327298
gettimeofday(&time, INVALID_HNDL);
328-
UInt64 a = timer_get_time(timer);
329-
UInt64 b = timer_time_spend(timer);
330-
fprintf(
331-
_master->data_file_handle,
332-
"%d>%ld/%ld-%ld",
333-
final,
334-
time.tv_sec,
335-
a,
336-
b
337-
);
299+
300+
DataFileData data = {
301+
.now = time.tv_sec,
302+
.total = timer_get_time(timer),
303+
.final = timer_time_spend(timer)
304+
};
305+
306+
for (Idx idx = 0; idx < sizeof(DataFileData); idx++) {
307+
fputc(((Bytes)&data)[idx], _master->data_file_handle);
308+
}
309+
338310

339311
soft_assert_ret_id(
340312
fclose(_master->data_file_handle) == 0,
@@ -384,7 +356,10 @@ DataMaster data_master_on(Bool no_save) {
384356
"Initializing app data file failed!"
385357
);
386358

387-
if (data_master_check_data(new) != DFS_Nothing && new->saving) {
359+
DataFileLock lock = {0};
360+
data_master_get_lock(new, &lock);
361+
362+
if (lock.state != DFS_Nothing && new->saving) {
388363
printf(INF_TXT("There are some data from last time Clocker was run.\n"\
389364
"Do you want to resotre and continue that?[Y/n]")
390365
);

0 commit comments

Comments
 (0)