@@ -39,7 +39,20 @@ typedef enum {
39
39
DFS_Saved ,
40
40
DFS_NotSaved
41
41
}
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 ;
43
56
44
57
typedef struct {
45
58
Str home_dir ;
@@ -137,20 +150,39 @@ Bool data_master_lock_init(_DataMaster* master) {
137
150
}
138
151
139
152
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
+
140
177
Bool data_master_lock (_DataMaster * master ) {
141
178
142
- Bool first_time = True ;
179
+ Bool first_time = True ;
180
+ DataFileLock lock = {0 };
181
+ data_master_get_lock (master , & lock );
143
182
144
183
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 ) {
154
186
155
187
if (first_time ) {
156
188
printf (DNG_TXT ("Blocked! waiting..." )"\n" );
@@ -160,17 +192,11 @@ Bool data_master_lock(_DataMaster* master) {
160
192
first_time = False ;
161
193
}
162
194
195
+ data_master_get_lock (master , & lock );
163
196
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
- );
170
197
}
171
198
172
199
else {
173
- fclose (master -> lock_file_handle );
174
200
175
201
master -> lock_file_handle = fopen (master -> paths .lock_file , "w" );
176
202
soft_assert_ret_id (
@@ -179,7 +205,13 @@ Bool data_master_lock(_DataMaster* master) {
179
205
strerror (errno )
180
206
);
181
207
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
+
183
215
break ;
184
216
}
185
217
}
@@ -203,7 +235,14 @@ Bool data_master_unlock(_DataMaster* master) {
203
235
strerror (errno )
204
236
);
205
237
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
+ }
207
246
208
247
soft_assert_ret_id (
209
248
fclose (master -> lock_file_handle ) == 0 ,
@@ -215,39 +254,6 @@ Bool data_master_unlock(_DataMaster* master) {
215
254
}
216
255
217
256
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
-
251
257
Bool data_master_read_data (_DataMaster * master ) {
252
258
253
259
master -> data_file_handle = fopen (master -> paths .data_file , "r" );
@@ -257,45 +263,10 @@ Bool data_master_read_data(_DataMaster* master) {
257
263
strerror (errno )
258
264
);
259
265
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 );
297
268
298
- master -> timer = timer_init (atol ( total ), atol ( final ) );
269
+ master -> timer = timer_init (data . total , data . final );
299
270
soft_assert_ret_id (master -> timer != 0 , "Initializing new timer failed!" );
300
271
301
272
soft_assert_ret_id (
@@ -325,16 +296,17 @@ Bool data_master_save_data(
325
296
);
326
297
327
298
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
+
338
310
339
311
soft_assert_ret_id (
340
312
fclose (_master -> data_file_handle ) == 0 ,
@@ -384,7 +356,10 @@ DataMaster data_master_on(Bool no_save) {
384
356
"Initializing app data file failed!"
385
357
);
386
358
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 ) {
388
363
printf (INF_TXT ("There are some data from last time Clocker was run.\n" \
389
364
"Do you want to resotre and continue that?[Y/n]" )
390
365
);
0 commit comments