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 |