Merge branch 'master' into careminster

Conflicts:
	OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
avinationmerge
Melanie 2013-07-13 00:57:03 +01:00
commit c6d75cda97
8 changed files with 189 additions and 35 deletions

View File

@ -42,6 +42,22 @@ namespace OpenSim.Data.Null
// private string m_connectionString; // private string m_connectionString;
private Dictionary<uint, EstateSettings> m_knownEstates = new Dictionary<uint, EstateSettings>();
private EstateSettings m_estate = null;
private EstateSettings GetEstate()
{
if (m_estate == null)
{
// This fools the initialization caller into thinking an estate was fetched (a check in OpenSimBase).
// The estate info is pretty empty so don't try banning anyone.
m_estate = new EstateSettings();
m_estate.EstateID = 1;
m_estate.OnSave += StoreEstateSettings;
}
return m_estate;
}
protected virtual Assembly Assembly protected virtual Assembly Assembly
{ {
get { return GetType().Assembly; } get { return GetType().Assembly; }
@ -68,21 +84,18 @@ namespace OpenSim.Data.Null
public EstateSettings LoadEstateSettings(UUID regionID, bool create) public EstateSettings LoadEstateSettings(UUID regionID, bool create)
{ {
// This fools the initialization caller into thinking an estate was fetched (a check in OpenSimBase). return GetEstate();
// The estate info is pretty empty so don't try banning anyone.
EstateSettings oneEstate = new EstateSettings();
oneEstate.EstateID = 1;
return oneEstate;
} }
public void StoreEstateSettings(EstateSettings es) public void StoreEstateSettings(EstateSettings es)
{ {
m_estate = es;
return; return;
} }
public EstateSettings LoadEstateSettings(int estateID) public EstateSettings LoadEstateSettings(int estateID)
{ {
return new EstateSettings(); return GetEstate();
} }
public EstateSettings CreateNewEstate() public EstateSettings CreateNewEstate()
@ -93,13 +106,14 @@ namespace OpenSim.Data.Null
public List<EstateSettings> LoadEstateSettingsAll() public List<EstateSettings> LoadEstateSettingsAll()
{ {
List<EstateSettings> allEstateSettings = new List<EstateSettings>(); List<EstateSettings> allEstateSettings = new List<EstateSettings>();
allEstateSettings.Add(new EstateSettings()); allEstateSettings.Add(GetEstate());
return allEstateSettings; return allEstateSettings;
} }
public List<int> GetEstatesAll() public List<int> GetEstatesAll()
{ {
List<int> result = new List<int>(); List<int> result = new List<int>();
result.Add((int)GetEstate().EstateID);
return result; return result;
} }

View File

@ -224,5 +224,26 @@ public class CounterStat : Stat
} }
} }
} }
// CounterStat is a basic stat plus histograms
public override OSDMap ToOSDMap()
{
// Get the foundational instance
OSDMap map = base.ToOSDMap();
map["StatType"] = "CounterStat";
// If there are any histograms, add a new field that is an array of histograms as OSDMaps
if (m_histograms.Count > 0)
{
OSDArray histos = new OSDArray();
foreach (EventHistogram histo in m_histograms.Values)
{
histos.Add(histo.GetHistogramAsOSDMap());
}
map.Add("Histograms", histos);
}
return map;
}
} }
} }

View File

@ -242,6 +242,7 @@ namespace OpenSim.Framework.Monitoring
ret.Add("Description", OSD.FromString(Description)); ret.Add("Description", OSD.FromString(Description));
ret.Add("UnitName", OSD.FromString(UnitName)); ret.Add("UnitName", OSD.FromString(UnitName));
ret.Add("Value", OSD.FromReal(Value)); ret.Add("Value", OSD.FromReal(Value));
ret.Add("StatType", "Stat"); // used by overloading classes to denote type of stat
return ret; return ret;
} }

View File

@ -30,6 +30,8 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using OpenMetaverse.StructuredData;
namespace OpenSim.Framework.Monitoring namespace OpenSim.Framework.Monitoring
{ {
/// <summary> /// <summary>
@ -168,6 +170,70 @@ namespace OpenSim.Framework.Monitoring
} }
} }
// Creates an OSDMap of the format:
// { categoryName: {
// containerName: {
// statName: {
// "Name": name,
// "ShortName": shortName,
// ...
// },
// statName: {
// "Name": name,
// "ShortName": shortName,
// ...
// },
// ...
// },
// containerName: {
// ...
// },
// ...
// },
// categoryName: {
// ...
// },
// ...
// }
// The passed in parameters will filter the categories, containers and stats returned. If any of the
// parameters are either EmptyOrNull or the AllSubCommand value, all of that type will be returned.
// Case matters.
public static OSDMap GetStatsAsOSDMap(string pCategoryName, string pContainerName, string pStatName)
{
OSDMap map = new OSDMap();
foreach (string catName in RegisteredStats.Keys)
{
// Do this category if null spec, "all" subcommand or category name matches passed parameter.
// Skip category if none of the above.
if (!(String.IsNullOrEmpty(pCategoryName) || pCategoryName == AllSubCommand || pCategoryName == catName))
continue;
OSDMap contMap = new OSDMap();
foreach (string contName in RegisteredStats[catName].Keys)
{
if (!(string.IsNullOrEmpty(pContainerName) || pContainerName == AllSubCommand || pContainerName == contName))
continue;
OSDMap statMap = new OSDMap();
SortedDictionary<string, Stat> theStats = RegisteredStats[catName][contName];
foreach (string statName in theStats.Keys)
{
if (!(String.IsNullOrEmpty(pStatName) || pStatName == AllSubCommand || pStatName == statName))
continue;
statMap.Add(statName, theStats[statName].ToOSDMap());
}
contMap.Add(contName, statMap);
}
map.Add(catName, contMap);
}
return map;
}
// /// <summary> // /// <summary>
// /// Start collecting statistics related to assets. // /// Start collecting statistics related to assets.
// /// Should only be called once. // /// Should only be called once.

View File

@ -64,11 +64,18 @@ namespace OpenSim.Region.ClientStack.Linden
private Scene m_scene; private Scene m_scene;
private bool m_persistBakedTextures; private bool m_persistBakedTextures;
private string m_URL;
private IBakedTextureModule m_BakedTextureModule; private IBakedTextureModule m_BakedTextureModule;
public void Initialise(IConfigSource source) public void Initialise(IConfigSource source)
{ {
IConfig config = source.Configs["ClientStack.LindenCaps"];
if (config == null)
return;
m_URL = config.GetString("Cap_UploadBakedTexture", string.Empty);
IConfig appearanceConfig = source.Configs["Appearance"]; IConfig appearanceConfig = source.Configs["Appearance"];
if (appearanceConfig != null) if (appearanceConfig != null)
m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
@ -280,23 +287,28 @@ namespace OpenSim.Region.ClientStack.Linden
public void RegisterCaps(UUID agentID, Caps caps) public void RegisterCaps(UUID agentID, Caps caps)
{ {
UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler( UUID capID = UUID.Random();
caps, m_scene.AssetService, m_persistBakedTextures);
//caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture));
if (m_URL == "localhost")
caps.RegisterHandler( {
"UploadBakedTexture", UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler(
new RestStreamHandler( caps, m_scene.AssetService, m_persistBakedTextures);
"POST",
"/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, caps.RegisterHandler(
avatarhandler.UploadBakedTexture,
"UploadBakedTexture", "UploadBakedTexture",
agentID.ToString())); new RestStreamHandler(
"POST",
"/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath,
avatarhandler.UploadBakedTexture,
"UploadBakedTexture",
agentID.ToString()));
}
else
{
caps.RegisterHandler("UploadBakedTexture", m_URL);
}
} }
} }
} }

View File

@ -4703,10 +4703,14 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat("[SCENE OBJECT PART]: Updated PrimFlags on {0} {1} to {2}", Name, LocalId, Flags); // m_log.DebugFormat("[SCENE OBJECT PART]: Updated PrimFlags on {0} {1} to {2}", Name, LocalId, Flags);
} }
// Subscribe for physics collision events if needed for scripts and sounds /// <summary>
/// Subscribe for physics collision events if needed for scripts and sounds
/// </summary>
public void SubscribeForCollisionEvents() public void SubscribeForCollisionEvents()
{ {
if (PhysActor != null) PhysicsActor pa = PhysActor;
if (pa != null)
{ {
if ( if (
((AggregateScriptEvents & scriptEvents.collision) != 0) || ((AggregateScriptEvents & scriptEvents.collision) != 0) ||
@ -4724,20 +4728,20 @@ namespace OpenSim.Region.Framework.Scenes
(CollisionSound != UUID.Zero) (CollisionSound != UUID.Zero)
) )
{ {
if (!PhysActor.SubscribedEvents()) if (!pa.SubscribedEvents())
{ {
// If not already subscribed for event, set up for a collision event. // If not already subscribed for event, set up for a collision event.
PhysActor.OnCollisionUpdate += PhysicsCollision; pa.OnCollisionUpdate += PhysicsCollision;
PhysActor.SubscribeEvents(1000); pa.SubscribeEvents(1000);
} }
} }
else else
{ {
// There is no need to be subscribed to collisions so, if subscribed, remove subscription // There is no need to be subscribed to collisions so, if subscribed, remove subscription
if (PhysActor.SubscribedEvents()) if (pa.SubscribedEvents())
{ {
PhysActor.OnCollisionUpdate -= PhysicsCollision; pa.OnCollisionUpdate -= PhysicsCollision;
PhysActor.UnSubscribeEvents(); pa.UnSubscribeEvents();
} }
} }
} }

View File

@ -242,7 +242,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op") if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op")
{ {
m_coopTermination = true; m_coopTermination = true;
m_coopSleepHandle = new AutoResetEvent(false); m_coopSleepHandle = new XEngineEventWaitHandle(false, EventResetMode.AutoReset);
} }
} }
@ -1221,4 +1221,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
Suspended = false; Suspended = false;
} }
} }
}
/// <summary>
/// Xengine event wait handle.
/// </summary>
/// <remarks>
/// This class exists becase XEngineScriptBase gets a reference to this wait handle. We need to make sure that
/// when scripts are running in different AppDomains the lease does not expire.
/// FIXME: Like LSL_Api, etc., this effectively leaks memory since the GC will never collect it. To avoid this,
/// proper remoting sponsorship needs to be implemented across the board.
/// </remarks>
public class XEngineEventWaitHandle : EventWaitHandle
{
public XEngineEventWaitHandle(bool initialState, EventResetMode mode) : base(initialState, mode) {}
public override Object InitializeLifetimeService()
{
return null;
}
}
}

View File

@ -82,7 +82,16 @@ namespace OpenSim.Tests.Clients.AssetsClient
m_log.InfoFormat("[ASSET CLIENT]: [{0}] requested asset {1}", i, uuid); m_log.InfoFormat("[ASSET CLIENT]: [{0}] requested asset {1}", i, uuid);
} }
Thread.Sleep(20 * 1000); for (int i = 0; i < 500; i++)
{
var x = i;
ThreadPool.QueueUserWorkItem(delegate
{
Dummy(x);
});
}
Thread.Sleep(30 * 1000);
m_log.InfoFormat("[ASSET CLIENT]: Received responses {0}", m_NReceived); m_log.InfoFormat("[ASSET CLIENT]: Received responses {0}", m_NReceived);
} }
@ -92,8 +101,16 @@ namespace OpenSim.Tests.Clients.AssetsClient
m_MaxThreadID = Thread.CurrentThread.ManagedThreadId; m_MaxThreadID = Thread.CurrentThread.ManagedThreadId;
int max1, max2; int max1, max2;
ThreadPool.GetAvailableThreads(out max1, out max2); ThreadPool.GetAvailableThreads(out max1, out max2);
m_log.InfoFormat("[ASSET CLIENT]: Received asset {0} ({1}) ({2}-{3})", id, m_MaxThreadID, max1, max2); m_log.InfoFormat("[ASSET CLIENT]: Received asset {0} ({1}) ({2}-{3}) {4}", id, m_MaxThreadID, max1, max2, DateTime.Now.ToString("hh:mm:ss"));
m_NReceived++; m_NReceived++;
} }
private static void Dummy(int i)
{
int max1, max2;
ThreadPool.GetAvailableThreads(out max1, out max2);
m_log.InfoFormat("[ASSET CLIENT]: ({0}) Hello! {1} - {2} {3}", i, max1, max2, DateTime.Now.ToString("hh:mm:ss"));
Thread.Sleep(2000);
}
} }
} }