diff options
| -rw-r--r-- | cfgdir.c | 2 | ||||
| -rw-r--r-- | main.c | 46 | ||||
| -rw-r--r-- | main.h | 26 | ||||
| -rw-r--r-- | server.c | 4 | ||||
| -rw-r--r-- | uring.c | 17 | ||||
| -rw-r--r-- | utils.c | 8 | 
6 files changed, 70 insertions, 33 deletions
| @@ -360,7 +360,7 @@ inotify_cb(struct cfg *cfg, struct uring_task *task, int res)  	for (ptr = iev->buf; ptr < iev->buf + res; ptr += sizeof(struct inotify_event) + event->len) {  		event = (const struct inotify_event *)ptr; -		if (debuglvl > 0) +		if (debug_enabled(DBG_CFG))  			inotify_event_dump(event);  		if (event->mask & (IN_IGNORED | IN_MOVE_SELF | IN_DELETE_SELF | IN_UNMOUNT)) @@ -23,28 +23,22 @@  #include "systemd.h"  #include "igmp.h" -int debuglvl = 0; +unsigned debug_mask = DBG_ERROR | DBG_INFO;  bool exiting = false;  struct cfg *cfghack = NULL;  void -debug(unsigned lvl, const char *fmt, ...) +do_debug(enum debug_category category, const char *fmt, ...)  {  	va_list ap; -	if (lvl > debuglvl) -		return; -  	va_start(ap, fmt);  	vfprintf(stdout, fmt, ap);  	va_end(ap);  } -#define info(...) fprintf(stderr, __VA_ARGS__) -#define error(...) fprintf(stderr, __VA_ARGS__) -  __attribute__((noreturn))  void  die(const char *fmt, ...) @@ -57,8 +51,6 @@ die(const char *fmt, ...)  	exit(EXIT_FAILURE);  }; -#define perrordie(msg) die("%s: %m\n", msg) -  static void  cfg_free(struct uring_task *task)  { @@ -88,11 +80,31 @@ cfg_read(struct cfg *cfg)  	fclose(cfgfile);  } +const struct { +	const char *name; +	unsigned val; +} debug_category_str[] = { +	{ +		.name = "config", +		.val = DBG_CFG +	},{ +		.name = "refcount", +		.val = DBG_REF +	},{ +		.name = "malloc", +		.val = DBG_MALLOC +	},{ +		.name = NULL, +		.val = 0 +	} +}; +  static struct cfg *  cfg_init(int argc, char **argv)  {  	struct cfg *cfg;  	int c; +	unsigned i;  	cfg = zmalloc(sizeof(*cfg));  	if (!cfg) { @@ -106,11 +118,11 @@ cfg_init(int argc, char **argv)  		int option_index = 0;  		static struct option long_options[] = {  			{ "homedir",	required_argument,	0, 'h' }, -			{ "debug",	no_argument,		0, 'd' }, +			{ "debug",	required_argument,	0, 'd' },  			{ 0,		0,			0,  0  }  		}; -		c = getopt_long(argc, argv, ":h:d", +		c = getopt_long(argc, argv, ":h:d:",  				long_options, &option_index);  		if (c == -1)  			break; @@ -120,7 +132,15 @@ cfg_init(int argc, char **argv)  			cfg->homedir = optarg;  			break;  		case 'd': -			debuglvl++; +			for (i = 0; debug_category_str[i].name; i++) { +				if (!strcasecmp(optarg, debug_category_str[i].name)) +					break; +			} + +			if (!debug_category_str[i].name) +				die("Invalid debug category\n"); + +			debug_mask |= debug_category_str[i].val;  			break;  		default:  			die("Invalid arguments\n"); @@ -10,12 +10,30 @@ struct cfg;  extern bool exiting; -extern int debuglvl; +extern unsigned debug_mask; -void debug(unsigned lvl, const char *fmt, ...); +enum debug_category { +	DBG_ERROR	= (0x1 << 1), +	DBG_INFO	= (0x1 << 2), +	DBG_VERBOSE	= (0x1 << 3), +	DBG_CFG		= (0x1 << 4), +	DBG_REF		= (0x1 << 5), +	DBG_MALLOC	= (0x1 << 6), +}; + +static inline bool +debug_enabled(enum debug_category category) +{ +	return !!(category & debug_mask); +} + +void do_debug(enum debug_category category, const char *fmt, ...); -#define info(...) fprintf(stderr, __VA_ARGS__) -#define error(...) fprintf(stderr, __VA_ARGS__) +#define __debug(c, ...) do { if (debug_enabled((c))) do_debug((c), __VA_ARGS__); } while (0) +#define debug(c, fmt, ...) __debug(c, "%s:" fmt, __func__, __VA_ARGS__) +#define verbose(...) __debug(DBG_VERBOSE, __VA_ARGS__) +#define info(...) __debug(DBG_ERROR, __VA_ARGS__) +#define error(...) __debug(DBG_ERROR, __VA_ARGS__)  void die(const char *fmt, ...); @@ -718,11 +718,11 @@ server_new(struct cfg *cfg, const char *name)  	list_for_each_entry(scfg, &cfg->servers, list) {  		if (strcmp(name, scfg->name))  			continue; -		debug(2, "Server already exists: %s\n", name); +		fprintf(stderr, "Server already exists: %s\n", name);  		return scfg;  	} -	debug(2, "Would add server cfg: %s\n", name); +	fprintf(stderr, "Would add server cfg: %s\n", name);  	scfg = zmalloc(sizeof(*scfg));  	if (!scfg) {  		error("malloc"); @@ -113,10 +113,9 @@ uring_task_put(struct cfg *cfg, struct uring_task *task)  {  	struct uring_task *parent = task->parent; -	/* -	fprintf(stderr, "%s: called with task %s (0x%p) and refcount %u\n", -		__func__, task->name, task, task->refcount); -	 */ +	debug(DBG_REF, "task %s (%p), refcount %u\n", +	      task->name, task, task->refcount); +  	task->refcount--;  	if (task->refcount > 0) @@ -132,8 +131,8 @@ uring_task_put(struct cfg *cfg, struct uring_task *task)  	}  	if (parent) -		fprintf(stderr, "%s: task %s (%p) putting parent %s (%p)\n", -			__func__, task->name, task, task->parent->name, task->parent); +		debug(DBG_REF, "putting parent %s (%p)\n", +		      task->parent->name, task->parent);  	if (task->free)  		task->free(task); @@ -145,10 +144,8 @@ uring_task_put(struct cfg *cfg, struct uring_task *task)  void  uring_task_get(struct cfg *cfg, struct uring_task *task)  { -	/* -	fprintf(stderr, "%s: called with task %s (0x%p) and refcount %u\n", -		__func__, task->name, task, task->refcount); -	*/ +	debug(DBG_REF, "task %s (%p), refcount %u\n", +	      task->name, task, task->refcount);  	if (task->refcount < 0)  		error("Negative refcount!\n"); @@ -36,8 +36,9 @@ add_allocation(const char *allocfn, const char *callerfn, int line, void *ptr, s  {  	struct allocation *a = malloc(sizeof(*a)); -	fprintf(stderr, "Allocation: %s:%i %s(%zu) = %p\n", -	        callerfn, line, allocfn, size, ptr); +	debug(DBG_MALLOC, "%s:%i %s(%zu) = %p\n", +	      callerfn, line, allocfn, size, ptr); +  	a->allocfn = allocfn;  	a->callerfn = callerfn;  	a->line = line; @@ -98,7 +99,8 @@ __xfree(const char *fn, int line, void *ptr)  	free(ptr);  	malloc_count--; -	fprintf(stderr, "Deallocation: %s:%i %p\n", fn, line, ptr); +	debug(DBG_MALLOC, "%s:%i %p\n", fn, line, ptr); +  	list_for_each_entry_safe(a, tmp, &malloc_list, list) {  		if (a->ptr == ptr) {  			list_del(&a->list); | 
