source: trunk/libs/newlib/src/newlib/libc/stdlib/envlock.c @ 543

Last change on this file since 543 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.4 KB
Line 
1/*
2FUNCTION
3<<__env_lock>>, <<__env_unlock>>---lock environ variable
4
5INDEX
6        __env_lock
7INDEX
8        __env_unlock
9
10SYNOPSIS
11        #include <envlock.h>
12        void __env_lock (struct _reent *<[reent]>);
13        void __env_unlock (struct _reent *<[reent]>);
14
15DESCRIPTION
16The <<setenv>> family of routines call these functions when they need to
17modify the environ variable.  The version of these routines supplied in the
18library use the lock API defined in sys/lock.h.  If multiple threads of
19execution can call <<setenv>>, or if <<setenv>> can be called reentrantly,
20then you need to define your own versions of these functions in order to
21safely lock the memory pool during a call.  If you do not, the memory pool
22may become corrupted.
23
24A call to <<setenv>> may call <<__env_lock>> recursively; that is,
25the sequence of calls may go <<__env_lock>>, <<__env_lock>>,
26<<__env_unlock>>, <<__env_unlock>>.  Any implementation of these
27routines must be careful to avoid causing a thread to wait for a lock
28that it already holds.
29*/
30
31#include "envlock.h"
32#include <sys/lock.h>
33
34#ifndef __SINGLE_THREAD__
35__LOCK_INIT_RECURSIVE(static, __env_recursive_mutex);
36#endif
37
38void
39__env_lock (ptr)
40     struct _reent *ptr;
41{
42#ifndef __SINGLE_THREAD__
43  __lock_acquire_recursive (__env_recursive_mutex);
44#endif
45}
46
47void
48__env_unlock (ptr)
49     struct _reent *ptr;
50{
51#ifndef __SINGLE_THREAD__
52  __lock_release_recursive (__env_recursive_mutex);
53#endif
54}
Note: See TracBrowser for help on using the repository browser.