From owner-acpi-jp@jp.freebsd.org  Wed Jan  5 07:47:08 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id HAA93345;
	Wed, 5 Jan 2000 07:47:08 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id HAA93340
	for <acpi-jp@jp.freebsd.org>; Wed, 5 Jan 2000 07:47:07 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdnb18.imasy.or.jp [202.227.24.146])
	by tasogare.imasy.or.jp (8.9.3+3.2W/3.7W-tasogare/smtpfeed 1.01) with ESMTP id HAA02957
	for <acpi-jp@jp.freebsd.org>; Wed, 5 Jan 2000 07:47:03 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Message-Id: <200001042247.HAA02957@tasogare.imasy.or.jp>
To: acpi-jp@jp.freebsd.org
X-Mailer: Mew version 1.93 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Date: Wed, 05 Jan 2000 07:47:02 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 980905(IM100)
Lines: 156
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: acpi-jp 211
Subject: [acpi-jp 211] Destroy objects (was Re: MEMMAN histogram support)
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> > Method $BFb$G(B Buffer $B$rDj5A$7$?$j$9$k$H!"$=$l$i$O%m!<%+%k$J$b$N$G!"(BMethod
> > $B$+$iH4$1$k:]$KGK4~$7$J$$$H$$$1$J$$$G$9$h$M!#(B
> 
> $BJL$NOC$G$9$,!"(Bmethod $B<B9T;~$K(B Scope $B$N30$K:n$C$?$d$D$bGK4~$G$7$?$h$M(B?
> # $B$^$5$+$H;W$&$1$I(B Scope $B$N30$N$d$D$rJQ99$7$?>l9g$b85$KLa$9(B?
> $B$3$N$"$?$j$b:#8e$N:n6H9`L\$G$9$M!#(B

$B$=$l$i$7$$$3$H$r$9$k%3!<%I$r=q$$$F$_$^$7$?!#(B
$B$3$l$G(B Scope $B$N30$N$d$D$bGK4~$G$-$^$9$,!"$h$/J,$+$C$F$J$$$N$G(B
$BC!$-Bf$N$D$b$j$G$9(B :-P
$B$40U8+;r$j$?$/!#(B

Index: env.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/env.h,v
retrieving revision 1.2
diff -u -r1.2 env.h
--- env.h	1999/12/27 07:23:53	1.2
+++ env.h	2000/01/04 21:19:19
@@ -36,5 +36,7 @@
 	 struct aml_name argumentvalue[7];
 	 struct aml_name work;
 	 union aml_object wobj;
+	 struct aml_name *created_on_exec[4096];
+	 unsigned	executing;
        };
 
Index: evalobj.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/evalobj.c,v
retrieving revision 1.5
diff -u -r1.5 evalobj.c
--- evalobj.c	2000/01/03 10:16:59	1.5
+++ evalobj.c	2000/01/04 22:24:16
@@ -208,8 +208,14 @@
 struct aml_name 
 *acpi_execute_method(struct aml_environ *env)
 {
-	struct aml_name *name;
+	struct aml_name *name, **created;
+	struct aml_environ orgenv;
 	
+	memcpy(&orgenv.created_on_exec, env->created_on_exec,
+	    sizeof env->created_on_exec);
+	bzero(env->created_on_exec, sizeof(env->created_on_exec));
+	env->executing = 1;
+
 	DPRINT("[");
 	acpi_print_curname(env->curname);
 	DPRINT(" START]\n");
@@ -219,6 +225,15 @@
 	acpi_print_curname(env->curname);
 	DPRINT(" END]\n");
 
+	created = env->created_on_exec;
+	while (*created) {
+		acpi_free_childname_one(get_rootname(), *created);
+		created++;
+	}
+
+	env->executing = 0;
+	memcpy(env->created_on_exec, &orgenv.created_on_exec,
+	    sizeof env->created_on_exec);
 	return name;
 }
 
@@ -243,6 +258,7 @@
 			env.argumentvalue[i].property = acpi_alloc_object(argv[i].type, &argv[i]);
 		}
 		retval = acpi_execute_method(&env);
+		showtree(name, 0);
 		for (i = 0; i < argc; i++) {
 			acpi_free_object(&env.argumentvalue[i].property);
 		}
Index: parse.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/parse.c,v
retrieving revision 1.14
diff -u -r1.14 parse.c
--- parse.c	2000/01/03 10:16:59	1.14
+++ parse.c	2000/01/04 22:10:51
@@ -1555,4 +1573,34 @@
     acpi_free_childname(curname);
     memman_free(aml_memman,memid_aml_name,curname);
   }
+}
+
+void
+acpi_free_childname_one(struct aml_name *aname, struct aml_name *child)
+{
+	struct aml_name *ptr, *curname, *bigbrother;
+
+	ptr = aname->child;
+
+	while (ptr != NULL) {
+		curname = ptr;
+		ptr = ptr->brother;
+		if (curname == child) {
+			/* I'm going to die, say good bye to my family... */
+			if (curname->parent->child == curname) {
+				curname->parent->child = NULL;
+			} else {
+				for (bigbrother = curname->parent->child;
+				     bigbrother->brother != curname;
+				     bigbrother = bigbrother->brother) ;
+				bigbrother->brother = curname->brother;
+			}
+			
+			acpi_free_object(&curname->property);
+			acpi_free_childname(curname);
+			memman_free(aml_memman, memid_aml_name, curname);
+			return;
+		}
+		acpi_free_childname_one(curname, child);
+	}
 }
Index: parse.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/parse.h,v
retrieving revision 1.1
diff -u -r1.1 parse.h
--- parse.h	1999/12/26 06:38:03	1.1
+++ parse.h	2000/01/04 22:12:15
@@ -30,3 +30,6 @@
 struct aml_name *acpi_parse_objectlist(struct aml_environ * env, int indent);
 struct aml_name *acpi_parse_termobj(struct aml_environ * env, int indent);
 void acpi_free_childname(struct aml_name *aname);
+void acpi_free_childname_one(struct aml_name *aname,
+			     struct aml_name *child);
+
Index: search.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/search.c,v
retrieving revision 1.1
diff -u -r1.1 search.c
--- search.c	1999/12/26 06:36:25	1.1
+++ search.c	2000/01/04 21:33:04
@@ -57,7 +57,16 @@
 struct aml_name *
 acpi_create_name(struct aml_environ * env, u_int8_t * dp)
 {
-	return acpi_nameman(env, dp, ACPI_CREATE_NAME);
+	struct aml_name *newname, **created;
+
+	newname = acpi_nameman(env, dp, ACPI_CREATE_NAME);
+
+	if (env->executing == 1) {
+		for (created = env->created_on_exec; *created; created++) ;
+		*created = newname;
+	}
+
+	return newname;
 }
 static struct aml_name *
 acpi_nameman(struct aml_environ * env, u_int8_t * dp, int flag)

