void stat_client_write_item(int item_num);
void clear_and_dump_items(void);
+void close_stat_clients(void);
/** iterate over all slots */
#define FOR_EACH_SLOT(_slot) for (_slot = 0; _slot < MAX_STREAM_SLOTS; _slot++)
num_clients++;
return 1;
}
+
+static void close_stat_client(struct stat_client *sc)
+{
+ PARA_INFO_LOG("closing client fd %d\n", sc->fd);
+ close(sc->fd);
+ list_del(&sc->node);
+ free(sc);
+ num_clients--;
+}
+
+/**
+ * Empty the status clients list.
+ *
+ * This iterates over the list of connected status clients, closes each client
+ * file descriptor and frees the resources.
+ */
+void close_stat_clients(void)
+{
+ struct stat_client *sc, *tmp;
+
+ list_for_each_entry_safe(sc, tmp, &client_list, node)
+ close_stat_client(sc);
+ assert(num_clients == 0);
+}
+
/**
* Write a message to all connected status clients.
*
struct para_buffer *b;
list_for_each_entry_safe(sc, tmp, &client_list, node) {
- int fd = sc->fd, ret;
+ int ret;
if (!((one << item_num) & sc->item_mask))
continue;
if (!b->buf)
(void)WRITE_STATUS_ITEM(b, item_num, "%s\n",
msg? msg : "");
- ret = write(fd, b->buf, b->offset);
+ ret = write(sc->fd, b->buf, b->offset);
if (ret == b->offset)
continue;
/* write error or short write */
- close(fd);
- num_clients--;
- PARA_INFO_LOG("deleting client on fd %d\n", fd);
- list_del(&sc->node);
- free(sc);
+ close_stat_client(sc);
dump_stat_client_list();
}
free(pb.buf);