Improved interface of referenced objects, simpler use. Made all release() method implementations in VFS to be thread-safe.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15804 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
fca1f5c791
commit
608e5c5614
|
@ -43,7 +43,7 @@ typedef struct referenced_object referenced_object_c;
|
|||
#define __referenced_object_methods \
|
||||
__base_object_methods \
|
||||
void *(*addref)(void *ip); \
|
||||
void (*release)(void *ip);
|
||||
unsigned (*release)(void *ip);
|
||||
|
||||
/**
|
||||
* @brief @p referenced_object_c specific data.
|
||||
|
@ -138,9 +138,10 @@ static inline unsigned __referenced_object_getref_impl(void *ip) {
|
|||
* @brief Reference release implementation.
|
||||
*
|
||||
* @param[in] ip A reference to the object.
|
||||
* @return The number of references left.
|
||||
*/
|
||||
CC_FORCE_INLINE
|
||||
static inline void __referenced_object_release_impl(void *ip) {
|
||||
static inline unsigned __referenced_object_release_impl(void *ip) {
|
||||
referenced_object_c *objp = (referenced_object_c *)ip;
|
||||
|
||||
osalDbgAssert(objp->references > 0U, "zero references");
|
||||
|
@ -148,6 +149,8 @@ static inline void __referenced_object_release_impl(void *ip) {
|
|||
if (--objp->references == 0U) {
|
||||
__referenced_object_dispose_impl(ip);
|
||||
}
|
||||
|
||||
return objp->references;
|
||||
}
|
||||
/** @} */
|
||||
|
||||
|
@ -168,9 +171,10 @@ static inline referenced_object_c *roAddRef(void *ip) {
|
|||
* @brief Reference release.
|
||||
*
|
||||
* @param[in] ip A reference to the object.
|
||||
* @return The number of references left.
|
||||
*/
|
||||
CC_FORCE_INLINE
|
||||
static inline void roRelease(void *ip) {
|
||||
static inline unsigned roRelease(void *ip) {
|
||||
referenced_object_c *objp = (referenced_object_c *)ip;
|
||||
|
||||
return objp->vmt->release(ip);
|
||||
|
|
|
@ -138,7 +138,7 @@ static const struct vfs_fatfs_driver_vmt driver_vmt = {
|
|||
};
|
||||
|
||||
static void *node_dir_addref(void *instance);
|
||||
static void node_dir_release(void *instance);
|
||||
static unsigned node_dir_release(void *instance);
|
||||
static msg_t node_dir_stat(void *instance, vfs_stat_t *sp);
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip);
|
||||
static msg_t node_dir_next(void *instance, vfs_direntry_info_t *dip);
|
||||
|
@ -152,7 +152,7 @@ static const struct vfs_fatfs_dir_node_vmt dir_node_vmt = {
|
|||
};
|
||||
|
||||
static void *node_file_addref(void *instance);
|
||||
static void node_file_release(void *instance);
|
||||
static unsigned node_file_release(void *instance);
|
||||
static msg_t node_file_stat(void *instance, vfs_stat_t *sp);
|
||||
static BaseSequentialStream *node_file_get_stream(void *instance);
|
||||
static ssize_t node_file_read(void *instance, uint8_t *buf, size_t n);
|
||||
|
@ -519,14 +519,19 @@ static void *node_dir_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_dir_release(void *instance) {
|
||||
static unsigned node_dir_release(void *instance) {
|
||||
vfs_fatfs_dir_node_c *ffdnp = (vfs_fatfs_dir_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_fatfs_driver_static.dir_nodes_pool, (void *)ffdnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static msg_t node_dir_stat(void *instance, vfs_stat_t *sp) {
|
||||
|
@ -599,14 +604,19 @@ static void *node_file_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_file_release(void *instance) {
|
||||
static unsigned node_file_release(void *instance) {
|
||||
vfs_fatfs_file_node_c *fffnp = (vfs_fatfs_file_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_fatfs_driver_static.file_nodes_pool, (void *)fffnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static msg_t node_file_stat(void *instance, vfs_stat_t *sp) {
|
||||
|
|
|
@ -70,7 +70,7 @@ static const struct vfs_overlay_driver_vmt driver_vmt = {
|
|||
};
|
||||
|
||||
static void *node_dir_addref(void *instance);
|
||||
static void node_dir_release(void *instance);
|
||||
static unsigned node_dir_release(void *instance);
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip);
|
||||
static msg_t node_dir_next(void *instance, vfs_direntry_info_t *dip);
|
||||
|
||||
|
@ -763,11 +763,14 @@ static void *node_dir_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_dir_release(void *instance) {
|
||||
static unsigned node_dir_release(void *instance) {
|
||||
vfs_overlay_dir_node_c *odnp = (vfs_overlay_dir_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
if (odnp->overlaid_root != NULL) {
|
||||
odnp->overlaid_root->vmt->release((void *)odnp->overlaid_root);
|
||||
|
@ -775,6 +778,8 @@ static void node_dir_release(void *instance) {
|
|||
|
||||
chPoolFree(&vfs_overlay_driver_static.dir_nodes_pool, (void *)odnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip) {
|
||||
|
|
|
@ -67,7 +67,7 @@ static const struct vfs_sfs_driver_vmt driver_vmt = {
|
|||
};
|
||||
|
||||
static void *node_dir_addref(void *instance);
|
||||
static void node_dir_release(void *instance);
|
||||
static unsigned node_dir_release(void *instance);
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip);
|
||||
static msg_t node_dir_next(void *instance, vfs_direntry_info_t *dip);
|
||||
|
||||
|
@ -79,7 +79,7 @@ static const struct vfs_sfs_dir_node_vmt dir_node_vmt = {
|
|||
};
|
||||
|
||||
static void *node_file_addref(void *instance);
|
||||
static void node_file_release(void *instance);
|
||||
static unsigned node_file_release(void *instance);
|
||||
static BaseSequentialStream *node_file_get_stream(void *instance);
|
||||
static ssize_t node_file_read(void *instance, uint8_t *buf, size_t n);
|
||||
static ssize_t node_file_write(void *instance, const uint8_t *buf, size_t n);
|
||||
|
@ -215,14 +215,19 @@ static void *node_dir_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_dir_release(void *instance) {
|
||||
static unsigned node_dir_release(void *instance) {
|
||||
vfs_sfs_dir_node_c *dnp = (vfs_sfs_dir_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_sfs_driver_static.dir_nodes_pool, (void *)dnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip) {
|
||||
|
@ -256,14 +261,19 @@ static void *node_file_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_file_release(void *instance) {
|
||||
static unsigned node_file_release(void *instance) {
|
||||
vfs_sfs_file_node_c *fnp = (vfs_sfs_file_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_sfs_driver_static.file_nodes_pool, (void *)fnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static BaseSequentialStream *node_file_get_stream(void *instance) {
|
||||
|
|
|
@ -69,7 +69,7 @@ static const struct vfs_streams_driver_vmt driver_vmt = {
|
|||
};
|
||||
|
||||
static void *node_dir_addref(void *instance);
|
||||
static void node_dir_release(void *instance);
|
||||
static unsigned node_dir_release(void *instance);
|
||||
static msg_t node_dir_getstat(void *instance, vfs_stat_t *sp);
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip);
|
||||
static msg_t node_dir_next(void *instance, vfs_direntry_info_t *dip);
|
||||
|
@ -83,7 +83,7 @@ static const struct vfs_streams_dir_node_vmt dir_node_vmt = {
|
|||
};
|
||||
|
||||
static void *node_file_addref(void *instance);
|
||||
static void node_file_release(void *instance);
|
||||
static unsigned node_file_release(void *instance);
|
||||
static msg_t node_file_getstat(void *instance, vfs_stat_t *sp);
|
||||
static BaseSequentialStream *node_file_get_stream(void *instance);
|
||||
static ssize_t node_file_read(void *instance, uint8_t *buf, size_t n);
|
||||
|
@ -277,14 +277,19 @@ static void *node_dir_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_dir_release(void *instance) {
|
||||
static unsigned node_dir_release(void *instance) {
|
||||
vfs_streams_dir_node_c *sdnp = (vfs_streams_dir_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_streams_driver_static.dir_nodes_pool, (void *)sdnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static msg_t node_dir_getstat(void *instance, vfs_stat_t *sp) {
|
||||
|
@ -327,14 +332,19 @@ static void *node_file_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_file_release(void *instance) {
|
||||
static unsigned node_file_release(void *instance) {
|
||||
vfs_streams_file_node_c *sfnp = (vfs_streams_file_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_streams_driver_static.file_nodes_pool, (void *)sfnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static msg_t node_file_getstat(void *instance, vfs_stat_t *sp) {
|
||||
|
|
|
@ -67,7 +67,7 @@ static const struct vfs_template_driver_vmt driver_vmt = {
|
|||
};
|
||||
|
||||
static void *node_dir_addref(void *instance);
|
||||
static void node_dir_release(void *instance);
|
||||
static unsigned node_dir_release(void *instance);
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip);
|
||||
static msg_t node_dir_next(void *instance, vfs_direntry_info_t *dip);
|
||||
|
||||
|
@ -79,7 +79,7 @@ static const struct vfs_template_dir_node_vmt dir_node_vmt = {
|
|||
};
|
||||
|
||||
static void *node_file_addref(void *instance);
|
||||
static void node_file_release(void *instance);
|
||||
static unsigned node_file_release(void *instance);
|
||||
static BaseSequentialStream *node_file_get_stream(void *instance);
|
||||
static ssize_t node_file_read(void *instance, uint8_t *buf, size_t n);
|
||||
static ssize_t node_file_write(void *instance, const uint8_t *buf, size_t n);
|
||||
|
@ -215,14 +215,19 @@ static void *node_dir_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_dir_release(void *instance) {
|
||||
static unsigned node_dir_release(void *instance) {
|
||||
vfs_template_dir_node_c *dnp = (vfs_template_dir_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_template_driver_static.dir_nodes_pool, (void *)dnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static msg_t node_dir_first(void *instance, vfs_direntry_info_t *dip) {
|
||||
|
@ -256,14 +261,19 @@ static void *node_file_addref(void *instance) {
|
|||
return __referenced_object_addref_impl(instance);
|
||||
}
|
||||
|
||||
static void node_file_release(void *instance) {
|
||||
static unsigned node_file_release(void *instance) {
|
||||
vfs_template_file_node_c *fnp = (vfs_template_file_node_c *)instance;
|
||||
unsigned references;
|
||||
|
||||
__referenced_object_release_impl(instance);
|
||||
if (__referenced_object_getref_impl(instance) == 0U) {
|
||||
chSysLock();
|
||||
references = __referenced_object_release_impl(instance);
|
||||
chSysUnlock();
|
||||
if (references == 0U) {
|
||||
|
||||
chPoolFree(&vfs_template_driver_static.file_nodes_pool, (void *)fnp);
|
||||
}
|
||||
|
||||
return references;
|
||||
}
|
||||
|
||||
static BaseSequentialStream *node_file_get_stream(void *instance) {
|
||||
|
|
Loading…
Reference in New Issue