Listing 3

#include <fcntl.h>
#include <linux/mc146818rtc.h>
#include <sys/ioctl.h>

// The file descriptor for the rtc device
int rtc_fd;

// This will hold the status response from 
// /dev/rtc when an interrupt returns
unsigned long rtc_status;

int thread_main(void*)
{
  // Open the /dev/rtc device file
  rtc_fd = open("/dev/rtc", O_RDONLY);
  if(rtc_ft < 0) return -1;

  // Enable periodic interrupts, and set the interval to 32 Hz
  if(ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) return -1;
  if(ioctl(rtc_fd, RTC_IRQP_SET, 32) < 0) return -1;
  
  while(!video_finished()) {
    show_next_frame();

    // Read from the rtc device. 
    // This will return when the next timer interrupt is raised
    if(read(rtc_fd, &data, sizeof(unsigned long)) < 0) break;

    // Check for missed interrupts, and skip frames if necessary.
    // We need to do the shift because the lower byte of the 
    //  returned unsigned long contains the type of the interrupt
    //  (i.e. whether it's an alarm or a periodic interrupt)
    data >>= 8;
    while(data-- > 1) skip_frame();
  }

  // Turn the periodic interrupt off
  if(ioctl(rtc_fd, RTC_PIE_OFF, 0) < 0) return -1;

  return 0;
}