#define QUEUE_WAIT_TIME 300 datum/controller/process/delete_queue var/tmp/delcount = 0 var/tmp/gccount = 0 var/tmp/deleteChunkSize = MIN_DELETE_CHUNK_SIZE #ifdef DELETE_QUEUE_DEBUG var/tmp/datum/dynamicQueue/delete_queue = 0 #endif var/debuggy_mbc_thing_please_remove = 0 setup() name = "DeleteQueue" schedule_interval = 1 tick_allowance = 25 doWork() if(!global.delete_queue) boutput(world, "Error: there is no delete queue!") return 0 #ifdef DELETE_QUEUE_DEBUG if (!src.delete_queue) src.delete_queue = global.delete_queue #endif //var/datum/dynamicQueue/queue = if(global.delete_queue.isEmpty()) return var/list/toDeleteRefs = delete_queue.dequeueMany(deleteChunkSize) var/numItems = delete_queue.count() #ifdef DELETE_QUEUE_DEBUG var/t #endif for(var/r in toDeleteRefs) LAGCHECK(LAG_REALTIME) var/datum/D = locate(r) scheck() if (!istype(D) || !D.qdeled) // If we can't locate it, it got garbage collected. // If it isn't disposed, it got garbage collected and then a new thing used its ref. gccount++ continue if (world.time <= D.qdeltime + QUEUE_WAIT_TIME) delete_queue.enqueue(r) continue #ifdef DELETE_QUEUE_DEBUG t = D.type // If we have been forced to delete the object, we do the following: detailed_delete_count[t]++ detailed_delete_gc_count[t]-- // Because we have already logged it into the gc count in qdel. #endif if (debuggy_mbc_thing_please_remove == 1) if (D.type == /obj/overlay) var/obj/overlay/O = D logTheThing("debug", text="Del of [D.type] -- iconstate [O.icon_state]") else logTheThing("debug", text="Del of [D.type]") // Delete that bitch /* // fuck var/mob/fuck = D if (istype(fuck)) if (fuck.client) Z_LOG_ERROR("DelQueue", "TRYING TO DELETE MOB WITH CLIENT (\ref[fuck] [fuck]) / ([fuck.client])!!!") continue else Z_LOG_INFO("DelQueue", "Deleting mob (\ref[fuck] [fuck]) (no client)") var/client/fuck2 = D if (istype(fuck2)) Z_LOG_ERROR("DelQueue", "NO WE ARE NOT GOING TO FUCKING DELETE THE CLIENT (\ref[fuck2] [fuck2]) FUCK YOU") continue */ delcount++ D.qdeled = 0 del(D) // The amount of time taken for this run is recorded only if // the number of items considered is equal to the chunk size if(numItems > deleteChunkSize * 10 && deleteChunkSize < MAX_DELETE_CHUNK_SIZE) deleteChunkSize++ else if (deleteChunkSize > MIN_DELETE_CHUNK_SIZE) deleteChunkSize-- tickDetail() #ifdef DELETE_QUEUE_DEBUG if (detailed_delete_count && detailed_delete_count.len) var/stats = "Delete Stats:
" var/count for (var/thing in detailed_delete_count) count = detailed_delete_count[thing] stats += "[thing] deleted [count] times.
" for (var/thing in detailed_delete_gc_count) count = detailed_delete_gc_count[thing] stats += "[thing] gracefully deleted [count] times.
" boutput(usr, "
[stats]") #endif boutput(usr, "Current Queue Length: [delete_queue.count()]") boutput(usr, "Total Items Deleted: [delcount] (Explictly) [gccount] (Gracefully GC'd)")