NaviServer - programmable web server

[ Main Table Of Contents | Table Of Contents | Keyword Index ]

# ns_critsec(n) 4.99.8 naviserver "NaviServer Built-in Commands"

## Name

ns_critsec - Operate on critical section objects

## Table Of Contents

## Synopsis

- ns_critsec option ?arg arg ...?
- ns_critsec create
- ns_critsec destroy object
- ns_critsec enter object
- ns_critsec leaves object

## Description

This command provides a mechanism to manipulate critical section objects.

## COMMANDS

ns_critsec option ?arg arg ...?

ns_critsec create

  Initializes a new critical section object and returns a handle to it.

ns_critsec destroy object

  Destroys the critical section object and frees any resources it was using.

ns_critsec enter object

  Enters the critical section. The thread will block if another thread is already in the critical section.

ns_critsec leaves object

  Leaves the critical section. When the thread leaves the critical section as many times as it has entered, a notification will be sent to other threads that are waiting on the critical section.

## EXAMPLES

Is this the right way to use this command? The example is contrived, but I wanted to call ns_critsec multiple times.

       # If a thread is executing any of these procs, no other
       # thread can execute any of these procs until the first
       # thread has completely finished.
       nsv_set . special_file_critsec [ns_critsec create]
       proc write_special_file {data} {
           set critsec [nsv_get . special_file_critsec]
           ns_critsec enter $critsec
           set handle [open special_file w]
           puts $handle $data
           close $handle
           ns_critsec leave $critsec
       }
       proc read_special_file {} {
           set critsec [nsv_get . special_file_critsec]
           ns_critsec enter $critsec
           set handle [open special_file r]
           set result [read $handle]
           close $handle
           ns_critsec leave $critsec
           return $result
       }
       proc change_special_file {data} {
           set critsec [nsv_get . special_file_critsec]
           ns_critsec enter $critsec
           set result [read_special_file]
           write_special_file $data
           ns_critsec leave $critsec
           return $result
       }

## See Also

ns_cond, ns_event, ns_mutex, ns_thread