GEOS SDK TechDocs
|
|
3.7 VM Block Information
|
3.9 Closing Files
VMUpdate(), VMSave(), VMSaveAs(), VMRevert(), VMGetDirtyState() VMSave()
When you dirty a memory block, that action notifies the VM manager that the block will need to be written back to the file. If the attribute VMA_SYNC_UPDATE is off , the VM manager will try to update the block to the disk file as soon as the block is unlocked, and will then mark the block as clean . However, if the flag is on , the manager does not write the block until it is specifically told to update the file. At this point, it copies any dirty blocks back over their attached VM blocks, then marks all blocks as clean . If you use the document control objects, they will take care of updating and saving the file. However, you may need to call the updating routines specifically.
The routine
VMUpdate()
instructs the VM manager to write all dirty blocks to the disk. It takes one argument, the VM file handle (which is overridden if a thread file has been set). It returns zero if the update proceeded normally; otherwise, it returns either one of the
FileErrors
or one of the three
VMUpdate()
status codes:
VMUpdate()
is optimized for updating clean files; thus, it costs very little time to call
VMUpdate()
when you are not sure if the file is dirty. If a file is auto-saved,
VMUpdate()
is used.
A VM file can maintain backup copies of updated blocks. If so, updating the file will write changes to the disk, but will not alter those backup blocks. To finalize the changes, call the routine
VMSave()
. This routine updates the file, then deletes all the backup blocks and compacts the file. If the file does not have backup capability,
VMSave()
acts the same as
VMUpdate()
.
If a file has the backup capability, you cannot directly access the backup blocks. However, you can instruct the VM manager to restore the file to its last-saved state. The command
VMRevert()
causes the VM manager to check the VM file for blocks which have backups. It then deletes the
non-backup
block, and changes the backup block into a regular block. It also discards all blocks in memory that were attached to the blocks which just reverted. The file will then be in its condition as of the last time it was saved. The routine may not be used on files which do not have the flag VMA_BACKUP set.
You can save a file under a new name with the routine
VMSaveAs()
. If the file has backup capability, the old file will be restored to its last-saved condition (as if
VMRevert()
had been called); otherwise, the old file will be left in the file's current state. The routine is passed the name of the new file.
VMSaveAs()
copies all the blocks from the old file to the new one. If a block has a backup copy, the more recent version is copied. The new file will thus have the file in its current state; block handles will be preserved. After the new file has been created, if the file has backup-capability,
VMSaveAs()
reverts the original file to its last-saved state. It then closes the old file and returns the handle of the new file.
If you manage VM files with the document control objects, you generally don't have to call the update or save routines. The document control objects will set up a file menu with appropriate commands ("Save," "Save As," etc.), and will call the appropriate routines whenever the user chooses a command.
If you need to find out whether a file is dirty, call the routine
VMGetDirtyState()
. This routine returns a two-byte value. The more significant byte is non-zero if any blocks have been dirtied since the last update or auto-save. The less significant byte is non-zero if any blocks have been dirtied since the last save, save-as, or revert action. If the file does not have backup-capability, both bytes will always be equal. Note that
VMUpdate()
is optimized for clean files, so it is generally faster to call
VMUpdate()
even if the file might be clean, rather than checking the dirty-state with
VMGetDirtyState()
.
GEOS SDK TechDocs
|
|
3.7 VM Block Information
|
3.9 Closing Files