Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 04 Feb 2011 11:03:53 -0700
From:      "Justin T. Gibbs" <gibbs@scsiguy.com>
To:        current@FreeBSD.org
Subject:   [PATCH] OpenSolaris/ZFS: C++ compatibility
Message-ID:  <4D4C3F89.50700@scsiguy.com>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------070700030107090305080008
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

The attached patch is sufficient to allow a C++ program to use libzfs.
The motivation for these changes is work I'm doing on a ZFS fault
handling daemon that is written in C++.  SpectraLogic's intention
is to return this work to the FreeBSD project once it is a bit more
complete.

Since these changes modify files that come from OpenSolaris, I want to be
sure I understand the project's policies regarding divergence from
the vendor before I check them in.  All of the changes save one should
be trivial to merge with vendor changes and I will do that work for the
v28 import.  Is there any reason I should not commit these changes?

Thanks,
Justin

--------------070700030107090305080008
Content-Type: text/plain;
 name="c++_compat.diffs"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="c++_compat.diffs"

Change 477353 by justing@justing-ns1 on 2011/02/04 10:11:30

	Remove C constructs that are incompatible with C++ from various
	OpenSolaris and ZFS header files.  These changes are sufficient
	to allow a C++ program to use the libzfs library.
	
	Note: The majority of these files already included 'extern "C"'
	      declarations, so the intention of providing C++ compatibility
	      already existed even if it wasn't provided.
	
	cddl/compat/opensolaris/include/assert.h:
		Wrap our compatibility assert implementation in
		'extern "C"'.  Since this is a compatibility header
		I matched the Solaris style of doing this explicitly
		rather than rely on FreeBSD's __BEGIN/END_DECLS macro.
	
	sys/cddl/compat/opensolaris/sys/kstat.h:
	sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h:
	sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h:
	sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h:
		Place comments around parameters in function declarations
		that conflict with C++ keywords.
	
	sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h:
		In C, nested structures are visible in the global namespace,
		but in C++, they take on the namespace of the structure in
		which they are contained.  Flatten nested structure 
		definitions within struct zfs_cmd so these structures are
		visible in the global namespace when compiled in both
		languages.

Affected files ...

... //depot/SpectraBSD/head/cddl/compat/opensolaris/include/assert.h#4 edit
... //depot/SpectraBSD/head/sys/cddl/compat/opensolaris/sys/kstat.h#4 edit
... //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h#4 edit
... //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h#4 edit
... //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h#4 edit
... //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h#6 edit

Differences ...

==== //depot/SpectraBSD/head/cddl/compat/opensolaris/include/assert.h#4 (text) ====

@@ -43,6 +43,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
 static __inline void
 __assert(const char *expr, const char *file, int line)
 {
@@ -52,4 +56,9 @@
 	abort();
 	/* NOTREACHED */
 }
+
+#ifdef  __cplusplus
+}
+#endif
+
 #endif /* !_ASSERT_H_ */

==== //depot/SpectraBSD/head/sys/cddl/compat/opensolaris/sys/kstat.h#4 (text) ====

@@ -58,7 +58,7 @@
 	} value;
 } kstat_named_t;
 
-kstat_t *kstat_create(char *module, int instance, char *name, char *class,
+kstat_t *kstat_create(char *module, int instance, char *name, char */*class*/,
     uchar_t type, ulong_t ndata, uchar_t flags);
 void kstat_install(kstat_t *ksp);
 void kstat_delete(kstat_t *ksp);

==== //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h#4 (text) ====

@@ -131,7 +131,7 @@
 void dsl_pool_memory_pressure(dsl_pool_t *dp);
 void dsl_pool_willuse_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx);
 int dsl_free(zio_t *pio, dsl_pool_t *dp, uint64_t txg, const blkptr_t *bpp,
-    zio_done_func_t *done, void *private, uint32_t arc_flags);
+    zio_done_func_t *done, void */*private*/, uint32_t arc_flags);
 void dsl_pool_ds_destroyed(struct dsl_dataset *ds, struct dmu_tx *tx);
 void dsl_pool_ds_snapshotted(struct dsl_dataset *ds, struct dmu_tx *tx);
 void dsl_pool_ds_clone_swapped(struct dsl_dataset *ds1, struct dsl_dataset *ds2,

==== //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h#4 (text) ====

@@ -511,7 +511,7 @@
 struct zbookmark;
 struct zio;
 extern void spa_log_error(spa_t *spa, struct zio *zio);
-extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
+extern void zfs_ereport_post(const char */*class*/, spa_t *spa, vdev_t *vd,
     struct zio *zio, uint64_t stateoroffset, uint64_t length);
 extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
 extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);

==== //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h#4 (text) ====

@@ -57,6 +57,53 @@
 /*
  * zfs ioctl command structure
  */
+struct drr_begin {
+	uint64_t drr_magic;
+	uint64_t drr_version;
+	uint64_t drr_creation_time;
+	dmu_objset_type_t drr_type;
+	uint32_t drr_flags;
+	uint64_t drr_toguid;
+	uint64_t drr_fromguid;
+	char drr_toname[MAXNAMELEN];
+};
+
+struct drr_end {
+	zio_cksum_t drr_checksum;
+};
+
+struct drr_object {
+	uint64_t drr_object;
+	dmu_object_type_t drr_type;
+	dmu_object_type_t drr_bonustype;
+	uint32_t drr_blksz;
+	uint32_t drr_bonuslen;
+	uint8_t drr_checksum;
+	uint8_t drr_compress;
+	uint8_t drr_pad[6];
+	/* bonus content follows */
+};
+
+struct drr_freeobjects {
+	uint64_t drr_firstobj;
+	uint64_t drr_numobjs;
+};
+
+struct drr_write {
+	uint64_t drr_object;
+	dmu_object_type_t drr_type;
+	uint32_t drr_pad;
+	uint64_t drr_offset;
+	uint64_t drr_length;
+	/* content follows */
+};
+
+struct drr_free {
+	uint64_t drr_object;
+	uint64_t drr_offset;
+	uint64_t drr_length;
+};
+
 typedef struct dmu_replay_record {
 	enum {
 		DRR_BEGIN, DRR_OBJECT, DRR_FREEOBJECTS,
@@ -64,47 +111,12 @@
 	} drr_type;
 	uint32_t drr_payloadlen;
 	union {
-		struct drr_begin {
-			uint64_t drr_magic;
-			uint64_t drr_version;
-			uint64_t drr_creation_time;
-			dmu_objset_type_t drr_type;
-			uint32_t drr_flags;
-			uint64_t drr_toguid;
-			uint64_t drr_fromguid;
-			char drr_toname[MAXNAMELEN];
-		} drr_begin;
-		struct drr_end {
-			zio_cksum_t drr_checksum;
-		} drr_end;
-		struct drr_object {
-			uint64_t drr_object;
-			dmu_object_type_t drr_type;
-			dmu_object_type_t drr_bonustype;
-			uint32_t drr_blksz;
-			uint32_t drr_bonuslen;
-			uint8_t drr_checksum;
-			uint8_t drr_compress;
-			uint8_t drr_pad[6];
-			/* bonus content follows */
-		} drr_object;
-		struct drr_freeobjects {
-			uint64_t drr_firstobj;
-			uint64_t drr_numobjs;
-		} drr_freeobjects;
-		struct drr_write {
-			uint64_t drr_object;
-			dmu_object_type_t drr_type;
-			uint32_t drr_pad;
-			uint64_t drr_offset;
-			uint64_t drr_length;
-			/* content follows */
-		} drr_write;
-		struct drr_free {
-			uint64_t drr_object;
-			uint64_t drr_offset;
-			uint64_t drr_length;
-		} drr_free;
+		struct drr_begin drr_begin;
+		struct drr_end drr_end;
+		struct drr_object drr_object;
+		struct drr_freeobjects drr_freeobjects;
+		struct drr_write drr_write;
+		struct drr_free drr_free;
 	} drr_u;
 } dmu_replay_record_t;
 

==== //depot/SpectraBSD/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h#6 (text) ====

@@ -346,41 +346,41 @@
 };
 
 extern zio_t *zio_null(zio_t *pio, spa_t *spa, vdev_t *vd,
-    zio_done_func_t *done, void *private, int flags);
+    zio_done_func_t *done, void */*private*/, int flags);
 
 extern zio_t *zio_root(spa_t *spa,
-    zio_done_func_t *done, void *private, int flags);
+    zio_done_func_t *done, void */*private*/, int flags);
 
 extern zio_t *zio_read(zio_t *pio, spa_t *spa, const blkptr_t *bp, void *data,
-    uint64_t size, zio_done_func_t *done, void *private,
+    uint64_t size, zio_done_func_t *done, void */*private*/,
     int priority, int flags, const zbookmark_t *zb);
 
 extern zio_t *zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
     void *data, uint64_t size, zio_prop_t *zp,
-    zio_done_func_t *ready, zio_done_func_t *done, void *private,
+    zio_done_func_t *ready, zio_done_func_t *done, void */*private*/,
     int priority, int flags, const zbookmark_t *zb);
 
 extern zio_t *zio_rewrite(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
-    void *data, uint64_t size, zio_done_func_t *done, void *private,
+    void *data, uint64_t size, zio_done_func_t *done, void */*private*/,
     int priority, int flags, zbookmark_t *zb);
 
 extern zio_t *zio_free(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
-    zio_done_func_t *done, void *private, int flags);
+    zio_done_func_t *done, void */*private*/, int flags);
 
 extern zio_t *zio_claim(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
-    zio_done_func_t *done, void *private, int flags);
+    zio_done_func_t *done, void */*private*/, int flags);
 
 extern zio_t *zio_ioctl(zio_t *pio, spa_t *spa, vdev_t *vd, int cmd,
-    zio_done_func_t *done, void *private, int priority, int flags);
+    zio_done_func_t *done, void */*private*/, int priority, int flags);
 
 extern zio_t *zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
     uint64_t size, void *data, int checksum,
-    zio_done_func_t *done, void *private, int priority, int flags,
+    zio_done_func_t *done, void */*private*/, int priority, int flags,
     boolean_t labels);
 
 extern zio_t *zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
     uint64_t size, void *data, int checksum,
-    zio_done_func_t *done, void *private, int priority, int flags,
+    zio_done_func_t *done, void */*private*/, int priority, int flags,
     boolean_t labels);
 
 extern int zio_alloc_blk(spa_t *spa, uint64_t size, blkptr_t *new_bp,
@@ -407,11 +407,11 @@
 
 extern zio_t *zio_vdev_child_io(zio_t *zio, blkptr_t *bp, vdev_t *vd,
     uint64_t offset, void *data, uint64_t size, int type, int priority,
-    int flags, zio_done_func_t *done, void *private);
+    int flags, zio_done_func_t *done, void */*private*/);
 
 extern zio_t *zio_vdev_delegated_io(vdev_t *vd, uint64_t offset,
     void *data, uint64_t size, int type, int priority,
-    int flags, zio_done_func_t *done, void *private);
+    int flags, zio_done_func_t *done, void */*private*/);
 
 extern void zio_vdev_io_bypass(zio_t *zio);
 extern void zio_vdev_io_reissue(zio_t *zio);

--------------070700030107090305080008--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4D4C3F89.50700>