Merge branch 'master' into httptests

httptests
UbitUmarov 2017-06-14 03:04:14 +01:00
commit 84946e3061
42 changed files with 733 additions and 283 deletions

View File

@ -57,7 +57,8 @@ namespace OpenSim.Framework.Monitoring
/// <remarks> /// <remarks>
/// Will be null if no job is currently running. /// Will be null if no job is currently running.
/// </remarks> /// </remarks>
public Job CurrentJob { get; private set; } private Job m_currentJob;
public Job CurrentJob { get { return m_currentJob;} }
/// <summary> /// <summary>
/// Number of jobs waiting to be processed. /// Number of jobs waiting to be processed.
@ -82,16 +83,15 @@ namespace OpenSim.Framework.Monitoring
private CancellationTokenSource m_cancelSource; private CancellationTokenSource m_cancelSource;
/// <summary> private int m_timeout = -1;
/// Used to signal that we are ready to complete stop.
/// </summary>
private ManualResetEvent m_finishedProcessingAfterStop = new ManualResetEvent(false);
public JobEngine(string name, string loggingName) private bool m_threadRunnig = false;
public JobEngine(string name, string loggingName, int timeout = -1)
{ {
Name = name; Name = name;
LoggingName = loggingName; LoggingName = loggingName;
m_timeout = timeout;
RequestProcessTimeoutOnStop = 5000; RequestProcessTimeoutOnStop = 5000;
} }
@ -104,18 +104,9 @@ namespace OpenSim.Framework.Monitoring
IsRunning = true; IsRunning = true;
m_finishedProcessingAfterStop.Reset();
m_cancelSource = new CancellationTokenSource(); m_cancelSource = new CancellationTokenSource();
WorkManager.RunInThreadPool(ProcessRequests, null, Name, false);
WorkManager.StartThread( m_threadRunnig = true;
ProcessRequests,
Name,
ThreadPriority.Normal,
false,
true,
null,
int.MaxValue);
} }
} }
@ -131,20 +122,16 @@ namespace OpenSim.Framework.Monitoring
m_log.DebugFormat("[JobEngine] Stopping {0}", Name); m_log.DebugFormat("[JobEngine] Stopping {0}", Name);
IsRunning = false; IsRunning = false;
if(m_threadRunnig)
m_finishedProcessingAfterStop.Reset(); {
if(m_jobQueue.Count <= 0)
m_cancelSource.Cancel(); m_cancelSource.Cancel();
m_threadRunnig = false;
m_finishedProcessingAfterStop.WaitOne(RequestProcessTimeoutOnStop); }
m_finishedProcessingAfterStop.Close();
} }
finally finally
{ {
if(m_cancelSource != null) if(m_cancelSource != null)
m_cancelSource.Dispose(); m_cancelSource.Dispose();
if(m_finishedProcessingAfterStop != null)
m_finishedProcessingAfterStop.Dispose();
} }
} }
} }
@ -203,6 +190,18 @@ namespace OpenSim.Framework.Monitoring
/// </param> /// </param>
public bool QueueJob(Job job) public bool QueueJob(Job job)
{ {
lock(JobLock)
{
if(!IsRunning)
return false;
if(!m_threadRunnig)
{
WorkManager.RunInThreadPool(ProcessRequests, null, Name, false);
m_threadRunnig = true;
}
}
if (m_jobQueue.Count < m_jobQueue.BoundedCapacity) if (m_jobQueue.Count < m_jobQueue.BoundedCapacity)
{ {
m_jobQueue.Add(job); m_jobQueue.Add(job);
@ -222,31 +221,28 @@ namespace OpenSim.Framework.Monitoring
m_warnOverMaxQueue = false; m_warnOverMaxQueue = false;
} }
return false; return false;
} }
} }
private void ProcessRequests() private void ProcessRequests(Object o)
{ {
while(IsRunning || m_jobQueue.Count > 0) while(IsRunning)
{ {
try try
{ {
CurrentJob = m_jobQueue.Take(m_cancelSource.Token); if(!m_jobQueue.TryTake(out m_currentJob, m_timeout, m_cancelSource.Token))
{
lock(JobLock)
m_threadRunnig = false;
break;
}
} }
catch(ObjectDisposedException e) catch(ObjectDisposedException e)
{ {
// If we see this whilst not running then it may be due to a race where this thread checks m_log.DebugFormat("[JobEngine] {0} stopping ignoring {1} jobs in queue",
// IsRunning after the stopping thread sets it to false and disposes of the cancellation source. Name,m_jobQueue.Count);
if(IsRunning) break;
throw e;
else
{
m_log.DebugFormat("[JobEngine] {0} stopping ignoring {1} jobs in queue",
Name,m_jobQueue.Count);
break;
}
} }
catch(OperationCanceledException) catch(OperationCanceledException)
{ {
@ -254,27 +250,24 @@ namespace OpenSim.Framework.Monitoring
} }
if(LogLevel >= 1) if(LogLevel >= 1)
m_log.DebugFormat("[{0}]: Processing job {1}",LoggingName,CurrentJob.Name); m_log.DebugFormat("[{0}]: Processing job {1}",LoggingName,m_currentJob.Name);
try try
{ {
CurrentJob.Action(); m_currentJob.Action();
} }
catch(Exception e) catch(Exception e)
{ {
m_log.Error( m_log.Error(
string.Format( string.Format(
"[{0}]: Job {1} failed, continuing. Exception ",LoggingName,CurrentJob.Name),e); "[{0}]: Job {1} failed, continuing. Exception ",LoggingName,m_currentJob.Name),e);
} }
if(LogLevel >= 1) if(LogLevel >= 1)
m_log.DebugFormat("[{0}]: Processed job {1}",LoggingName,CurrentJob.Name); m_log.DebugFormat("[{0}]: Processed job {1}",LoggingName,m_currentJob.Name);
CurrentJob = null; m_currentJob = null;
} }
Watchdog.RemoveThread(false);
m_finishedProcessingAfterStop.Set();
} }
public class Job public class Job

View File

@ -57,7 +57,7 @@ namespace OpenSim.Framework.Monitoring
static WorkManager() static WorkManager()
{ {
JobEngine = new JobEngine("Non-blocking non-critical job engine", "JOB ENGINE"); JobEngine = new JobEngine("Non-blocking non-critical job engine", "JOB ENGINE", 30000);
StatsManager.RegisterStat( StatsManager.RegisterStat(
new Stat( new Stat(
@ -182,9 +182,9 @@ namespace OpenSim.Framework.Monitoring
/// <param name="callback"></param> /// <param name="callback"></param>
/// <param name="obj"></param> /// <param name="obj"></param>
/// <param name="name">The name of the job. This is used in monitoring and debugging.</param> /// <param name="name">The name of the job. This is used in monitoring and debugging.</param>
public static void RunInThreadPool(System.Threading.WaitCallback callback, object obj, string name) public static void RunInThreadPool(System.Threading.WaitCallback callback, object obj, string name, bool timeout = true)
{ {
Util.FireAndForget(callback, obj, name); Util.FireAndForget(callback, obj, name, timeout);
} }
/// <summary> /// <summary>
@ -231,10 +231,8 @@ namespace OpenSim.Framework.Monitoring
JobEngine.QueueJob(name, () => callback(obj)); JobEngine.QueueJob(name, () => callback(obj));
else if (canRunInThisThread) else if (canRunInThisThread)
callback(obj); callback(obj);
else if (mustNotTimeout)
RunInThread(callback, obj, name, log);
else else
Util.FireAndForget(callback, obj, name); Util.FireAndForget(callback, obj, name, !mustNotTimeout);
} }
private static void HandleControlCommand(string module, string[] args) private static void HandleControlCommand(string module, string[] args)

View File

@ -2492,8 +2492,9 @@ namespace OpenSim.Framework
public bool Running { get; set; } public bool Running { get; set; }
public bool Aborted { get; set; } public bool Aborted { get; set; }
private int started; private int started;
public bool DoTimeout;
public ThreadInfo(long threadFuncNum, string context) public ThreadInfo(long threadFuncNum, string context, bool dotimeout = true)
{ {
ThreadFuncNum = threadFuncNum; ThreadFuncNum = threadFuncNum;
this.context = context; this.context = context;
@ -2501,6 +2502,7 @@ namespace OpenSim.Framework
Thread = null; Thread = null;
Running = false; Running = false;
Aborted = false; Aborted = false;
DoTimeout = dotimeout;
} }
public void Started() public void Started()
@ -2571,7 +2573,7 @@ namespace OpenSim.Framework
foreach (KeyValuePair<long, ThreadInfo> entry in activeThreads) foreach (KeyValuePair<long, ThreadInfo> entry in activeThreads)
{ {
ThreadInfo t = entry.Value; ThreadInfo t = entry.Value;
if (t.Running && !t.Aborted && (t.Elapsed() >= THREAD_TIMEOUT)) if (t.DoTimeout && t.Running && !t.Aborted && (t.Elapsed() >= THREAD_TIMEOUT))
{ {
m_log.WarnFormat("Timeout in threadfunc {0} ({1}) {2}", t.ThreadFuncNum, t.Thread.Name, t.GetStackTrace()); m_log.WarnFormat("Timeout in threadfunc {0} ({1}) {2}", t.ThreadFuncNum, t.Thread.Name, t.GetStackTrace());
t.Abort(); t.Abort();
@ -2612,7 +2614,7 @@ namespace OpenSim.Framework
FireAndForget(callback, obj, null); FireAndForget(callback, obj, null);
} }
public static void FireAndForget(System.Threading.WaitCallback callback, object obj, string context) public static void FireAndForget(System.Threading.WaitCallback callback, object obj, string context, bool dotimeout = true)
{ {
Interlocked.Increment(ref numTotalThreadFuncsCalled); Interlocked.Increment(ref numTotalThreadFuncsCalled);
@ -2634,7 +2636,7 @@ namespace OpenSim.Framework
bool loggingEnabled = LogThreadPool > 0; bool loggingEnabled = LogThreadPool > 0;
long threadFuncNum = Interlocked.Increment(ref nextThreadFuncNum); long threadFuncNum = Interlocked.Increment(ref nextThreadFuncNum);
ThreadInfo threadInfo = new ThreadInfo(threadFuncNum, context); ThreadInfo threadInfo = new ThreadInfo(threadFuncNum, context, dotimeout);
if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest) if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest)
{ {

View File

@ -1262,18 +1262,24 @@ namespace OpenSim.Framework
{ {
if (hwr.StatusCode == HttpStatusCode.NotFound) if (hwr.StatusCode == HttpStatusCode.NotFound)
return deserial; return deserial;
if (hwr.StatusCode == HttpStatusCode.Unauthorized) if (hwr.StatusCode == HttpStatusCode.Unauthorized)
{ {
m_log.Error(string.Format( m_log.ErrorFormat("[SynchronousRestObjectRequester]: Web request {0} requires authentication",
"[SynchronousRestObjectRequester]: Web request {0} requires authentication ", requestUrl);
requestUrl)); }
return deserial; else
{
m_log.WarnFormat("[SynchronousRestObjectRequester]: Web request {0} returned error: {1}",
requestUrl, hwr.StatusCode);
} }
} }
else else
m_log.Error(string.Format( m_log.ErrorFormat(
"[SynchronousRestObjectRequester]: WebException for {0} {1} {2} ", "[SynchronousRestObjectRequester]: WebException for {0} {1} {2} {3}",
verb, requestUrl, typeof(TResponse).ToString()), e); verb, requestUrl, typeof(TResponse).ToString(), e.Message);
return deserial;
} }
} }
catch (System.InvalidOperationException) catch (System.InvalidOperationException)

View File

@ -325,6 +325,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// </summary> /// </summary>
public LLImageManager ImageManager { get; private set; } public LLImageManager ImageManager { get; private set; }
public JobEngine m_asyncPacketProcess;
private readonly LLUDPServer m_udpServer; private readonly LLUDPServer m_udpServer;
private readonly LLUDPClient m_udpClient; private readonly LLUDPClient m_udpClient;
private readonly UUID m_sessionId; private readonly UUID m_sessionId;
@ -378,7 +379,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected Scene m_scene; protected Scene m_scene;
protected string m_firstName; protected string m_firstName;
protected string m_lastName; protected string m_lastName;
protected Thread m_clientThread;
protected Vector3 m_startpos; protected Vector3 m_startpos;
protected UUID m_activeGroupID; protected UUID m_activeGroupID;
protected string m_activeGroupName = String.Empty; protected string m_activeGroupName = String.Empty;
@ -529,7 +529,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_prioritizer = new Prioritizer(m_scene); m_prioritizer = new Prioritizer(m_scene);
RegisterLocalPacketHandlers(); RegisterLocalPacketHandlers();
string name = string.Format("AsyncInUDP-{0}",m_agentId.ToString());
m_asyncPacketProcess = new JobEngine(name, name, 10000);
IsActive = true; IsActive = true;
} }
@ -592,6 +593,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (OnConnectionClosed != null) if (OnConnectionClosed != null)
OnConnectionClosed(this); OnConnectionClosed(this);
m_asyncPacketProcess.Stop();
// Flush all of the packets out of the UDP server for this client // Flush all of the packets out of the UDP server for this client
if (m_udpServer != null) if (m_udpServer != null)
@ -778,12 +780,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
cinfo.AsyncRequests[packet.Type.ToString()]++; cinfo.AsyncRequests[packet.Type.ToString()]++;
object obj = new AsyncPacketProcess(this, pprocessor.method, packet); object obj = new AsyncPacketProcess(this, pprocessor.method, packet);
/*
if (pprocessor.InEngine) if (pprocessor.InEngine)
m_udpServer.IpahEngine.QueueJob(packet.Type.ToString(), () => ProcessSpecificPacketAsync(obj)); m_udpServer.IpahEngine.QueueJob(packet.Type.ToString(), () => ProcessSpecificPacketAsync(obj));
else else
Util.FireAndForget(ProcessSpecificPacketAsync, obj, packet.Type.ToString()); Util.FireAndForget(ProcessSpecificPacketAsync, obj, packet.Type.ToString());
*/
m_asyncPacketProcess.QueueJob(packet.Type.ToString(), () => ProcessSpecificPacketAsync(obj));
result = true; result = true;
} }
else else
@ -841,6 +844,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public virtual void Start() public virtual void Start()
{ {
m_asyncPacketProcess.Start();
m_scene.AddNewAgent(this, PresenceType.User); m_scene.AddNewAgent(this, PresenceType.User);
// RefreshGroupMembership(); // RefreshGroupMembership();
@ -6036,8 +6040,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
AddLocalPacketHandler(PacketType.ObjectExtraParams, HandleObjectExtraParams); AddLocalPacketHandler(PacketType.ObjectExtraParams, HandleObjectExtraParams);
AddLocalPacketHandler(PacketType.ObjectDuplicate, HandleObjectDuplicate); AddLocalPacketHandler(PacketType.ObjectDuplicate, HandleObjectDuplicate);
AddLocalPacketHandler(PacketType.RequestMultipleObjects, HandleRequestMultipleObjects); AddLocalPacketHandler(PacketType.RequestMultipleObjects, HandleRequestMultipleObjects);
AddLocalPacketHandler(PacketType.ObjectSelect, HandleObjectSelect); AddLocalPacketHandler(PacketType.ObjectSelect, HandleObjectSelect, true, true);
AddLocalPacketHandler(PacketType.ObjectDeselect, HandleObjectDeselect); AddLocalPacketHandler(PacketType.ObjectDeselect, HandleObjectDeselect, true, true);
AddLocalPacketHandler(PacketType.ObjectPosition, HandleObjectPosition); AddLocalPacketHandler(PacketType.ObjectPosition, HandleObjectPosition);
AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale); AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale);
AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation); AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation);
@ -8030,19 +8034,41 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return true; return true;
} }
Dictionary<uint, uint> objImageSeqs = null;
double lastobjImageSeqsMS = 0.0;
private bool HandleObjectImage(IClientAPI sender, Packet Pack) private bool HandleObjectImage(IClientAPI sender, Packet Pack)
{ {
ObjectImagePacket imagePack = (ObjectImagePacket)Pack; ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
UpdatePrimTexture handlerUpdatePrimTexture = null; UpdatePrimTexture handlerUpdatePrimTexture = OnUpdatePrimTexture;
if (handlerUpdatePrimTexture == null)
return true;
double now = Util.GetTimeStampMS();
if(objImageSeqs == null || ( now - lastobjImageSeqsMS > 30000.0))
{
objImageSeqs = null; // yeah i know superstition...
objImageSeqs = new Dictionary<uint, uint>(16);
}
lastobjImageSeqsMS = now;
uint seq = Pack.Header.Sequence;
uint id;
uint lastseq;
ObjectImagePacket.ObjectDataBlock o;
for (int i = 0; i < imagePack.ObjectData.Length; i++) for (int i = 0; i < imagePack.ObjectData.Length; i++)
{ {
handlerUpdatePrimTexture = OnUpdatePrimTexture; o = imagePack.ObjectData[i];
if (handlerUpdatePrimTexture != null) id = o.ObjectLocalID;
{ if(objImageSeqs.TryGetValue(id, out lastseq))
handlerUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID, {
imagePack.ObjectData[i].TextureEntry, this); if(seq <= lastseq)
} continue;
}
objImageSeqs[id] = seq;
handlerUpdatePrimTexture(id, o.TextureEntry, this);
} }
return true; return true;
} }

View File

@ -312,9 +312,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// stack. Use zero to leave this value as the default</summary> /// stack. Use zero to leave this value as the default</summary>
protected int m_recvBufferSize; protected int m_recvBufferSize;
/// <summary>Flag to process packets asynchronously or synchronously</summary>
protected bool m_asyncPacketHandling;
/// <summary>Tracks whether or not a packet was sent each round so we know /// <summary>Tracks whether or not a packet was sent each round so we know
/// whether or not to sleep</summary> /// whether or not to sleep</summary>
protected bool m_packetSent; protected bool m_packetSent;
@ -417,7 +414,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Queue some low priority but potentially high volume async requests so that they don't overwhelm available /// Queue some low priority but potentially high volume async requests so that they don't overwhelm available
/// threadpool threads. /// threadpool threads.
/// </summary> /// </summary>
public JobEngine IpahEngine { get; protected set; } // public JobEngine IpahEngine { get; protected set; }
/// <summary> /// <summary>
/// Run queue empty processing within a single persistent thread. /// Run queue empty processing within a single persistent thread.
@ -473,7 +470,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
IConfig config = configSource.Configs["ClientStack.LindenUDP"]; IConfig config = configSource.Configs["ClientStack.LindenUDP"];
if (config != null) if (config != null)
{ {
m_asyncPacketHandling = config.GetBoolean("async_packet_handling", true);
m_recvBufferSize = config.GetInt("client_socket_rcvbuf_size", 0); m_recvBufferSize = config.GetInt("client_socket_rcvbuf_size", 0);
sceneThrottleBps = config.GetInt("scene_throttle_max_bps", 0); sceneThrottleBps = config.GetInt("scene_throttle_max_bps", 0);
@ -531,7 +527,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
StartInbound(); StartInbound();
StartOutbound(); StartOutbound();
IpahEngine.Start(); // IpahEngine.Start();
OqrEngine.Start(); OqrEngine.Start();
m_elapsedMSSinceLastStatReport = Environment.TickCount; m_elapsedMSSinceLastStatReport = Environment.TickCount;
@ -540,10 +536,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void StartInbound() public void StartInbound()
{ {
m_log.InfoFormat( m_log.InfoFormat(
"[LLUDPSERVER]: Starting inbound packet processing for the LLUDP server in {0} mode with UsePools = {1}", "[LLUDPSERVER]: Starting inbound packet processing for the LLUDP server");
m_asyncPacketHandling ? "asynchronous" : "synchronous", UsePools);
base.StartInbound(m_recvBufferSize, m_asyncPacketHandling); base.StartInbound(m_recvBufferSize);
// This thread will process the packets received that are placed on the packetInbox // This thread will process the packets received that are placed on the packetInbox
WorkManager.StartThread( WorkManager.StartThread(
@ -577,7 +572,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_log.Info("[LLUDPSERVER]: Shutting down the LLUDP server for " + Scene.Name); m_log.Info("[LLUDPSERVER]: Shutting down the LLUDP server for " + Scene.Name);
base.StopOutbound(); base.StopOutbound();
base.StopInbound(); base.StopInbound();
IpahEngine.Stop(); // IpahEngine.Stop();
OqrEngine.Stop(); OqrEngine.Stop();
} }
@ -696,12 +691,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
Scene = (Scene)scene; Scene = (Scene)scene;
m_location = new Location(Scene.RegionInfo.RegionHandle); m_location = new Location(Scene.RegionInfo.RegionHandle);
/*
IpahEngine IpahEngine
= new JobEngine( = new JobEngine(
string.Format("Incoming Packet Async Handling Engine ({0})", Scene.Name), string.Format("Incoming Packet Async Handling Engine ({0})", Scene.Name),
"INCOMING PACKET ASYNC HANDLING ENGINE"); "INCOMING PACKET ASYNC HANDLING ENGINE");
*/
OqrEngine OqrEngine
= new JobEngine( = new JobEngine(
string.Format("Outgoing Queue Refill Engine ({0})", Scene.Name), string.Format("Outgoing Queue Refill Engine ({0})", Scene.Name),
@ -786,7 +781,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
MeasuresOfInterest.AverageChangeOverTime, MeasuresOfInterest.AverageChangeOverTime,
stat => stat.Value = GetTotalQueuedOutgoingPackets(), stat => stat.Value = GetTotalQueuedOutgoingPackets(),
StatVerbosity.Info)); StatVerbosity.Info));
/*
StatsManager.RegisterStat( StatsManager.RegisterStat(
new Stat( new Stat(
"IncomingPacketAsyncRequestsWaiting", "IncomingPacketAsyncRequestsWaiting",
@ -799,7 +794,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
MeasuresOfInterest.None, MeasuresOfInterest.None,
stat => stat.Value = IpahEngine.JobsWaiting, stat => stat.Value = IpahEngine.JobsWaiting,
StatVerbosity.Debug)); StatVerbosity.Debug));
*/
StatsManager.RegisterStat( StatsManager.RegisterStat(
new Stat( new Stat(
"OQRERequestsWaiting", "OQRERequestsWaiting",
@ -1227,7 +1222,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
outgoingPacket.SequenceNumber, isReliable, isResend, udpClient.AgentID, Scene.Name); outgoingPacket.SequenceNumber, isReliable, isResend, udpClient.AgentID, Scene.Name);
// Put the UDP payload on the wire // Put the UDP payload on the wire
AsyncBeginSend(buffer); // AsyncBeginSend(buffer);
SyncSend(buffer);
// Keep track of when this packet was sent out (right now) // Keep track of when this packet was sent out (right now)
outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue; outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue;
@ -1912,7 +1908,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length); Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length);
AsyncBeginSend(buffer); // AsyncBeginSend(buffer);
SyncSend(buffer);
} }
protected bool IsClientAuthorized(UseCircuitCodePacket useCircuitCode, out AuthenticateResponse sessionInfo) protected bool IsClientAuthorized(UseCircuitCodePacket useCircuitCode, out AuthenticateResponse sessionInfo)

View File

@ -57,9 +57,6 @@ namespace OpenMetaverse
/// <summary>UDP socket, used in either client or server mode</summary> /// <summary>UDP socket, used in either client or server mode</summary>
private Socket m_udpSocket; private Socket m_udpSocket;
/// <summary>Flag to process packets asynchronously or synchronously</summary>
private bool m_asyncPacketHandling;
/// <summary> /// <summary>
/// Are we to use object pool(s) to reduce memory churn when receiving data? /// Are we to use object pool(s) to reduce memory churn when receiving data?
/// </summary> /// </summary>
@ -205,10 +202,8 @@ namespace OpenMetaverse
/// manner (not throwing an exception when the remote side resets the /// manner (not throwing an exception when the remote side resets the
/// connection). This call is ignored on Mono where the flag is not /// connection). This call is ignored on Mono where the flag is not
/// necessary</remarks> /// necessary</remarks>
public virtual void StartInbound(int recvBufferSize, bool asyncPacketHandling) public virtual void StartInbound(int recvBufferSize)
{ {
m_asyncPacketHandling = asyncPacketHandling;
if (!IsRunningInbound) if (!IsRunningInbound)
{ {
m_log.DebugFormat("[UDPBASE]: Starting inbound UDP loop"); m_log.DebugFormat("[UDPBASE]: Starting inbound UDP loop");
@ -407,12 +402,7 @@ namespace OpenMetaverse
if (IsRunningInbound) if (IsRunningInbound)
{ {
UdpReceives++; UdpReceives++;
// Asynchronous mode will start another receive before the
// callback for this packet is even fired. Very parallel :-)
if (m_asyncPacketHandling)
AsyncBeginReceive();
try try
{ {
// get the buffer that was created in AsyncBeginReceive // get the buffer that was created in AsyncBeginReceive
@ -469,10 +459,7 @@ namespace OpenMetaverse
// if (UsePools) // if (UsePools)
// Pool.ReturnObject(buffer); // Pool.ReturnObject(buffer);
// Synchronous mode waits until the packet callback completes AsyncBeginReceive();
// before starting the receive to fetch another packet
if (!m_asyncPacketHandling)
AsyncBeginReceive();
} }
} }
} }
@ -500,7 +487,7 @@ namespace OpenMetaverse
} }
catch (SocketException) { } catch (SocketException) { }
catch (ObjectDisposedException) { } catch (ObjectDisposedException) { }
// } // }
} }
void AsyncEndSend(IAsyncResult result) void AsyncEndSend(IAsyncResult result)
@ -515,5 +502,25 @@ namespace OpenMetaverse
catch (SocketException) { } catch (SocketException) { }
catch (ObjectDisposedException) { } catch (ObjectDisposedException) { }
} }
public void SyncSend(UDPPacketBuffer buf)
{
try
{
m_udpSocket.SendTo(
buf.Data,
0,
buf.DataLength,
SocketFlags.None,
buf.RemoteEndPoint
);
UdpSends++;
}
catch (SocketException e)
{
m_log.Warn("[UDPBASE]: sync send SocketException {0} " + e.Message);
}
catch (ObjectDisposedException) { }
}
} }
} }

View File

@ -91,6 +91,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
/// <summary> /// <summary>
/// Test adding a client to the stack /// Test adding a client to the stack
/// </summary> /// </summary>
/*
[Test] [Test]
public void TestAddClient() public void TestAddClient()
{ {
@ -165,7 +166,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
ScenePresence spAfterAckTimeout = m_scene.GetScenePresence(sp.UUID); ScenePresence spAfterAckTimeout = m_scene.GetScenePresence(sp.UUID);
Assert.That(spAfterAckTimeout, Is.Null); Assert.That(spAfterAckTimeout, Is.Null);
} }
*/
// /// <summary> // /// <summary>
// /// Test removing a client from the stack // /// Test removing a client from the stack
// /// </summary> // /// </summary>

View File

@ -163,7 +163,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
m_incomingSceneObjectEngine m_incomingSceneObjectEngine
= new JobEngine( = new JobEngine(
string.Format("HG Incoming Scene Object Engine ({0})", scene.Name), string.Format("HG Incoming Scene Object Engine ({0})", scene.Name),
"HG INCOMING SCENE OBJECT ENGINE"); "HG INCOMING SCENE OBJECT ENGINE", 30000);
StatsManager.RegisterStat( StatsManager.RegisterStat(
new Stat( new Stat(

View File

@ -2865,7 +2865,7 @@ namespace OpenSim.Region.Framework.Scenes
root.SendPropertiesToClient(sp.ControllingClient); root.SendPropertiesToClient(sp.ControllingClient);
if (oldUsePhysics && (root.Flags & PrimFlags.Physics) == 0) if (oldUsePhysics && (root.Flags & PrimFlags.Physics) == 0)
{ {
sp.ControllingClient.SendAlertMessage("Object physics canceled"); sp.ControllingClient.SendAlertMessage("Object physics cancelled");
} }
} }
} }

View File

@ -1604,13 +1604,16 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
protected internal void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient) protected internal void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient)
{ {
SceneObjectGroup group = GetGroupByPrim(localID); SceneObjectPart part = GetSceneObjectPart(localID);
if(part == null)
return;
if (group != null) SceneObjectGroup group = part.ParentGroup;
if (group != null && !group.IsDeleted)
{ {
if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) if (m_parentScene.Permissions.CanEditObject(group, remoteClient))
{ {
group.UpdateTextureEntry(localID, texture); part.UpdateTextureEntry(texture);
} }
} }
} }
@ -1661,8 +1664,11 @@ namespace OpenSim.Region.Framework.Scenes
if (wantedPhys != group.UsesPhysics && remoteClient != null) if (wantedPhys != group.UsesPhysics && remoteClient != null)
{ {
remoteClient.SendAlertMessage("Object physics canceled because exceeds the limit of " + if(m_parentScene.m_linksetPhysCapacity != 0)
m_parentScene.m_linksetPhysCapacity + " physical prims with shape type not set to None"); remoteClient.SendAlertMessage("Object physics cancelled because it exceeds limits for physical prims, either size or number of primswith shape type not set to None");
else
remoteClient.SendAlertMessage("Object physics cancelled because it exceeds size limits for physical prims");
group.RootPart.ScheduleFullUpdate(); group.RootPart.ScheduleFullUpdate();
} }
} }

View File

@ -4129,20 +4129,6 @@ namespace OpenSim.Region.Framework.Scenes
return Parts.Count(); return Parts.Count();
} }
/// <summary>
/// Update the texture entry for this part
/// </summary>
/// <param name="localID"></param>
/// <param name="textureEntry"></param>
public void UpdateTextureEntry(uint localID, byte[] textureEntry)
{
SceneObjectPart part = GetPart(localID);
if (part != null)
{
part.UpdateTextureEntry(textureEntry);
}
}
public void AdjustChildPrimPermissions(bool forceTaskInventoryPermissive) public void AdjustChildPrimPermissions(bool forceTaskInventoryPermissive)
{ {
uint newOwnerMask = (uint)(PermissionMask.All | PermissionMask.Export) & 0xfffffff0; // Mask folded bits uint newOwnerMask = (uint)(PermissionMask.All | PermissionMask.Export) & 0xfffffff0; // Mask folded bits

View File

@ -5016,6 +5016,9 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
if (newTex.FaceTextures[i] != null) if (newTex.FaceTextures[i] != null)
newFace = newTex.FaceTextures[i]; newFace = newTex.FaceTextures[i];
if (oldFace.TextureID != newFace.TextureID)
changeFlags |= Changed.TEXTURE;
Color4 oldRGBA = oldFace.RGBA; Color4 oldRGBA = oldFace.RGBA;
Color4 newRGBA = newFace.RGBA; Color4 newRGBA = newFace.RGBA;
@ -5025,9 +5028,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
oldRGBA.A != newRGBA.A) oldRGBA.A != newRGBA.A)
changeFlags |= Changed.COLOR; changeFlags |= Changed.COLOR;
if (oldFace.TextureID != newFace.TextureID)
changeFlags |= Changed.TEXTURE;
// Max change, skip the rest of testing // Max change, skip the rest of testing
if (changeFlags == (Changed.TEXTURE | Changed.COLOR)) if (changeFlags == (Changed.TEXTURE | Changed.COLOR))
break; break;
@ -5053,17 +5053,11 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
m_shape.TextureEntry = newTex.GetBytes(); m_shape.TextureEntry = newTex.GetBytes();
if (changeFlags != 0) if (changeFlags != 0)
TriggerScriptChangedEvent(changeFlags); TriggerScriptChangedEvent(changeFlags);
UpdateFlag = UpdateRequired.FULL;
ParentGroup.HasGroupChanged = true; ParentGroup.HasGroupChanged = true;
//This is madness..
//ParentGroup.ScheduleGroupForFullUpdate();
//This is sparta
ScheduleFullUpdate(); ScheduleFullUpdate();
} }
} }
internal void UpdatePhysicsSubscribedEvents() internal void UpdatePhysicsSubscribedEvents()
{ {
PhysicsActor pa = PhysActor; PhysicsActor pa = PhysActor;

View File

@ -2280,18 +2280,13 @@ namespace OpenSim.Region.Framework.Scenes
m_lastChildAgentUpdateDrawDistance = DrawDistance; m_lastChildAgentUpdateDrawDistance = DrawDistance;
m_lastChildAgentUpdatePosition = AbsolutePosition; m_lastChildAgentUpdatePosition = AbsolutePosition;
m_childUpdatesBusy = false; // allow them m_childUpdatesBusy = false; // allow them
} }
m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts)); m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts));
// send the rest of the world // send the rest of the world
if (m_teleportFlags > 0 && !IsNPC || m_currentParcelHide) if (m_teleportFlags > 0 && !IsNPC || m_currentParcelHide)
SendInitialDataToMe(); SendInitialDataToMe();
// priority uses avatar position only // priority uses avatar position only
// m_reprioritizationLastPosition = AbsolutePosition; // m_reprioritizationLastPosition = AbsolutePosition;
@ -2958,31 +2953,32 @@ namespace OpenSim.Region.Framework.Scenes
Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN)); Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN));
MovementFlag &= noMovFlagsMask; MovementFlag &= noMovFlagsMask;
AgentControlFlags &= noMovFlagsMask; uint tmpAgentControlFlags = (uint)m_AgentControlFlags;
tmpAgentControlFlags &= noMovFlagsMask;
if (LocalVectorToTarget3D.X < 0) //MoveBack if (LocalVectorToTarget3D.X < 0) //MoveBack
{ {
MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
updated = true; updated = true;
} }
else if (LocalVectorToTarget3D.X > 0) //Move Forward else if (LocalVectorToTarget3D.X > 0) //Move Forward
{ {
MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
updated = true; updated = true;
} }
if (LocalVectorToTarget3D.Y > 0) //MoveLeft if (LocalVectorToTarget3D.Y > 0) //MoveLeft
{ {
MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
updated = true; updated = true;
} }
else if (LocalVectorToTarget3D.Y < 0) //MoveRight else if (LocalVectorToTarget3D.Y < 0) //MoveRight
{ {
MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
updated = true; updated = true;
} }
@ -3006,6 +3002,7 @@ namespace OpenSim.Region.Framework.Scenes
// "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}", // "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}",
// LocalVectorToTarget3D, agent_control_v3, Name); // LocalVectorToTarget3D, agent_control_v3, Name);
m_AgentControlFlags = (AgentManager.ControlFlags) tmpAgentControlFlags;
agent_control_v3 += LocalVectorToTarget3D; agent_control_v3 += LocalVectorToTarget3D;
} }
catch (Exception e) catch (Exception e)
@ -4970,8 +4967,8 @@ namespace OpenSim.Region.Framework.Scenes
// if (m_updateCount > 0) // if (m_updateCount > 0)
// { // {
if (Animator != null && Animator.UpdateMovementAnimations()) // if (Animator != null && Animator.UpdateMovementAnimations())
TriggerScenePresenceUpdated(); // TriggerScenePresenceUpdated();
// m_updateCount--; // m_updateCount--;
// } // }

View File

@ -60,7 +60,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
TestScene scene = new SceneHelpers().SetupScene(); TestScene scene = new SceneHelpers().SetupScene();
ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
sp.Flying = true; sp.Flying = true;
sp.PhysicsCollisionUpdate(new CollisionEventUpdate()); sp.Animator.UpdateMovementAnimations();
Assert.That(sp.Animator.CurrentMovementAnimation, Is.EqualTo("HOVER")); Assert.That(sp.Animator.CurrentMovementAnimation, Is.EqualTo("HOVER"));
} }

View File

@ -80,7 +80,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
public float MeshSculptphysicalLOD = 32; public float MeshSculptphysicalLOD = 32;
private OpenSim.Framework.BlockingQueue<ODEPhysRepData> createqueue = new OpenSim.Framework.BlockingQueue<ODEPhysRepData>(); private OpenSim.Framework.BlockingQueue<ODEPhysRepData> workQueue = new OpenSim.Framework.BlockingQueue<ODEPhysRepData>();
private bool m_running; private bool m_running;
private Thread m_thread; private Thread m_thread;
@ -110,7 +110,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
while(m_running) while(m_running)
{ {
ODEPhysRepData nextRep = createqueue.Dequeue(); ODEPhysRepData nextRep = workQueue.Dequeue();
if(!m_running) if(!m_running)
return; return;
if (nextRep == null) if (nextRep == null)
@ -139,7 +139,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
try try
{ {
m_thread.Abort(); m_thread.Abort();
createqueue.Clear(); workQueue.Clear();
} }
catch catch
{ {
@ -196,7 +196,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
repData.meshState = MeshState.loadingAsset; repData.meshState = MeshState.loadingAsset;
repData.comand = meshWorkerCmnds.getmesh; repData.comand = meshWorkerCmnds.getmesh;
createqueue.Enqueue(repData); workQueue.Enqueue(repData);
} }
} }
@ -242,7 +242,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
if (needsMeshing(repData)) // no need for pbs now? if (needsMeshing(repData)) // no need for pbs now?
{ {
repData.comand = meshWorkerCmnds.changefull; repData.comand = meshWorkerCmnds.changefull;
createqueue.Enqueue(repData); workQueue.Enqueue(repData);
} }
} }
else else

View File

@ -165,6 +165,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
private float m_density; private float m_density;
private byte m_shapetype; private byte m_shapetype;
private byte m_fakeShapetype;
public bool _zeroFlag; public bool _zeroFlag;
private bool m_lastUpdateSent; private bool m_lastUpdateSent;
@ -420,7 +421,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
{ {
if (value.IsFinite()) if (value.IsFinite())
{ {
_parent_scene.m_meshWorker.ChangeActorPhysRep(this, _pbs, value, m_shapetype); _parent_scene.m_meshWorker.ChangeActorPhysRep(this, _pbs, value, m_fakeShapetype);
} }
else else
{ {
@ -630,7 +631,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
set set
{ {
// AddChange(changes.Shape, value); // AddChange(changes.Shape, value);
_parent_scene.m_meshWorker.ChangeActorPhysRep(this, value, _size, m_shapetype); _parent_scene.m_meshWorker.ChangeActorPhysRep(this, value, _size, m_fakeShapetype);
} }
} }
@ -638,11 +639,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde
{ {
get get
{ {
return m_shapetype; return m_fakeShapetype;
} }
set set
{ {
m_shapetype = value; m_fakeShapetype = value;
_parent_scene.m_meshWorker.ChangeActorPhysRep(this, _pbs, _size, value); _parent_scene.m_meshWorker.ChangeActorPhysRep(this, _pbs, _size, value);
} }
} }
@ -1329,7 +1330,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
_triMeshData = IntPtr.Zero; _triMeshData = IntPtr.Zero;
m_shapetype = _shapeType; m_fakeShapetype = _shapeType;
m_lastdoneSelected = false; m_lastdoneSelected = false;
m_isSelected = false; m_isSelected = false;
@ -1346,7 +1347,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
AddChange(changes.Add, null); AddChange(changes.Add, null);
// get basic mass parameters // get basic mass parameters
ODEPhysRepData repData = _parent_scene.m_meshWorker.NewActorPhysRep(this, _pbs, _size, m_shapetype); ODEPhysRepData repData = _parent_scene.m_meshWorker.NewActorPhysRep(this, _pbs, _size, _shapeType);
primVolume = repData.volume; primVolume = repData.volume;
m_OBB = repData.OBB; m_OBB = repData.OBB;
@ -3161,7 +3162,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
{ {
_size = repData.size; //?? _size = repData.size; //??
_pbs = repData.pbs; _pbs = repData.pbs;
m_shapetype = repData.shapetype;
m_mesh = repData.mesh; m_mesh = repData.mesh;
@ -3200,9 +3200,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde
{ {
repData.size = _size; repData.size = _size;
repData.pbs = _pbs; repData.pbs = _pbs;
repData.shapetype = m_shapetype; repData.shapetype = m_fakeShapetype;
_parent_scene.m_meshWorker.RequestMesh(repData); _parent_scene.m_meshWorker.RequestMesh(repData);
} }
else
m_shapetype = repData.shapetype;
} }
private void changePhysRepData(ODEPhysRepData repData) private void changePhysRepData(ODEPhysRepData repData)
@ -3236,7 +3238,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
_size = repData.size; _size = repData.size;
_pbs = repData.pbs; _pbs = repData.pbs;
m_shapetype = repData.shapetype;
m_mesh = repData.mesh; m_mesh = repData.mesh;
@ -3287,9 +3288,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde
{ {
repData.size = _size; repData.size = _size;
repData.pbs = _pbs; repData.pbs = _pbs;
repData.shapetype = m_shapetype; repData.shapetype = m_fakeShapetype;
_parent_scene.m_meshWorker.RequestMesh(repData); _parent_scene.m_meshWorker.RequestMesh(repData);
} }
else
m_shapetype = repData.shapetype;
} }
private void changeFloatOnWater(bool newval) private void changeFloatOnWater(bool newval)

BIN
bin/OpenSim32.exe Normal file

Binary file not shown.

75
bin/OpenSim32.exe.config Normal file
View File

@ -0,0 +1,75 @@
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
<appSettings>
</appSettings>
<log4net>
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/>
<acceptOnMatch value="false"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss} - %message" />
<!-- console log with milliseconds. Useful for debugging -->
<!-- <conversionPattern value="%date{HH:mm:ss.fff} - %message" /> -->
</layout>
</appender>
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log/OpenSim.log" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyy-MM-dd"/>
...
-->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="OpenSim.log" />
<appendToFile value="true" />
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/>
<acceptOnMatch value="false"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %logger %message%newline" />
</layout>
</appender>
<appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
<file value="OpenSimStats.log"/>
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="LogFileAppender" />
</root>
<!-- Independently control logging level for XEngine -->
<logger name="OpenSim.Region.ScriptEngine.XEngine">
<level value="INFO"/>
</logger>
<!-- Independently control logging level for per region module loading -->
<logger name="OpenSim.ApplicationPlugins.RegionModulesController.RegionModulesControllerPlugin">
<level value="INFO"/>
</logger>
<!-- used for stats recording -->
<logger name="special.StatsLogger">
<appender-ref ref="StatsLogFileAppender"/>
</logger>
</log4net>
</configuration>

View File

@ -663,14 +663,6 @@
[ClientStack.LindenUDP] [ClientStack.LindenUDP]
; Set this to true to process incoming packets asynchronously. Networking is
; already separated from packet handling with a queue, so this will only
; affect whether networking internals such as packet decoding and
; acknowledgement accounting are done synchronously or asynchronously
; Default is true.
;
;async_packet_handling = true
; The client socket receive buffer size determines how many ; The client socket receive buffer size determines how many
; incoming requests we can process; the default on .NET is 8192 ; incoming requests we can process; the default on .NET is 8192
; which is about 2 4k-sized UDP datagrams. On mono this is ; which is about 2 4k-sized UDP datagrams. On mono this is

BIN
bin/Robust32.exe Normal file

Binary file not shown.

View File

@ -1,75 +1,72 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections> <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections> </configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<runtime> <runtime>
<loadFromRemoteSources enabled="true" /> <loadFromRemoteSources enabled="true" />
<gcConcurrent enabled="true" />
<gcServer enabled="true" />
</runtime> </runtime>
<appSettings> <appSettings>
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings> </appSettings>
<log4net> <log4net>
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
<filter type="log4net.Filter.LoggerMatchFilter"> <filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/> <loggerToMatch value="special" />
<acceptOnMatch value="false"/> <acceptOnMatch value="false" />
</filter> </filter>
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss} - %message" /> <conversionPattern value="%date{HH:mm:ss} - %message" />
<!-- console log with milliseconds. Useful for debugging -->
<!-- <conversionPattern value="%date{HH:mm:ss.fff} - %message" /> -->
</layout> </layout>
</appender> </appender>
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log/OpenSim.32BitLaunch.log" /> <file value="log/Robust.log" />
<rollingStyle value="Date" /> <rollingStyle value="Date" />
<datePattern value="'.'yyyy-MM-dd"/> <datePattern value="'.'yyyy-MM-dd"/>
... ...
--> -->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="OpenSim.32BitLaunch.log" /> <file value="Robust.log" />
<appendToFile value="true" /> <appendToFile value="true" />
<filter type="log4net.Filter.LoggerMatchFilter"> <filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/> <loggerToMatch value="special" />
<acceptOnMatch value="false"/> <acceptOnMatch value="false" />
</filter> </filter>
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %logger %message%newline" /> <conversionPattern value="%date %-5level - %logger %message%newline" />
</layout> </layout>
</appender> </appender>
<appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender"> <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
<file value="OpenSimStats.log"/> <file value="RobustStats.log" />
<appendToFile value="true" /> <appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" /> <conversionPattern value="%date - %message%newline" />
</layout> </layout>
</appender> </appender>
<root> <root>
<level value="DEBUG" /> <level value="DEBUG" />
<appender-ref ref="Console" /> <appender-ref ref="Console" />
<appender-ref ref="LogFileAppender" /> <appender-ref ref="LogFileAppender" />
</root> </root>
<!-- Independently control logging level for XEngine -->
<logger name="OpenSim.Region.ScriptEngine.XEngine">
<level value="INFO"/>
</logger>
<!-- Independently control logging level for per region module loading -->
<logger name="OpenSim.ApplicationPlugins.RegionModulesController.RegionModulesControllerPlugin">
<level value="INFO"/>
</logger>
<!-- used for stats recording --> <!-- used for stats recording -->
<logger name="special.StatsLogger"> <logger name="special.StatsLogger">
<appender-ref ref="StatsLogFileAppender"/> <appender-ref ref="StatsLogFileAppender" />
</logger> </logger>
</log4net> </log4net>
</configuration> <system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>

BIN
bin/Robust32.pdb Normal file

Binary file not shown.

BIN
bin/Robust32.vshost.exe Normal file

Binary file not shown.

View File

@ -1,63 +1,72 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections> <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections> </configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<runtime> <runtime>
<loadFromRemoteSources enabled="true" /> <loadFromRemoteSources enabled="true" />
<gcConcurrent enabled="true" />
<gcServer enabled="true" />
</runtime> </runtime>
<appSettings> <appSettings>
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings> </appSettings>
<log4net> <log4net>
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
<filter type="log4net.Filter.LoggerMatchFilter"> <filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/> <loggerToMatch value="special" />
<acceptOnMatch value="false"/> <acceptOnMatch value="false" />
</filter> </filter>
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss} - %message" /> <conversionPattern value="%date{HH:mm:ss} - %message" />
</layout> </layout>
</appender> </appender>
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log/Robust.32BitLaunch.log" /> <file value="log/Robust.log" />
<rollingStyle value="Date" /> <rollingStyle value="Date" />
<datePattern value="'.'yyyy-MM-dd"/> <datePattern value="'.'yyyy-MM-dd"/>
... ...
--> -->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="Robust.32BitLaunch.log" /> <file value="Robust.log" />
<appendToFile value="true" /> <appendToFile value="true" />
<filter type="log4net.Filter.LoggerMatchFilter"> <filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/> <loggerToMatch value="special" />
<acceptOnMatch value="false"/> <acceptOnMatch value="false" />
</filter> </filter>
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %logger %message%newline" /> <conversionPattern value="%date %-5level - %logger %message%newline" />
</layout> </layout>
</appender> </appender>
<appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender"> <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
<file value="RobustStats.log"/> <file value="RobustStats.log" />
<appendToFile value="true" /> <appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" /> <conversionPattern value="%date - %message%newline" />
</layout> </layout>
</appender> </appender>
<root> <root>
<level value="DEBUG" /> <level value="DEBUG" />
<appender-ref ref="Console" /> <appender-ref ref="Console" />
<appender-ref ref="LogFileAppender" /> <appender-ref ref="LogFileAppender" />
</root> </root>
<!-- used for stats recording --> <!-- used for stats recording -->
<logger name="special.StatsLogger"> <logger name="special.StatsLogger">
<appender-ref ref="StatsLogFileAppender"/> <appender-ref ref="StatsLogFileAppender" />
</logger> </logger>
</log4net> </log4net>
</configuration> <system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>

View File

@ -1,4 +0,0 @@
#!/bin/sh
echo "Starting OpenSimulator with ODE or ubOde. If you get an error saying limit: Operation not permitted. Then you will need to chmod 0600 /etc/limits"
ulimit -s 262144
mono OpenSim.exe

5
bin/opensim.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
ulimit -s 1048576
# next option may improve SGen gc (for opensim only) you may also need to increase nursery size on large regions
#export MONO_GC_PARAMS="minor=split,promotion-age=14"
mono --desktop OpenSim.exe

View File

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{968B4C73-280D-4FF5-9F73-DD3D10160C2E}</ProjectGuid>
<OutputType>Exe</OutputType>
<NoStandardLibraries>false</NoStandardLibraries>
<AssemblyName>OpenSim32</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\..\bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup>
<RootNamespace>OpenSim32</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net">
<HintPath>..\..\..\bin\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="OpenSim">
<HintPath>..\..\..\bin\OpenSim.exe</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.0">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.4.5">
<Visible>False</Visible>
<ProductName>Windows Installer 4.5</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSHARP.Targets" />
<ProjectExtensions>
<VisualStudio AllowExistingFolder="true" />
</ProjectExtensions>
</Project>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishUrlHistory>publish\</PublishUrlHistory>
<InstallUrlHistory />
<SupportUrlHistory />
<UpdateUrlHistory />
<BootstrapperUrlHistory />
<ErrorReportUrlHistory />
<FallbackCulture>en-US</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
</PropertyGroup>
<PropertyGroup>
<ReferencePath>C:\Avination\testsim\bin\</ReferencePath>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim32", "OpenSim32.csproj", "{968B4C73-280D-4FF5-9F73-DD3D10160C2E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{968B4C73-280D-4FF5-9F73-DD3D10160C2E}.Debug|x86.ActiveCfg = Release|x86
{968B4C73-280D-4FF5-9F73-DD3D10160C2E}.Debug|x86.Build.0 = Release|x86
{968B4C73-280D-4FF5-9F73-DD3D10160C2E}.Release|x86.ActiveCfg = Release|x86
{968B4C73-280D-4FF5-9F73-DD3D10160C2E}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -27,33 +27,13 @@
using System; using System;
namespace OpenSim._32BitLaunch namespace OpenSim32
{ {
class Program class Program
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
log4net.Config.XmlConfigurator.Configure(); global::OpenSim.Application.Main(args);
System.Console.WriteLine("32-bit OpenSim executor");
System.Console.WriteLine("-----------------------");
System.Console.WriteLine("");
System.Console.WriteLine("This application is compiled for 32-bit CPU and will run under WOW32 or similar.");
System.Console.WriteLine("All 64-bit incompatibilities should be gone.");
System.Console.WriteLine("");
System.Threading.Thread.Sleep(300);
try
{
global::OpenSim.Application.Main(args);
}
catch (Exception ex)
{
System.Console.WriteLine("OpenSim threw an exception:");
System.Console.WriteLine(ex.ToString());
System.Console.WriteLine("");
System.Console.WriteLine("Application will now terminate!");
System.Console.WriteLine("");
}
} }
} }
} }

View File

@ -32,11 +32,11 @@ using System.Runtime.InteropServices;
// General information about an assembly is controlled through the following // General information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("OpenSim.32BitLaunch")] [assembly: AssemblyTitle("OpenSim32")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("OpenSim 32Bit Launcher")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("http://opensimulator.org")] [assembly: AssemblyCompany("http://opensimulator.org")]
[assembly: AssemblyProduct("OpenSim.32BitLaunch")] [assembly: AssemblyProduct("OpenSim 32BitLauncher")]
[assembly: AssemblyCopyright("Copyright (c) 2008")] [assembly: AssemblyCopyright("Copyright (c) 2008")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -59,5 +59,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("0.6.3.*")] // [assembly: AssemblyVersion("0.6.3.*")]
[assembly: AssemblyVersion("0.6.3.*")] [assembly: AssemblyVersion("0.9.1.*")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,75 @@
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
<appSettings>
</appSettings>
<log4net>
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/>
<acceptOnMatch value="false"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss} - %message" />
<!-- console log with milliseconds. Useful for debugging -->
<!-- <conversionPattern value="%date{HH:mm:ss.fff} - %message" /> -->
</layout>
</appender>
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log/OpenSim.log" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyy-MM-dd"/>
...
-->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="OpenSim.log" />
<appendToFile value="true" />
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special"/>
<acceptOnMatch value="false"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %logger %message%newline" />
</layout>
</appender>
<appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
<file value="OpenSimStats.log"/>
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="LogFileAppender" />
</root>
<!-- Independently control logging level for XEngine -->
<logger name="OpenSim.Region.ScriptEngine.XEngine">
<level value="INFO"/>
</logger>
<!-- Independently control logging level for per region module loading -->
<logger name="OpenSim.ApplicationPlugins.RegionModulesController.RegionModulesControllerPlugin">
<level value="INFO"/>
</logger>
<!-- used for stats recording -->
<logger name="special.StatsLogger">
<appender-ref ref="StatsLogFileAppender"/>
</logger>
</log4net>
</configuration>

View File

@ -1,5 +0,0 @@
Many issues appear in the support channels because of a misunderstanding of the use of these utilities. And through discussion at OpenSimulator Office Hours it was determined that these tools probably serve no useful purpose anymore.
Instead of removing them immediately, we move them here, for a time, in case there is a useful purpose that has escaped us during conversations.
If a need to compile these arises, the OpenSim.32BitLaunch and Robust.32BitLaunch directories may be placed under the ./OpenSim/Tools sources subdirectory, run the prebuild script and compile.

View File

@ -26,35 +26,14 @@
*/ */
using System; using System;
using log4net;
namespace Robust._32BitLaunch namespace Robust32
{ {
class Program class Program
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
log4net.Config.XmlConfigurator.Configure();
System.Console.WriteLine("32-bit OpenSim executor");
System.Console.WriteLine("-----------------------");
System.Console.WriteLine("");
System.Console.WriteLine("This application is compiled for 32-bit CPU and will run under WOW32 or similar.");
System.Console.WriteLine("All 64-bit incompatibilities should be gone.");
System.Console.WriteLine("");
System.Threading.Thread.Sleep(300);
try
{
global::OpenSim.Server.OpenSimServer.Main(args); global::OpenSim.Server.OpenSimServer.Main(args);
}
catch (Exception ex)
{
System.Console.WriteLine("OpenSim threw an exception:");
System.Console.WriteLine(ex.ToString());
System.Console.WriteLine("");
System.Console.WriteLine("Application will now terminate!");
System.Console.WriteLine("");
}
} }
} }
} }

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{A159489E-6552-4734-8EFA-8E031F63C7F6}</ProjectGuid>
<OutputType>Exe</OutputType>
<NoStandardLibraries>false</NoStandardLibraries>
<AssemblyName>Robust32</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\..\bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\..\bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
</PropertyGroup>
<PropertyGroup>
<RootNamespace>Robust32</RootNamespace>
</PropertyGroup>
<PropertyGroup>
<StartupObject>Robust32.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Robust, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\bin\Robust.exe</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.0">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.4.5">
<Visible>False</Visible>
<ProductName>Windows Installer 4.5</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSHARP.Targets" />
<ProjectExtensions>
<VisualStudio AllowExistingFolder="true" />
</ProjectExtensions>
</Project>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishUrlHistory>publish\</PublishUrlHistory>
<InstallUrlHistory />
<SupportUrlHistory />
<UpdateUrlHistory />
<BootstrapperUrlHistory />
<ErrorReportUrlHistory />
<FallbackCulture>en-US</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Robust32", "Robust32.csproj", "{A159489E-6552-4734-8EFA-8E031F63C7F6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A159489E-6552-4734-8EFA-8E031F63C7F6}.Debug|x86.ActiveCfg = Debug|x86
{A159489E-6552-4734-8EFA-8E031F63C7F6}.Debug|x86.Build.0 = Debug|x86
{A159489E-6552-4734-8EFA-8E031F63C7F6}.Release|x86.ActiveCfg = Release|x86
{A159489E-6552-4734-8EFA-8E031F63C7F6}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
<appSettings>
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<log4net>
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special" />
<acceptOnMatch value="false" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss} - %message" />
</layout>
</appender>
<!-- If you want automatic log-rolling then use RollingFileAppender instead of FileAppender:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log/Robust.log" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyy-MM-dd"/>
...
-->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="Robust.log" />
<appendToFile value="true" />
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="special" />
<acceptOnMatch value="false" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %logger %message%newline" />
</layout>
</appender>
<appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
<file value="RobustStats.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="LogFileAppender" />
</root>
<!-- used for stats recording -->
<logger name="special.StatsLogger">
<appender-ref ref="StatsLogFileAppender" />
</logger>
</log4net>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>