Advertisement Jump to content
Sign in to follow this  
Norman Barrows

flush savegame to disk

This topic is 1781 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'd like to flush the savegame to disk.  That way the file won't be lost or corrupted if the power goes out soon after saving.  Just trying to make the code more bulletproof.

 

How would you interpret the following docs?

 

Stream I/O, has links to fopen, fclose, and fflush:

 

http://msdn.microsoft.com/en-us/library/c565h7xx.aspx

 

If I understand them correctly, I can just call fclose.  After all, it releases windows file handles, which I would assume flushes OS write buffers to disk..

 

But I may need to open the file with "wbc" instead of "wb" =OR= link the "commit to disk" obj file, and call fflush before fclose.

 

Right now, I just call fopen "wb", and fclose.

 

Thoughts?    Comments?    Suggestions?

 

 

 

 

 

 

Share this post


Link to post
Share on other sites
Advertisement

If I understand them correctly, I can just call fclose.  After all, it releases windows file handles, which I would assume flushes OS write buffers to disk


Nope. The OS and even hardware are more concerned with performance. Flushing writes to disk is _slow_. It not only makes your app slow, but makes all the other apps using the disk slower, too. A few years ago there was a weird behavior in Firefox that could cause a particular OS to hang for an entire 30 seconds due to disk flushes.

If you want better save files, then (a) save them in rotation and (b) save them often and (c) enable cloud saves/backups. Never, ever, _ever_ modify a save file after it's written; always write a new one and then delete the old one only after you've finished writing the new one (or better, rename the old one to a .backup## filename and don't try to delete it right away).

Share this post


Link to post
Share on other sites


It turned out that most of them ignored the SATA and SCSI commands to flush their write cache.

 

Lovely!

 

Well, i'm already doing a round robin save to new file, then copy over the older of the last two saved game files.  Even if it fails, you still have the last savegame. Was just hoping to add flushdisk to it for thoroughness.  So much for that idea!   : P

 

 

Thanks for the info everyone!

Share this post


Link to post
Share on other sites

According to the SQLite guys, http://sqlite.org/transactional.html their implementation is well tested against such horrors. Maybe if this is true and you want some additional security, you might consider using a SQLite database to save your data.

 

Just an idea. I have no knowledge whatsoever about harddrives and flushing and so on.

Share this post


Link to post
Share on other sites

In Windows have a look at this...

 

http://msdn.microsoft.com/en-us/library/windows/desktop/aa364218%28v=vs.85%29.aspx

 

 

In these situations, caching can be turned off. This is done at the time the file is opened by passing FILE_FLAG_NO_BUFFERING as a value for the dwFlagsAndAttributes parameter of CreateFile. When caching is disabled, all read and write operations directly access the physical disk. However, the file metadata may still be cached. To flush the metadata to disk, use the FlushFileBuffers function.

 

Some applications, such as virus-checking software, require that their write operations be flushed to disk immediately; Windows provides this ability through write-through caching. A process enables write-through caching for a specific I/O operation by passing the FILE_FLAG_WRITE_THROUGH flag into its call to CreateFile. With write-through caching enabled, data is still written into the cache, but the cache manager writes the data immediately to disk rather than incurring a delay by using the lazy writer. A process can also force a flush of a file it has opened by calling the FlushFileBuffers function.

 

But I don't know how that affects performance and whether it always works.

 

EDIT: If it is Windows only, you are probably better using the native file IO functions (CreateFile, WriteFile, etc.) than the C lib ones (fopen, fwrite, etc.) anyway. If you need to go cross-platform I'd look and see if there is a boost library that does what you want.

Edited by Paradigm Shifter

Share this post


Link to post
Share on other sites

Well, I looked over all the docs again, and it looks like I don't really have to worry about it. I don't leave the file open. I open the file, write all the data, then immediately close it. At that point the OS flushes the buffers to disk. So no extra flush instructions are required.  

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!