< prev index next >
src/os/posix/vm/os_posix.hpp
Print this page
*** 51,60 ****
--- 51,63 ----
static size_t _compiler_thread_min_stack_allowed;
static size_t _java_thread_min_stack_allowed;
static size_t _vm_internal_thread_min_stack_allowed;
public:
+ static void init(void); // early initialization - no logging available
+ static void init_2(void);// later initialization - logging available
+
// Return default stack size for the specified thread type
static size_t default_stack_size(os::ThreadType thr_type);
// Check and sets minimum stack sizes
static jint set_minimum_stack_sizes();
static size_t get_initial_stack_size(ThreadType thr_type, size_t req_stack_size);
*** 100,110 ****
// is longer than PATH_MAX.
// On success, returns 'outbuf', which now contains the path.
// On error, it will return NULL and set errno. The content of 'outbuf' is undefined.
// On truncation error ('outbuf' too small), it will return NULL and set errno to ENAMETOOLONG.
static char* realpath(const char* filename, char* outbuf, size_t outbuflen);
-
};
/*
* Crash protection for the watcher thread. Wrap the callback
* with a sigsetjmp and in case of a SIGSEGV/SIGBUS we siglongjmp
--- 103,112 ----
*** 123,128 ****
--- 125,193 ----
private:
void restore();
sigjmp_buf _jmpbuf;
};
+ #ifndef SOLARIS
+
+ /*
+ * This is the platform-specific implementation underpinning
+ * the ParkEvent class, which itself underpins Java-level monitor
+ * operations. See park.hpp for details.
+ * These event objects are type-stable and immortal - we never delete them.
+ * Events are associated with a thread for the lifetime of the thread.
+ */
+ class PlatformEvent : public CHeapObj<mtInternal> {
+ private:
+ double cachePad[4]; // Increase odds that _mutex is sole occupant of cache line
+ volatile int _event; // Event count/permit: -1, 0 or 1
+ volatile int _nParked; // Indicates if associated thread is blocked: 0 or 1
+ pthread_mutex_t _mutex[1]; // Native mutex for locking
+ pthread_cond_t _cond[1]; // Native condition variable for blocking
+ double postPad[2];
+
+ protected: // TODO-FIXME: make dtor private
+ ~PlatformEvent() { guarantee(0, "invariant"); } // immortal so can't delete
+
+ public:
+ PlatformEvent();
+ void park();
+ int park(jlong millis);
+ void unpark();
+
+ // Use caution with reset() and fired() -- they may require MEMBARs
+ void reset() { _event = 0; }
+ int fired() { return _event; }
+ };
+
+ // JSR166 support
+ // PlatformParker provides the platform dependent base class for the
+ // Parker class. It basically provides the internal data structures:
+ // - mutex and convars
+ // which are then used directly by the Parker methods defined in the OS
+ // specific implementation files.
+ // There is significant overlap between the funcionality supported in the
+ // combination of Parker+PlatformParker and PlatformEvent (above). If Parker
+ // were more like ObjectMonitor we could use PlatformEvent in both (with some
+ // API updates of course). But Parker methods use fastpaths that break that
+ // level of encapsulation - so combining the two remains a future project.
+
+ class PlatformParker : public CHeapObj<mtInternal> {
+ protected:
+ enum {
+ REL_INDEX = 0,
+ ABS_INDEX = 1
+ };
+ int _cur_index; // which cond is in use: -1, 0, 1
+ pthread_mutex_t _mutex[1];
+ pthread_cond_t _cond[2]; // one for relative times and one for absolute
+
+ public: // TODO-FIXME: make dtor private
+ ~PlatformParker() { guarantee(0, "invariant"); }
+
+ public:
+ PlatformParker();
+ };
+
+ #endif // !SOLARIS
+
#endif // OS_POSIX_VM_OS_POSIX_HPP
< prev index next >