summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/tls_pbuf.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/tls_pbuf.cc')
-rw-r--r--winsup/cygwin/tls_pbuf.cc60
1 files changed, 60 insertions, 0 deletions
diff --git a/winsup/cygwin/tls_pbuf.cc b/winsup/cygwin/tls_pbuf.cc
new file mode 100644
index 000000000..704f3bfc9
--- /dev/null
+++ b/winsup/cygwin/tls_pbuf.cc
@@ -0,0 +1,60 @@
+/* tls_pbuf.cc
+
+ Copyright 2008 Red Hat, Inc.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include <winsup.h>
+#include <malloc.h>
+#include "thread.h"
+#include "cygtls.h"
+#include "tls_pbuf.h"
+
+#define tls_pbuf _my_tls.locals.pathbufs
+
+void
+tls_pathbuf::destroy ()
+{
+ for (int i = 0; i < TP_NUM_C_BUFS; ++i)
+ if (c_buf[i])
+ free (c_buf[i]);
+ for (int i = 0; i < TP_NUM_W_BUFS; ++i)
+ if (w_buf[i])
+ free (w_buf[i]);
+}
+
+tmp_pathbuf::tmp_pathbuf ()
+: c_buf_old (tls_pbuf.c_cnt),
+ w_buf_old (tls_pbuf.w_cnt)
+{}
+
+tmp_pathbuf::~tmp_pathbuf ()
+{
+ tls_pbuf.c_cnt = c_buf_old;
+ tls_pbuf.w_cnt = w_buf_old;
+}
+
+char *
+tmp_pathbuf::c_get ()
+{
+ if (tls_pbuf.c_cnt >= TP_NUM_C_BUFS)
+ api_fatal ("Internal error: TP_NUM_C_BUFS too small.");
+ if (!tls_pbuf.c_buf[tls_pbuf.c_cnt]
+ && !(tls_pbuf.c_buf[tls_pbuf.c_cnt] = (char *) malloc (NT_MAX_PATH)))
+ api_fatal ("Internal error: Out of memory for new path buf.");
+ return tls_pbuf.c_buf[tls_pbuf.c_cnt++];
+}
+
+PWCHAR
+tmp_pathbuf::w_get ()
+{
+ if (tls_pbuf.w_cnt >= TP_NUM_W_BUFS)
+ api_fatal ("Internal error: TP_NUM_W_BUFS too small.");
+ if (!tls_pbuf.w_buf[tls_pbuf.w_cnt]
+ && !(tls_pbuf.w_buf[tls_pbuf.w_cnt]
+ = (PWCHAR) malloc (NT_MAX_PATH * sizeof (WCHAR))))
+ api_fatal ("Internal error: Out of memory for new wide path buf.");
+ return tls_pbuf.w_buf[tls_pbuf.w_cnt++];
+}