diff --git a/Engine/source/platform/platformNet.cpp b/Engine/source/platform/platformNet.cpp index b598b96a6..4d5b6ca18 100644 --- a/Engine/source/platform/platformNet.cpp +++ b/Engine/source/platform/platformNet.cpp @@ -491,10 +491,11 @@ template T ReservedSocketList::resolve(NetSocket socketToResolve) EntryType &entry = mSocketList[socketToResolve.getHandle()]; return entry.used ? entry.value : -1; } -ConnectionNotifyEvent* Net::smConnectionNotify = NULL; -ConnectionAcceptedEvent* Net::smConnectionAccept = NULL; -ConnectionReceiveEvent* Net::smConnectionReceive = NULL; -PacketReceiveEvent* Net::smPacketReceive = NULL; + +static ConnectionNotifyEvent* smConnectionNotify = NULL; +static ConnectionAcceptedEvent* smConnectionAccept = NULL; +static ConnectionReceiveEvent* smConnectionReceive = NULL; +static PacketReceiveEvent* smPacketReceive = NULL; ConnectionNotifyEvent& Net::getConnectionNotifyEvent() { diff --git a/Engine/source/platform/platformNet.h b/Engine/source/platform/platformNet.h index c07c2d9f6..0e9610c0a 100644 --- a/Engine/source/platform/platformNet.h +++ b/Engine/source/platform/platformNet.h @@ -214,13 +214,12 @@ struct Net static bool smMulticastEnabled; static bool smIpv4Enabled; static bool smIpv6Enabled; - + static ConnectionNotifyEvent* smConnectionNotify; static ConnectionAcceptedEvent* smConnectionAccept; static ConnectionReceiveEvent* smConnectionReceive; static PacketReceiveEvent* smPacketReceive; - static bool init(); static void shutdown(); diff --git a/Engine/source/platform/profiler.cpp b/Engine/source/platform/profiler.cpp index cde917b8d..1083b6d08 100644 --- a/Engine/source/platform/profiler.cpp +++ b/Engine/source/platform/profiler.cpp @@ -27,7 +27,7 @@ #endif #if defined(TORQUE_OS_MAC) -#include // For high resolution timer +#include #endif #include "core/stream/fileStream.h" @@ -48,15 +48,15 @@ Profiler *gProfiler = NULL; //#define TORQUE_PROFILER_DEBUG // Machinery to record the stack of node names, as a debugging aid to find -// mismatched PROFILE_START and PROFILE_END blocks. We profile from the +// mismatched PROFILE_START and PROFILE_END blocks. We profile from the // beginning to catch profile block errors that occur when torque is starting up. #ifdef TORQUE_PROFILER_DEBUG Vector gProfilerNodeStack; #define TORQUE_PROFILE_AT_ENGINE_START true #define PROFILER_DEBUG_PUSH_NODE( nodename ) \ - gProfilerNodeStack.push_back( nodename ); +gProfilerNodeStack.push_back( nodename ); #define PROFILER_DEBUG_POP_NODE() \ - gProfilerNodeStack.pop_back(); +gProfilerNodeStack.pop_back(); #else #define TORQUE_PROFILE_AT_ENGINE_START false #define PROFILER_DEBUG_PUSH_NODE( nodename ) ; @@ -68,7 +68,7 @@ Vector gProfilerNodeStack; void startHighResolutionTimer(U32 time[2]) { //time[0] = Platform::getRealMilliseconds(); - + __asm { push eax @@ -89,7 +89,7 @@ U32 endHighResolutionTimer(U32 time[2]) U32 ticks; //ticks = Platform::getRealMilliseconds() - time[0]; //return ticks; - + __asm { push eax @@ -135,20 +135,26 @@ U32 endHighResolutionTimer(U32 time[2]) void startHighResolutionTimer(U32 time[2]) { - UnsignedWide t; - Microseconds(&t); - time[0] = t.lo; - time[1] = t.hi; + U64 now = mach_absolute_time(); + AssertFatal(sizeof(U32[2]) == sizeof(U64), "Can't pack mach_absolute_time into U32[2]"); + memcpy(time, &now, sizeof(U64)); } U32 endHighResolutionTimer(U32 time[2]) { - UnsignedWide t; - Microseconds(&t); - return t.lo - time[0]; - // given that we're returning a 32 bit integer, and this is unsigned subtraction... - // it will just wrap around, we don't need the upper word of the time. - // NOTE: the code assumes that more than 3 hrs will not go by between calls to startHighResolutionTimer() and endHighResolutionTimer(). - // I mean... that damn well better not happen anyway. + static mach_timebase_info_data_t sTimebaseInfo = {0, 0}; + + U64 now = mach_absolute_time(); + AssertFatal(sizeof(U32[2]) == sizeof(U64), "Can't pack mach_absolute_time into U32[2]"); + U64 then; + memcpy(&then, time, sizeof(U64)); + + if(sTimebaseInfo.denom == 0){ + mach_timebase_info(&sTimebaseInfo); + } + // Handle the micros/nanos conversion first, because shedding a few bits is better than overflowing. + U64 elapsedMicros = ((now - then) / 1000) * sTimebaseInfo.numer / sTimebaseInfo.denom; + + return (U32)elapsedMicros; // Just truncate, and hope we didn't overflow } #else @@ -170,7 +176,7 @@ Profiler::Profiler() { mMaxStackDepth = MaxStackDepth; mCurrentHash = 0; - + mCurrentProfilerData = (ProfilerData *) malloc(sizeof(ProfilerData)); mCurrentProfilerData->mRoot = NULL; mCurrentProfilerData->mNextForRoot = NULL; @@ -185,17 +191,17 @@ Profiler::Profiler() mCurrentProfilerData->mInvokeCount = 0; mCurrentProfilerData->mTotalTime = 0; mCurrentProfilerData->mSubTime = 0; -#ifdef TORQUE_ENABLE_PROFILE_PATH +#ifdef TORQUE_ENABLE_PROFILE_PATH mCurrentProfilerData->mPath = ""; #endif mRootProfilerData = mCurrentProfilerData; - + for(U32 i = 0; i < ProfilerData::HashTableSize; i++) mCurrentProfilerData->mChildHash[i] = 0; - + mProfileList = NULL; - - mEnabled = TORQUE_PROFILE_AT_ENGINE_START; + + mEnabled = TORQUE_PROFILE_AT_ENGINE_START; mNextEnable = TORQUE_PROFILE_AT_ENGINE_START; mStackDepth = 0; gProfiler = this; @@ -216,20 +222,20 @@ void Profiler::reset() mEnabled = false; // in case we're in a profiler call. ProfilerData * head = mProfileList; ProfilerData * curr = head; - + while ( curr ) { head = curr->mNextProfilerData; free( curr ); - + if ( head ) curr = head; else curr = NULL; } - + mProfileList = NULL; - + for(ProfilerRootData *walk = ProfilerRootData::sRootList; walk; walk = walk->mNextRoot) { walk->mFirstProfilerData = 0; @@ -256,7 +262,7 @@ ProfilerRootData::ProfilerRootData(const char *name) for(ProfilerRootData *walk = sRootList; walk; walk = walk->mNextRoot) if(!dStrcmp(walk->mName, name)) AssertFatal( false, avar( "Duplicate profile name: %s", name ) ); - + mName = name; mNameHash = _StringTable::hashString(name); mNextRoot = sRootList; @@ -283,7 +289,7 @@ void Profiler::validate() if(!wk) Platform::debugBreak(); for(wk = dp->mParent->mChildHash[walk->mNameHash & (ProfilerData::HashTableSize - 1)] ; - wk; wk = wk->mNextHash) + wk; wk = wk->mNextHash) if(wk == dp) break; if(!wk) @@ -300,7 +306,7 @@ const char * Profiler::getProfilePath() if( !ThreadManager::isMainThread() ) return "[non-main thread]"; #endif - + return (mEnabled && mCurrentProfilerData) ? mCurrentProfilerData->mPath : "na"; } #endif @@ -312,14 +318,14 @@ const char * Profiler::constructProfilePath(ProfilerData * pd) { const bool saveEnable = gProfiler->mEnabled; gProfiler->mEnabled = false; - + const char * connector = " -> "; U32 len = dStrlen(pd->mParent->mPath); if (!len) connector = ""; len += dStrlen(connector); len += dStrlen(pd->mRoot->mName); - + U32 mark = FrameAllocator::getWaterMark(); char * buf = (char*)FrameAllocator::alloc(len+1); dStrcpy(buf,pd->mParent->mPath); @@ -342,25 +348,25 @@ void Profiler::hashPush(ProfilerRootData *root) if( !ThreadManager::isMainThread() ) return; #endif - + mStackDepth++; PROFILER_DEBUG_PUSH_NODE(root->mName); AssertFatal(mStackDepth <= mMaxStackDepth, - "Stack overflow in profiler. You may have mismatched PROFILE_START and PROFILE_ENDs"); + "Stack overflow in profiler. You may have mismatched PROFILE_START and PROFILE_ENDs"); if(!mEnabled) return; - + ProfilerData *nextProfiler = NULL; if(!root->mEnabled || mCurrentProfilerData->mRoot == root) { mCurrentProfilerData->mSubDepth++; return; } - + if(mCurrentProfilerData->mLastSeenProfiler && - mCurrentProfilerData->mLastSeenProfiler->mRoot == root) + mCurrentProfilerData->mLastSeenProfiler->mRoot == root) nextProfiler = mCurrentProfilerData->mLastSeenProfiler; - + if(!nextProfiler) { // first see if it's in the hash table... @@ -377,17 +383,17 @@ void Profiler::hashPush(ProfilerRootData *root) nextProfiler = (ProfilerData *) malloc(sizeof(ProfilerData)); for(U32 i = 0; i < ProfilerData::HashTableSize; i++) nextProfiler->mChildHash[i] = 0; - + nextProfiler->mRoot = root; nextProfiler->mNextForRoot = root->mFirstProfilerData; root->mFirstProfilerData = nextProfiler; - + nextProfiler->mNextProfilerData = mProfileList; mProfileList = nextProfiler; - + nextProfiler->mNextHash = mCurrentProfilerData->mChildHash[index]; mCurrentProfilerData->mChildHash[index] = nextProfiler; - + nextProfiler->mParent = mCurrentProfilerData; nextProfiler->mNextSibling = mCurrentProfilerData->mFirstChild; mCurrentProfilerData->mFirstChild = nextProfiler; @@ -437,7 +443,7 @@ void Profiler::hashPop(ProfilerRootData *expected) if( !ThreadManager::isMainThread() ) return; #endif - + mStackDepth--; PROFILER_DEBUG_POP_NODE(); AssertFatal(mStackDepth >= 0, "Stack underflow in profiler. You may have mismatched PROFILE_START and PROFILE_ENDs"); @@ -453,15 +459,15 @@ void Profiler::hashPop(ProfilerRootData *expected) { AssertISV(expected == mCurrentProfilerData->mRoot, "Profiler::hashPop - didn't get expected ProfilerRoot!"); } - + F64 fElapsed = endHighResolutionTimer(mCurrentProfilerData->mStartTime); - + mCurrentProfilerData->mTotalTime += fElapsed; mCurrentProfilerData->mParent->mSubTime += fElapsed; // mark it in the parent as well... mCurrentProfilerData->mRoot->mTotalTime += fElapsed; if(mCurrentProfilerData->mParent->mRoot) mCurrentProfilerData->mParent->mRoot->mSubTime += fElapsed; // mark it in the parent as well... - + mCurrentProfilerData = mCurrentProfilerData->mParent; } if(mStackDepth == 0) @@ -474,13 +480,13 @@ void Profiler::hashPop(ProfilerRootData *expected) } if(!mEnabled && mNextEnable) startHighResolutionTimer(mCurrentProfilerData->mStartTime); - + #if defined(TORQUE_OS_WIN) // The high performance counters under win32 are unreliable when running on multiple // processors. When the profiler is enabled, we restrict Torque to a single processor. if(mNextEnable != mEnabled) { - + if(mNextEnable) { Con::warnf("Warning: forcing the Torque profiler thread to run only on cpu 1."); @@ -496,7 +502,7 @@ void Profiler::hashPop(ProfilerRootData *expected) } } #endif - + mEnabled = mNextEnable; } } @@ -514,15 +520,15 @@ static void profilerDataDumpRecurse(ProfilerData *data, char *buffer, U32 buffer { // dump out this one: Con::printf("%7.3f %7.3f %8d %s%s", - 100 * data->mTotalTime / totalTime, - 100 * (data->mTotalTime - data->mSubTime) / totalTime, - data->mInvokeCount, - buffer, - data->mRoot ? data->mRoot->mName : "ROOT" ); + 100 * data->mTotalTime / totalTime, + 100 * (data->mTotalTime - data->mSubTime) / totalTime, + data->mInvokeCount, + buffer, + data->mRoot ? data->mRoot->mName : "ROOT" ); data->mTotalTime = 0; data->mSubTime = 0; data->mInvokeCount = 0; - + buffer[bufferLen] = ' '; buffer[bufferLen+1] = ' '; buffer[bufferLen+2] = 0; @@ -552,16 +558,16 @@ static void profilerDataDumpRecurseFile(ProfilerData *data, char *buffer, U32 bu { char pbuffer[256]; dSprintf(pbuffer, 255, "%7.3f %7.3f %8d %s%s\n", - 100 * data->mTotalTime / totalTime, - 100 * (data->mTotalTime - data->mSubTime) / totalTime, - data->mInvokeCount, - buffer, - data->mRoot ? data->mRoot->mName : "ROOT" ); + 100 * data->mTotalTime / totalTime, + 100 * (data->mTotalTime - data->mSubTime) / totalTime, + data->mInvokeCount, + buffer, + data->mRoot ? data->mRoot->mName : "ROOT" ); fws.write(dStrlen(pbuffer), pbuffer); data->mTotalTime = 0; data->mSubTime = 0; data->mInvokeCount = 0; - + buffer[bufferLen] = ' '; buffer[bufferLen+1] = ' '; buffer[bufferLen+2] = 0; @@ -593,7 +599,7 @@ void Profiler::dump() mEnabled = false; mStackDepth++; // may have some profiled calls... gotta turn em off. - + Vector rootVector; F64 totalTime = 0; for(ProfilerRootData *walk = ProfilerRootData::sRootList; walk; walk = walk->mNextRoot) @@ -602,8 +608,8 @@ void Profiler::dump() rootVector.push_back(walk); } dQsort((void *) &rootVector[0], rootVector.size(), sizeof(ProfilerRootData *), rootDataCompare); - - + + if (mDumpToConsole == true) { Con::printf("Profiler Data Dump:"); @@ -612,10 +618,10 @@ void Profiler::dump() for(U32 i = 0; i < rootVector.size(); i++) { Con::printf("%7.3f %7.3f %8d %s", - 100 * (rootVector[i]->mTotalTime - rootVector[i]->mSubTime) / totalTime, - 100 * rootVector[i]->mTotalTime / totalTime, - rootVector[i]->mTotalInvokeCount, - rootVector[i]->mName); + 100 * (rootVector[i]->mTotalTime - rootVector[i]->mSubTime) / totalTime, + 100 * rootVector[i]->mTotalTime / totalTime, + rootVector[i]->mTotalInvokeCount, + rootVector[i]->mName); rootVector[i]->mTotalInvokeCount = 0; rootVector[i]->mTotalTime = 0; rootVector[i]->mSubTime = 0; @@ -623,9 +629,9 @@ void Profiler::dump() Con::printf(""); Con::printf("Ordered by stack trace total time -"); Con::printf("%% Time %% NSTime Invoke # Name"); - + mCurrentProfilerData->mTotalTime = endHighResolutionTimer(mCurrentProfilerData->mStartTime); - + char depthBuffer[MaxStackDepth * 2 + 1]; depthBuffer[0] = 0; profilerDataDumpRecurse(mCurrentProfilerData, depthBuffer, 0, totalTime); @@ -637,44 +643,44 @@ void Profiler::dump() FileStream fws; bool success = fws.open(mDumpFileName, Torque::FS::File::Write); AssertFatal(success, "Cannot write profile dump to specified file!"); - char buffer[1024]; - - dStrcpy(buffer, "Profiler Data Dump:\n"); + char buffer[1024]; + + dStrcpy(buffer, "Profiler Data Dump:\n"); + fws.write(dStrlen(buffer), buffer); + dStrcpy(buffer, "Ordered by non-sub total time -\n"); + fws.write(dStrlen(buffer), buffer); + dStrcpy(buffer, "%%NSTime %% Time Invoke # Name\n"); + fws.write(dStrlen(buffer), buffer); + + for(U32 i = 0; i < rootVector.size(); i++) + { + dSprintf(buffer, 1023, "%7.3f %7.3f %8d %s\n", + 100 * (rootVector[i]->mTotalTime - rootVector[i]->mSubTime) / totalTime, + 100 * rootVector[i]->mTotalTime / totalTime, + rootVector[i]->mTotalInvokeCount, + rootVector[i]->mName); fws.write(dStrlen(buffer), buffer); - dStrcpy(buffer, "Ordered by non-sub total time -\n"); - fws.write(dStrlen(buffer), buffer); - dStrcpy(buffer, "%%NSTime %% Time Invoke # Name\n"); - fws.write(dStrlen(buffer), buffer); - - for(U32 i = 0; i < rootVector.size(); i++) - { - dSprintf(buffer, 1023, "%7.3f %7.3f %8d %s\n", - 100 * (rootVector[i]->mTotalTime - rootVector[i]->mSubTime) / totalTime, - 100 * rootVector[i]->mTotalTime / totalTime, - rootVector[i]->mTotalInvokeCount, - rootVector[i]->mName); - fws.write(dStrlen(buffer), buffer); - - rootVector[i]->mTotalInvokeCount = 0; - rootVector[i]->mTotalTime = 0; - rootVector[i]->mSubTime = 0; - } - dStrcpy(buffer, "\nOrdered by non-sub total time -\n"); - fws.write(dStrlen(buffer), buffer); - dStrcpy(buffer, "%%NSTime %% Time Invoke # Name\n"); - fws.write(dStrlen(buffer), buffer); - + + rootVector[i]->mTotalInvokeCount = 0; + rootVector[i]->mTotalTime = 0; + rootVector[i]->mSubTime = 0; + } + dStrcpy(buffer, "\nOrdered by non-sub total time -\n"); + fws.write(dStrlen(buffer), buffer); + dStrcpy(buffer, "%%NSTime %% Time Invoke # Name\n"); + fws.write(dStrlen(buffer), buffer); + mCurrentProfilerData->mTotalTime = endHighResolutionTimer(mCurrentProfilerData->mStartTime); - + char depthBuffer[MaxStackDepth * 2 + 1]; depthBuffer[0] = 0; profilerDataDumpRecurseFile(mCurrentProfilerData, depthBuffer, 0, totalTime, fws); mEnabled = enableSave; mStackDepth--; - + fws.close(); } - + mDumpToConsole = false; mDumpToFile = false; mDumpFileName[0] = '\0'; @@ -709,13 +715,13 @@ void Profiler::enableMarker(const char *marker, bool enable) //----------------------------------------------------------------------------- -DefineEngineFunction( profilerMarkerEnable, void, ( const char* markerName, bool enable ), ( true ), - "@brief Enable or disable a specific profile.\n\n" - "@param enable Optional paramater to enable or disable the profile.\n" - "@param markerName Name of a specific marker to enable or disable.\n" - "@note Calling this function will first call profilerReset(), clearing all data from profiler. " - "All profile markers are enabled by default.\n\n" - "@ingroup Debugging") +DefineEngineFunction( profilerMarkerEnable, void, ( const char* markerName, bool enable ), ( true ), + "@brief Enable or disable a specific profile.\n\n" + "@param enable Optional paramater to enable or disable the profile.\n" + "@param markerName Name of a specific marker to enable or disable.\n" + "@note Calling this function will first call profilerReset(), clearing all data from profiler. " + "All profile markers are enabled by default.\n\n" + "@ingroup Debugging") { if( gProfiler ) gProfiler->enableMarker( markerName, enable ); @@ -724,37 +730,37 @@ DefineEngineFunction( profilerMarkerEnable, void, ( const char* markerName, bool //----------------------------------------------------------------------------- DefineEngineFunction( profilerEnable, void, ( bool enable ),, - "@brief Enables or disables the profiler.\n\n" - "Data is only gathered while the profiler is enabled.\n\n" - "@note Profiler is not available in shipping builds.\n" - "T3D has predefined profiling areas surrounded by markers, " - "but you may need to define additional markers (in C++) around areas you wish to profile," - " by using the PROFILE_START( markerName ); and PROFILE_END(); macros.\n\n" - "@ingroup Debugging\n" ) + "@brief Enables or disables the profiler.\n\n" + "Data is only gathered while the profiler is enabled.\n\n" + "@note Profiler is not available in shipping builds.\n" + "T3D has predefined profiling areas surrounded by markers, " + "but you may need to define additional markers (in C++) around areas you wish to profile," + " by using the PROFILE_START( markerName ); and PROFILE_END(); macros.\n\n" + "@ingroup Debugging\n" ) { if(gProfiler) gProfiler->enable(enable); } DefineEngineFunction(profilerDump, void, (),, - "@brief Dumps current profiling stats to the console window.\n\n" - "@note Markers disabled with profilerMarkerEnable() will be skipped over. " - "If the profiler is currently running, it will be disabled.\n" - "@ingroup Debugging") + "@brief Dumps current profiling stats to the console window.\n\n" + "@note Markers disabled with profilerMarkerEnable() will be skipped over. " + "If the profiler is currently running, it will be disabled.\n" + "@ingroup Debugging") { if(gProfiler) gProfiler->dumpToConsole(); } DefineEngineFunction( profilerDumpToFile, void, ( const char* fileName ),, - "@brief Dumps current profiling stats to a file.\n\n" - "@note If the profiler is currently running, it will be disabled.\n" - "@param fileName Name and path of file to save profiling stats to. Must use forward slashes (/). " - "Will attempt to create the file if it does not already exist.\n" - "@tsexample\n" - "profilerDumpToFile( \"C:/Torque/log1.txt\" );\n" - "@endtsexample\n\n" - "@ingroup Debugging" ) + "@brief Dumps current profiling stats to a file.\n\n" + "@note If the profiler is currently running, it will be disabled.\n" + "@param fileName Name and path of file to save profiling stats to. Must use forward slashes (/). " + "Will attempt to create the file if it does not already exist.\n" + "@tsexample\n" + "profilerDumpToFile( \"C:/Torque/log1.txt\" );\n" + "@endtsexample\n\n" + "@ingroup Debugging" ) { if(gProfiler) gProfiler->dumpToFile(fileName); @@ -762,9 +768,9 @@ DefineEngineFunction( profilerDumpToFile, void, ( const char* fileName ),, DefineEngineFunction( profilerReset, void, (),, "@brief Resets the profiler, clearing it of all its data.\n\n" - "If the profiler is currently running, it will first be disabled. " - "All markers will retain their current enabled/disabled status.\n\n" - "@ingroup Debugging" ) + "If the profiler is currently running, it will first be disabled. " + "All markers will retain their current enabled/disabled status.\n\n" + "@ingroup Debugging" ) { if(gProfiler) gProfiler->reset(); diff --git a/Engine/source/platform/test/netTest.cpp b/Engine/source/platform/test/netTest.cpp index 741e89ce0..889d150f2 100644 --- a/Engine/source/platform/test/netTest.cpp +++ b/Engine/source/platform/test/netTest.cpp @@ -76,8 +76,8 @@ TEST(Net, TCPRequest) handler.mDataReceived = 0; // Hook into the signals. - Net::smConnectionNotify ->notify(&handler, &TcpHandle::notify); - Net::smConnectionReceive->notify(&handler, &TcpHandle::receive); + Net::smConnectionNotify .notify(&handler, &TcpHandle::notify); + Net::smConnectionReceive.notify(&handler, &TcpHandle::receive); // Open a TCP connection to garagegames.com handler.mSocket = Net::openConnectTo("72.246.107.193:80"); @@ -85,8 +85,8 @@ TEST(Net, TCPRequest) while(Process::processEvents() && (Platform::getRealMilliseconds() < limit) ) {} // Unhook from the signals. - Net::smConnectionNotify ->remove(&handler, &TcpHandle::notify); - Net::smConnectionReceive->remove(&handler, &TcpHandle::receive); + Net::smConnectionNotify .remove(&handler, &TcpHandle::notify); + Net::smConnectionReceive.remove(&handler, &TcpHandle::receive); EXPECT_GT(handler.mDataReceived, 0) << "Didn't get any data back!"; @@ -139,8 +139,8 @@ struct JournalHandle mDataReceived = 0; // Hook into the signals. - Net::smConnectionNotify ->notify(this, &JournalHandle::notify); - Net::smConnectionReceive->notify(this, &JournalHandle::receive); + Net::smConnectionNotify .notify(this, &JournalHandle::notify); + Net::smConnectionReceive.notify(this, &JournalHandle::receive); // Open a TCP connection to garagegames.com mSocket = Net::openConnectTo("72.246.107.193:80"); @@ -149,8 +149,8 @@ struct JournalHandle while(Process::processEvents()) {} // Unhook from the signals. - Net::smConnectionNotify ->remove(this, &JournalHandle::notify); - Net::smConnectionReceive->remove(this, &JournalHandle::receive); + Net::smConnectionNotify .remove(this, &JournalHandle::notify); + Net::smConnectionReceive.remove(this, &JournalHandle::receive); EXPECT_GT(mDataReceived, 0) << "Didn't get any data back!"; diff --git a/Engine/source/platformMac/macFileIO.mm b/Engine/source/platformMac/macFileIO.mm index 7fbc3408d..f11b5b052 100644 --- a/Engine/source/platformMac/macFileIO.mm +++ b/Engine/source/platformMac/macFileIO.mm @@ -68,46 +68,54 @@ bool dFileTouch(const char *path) //----------------------------------------------------------------------------- bool dPathCopy(const char* source, const char* dest, bool nooverwrite) { - NSFileManager *manager = [NSFileManager defaultManager]; - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *nsource = [[NSString stringWithUTF8String:source] stringByStandardizingPath]; - NSString *ndest = [[NSString stringWithUTF8String:dest] stringByStandardizingPath]; - NSString *ndestFolder = [ndest stringByDeletingLastPathComponent]; - - if(! [manager fileExistsAtPath:nsource]) - { - Con::errorf("dPathCopy: no file exists at %s",source); + if(source == NULL || dest == NULL) return false; - } - if( [manager fileExistsAtPath:ndest] ) - { - if(nooverwrite) + @autoreleasepool { + NSFileManager *manager = [NSFileManager defaultManager]; + + NSString *nsource = [manager stringWithFileSystemRepresentation:source length:dStrlen(source)]; + NSString *ndest = [manager stringWithFileSystemRepresentation:dest length:dStrlen(dest)]; + NSString *ndestFolder = [ndest stringByDeletingLastPathComponent]; + + if(! [manager fileExistsAtPath:nsource]) { - Con::errorf("dPathCopy: file already exists at %s",dest); + Con::errorf("dPathCopy: no file exists at %s",source); return false; } - Con::warnf("Deleting files at path: %s", dest); - bool deleted = [manager removeFileAtPath:ndest handler:nil]; - if(!deleted) + + if( [manager fileExistsAtPath:ndest] ) { - Con::errorf("Copy failed! Could not delete files at path: %s", dest); - return false; + if(nooverwrite) + { + Con::errorf("dPathCopy: file already exists at %s",dest); + return false; + } + Con::warnf("Deleting files at path: %s", dest); + if(![manager removeItemAtPath:ndest error:nil] || [manager fileExistsAtPath:ndest]) + { + Con::errorf("Copy failed! Could not delete files at path: %s", dest); + return false; + } } + + if([manager fileExistsAtPath:ndestFolder] == NO) + { + ndestFolder = [ndestFolder stringByAppendingString:@"/"]; // createpath requires a trailing slash + Platform::createPath([ndestFolder UTF8String]); + } + + bool ret = [manager copyItemAtPath:nsource toPath:ndest error:nil]; + // n.b.: The "success" semantics don't guarantee a copy actually took place, so we'll verify + // because this is surprising behavior for a method called copy. + if( ![manager fileExistsAtPath:ndest] ) + { + Con::warnf("The filemanager returned success, but the file was not copied. Something strange is happening"); + ret = false; + } + return ret; } - if([manager fileExistsAtPath:ndestFolder] == NO) - { - ndestFolder = [ndestFolder stringByAppendingString:@"/"]; // createpath requires a trailing slash - Platform::createPath([ndestFolder UTF8String]); - } - - bool ret = [manager copyPath:nsource toPath:ndest handler:nil]; - - [pool release]; - return ret; - } //----------------------------------------------------------------------------- @@ -117,25 +125,35 @@ bool dFileRename(const char *source, const char *dest) if(source == NULL || dest == NULL) return false; - NSFileManager *manager = [NSFileManager defaultManager]; - - NSString *nsource = [manager stringWithFileSystemRepresentation:source length:dStrlen(source)]; - NSString *ndest = [manager stringWithFileSystemRepresentation:dest length:dStrlen(dest)]; - - if(! [manager fileExistsAtPath:nsource]) - { - Con::errorf("dFileRename: no file exists at %s",source); - return false; + @autoreleasepool { + NSFileManager *manager = [NSFileManager defaultManager]; + + NSString *nsource = [manager stringWithFileSystemRepresentation:source length:dStrlen(source)]; + NSString *ndest = [manager stringWithFileSystemRepresentation:dest length:dStrlen(dest)]; + + if(! [manager fileExistsAtPath:nsource]) + { + Con::errorf("dFileRename: no file exists at %s",source); + return false; + } + + if( [manager fileExistsAtPath:ndest] ) + { + Con::warnf("dFileRename: Deleting files at path: %s", dest); + } + + bool ret = [manager moveItemAtPath:nsource toPath:ndest error:nil]; + // n.b.: The "success" semantics don't guarantee a move actually took place, so we'll verify + // because this is surprising behavior for a method called rename. + + if( ![manager fileExistsAtPath:ndest] ) + { + Con::warnf("The filemanager returned success, but the file was not moved. Something strange is happening"); + ret = false; + } + + return ret; } - - if( [manager fileExistsAtPath:ndest] ) - { - Con::warnf("dFileRename: Deleting files at path: %s", dest); - } - - bool ret = [manager movePath:nsource toPath:ndest handler:nil]; - - return ret; } //----------------------------------------------------------------------------- @@ -722,9 +740,9 @@ bool Platform::isSubDirectory(const char *pathParent, const char *pathSub) inline bool isGoodDirectory(dirent* entry) { return (entry->d_type == DT_DIR // is a dir - && dStrcmp(entry->d_name,".") != 0 // not here - && dStrcmp(entry->d_name,"..") != 0 // not parent - && !Platform::isExcludedDirectory(entry->d_name)); // not excluded + && dStrcmp(entry->d_name,".") != 0 // not here + && dStrcmp(entry->d_name,"..") != 0 // not parent + && !Platform::isExcludedDirectory(entry->d_name)); // not excluded } //----------------------------------------------------------------------------- @@ -856,7 +874,7 @@ static bool recurseDumpDirectories(const char *basePath, const char *subPath, Ve if ( isDir ) { if (dStrcmp(d->d_name, ".") == 0 || - dStrcmp(d->d_name, "..") == 0) + dStrcmp(d->d_name, "..") == 0) continue; if (Platform::isExcludedDirectory(d->d_name)) continue; @@ -869,8 +887,8 @@ static bool recurseDumpDirectories(const char *basePath, const char *subPath, Ve dSprintf(child, 1024, "%s/%s", subPath, d->d_name); if (currentDepth < recurseDepth || recurseDepth == -1 ) recurseDumpDirectories(basePath, child, directoryVector, - currentDepth + 1, recurseDepth, - noBasePath); + currentDepth + 1, recurseDepth, + noBasePath); } else { @@ -881,8 +899,8 @@ static bool recurseDumpDirectories(const char *basePath, const char *subPath, Ve dSprintf(child, 1024, "/%s", d->d_name); if (currentDepth < recurseDepth || recurseDepth == -1) recurseDumpDirectories(basePath, child, directoryVector, - currentDepth + 1, recurseDepth, - noBasePath); + currentDepth + 1, recurseDepth, + noBasePath); } } }