I've reached the point where it's time to start adding statistics to the mud to track how resources are being used. To that end I created a structure and filled it with longs and updated do_show.. works fine and all.. As a side note, it was amazing the number of mob scripts that run. 10K in 2 hours .. around 30K commands executed. The final detail was to add some memory tracking. So.. I started by adding a call to FREE, CREATE and str_dup that would track the amount of memory allocated, and then subtract the amount of memory freed. Something like so. #define CREATE(result, type, number) {\ if (!((result) = (type *) calloc ((number), sizeof(type)))) {\ log_info("malloc failure");\ abort();\ }\ statistics.mem_alloc+=sizeof(type)*number; } #define FREE(item) { statistics.mem_alloc-=sizeof(item); free(item); } As you will no doubt see, the free call is not returning the correct amount of memory that will be freed. I deduce this from two clues: 1) PS and the memory alloc stat get farther apart in value as time passes 2) Creating 200 objs in a room and then purging them does not decrease the amount of memory allocated. In fact, it goes up.. As the mud was up several days and the memory allocated stat showed that there was more memory allocated than the entire system has in both real and swap space, I can be fairly certain a memory leak isn't the problem (or at least not significant to this discussion.) It seems that the sizeof(item) call is incorrect for the purpose. My question: 1) What is the correct method of determining the amount of memory a particular data structure is using? I don't want to write a routine to handle every darn struct in the mud and all the possiblities. I'd rather spend my time creating a new feature or finishing a skill. 2) If #1 isn't feasible, a long stored in each struct could handle the memory allocated for the purposes of tracking, but that seems rather odd, and less than 100% reliable, not to mention wasting 4 bytes for every memory allocation. 3) I could create a struct to hold pointers to all the stuff that's allocated and the amount of memory in that allocation. But that'd be slow when it comes time to add/remove from the list. Requirements: Just the number of bytes that are dynamically allocated at this point in time. Fairly accurate, but not requiring attention to OLC and other commands not needed for a production mud environment. In particular I can live with REALLOC not being supported. How would you do it? --Mallory Neither sweat, nor blood, nor frustration, nor lousy manuals nor missing parts, nor wrong parts shall keep me from my task. --Christopher Hicks +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST