mirror of https://github.com/schoebel/mars
import mars-11.tgz
This commit is contained in:
parent
cf17986f8b
commit
5a16b68db5
66
mars.h
66
mars.h
|
@ -206,26 +206,26 @@ struct generic_output {
|
|||
GENERIC_OUTPUT(generic);
|
||||
};
|
||||
|
||||
#define _GENERIC_CALL(ERROR,PTR,OP,...) \
|
||||
((PTR)->ops->OP ? (PTR)->ops->OP(__VA_ARGS__) : ERROR) \
|
||||
#define GENERIC_OUTPUT_CALL(OUTPUT,OP,...) \
|
||||
((OUTPUT) && (OUTPUT)->ops->OP ? \
|
||||
(OUTPUT)->ops->OP(OUTPUT, ##__VA_ARGS__) : -ENOSYS) \
|
||||
|
||||
#define GENERIC_CALL(PTR,OP,...) \
|
||||
_GENERIC_CALL(0, PTR, OP, __VA_ARGS__) \
|
||||
|
||||
#define GENERIC_CALL_FORCE(PTR,OP,...) \
|
||||
_GENERIC_CALL(-ENOSYS, PTR, OP, __VA_ARGS__) \
|
||||
#define GENERIC_INPUT_CALL(INPUT,OP,...) \
|
||||
((INPUT) && (INPUT)->connect ? \
|
||||
GENERIC_OUTPUT_CALL((INPUT)->connect, OP, ##__VA_ARGS__) : \
|
||||
-ENOSYS) \
|
||||
|
||||
#define GENERIC_BRICK_OPS(PREFIX) \
|
||||
int (*brick_start)(struct PREFIX##_brick *brick); \
|
||||
int (*brick_stop)(struct PREFIX##_brick *brick); \
|
||||
/*int (*brick_start)(struct PREFIX##_brick *brick);*/ \
|
||||
/*int (*brick_stop)(struct PREFIX##_brick *brick);*/ \
|
||||
|
||||
struct generic_brick_ops {
|
||||
GENERIC_BRICK_OPS(generic);
|
||||
};
|
||||
|
||||
#define GENERIC_OUTPUT_OPS(PREFIX) \
|
||||
int (*output_start)(struct PREFIX##_output *output); \
|
||||
int (*output_stop)(struct PREFIX##_output *output); \
|
||||
/*int (*output_start)(struct PREFIX##_output *output);*/ \
|
||||
/*int (*output_stop)(struct PREFIX##_output *output);*/ \
|
||||
int (*make_object_layout)(struct PREFIX##_output *output, struct generic_object_layout *object_layout); \
|
||||
|
||||
struct generic_output_ops {
|
||||
|
@ -475,15 +475,15 @@ extern inline int INPUT_PREFIX##_##OUTPUT_PREFIX####_disconnect( \
|
|||
} \
|
||||
)
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// MARS-specific definitions
|
||||
|
||||
// object stuff
|
||||
|
||||
#define HT_SHIFT 6 //????
|
||||
#define MARS_MAX_SEGMENT_SIZE (1U << (9+HT_SHIFT))
|
||||
|
||||
/* mars_io */
|
||||
extern const struct generic_object_type mars_io_type;
|
||||
|
||||
struct mars_io_aspect {
|
||||
|
@ -507,11 +507,44 @@ struct mars_io_object {
|
|||
MARS_IO_OBJECT(mars_io);
|
||||
};
|
||||
|
||||
/* mars_buf */
|
||||
#define MARS_BUF_UPTODATE 1
|
||||
#define MARS_BUF_DIRTY 2
|
||||
|
||||
extern const struct generic_object_type mars_buffer_type;
|
||||
|
||||
struct mars_buf_aspect {
|
||||
GENERIC_ASPECT(mars_buf);
|
||||
};
|
||||
|
||||
struct mars_buf_aspect_layout {
|
||||
GENERIC_ASPECT_LAYOUT(mars_buf);
|
||||
};
|
||||
|
||||
struct mars_buf_object_layout {
|
||||
GENERIC_OBJECT_LAYOUT(mars_buf);
|
||||
};
|
||||
|
||||
#define MARS_BUF_OBJECT(PREFIX) \
|
||||
MARS_IO_OBJECT(PREFIX); \
|
||||
spinlock_t buf_lock; \
|
||||
void *buf_data; \
|
||||
int buf_len; \
|
||||
int buf_flags; \
|
||||
loff_t buf_pos; \
|
||||
|
||||
struct mars_buf_object {
|
||||
MARS_BUF_OBJECT(mars_buf);
|
||||
};
|
||||
|
||||
GENERIC_OBJECT_LAYOUT_FUNCTIONS(mars_io);
|
||||
GENERIC_OBJECT_LAYOUT_FUNCTIONS(mars_buf);
|
||||
|
||||
GENERIC_OBJECT_FUNCTIONS(mars_io);
|
||||
GENERIC_OBJECT_FUNCTIONS(mars_buf);
|
||||
|
||||
// brick stuff
|
||||
extern const struct generic_object_type mars_buf_type;
|
||||
|
||||
#define MARS_BRICK(PREFIX) \
|
||||
GENERIC_BRICK(PREFIX); \
|
||||
|
@ -540,8 +573,13 @@ struct mars_output {
|
|||
|
||||
#define MARS_OUTPUT_OPS(PREFIX) \
|
||||
GENERIC_OUTPUT_OPS(PREFIX); \
|
||||
/* mars_io */ \
|
||||
int (*mars_io)(struct PREFIX##_output *output, struct mars_io_object *mio); \
|
||||
loff_t (*mars_get_size)(struct PREFIX##_output *output); \
|
||||
/* mars_buf */ \
|
||||
int (*mars_buf_get)(struct PREFIX##_output *output, struct mars_buf_object **mbuf, struct mars_buf_object_layout *buf_layout, loff_t pos, int len); \
|
||||
int (*mars_buf_put)(struct PREFIX##_output *output, struct mars_buf_object *mbuf); \
|
||||
int (*mars_buf_io)(struct PREFIX##_output *output, struct mars_buf_object *mbuf, int rw, int(*buf_endio)(struct mars_buf_object *mbuf)); \
|
||||
|
||||
// all non-extendable types
|
||||
#define _MARS_TYPES(PREFIX) \
|
||||
|
|
59
mars_dummy.c
59
mars_dummy.c
|
@ -17,47 +17,67 @@
|
|||
static int dummy_io(struct dummy_output *output, struct mars_io_object *mio)
|
||||
{
|
||||
struct dummy_input *input = output->brick->inputs[0];
|
||||
struct dummy_output *other;
|
||||
if (unlikely(!input))
|
||||
return -ENOSYS;
|
||||
other = input->connect;
|
||||
if (unlikely(!other || !other->ops || !other->ops->mars_io))
|
||||
return -ENOSYS;
|
||||
return other->ops->mars_io(other, mio);
|
||||
return GENERIC_INPUT_CALL(input, mars_io, mio);
|
||||
}
|
||||
|
||||
static loff_t dummy_get_size(struct dummy_output *output)
|
||||
{
|
||||
struct dummy_input *input = output->brick->inputs[0];
|
||||
struct dummy_output *other;
|
||||
if (unlikely(!input))
|
||||
return -ENOSYS;
|
||||
other = input->connect;
|
||||
if (unlikely(!other || !other->ops || !other->ops->mars_get_size))
|
||||
return -ENOSYS;
|
||||
return other->ops->mars_get_size(other);
|
||||
return GENERIC_INPUT_CALL(input, mars_get_size);
|
||||
}
|
||||
|
||||
static int dummy_buf_get(struct dummy_output *output, struct mars_buf_object **mbuf, struct mars_buf_object_layout *buf_layout, loff_t pos, int len)
|
||||
{
|
||||
struct dummy_input *input = output->brick->inputs[0];
|
||||
return GENERIC_INPUT_CALL(input, mars_buf_get, mbuf, buf_layout, pos, len);
|
||||
}
|
||||
|
||||
static int dummy_buf_put(struct dummy_output *output, struct mars_buf_object *mbuf)
|
||||
{
|
||||
struct dummy_input *input = output->brick->inputs[0];
|
||||
return GENERIC_INPUT_CALL(input, mars_buf_put, mbuf);
|
||||
}
|
||||
|
||||
static int dummy_buf_io(struct dummy_output *output, struct mars_buf_object *mbuf, int rw, int(*buf_endio)(struct mars_buf_object *mbuf))
|
||||
{
|
||||
struct dummy_input *input = output->brick->inputs[0];
|
||||
return GENERIC_INPUT_CALL(input, mars_buf_io, mbuf, rw, buf_endio);
|
||||
}
|
||||
|
||||
//////////////// object / aspect constructors / destructors ///////////////
|
||||
|
||||
static int dummy_aspect_init_fn(struct mars_io_aspect *_ini, void *_init_data)
|
||||
static int dummy_mars_io_aspect_init_fn(struct mars_io_aspect *_ini, void *_init_data)
|
||||
{
|
||||
struct dummy_mars_io_aspect *ini = (void*)_ini;
|
||||
ini->my_own = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_mars_buf_aspect_init_fn(struct mars_buf_aspect *_ini, void *_init_data)
|
||||
{
|
||||
struct dummy_mars_buf_aspect *ini = (void*)_ini;
|
||||
ini->my_own = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_make_object_layout(struct dummy_output *output, struct generic_object_layout *object_layout)
|
||||
{
|
||||
const struct generic_object_type *object_type = object_layout->type;
|
||||
int res;
|
||||
int aspect_size = 0;
|
||||
struct dummy_brick *brick = output->brick;
|
||||
int i;
|
||||
|
||||
if (object_type != &mars_io_type)
|
||||
if (object_type == &mars_io_type) {
|
||||
aspect_size = sizeof(struct dummy_mars_io_aspect);
|
||||
res = mars_io_add_aspect(object_layout, aspect_size, dummy_mars_io_aspect_init_fn, output);
|
||||
} else if (object_type == &mars_buf_type) {
|
||||
aspect_size = sizeof(struct dummy_mars_buf_aspect);
|
||||
res = mars_buf_add_aspect(object_layout, aspect_size, dummy_mars_buf_aspect_init_fn, output);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
res = mars_io_add_aspect(object_layout, sizeof(struct dummy_mars_io_aspect), dummy_aspect_init_fn, output);
|
||||
if (res < 0)
|
||||
return res;
|
||||
|
||||
|
@ -73,7 +93,7 @@ static int dummy_make_object_layout(struct dummy_output *output, struct generic_
|
|||
}
|
||||
}
|
||||
|
||||
return res + sizeof(struct dummy_mars_io_aspect);
|
||||
return res + aspect_size;
|
||||
}
|
||||
|
||||
////////////////////// brick constructors / destructors ////////////////////
|
||||
|
@ -99,6 +119,9 @@ static struct dummy_output_ops dummy_output_ops = {
|
|||
.make_object_layout = dummy_make_object_layout,
|
||||
.mars_io = dummy_io,
|
||||
.mars_get_size = dummy_get_size,
|
||||
.mars_buf_get = dummy_buf_get,
|
||||
.mars_buf_put = dummy_buf_put,
|
||||
.mars_buf_io = dummy_buf_io,
|
||||
};
|
||||
|
||||
static struct dummy_input_type dummy_input_type = {
|
||||
|
|
|
@ -7,6 +7,11 @@ struct dummy_mars_io_aspect {
|
|||
int my_own;
|
||||
};
|
||||
|
||||
struct dummy_mars_buf_aspect {
|
||||
GENERIC_ASPECT(mars_buf);
|
||||
int my_own;
|
||||
};
|
||||
|
||||
struct dummy_brick {
|
||||
MARS_BRICK(dummy);
|
||||
int my_own;
|
||||
|
|
|
@ -17,6 +17,12 @@ const struct generic_object_type mars_io_type = {
|
|||
};
|
||||
EXPORT_SYMBOL_GPL(mars_io_type);
|
||||
|
||||
const struct generic_object_type mars_buf_type = {
|
||||
.object_type_name = "mars_buf",
|
||||
.default_size = sizeof(struct mars_buf_object),
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(mars_buf_type);
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
// brick stuff
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
#ifndef MARS_IF_DEVICE_H
|
||||
#define MARS_IF_DEVICE_H
|
||||
|
||||
#define HT_SHIFT 6 //????
|
||||
#define MARS_MAX_SEGMENT_SIZE (1U << (9+HT_SHIFT))
|
||||
|
||||
struct if_device_brick {
|
||||
MARS_BRICK(if_device);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue