Integrated task manager with system frame and subframe clock and added support for one task queue per eNB

This commit is contained in:
Xenofon Foukas
2016-01-06 16:22:59 +02:00
parent e0c459be75
commit e78075e831
2 changed files with 38 additions and 27 deletions
+29 -22
View File
@@ -40,6 +40,7 @@
#include <stdio.h>
#include "enb_agent_task_manager.h"
#include "enb_agent_common.c"
/* Util macros */
@@ -74,8 +75,8 @@ void enb_agent_task_destroy(enb_agent_task_t *task) {
free(task);
}
enb_agent_task_queue_t *enb_agent_task_queue_init(size_t capacity,
int (*cmp)(const enb_agent_task_t *t1, const enb_agent_task_t *t2)) {
enb_agent_task_queue_t *enb_agent_task_queue_init(mid_t mod_id, size_t capacity,
int (*cmp)(mid_t mod_id, const enb_agent_task_t *t1, const enb_agent_task_t *t2)) {
enb_agent_task_queue_t *queue = NULL;
queue = malloc(sizeof(enb_agent_task_queue_t));
@@ -88,6 +89,8 @@ enb_agent_task_queue_t *enb_agent_task_queue_init(size_t capacity,
else
queue->cmp = cmp;
queue->mod_id = mod_id;
queue->first_frame = 0;
queue->first_subframe = 0;
@@ -115,8 +118,8 @@ enb_agent_task_queue_t *enb_agent_task_queue_init(size_t capacity,
return NULL;
}
enb_agent_task_queue_t *enb_agent_task_queue_default_init() {
return enb_agent_task_queue_init(DEFAULT_CAPACITY, NULL);
enb_agent_task_queue_t *enb_agent_task_queue_default_init(mid_t mod_id) {
return enb_agent_task_queue_init(mod_id, DEFAULT_CAPACITY, NULL);
}
void enb_agent_task_queue_destroy(enb_agent_task_queue_t *queue) {
@@ -157,7 +160,7 @@ int enb_agent_task_queue_put(enb_agent_task_queue_t *queue, enb_agent_task_t *ta
i = queue->count;
queue->count++;
/*Swap elements to maintain heap properties*/
while(i > 0 && queue->cmp(queue->task[i], queue->task[PARENT(i)]) > 0) {
while(i > 0 && queue->cmp(queue->mod_id, queue->task[i], queue->task[PARENT(i)]) > 0) {
tmp = queue->task[i];
queue->task[i] = queue->task[PARENT(i)];
queue->task[PARENT(i)] = tmp;
@@ -178,11 +181,6 @@ int enb_agent_task_queue_put(enb_agent_task_queue_t *queue, enb_agent_task_t *ta
int enb_agent_task_queue_get_current_task(enb_agent_task_queue_t *queue, enb_agent_task_t **task) {
int err_code;
/*TODO*/
/* Find current frame and subframe number */
uint16_t curr_frame=1;
uint8_t curr_subframe=1;
if (pthread_mutex_lock(queue->mutex)) {
/*TODO*/
@@ -195,6 +193,11 @@ int enb_agent_task_queue_get_current_task(enb_agent_task_queue_t *queue, enb_age
err_code = HEAP_EMPTY;
goto error;
}
/* Find current frame and subframe number */
uint16_t curr_frame=get_current_frame(queue->mod_id);
uint8_t curr_subframe=get_current_subframe(queue->mod_id);
/* If no task is scheduled for the current subframe, return without any task */
if(queue->task[0]->frame_num != curr_frame || queue->task[0]->subframe_num != curr_subframe) {
*task = NULL;
@@ -206,7 +209,16 @@ int enb_agent_task_queue_get_current_task(enb_agent_task_queue_t *queue, enb_age
queue->count--;
/* Restore heap property */
_enb_agent_task_queue_heapify(queue, 0);
/*If queue has no element*/
if (queue->count < 1) {
queue->first_frame = 0;
queue->first_subframe = 0;
} else {
queue->first_frame = queue->task[0]->frame_num;
queue->first_subframe = queue->task[0]->subframe_num;
}
if (pthread_mutex_unlock(queue->mutex)) {
// LOG_E(MAC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__);
exit(1);
@@ -228,14 +240,14 @@ void _enb_agent_task_queue_heapify(enb_agent_task_queue_t *queue, size_t idx) {
r_idx = RIGHT(idx);
/* Left child exists, compare left child with its parent */
if (l_idx < queue->count && queue->cmp(queue->task[l_idx], queue->task[idx]) > 0) {
if (l_idx < queue->count && queue->cmp(queue->mod_id, queue->task[l_idx], queue->task[idx]) > 0) {
lrg_idx = l_idx;
} else {
lrg_idx = idx;
}
/* Right child exists, compare right child with the largest element */
if (r_idx < queue->count && queue->cmp(queue->task[r_idx], queue->task[lrg_idx]) > 0) {
if (r_idx < queue->count && queue->cmp(queue->mod_id, queue->task[r_idx], queue->task[lrg_idx]) > 0) {
lrg_idx = r_idx;
}
@@ -266,12 +278,12 @@ int _enb_agent_task_queue_realloc_heap(enb_agent_task_queue_t *queue) {
return HEAP_NOREALLOC;
}
int _enb_agent_task_queue_cmp(const enb_agent_task_t *t1, const enb_agent_task_t *t2) {
int _enb_agent_task_queue_cmp(mid_t mod_id, const enb_agent_task_t *t1, const enb_agent_task_t *t2) {
if ((t1->frame_num == t2->frame_num) && (t1->subframe_num == t2->subframe_num))
return 0;
/* TODO: need to get current frame and subframe number */
uint16_t curr_frame = 0;
uint8_t curr_subframe = 7;
uint16_t curr_frame = get_current_frame(mod_id);
uint8_t curr_subframe = get_current_subframe(mod_id);
int f_offset, sf_offset, tmp1, tmp2;
@@ -296,8 +308,3 @@ int _enb_agent_task_queue_cmp(const enb_agent_task_t *t1, const enb_agent_task_t
to be the only comparisson parameter in all other cases */
return f_offset*100 + sf_offset;
}
int main(int argc, char **argv) {
return 0;
}
+9 -5
View File
@@ -43,6 +43,8 @@
#include "progran.pb-c.h"
#include "enb_agent_common.h"
#ifdef __cplusplus
extern "C" {
#endif
@@ -65,6 +67,7 @@ typedef struct enb_agent_task_s {
* Priority Queue Structure for tasks
*/
typedef struct enb_agent_task_queue_s {
mid_t mod_id;
/* The amount of allocated memory for agent tasks in the heap*/
volatile size_t capacity;
/* The actual size of the tasks heap at a certain time */
@@ -76,7 +79,7 @@ typedef struct enb_agent_task_queue_s {
/* An array of prioritized tasks stored in a heap */
enb_agent_task_t **task;
/* A pointer to a comparator function, used to prioritize elements */
int (*cmp)(const enb_agent_task_t *t1, const enb_agent_task_t *t2);
int (*cmp)(mid_t mod_id, const enb_agent_task_t *t1, const enb_agent_task_t *t2);
pthread_mutex_t *mutex;
} enb_agent_task_queue_t;
@@ -103,13 +106,13 @@ void enb_agent_task_destroy(enb_agent_task_t *task);
/**
* Allocate initial memory for storing the tasks
*/
enb_agent_task_queue_t *enb_agent_task_queue_init(size_t capacity,
int (*cmp)(const enb_agent_task_t *t1, const enb_agent_task_t *t2));
enb_agent_task_queue_t *enb_agent_task_queue_init(mid_t mod_id, size_t capacity,
int (*cmp)(mid_t mod_id, const enb_agent_task_t *t1, const enb_agent_task_t *t2));
/**
* Allocate initial memory for storing the tasks using default parameters
*/
enb_agent_task_queue_t *enb_agent_task_queue_default_init();
enb_agent_task_queue_t *enb_agent_task_queue_default_init(mid_t mod_id);
/**
* De-allocate memory for the tasks queue
@@ -148,8 +151,9 @@ int _enb_agent_task_queue_realloc_heap(enb_agent_task_queue_t *queue);
* returns 0 if tasks t1, t2 have the same priority
* return negative value if t1 needs to be executed after t2
* return positive value if t1 preceeds t2
* Need to give eNB id for the comparisson based on the current frame-subframe
*/
int _enb_agent_task_queue_cmp(const enb_agent_task_t *t1, const enb_agent_task_t *t2);
int _enb_agent_task_queue_cmp(mid_t mod_id, const enb_agent_task_t *t1, const enb_agent_task_t *t2);
#ifdef __cplusplus
}