source: src/libcfa/concurrency/alarm.c@ 7e003011

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since 7e003011 was 6cff9f3, checked in by Thierry Delisle <tdelisle@…>, 8 years ago

Implementation of a priority queue for alarms

  • Property mode set to 100644
File size: 1.6 KB
Line 
1// -*- Mode: CFA -*-
2//
3// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
4//
5// The contents of this file are covered under the licence agreement in the
6// file "LICENCE" distributed with Cforall.
7//
8// alarm.c --
9//
10// Author : Thierry Delisle
11// Created On : Fri Jun 2 11:31:25 2017
12// Last Modified By : Thierry Delisle
13// Last Modified On : --
14// Update Count : 0
15//
16
17#include "alarm.h"
18#include "kernel_private.h"
19
20static void register_self( alarm_node_t * this ) {
21 lock( &systemProcessor->alarm_lock );
22 insert( &systemProcessor->alarms, this );
23 unlock( &systemProcessor->alarm_lock );
24}
25
26void ?{}( alarm_node_t * this, thread_desc * thrd, cfa_time_t alarm, cfa_time_t period = 0 ) {
27 this->thrd = thrd;
28 this->alarm = alarm;
29 this->period = period;
30 this->next = 0;
31
32 register_self( this );
33}
34
35void ?{}( alarm_node_t * this, processor * proc, cfa_time_t alarm, cfa_time_t period = 0 ) {
36 this->proc = proc;
37 this->alarm = alarm;
38 this->period = period;
39 this->next = 0;
40
41 register_self( this );
42}
43
44static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) {
45 assert( !n->next );
46 if( p == this->tail ) {
47 this->tail = &n->next;
48 }
49 else {
50 n->next = *p;
51 }
52 *p = n;
53}
54
55void insert( alarm_list_t * this, alarm_node_t * n ) {
56 alarm_node_t ** it = &this->head;
57 while( (*it) && (n->alarm > (*it)->alarm) ) {
58 it = &(*it)->next;
59 }
60
61 insert_at( this, n, it );
62}
63
64void pop( alarm_list_t * this ) {
65 alarm_node_t * head = this->head;
66 if( head ) {
67 this->head = head->next;
68 if( !head->next ) {
69 this->tail = &this->head;
70 }
71 head->next = NULL;
72 }
73 return head;
74}
Note: See TracBrowser for help on using the repository browser.