import mars-11.tgz

This commit is contained in:
Thomas Schoebel-Theuer 2010-07-05 16:56:58 +01:00
parent cf17986f8b
commit 5a16b68db5
5 changed files with 107 additions and 32 deletions

66
mars.h
View File

@ -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) \

View File

@ -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 = {

View File

@ -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;

View File

@ -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

View File

@ -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);
};