home *** CD-ROM | disk | FTP | other *** search
- head 1.2;
- branch ;
- access ;
- symbols ;
- locks ediger:1.2;
- comment @@;
-
-
- 1.2
- date 94.02.10.22.20.08; author ediger; state Exp;
- branches ;
- next 1.1;
-
- 1.1
- date 94.02.07.21.38.37; author ediger; state Exp;
- branches ;
- next ;
-
-
- desc
- @Implementation of a simple object that represents a memory-mapped file.
- @
-
-
- 1.2
- log
- @added - (char *)errorString method to assist in error handling
- @
- text
- @//H+
- // Implementation of a simple object representing a memory-mapped file.
- //H-
-
- /* $Log: MappedFile.m,v $
- Revision 1.1 94/02/07 21:38:37 ediger
- Initial revision
- */
-
- #import <MappedFile.h>
-
- @@implementation MappedFile
-
- static char MappedFileRcsIdent[] = "$Id: MappedFile.m,v 1.1 94/02/07 21:38:37 ediger Exp Locker: ediger $";
-
- //F+ -init
- //F-
- - init
- {
- [super init];
-
- mappedAddress = NULL;
- lastErrno = 0;
- lastKernReturn = KERN_SUCCESS;
- FileName = NULL;
- fd = -1; // -1 signifies that file descriptor is not used.
-
- return self;
- }
-
- //F+ -free
- //F-
- - free
- {
- if (fd > -1 || mappedAddress != NULL)
- [self unmap];
-
- if (FileName != NULL)
- free(FileName);
-
- [super free];
-
- return self;
- }
-
- //F+ -(BOOL)map
- //
- // Returns TRUE if memory-mapping of file worked, FALSE if it failed.
- //
- // Must set name of file to map first.
- //F-
- - (BOOL)map
- {
- assert(FileName != NULL);
-
- if (fd > -1 || mappedAddress != NULL)
- [self unmap];
-
- fd = open(FileName, O_RDONLY);
- if (fd < 0)
- {
- lastErrno = errno;
- return FALSE;
- }
-
- if (fstat(fd, &statBuf) < 0)
- {
- lastErrno = errno;
- close(fd);
- return FALSE;
- }
-
- lastKernReturn = map_fd(fd, (vm_offset_t)NULL,
- (vm_offset_t *)&mappedAddress, TRUE, statBuf.st_size);
-
- if (lastKernReturn != KERN_SUCCESS)
- {
- close(fd);
- return FALSE;
- }
-
- return TRUE;
- }
-
- //F+ -(BOOL)unmap
- //
- // Returns TRUE if unmapping of file worked, FALSE if it failed.
- //
- //F-
- - (BOOL)unmap
- {
- BOOL fSuccess;
-
- fSuccess = FALSE;
-
- if (mappedAddress == NULL || fd == -1)
- return TRUE; // allow repeated use of this message
-
- lastKernReturn = vm_deallocate(task_self(), (vm_address_t)mappedAddress,
- statBuf.st_size);
- if (lastKernReturn == KERN_SUCCESS)
- fSuccess = TRUE;
- else
- mappedAddress = NULL;
-
- if (close(fd) < 0)
- {
- lastErrno = errno;
- fSuccess = FALSE;
- } else
- fd = -1;
-
- return fSuccess;
- }
-
- //F+ -(char *)address
- //F-
- - (char *)address
- {
- return mappedAddress;
- }
-
- //F+ -(char *)filename
- //F-
- - (char *)filename
- {
- return FileName;
- }
-
- //F+ -(int)size
- //F-
- - (int)size
- {
- return statBuf.st_size;
- }
-
- //F+ -(int)lastUnixError
- //F-
- - (int)lastUnixError
- {
- return lastErrno;
- }
-
- //F+ -(kern_return_t)lastMachError
- //F-
- - (kern_return_t)lastMachError
- {
- return lastKernReturn;
- }
-
- //F+ -filename:(char *)fileName
- //
- // Set filename of file to be memory mapped.
- // Possibly an unwise pseudo-method-name overloading.
- //
- //F-
- - filename:(char *)fileName
- {
- if (fileName != NULL && strlen(fileName) > 0)
- {
- if (FileName != NULL)
- free(FileName);
-
- FileName = malloc(strlen(fileName) + 1);
-
- if (FileName != NULL)
- strcpy(FileName, fileName);
- }
-
- return self;
- }
-
- //F+
- //F-
- - (char *)errorString
- {
- char *bprErrorString = NULL;
-
- if (lastErrno != 0)
- bprErrorString = sys_errlist[lastErrno];
- else if (lastKernReturn != KERN_SUCCESS)
- bprErrorString = mach_error_string(lastKernReturn);
- else
- bprErrorString = "No error";
-
- return bprErrorString;
- }
-
- @@end
- @
-
-
- 1.1
- log
- @Initial revision
- @
- text
- @d5 4
- a8 1
- /* $Log$ */
- d14 1
- a14 1
- static char MappedFileRcsIdent[] = "$Id$";
- d171 16
- @
-