[dm-devel] device-mapper ./WHATS_NEW dmeventd/dmeventd.c ...

agk at sourceware.org agk at sourceware.org
Tue Jan 23 17:38:40 UTC 2007


CVSROOT:	/cvs/dm
Module name:	device-mapper
Changes by:	agk at sourceware.org	2007-01-23 17:38:39

Modified files:
	.              : WHATS_NEW 
	dmeventd       : dmeventd.c libdevmapper-event.h 
	lib            : libdm-report.c 

Log message:
	add a dso-private variable to dmeventd interface
	more inline docn

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.156&r2=1.157
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.43&r2=1.44
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.12&r2=1.13
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-report.c.diff?cvsroot=dm&r1=1.6&r2=1.7

--- device-mapper/WHATS_NEW	2007/01/22 15:03:56	1.156
+++ device-mapper/WHATS_NEW	2007/01/23 17:38:38	1.157
@@ -1,5 +1,6 @@
 Version 1.02.16 -
 ===================================
+  Add a dso-private variable to dmeventd dso interface.
   Add dm_event_handler_[gs]et_timeout functions.
   Streamline dm_report_field_* interface.
   Add cmdline debug & version options to dmeventd.
--- device-mapper/dmeventd/dmeventd.c	2007/01/22 15:03:57	1.43
+++ device-mapper/dmeventd/dmeventd.c	2007/01/23 17:38:39	1.44
@@ -77,6 +77,19 @@
 */
 static pthread_mutex_t _global_mutex;
 
+/*
+  There are three states a thread can attain (see struct
+  thread_status, field int status):
+
+  - DM_THREAD_RUNNING: thread has started up and is either working or
+  waiting for events... transitions to either SHUTDOWN or DONE
+  - DM_THREAD_SHUTDOWN: thread is still doing something, but it is
+  supposed to terminate (and transition to DONE) as soon as it
+  finishes whatever it was doing at the point of flipping state to
+  SHUTDOWN... the thread is still on the thread list
+  - DM_THREAD_DONE: thread has terminated and has been moved over to
+  unused thread list, cleanup pending
+ */
 #define DM_THREAD_RUNNING  0
 #define DM_THREAD_SHUTDOWN 1
 #define DM_THREAD_DONE     2
@@ -106,7 +119,7 @@
 	 * DM_DEVICE_STATUS). It should not destroy it.
 	 * The caller must dispose of the task.
 	 */
-	void (*process_event)(struct dm_task *dmt, enum dm_event_mask event);
+	void (*process_event)(struct dm_task *dmt, enum dm_event_mask event, void **user);
 
 	/*
 	 * Device registration.
@@ -117,7 +130,7 @@
 	 * and activate a mapping).
 	 */
 	int (*register_device)(const char *device, const char *uuid, int major,
-			       int minor);
+			       int minor, void **user);
 
 	/*
 	 * Device unregistration.
@@ -127,7 +140,7 @@
 	 * steps (eg, deactivate mapping, metadata update).
 	 */
 	int (*unregister_device)(const char *device, const char *uuid,
-				 int major, int minor);
+				 int major, int minor, void **user);
 };
 static LIST_INIT(_dso_registry);
 
@@ -166,13 +179,16 @@
 	} device;
 	uint32_t event_nr;	/* event number */
 	int processing;		/* Set when event is being processed */
-	int status;		/* running/shutdown/done */
+
+	int status;		/* see DM_THREAD_{RUNNING,SHUTDOWN,DONE}
+				   constants above */
 	enum dm_event_mask events;	/* bitfield for event filter. */
 	enum dm_event_mask current_events;	/* bitfield for occured events. */
 	struct dm_task *current_task;
 	time_t next_time;
 	uint32_t timeout;
 	struct list timeout_list;
+	void *dso_private; /* dso per-thread status variable */
 };
 static LIST_INIT(_thread_registry);
 static LIST_INIT(_thread_registry_unused);
@@ -630,7 +646,8 @@
 	return thread->dso_data->register_device(thread->device.name,
 						 thread->device.uuid,
 						 thread->device.major,
-						 thread->device.minor);
+						 thread->device.minor,
+						 &(thread->dso_private));
 }
 
 /* Unregister a device with the DSO. */
@@ -639,13 +656,14 @@
 	return thread->dso_data->unregister_device(thread->device.name,
 						   thread->device.uuid,
 						   thread->device.major,
-						   thread->device.minor);
+						   thread->device.minor,
+						   &(thread->dso_private));
 }
 
 /* Process an event in the DSO. */
 static void _do_process_event(struct thread_status *thread, struct dm_task *task)
 {
-	thread->dso_data->process_event(task, thread->current_events);
+	thread->dso_data->process_event(task, thread->current_events, &(thread->dso_private));
 }
 
 /* Thread cleanup handler to unregister device. */
@@ -1107,22 +1125,25 @@
 	if (!hit)
 		goto out;
 
-	goto out; /* FIXME the next == 1 thing is currently horridly
-		     broken, do something about it... */
+	thread = hit;
 
-	do {
+	while (1) {
 		if (list_end(&_thread_registry, &thread->list))
 			goto out;
 
 		thread = list_item(thread->list.n, struct thread_status);
-	} while (!_want_registered_device(message_data->dso_name, NULL, thread));
+		if (_want_registered_device(message_data->dso_name, NULL, thread)) {
+			hit = thread;
+			break;
+		}
+	}
 
 	_unlock_mutex();
-	return _registered_device(message_data, thread);
+	return _registered_device(message_data, hit);
 
       out:
 	_unlock_mutex();
-
+	
 	return -ENOENT;
 }
 
--- device-mapper/dmeventd/libdevmapper-event.h	2007/01/22 15:03:57	1.12
+++ device-mapper/dmeventd/libdevmapper-event.h	2007/01/23 17:38:39	1.13
@@ -98,9 +98,9 @@
 
 /* Prototypes for DSO interface, see dmeventd.c, struct dso_data for
    detailed descriptions. */
-void process_event(struct dm_task *dmt, enum dm_event_mask evmask);
-int register_device(const char *device_name, const char *uuid, int major, int minor);
+void process_event(struct dm_task *dmt, enum dm_event_mask evmask, void **user);
+int register_device(const char *device_name, const char *uuid, int major, int minor, void **user);
 int unregister_device(const char *device_name, const char *uuid, int major,
-		      int minor);
+		      int minor, void **user);
 
 #endif
--- device-mapper/lib/libdm-report.c	2007/01/22 15:03:57	1.6
+++ device-mapper/lib/libdm-report.c	2007/01/23 17:38:39	1.7
@@ -757,8 +757,7 @@
 	/* Print and clear buffer */
 	list_iterate_safe(rowh, rtmp, &rh->rows) {
 		if (!dm_pool_begin_object(rh->mem, 512)) {
-			log_error("dm_report: "
-				  "dm_pool_begin_object failed for row");
+			log_error("dm_report: Unable to allocate output line");
 			return 0;
 		}
 		row = list_item(rowh, struct row);
@@ -771,35 +770,48 @@
 			width = field->props->width;
 			if (!(rh->flags & DM_REPORT_OUTPUT_ALIGNED)) {
 				if (!dm_pool_grow_object(rh->mem, repstr,
-						      strlen(repstr)))
-					goto bad_grow;
+						      strlen(repstr))) {
+					log_error("dm_report: Unable to extend output line");
+					goto bad;
+				}
 			} else {
 				if (!(align = field->props->flags & DM_REPORT_FIELD_ALIGN_MASK))
 					align = (field->props->flags & DM_REPORT_FIELD_TYPE_NUMBER) ? 
 						DM_REPORT_FIELD_ALIGN_RIGHT : DM_REPORT_FIELD_ALIGN_LEFT;
 				if (align & DM_REPORT_FIELD_ALIGN_LEFT) {
 					if (dm_snprintf(buf, sizeof(buf), "%-*.*s",
-							 width, width, repstr) < 0)
-						goto bad_snprintf;
-					if (!dm_pool_grow_object(rh->mem, buf, width))
-						goto bad_grow;
+							 width, width, repstr) < 0) {
+						log_error("dm_report: left-aligned snprintf() failed");
+						goto bad;
+					}
+					if (!dm_pool_grow_object(rh->mem, buf, width)) {
+						log_error("dm_report: Unable to extend output line");
+						goto bad;
+					}
 				} else if (align & DM_REPORT_FIELD_ALIGN_RIGHT) {
 					if (dm_snprintf(buf, sizeof(buf), "%*.*s",
-							 width, width, repstr) < 0)
-						goto bad_snprintf;
+							 width, width, repstr) < 0) {
+						log_error("dm_report: right-aligned snprintf() failed");
+						goto bad;
+					}
 					if (!dm_pool_grow_object(rh->mem, buf, width))
-						goto bad_grow;
+						log_error("dm_report: Unable to extend output line");
+						goto bad;
 				}
 			}
 
 			if (!list_end(&row->fields, fh))
 				if (!dm_pool_grow_object(rh->mem, rh->separator,
-						      strlen(rh->separator)))
-					goto bad_grow;
+						      strlen(rh->separator))) {
+					log_error("dm_report: Unable to extend output line");
+					goto bad;
+				}
 			list_del(&field->list);
 		}
-		if (!dm_pool_grow_object(rh->mem, "\0", 1))
-			goto bad_grow;
+		if (!dm_pool_grow_object(rh->mem, "\0", 1)) {
+			log_error("dm_report: Unable to terminate output line");
+			goto bad;
+		}
 		log_print("%s", (char *) dm_pool_end_object(rh->mem));
 		list_del(&row->list);
 	}
@@ -809,10 +821,7 @@
 
 	return 1;
 
-      bad_snprintf:
-	log_error("dm_report: snprintf row failed");
-      bad_grow:
-	log_error("dm_report: Failed to generate row for printing");
+      bad:
 	dm_pool_abandon_object(rh->mem);
 	return 0;
 }




More information about the dm-devel mailing list