changeset 3134:181db9e5a887

avifile sync again... :(
author arpi
date Mon, 26 Nov 2001 01:17:24 +0000
parents 07f2cd9ef85e
children 168b7ed7ec55
files loader/ext.c loader/registry.c loader/registry.h loader/win32.c
diffstat 4 files changed, 138 insertions(+), 87 deletions(-) [+]
line wrap: on
line diff
--- a/loader/ext.c	Mon Nov 26 01:15:09 2001 +0000
+++ b/loader/ext.c	Mon Nov 26 01:17:24 2001 +0000
@@ -450,7 +450,7 @@
     void* answer;
     int fd=open("/dev/zero", O_RDWR);
     size=(size+0xffff)&(~0xffff);
-//    printf("VirtualAlloc(0x%08X, %d)\n", address
+    //printf("VirtualAlloc(0x%08X, %d)\n", address, size);
     if(address!=0)
     {
     //check whether we can allow to allocate this
@@ -481,14 +481,14 @@
 	    return NULL;
 	}
 	answer=mmap(address, size, PROT_READ | PROT_WRITE | PROT_EXEC,
-	    MAP_FIXED | MAP_PRIVATE, fd, 0);
+		    MAP_FIXED | MAP_PRIVATE, fd, 0);
     }
     else
-    answer=mmap(address, size, PROT_READ | PROT_WRITE | PROT_EXEC,
-	 MAP_PRIVATE, fd, 0);
+	answer=mmap(address, size, PROT_READ | PROT_WRITE | PROT_EXEC,
+		    MAP_PRIVATE, fd, 0);
 //    answer=FILE_dommap(-1, address, 0, size, 0, 0,
 //	PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE);
-     close(fd);
+    close(fd);
     if(answer==(void*)-1)
     {
 	printf("Error no %d\n", errno);
@@ -509,13 +509,13 @@
 	    vm->next=new_vm;
     	vm=new_vm;
 	vm->next=0;
-//	if(va_size!=0)
-//	    printf("Multiple VirtualAlloc!\n");
-//	printf("answer=0x%08x\n", answer);
+	//if(va_size!=0)
+	//    printf("Multiple VirtualAlloc!\n");
+	//printf("answer=0x%08x\n", answer);
         return answer;
     }
 }
-WIN_BOOL WINAPI VirtualFree(LPVOID  address, DWORD t1, DWORD t2)//not sure
+WIN_BOOL WINAPI VirtualFree(LPVOID  address, SIZE_T dwSize, DWORD dwFreeType)//not sure
 {
     virt_alloc* str=vm;
     int answer;
@@ -526,10 +526,11 @@
 	    str=str->prev;
 	    continue;
 	}
+	//printf("VirtualFree(0x%08X, %d - %d)\n", str->address, dwSize, str->mapping_size);
 	answer=munmap(str->address, str->mapping_size);
 	if(str->next)str->next->prev=str->prev;
 	if(str->prev)str->prev->next=str->next;
-	if(vm==str)vm=0;
+	if(vm==str)vm=str->prev;
 	free(str);
 	return 0;
     }
--- a/loader/registry.c	Mon Nov 26 01:15:09 2001 +0000
+++ b/loader/registry.c	Mon Nov 26 01:17:24 2001 +0000
@@ -18,6 +18,20 @@
 //#undef TRACE
 //#define TRACE printf
 
+// ...can be set before init_registry() call
+char* regpathname = 0;
+
+
+static char* localregpathname = 0;
+
+typedef struct reg_handle_s
+{
+	int handle;
+	char* name;
+	struct reg_handle_s* next;
+	struct reg_handle_s* prev;
+} reg_handle_t;
+
 struct reg_value
 {
 	int type;
@@ -26,22 +40,9 @@
 	char* value;
 };
 
-// ...can be set before init_registry() call
-char* regpathname = 0;
-
-static int reg_size=0;
-static struct reg_value* regs = 0;
-
-struct reg_handle_s;
-typedef struct reg_handle_s
-{
-	int handle;
-	char* name;
-	struct reg_handle_s* next;
-	struct reg_handle_s* prev;
-} reg_handle_t;
-
-static reg_handle_t* head=0;
+static struct reg_value* regs = NULL;
+static int reg_size;
+static reg_handle_t* head = NULL;
 
 #define DIR -25
 
@@ -51,8 +52,6 @@
 static void init_registry(void);
 
 
-
-
 static void create_registry(void){
     if(regs)
     {
@@ -69,8 +68,10 @@
     regs[0].value=regs[1].value=NULL;
     regs[0].len=regs[1].len=0;
     reg_size=2;
+    head = 0;
     save_registry();
 }
+
 static void open_registry(void)
 {
 	int fd;
@@ -81,7 +82,7 @@
 		printf("Multiple open_registry(>\n");
 		return;
 	}
-	fd = open(regpathname, O_RDONLY);
+	fd = open(localregpathname, O_RDONLY);
 	if (fd == -1)
 	{
 	    printf("Creating new registry\n");
@@ -90,6 +91,7 @@
 	}
 	read(fd, &reg_size, 4);
 	regs=(struct reg_value*)malloc(reg_size*sizeof(struct reg_value));
+	head = 0;
 	for(i=0; i<reg_size; i++)
 	{
 		read(fd,&regs[i].type,4);
@@ -106,7 +108,7 @@
 		regs[i].value=(char*)malloc(regs[i].len+1);
 		if(regs[i].value==0)
 		{
-			free(regs[i].name);
+		        free(regs[i].name);
 			reg_size=i+1;
 			goto error;
 		}
@@ -123,11 +125,11 @@
 	int fd, i;
 	if (!regs)
 		init_registry();
-	fd = open(regpathname, O_WRONLY | O_CREAT, 00666);
+	fd = open(localregpathname, O_WRONLY | O_CREAT, 00666);
 	if (fd == -1)
 	{
 	    printf("Failed to open registry file '%s' for writing.\n",
-		   regpathname);
+		   localregpathname);
 	    return;
 	}
 	write(fd, &reg_size, 4);
@@ -142,6 +144,38 @@
 	}
 	close(fd);
 }
+
+void free_registry(void)
+{
+    reg_handle_t* t = head;
+    while (t)
+    {
+	reg_handle_t* f = t;
+        if (t->name)
+	    free(t->name);
+	t=t->prev;
+        free(f);
+    }
+    head = 0;
+    if (regs)
+    {
+        int i;
+	for(i=0; i<reg_size; i++)
+	{
+	    free(regs[i].name);
+	    free(regs[i].value);
+	}
+	free(regs);
+	regs = 0;
+    }
+    if (localregpathname)
+    {
+	free(localregpathname);
+	localregpathname = 0;
+    }
+}
+
+
 static reg_handle_t* find_handle_by_name(const char* name)
 {
 	reg_handle_t* t;
@@ -237,14 +271,15 @@
 		if(regs==0)
 		    create_registry();
 		regs=(struct reg_value*)realloc(regs, sizeof(struct reg_value)*(reg_size+1));
+		//regs=(struct reg_value*)my_realloc(regs, sizeof(struct reg_value)*(reg_size+1));
 		v=regs+reg_size;
 		reg_size++;
 	}
 	else
 	//replacing old one
 	{
-		free(v->value);
-		free(v->name);
+	    free(v->value);
+	    free(v->name);
 	}
 	v->type=type;
 	v->len=len;
@@ -252,26 +287,35 @@
 	memcpy(v->value, value, len);
 	v->name=(char*)malloc(strlen(fullname)+1);
 	strcpy(v->name, fullname);
+        free(fullname);
 	save_registry();
 	return v;
 }
 
 static void init_registry(void)
 {
-	struct passwd* pwent;
 	TRACE("Initializing registry\n");
-	pwent = getpwuid(geteuid());
 	// can't be free-ed - it's static and probably thread
 	// unsafe structure which is stored in glibc
 
-#if 1
+#ifdef USE_WIN32DLL
+	// MPlayer:
 	regpathname = get_path("registry");
 #else
-	if (regpathname == 0)
+	// avifile:
+	if (localregpathname == 0)
 	{
-	    regpathname = (char*)malloc(strlen(pwent->pw_dir)+20);
-	    strcpy(regpathname, pwent->pw_dir);
-	    strcat(regpathname, "/.registry");
+            const char* pthn = regpathname;
+	    if (!regpathname)
+	    {
+		struct passwd* pwent;
+		pwent = getpwuid(geteuid());
+                pthn = pwent->pw_dir;
+	    }
+
+	    localregpathname = (char*)malloc(strlen(pthn)+20);
+	    strcpy(localregpathname, pthn);
+	    strcat(localregpathname, "/.registry");
 	}
 #endif
 
@@ -352,7 +396,6 @@
     return 1;
 }
 
-extern void trapbug(void);
 long RegQueryValueExA(long key, const char* value, int* reserved, int* type, int* data, int* count)
 {
 	struct reg_value* t;
@@ -367,17 +410,14 @@
 	    printf("Query for AudioReserved001  %p  %p  count: %d\n", type, data, *count);
 	    *(int*)type = REG_DWORD;
 	    *(int*)data = 256;
-	    //trapbug();
 	    return 0;
 	}
 	if(c==NULL)
-		return 1;
-	if((t=find_value_by_name(c))==0)
-	{
-		free(c);
+	    	return 1;
+        t=find_value_by_name(c);
+	free(c);
+	if(t==0)
 		return 2;
-	}
-	free(c);
 	if(type)
 		*type=t->type;
 	if(data)
--- a/loader/registry.h	Mon Nov 26 01:15:09 2001 +0000
+++ b/loader/registry.h	Mon Nov 26 01:17:24 2001 +0000
@@ -12,6 +12,8 @@
 extern "C" {
 #endif
 
+void free_registry(void);
+
 long RegOpenKeyExA(long key, const char* subkey, long reserved,
 		   long access, int* newkey);
 long RegCloseKey(long key);
--- a/loader/win32.c	Mon Nov 26 01:15:09 2001 +0000
+++ b/loader/win32.c	Mon Nov 26 01:17:24 2001 +0000
@@ -170,7 +170,7 @@
 	va_list va;
         va_start(va, fmt);
 	f=fopen("./log", "a");
-        vprintf(fmt, va);
+	vprintf(fmt, va);
     	if(f)
 	{
 	    vfprintf(f, fmt, va);
@@ -192,8 +192,21 @@
 
 void destroy_event(void* event);
 
+struct th_list_t;
+typedef struct th_list_t{
+    int id;
+    void* thread;
+    struct th_list_t* next;
+    struct th_list_t* prev;
+} th_list;
+
+
+// have to be cleared by GARBAGE COLLECTOR
 static unsigned char* heap=NULL;
 static int heap_counter=0;
+static tls_t* g_tls=NULL;
+static th_list* list=NULL;
+
 static void test_heap(void)
 {
     int offset=0;
@@ -294,6 +307,15 @@
 #define AREATYPE_EVENT 1
 #define AREATYPE_MUTEX 2
 #define AREATYPE_COND 3
+#define AREATYPE_CRITSECT 4
+
+/* -- critical sections -- */
+struct CRITSECT
+{
+    pthread_t id;
+    pthread_mutex_t mutex;
+    int locked;
+};
 
 void* mreq_private(int size, int to_zero, int type);
 void* mreq_private(int size, int to_zero, int type)
@@ -341,6 +363,7 @@
 #ifdef GARBAGE
     alloc_header* prevmem;
     alloc_header* nextmem;
+
     if (memory == 0)
 	return 0;
 
@@ -363,6 +386,11 @@
     case AREATYPE_MUTEX:
 	pthread_mutex_destroy((pthread_mutex_t*)memory);
 	break;
+    case AREATYPE_CRITSECT:
+	pthread_mutex_destroy(&((struct CRITSECT*)memory)->mutex);
+	break;
+    default:
+	//memset(memory, 0xcc, header->size);
     }
 
     prevmem = header->prev;
@@ -382,7 +410,7 @@
 	pthread_mutex_unlock(&memmut);
     else
 	pthread_mutex_destroy(&memmut);
-
+    
     //if (alccnt < 40000) printf("MY_RELEASE: %p\t%ld    (%d)\n", header, header->size, alccnt);
 #else
     if (memory == 0)
@@ -532,17 +560,6 @@
 	return result;
 }
 
-struct th_list_t;
-typedef struct th_list_t{
-int id;
-void* thread;
-struct th_list_t* next;
-struct th_list_t* prev;
-}th_list;
-
-static th_list* list=NULL;
-
-
 
 void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize, void* lpStartAddress,
 	void* lpParameter, long dwFlags, long* dwThreadId)
@@ -1056,9 +1073,11 @@
 /**
  Morgan's m3jpeg32.dll v. 2.0 encoder expects that request for
  HeapAlloc returns area larger than size argument :-/
+ - do we really have to vaste that much memory - I would
+ suggest to make extra check for this value - FIXME
 **/
-    z=my_mreq(((size+4095)/4096)*4096, flags&8);
-//    z=HeapAlloc(heap,flags,size);
+    //z=my_mreq(size, flags&8);
+    z=my_mreq((size + 0xfff) & 0x7ffff000, flags&8);
     if(z==0)
 	printf("HeapAlloc failure\n");
     dbgprintf("HeapAlloc(heap 0x%x, flags 0x%x, size 0x%x) => 0x%x\n", heap, flags, size, z);
@@ -1075,7 +1094,7 @@
 long WINAPI expHeapFree(int arg1, int arg2, void* ptr)
 {
     dbgprintf("HeapFree(0x%x, 0x%x, pointer 0x%x) => 1\n", arg1, arg2, ptr);
-    if (heapfreehack != ptr)
+    if (heapfreehack != ptr && ptr != (void*)0xffffffff)
 	my_release(ptr);
     else
     {
@@ -1120,14 +1139,6 @@
     return result;
 }
 
-/* -- critical sections -- */
-struct CRITSECT
-{
-    pthread_t id;
-    pthread_mutex_t mutex;
-    int locked;
-};
-
 /* we're building a table of critical sections. cs_win pointer uses the DLL
    cs_unix is the real structure, we're using cs_win only to identifying cs_unix */
 struct critsecs_list_t
@@ -1214,11 +1225,10 @@
 }
 #else
 {
-    struct CRITSECT cs;
-    pthread_mutex_init(&cs.mutex, NULL);
-    cs.locked=0;
-    *(void**)c=malloc(sizeof cs);
-    memcpy(*(void**)c, &cs, sizeof cs);
+    struct CRITSECT* cs = mreq_private(sizeof(struct CRITSECT), 0, AREATYPE_CRITSECT);
+    pthread_mutex_init(&cs->mutex, NULL);
+    cs->locked=0;
+    *(void**)c = cs;
 }
 #endif
     return;
@@ -1243,7 +1253,6 @@
 #endif
 	printf("Win32 Warning: Accessed uninitialized Critical Section (%p)!\n", c);
     }
-//    cs.id=pthread_self();
     if(cs->locked)
 	if(cs->id==pthread_self())
 	    return;
@@ -1361,7 +1370,6 @@
     struct tls_s* next;
 };
 
-tls_t* g_tls=NULL;
 void* WINAPI expTlsAlloc()
 {
     if(g_tls==NULL)
@@ -1717,11 +1725,8 @@
     return result;
 }
 
-long WINAPI expRegOpenKeyA (
-long hKey,
- LPCSTR lpSubKey,
- int* phkResult
-){
+long WINAPI expRegOpenKeyA (long hKey, LPCSTR lpSubKey, int* phkResult)
+{
     long result=RegOpenKeyExA(hKey, lpSubKey, 0, 0, phkResult);
     dbgprintf("RegOpenKeyExA(key 0x%x, subkey '%s', 0x%x) => %d\n",
 	hKey, lpSubKey, phkResult, result);
@@ -3119,14 +3124,14 @@
 LONG WINAPI explstrlenA(const char* str1)
 {
     LONG result=strlen(str1);
-    dbgprintf("strlen(0x%x='%s') => %d\n", str1, str1, result);
+    dbgprintf("strlen(0x%x='%.50s') => %d\n", str1, str1, result);
     return result;
 }
 
 LONG WINAPI explstrcpyA(char* str1, const char* str2)
 {
     int result= (int) strcpy(str1, str2);
-    dbgprintf("strcpy(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result);
+    dbgprintf("strcpy(0x%.50x, 0x%.50x='%.50s') => %d\n", str1, str2, str2, result);
     return result;
 }
 LONG WINAPI explstrcpynA(char* str1, const char* str2,int len)
@@ -3532,6 +3537,7 @@
 #ifdef GARBAGE
     int unfree = 0, unfreecnt = 0;
 
+    free_registry();
     while (last_alloc)
     {
 	alloc_header* mem = last_alloc + 1;
@@ -3541,4 +3547,6 @@
     }
     printf("Total Unfree %d bytes cnt %d [%p,%d]\n",unfree, unfreecnt, last_alloc, alccnt);
 #endif
+    g_tls = NULL;
+    list = NULL;
 }