aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/llplugin
diff options
context:
space:
mode:
authorArmin Weatherwax2010-02-26 17:06:16 +0100
committerArmin Weatherwax2010-09-23 15:40:22 +0200
commitdcdfa1ebab37dd78282bc95093a5f347f5846b1c (patch)
tree22d6ea3f35b749e51ae4ac882bd56f42d35f9590 /linden/indra/llplugin
parentremove deprecated files (diff)
downloadmeta-impy-dcdfa1ebab37dd78282bc95093a5f347f5846b1c.zip
meta-impy-dcdfa1ebab37dd78282bc95093a5f347f5846b1c.tar.gz
meta-impy-dcdfa1ebab37dd78282bc95093a5f347f5846b1c.tar.bz2
meta-impy-dcdfa1ebab37dd78282bc95093a5f347f5846b1c.tar.xz
port SG2.0 Mediaplugs (webkit supports flash now)
Diffstat (limited to 'linden/indra/llplugin')
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/CMakeLists.txt0
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginclassmedia.cpp51
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginclassmedia.h26
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginclassmediaowner.h4
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llplugininstance.cpp4
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llplugininstance.h5
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginmessage.cpp4
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginmessage.h5
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginmessageclasses.h4
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginmessagepipe.cpp13
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginmessagepipe.h4
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginprocesschild.cpp39
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginprocesschild.h7
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginprocessparent.cpp8
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginprocessparent.h4
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginsharedmemory.cpp6
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/llpluginsharedmemory.h5
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/slplugin/CMakeLists.txt0
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/slplugin/slplugin.cpp56
-rwxr-xr-x[-rw-r--r--]linden/indra/llplugin/slplugin/slplugin_info.plist0
20 files changed, 178 insertions, 67 deletions
diff --git a/linden/indra/llplugin/CMakeLists.txt b/linden/indra/llplugin/CMakeLists.txt
index e41cdf7..e41cdf7 100644..100755
--- a/linden/indra/llplugin/CMakeLists.txt
+++ b/linden/indra/llplugin/CMakeLists.txt
diff --git a/linden/indra/llplugin/llpluginclassmedia.cpp b/linden/indra/llplugin/llpluginclassmedia.cpp
index a6f6f30..2e8bf3f 100644..100755
--- a/linden/indra/llplugin/llpluginclassmedia.cpp
+++ b/linden/indra/llplugin/llpluginclassmedia.cpp
@@ -2,9 +2,10 @@
2 * @file llpluginclassmedia.cpp 2 * @file llpluginclassmedia.cpp
3 * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class. 3 * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#include "linden_common.h" 35#include "linden_common.h"
@@ -36,6 +38,8 @@
36#include "llpluginclassmedia.h" 38#include "llpluginclassmedia.h"
37#include "llpluginmessageclasses.h" 39#include "llpluginmessageclasses.h"
38 40
41#include "llqtwebkit.h"
42
39static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256; 43static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256;
40 44
41static int nextPowerOf2( int value ) 45static int nextPowerOf2( int value )
@@ -101,6 +105,8 @@ void LLPluginClassMedia::reset()
101 mSetMediaHeight = -1; 105 mSetMediaHeight = -1;
102 mRequestedMediaWidth = 0; 106 mRequestedMediaWidth = 0;
103 mRequestedMediaHeight = 0; 107 mRequestedMediaHeight = 0;
108 mRequestedTextureWidth = 0;
109 mRequestedTextureHeight = 0;
104 mFullMediaWidth = 0; 110 mFullMediaWidth = 0;
105 mFullMediaHeight = 0; 111 mFullMediaHeight = 0;
106 mTextureWidth = 0; 112 mTextureWidth = 0;
@@ -123,7 +129,8 @@ void LLPluginClassMedia::reset()
123 mCanPaste = false; 129 mCanPaste = false;
124 mMediaName.clear(); 130 mMediaName.clear();
125 mMediaDescription.clear(); 131 mMediaDescription.clear();
126 132 mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f);
133
127 // media_browser class 134 // media_browser class
128 mNavigateURI.clear(); 135 mNavigateURI.clear();
129 mNavigateResultCode = -1; 136 mNavigateResultCode = -1;
@@ -132,6 +139,9 @@ void LLPluginClassMedia::reset()
132 mHistoryForwardAvailable = false; 139 mHistoryForwardAvailable = false;
133 mStatusText.clear(); 140 mStatusText.clear();
134 mProgressPercent = 0; 141 mProgressPercent = 0;
142 mClickURL.clear();
143 mClickTarget.clear();
144 mClickTargetType = TARGET_NONE;
135 145
136 // media_time class 146 // media_time class
137 mCurrentTime = 0.0f; 147 mCurrentTime = 0.0f;
@@ -233,6 +243,10 @@ void LLPluginClassMedia::idle(void)
233 message.setValueS32("height", mRequestedMediaHeight); 243 message.setValueS32("height", mRequestedMediaHeight);
234 message.setValueS32("texture_width", mRequestedTextureWidth); 244 message.setValueS32("texture_width", mRequestedTextureWidth);
235 message.setValueS32("texture_height", mRequestedTextureHeight); 245 message.setValueS32("texture_height", mRequestedTextureHeight);
246 message.setValueReal("background_r", mBackgroundColor.mV[VX]);
247 message.setValueReal("background_g", mBackgroundColor.mV[VY]);
248 message.setValueReal("background_b", mBackgroundColor.mV[VZ]);
249 message.setValueReal("background_a", mBackgroundColor.mV[VW]);
236 mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue. 250 mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue.
237 251
238 LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL; 252 LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL;
@@ -370,7 +384,7 @@ bool LLPluginClassMedia::textureValid(void)
370 384
371bool LLPluginClassMedia::getDirty(LLRect *dirty_rect) 385bool LLPluginClassMedia::getDirty(LLRect *dirty_rect)
372{ 386{
373 bool result = !mDirtyRect.isNull(); 387 bool result = !mDirtyRect.isNull();//awfixme isEmpty();
374 388
375 if(dirty_rect != NULL) 389 if(dirty_rect != NULL)
376 { 390 {
@@ -458,7 +472,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int
458 sendMessage(message); 472 sendMessage(message);
459} 473}
460 474
461bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers) 475bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)
462{ 476{
463 bool result = true; 477 bool result = true;
464 478
@@ -515,6 +529,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie
515 message.setValueS32("key", key_code); 529 message.setValueS32("key", key_code);
516 530
517 message.setValue("modifiers", translateModifiers(modifiers)); 531 message.setValue("modifiers", translateModifiers(modifiers));
532 message.setValueLLSD("native_key_data", native_key_data);
518 533
519 sendMessage(message); 534 sendMessage(message);
520 } 535 }
@@ -533,12 +548,13 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
533 sendMessage(message); 548 sendMessage(message);
534} 549}
535 550
536bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers) 551bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)
537{ 552{
538 LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event"); 553 LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
539 554
540 message.setValue("text", text); 555 message.setValue("text", text);
541 message.setValue("modifiers", translateModifiers(modifiers)); 556 message.setValue("modifiers", translateModifiers(modifiers));
557 message.setValueLLSD("native_key_data", native_key_data);
542 558
543 sendMessage(message); 559 sendMessage(message);
544 560
@@ -663,6 +679,26 @@ void LLPluginClassMedia::paste()
663 sendMessage(message); 679 sendMessage(message);
664} 680}
665 681
682LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type)
683{
684 // convert a LinkTargetType value from llqtwebkit to an ETargetType
685 // so that we don't expose the llqtwebkit header in viewer code
686 switch (target_type)
687 {
688 case LLQtWebKit::LTT_TARGET_NONE:
689 return LLPluginClassMedia::TARGET_NONE;
690
691 case LLQtWebKit::LTT_TARGET_BLANK:
692 return LLPluginClassMedia::TARGET_BLANK;
693
694 case LLQtWebKit::LTT_TARGET_EXTERNAL:
695 return LLPluginClassMedia::TARGET_EXTERNAL;
696
697 default:
698 return LLPluginClassMedia::TARGET_OTHER;
699 }
700}
701
666/* virtual */ 702/* virtual */
667void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) 703void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
668{ 704{
@@ -710,7 +746,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
710 newDirtyRect.mBottom = temp; 746 newDirtyRect.mBottom = temp;
711 } 747 }
712 748
713 if(mDirtyRect.isNull()) 749 if(mDirtyRect.isNull())//awfixme isEmpty())
714 { 750 {
715 mDirtyRect = newDirtyRect; 751 mDirtyRect = newDirtyRect;
716 } 752 }
@@ -915,12 +951,15 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
915 { 951 {
916 mClickURL = message.getValue("uri"); 952 mClickURL = message.getValue("uri");
917 mClickTarget = message.getValue("target"); 953 mClickTarget = message.getValue("target");
954 U32 target_type = message.getValueU32("target_type");
955 mClickTargetType = ::getTargetTypeFromLLQtWebkit(target_type);
918 mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF); 956 mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);
919 } 957 }
920 else if(message_name == "click_nofollow") 958 else if(message_name == "click_nofollow")
921 { 959 {
922 mClickURL = message.getValue("uri"); 960 mClickURL = message.getValue("uri");
923 mClickTarget.clear(); 961 mClickTarget.clear();
962 mClickTargetType = TARGET_NONE;
924 mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW); 963 mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);
925 } 964 }
926 else 965 else
diff --git a/linden/indra/llplugin/llpluginclassmedia.h b/linden/indra/llplugin/llpluginclassmedia.h
index c45010e..ab54348 100644..100755
--- a/linden/indra/llplugin/llpluginclassmedia.h
+++ b/linden/indra/llplugin/llpluginclassmedia.h
@@ -2,9 +2,10 @@
2 * @file llpluginclassmedia.h 2 * @file llpluginclassmedia.h
3 * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class. 3 * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#ifndef LL_LLPLUGINCLASSMEDIA_H 35#ifndef LL_LLPLUGINCLASSMEDIA_H
@@ -38,7 +40,7 @@
38#include "llrect.h" 40#include "llrect.h"
39#include "llpluginclassmediaowner.h" 41#include "llpluginclassmediaowner.h"
40#include <queue> 42#include <queue>
41 43#include "v4color.h"
42 44
43class LLPluginClassMedia : public LLPluginProcessParentOwner 45class LLPluginClassMedia : public LLPluginProcessParentOwner
44{ 46{
@@ -85,6 +87,8 @@ public:
85 void setSize(int width, int height); 87 void setSize(int width, int height);
86 void setAutoScale(bool auto_scale); 88 void setAutoScale(bool auto_scale);
87 89
90 void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
91
88 // Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent. 92 // Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent.
89 // This will initially be false, and will also be false for some time after setSize while the resize is processed. 93 // This will initially be false, and will also be false for some time after setSize while the resize is processed.
90 // Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values 94 // Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values
@@ -111,12 +115,12 @@ public:
111 KEY_EVENT_REPEAT 115 KEY_EVENT_REPEAT
112 }EKeyEventType; 116 }EKeyEventType;
113 117
114 bool keyEvent(EKeyEventType type, int key_code, MASK modifiers); 118 bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
115 119
116 void scrollEvent(int x, int y, MASK modifiers); 120 void scrollEvent(int x, int y, MASK modifiers);
117 121
118 // Text may be unicode (utf8 encoded) 122 // Text may be unicode (utf8 encoded)
119 bool textInput(const std::string &text, MASK modifiers); 123 bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
120 124
121 void loadURI(const std::string &uri); 125 void loadURI(const std::string &uri);
122 126
@@ -211,6 +215,17 @@ public:
211 // This is valid after MEDIA_EVENT_CLICK_LINK_HREF 215 // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
212 std::string getClickTarget() const { return mClickTarget; }; 216 std::string getClickTarget() const { return mClickTarget; };
213 217
218 typedef enum
219 {
220 TARGET_NONE, // empty href target string
221 TARGET_BLANK, // target to open link in user's preferred browser
222 TARGET_EXTERNAL, // target to open link in external browser
223 TARGET_OTHER // nonempty and unsupported target type
224 }ETargetType;
225
226 // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
227 ETargetType getClickTargetType() const { return mClickTargetType; };
228
214 std::string getMediaName() const { return mMediaName; }; 229 std::string getMediaName() const { return mMediaName; };
215 std::string getMediaDescription() const { return mMediaDescription; }; 230 std::string getMediaDescription() const { return mMediaDescription; };
216 231
@@ -327,6 +342,8 @@ protected:
327 std::string mMediaName; 342 std::string mMediaName;
328 std::string mMediaDescription; 343 std::string mMediaDescription;
329 344
345 LLColor4 mBackgroundColor;
346
330 ///////////////////////////////////////// 347 /////////////////////////////////////////
331 // media_browser class 348 // media_browser class
332 std::string mNavigateURI; 349 std::string mNavigateURI;
@@ -339,6 +356,7 @@ protected:
339 std::string mLocation; 356 std::string mLocation;
340 std::string mClickURL; 357 std::string mClickURL;
341 std::string mClickTarget; 358 std::string mClickTarget;
359 ETargetType mClickTargetType;
342 360
343 ///////////////////////////////////////// 361 /////////////////////////////////////////
344 // media_time class 362 // media_time class
diff --git a/linden/indra/llplugin/llpluginclassmediaowner.h b/linden/indra/llplugin/llpluginclassmediaowner.h
index 182eb92..239f692 100644..100755
--- a/linden/indra/llplugin/llpluginclassmediaowner.h
+++ b/linden/indra/llplugin/llpluginclassmediaowner.h
@@ -2,9 +2,10 @@
2 * @file llpluginclassmediaowner.h 2 * @file llpluginclassmediaowner.h
3 * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class. 3 * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#ifndef LL_LLPLUGINCLASSMEDIAOWNER_H 35#ifndef LL_LLPLUGINCLASSMEDIAOWNER_H
diff --git a/linden/indra/llplugin/llplugininstance.cpp b/linden/indra/llplugin/llplugininstance.cpp
index 5185b36..ce10cb6 100644..100755
--- a/linden/indra/llplugin/llplugininstance.cpp
+++ b/linden/indra/llplugin/llplugininstance.cpp
@@ -2,9 +2,10 @@
2 * @file llplugininstance.cpp 2 * @file llplugininstance.cpp
3 * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing. 3 * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#include "linden_common.h" 35#include "linden_common.h"
diff --git a/linden/indra/llplugin/llplugininstance.h b/linden/indra/llplugin/llplugininstance.h
index 0b53b5f..baa51cc 100644..100755
--- a/linden/indra/llplugin/llplugininstance.h
+++ b/linden/indra/llplugin/llplugininstance.h
@@ -1,10 +1,10 @@
1/** 1/**
2 * @file llplugininstance.h 2 * @file llplugininstance.h
3 * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
4 * 3 *
4 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 5 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 6 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 7 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 8 *
9 * Second Life Viewer Source Code 9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 10 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +28,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 30 * $/LicenseInfo$
31 * @endcond
31 */ 32 */
32 33
33#ifndef LL_LLPLUGININSTANCE_H 34#ifndef LL_LLPLUGININSTANCE_H
diff --git a/linden/indra/llplugin/llpluginmessage.cpp b/linden/indra/llplugin/llpluginmessage.cpp
index 67ac995..8efc774 100644..100755
--- a/linden/indra/llplugin/llpluginmessage.cpp
+++ b/linden/indra/llplugin/llpluginmessage.cpp
@@ -2,9 +2,10 @@
2 * @file llpluginmessage.cpp 2 * @file llpluginmessage.cpp
3 * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins. 3 * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#include "linden_common.h" 35#include "linden_common.h"
diff --git a/linden/indra/llplugin/llpluginmessage.h b/linden/indra/llplugin/llpluginmessage.h
index 8bcb896..82eb89f 100644..100755
--- a/linden/indra/llplugin/llpluginmessage.h
+++ b/linden/indra/llplugin/llpluginmessage.h
@@ -1,10 +1,10 @@
1/** 1/**
2 * @file llpluginmessage.h 2 * @file llpluginmessage.h
3 * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
4 * 3 *
4 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 5 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 6 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 7 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 8 *
9 * Second Life Viewer Source Code 9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 10 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +28,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 30 * $/LicenseInfo$
31 * @endcond
31 */ 32 */
32 33
33#ifndef LL_LLPLUGINMESSAGE_H 34#ifndef LL_LLPLUGINMESSAGE_H
diff --git a/linden/indra/llplugin/llpluginmessageclasses.h b/linden/indra/llplugin/llpluginmessageclasses.h
index 1f60d5e..9a39e98 100644..100755
--- a/linden/indra/llplugin/llpluginmessageclasses.h
+++ b/linden/indra/llplugin/llpluginmessageclasses.h
@@ -2,9 +2,10 @@
2 * @file llpluginmessageclasses.h 2 * @file llpluginmessageclasses.h
3 * @brief This file defines the versions of existing message classes for LLPluginMessage. 3 * @brief This file defines the versions of existing message classes for LLPluginMessage.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#ifndef LL_LLPLUGINMESSAGECLASSES_H 35#ifndef LL_LLPLUGINMESSAGECLASSES_H
diff --git a/linden/indra/llplugin/llpluginmessagepipe.cpp b/linden/indra/llplugin/llpluginmessagepipe.cpp
index 209f49f..85ed227 100644..100755
--- a/linden/indra/llplugin/llpluginmessagepipe.cpp
+++ b/linden/indra/llplugin/llpluginmessagepipe.cpp
@@ -2,9 +2,10 @@
2 * @file llpluginmessagepipe.cpp 2 * @file llpluginmessagepipe.cpp
3 * @brief Classes that implement connections from the plugin system to pipes/pumps. 3 * @brief Classes that implement connections from the plugin system to pipes/pumps.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#include "linden_common.h" 35#include "linden_common.h"
@@ -303,7 +305,14 @@ void LLPluginMessagePipe::processInput(void)
303 while((delim = mInput.find(MESSAGE_DELIMITER, start)) != std::string::npos) 305 while((delim = mInput.find(MESSAGE_DELIMITER, start)) != std::string::npos)
304 { 306 {
305 // Let the owner process this message 307 // Let the owner process this message
306 mOwner->receiveMessageRaw(mInput.substr(start, delim - start)); 308 if (mOwner)
309 {
310 mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
311 }
312 else
313 {
314 LL_WARNS("Plugin") << "!mOwner" << LL_ENDL;
315 }
307 316
308 start = delim + 1; 317 start = delim + 1;
309 } 318 }
diff --git a/linden/indra/llplugin/llpluginmessagepipe.h b/linden/indra/llplugin/llpluginmessagepipe.h
index 9bf1781..63fd569 100644..100755
--- a/linden/indra/llplugin/llpluginmessagepipe.h
+++ b/linden/indra/llplugin/llpluginmessagepipe.h
@@ -2,9 +2,10 @@
2 * @file llpluginmessagepipe.h 2 * @file llpluginmessagepipe.h
3 * @brief Classes that implement connections from the plugin system to pipes/pumps. 3 * @brief Classes that implement connections from the plugin system to pipes/pumps.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#ifndef LL_LLPLUGINMESSAGEPIPE_H 35#ifndef LL_LLPLUGINMESSAGEPIPE_H
diff --git a/linden/indra/llplugin/llpluginprocesschild.cpp b/linden/indra/llplugin/llpluginprocesschild.cpp
index 9b5eafc..e13376f 100644..100755
--- a/linden/indra/llplugin/llpluginprocesschild.cpp
+++ b/linden/indra/llplugin/llpluginprocesschild.cpp
@@ -2,9 +2,10 @@
2 * @file llpluginprocesschild.cpp 2 * @file llpluginprocesschild.cpp
3 * @brief LLPluginProcessChild handles the child side of the external-process plugin API. 3 * @brief LLPluginProcessChild handles the child side of the external-process plugin API.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#include "linden_common.h" 35#include "linden_common.h"
@@ -42,6 +44,7 @@ static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f; // Each call to idle will
42 44
43LLPluginProcessChild::LLPluginProcessChild() 45LLPluginProcessChild::LLPluginProcessChild()
44{ 46{
47 mState = STATE_UNINITIALIZED;
45 mInstance = NULL; 48 mInstance = NULL;
46 mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); 49 mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
47 mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz 50 mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz
@@ -53,8 +56,14 @@ LLPluginProcessChild::~LLPluginProcessChild()
53 if(mInstance != NULL) 56 if(mInstance != NULL)
54 { 57 {
55 sendMessageToPlugin(LLPluginMessage("base", "cleanup")); 58 sendMessageToPlugin(LLPluginMessage("base", "cleanup"));
56 delete mInstance; 59
57 mInstance = NULL; 60 // IMPORTANT: under some (unknown) circumstances the apr_dso_unload() triggered when mInstance is deleted
61 // appears to fail and lock up which means that a given instance of the slplugin process never exits.
62 // This is bad, especially when users try to update their version of SL - it fails because the slplugin
63 // process as well as a bunch of plugin specific files are locked and cannot be overwritten.
64 exit( 0 );
65 //delete mInstance;
66 //mInstance = NULL;
58 } 67 }
59} 68}
60 69
@@ -270,14 +279,21 @@ bool LLPluginProcessChild::isDone(void)
270 279
271void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message) 280void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message)
272{ 281{
273 std::string buffer = message.generate(); 282 if (mInstance)
274 283 {
275 LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL; 284 std::string buffer = message.generate();
276 LLTimer elapsed; 285
277 286 LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
278 mInstance->sendMessage(buffer); 287 LLTimer elapsed;
279 288
280 mCPUElapsed += elapsed.getElapsedTimeF64(); 289 mInstance->sendMessage(buffer);
290
291 mCPUElapsed += elapsed.getElapsedTimeF64();
292 }
293 else
294 {
295 LL_WARNS("Plugin") << "mInstance == NULL" << LL_ENDL;
296 }
281} 297}
282 298
283void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message) 299void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message)
@@ -352,6 +368,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
352 else 368 else
353 { 369 {
354 LL_WARNS("Plugin") << "Couldn't create a shared memory segment!" << LL_ENDL; 370 LL_WARNS("Plugin") << "Couldn't create a shared memory segment!" << LL_ENDL;
371 delete region;
355 } 372 }
356 } 373 }
357 374
diff --git a/linden/indra/llplugin/llpluginprocesschild.h b/linden/indra/llplugin/llpluginprocesschild.h
index 16a1ae8..8e9579e 100644..100755
--- a/linden/indra/llplugin/llpluginprocesschild.h
+++ b/linden/indra/llplugin/llpluginprocesschild.h
@@ -2,9 +2,10 @@
2 * @file llpluginprocesschild.h 2 * @file llpluginprocesschild.h
3 * @brief LLPluginProcessChild handles the child side of the external-process plugin API. 3 * @brief LLPluginProcessChild handles the child side of the external-process plugin API.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#ifndef LL_LLPLUGINPROCESSCHILD_H 35#ifndef LL_LLPLUGINPROCESSCHILD_H
@@ -88,8 +90,9 @@ private:
88 STATE_ERROR, // generic bailout state 90 STATE_ERROR, // generic bailout state
89 STATE_DONE // state machine will sit in this state after either error or normal termination. 91 STATE_DONE // state machine will sit in this state after either error or normal termination.
90 }; 92 };
91 EState mState;
92 void setState(EState state); 93 void setState(EState state);
94
95 EState mState;
93 96
94 LLHost mLauncherHost; 97 LLHost mLauncherHost;
95 LLSocket::ptr_t mSocket; 98 LLSocket::ptr_t mSocket;
diff --git a/linden/indra/llplugin/llpluginprocessparent.cpp b/linden/indra/llplugin/llpluginprocessparent.cpp
index bd36d11..9b8ea8b 100644..100755
--- a/linden/indra/llplugin/llpluginprocessparent.cpp
+++ b/linden/indra/llplugin/llpluginprocessparent.cpp
@@ -2,9 +2,10 @@
2 * @file llpluginprocessparent.cpp 2 * @file llpluginprocessparent.cpp
3 * @brief LLPluginProcessParent handles the parent side of the external-process plugin API. 3 * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#include "linden_common.h" 35#include "linden_common.h"
@@ -49,11 +51,13 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
49 mOwner = owner; 51 mOwner = owner;
50 mBoundPort = 0; 52 mBoundPort = 0;
51 mState = STATE_UNINITIALIZED; 53 mState = STATE_UNINITIALIZED;
54 mSleepTime = 0.0;
55 mCPUUsage = 0.0;
52 mDisableTimeout = false; 56 mDisableTimeout = false;
53 mDebug = false; 57 mDebug = false;
54 58
55 mPluginLaunchTimeout = 60.0f; 59 mPluginLaunchTimeout = 60.0f;
56 mPluginLockupTimeout = 30.0f; 60 mPluginLockupTimeout = 15.0f;
57 61
58 // Don't start the timer here -- start it when we actually launch the plugin process. 62 // Don't start the timer here -- start it when we actually launch the plugin process.
59 mHeartbeat.stop(); 63 mHeartbeat.stop();
diff --git a/linden/indra/llplugin/llpluginprocessparent.h b/linden/indra/llplugin/llpluginprocessparent.h
index 00c60b5..6dbe0c1 100644..100755
--- a/linden/indra/llplugin/llpluginprocessparent.h
+++ b/linden/indra/llplugin/llpluginprocessparent.h
@@ -2,9 +2,10 @@
2 * @file llpluginprocessparent.h 2 * @file llpluginprocessparent.h
3 * @brief LLPluginProcessParent handles the parent side of the external-process plugin API. 3 * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#ifndef LL_LLPLUGINPROCESSPARENT_H 35#ifndef LL_LLPLUGINPROCESSPARENT_H
diff --git a/linden/indra/llplugin/llpluginsharedmemory.cpp b/linden/indra/llplugin/llpluginsharedmemory.cpp
index c946619..a475f12 100644..100755
--- a/linden/indra/llplugin/llpluginsharedmemory.cpp
+++ b/linden/indra/llplugin/llpluginsharedmemory.cpp
@@ -1,10 +1,11 @@
1/** 1/**
2 * @file llpluginsharedmemory.cpp 2 * @file llpluginsharedmemory.cpp
3 * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API. 3 * LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
4 * 4 *
5 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 6 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 7 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 8 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 9 *
9 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +29,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 * @endcond
31 */ 33 */
32 34
33#include "linden_common.h" 35#include "linden_common.h"
diff --git a/linden/indra/llplugin/llpluginsharedmemory.h b/linden/indra/llplugin/llpluginsharedmemory.h
index 2dc550e..1d23cbe 100644..100755
--- a/linden/indra/llplugin/llpluginsharedmemory.h
+++ b/linden/indra/llplugin/llpluginsharedmemory.h
@@ -1,10 +1,10 @@
1/** 1/**
2 * @file llpluginsharedmemory.h 2 * @file llpluginsharedmemory.h
3 * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
4 * 3 *
4 * @cond
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 5 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 6 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 7 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 8 *
9 * Second Life Viewer Source Code 9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 10 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +28,7 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 30 * $/LicenseInfo$
31 * @endcond
31 */ 32 */
32 33
33#ifndef LL_LLPLUGINSHAREDMEMORY_H 34#ifndef LL_LLPLUGINSHAREDMEMORY_H
diff --git a/linden/indra/llplugin/slplugin/CMakeLists.txt b/linden/indra/llplugin/slplugin/CMakeLists.txt
index 4a7d670..4a7d670 100644..100755
--- a/linden/indra/llplugin/slplugin/CMakeLists.txt
+++ b/linden/indra/llplugin/slplugin/CMakeLists.txt
diff --git a/linden/indra/llplugin/slplugin/slplugin.cpp b/linden/indra/llplugin/slplugin/slplugin.cpp
index fa3924b..526734a 100644..100755
--- a/linden/indra/llplugin/slplugin/slplugin.cpp
+++ b/linden/indra/llplugin/slplugin/slplugin.cpp
@@ -1,10 +1,12 @@
1/** 1/**
2 * @file slplugin.cpp 2 * @file slplugin.cpp
3 * @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library. 3 * @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.
4 * 4 *
5 * @cond
6 *
5 * $LicenseInfo:firstyear=2008&license=viewergpl$ 7 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 * 8 *
7 * Copyright (c) 2008-2009, Linden Research, Inc. 9 * Copyright (c) 2008-2010, Linden Research, Inc.
8 * 10 *
9 * Second Life Viewer Source Code 11 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 12 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -28,6 +30,8 @@
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 30 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE. 31 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$ 32 * $/LicenseInfo$
33 *
34 * @endcond
31 */ 35 */
32 36
33 37
@@ -49,15 +53,15 @@
49 53
50/* 54/*
51 On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist. 55 On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
52 56
53 Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags: 57 Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
54 58
55 -sectcreate __TEXT __info_plist /path/to/slplugin_info.plist 59 -sectcreate __TEXT __info_plist /path/to/slplugin_info.plist
56 60
57 which means adding this to the gcc flags: 61 which means adding this to the gcc flags:
58 62
59 -Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist 63 -Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
60 64
61*/ 65*/
62 66
63#if LL_DARWIN || LL_LINUX 67#if LL_DARWIN || LL_LINUX
@@ -68,7 +72,7 @@ static void crash_handler(int sig)
68 // TODO: add our own crash reporting 72 // TODO: add our own crash reporting
69 _exit(1); 73 _exit(1);
70} 74}
71#endif 75#endif
72 76
73#if LL_WINDOWS 77#if LL_WINDOWS
74#include <windows.h> 78#include <windows.h>
@@ -81,7 +85,7 @@ LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop
81 //std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl; 85 //std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;
82 86
83 // TODO: replace exception handler before we exit? 87 // TODO: replace exception handler before we exit?
84 return EXCEPTION_EXECUTE_HANDLER; 88 return EXCEPTION_EXECUTE_HANDLER;
85} 89}
86 90
87// Taken from : http://blog.kalmbachnet.de/?postid=75 91// Taken from : http://blog.kalmbachnet.de/?postid=75
@@ -153,7 +157,7 @@ bool checkExceptionHandler()
153 if (prev_filter == NULL) 157 if (prev_filter == NULL)
154 { 158 {
155 ok = FALSE; 159 ok = FALSE;
156 if (myWin32ExceptionHandler == NULL) 160 if (NULL == myWin32ExceptionHandler)
157 { 161 {
158 LL_WARNS("AppInit") << "Exception handler uninitialized." << LL_ENDL; 162 LL_WARNS("AppInit") << "Exception handler uninitialized." << LL_ENDL;
159 } 163 }
@@ -167,7 +171,7 @@ bool checkExceptionHandler()
167} 171}
168#endif 172#endif
169 173
170// If this application on Windows platform is a console application, a console is always 174// If this application on Windows platform is a console application, a console is always
171// created which is bad. Making it a Windows "application" via CMake settings but not 175// created which is bad. Making it a Windows "application" via CMake settings but not
172// adding any code to explicitly create windows does the right thing. 176// adding any code to explicitly create windows does the right thing.
173#if LL_WINDOWS 177#if LL_WINDOWS
@@ -178,7 +182,7 @@ int main(int argc, char **argv)
178{ 182{
179 ll_init_apr(); 183 ll_init_apr();
180 184
181 // Set up llerror logging 185 // Set up llerror logging
182 { 186 {
183 LLError::initForApplication("."); 187 LLError::initForApplication(".");
184 LLError::setDefaultLevel(LLError::LEVEL_INFO); 188 LLError::setDefaultLevel(LLError::LEVEL_INFO);
@@ -191,14 +195,14 @@ int main(int argc, char **argv)
191 { 195 {
192 LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL; 196 LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;
193 }; 197 };
194 198
195 U32 port = 0; 199 U32 port = 0;
196 if(!LLStringUtil::convertToU32(lpCmdLine, port)) 200 if(!LLStringUtil::convertToU32(lpCmdLine, port))
197 { 201 {
198 LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL; 202 LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
199 }; 203 };
200 204
201 // Insert our exception handler into the system so this plugin doesn't 205 // Insert our exception handler into the system so this plugin doesn't
202 // display a crash message if something bad happens. The host app will 206 // display a crash message if something bad happens. The host app will
203 // see the missing heartbeat and log appropriately. 207 // see the missing heartbeat and log appropriately.
204 initExceptionHandler(); 208 initExceptionHandler();
@@ -207,7 +211,7 @@ int main(int argc, char **argv)
207 { 211 {
208 LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL; 212 LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;
209 } 213 }
210 214
211 U32 port = 0; 215 U32 port = 0;
212 if(!LLStringUtil::convertToU32(argv[1], port)) 216 if(!LLStringUtil::convertToU32(argv[1], port))
213 { 217 {
@@ -228,17 +232,17 @@ int main(int argc, char **argv)
228 LLPluginProcessChild *plugin = new LLPluginProcessChild(); 232 LLPluginProcessChild *plugin = new LLPluginProcessChild();
229 233
230 plugin->init(port); 234 plugin->init(port);
231 235
232 LLTimer timer; 236 LLTimer timer;
233 timer.start(); 237 timer.start();
234 238
235#if LL_WINDOWS 239#if LL_WINDOWS
236 checkExceptionHandler(); 240 checkExceptionHandler();
237#endif 241#endif
238 242
239 while(!plugin->isDone()) 243 while(!plugin->isDone())
240 { 244 {
241 timer.reset(); 245 timer.reset();
242 plugin->idle(); 246 plugin->idle();
243#if LL_DARWIN 247#if LL_DARWIN
244 { 248 {
@@ -249,7 +253,7 @@ int main(int argc, char **argv)
249#endif 253#endif
250 F64 elapsed = timer.getElapsedTimeF64(); 254 F64 elapsed = timer.getElapsedTimeF64();
251 F64 remaining = plugin->getSleepTime() - elapsed; 255 F64 remaining = plugin->getSleepTime() - elapsed;
252 256
253 if(remaining <= 0.0f) 257 if(remaining <= 0.0f)
254 { 258 {
255 // We've already used our full allotment. 259 // We've already used our full allotment.
@@ -262,26 +266,26 @@ int main(int argc, char **argv)
262 { 266 {
263 267
264// LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL; 268// LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL;
265// timer.reset(); 269// timer.reset();
266 270
267 // This also services the network as needed. 271 // This also services the network as needed.
268 plugin->sleep(remaining); 272 plugin->sleep(remaining);
269 273
270// LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" << LL_ENDL; 274// LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" << LL_ENDL;
271 } 275 }
272 276
273#if LL_WINDOWS 277#if LL_WINDOWS
274 // More agressive checking of interfering exception handlers. 278 // More agressive checking of interfering exception handlers.
275 // Doesn't appear to be required so far - even for plugins 279 // Doesn't appear to be required so far - even for plugins
276 // that do crash with a single call to the intercept 280 // that do crash with a single call to the intercept
277 // exception handler such as QuickTime. 281 // exception handler such as QuickTime.
278 //checkExceptionHandler(); 282 //checkExceptionHandler();
279#endif 283#endif
280 } 284 }
281 285
282 delete plugin; 286 delete plugin;
283 287
284 ll_cleanup_apr(); 288 ll_cleanup_apr();
285 289
286 return 0; 290 return 0;
287} 291}
diff --git a/linden/indra/llplugin/slplugin/slplugin_info.plist b/linden/indra/llplugin/slplugin/slplugin_info.plist
index b1daf87..b1daf87 100644..100755
--- a/linden/indra/llplugin/slplugin/slplugin_info.plist
+++ b/linden/indra/llplugin/slplugin/slplugin_info.plist