45 static void switch_channel_buffers(
msg_channel * mc)
49 mc->buffers[M_WRITE]->read = 0;
50 mc->buffers[M_READ]->written = 0;
52 swap = mc->buffers[M_WRITE];
53 mc->buffers[M_WRITE] = mc->buffers[M_READ];
54 mc->buffers[M_READ] = swap;
59 rsfree((
void *)mc->buffers[M_WRITE]->buffer);
60 rsfree((
void *)mc->buffers[M_READ]->buffer);
61 rsfree(mc->buffers[M_WRITE]);
62 rsfree(mc->buffers[M_READ]);
70 mc->buffers[M_READ] = rsalloc(
sizeof(
struct _msg_buff));
71 mc->buffers[M_WRITE] = rsalloc(
sizeof(
struct _msg_buff));
73 if (mc->buffers[M_READ] == NULL || mc->buffers[M_WRITE] == NULL)
74 rootsim_error(
true,
"Unable to allocate message channel\n");
76 mc->buffers[M_READ]->buffer =
77 rsalloc(INITIAL_CHANNEL_SIZE *
sizeof(
msg_t *));
78 mc->buffers[M_READ]->size = INITIAL_CHANNEL_SIZE;
79 mc->buffers[M_READ]->written = 0;
80 mc->buffers[M_READ]->read = 0;
82 mc->buffers[M_WRITE]->buffer =
83 rsalloc(INITIAL_CHANNEL_SIZE *
sizeof(
msg_t *));
84 mc->buffers[M_WRITE]->size = INITIAL_CHANNEL_SIZE;
85 mc->buffers[M_WRITE]->written = 0;
86 mc->buffers[M_WRITE]->read = 0;
88 if (mc->buffers[M_READ]->buffer == NULL
89 || mc->buffers[M_WRITE]->buffer == NULL)
90 rootsim_error(
true,
"Unable to allocate message channel\n");
105 (mc->buffers[M_WRITE]->written == mc->buffers[M_WRITE]->size)) {
107 mc->buffers[M_WRITE]->size *= 2;
108 mc->buffers[M_WRITE]->buffer =
109 rsrealloc((
void *)mc->buffers[M_WRITE]->buffer,
110 mc->buffers[M_WRITE]->size *
sizeof(
msg_t *));
112 if (
unlikely(mc->buffers[M_WRITE]->buffer == NULL))
113 rootsim_error(
true,
"Unable to reallocate message channel\n");
120 int index = mc->buffers[M_WRITE]->written++;
121 mc->buffers[M_WRITE]->buffer[index] = msg;
130 if (
unlikely(mc->buffers[M_READ]->read == mc->buffers[M_READ]->written)) {
132 switch_channel_buffers(mc);
136 if (
unlikely(mc->buffers[M_READ]->read == mc->buffers[M_READ]->written)) {
140 int index = mc->buffers[M_READ]->read++;
141 msg = mc->buffers[M_READ]->buffer[index];
145 mc->buffers[M_READ]->buffer[index] = (
void *)0xDEADB00B;
#define spinlock_init(s)
Spinlock initialization.
A (M, 1) channel for messages.
Core ROOT-Sim functionalities.
void atomic_dec(atomic_t *)
Memory Manager main header.
void spin_lock(spinlock_t *s)
void validate_msg(msg_t *msg)
Perform some sanity checks on a message buffer.
#define unlikely(exp)
Optimize the branch as likely not taken.
void spin_unlock(spinlock_t *s)