@@ -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
4457typedef 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+
140177Bool 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-
251257Bool 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