Skip to content

Commit fbead1d

Browse files
allow timers to be created with arbitrary intervals
1 parent b4dd8f2 commit fbead1d

File tree

9 files changed

+23
-31
lines changed

9 files changed

+23
-31
lines changed

include/taskswitch.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ typedef void (*proc_idle_timer_t)(void);
114114
typedef struct idle_timer {
115115
proc_idle_timer_t func; /**< Function pointer for callback */
116116
struct idle_timer* next; /**< Next idle timer in list */
117+
uint64_t next_tick; /**< Next tick time in get_ticks() */
118+
uint64_t frequency; /**< Tick frequency in ms */
117119
} idle_timer_t;
118120

119121
/**
@@ -217,8 +219,9 @@ pid_t proc_id(int64_t index);
217219
*
218220
* @param handler Function pointer, void(void)
219221
* @param type Foreground or background idle type
222+
* @param frequency_ms Frequency of tick in milliseconds
220223
*/
221-
void proc_register_idle(proc_idle_timer_t handler, idle_type_t type);
224+
void proc_register_idle(proc_idle_timer_t handler, idle_type_t type, uint64_t frequency_ms);
222225

223226
/**
224227
* @brief Change the CSD (current selected directory) of a process.
@@ -248,4 +251,4 @@ void init_process();
248251
* @param callback Function to poll for resumption readiness, or NULL to resume immediately
249252
* @param opaque For use by developer
250253
*/
251-
void proc_set_idle(process_t* proc, activity_callback_t callback, void* opaque);
254+
void proc_set_idle(process_t* proc, activity_callback_t callback, void* opaque);

src/fs/devfs/devfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,5 @@ void init_devfs(void) {
8585
init_debuglog();
8686

8787
/* Periodically update sizes */
88-
proc_register_idle(devfs_update_sizes, IDLE_FOREGROUND);
88+
proc_register_idle(devfs_update_sizes, IDLE_FOREGROUND, 100);
8989
}

src/keyboard.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ void init_keyboard() {
212212
buffer_read_ptr = 0;
213213
make_unique_device_name("kb", devname, sizeof(devname));
214214
register_interrupt_handler(IRQ1, keyboard_handler, dev_zero, NULL);
215-
proc_register_idle(keyboard_repeat_tick, IDLE_BACKGROUND);
215+
proc_register_idle(keyboard_repeat_tick, IDLE_BACKGROUND, 1);
216216
}
217217

218218

src/net/dhcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ void dhcp_init(void) {
445445
udp_register_daemon(DHCP_DST_PORT, &dhcp_handle_packet, NULL);
446446

447447
/* Background task is called every 1 ms in interrupt context */
448-
proc_register_idle(&dhcp_background, IDLE_BACKGROUND);
448+
proc_register_idle(&dhcp_background, IDLE_BACKGROUND, 1);
449449

450450
/* Kick off initial discovery */
451451
dhcp_discover();

src/net/ip.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,6 @@ void ip_init()
590590
{
591591
ethernet_register_iee802_number(ETHERNET_TYPE_IP, (ethernet_protocol_t)ip_handle_packet);
592592
ethernet_register_iee802_number(ETHERNET_TYPE_IP6, (ethernet_protocol_t)ip6_handle_packet);
593-
proc_register_idle(ip_idle, IDLE_BACKGROUND);
594-
proc_register_idle(ip_foreground, IDLE_FOREGROUND);
595-
}
593+
proc_register_idle(ip_idle, IDLE_BACKGROUND, 1);
594+
proc_register_idle(ip_foreground, IDLE_FOREGROUND, 1);
595+
}

src/net/tcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ void tcp_idle()
10441044
void tcp_init()
10451045
{
10461046
tcb = hashmap_new(sizeof(tcp_conn_t), 0, 6, 28, tcp_conn_hash, tcp_conn_compare, NULL, NULL);
1047-
proc_register_idle(tcp_idle, IDLE_FOREGROUND);
1047+
proc_register_idle(tcp_idle, IDLE_FOREGROUND, 1);
10481048
}
10491049

10501050
/**

src/rtl8139.c

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,6 @@ void rtl8139_handler([[maybe_unused]] uint8_t isr, [[maybe_unused]] uint64_t err
144144
in_interrupt = false;
145145
}
146146

147-
void rtl8139_timer()
148-
{
149-
/* For packet timeouts, unused at present */
150-
//rtl8139_handler(rtl8139_device.irq + 32, 0, rtl8139_device.irq, &rtl8139_device);
151-
152-
static bool last_bufe = false;
153-
bool bufe_now = rtl_inb(ChipCmd) & CR_BUFE;
154-
155-
if (bufe_now && !last_bufe) {
156-
kprintf("RX buffer became empty\n");
157-
}
158-
if (!bufe_now && last_bufe) {
159-
kprintf("RX buffer no longer empty\n");
160-
}
161-
last_bufe = bufe_now;
162-
}
163-
164147
char* read_mac_addr() {
165148
uint32_t mac_part1 = rtl_inl(MAC0);
166149
uint16_t mac_part2 = rtl_inw(MAC1);
@@ -332,8 +315,6 @@ void init_rtl8139() {
332315
char* mac_address = read_mac_addr();
333316
kprintf("RTL8139: MAC=%s IO=%04x MMIO=%08x IRQ=%d (PIN#%c)\n", mac_address, rtl8139_device.io_base, rtl8139_device.mem_base, irq_num, irq_pin + 'A' - 1);
334317

335-
proc_register_idle(rtl8139_timer, IDLE_FOREGROUND);
336-
337318
rtl8139_device.active = true;
338319

339320
make_unique_device_name("net", rtl8139_device.name, sizeof(rtl8139_device.name));

src/taskswitch.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,10 @@ void proc_loop()
425425
if (cpu == 0 && task_idles) {
426426
/* Idle foreground tasks only run on BSP */
427427
for (idle_timer_t *i = task_idles; i; i = i->next) {
428-
i->func();
428+
if (i->next_tick > get_ticks()) {
429+
i->func();
430+
i->next_tick = i->frequency + get_ticks();
431+
}
429432
}
430433
}
431434
}
@@ -454,14 +457,16 @@ int proc_ended(process_t* proc)
454457
return basic_finished(proc->code);
455458
}
456459

457-
void proc_register_idle(proc_idle_timer_t handler, idle_type_t type)
460+
void proc_register_idle(proc_idle_timer_t handler, idle_type_t type, uint64_t frequency_ms)
458461
{
459462
dprintf("Register idler: %d\n", type);
460463
idle_timer_t* newidle = kmalloc(sizeof(idle_timer_t));
461464
if (!newidle) {
462465
return;
463466
}
464467
newidle->func = handler;
468+
newidle->next_tick = get_ticks() + frequency_ms;
469+
newidle->frequency = frequency_ms;
465470
if (type == IDLE_FOREGROUND) {
466471
newidle->next = task_idles;
467472
task_idles = newidle;

src/timer.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ void timer_callback(uint8_t isr, uint64_t errorcode, uint64_t irq, void* opaque)
6464
ticks++;
6565

6666
for (idle_timer_t* i = timer_idles; i; i = i->next) {
67-
i->func();
67+
if (i->next_tick > get_ticks()) {
68+
i->func();
69+
i->next_tick = i->frequency + get_ticks();
70+
}
6871
}
6972

7073
if (beep_end != 0 && ticks > beep_end) {

0 commit comments

Comments
 (0)