ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/main_unix.cpp
(Generate patch)

Comparing BasiliskII/src/Unix/main_unix.cpp (file contents):
Revision 1.26 by cebix, 2000-11-02T19:41:52Z vs.
Revision 1.27 by cebix, 2000-11-30T16:20:52Z

# Line 30 | Line 30
30   # include <pthread.h>
31   #endif
32  
33 < #if defined(USE_MAPPED_MEMORY) || REAL_ADDRESSING || DIRECT_ADDRESSING
33 > #if REAL_ADDRESSING || DIRECT_ADDRESSING
34   # include <sys/mman.h>
35   #endif
36  
# Line 160 | Line 160 | static bool memory_mapped_from_zero = fa
160   static uint32 mapped_ram_rom_size;              // Total size of mmap()ed RAM/ROM area
161   #endif
162  
163 #ifdef USE_MAPPED_MEMORY
164 extern char *address_space, *good_address_map;
165 #endif
166
163  
164   // Prototypes
165   static void *xpram_func(void *arg);
# Line 313 | Line 309 | int main(int argc, char **argv)
309   #endif
310  
311          // Create areas for Mac RAM and ROM
312 < #if defined(USE_MAPPED_MEMORY)
317 <    good_address_map = (char *)mmap(NULL, 1<<24, PROT_READ, MAP_PRIVATE, zero_fd, 0);
318 <    address_space = (char *)mmap(NULL, 1<<24, PROT_READ | PROT_WRITE, MAP_PRIVATE, zero_fd, 0);
319 <    if ((int)address_space < 0 || (int)good_address_map < 0) {
320 <                ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR));
321 <                QuitEmulator();
322 <    }
323 <    RAMBaseHost = (uint8 *)mmap(address_space, RAMSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, zero_fd, 0);
324 <    ROMBaseHost = (uint8 *)mmap(address_space + 0x00400000, 0x80000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, zero_fd, 0);
325 <        char *nam = tmpnam(NULL);
326 <    int good_address_fd = open(nam, O_CREAT | O_RDWR, 0600);
327 <        char buffer[4096];
328 <    memset(buffer, 1, sizeof(buffer));
329 <    write(good_address_fd, buffer, sizeof(buffer));
330 <    unlink(nam);
331 <    for (int i=0; i<RAMSize; i+=4096)
332 <        mmap(good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
333 <    for (int i=0; i<0x80000; i+=4096)
334 <        mmap(good_address_map + i + 0x00400000, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
335 < #elif REAL_ADDRESSING || DIRECT_ADDRESSING
312 > #if REAL_ADDRESSING || DIRECT_ADDRESSING
313          // gb-- Overkill, needs to be cleaned up. Probably explode it for either
314          // real or direct addressing mode.
315   #if REAL_ADDRESSING
# Line 864 | Line 841 | uint64 GetTicks_usec(void)
841   *  the highest accuracy possible)
842   */
843  
844 + #if defined(linux)
845 + // Linux select() changes its timeout parameter upon return to contain
846 + // the remaining time. Most other unixen leave it unchanged or undefined.
847 + #define SELECT_SETS_REMAINING
848 + #elif defined(__FreeBSD__) || defined(__sun__) || defined(sgi)
849 + #define USE_NANOSLEEP
850 + #endif
851 +
852   void Delay_usec(uint32 usec)
853   {
854          int was_error;
855  
856 < #if defined(linux)
872 <        struct timeval tv;
873 < #elif defined(__FreeBSD__) || defined(sgi)
856 > #ifdef USE_NANOSLEEP
857          struct timespec elapsed, tv;
858 < #else   // Non-Linux implementations need to calculate time left
858 > #else
859 >        struct timeval tv;
860 > #ifndef SELECT_SETS_REMAINING
861          uint64 then, now, elapsed;
862   #endif
863 + #endif
864  
865          // Set the timeout interval - Linux only needs to do this once
866 < #if defined(linux)
867 <        tv.tv_sec = 0;
868 <        tv.tv_usec = usec;
869 < #elif defined(__FreeBSD__) || defined(sgi)
870 <        elapsed.tv_sec = 0;
871 <        elapsed.tv_nsec = usec * 1000;
866 > #ifdef SELECT_SETS_REMAINING
867 >    tv.tv_sec = 0;
868 >    tv.tv_usec = usec;
869 > #elif defined(USE_NANOSLEEP)
870 >    elapsed.tv_sec = 0;
871 >    elapsed.tv_nsec = usec * 1000;
872   #else
873 <        then = GetTicks_usec();
873 >    then = GetTicks_usec();
874   #endif
875 +
876          do {
877                  errno = 0;
878 < #if !defined(linux) && !defined(__FreeBSD__) && !defined(sgi)
879 <                /* Calculate the time interval left (in case of interrupt) */
878 > #ifdef USE_NANOSLEEP
879 >                tv.tv_sec = elapsed.tv_sec;
880 >                tv.tv_nsec = elapsed.tv_nsec;
881 >                was_error = nanosleep(&tv, &elapsed);
882 > #else
883 > #ifndef SELECT_SETS_REMAINING
884 >                // Calculate the time interval left (in case of interrupt)
885                  now = GetTicks_usec();
886                  elapsed = now - then;
887                  then = now;
# Line 899 | Line 891 | void Delay_usec(uint32 usec)
891                  tv.tv_sec = 0;
892                  tv.tv_usec = usec;
893   #endif
902 #if defined(__FreeBSD__) || defined(sgi)
903                tv.tv_sec = elapsed.tv_sec;
904                tv.tv_nsec = elapsed.tv_nsec;
905                was_error = nanosleep(&tv, &elapsed);
906 #else
894                  was_error = select(0, NULL, NULL, NULL, &tv);
895   #endif
896          } while (was_error && (errno == EINTR));

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines