Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2007-11-27 17:45:14 +0300
committerCorinna Vinschen <corinna@vinschen.de>2007-11-27 17:45:14 +0300
commita1591d3be7fefcec8056bf5f74be0590fb356605 (patch)
tree91efdab7419ce063dac8b9e7d798f32c5ee7e8be /winsup/cygwin
parent230a3c86d1f40fba642bd7a68ca88878163bcd5f (diff)
Drop old SetResourceLock stuff in favor of mutos.
* dcrt0.cc (_reslock): Remove. (__cygwin_user_data): Accommodate removal of resourcelocks member. (dll_crt0_0): Don't initialize resourcelocks. * exceptions.cc (_cygtls::signal_exit): Drop resourcelocks handling. * mmap.cc (mmap_guard): New muto. (LIST_LOCK): Define. (LIST_UNLOCK): Define. (mmap_list::search_record): Remove. (mmap_list::try_map): Include code for anonymous case from mmap_list::search_record. (mmap_is_attached_or_noreserve): Access bookkeeping lists in a thread safe way. (mmap64): Replace SetResourceLock/ReleaseResourceLock by LIST_LOCK/LIST_UNLOCK. Lock at the latest possible point. (munmap): Replace SetResourceLock/ReleaseResourceLock by LIST_LOCK/LIST_UNLOCK. (msync): Ditto. (mprotect): Ditto. * thread.cc (ResourceLocks::Lock): Remove. (SetResourceLock): Remove. (ReleaseResourceLock): Remove. (ResourceLocks::Init): Remove. (ResourceLocks::Delete): Remove. * thread.h (SetResourceLock): Drop declaration. (ReleaseResourceLock): Ditto. (class ResourceLocks): Drop definition. * include/sys/cygwin.h (class ResourceLocks): Drop forward declaration. (struct per_process): Replace resourcelocks with additional unused2 element. (per_process_overwrite): Accommodate above change.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog34
-rw-r--r--winsup/cygwin/dcrt0.cc6
-rw-r--r--winsup/cygwin/exceptions.cc3
-rw-r--r--winsup/cygwin/include/sys/cygwin.h7
-rw-r--r--winsup/cygwin/mmap.cc98
-rw-r--r--winsup/cygwin/thread.cc37
-rw-r--r--winsup/cygwin/thread.h18
7 files changed, 85 insertions, 118 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 0c4f45e9e..c1b94b7c8 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,39 @@
2007-11-27 Corinna Vinschen <corinna@vinschen.de>
+ Drop old SetResourceLock stuff in favor of mutos.
+ * dcrt0.cc (_reslock): Remove.
+ (__cygwin_user_data): Accommodate removal of resourcelocks member.
+ (dll_crt0_0): Don't initialize resourcelocks.
+ * exceptions.cc (_cygtls::signal_exit): Drop resourcelocks handling.
+ * mmap.cc (mmap_guard): New muto.
+ (LIST_LOCK): Define.
+ (LIST_UNLOCK): Define.
+ (mmap_list::search_record): Remove.
+ (mmap_list::try_map): Include code for anonymous case from
+ mmap_list::search_record.
+ (mmap_is_attached_or_noreserve): Access bookkeeping lists in a thread
+ safe way.
+ (mmap64): Replace SetResourceLock/ReleaseResourceLock by
+ LIST_LOCK/LIST_UNLOCK. Lock at the latest possible point.
+ (munmap): Replace SetResourceLock/ReleaseResourceLock by
+ LIST_LOCK/LIST_UNLOCK.
+ (msync): Ditto.
+ (mprotect): Ditto.
+ * thread.cc (ResourceLocks::Lock): Remove.
+ (SetResourceLock): Remove.
+ (ReleaseResourceLock): Remove.
+ (ResourceLocks::Init): Remove.
+ (ResourceLocks::Delete): Remove.
+ * thread.h (SetResourceLock): Drop declaration.
+ (ReleaseResourceLock): Ditto.
+ (class ResourceLocks): Drop definition.
+ * include/sys/cygwin.h (class ResourceLocks): Drop forward declaration.
+ (struct per_process): Replace resourcelocks with additional unused2
+ element.
+ (per_process_overwrite): Accommodate above change.
+
+2007-11-27 Corinna Vinschen <corinna@vinschen.de>
+
* mmap.cc: Convert usage of dynamically growing cmalloced arrays to
cmalloced linked lists throughout.
(class mmap_record): Add LIST_ENTRY element.
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 801b7fbf8..bb4a2c1d5 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -80,7 +80,6 @@ bool NO_COPY cygwin_finished_initializing;
measure to allow an orderly transfer to the new, correct sigmask method. */
unsigned NO_COPY int signal_shift_subtract = 1;
-ResourceLocks _reslock NO_COPY;
MTinterface _mtinterf;
bool NO_COPY _cygwin_testing;
@@ -113,8 +112,8 @@ extern "C"
/* hmodule */ NULL,
/* api_major */ CYGWIN_VERSION_API_MAJOR,
/* api_minor */ CYGWIN_VERSION_API_MINOR,
- /* unused2 */ {0, 0, 0, 0, 0},
- /* resourcelocks */ &_reslock, /* threadinterface */ &_mtinterf,
+ /* unused2 */ {0, 0, 0, 0, 0, 0},
+ /* threadinterface */ &_mtinterf,
/* impure_ptr */ _GLOBAL_REENT,
};
bool ignore_case_with_glob;
@@ -759,7 +758,6 @@ dll_crt0_0 ()
}
}
- user_data->resourcelocks->Init ();
user_data->threadinterface->Init ();
_cygtls::init ();
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 648a39f43..e3569ce23 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -1286,9 +1286,6 @@ _cygtls::signal_exit (int rc)
stupid. */
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
- user_data->resourcelocks->Delete ();
- user_data->resourcelocks->Init ();
-
sigproc_printf ("about to call do_exit (%x)", rc);
SetEvent (signal_arrived);
do_exit (rc);
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h
index 7cc36c434..7fe4a1377 100644
--- a/winsup/cygwin/include/sys/cygwin.h
+++ b/winsup/cygwin/include/sys/cygwin.h
@@ -140,7 +140,6 @@ extern HANDLE cygwin_logon_user (const struct passwd *, const char *);
*/
#ifdef __cplusplus
-class ResourceLocks;
class MTinterface;
#endif
@@ -198,18 +197,16 @@ struct per_process
DWORD api_minor; /* linked with */
/* For future expansion, so apps won't have to be relinked if we
add an item. */
- DWORD unused2[5];
+ DWORD unused2[6];
#if defined (__INSIDE_CYGWIN__) && defined (__cplusplus)
- ResourceLocks *resourcelocks;
MTinterface *threadinterface;
#else
- void *resourcelocks;
void *threadinterface;
#endif
struct _reent *impure_ptr;
};
-#define per_process_overwrite ((unsigned) &(((struct per_process *) NULL)->resourcelocks))
+#define per_process_overwrite ((unsigned) &(((struct per_process *) NULL)->threadinterface))
extern void cygwin_premain0 (int argc, char **argv, struct per_process *);
extern void cygwin_premain1 (int argc, char **argv, struct per_process *);
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc
index 38ca0073f..69b4f1168 100644
--- a/winsup/cygwin/mmap.cc
+++ b/winsup/cygwin/mmap.cc
@@ -51,6 +51,11 @@ details. */
/* Used for anonymous mappings. */
static fhandler_dev_zero fh_anonymous;
+/* Used for thread synchronization while accessing mmap bookkeeping lists. */
+static NO_COPY muto mmap_guard;
+#define LIST_LOCK() (mmap_guard.init ("mmap_guard")->acquire ())
+#define LIST_UNLOCK() (mmap_guard.release ())
+
/* Small helpers to avoid having lots of flag bit tests in the code. */
static inline bool
priv (int flags)
@@ -333,7 +338,6 @@ class mmap_list
void set (int nfd, struct __stat64 *st);
mmap_record *add_record (mmap_record r);
bool del_record (mmap_record *rec);
- mmap_record *search_record (_off64_t off, DWORD len);
caddr_t try_map (void *addr, size_t len, int flags, _off64_t off);
};
@@ -552,31 +556,6 @@ mmap_list::add_record (mmap_record r)
return rec;
}
-/* Used in mmap() */
-mmap_record *
-mmap_list::search_record (_off64_t off, DWORD len)
-{
- mmap_record *rec;
-
- if (anonymous () && !off)
- {
- len = PAGE_CNT (len);
- LIST_FOREACH (rec, &recs, mr_next)
- if (rec->find_unused_pages (len) != (DWORD)-1)
- return rec;
- }
- else
- {
- LIST_FOREACH (rec, &recs, mr_next)
- if (off >= rec->get_offset ()
- && off + len
- <= rec->get_offset ()
- + (PAGE_CNT (rec->get_len ()) * getsystempagesize ()))
- return rec;
- }
- return NULL;
-}
-
void
mmap_list::set (int nfd, struct __stat64 *st)
{
@@ -611,10 +590,13 @@ mmap_list::try_map (void *addr, size_t len, int flags, _off64_t off)
{
/* If MAP_FIXED isn't given, check if this mapping matches into the
chunk of another already performed mapping. */
- if ((rec = search_record (off, len)) != NULL
- && rec->compatible_flags (flags))
+ DWORD plen = PAGE_CNT (len);
+ LIST_FOREACH (rec, &recs, mr_next)
+ if (rec->find_unused_pages (plen) != (DWORD) -1)
+ break;
+ if (rec && rec->compatible_flags (flags))
{
- if ((off = rec->map_pages (off, len)) == (_off64_t)-1)
+ if ((off = rec->map_pages (off, len)) == (_off64_t) -1)
return (caddr_t) MAP_FAILED;
return (caddr_t) rec->get_address () + off;
}
@@ -705,6 +687,9 @@ mmap_areas::del_list (mmap_list *ml)
mmap_region_status
mmap_is_attached_or_noreserve (void *addr, size_t len)
{
+ mmap_region_status ret = MMAP_NONE;
+
+ LIST_LOCK ();
mmap_list *map_list = mmapped_areas.get_list_by_fd (-1, NULL);
size_t pagesize = getpagesize ();
@@ -713,7 +698,7 @@ mmap_is_attached_or_noreserve (void *addr, size_t len)
len = roundup2 (len, pagesize);
if (map_list == NULL)
- return MMAP_NONE;
+ goto out;
mmap_record *rec;
caddr_t u_addr;
@@ -724,9 +709,12 @@ mmap_is_attached_or_noreserve (void *addr, size_t len)
if (!rec->match (start_addr, len, u_addr, u_len))
continue;
if (rec->attached ())
- return MMAP_RAISE_SIGBUS;
+ {
+ ret = MMAP_RAISE_SIGBUS;
+ break;
+ }
if (!rec->noreserve ())
- return MMAP_NONE;
+ break;
size_t commit_len = u_len - (start_addr - u_addr);
if (commit_len > len)
@@ -734,14 +722,22 @@ mmap_is_attached_or_noreserve (void *addr, size_t len)
if (!VirtualAlloc (start_addr, commit_len, MEM_COMMIT,
rec->gen_protect ()))
- return MMAP_RAISE_SIGBUS;
+ {
+ ret = MMAP_RAISE_SIGBUS;
+ break;
+ }
start_addr += commit_len;
len -= commit_len;
if (!len)
- return MMAP_NORESERVE_COMMITED;
+ {
+ ret = MMAP_NORESERVE_COMMITED;
+ break;
+ }
}
- return MMAP_NONE;
+out:
+ LIST_UNLOCK ();
+ return ret;
}
static caddr_t
@@ -788,8 +784,6 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off)
fh_anonymous.set_io_handle (INVALID_HANDLE_VALUE);
fh_anonymous.set_access (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE);
- SetResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
-
/* EINVAL error conditions. */
if (off % pagesize
|| ((prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)))
@@ -939,6 +933,7 @@ go_ahead:
if (noreserve (flags) && (!anonymous (flags) || !priv (flags)))
flags &= ~MAP_NORESERVE;
+ LIST_LOCK ();
map_list = mmapped_areas.get_list_by_fd (fd, &st);
/* Test if an existing anonymous mapping can be recycled. */
@@ -946,11 +941,11 @@ go_ahead:
{
caddr_t tried = map_list->try_map (addr, len, flags, off);
/* try_map returns NULL if no map matched, otherwise it returns
- a valid address, of MAP_FAILED in case of a fatal error. */
+ a valid address, or MAP_FAILED in case of a fatal error. */
if (tried)
{
ret = tried;
- goto out;
+ goto out_with_unlock;
}
}
@@ -974,13 +969,13 @@ go_ahead:
if (!newaddr)
{
__seterrno ();
- goto out;
+ goto out_with_unlock;
}
}
if (!VirtualFree (newaddr, 0, MEM_RELEASE))
{
__seterrno ();
- goto out;
+ goto out_with_unlock;
}
addr = newaddr;
}
@@ -988,7 +983,7 @@ go_ahead:
base = mmap_worker (map_list, fh, (caddr_t) addr, len, prot, flags, fd, off,
&st);
if (!base)
- goto out;
+ goto out_with_unlock;
if (orig_len)
{
@@ -1024,7 +1019,7 @@ go_ahead:
{
fh->munmap (fh->get_handle (), base, len);
set_errno (ENOMEM);
- goto out;
+ goto out_with_unlock;
}
at_base += valid_page_len;
}
@@ -1042,9 +1037,10 @@ go_ahead:
ret = base;
-out:
+out_with_unlock:
+ LIST_UNLOCK ();
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
+out:
if (fh_disk_file)
NtClose (fh_disk_file->get_handle ());
@@ -1080,7 +1076,7 @@ munmap (void *addr, size_t len)
}
len = roundup2 (len, pagesize);
- SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
+ LIST_LOCK ();
/* Iterate through the map, unmap pages between addr and addr+len
in all maps. */
@@ -1117,7 +1113,7 @@ munmap (void *addr, size_t len)
}
}
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
+ LIST_UNLOCK ();
syscall_printf ("0 = munmap(): %x", addr);
return 0;
}
@@ -1132,7 +1128,7 @@ msync (void *addr, size_t len, int flags)
syscall_printf ("msync (addr: %p, len %u, flags %x)", addr, len, flags);
- SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
+ LIST_LOCK ();
if (((uintptr_t) addr % getpagesize ())
|| (flags & ~(MS_ASYNC | MS_SYNC | MS_INVALIDATE))
@@ -1173,8 +1169,8 @@ msync (void *addr, size_t len, int flags)
set_errno (ENOMEM);
out:
+ LIST_UNLOCK ();
syscall_printf ("%d = msync()", ret);
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
return ret;
}
@@ -1199,7 +1195,7 @@ mprotect (void *addr, size_t len, int prot)
}
len = roundup2 (len, pagesize);
- SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "mprotect");
+ LIST_LOCK ();
/* Iterate through the map, protect pages between addr and addr+len
in all maps. */
@@ -1235,7 +1231,7 @@ mprotect (void *addr, size_t len, int prot)
}
}
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "mprotect");
+ LIST_UNLOCK ();
if (!in_mapped)
{
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 96397f5b0..d72692f05 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -286,43 +286,6 @@ semaphore::is_good_object (sem_t const * sem)
return true;
}
-LPCRITICAL_SECTION
-ResourceLocks::Lock (int _resid)
-{
- return &lock;
-}
-
-void
-SetResourceLock (int _res_id, int _mode, const char *_function)
-{
- EnterCriticalSection (user_data->resourcelocks->Lock (_res_id));
-}
-
-void
-ReleaseResourceLock (int _res_id, int _mode, const char *_function)
-{
- LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id));
-}
-
-void
-ResourceLocks::Init ()
-{
- InitializeCriticalSection (&lock);
- inited = true;
- thread_printf ("lock %p inited by %p , %d", &lock, user_data, myself->pid);
-}
-
-void
-ResourceLocks::Delete ()
-{
- if (inited)
- {
- thread_printf ("Close Resource Locks %p ", &lock);
- DeleteCriticalSection (&lock);
- inited = false;
- }
-}
-
void
MTinterface::Init ()
{
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
index 029e35745..c52978f8f 100644
--- a/winsup/cygwin/thread.h
+++ b/winsup/cygwin/thread.h
@@ -35,13 +35,6 @@ enum cw_cancel_action
cw_no_cancel
};
-extern "C"
-{
-void SetResourceLock (int, int, const char *) __attribute__ ((regparm (3)));
-void ReleaseResourceLock (int, int, const char *)
- __attribute__ ((regparm (3)));
-}
-
DWORD cancelable_wait (HANDLE, DWORD, const cw_cancel_action = cw_cancel_self,
const enum cw_sig_wait = cw_sig_nosig)
__attribute__ ((regparm (3)));
@@ -92,17 +85,6 @@ private:
class per_process;
class pinfo;
-class ResourceLocks
-{
-public:
- LPCRITICAL_SECTION Lock (int);
- void Init ();
- void Delete ();
-private:
- CRITICAL_SECTION lock;
- bool inited;
-};
-
#define PTHREAD_MAGIC 0xdf0df045
#define PTHREAD_MUTEX_MAGIC PTHREAD_MAGIC+1
#define PTHREAD_KEY_MAGIC PTHREAD_MAGIC+2