Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

spinlock.h File Reference

This graph shows which files directly or indirectly include this file:

Included by dependency graph

Go to the source code of this file.

Functions

int acquire_access (short int *semaphore, double timeout)
int release_access (short int *semaphore, double timeout)
int increment_read_status (short int *)
int decrement_read_status (short int *)
int increment_write_status (short int *)
int decrement_write_status (short int *)


Function Documentation

int acquire_access short int *    semaphore,
double    timeout
 

Definition at line 24 of file spinlock.c.

00025 {
00026   ULONG timeout_ticks, start_ticks, current_ticks, elapsed_ticks;
00027   if (timeout == 0.0)
00028     {
00029       timeout_ticks = 1;
00030       start_ticks = tickGet ();
00031       elapsed_ticks = 0;
00032     }
00033   else if (timeout > 0.0)
00034     {
00035       timeout_ticks = (int) (timeout * sysClkRateGet ());
00036       start_ticks = tickGet ();
00037       elapsed_ticks = 0;
00038     }
00039 
00040   /* loop until timeout_count expires */
00041   while (elapsed_ticks <= timeout_ticks && (timeout >= 0.0))
00042     {
00043       taskLock ();
00044       if (!increment_read_status (sem))
00045         {
00046           return 0;             /* success */
00047         }
00048       else
00049         {
00050           taskUnlock ();
00051           taskDelay (1);
00052           if (timeout >= 0.0)
00053             {
00054               current_ticks = tickGet ();
00055               elapsed_ticks = current_ticks - start_ticks;
00056             }
00057         }
00058     }
00059 
00060   taskUnlock ();
00061   rcs_print_error ("timed out while acquiring access on semaphore 0x%x\n",
00062                    (int) sem);
00063   return -1;                    /* indicate timeout failure */
00064 }

int release_access short int *    semaphore,
double    timeout
 

Definition at line 68 of file spinlock.c.

00069 {
00070   int tst;
00071   ULONG timeout_ticks, start_ticks, current_ticks, elapsed_ticks;
00072   timeout_ticks = (ULONG) (timeout * sysClkRateGet ());
00073   start_ticks = tickGet ();
00074   elapsed_ticks = 0;
00075 
00076   while (elapsed_ticks <= timeout_ticks)
00077     {
00078       tst = decrement_read_status (sem);
00079       if (tst == 0)
00080         {
00081           taskUnlock ();
00082           return 0;             /* success */
00083         }
00084       else
00085         {
00086           if (tst < 0)
00087             {
00088               taskUnlock ();
00089               rcs_print_error ("invalid semaphore on 0x%x", (int) sem);
00090               return -1;        /* invalid semaphore  */
00091             }
00092         }
00093       current_ticks = tickGet ();
00094       elapsed_ticks = current_ticks - start_ticks;
00095     }
00096 
00097   taskUnlock ();
00098   rcs_print_error ("timed out while releasing access on semphore 0x%x",
00099                    (int) sem);
00100   return -1;                    /* timeout failure */
00101 }

int increment_read_status short int *   
 

Referenced by acquire_access().

int decrement_read_status short int *   
 

Referenced by release_access().

int increment_write_status short int *   
 

int decrement_write_status short int *   
 


Generated on Sun Dec 2 15:57:57 2001 for rcslib by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001