ok... this is small and rare, but like all bugs of this type, a pain
to dig out.
in comm.c:heartbeat()
I had:
void heartbeat(int pulse)
{
static int mins_since_crashsave = 0;
/* Clear out all the global buffers now in case someone forgot. */
if (!(pulse % PULSE_ZONE))
zone_update();
if (!(pulse % (15 * PASSES_PER_SEC))) /* 15 seconds */
check_idle_passwords();
if (!(pulse % PULSE_BUFFER))
release_all_buffers();
.
.
.
}
it should be:
void heartbeat(int pulse)
{
static int mins_since_crashsave = 0;
/* Clear out all the global buffers now in case someone forgot. */
if (!(pulse % PULSE_BUFFER))
release_all_buffers();
if (!(pulse % PULSE_ZONE))
zone_update();
if (!(pulse % (15 * PASSES_PER_SEC))) /* 15 seconds */
check_idle_passwords();
.
.
.
}
zone update was forcing write_to_output to give it a large_buf because
a lot of the zones were idling out. Then, the next thing that
heartbeat function did was try to realease_all_buffers(), thus
releasing the large_buf before process_output could get it's hands on
it. you ended up with descriptor->output pointing off to 0 eek...
just a warning for all those who use the code, DON'T put anything that
could possibly send more then SMALL_BUFSIZE char's to the output
between the process_output() call and the release_all_buffers() call.
nasty things can happen.
--Angus
+------------------------------------------------------------+
| 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/08/00 PST