Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6535 → Rev 6536

/contrib/sdk/sources/newlib/libc/crt/tls.c
0,0 → 1,69
#include <libsync.h>
 
static int tls_map[128/4];
static int *tls_scan_start = tls_map;
static mutex_t tls_mutex;
 
void tls_init()
{
int i;
 
mutex_init(&tls_mutex);
 
tls_map[0] = 0xE0;
 
for(i = 1; i < 128/4; i++)
tls_map[i] = -1;
};
 
int tls_free(unsigned int key)
{
int retval = -1;
 
if(key < 4096)
{
mutex_lock(&tls_mutex);
 
__asm__ volatile(
"shrl $2, %0 \n\t"
"btsl %0, (%1) \n\t"
::"r"(key),"d"(tls_map)
:"cc","memory");
tls_scan_start = &tls_map[key>>5];
mutex_unlock(&tls_mutex);
retval = 0;
}
return retval;
};
 
 
unsigned int tls_alloc()
{
unsigned int key;
 
mutex_lock(&tls_mutex);
 
__asm__ volatile(
"1: \n\t"
"bsfl (%1), %0 \n\t"
"jnz 2f \n\t"
"add $4, %1 \n\t"
"cmpl $128+_tls_map, %1 \n\t"
"jb 1b \n\t"
"xorl %0, %0 \n\t"
"notl %0 \n\t"
"jmp 3f \n\t"
"2: \n\t"
"btrl %0, (%1) \n\t"
"subl $_tls_map, %1 \n\t"
"leal (%0, %1, 8), %%eax \n\t"
"shll $2, %0 \n\t"
"3:"
:"=r"(key),"=d"(tls_scan_start)
:"d"(tls_scan_start)
:"cc","memory");
 
mutex_unlock(&tls_mutex);
 
return key;
}