@@ -518,6 +518,7 @@ static void task_save_handler(retro_task_t *task)
518518 state -> file = intfstream_open_file (
519519 state -> path , RETRO_VFS_FILE_ACCESS_WRITE ,
520520 RETRO_VFS_FILE_ACCESS_HINT_NONE );
521+
521522 if (!state -> file )
522523 return ;
523524 }
@@ -529,34 +530,23 @@ static void task_save_handler(retro_task_t *task)
529530 state -> size = (ssize_t )_len ;
530531 }
531532
532- /* Nothing to write - finish immediately */
533- if (state -> size <= 0 || !state -> data )
534- {
535- task_set_progress (task , 100 );
536- task_save_handler_finished (task , state );
537- return ;
538- }
539-
540533 remaining = MIN (state -> size - state -> written , SAVE_STATE_CHUNK );
541- written = (int )intfstream_write (state -> file ,
534+
535+ if (state -> data )
536+ {
537+ written = (int )intfstream_write (state -> file ,
542538 (uint8_t * )state -> data + state -> written , remaining );
543- state -> written += written ;
539+ state -> written += written ;
540+ }
544541
545542 task_set_progress (task , (state -> written / (float )state -> size ) * 100 );
546543
547544 flg = task_get_flags (task );
548545
549- if ((flg & RETRO_TASK_FLG_CANCELLED ) > 0 )
550- {
551- /* Cancellation - no error message, just clean up */
552- task_save_handler_finished (task , state );
553- return ;
554- }
555-
556- if (written != remaining )
546+ if (((flg & RETRO_TASK_FLG_CANCELLED ) > 0 ) || written != remaining )
557547 {
558- /* Write failure */
559548 char msg [128 ];
549+
560550 if (state -> flags & SAVE_TASK_FLAG_UNDO_SAVE )
561551 {
562552 const char * failed_undo_str = msg_hash_to_str (
@@ -574,33 +564,39 @@ static void task_save_handler(retro_task_t *task)
574564 msg [++ _len ] = '\0' ;
575565 strlcpy (msg + _len , state -> path , sizeof (msg ) - _len );
576566 }
567+
577568 task_set_error (task , strdup (msg ));
578569 task_save_handler_finished (task , state );
579- return ;
580570 }
581-
582- if (state -> written == state -> size )
571+ else if (state -> written == state -> size )
583572 {
584- /* Save complete - set title directly, no intermediate allocation */
573+ char * msg = NULL ;
574+
585575 task_free_title (task );
586- if (!((flg & RETRO_TASK_FLG_MUTE ) > 0 ))
576+
577+ if (state -> flags & SAVE_TASK_FLAG_UNDO_SAVE )
578+ msg = strdup (msg_hash_to_str (MSG_RESTORED_OLD_SAVE_STATE ));
579+ else if (state -> state_slot < 0 )
580+ msg = strdup (msg_hash_to_str (MSG_SAVED_STATE_TO_SLOT_AUTO ));
581+ else
587582 {
588- if (state -> flags & SAVE_TASK_FLAG_UNDO_SAVE )
589- task_set_title (task , strdup (msg_hash_to_str (
590- MSG_RESTORED_OLD_SAVE_STATE )));
591- else if (state -> state_slot < 0 )
592- task_set_title (task , strdup (msg_hash_to_str (
593- MSG_SAVED_STATE_TO_SLOT_AUTO )));
594- else
595- {
596- char msg [128 ];
597- snprintf (msg , sizeof (msg ),
598- msg_hash_to_str (MSG_SAVED_STATE_TO_SLOT ),
599- state -> state_slot );
600- task_set_title (task , strdup (msg ));
601- }
583+ char new_msg [128 ];
584+ snprintf (new_msg , sizeof (new_msg ),
585+ msg_hash_to_str (MSG_SAVED_STATE_TO_SLOT ),
586+ state -> state_slot );
587+ msg = strdup (new_msg );
588+ }
589+
590+ if (!((flg & RETRO_TASK_FLG_MUTE ) > 0 ) && msg )
591+ {
592+ task_set_title (task , msg );
593+ msg = NULL ;
602594 }
595+
603596 task_save_handler_finished (task , state );
597+
598+ if (!string_is_empty (msg ))
599+ free (msg );
604600 }
605601}
606602
0 commit comments