kernel/eka/kernel/server.cpp
branchRCL_3
changeset 21 e7d2d738d3c2
parent 0 a41df078684a
child 43 c1f20ce4abcf
equal deleted inserted replaced
20:597aaf25e343 21:e7d2d738d3c2
  1007 @pre interrupts enabled
  1007 @pre interrupts enabled
  1008 @pre Thread must be in a critical section
  1008 @pre Thread must be in a critical section
  1009 */
  1009 */
  1010 EXPORT_C void DBase::AsyncDelete()
  1010 EXPORT_C void DBase::AsyncDelete()
  1011 	{
  1011 	{
  1012 	CHECK_PRECONDITIONS(MASK_KERNEL_UNLOCKED | MASK_INTERRUPTS_ENABLED | MASK_NOT_ISR | MASK_NOT_IDFC | MASK_CRITICAL, "DObject::AsyncDelete");
  1012 	CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND | MASK_INTERRUPTS_ENABLED | MASK_NOT_ISR | MASK_NOT_IDFC, "DObject::AsyncDelete");
  1013 	__KTRACE_OPT(KSERVER,Kern::Printf("DBase::AsyncDelete() %08x",this));
  1013 	__KTRACE_OPT(KSERVER,Kern::Printf("DBase::AsyncDelete() %08x",this));
  1014 	
  1014 	
  1015 	DBase* oldHead = K::AsyncDeleteHead;
  1015 	DBase* oldHead = K::AsyncDeleteHead;
  1016 	do	{
  1016 	do	{
  1017 		iAsyncDeleteNext = oldHead;
  1017 		iAsyncDeleteNext = oldHead;
  1037 EXPORT_C void Kern::AsyncFree(TAny* aPtr)
  1037 EXPORT_C void Kern::AsyncFree(TAny* aPtr)
  1038 //
  1038 //
  1039 // Asynchronously free a kernel heap cell (must be >=4 bytes in length)
  1039 // Asynchronously free a kernel heap cell (must be >=4 bytes in length)
  1040 //
  1040 //
  1041 	{
  1041 	{
  1042 	CHECK_PRECONDITIONS(MASK_KERNEL_UNLOCKED | MASK_INTERRUPTS_ENABLED | MASK_NOT_ISR | MASK_NOT_IDFC | MASK_CRITICAL, "Kern::AsyncFree");
  1042 	CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND | MASK_INTERRUPTS_ENABLED | MASK_NOT_ISR | MASK_NOT_IDFC, "Kern::AsyncFree");
  1043 	__KTRACE_OPT(KSERVER,Kern::Printf("Kern::AsyncFree(%08x)",aPtr));
  1043 	__KTRACE_OPT(KSERVER,Kern::Printf("Kern::AsyncFree(%08x)",aPtr));
  1044 	DThread* pT=TheCurrentThread;
  1044 	TAny* oldHead = K::AsyncFreeHead;
  1045 
  1045 	do	{
  1046 	// if we are already running in the kernel server, just free the cell now
  1046 		*(TAny**)aPtr = oldHead;	// use first word of cell as link field
  1047 	if (pT==K::TheKernelThread)
  1047 		} while (!__e32_atomic_cas_rel_ptr(&K::AsyncFreeHead, &oldHead, aPtr));
  1048 		Kern::Free(aPtr);
  1048 	if (!oldHead)
  1049 	else
  1049 		K::AsyncFreeDfc.Enque();
  1050 		{
       
  1051 		TAny* oldHead = K::AsyncFreeHead;
       
  1052 		do	{
       
  1053 			*(TAny**)aPtr = oldHead;	// use first word of cell as link field
       
  1054 			} while (!__e32_atomic_cas_rel_ptr(&K::AsyncFreeHead, &oldHead, aPtr));
       
  1055 		if (!oldHead)
       
  1056 			K::AsyncFreeDfc.Enque();
       
  1057 		}
       
  1058 	}
  1050 	}
  1059 
  1051 
  1060 
  1052 
  1061 /** Asynchronously notifies all change notifiers of a set of events.
  1053 /** Asynchronously notifies all change notifiers of a set of events.
  1062 
  1054