/* Sun-$Revision: 23.9 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface class OS { private: static const int seconds_per_day = 86400; static char* allocate_heap_aligned(caddr_t desired_address, int32 size, int32 align, char* name, bool mustAllocate = true); static char* expand_unix_dir(const char* in, char* out); static bool expand_user_name(const char* in, const char* slash, char*& dirName); static char* get_user_directory(char* user); static void convert_unix_filename(char* src, char* dst); static bool is_pipe(FILE* f); static bool is_fifo(mode_t); static time_t combine_time(smi day, smi msec); static void setDateTimeBuf(struct tm *tod, smi buf[]); public: // Starting and stopping the VM: static void init(); static void terminate(int); // do not call this exit to avoid bugs static void handle_suspend_and_resume(bool stopping); // Memory static bool is_directed_allocation_supported(); // returns true if allocate_page_aligned should get desiredAddr below static char* allocate_page_aligned(int32 &size, char* name, caddr_t desiredAddr= 0, bool mustAllocate= true); static void allocate_failed(char* what); // Note that the default is not the real page size, but the largest page size // common to all Sun4 architectures (and hence guaranteed to be a // page boundary on all systems). static char* page_start(void *, unsigned int pg_sz= page_size); static char* page_end (void *, unsigned int pg_sz= page_size); // File I/O static const char* mode_for_binary(const char*); static void FRead( void* buffer, int32 size, FILE* stream); static void FWrite( const void* buffer, int32 size, FILE* stream); static void read_or_seek( void* buffer, int32 size, FILE* stream); static void FRead_mem(void* buffer_start, void *buffer_end, FILE* stream) { FRead(buffer_start, (char*)buffer_end - (char*)buffer_start, stream); } static void FWrite_mem(void* buffer_start, void *buffer_end, FILE* stream) { FWrite(buffer_start, (char*)buffer_end - (char*)buffer_start, stream); } static void Mmap(void* start, void *end, FILE* stream); static void do_not_buffer(FILE* stream); // Source files: static char* map_or_read_source_file(FILE* source_file, int32 length); static void unmap_source_file(caddr_t first, int length); // File names static bool expand_dir(const char* in, char* out); friend char* ExpandDir_prim(const char* in, void* FH); static bool is_non_unix_path(const char*); // Other file manipulation static bool setup_snapshot_to_run(char*); static void set_log_buf(FILE* f, char* buf, int bs); static char* log_file_name(); // Process calls: static void set_args(int& argc, char**& argv); // (an encapsulation of a standard Unix facility) static int getopt(int argc, char* const* argv, char* optstring); static char* optarg; static int opterr, optind, optopt; private: static int simulated_getopt(int argc, char* const* argv, char* optstring); public: static char* get_environment_variable(char* name) { return getenv(name); } static bool get_swap_space_info(int &totalK, int &freeK); static void core_dump(); // Snapshot helpers, etc.: static FILE* start_compressing_snapshot(char* compression_f, char* fullFileName, SignalBlocker*& sb); static int end_compressing_snapshot(FILE* snapFile); static FILE* start_decompressing_snapshot(FILE* snap, char* decompression_filter); static void end_decompressing_snapshot(); static void snapshot_failed(FILE* snapFile, bool is_compressed, SignalBlocker* sb); static void set_access_before_writing_space(void* objs_bottom, void* objs_top, void* bytes_bottom, void* bytes_top); static void reset_access_after_writing_space(void* objs_bottom, void* objs_top, void* bytes_bottom, void* bytes_top); static void set_sequential_access_before_writing_snapshot(); static void set_normal_access_after_writing_snapshot(); // Throw these pages away (ie unmap). Frees resources quickly // but requires more time to get them back again. static void discard_pages(char* start, char* end); static int get_page_size(); static int min_core(caddr_t addr, size_t len, char *vec); // hints to paging system static void random_access(char* start, char* end); static void sequential_access(char* start, char* end); static void normal_access(char* start, char* end); // uses hints: static void set_bytes(char* start, char* end, int filler); // Tell the OS we will/won't need these pages in the near future static void will_need_pages(char* start, char* end); static void dont_need_pages(char* start, char* end); static unsigned int real_mem_size; static void profile(bool flag) { # if TARGET_IS_PROFILED moncontrol(flag); # else Unused(flag); # endif } // Time functions static smi user_time(); static smi system_time(); static smi cpu_time(); static void real_time(smi* buf); // fills buf w. days & msec static void date_time(smi day, smi msec, smi* buf); // fills buf w. Y/M/D/WD/H/M/S/YD/DST static bool time_to_day_and_ms(objVectorOop timeVector, smi* msAndDays); // fills msAndDays static char* current_time_string(); // OS-dependant string functions static char* strdup(const char* s); // Other names: static char* get_host_name(); static char* get_operating_system(); // Returns a string describing the OS. static char* get_user_name(); static char* get_manufacturer_name(); static void print_memory(); // For platforms that must poll for events: static void check_events(); # include "_os_pd.h.incl" }; # if TARGET_IS_PROFILED extern "C" void moncontrol(bool); # endif oop get_swap_space_prim(oop rcvrIgnored, void *FH);