critsec.c File Reference

#include "config.h"
#include <sys/critsec.h>
#include <unistd.h>
#include <sys/tm.h>
#include <tm.h>

Include dependency graph for critsec.c:

Go to the source code of this file.

Functions

int locked_check_and_increment (atomic_t *counter, tdata_t **tid)
 check and increment counter, without interruptions
 __asm__ ("\n\ .text\n\ .global _locked_check_and_increment\n\ _locked_check_and_increment:\n\ push.w r4\n\ stc ccr, r4h\n\ orc #0x80, ccr\n\ mov.b @r0, r4l\n\ beq lci_get_lock\n\ \n\ push.w r2\n\ push.w r3\n\ mov.w @_ctid, r2\n\ mov.w @r1, r3\n\ sub.w r3, r2\n\ bne lci_cant_lock\n\ \n\ pop.w r3\n\ pop.w r2\n\ bra lci_get_lock\n\ \n\ lci_cant_lock:\n\ pop.w r3\n\ pop.w r2\n\ mov.w #0xffff, r0\n\ bra lci_done\n\ \n\ lci_get_lock:\n\ inc r4l\n\ mov.b r4l, @r0\n\ mov.w @_ctid, r0 \n\ mov.w r0, @r1 \n\ sub.w r0, r0\n\ \n\ lci_done:\n\ ldc r4h, ccr\n\ pop.w r4\n\ rts\n\ ")
wakeup_t wait_critical_section (wakeup_t data)
 wakeup when critical section is available
int enter_critical_section (critsec_t *cs)
 enter critical section

Variables

atomic_t kernel_critsec_count
 critical section counter for kernel/task manager


Function Documentation

__asm__ ( "\n\.text\n\.global _locked_check_and_increment\n\ _locked_check_and_increment:\n\ push.w r4\n\ stc   ccr,
r4h\n\orc#  0x80,
ccr\n\mov.b @  r0,
r4l\n\beq lci_get_lock\n\\n\push.w r2\n\push.w r3\n\mov.w @  _ctid,
r2\n\mov.w @  r1,
r3\n\sub.w  r3,
r2\n\bne lci_cant_lock\n\\n\pop.w r3\n\pop.w r2\n\bra lci_get_lock\n\\n\lci_cant_lock:\n\pop.w r3\n\pop.w r2\n\mov.w#  0xffff,
r0\n\bra lci_done\n\\n\lci_get_lock:\n\inc r4l\n\mov.b  r4l,
@r0\n\mov.w @  _ctid,
r0\n\mov.w  r0,
@r1\n\sub.w  r0,
r0\n\\n\lci_done:\n\ldc  r4h,
ccr\n\pop.w r4\n\rts\n\"   
)

int enter_critical_section ( critsec_t cs  ) 

enter critical section

check and lock critical section if it is available; otherwise, wait until it is available, then lock it.

Parameters:
cs pointer to critical section (critsec_t)
Returns:
1 if successful, 0 upon failure
See also:
initialize_critical_section

leave_critical_section

destroy_critical_section

Definition at line 96 of file critsec.c.

References critsec::count, locked_check_and_increment(), critsec::task, wait_critical_section(), and wait_event().

Referenced by CriticalSectionBlock::CriticalSectionBlock().

int locked_check_and_increment ( atomic_t counter,
tdata_t **  tid 
)

check and increment counter, without interruptions

increments counter if count is already zero, or if this is the same task as the one that made it one.

used to enter a normal critical section.

Parameters:
counter pointer to counter to be incremented
tid pointer to pointer to receive task pointer of the task that has locked the resource
Returns:
0xffff if failure, 0 if successful
See also:
locked_decrement

Referenced by enter_critical_section(), and wait_critical_section().

wakeup_t wait_critical_section ( wakeup_t  data  ) 

wakeup when critical section is available

wakeup function used to detect when a critical section is available. called while processing an interrupt, so interrupts are already disabled.

Definition at line 78 of file critsec.c.

References critsec::count, locked_check_and_increment(), and critsec::task.

Referenced by enter_critical_section().


Variable Documentation

atomic_t kernel_critsec_count

critical section counter for kernel/task manager

when the critical section counter is Zero, task swapping is allowed. when greater than zero, task swapping is not allowed. This is checked in the task_switch_handler() in systime.c

Definition at line 17 of file critsec.c.


brickOS is released under the Mozilla Public License.
Original code copyright 1998-2005 by the authors.

Generated on Tue Apr 10 19:51:41 2007 for brickOS Kernel Developer by doxygen 1.5.1