hotspot/src/os/posix/vm/os_posix.hpp
changeset 46507 7db40fa6eff7
parent 46331 e3017116b9e5
child 46604 d409276ee40c
equal deleted inserted replaced
46506:1c48f011d709 46507:7db40fa6eff7
    51   static size_t _compiler_thread_min_stack_allowed;
    51   static size_t _compiler_thread_min_stack_allowed;
    52   static size_t _java_thread_min_stack_allowed;
    52   static size_t _java_thread_min_stack_allowed;
    53   static size_t _vm_internal_thread_min_stack_allowed;
    53   static size_t _vm_internal_thread_min_stack_allowed;
    54 
    54 
    55 public:
    55 public:
       
    56   static void init(void);  // early initialization - no logging available
       
    57   static void init_2(void);// later initialization - logging available
       
    58 
    56   // Return default stack size for the specified thread type
    59   // Return default stack size for the specified thread type
    57   static size_t default_stack_size(os::ThreadType thr_type);
    60   static size_t default_stack_size(os::ThreadType thr_type);
    58   // Check and sets minimum stack sizes
    61   // Check and sets minimum stack sizes
    59   static jint set_minimum_stack_sizes();
    62   static jint set_minimum_stack_sizes();
    60   static size_t get_initial_stack_size(ThreadType thr_type, size_t req_stack_size);
    63   static size_t get_initial_stack_size(ThreadType thr_type, size_t req_stack_size);
   100   //   is longer than PATH_MAX.
   103   //   is longer than PATH_MAX.
   101   // On success, returns 'outbuf', which now contains the path.
   104   // On success, returns 'outbuf', which now contains the path.
   102   // On error, it will return NULL and set errno. The content of 'outbuf' is undefined.
   105   // On error, it will return NULL and set errno. The content of 'outbuf' is undefined.
   103   // On truncation error ('outbuf' too small), it will return NULL and set errno to ENAMETOOLONG.
   106   // On truncation error ('outbuf' too small), it will return NULL and set errno to ENAMETOOLONG.
   104   static char* realpath(const char* filename, char* outbuf, size_t outbuflen);
   107   static char* realpath(const char* filename, char* outbuf, size_t outbuflen);
   105 
       
   106 };
   108 };
   107 
   109 
   108 /*
   110 /*
   109  * Crash protection for the watcher thread. Wrap the callback
   111  * Crash protection for the watcher thread. Wrap the callback
   110  * with a sigsetjmp and in case of a SIGSEGV/SIGBUS we siglongjmp
   112  * with a sigsetjmp and in case of a SIGSEGV/SIGBUS we siglongjmp
   123 private:
   125 private:
   124   void restore();
   126   void restore();
   125   sigjmp_buf _jmpbuf;
   127   sigjmp_buf _jmpbuf;
   126 };
   128 };
   127 
   129 
       
   130 #ifndef SOLARIS
       
   131 
       
   132 /*
       
   133  * This is the platform-specific implementation underpinning
       
   134  * the ParkEvent class, which itself underpins Java-level monitor
       
   135  * operations. See park.hpp for details.
       
   136  * These event objects are type-stable and immortal - we never delete them.
       
   137  * Events are associated with a thread for the lifetime of the thread.
       
   138  */
       
   139 class PlatformEvent : public CHeapObj<mtInternal> {
       
   140  private:
       
   141   double cachePad[4];        // Increase odds that _mutex is sole occupant of cache line
       
   142   volatile int _event;       // Event count/permit: -1, 0 or 1
       
   143   volatile int _nParked;     // Indicates if associated thread is blocked: 0 or 1
       
   144   pthread_mutex_t _mutex[1]; // Native mutex for locking
       
   145   pthread_cond_t  _cond[1];  // Native condition variable for blocking
       
   146   double postPad[2];
       
   147 
       
   148  protected:       // TODO-FIXME: make dtor private
       
   149   ~PlatformEvent() { guarantee(false, "invariant"); } // immortal so can't delete
       
   150 
       
   151  public:
       
   152   PlatformEvent();
       
   153   void park();
       
   154   int  park(jlong millis);
       
   155   void unpark();
       
   156 
       
   157   // Use caution with reset() and fired() -- they may require MEMBARs
       
   158   void reset() { _event = 0; }
       
   159   int  fired() { return _event; }
       
   160 };
       
   161 
       
   162 // JSR166 support
       
   163 // PlatformParker provides the platform dependent base class for the
       
   164 // Parker class. It basically provides the internal data structures:
       
   165 // - mutex and convars
       
   166 // which are then used directly by the Parker methods defined in the OS
       
   167 // specific implementation files.
       
   168 // There is significant overlap between the funcionality supported in the
       
   169 // combination of Parker+PlatformParker and PlatformEvent (above). If Parker
       
   170 // were more like ObjectMonitor we could use PlatformEvent in both (with some
       
   171 // API updates of course). But Parker methods use fastpaths that break that
       
   172 // level of encapsulation - so combining the two remains a future project.
       
   173 
       
   174 class PlatformParker : public CHeapObj<mtInternal> {
       
   175  protected:
       
   176   enum {
       
   177     REL_INDEX = 0,
       
   178     ABS_INDEX = 1
       
   179   };
       
   180   int _cur_index;  // which cond is in use: -1, 0, 1
       
   181   pthread_mutex_t _mutex[1];
       
   182   pthread_cond_t  _cond[2]; // one for relative times and one for absolute
       
   183 
       
   184  public:       // TODO-FIXME: make dtor private
       
   185   ~PlatformParker() { guarantee(false, "invariant"); }
       
   186 
       
   187  public:
       
   188   PlatformParker();
       
   189 };
       
   190 
       
   191 #endif // !SOLARIS
       
   192 
   128 #endif // OS_POSIX_VM_OS_POSIX_HPP
   193 #endif // OS_POSIX_VM_OS_POSIX_HPP