diff options
Diffstat (limited to 'java/openjdk6/files/icedtea.patch')
| -rw-r--r-- | java/openjdk6/files/icedtea.patch | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/java/openjdk6/files/icedtea.patch b/java/openjdk6/files/icedtea.patch new file mode 100644 index 000000000000..a69d7551c863 --- /dev/null +++ b/java/openjdk6/files/icedtea.patch @@ -0,0 +1,70 @@ +$FreeBSD$ + +This patch works around POSIX thread anomalies in the IcedTea6 plugin. +Somehow Linux can use mutexes and condition variables uninitialized. + +--- icedtea6-1.9/plugin/icedteanp/IcedTeaNPPlugin.cc.orig 2010-08-06 07:05:21.916103000 -0400 ++++ icedtea6-1.9/plugin/icedteanp/IcedTeaNPPlugin.cc 2010-09-13 12:39:38.000000000 -0400 +@@ -237,6 +237,7 @@ static guint appletviewer_watch_id = -1; + int plugin_debug = getenv ("ICEDTEAPLUGIN_DEBUG") != NULL; + + pthread_cond_t cond_message_available = PTHREAD_COND_INITIALIZER; ++pthread_mutex_t wait_mutex = PTHREAD_MUTEX_INITIALIZER; + + // Functions prefixed by ITNP_ are instance functions. They are called + // by the browser and operate on instances of ITNPPluginData. +--- icedtea6-1.9/plugin/icedteanp/IcedTeaNPPlugin.h.orig 2010-08-06 07:05:21.942208000 -0400 ++++ icedtea6-1.9/plugin/icedteanp/IcedTeaNPPlugin.h 2010-09-13 12:39:13.000000000 -0400 +@@ -94,6 +94,7 @@ static pthread_t plugin_request_processo + + // Condition on which the queue processor waits + extern pthread_cond_t cond_message_available; ++extern pthread_mutex_t wait_mutex; + + // debug switch + extern int plugin_debug; +--- icedtea6-1.9/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc.orig 2010-08-06 07:05:21.996828000 -0400 ++++ icedtea6-1.9/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc 2010-09-13 12:55:28.000000000 -0400 +@@ -63,6 +63,11 @@ PluginRequestProcessor::PluginRequestPro + this->pendingRequests = new std::map<pthread_t, uintmax_t>(); + + internal_req_ref_counter = 0; ++ pthread_mutex_init(&message_queue_mutex, NULL); ++ pthread_mutex_init(&syn_write_mutex, NULL); ++ pthread_mutex_init(&tc_mutex, NULL); ++ pthread_mutex_init(&wait_mutex, NULL); ++ pthread_cond_init(&cond_message_available, NULL); + } + + /** +@@ -77,6 +82,11 @@ PluginRequestProcessor::~PluginRequestPr + + if (pendingRequests) + delete pendingRequests; ++ pthread_mutex_destroy(&message_queue_mutex); ++ pthread_mutex_destroy(&syn_write_mutex); ++ pthread_mutex_destroy(&tc_mutex); ++ pthread_mutex_destroy(&wait_mutex); ++ pthread_cond_destroy(&cond_message_available); + } + + /** +@@ -709,7 +719,6 @@ queue_processor(void* data) + PluginRequestProcessor* processor = (PluginRequestProcessor*) data; + std::vector<std::string*>* message_parts = NULL; + std::string command; +- pthread_mutex_t wait_mutex = PTHREAD_MUTEX_INITIALIZER; // This is needed for API compat. and is unused + + PLUGIN_DEBUG("Queue processor initialized. Queue = %p\n", message_queue); + +@@ -780,7 +789,9 @@ queue_processor(void* data) + + } else + { +- pthread_cond_wait(&cond_message_available, &wait_mutex); ++ pthread_mutex_lock(&wait_mutex); ++ pthread_cond_wait(&cond_message_available, &wait_mutex); ++ pthread_mutex_unlock(&wait_mutex); + pthread_testcancel(); + } + |
