4 * @brief Implementation of scheduler_t.
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 #include "scheduler.h"
29 #include <definitions.h>
30 #include <utils/logger_manager.h>
31 #include <queues/job_queue.h>
34 typedef struct private_scheduler_t private_scheduler_t
;
37 * Private data of a scheduler_t object.
39 struct private_scheduler_t
{
41 * Public part of a scheduler_t object.
46 * @brief Get events from the event queue and add them to to job queue.
48 * Thread function started at creation of the scheduler object.
50 * @param this calling object
52 void (*get_events
) (private_scheduler_t
*this);
57 pthread_t assigned_thread
;
66 * Implementation of private_scheduler_t.get_events.
68 static void get_events(private_scheduler_t
* this)
72 /* cancellation disabled by default */
73 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE
, NULL
);
75 this->logger
->log(this->logger
, CONTROL
, "Scheduler thread running, thread_id %u", (int)pthread_self());
79 this->logger
->log(this->logger
, CONTROL
|LEVEL2
, "Waiting for next event...");
80 /* get a job, this block until one is available */
81 current_job
= charon
->event_queue
->get(charon
->event_queue
);
82 /* queue the job in the job queue, workers will eat them */
83 charon
->job_queue
->add(charon
->job_queue
, current_job
);
84 this->logger
->log(this->logger
, CONTROL
| LEVEL1
, "Got event, added job %s to job-queue.",
85 mapping_find(job_type_m
, current_job
->get_type(current_job
)));
90 * Implementation of scheduler_t.destroy.
92 static void destroy(private_scheduler_t
*this)
94 this->logger
->log(this->logger
, CONTROL
| LEVEL1
, "Going to terminate scheduler thread");
95 pthread_cancel(this->assigned_thread
);
97 pthread_join(this->assigned_thread
, NULL
);
98 this->logger
->log(this->logger
, CONTROL
| LEVEL1
, "Scheduler thread terminated");
104 * Described in header.
106 scheduler_t
* scheduler_create()
108 private_scheduler_t
*this = malloc_thing(private_scheduler_t
);
110 this->public.destroy
= (void(*)(scheduler_t
*)) destroy
;
111 this->get_events
= get_events
;
113 this->logger
= logger_manager
->get_logger(logger_manager
, SCHEDULER
);
115 if (pthread_create(&(this->assigned_thread
), NULL
, (void*(*)(void*))this->get_events
, this) != 0)
117 /* thread could not be created */
118 this->logger
->log(this->logger
, ERROR
, "Scheduler thread could not be created!");
120 charon
->kill(charon
, "Unable to create scheduler thread");
123 return &(this->public);