/* * Flushing buffers takes an exclusive lock, so it must only be done when the world is * stopped, otherwise we might end up with a deadlock because a stopped thread owns the * lock. * * The protocol entries that do flush have `FLUSH()` in their definition. */ void binary_protocol_flush_buffers (gboolean force) { #ifdef HAVE_UNISTD_H int num_buffers = 0, i; BinaryProtocolBuffer *buf; BinaryProtocolBuffer **bufs; if (binary_protocol_file == -1) return; if (!force && !try_lock_exclusive ()) return; for (buf = binary_protocol_buffers; buf != NULL; buf = buf->next) ++num_buffers; bufs = (BinaryProtocolBuffer **)sgen_alloc_internal_dynamic (num_buffers * sizeof (BinaryProtocolBuffer*), INTERNAL_MEM_BINARY_PROTOCOL, TRUE); for (buf = binary_protocol_buffers, i = 0; buf != NULL; buf = buf->next, i++) bufs [i] = buf; SGEN_ASSERT (0, i == num_buffers, "Binary protocol buffer count error"); binary_protocol_buffers = NULL; for (i = num_buffers - 1; i >= 0; --i) { binary_protocol_flush_buffer (bufs [i]); binary_protocol_check_file_overflow (); } sgen_free_internal_dynamic (buf, num_buffers * sizeof (BinaryProtocolBuffer*), INTERNAL_MEM_BINARY_PROTOCOL); if (!force) unlock_exclusive (); #endif }
/* * Flushing buffers takes an exclusive lock, so it must only be done when the world is * stopped, otherwise we might end up with a deadlock because a stopped thread owns the * lock. * * The protocol entries that do flush have `FLUSH()` in their definition. */ gboolean binary_protocol_flush_buffers (gboolean force) { #ifdef HAVE_UNISTD_H int num_buffers = 0, i; BinaryProtocolBuffer *header; BinaryProtocolBuffer *buf; BinaryProtocolBuffer **bufs; if (binary_protocol_file == -1) return FALSE; if (!force && !try_lock_exclusive ()) return FALSE; header = binary_protocol_buffers; for (buf = header; buf != NULL; buf = buf->next) ++num_buffers; bufs = (BinaryProtocolBuffer **)sgen_alloc_internal_dynamic (num_buffers * sizeof (BinaryProtocolBuffer*), INTERNAL_MEM_BINARY_PROTOCOL, TRUE); for (buf = header, i = 0; buf != NULL; buf = buf->next, i++) bufs [i] = buf; SGEN_ASSERT (0, i == num_buffers, "Binary protocol buffer count error"); /* * This might be incorrect when forcing, but all bets are off in that case, anyway, * because we're trying to figure out a bug in the debugger. */ binary_protocol_buffers = NULL; for (i = num_buffers - 1; i >= 0; --i) { binary_protocol_flush_buffer (bufs [i]); binary_protocol_check_file_overflow (); } sgen_free_internal_dynamic (buf, num_buffers * sizeof (BinaryProtocolBuffer*), INTERNAL_MEM_BINARY_PROTOCOL); if (!force) unlock_exclusive (); return TRUE; #endif }