New package not yet registered with the system 解决方法

本文介绍了解决在系统中遇到的新包未被注册的问题。通过使用Eclipse中的Project-Clean功能并重新部署来解决该问题。

[2011-04-08 10:12:48 - Snake] New package not yet registered with the system. Waiting 3 seconds before next attempt.

 

 

解决方案: Try this Project->Clean in eclipse, and the deploy it again.

public static void shutdown(final Context context, String reason, boolean confirm) { mReboot = false; mRebootSafeMode = false; mReason = reason; shutdownInner(context, confirm); } private static void shutdownInner(final Context context, boolean confirm) { // ShutdownThread is called from many places, so best to verify here that the context passed // in is themed. context.assertRuntimeOverlayThemable(); // ensure that only one thread is trying to power down. // any additional calls are just returned synchronized (sIsStartedGuard) { if (sIsStarted) { Log.d(TAG, "Request to shutdown already running, returning."); return; } } // Add checkpoint for this shutdown attempt. The user might still cancel the dialog, but // this point preserves the system trace of the trigger point of the ShutdownThread. ShutdownCheckPoints.recordCheckPoint(/* reason= */ null); final int longPressBehavior = context.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerBehavior); final int resourceId = mRebootSafeMode ? com.android.internal.R.string.reboot_safemode_confirm : (longPressBehavior == 2 ? com.android.internal.R.string.shutdown_confirm_question : com.android.internal.R.string.shutdown_confirm); Log.d(TAG, "Notifying thread to start shutdown longPressBehavior=" + longPressBehavior); if (confirm) { final CloseDialogReceiver closer = new CloseDialogReceiver(context); if (sConfirmDialog != null) { sConfirmDialog.dismiss(); } sConfirmDialog = new AlertDialog.Builder(context) .setTitle(mRebootSafeMode ? com.android.internal.R.string.reboot_safemode_title : com.android.internal.R.string.power_off) .setMessage(resourceId) .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { beginShutdownSequence(context); } }) .setNegativeButton(com.android.internal.R.string.no, null) .create(); closer.dialog = sConfirmDialog; sConfirmDialog.setOnDismissListener(closer); sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); sConfirmDialog.show(); } else { beginShutdownSequence(context); } } private static class CloseDialogReceiver extends BroadcastReceiver implements DialogInterface.OnDismissListener { private Context mContext; public Dialog dialog; CloseDialogReceiver(Context context) { mContext = context; IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); context.registerReceiver(this, filter); } @Override public void onReceive(Context context, Intent intent) { dialog.cancel(); } public void onDismiss(DialogInterface unused) { mContext.unregisterReceiver(this); } } /** * Request a clean shutdown, waiting for subsystems to clean up their * state etc. Must be called from a Looper thread in which its UI * is shown. * * @param context Context used to display the shutdown progress dialog. This must be a context * suitable for displaying UI (aka Themable). * @param reason code to pass to the kernel (e.g. "recovery"), or null. * @param confirm true if user confirmation is needed before shutting down. */ public static void reboot(final Context context, String reason, boolean confirm) { mReboot = true; mRebootSafeMode = false; mRebootHasProgressBar = false; mReason = reason; shutdownInner(context, confirm); } /** * Request a reboot into safe mode. Must be called from a Looper thread in which its UI * is shown. * * @param context Context used to display the shutdown progress dialog. This must be a context * suitable for displaying UI (aka Themable). * @param confirm true if user confirmation is needed before shutting down. */ public static void rebootSafeMode(final Context context, boolean confirm) { UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); if (um.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT)) { return; } mReboot = true; mRebootSafeMode = true; mRebootHasProgressBar = false; mReason = null; shutdownInner(context, confirm); } private static ProgressDialog showShutdownDialog(Context context) { // Throw up a system dialog to indicate the device is rebooting / shutting down. ProgressDialog pd = new ProgressDialog(context); // Path 1: Reboot to recovery for update // Condition: mReason startswith REBOOT_RECOVERY_UPDATE // // Path 1a: uncrypt needed // Condition: if /cache/recovery/uncrypt_file exists but // /cache/recovery/block.map doesn't. // UI: determinate progress bar (mRebootHasProgressBar == True) // // * Path 1a is expected to be removed once the GmsCore shipped on // device always calls uncrypt prior to reboot. // // Path 1b: uncrypt already done // UI: spinning circle only (no progress bar) // // Path 2: Reboot to recovery for factory reset // Condition: mReason == REBOOT_RECOVERY // UI: spinning circle only (no progress bar) // // Path 3: Regular reboot / shutdown // Condition: Otherwise // UI: spinning circle only (no progress bar) // mReason could be "recovery-update" or "recovery-update,quiescent". if (mReason != null && mReason.startsWith(PowerManager.REBOOT_RECOVERY_UPDATE)) { // We need the progress bar if uncrypt will be invoked during the // reboot, which might be time-consuming. mRebootHasProgressBar = RecoverySystem.UNCRYPT_PACKAGE_FILE.exists() && !(RecoverySystem.BLOCK_MAP_FILE.exists()); pd.setTitle(context.getText(com.android.internal.R.string.reboot_to_update_title)); if (mRebootHasProgressBar) { pd.setMax(100); pd.setProgress(0); pd.setIndeterminate(false); pd.setProgressNumberFormat(null); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage(context.getText( com.android.internal.R.string.reboot_to_update_prepare)); } else { if (showSysuiReboot()) { return null; } pd.setIndeterminate(true); pd.setMessage(context.getText( com.android.internal.R.string.reboot_to_update_reboot)); } } else if (mReason != null && mReason.equals(PowerManager.REBOOT_RECOVERY)) { if (showSysuiReboot()) { return null; } else if (RescueParty.isAttemptingFactoryReset()) { // We're not actually doing a factory reset yet; we're rebooting // to ask the user if they'd like to reset, so give them a less // scary dialog message. pd.setTitle(context.getText(com.android.internal.R.string.power_off)); pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress)); pd.setIndeterminate(true); } else { // Factory reset path. Set the dialog message accordingly. pd.setTitle(context.getText(com.android.internal.R.string.reboot_to_reset_title)); pd.setMessage(context.getText( com.android.internal.R.string.reboot_to_reset_message)); pd.setIndeterminate(true); } } else { if (showSysuiReboot()) { return null; } pd.setTitle(context.getText(com.android.internal.R.string.power_off)); pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress)); pd.setIndeterminate(true); } pd.setCancelable(false); pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); ///M: added for Shutdown Enhancement @{ if(sInstance.mIsShowShutdownDialog(context)) { pd.show(); } /// @} return pd; } private static boolean showSysuiReboot() { ///M: added for Shutdown Enhancement @{ if(!sInstance.mIsShowShutdownSysui()) { return false; } /// @} Log.d(TAG, "Attempting to use SysUI shutdown UI"); try { StatusBarManagerInternal service = LocalServices.getService( StatusBarManagerInternal.class); if (service.showShutdownUi(mReboot, mReason)) { // Sysui will handle shutdown UI. Log.d(TAG, "SysUI handling shutdown UI"); return true; } } catch (Exception e) { // If anything went wrong, ignore it and use fallback ui } Log.d(TAG, "SysUI is unavailable"); return false; } private static void beginShutdownSequence(Context context) { synchronized (sIsStartedGuard) { if (sIsStarted) { Log.d(TAG, "Shutdown sequence already running, returning."); return; } sIsStarted = true; } sInstance.mProgressDialog = showShutdownDialog(context); sInstance.mContext = context; sInstance.mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE); // make sure we never fall asleep again sInstance.mCpuWakeLock = null; try { sInstance.mCpuWakeLock = sInstance.mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, TAG + "-cpu"); sInstance.mCpuWakeLock.setReferenceCounted(false); sInstance.mCpuWakeLock.acquire(); } catch (SecurityException e) { Log.w(TAG, "No permission to acquire wake lock", e); sInstance.mCpuWakeLock = null; } // also make sure the screen stays on for better user experience sInstance.mScreenWakeLock = null; if (sInstance.mPowerManager.isScreenOn()) { try { sInstance.mScreenWakeLock = sInstance.mPowerManager.newWakeLock( PowerManager.FULL_WAKE_LOCK, TAG + "-screen"); sInstance.mScreenWakeLock.setReferenceCounted(false); sInstance.mScreenWakeLock.acquire(); } catch (SecurityException e) { Log.w(TAG, "No permission to acquire wake lock", e); sInstance.mScreenWakeLock = null; } } if (SecurityLog.isLoggingEnabled()) { SecurityLog.writeEvent(SecurityLog.TAG_OS_SHUTDOWN); } // start the thread that initiates shutdown sInstance.mHandler = new Handler() { }; ///M: added for Shutdown Enhancement @{ if(sInstance.mStartShutdownSeq(context)) { sInstance.start(); } /// @} } void actionDone() { synchronized (mActionDoneSync) { mActionDone = true; mActionDoneSync.notifyAll(); } } /** * Makes sure we handle the shutdown gracefully. * Shuts off power regardless of radio state if the allotted time has passed. */ public void run() { TimingsTraceLog shutdownTimingLog = newTimingsLog(); shutdownTimingLog.traceBegin("SystemServerShutdown"); metricShutdownStart(); metricStarted(METRIC_SYSTEM_SERVER); // Start dumping check points for this shutdown in a separate thread. Thread dumpCheckPointsThread = ShutdownCheckPoints.newDumpThread( new File(CHECK_POINTS_FILE_BASENAME)); dumpCheckPointsThread.start(); BroadcastReceiver br = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // We don't allow apps to cancel this, so ignore the result. actionDone(); } }; /* * Write a system property in case the system_server reboots before we * get to the actual hardware restart. If that happens, we'll retry at * the beginning of the SystemServer startup. */ { String reason = (mReboot ? "1" : "0") + (mReason != null ? mReason : ""); SystemProperties.set(SHUTDOWN_ACTION_PROPERTY, reason); } /* * If we are rebooting into safe mode, write a system property * indicating so. */ if (mRebootSafeMode) { SystemProperties.set(REBOOT_SAFEMODE_PROPERTY, "1"); } shutdownTimingLog.traceBegin("DumpPreRebootInfo"); try { Slog.i(TAG, "Logging pre-reboot information..."); PreRebootLogger.log(mContext); } catch (Exception e) { Slog.e(TAG, "Failed to log pre-reboot information", e); } shutdownTimingLog.traceEnd(); // DumpPreRebootInfo metricStarted(METRIC_SEND_BROADCAST); shutdownTimingLog.traceBegin("SendShutdownBroadcast"); Log.i(TAG, "Sending shutdown broadcast..."); // First send the high-level shut down broadcast. mActionDone = false; Intent intent = new Intent(Intent.ACTION_SHUTDOWN); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY); mContext.sendOrderedBroadcastAsUser(intent, UserHandle.ALL, null, br, mHandler, 0, null, null); final long endTime = SystemClock.elapsedRealtime() + MAX_BROADCAST_TIME; synchronized (mActionDoneSync) { while (!mActionDone) { long delay = endTime - SystemClock.elapsedRealtime(); if (delay <= 0) { Log.w(TAG, "Shutdown broadcast timed out"); break; } else if (mRebootHasProgressBar) { int status = (int)((MAX_BROADCAST_TIME - delay) * 1.0 * BROADCAST_STOP_PERCENT / MAX_BROADCAST_TIME); sInstance.setRebootProgress(status, null); } try { mActionDoneSync.wait(Math.min(delay, ACTION_DONE_POLL_WAIT_MS)); } catch (InterruptedException e) { } } } if (mRebootHasProgressBar) { sInstance.setRebootProgress(BROADCAST_STOP_PERCENT, null); } shutdownTimingLog.traceEnd(); // SendShutdownBroadcast metricEnded(METRIC_SEND_BROADCAST); Log.i(TAG, "Shutting down activity manager..."); shutdownTimingLog.traceBegin("ShutdownActivityManager"); metricStarted(METRIC_AM); final IActivityManager am = IActivityManager.Stub.asInterface(ServiceManager.checkService("activity")); if (am != null) { try { am.shutdown(MAX_BROADCAST_TIME); } catch (RemoteException e) { } } if (mRebootHasProgressBar) { sInstance.setRebootProgress(ACTIVITY_MANAGER_STOP_PERCENT, null); } shutdownTimingLog.traceEnd();// ShutdownActivityManager metricEnded(METRIC_AM); Log.i(TAG, "Shutting down package manager..."); shutdownTimingLog.traceBegin("ShutdownPackageManager"); metricStarted(METRIC_PM); final PackageManagerService pm = (PackageManagerService) ServiceManager.getService("package"); if (pm != null) { pm.shutdown(); } if (mRebootHasProgressBar) { sInstance.setRebootProgress(PACKAGE_MANAGER_STOP_PERCENT, null); } shutdownTimingLog.traceEnd(); // ShutdownPackageManager metricEnded(METRIC_PM); // Shutdown radios. shutdownTimingLog.traceBegin("ShutdownRadios"); metricStarted(METRIC_RADIOS); shutdownRadios(MAX_RADIO_WAIT_TIME); if (mRebootHasProgressBar) { sInstance.setRebootProgress(RADIO_STOP_PERCENT, null); } shutdownTimingLog.traceEnd(); // ShutdownRadios metricEnded(METRIC_RADIOS); if (mRebootHasProgressBar) { sInstance.setRebootProgress(MOUNT_SERVICE_STOP_PERCENT, null); // If it's to reboot to install an update and uncrypt hasn't been // done yet, trigger it now. uncrypt(); } // Wait for the check points dump thread to finish, or kill it if not finished in time. shutdownTimingLog.traceBegin("ShutdownCheckPointsDumpWait"); try { dumpCheckPointsThread.join(MAX_CHECK_POINTS_DUMP_WAIT_TIME); } catch (InterruptedException ex) { } shutdownTimingLog.traceEnd(); // ShutdownCheckPointsDumpWait ///M: added for Shutdown Enhancement@{ mShutdownSeqFinish(mContext); /// @} shutdownTimingLog.traceEnd(); // SystemServerShutdown metricEnded(METRIC_SYSTEM_SERVER); saveMetrics(mReboot, mReason); // Remaining work will be done by init, including vold shutdown rebootOrShutdown(mContext, mReboot, mReason); } private static TimingsTraceLog newTimingsLog() { return new TimingsTraceLog("ShutdownTiming", Trace.TRACE_TAG_SYSTEM_SERVER); } private static void metricStarted(String metricKey) { synchronized (TRON_METRICS) { TRON_METRICS.put(metricKey, -1 * SystemClock.elapsedRealtime()); } } private static void metricEnded(String metricKey) { synchronized (TRON_METRICS) { TRON_METRICS .put(metricKey, SystemClock.elapsedRealtime() + TRON_METRICS.get(metricKey)); } } private static void metricShutdownStart() { synchronized (TRON_METRICS) { TRON_METRICS.put(METRIC_SHUTDOWN_TIME_START, System.currentTimeMillis()); } } private void setRebootProgress(final int progress, final CharSequence message) { mHandler.post(new Runnable() { @Override public void run() { if (mProgressDialog != null) { mProgressDialog.setProgress(progress); if (message != null) { mProgressDialog.setMessage(message); } } } }); } private void shutdownRadios(final int timeout) { // If a radio is wedged, disabling it may hang so we do this work in another thread, // just in case. final long endTime = SystemClock.elapsedRealtime() + timeout; final boolean[] done = new boolean[1]; Thread t = new Thread() { public void run() { TimingsTraceLog shutdownTimingsTraceLog = newTimingsLog(); boolean radioOff; TelephonyManager telephonyManager = mContext.getSystemService( TelephonyManager.class); radioOff = telephonyManager == null || !telephonyManager.isAnyRadioPoweredOn(); if (!radioOff) { Log.w(TAG, "Turning off cellular radios..."); metricStarted(METRIC_RADIO); telephonyManager.shutdownAllRadios(); } Log.i(TAG, "Waiting for Radio..."); long delay = endTime - SystemClock.elapsedRealtime(); while (delay > 0) { if (mRebootHasProgressBar) { int status = (int)((timeout - delay) * 1.0 * (RADIO_STOP_PERCENT - PACKAGE_MANAGER_STOP_PERCENT) / timeout); status += PACKAGE_MANAGER_STOP_PERCENT; sInstance.setRebootProgress(status, null); } if (!radioOff) { radioOff = !telephonyManager.isAnyRadioPoweredOn(); if (radioOff) { Log.i(TAG, "Radio turned off."); metricEnded(METRIC_RADIO); shutdownTimingsTraceLog .logDuration("ShutdownRadio", TRON_METRICS.get(METRIC_RADIO)); } } if (radioOff) { Log.i(TAG, "Radio shutdown complete."); done[0] = true; break; } SystemClock.sleep(RADIOS_STATE_POLL_SLEEP_MS); delay = endTime - SystemClock.elapsedRealtime(); } } }; t.start(); try { t.join(timeout); } catch (InterruptedException ex) { } if (!done[0]) { Log.w(TAG, "Timed out waiting for Radio shutdown."); } } /** * Do not call this directly. Use {@link #reboot(Context, String, boolean)} * or {@link #shutdown(Context, String, boolean)} instead. * * @param context Context used to vibrate or null without vibration * @param reboot true to reboot or false to shutdown * @param reason reason for reboot/shutdown */ public static void rebootOrShutdown(final Context context, boolean reboot, String reason) { if (reboot) { Log.i(TAG, "Rebooting, reason: " + reason); PowerManagerService.lowLevelReboot(reason); Log.e(TAG, "Reboot failed, will attempt shutdown instead"); reason = null; } else if (SHUTDOWN_VIBRATE_MS > 0 && context != null) { // vibrate before shutting down Vibrator vibrator = new SystemVibrator(context); try { vibrator.vibrate(SHUTDOWN_VIBRATE_MS, VIBRATION_ATTRIBUTES); } catch (Exception e) { // Failure to vibrate shouldn't interrupt shutdown. Just log it. Log.w(TAG, "Failed to vibrate during shutdown.", e); } // vibrator is asynchronous so we need to wait to avoid shutting down too soon. try { Thread.sleep(SHUTDOWN_VIBRATE_MS); } catch (InterruptedException unused) { } } ///M: added for shutdown Enhancement@{ sInstance.mLowLevelShutdownSeq(context); /// @} // Shutdown power Log.i(TAG, "Performing low-level shutdown..."); PowerManagerService.lowLevelShutdown(reason); } private static void saveMetrics(boolean reboot, String reason) { StringBuilder metricValue = new StringBuilder(); metricValue.append("reboot:"); metricValue.append(reboot ? "y" : "n"); metricValue.append(",").append("reason:").append(reason); final int metricsSize = TRON_METRICS.size(); for (int i = 0; i < metricsSize; i++) { final String name = TRON_METRICS.keyAt(i); final long value = TRON_METRICS.valueAt(i); if (value < 0) { Log.e(TAG, "metricEnded wasn't called for " + name); continue; } metricValue.append(',').append(name).append(':').append(value); } File tmp = new File(METRICS_FILE_BASENAME + ".tmp"); boolean saved = false; try (FileOutputStream fos = new FileOutputStream(tmp)) { fos.write(metricValue.toString().getBytes(StandardCharsets.UTF_8)); saved = true; } catch (IOException e) { Log.e(TAG,"Cannot save shutdown metrics", e); } if (saved) { tmp.renameTo(new File(METRICS_FILE_BASENAME + ".txt")); } } private void uncrypt() { Log.i(TAG, "Calling uncrypt and monitoring the progress..."); final RecoverySystem.ProgressListener progressListener = new RecoverySystem.ProgressListener() { @Override public void onProgress(int status) { if (status >= 0 && status < 100) { // Scale down to [MOUNT_SERVICE_STOP_PERCENT, 100). status = (int)(status * (100.0 - MOUNT_SERVICE_STOP_PERCENT) / 100); status += MOUNT_SERVICE_STOP_PERCENT; CharSequence msg = mContext.getText( com.android.internal.R.string.reboot_to_update_package); sInstance.setRebootProgress(status, msg); } else if (status == 100) { CharSequence msg = mContext.getText( com.android.internal.R.string.reboot_to_update_reboot); sInstance.setRebootProgress(status, msg); } else { // Ignored } } }; final boolean[] done = new boolean[1]; done[0] = false; Thread t = new Thread() { @Override public void run() { RecoverySystem rs = (RecoverySystem) mContext.getSystemService( Context.RECOVERY_SERVICE); String filename = null; try { filename = FileUtils.readTextFile(RecoverySystem.UNCRYPT_PACKAGE_FILE, 0, null); rs.processPackage(mContext, new File(filename), progressListener); } catch (IOException e) { Log.e(TAG, "Error uncrypting file", e); } done[0] = true; } }; t.start(); try { t.join(MAX_UNCRYPT_WAIT_TIME); } catch (InterruptedException unused) { } if (!done[0]) { Log.w(TAG, "Timed out waiting for uncrypt."); final int uncryptTimeoutError = 100; String timeoutMessage = String.format("uncrypt_time: %d\n" + "uncrypt_error: %d\n", MAX_UNCRYPT_WAIT_TIME / 1000, uncryptTimeoutError); try { FileUtils.stringToFile(RecoverySystem.UNCRYPT_STATUS_FILE, timeoutMessage); } catch (IOException e) { Log.e(TAG, "Failed to write timeout message to uncrypt status", e); } } }这里面有设置关机时长的代码吗
06-04
class COREUOBJECT_API UObjectBase { friend class UObjectBaseUtility; friend struct Z_Construct_UClass_UObject_Statics; friend class FUObjectArray; // for access to InternalIndex without revealing it to anyone else friend class FUObjectAllocator; // for access to destructor without revealing it to anyone else friend COREUOBJECT_API void UObjectForceRegistration(UObjectBase* Object, bool bCheckForModuleRelease); friend COREUOBJECT_API void InitializePrivateStaticClass( class UClass* TClass_Super_StaticClass, class UClass* TClass_PrivateStaticClass, class UClass* TClass_WithinClass_StaticClass, const TCHAR* PackageName, const TCHAR* Name ); protected: UObjectBase() : NamePrivate(NoInit) // screwy, but the name was already set and we don't want to set it again #if ENABLE_STATNAMEDEVENTS_UOBJECT , StatIDStringStorage(nullptr) #endif { } /** * Constructor used for bootstrapping * @param InFlags RF_Flags to assign */ UObjectBase( EObjectFlags InFlags ); public: /** * Constructor used by StaticAllocateObject * @param InClass non NULL, this gives the class of the new object, if known at this time * @param InFlags RF_Flags to assign * @param InInternalFlags EInternalObjectFlags to assign * @param InOuter outer for this object * @param InName name of the new object */ UObjectBase( UClass* InClass, EObjectFlags InFlags, EInternalObjectFlags InInternalFlags, UObject *InOuter, FName InName ); /** * Final destructor, removes the object from the object array, and indirectly, from any annotations **/ virtual ~UObjectBase(); /** * Emit GC tokens for UObjectBase, this might be UObject::StaticClass or Default__Class **/ static void EmitBaseReferences(UClass *RootClass); protected: /** * Just change the FName and Outer and rehash into name hash tables. For use by higher level rename functions. * * @param NewName new name for this object * @param NewOuter new outer for this object, if NULL, outer will be unchanged */ void LowLevelRename(FName NewName,UObject *NewOuter = NULL); /** Force any base classes to be registered first */ virtual void RegisterDependencies() {} /** Enqueue the registration for this object. */ void Register(const TCHAR* PackageName,const TCHAR* Name); /** * Convert a boot-strap registered class into a real one, add to uobject array, etc * * @param UClassStaticClass Now that it is known, fill in UClass::StaticClass() as the class */ virtual void DeferredRegister(UClass *UClassStaticClass,const TCHAR* PackageName,const TCHAR* Name); private: /** * Add a newly created object to the name hash tables and the object array * * @param Name name to assign to this uobject * @param InSetInternalFlags Internal object flags to be set on the object once it's been added to the array */ void AddObject(FName Name, EInternalObjectFlags InSetInternalFlags); public: /** * Checks to see if the object appears to be valid * @return true if this appears to be a valid object */ bool IsValidLowLevel() const; /** * Faster version of IsValidLowLevel. * Checks to see if the object appears to be valid by checking pointers and their alignment. * Name and InternalIndex checks are less accurate than IsValidLowLevel. * @param bRecursive true if the Class pointer should be checked with IsValidLowLevelFast * @return true if this appears to be a valid object */ bool IsValidLowLevelFast(bool bRecursive = true) const; /** * Returns the unique ID of the object...these are reused so it is only unique while the object is alive. * Useful as a tag. **/ FORCEINLINE uint32 GetUniqueID() const { return (uint32)InternalIndex; } /** Returns the UClass that defines the fields of this object */ FORCEINLINE UClass* GetClass() const { return ClassPrivate; } /** Returns the UObject this object resides in */ FORCEINLINE UObject* GetOuter() const { return OuterPrivate; } /** Returns the logical name of this object */ FORCEINLINE FName GetFName() const { return NamePrivate; } /** * Returns the stat ID of the object, used for profiling. This will create a stat ID if needed. * * @param bForDeferred If true, a stat ID will be created even if a group is disabled */ FORCEINLINE TStatId GetStatID(bool bForDeferredUse = false) const { #if STATS // this is done to avoid even registering stats for a disabled group (unless we plan on using it later) if (bForDeferredUse || FThreadStats::IsCollectingData(GET_STATID(STAT_UObjectsStatGroupTester))) { if (!StatID.IsValidStat()) { CreateStatID(); } return StatID; } #elif ENABLE_STATNAMEDEVENTS_UOBJECT if (!StatID.IsValidStat() && (bForDeferredUse || GCycleStatsShouldEmitNamedEvents)) { CreateStatID(); } return StatID; #endif // STATS return TStatId(); // not doing stats at the moment, or ever } private: #if STATS || ENABLE_STATNAMEDEVENTS_UOBJECT /** Creates a stat ID for this object */ void CreateStatID() const; #endif protected: /** * Set the object flags directly * **/ FORCEINLINE void SetFlagsTo( EObjectFlags NewFlags ) { checkfSlow((NewFlags & ~RF_AllFlags) == 0, TEXT("%s flagged as 0x%x but is trying to set flags to RF_AllFlags"), *GetFName().ToString(), (int)ObjectFlags); ObjectFlags = NewFlags; } public: /** * Retrieve the object flags directly * * @return Flags for this object **/ FORCEINLINE EObjectFlags GetFlags() const { checkfSlow((ObjectFlags & ~RF_AllFlags) == 0, TEXT("%s flagged as RF_AllFlags"), *GetFName().ToString()); return ObjectFlags; } /** * Atomically adds the specified flags. * Do not use unless you know what you are doing. * Designed to be used only by parallel GC and UObject loading thread. */ FORCENOINLINE void AtomicallySetFlags( EObjectFlags FlagsToAdd ) { int32 OldFlags = 0; int32 NewFlags = 0; do { OldFlags = ObjectFlags; NewFlags = OldFlags | FlagsToAdd; } while( FPlatformAtomics::InterlockedCompareExchange( (int32*)&ObjectFlags, NewFlags, OldFlags) != OldFlags ); } /** * Atomically clears the specified flags. * Do not use unless you know what you are doing. * Designed to be used only by parallel GC and UObject loading thread. */ FORCENOINLINE void AtomicallyClearFlags( EObjectFlags FlagsToClear ) { int32 OldFlags = 0; int32 NewFlags = 0; do { OldFlags = ObjectFlags; NewFlags = OldFlags & ~FlagsToClear; } while( FPlatformAtomics::InterlockedCompareExchange( (int32*)&ObjectFlags, NewFlags, OldFlags) != OldFlags ); } private: /** Flags used to track and report various object states. This needs to be 8 byte aligned on 32-bit platforms to reduce memory waste */ EObjectFlags ObjectFlags; /** Index into GObjectArray...very private. */ int32 InternalIndex; /** Class the object belongs to. */ UClass* ClassPrivate; /** Name of this object */ FName NamePrivate; /** Object this object resides in. */ UObject* OuterPrivate; #if STATS || ENABLE_STATNAMEDEVENTS_UOBJECT /** Stat id of this object, 0 if nobody asked for it yet */ mutable TStatId StatID; #if ENABLE_STATNAMEDEVENTS_UOBJECT mutable PROFILER_CHAR* StatIDStringStorage; #endif #endif // STATS || ENABLE_STATNAMEDEVENTS friend class FBlueprintCompileReinstancer; /** This is used by the reinstancer to re-class and re-archetype the current instances of a class before recompiling */ void SetClass(UClass* NewClass); #if HACK_HEADER_GENERATOR // Required by UHT makefiles for internal data serialization. friend struct FObjectBaseArchiveProxy; #endif // HACK_HEADER_GENERATOR };有几个成员变量
最新发布
09-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值