This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMU Common Lisp".
The branch, rtoy-clm-oids has been created
at 999def9f312bf1fec74d5cc37eb9bf655c7003a1 (commit)
- Log -----------------------------------------------------------------
commit 999def9f312bf1fec74d5cc37eb9bf655c7003a1
Merge: 1daac74 c18c16c
Author: Raymond Toy <toy.raymond(a)gmail.com>
Date: Wed Oct 22 19:09:38 2014 -0700
Merge branch 'clm-oids' of /Volumes/share2/src/clnet/rkreuter/cmucl into clm-oids
commit c18c16cd61de3f931c954cd735d68b95fde715b5
Author: Richard M Kreuter <kreuter(a)progn.net>
Date: Mon Oct 13 19:37:53 2014 -0400
Rename "oblist.*" to "oid.*" (since the data structure is incidental).
diff --git a/src/motif/server/GNUmakefile b/src/motif/server/GNUmakefile
index 32915de..7acc58b 100644
--- a/src/motif/server/GNUmakefile
+++ b/src/motif/server/GNUmakefile
@@ -5,7 +5,7 @@ LDFLAGS =
TARGET = motifd
OBJS = main.o server.o translations.o packet.o message.o datatrans.o \
requests.o callbacks.o widgets.o resources.o tables.o motif.o \
- text.o xmstring.o list.o events.o oblist.o
+ text.o xmstring.o list.o events.o oid.o
include Config
diff --git a/src/motif/server/datatrans.c b/src/motif/server/datatrans.c
index 197a71c..e9f960e 100644
--- a/src/motif/server/datatrans.c
+++ b/src/motif/server/datatrans.c
@@ -21,7 +21,7 @@
#include "types.h"
#include "datatrans.h"
#include "tables.h"
-#include "oblist.h"
+#include "oid.h"
void message_write_oid(message_t,void *,int);
void message_read_oid(message_t,caddr_t*,int,int);
diff --git a/src/motif/server/oblist.c b/src/motif/server/oid.c
similarity index 99%
rename from src/motif/server/oblist.c
rename to src/motif/server/oid.c
index ddd1f3e..97d1a5b 100644
--- a/src/motif/server/oblist.c
+++ b/src/motif/server/oid.c
@@ -2,7 +2,7 @@
#include <X11/Intrinsic.h>
#include "global.h"
-#include "oblist.h"
+#include "oid.h"
/* OID generation. */
static unsigned int current_oid;
diff --git a/src/motif/server/oblist.h b/src/motif/server/oid.h
similarity index 100%
rename from src/motif/server/oblist.h
rename to src/motif/server/oid.h
diff --git a/src/motif/server/requests.c b/src/motif/server/requests.c
index 2694f02..b6ddd36 100644
--- a/src/motif/server/requests.c
+++ b/src/motif/server/requests.c
@@ -21,7 +21,7 @@
#include "types.h"
#include "functions.h"
#include "tables.h"
-#include "oblist.h"
+#include "oid.h"
typedef void (*request_f)(message_t);
Boolean must_confirm = False;
diff --git a/src/motif/server/tables.c b/src/motif/server/tables.c
index 1fa5dc7..2168989 100644
--- a/src/motif/server/tables.c
+++ b/src/motif/server/tables.c
@@ -20,7 +20,7 @@
#include "global.h"
#include "datatrans.h"
#include "tables.h"
-#include "oblist.h"
+#include "oid.h"
extern WidgetClass overrideShellWidgetClass,transientShellWidgetClass,
topLevelShellWidgetClass,applicationShellWidgetClass;
diff --git a/src/motif/server/xmstring.c b/src/motif/server/xmstring.c
index 93133fe..8202826 100644
--- a/src/motif/server/xmstring.c
+++ b/src/motif/server/xmstring.c
@@ -18,7 +18,7 @@
#include "types.h"
#include "tables.h"
#include "requests.h"
-#include "oblist.h"
+#include "oid.h"
/* Functions for building XmFontLists */
commit 27a7c149e77fb549bd59c87024d01df65cf37806
Author: Richard M Kreuter <kreuter(a)progn.net>
Date: Wed Sep 17 20:15:01 2014 -0400
XEvents need to be trafficked as oids, too.
* There might only be one place where Lisp needs to indicate an XEvent
back to motifd, in XmMenuPosition, but raw pointers won't cut it.
diff --git a/src/motif/lisp/conversion.lisp b/src/motif/lisp/conversion.lisp
index 144391f..8bfbe49 100644
--- a/src/motif/lisp/conversion.lisp
+++ b/src/motif/lisp/conversion.lisp
@@ -66,10 +66,16 @@
(message-write-string message value)))
(xlib:font (message-write-xid message (xlib:font-id value) :font))
(xlib:cursor (message-write-xid message (xlib:cursor-id value) :cursor))
+ ;; Wart: events are written back to motifd through here as integers.
((unsigned-byte 24)
- (message-put-dblword message (combine-type-and-data :short value)))
+ (if (eql type :event)
+ (progn
+ (message-put-dblword message (combine-type-and-data :event 0))
+ (message-put-dblword message value))
+ (message-put-dblword message (combine-type-and-data :short value))))
((or (signed-byte 32) (unsigned-byte 32))
- (message-put-dblword message (combine-type-and-data :int 0))
+ (message-put-dblword
+ message (combine-type-and-data (if (eql type :event) :event :int) 0))
(message-put-dblword message value))
((member t nil)
(if (eq type t)
diff --git a/src/motif/server/callbacks.c b/src/motif/server/callbacks.c
index d0852c4..671acf4 100644
--- a/src/motif/server/callbacks.c
+++ b/src/motif/server/callbacks.c
@@ -51,6 +51,7 @@
#include "datatrans.h"
#include "types.h"
#include "tables.h"
+#include "oid.h"
int end_callback_loop = 0;
extern message_t prepare_reply(message_t m);
@@ -273,7 +274,7 @@ void CallbackHandler(Widget *w, int name_token, XmAnyCallbackStruct *info)
/* Now, we write the Reason structure into the message */
message_write_enum(reply,info?info->reason:0,callback_reason_tag);
- message_write_int(reply,info?info->event:0,int_tag);
+ message_write_int(reply,info?intern_object(info->event):0,int_tag);
if( class==xmArrowButtonWidgetClass || class==xmArrowButtonGadgetClass ||
class==xmPushButtonWidgetClass || class==xmPushButtonGadgetClass )
diff --git a/src/motif/server/datatrans.c b/src/motif/server/datatrans.c
index 5445aaf..197a71c 100644
--- a/src/motif/server/datatrans.c
+++ b/src/motif/server/datatrans.c
@@ -253,6 +253,11 @@ void message_write_xm_string_table(message_t m,StringTable *items,int tag)
message_write_xm_string(m,(XmString)items->data[i],xm_string_tag);
}
+void message_write_event(message_t m,XEvent *event,int tag)
+{
+ message_write_oid(m,event,tag);
+}
+
void message_write_color(message_t m,XColor *color,int tag)
{
message_put_dblword(m,combine_type_and_data(tag,color->red));
@@ -504,6 +509,12 @@ void message_read_xm_string_table(message_t m,StringTable *items,
toolkit_read_value(m,&(items->data[i]),XmRXmString);
}
+void message_read_event(message_t message,XEvent *event,int tag,int data)
+{
+ message_read_oid(message,(void*)event,tag,data);
+}
+
+
void message_read_color(message_t m,XColor *color,int tag, int red)
{
color->red = red;
diff --git a/src/motif/server/datatrans.h b/src/motif/server/datatrans.h
index 5894621..7411a17 100644
--- a/src/motif/server/datatrans.h
+++ b/src/motif/server/datatrans.h
@@ -35,7 +35,7 @@ extern void message_write_font_list();
extern void message_write_string_table();
extern void message_write_xm_string_table();
extern void message_write_int_list();
-#define message_write_event message_write_int
+extern void message_write_event();
extern void message_write_color();
/* GCC complains without the full prototype */
extern void message_write_float(message_t,float,int);
@@ -63,7 +63,7 @@ extern void message_read_font_list();
extern void message_read_string_table();
extern void message_read_xm_string_table();
extern void message_read_int_list();
-#define message_read_event message_read_int
+extern void message_read_event();
extern void message_read_color();
extern void message_read_float();
diff --git a/src/motif/server/events.c b/src/motif/server/events.c
index ea5307a..4e2c459 100644
--- a/src/motif/server/events.c
+++ b/src/motif/server/events.c
@@ -23,8 +23,7 @@ extern int end_callback_loop;
void write_any_event(message_t reply,XEvent *event)
{
- message_put_dblword(reply,combine_type_and_data(event_tag,0));
- message_put_dblword(reply,(unsigned long)event);
+ message_write_event(reply,event,event_tag);
message_put_dblword(reply,event->xany.type);
message_put_dblword(reply,event->xany.serial);
message_put_dblword(reply,event->xany.send_event);
commit 93d7f94f9004fbb054a291211391c538a8439c6e
Author: Richard M Kreuter <kreuter(a)progn.net>
Date: Wed Sep 17 19:04:41 2014 -0400
Add an "oid" layer to motifd.
* The wire protocol between motifd and Lisp employs 32-bit handles for
various types; on 32-bit systems, the pointer address has been used,
but that's lossy on 64-bit systems. This changeset introduces a
32-bit handle called an "oid", and keeps a process-global
doubly-linked list associating oids with pointers.
diff --git a/src/motif/server/Config.Darwin b/src/motif/server/Config.Darwin
index e24be15..dcc463c 100644
--- a/src/motif/server/Config.Darwin
+++ b/src/motif/server/Config.Darwin
@@ -1,6 +1,6 @@
CFLAGS = -g -O2 -I/opt/local/include -I/sw/include -I/usr/local/include -I/usr/X11R6/include -I. -I$(VPATH)
LDFLAGS = -L/opt/local/lib -L/usr/X11R6/lib -L/sw/lib -L/usr/local/lib
-LIBS = -lXm -lXt -lXext -lX11 -lSM -lICE
+LIBS = -lXft -lXm -lXt -lXext -lX11 -lSM -lICE
#LIBS = -lXm -lXt -lXext -lX11 -lSM -lICE -llanginfo
# This def assumes you are building in the same or parallel
# tree to the CVS souce layout. Sites may need to customize
diff --git a/src/motif/server/GNUmakefile b/src/motif/server/GNUmakefile
index 62eccb1..32915de 100644
--- a/src/motif/server/GNUmakefile
+++ b/src/motif/server/GNUmakefile
@@ -5,7 +5,7 @@ LDFLAGS =
TARGET = motifd
OBJS = main.o server.o translations.o packet.o message.o datatrans.o \
requests.o callbacks.o widgets.o resources.o tables.o motif.o \
- text.o xmstring.o list.o events.o
+ text.o xmstring.o list.o events.o oblist.o
include Config
diff --git a/src/motif/server/datatrans.c b/src/motif/server/datatrans.c
index e36711a..5445aaf 100644
--- a/src/motif/server/datatrans.c
+++ b/src/motif/server/datatrans.c
@@ -21,6 +21,10 @@
#include "types.h"
#include "datatrans.h"
#include "tables.h"
+#include "oblist.h"
+
+void message_write_oid(message_t,void *,int);
+void message_read_oid(message_t,caddr_t*,int,int);
void packet_write_string(packet_t packet,String string,int count)
{
@@ -93,8 +97,7 @@ void message_write_function(message_t message, int value,int type_tag)
void message_write_widget(message_t message,Widget widget,int type_tag)
{
- message_put_dblword(message,combine_type_and_data(type_tag,0));
- message_put_dblword(message,(long)widget);
+ message_write_oid(message,widget,type_tag);
}
void message_write_widget_class(message_t message,WidgetClass class,int tag)
@@ -117,10 +120,16 @@ void message_write_xid(message_t message,XID value,int tag)
message_put_dblword(message,value);
}
-void message_write_atom(message_t message,Atom value,int tag)
+void message_write_oid(message_t message,void *value,int tag)
{
+ int oid = intern_object(value);
message_put_dblword(message,combine_type_and_data(tag,0));
- message_put_dblword(message,value);
+ message_put_dblword(message,oid);
+}
+
+void message_write_atom(message_t message,Atom value,int tag)
+{
+ message_write_oid(message,(void*)value,tag);
}
void message_write_enum(message_t message,int enumval,int tag)
@@ -208,26 +217,22 @@ void message_write_resource_names(message_t message,ResourceList *list,int tag)
void message_write_xm_string(message_t message,XmString xs,int tag)
{
- message_put_dblword(message,combine_type_and_data(tag,0));
- message_put_dblword(message,(long)xs);
+ message_write_oid(message,xs,tag);
}
void message_write_translation_table(message_t m,XtTranslations t,int tag)
{
- message_put_dblword(m,combine_type_and_data(tag,0));
- message_put_dblword(m,(unsigned long)t);
+ message_write_oid(m,t,tag);
}
void message_write_accelerator_table(message_t m,XtAccelerators a,int tag)
{
- message_put_dblword(m,combine_type_and_data(tag,0));
- message_put_dblword(m,(unsigned long)a);
+ message_write_oid(m,a,tag);
}
void message_write_font_list(message_t m,XmFontList flist,int tag)
{
- message_put_dblword(m,combine_type_and_data(tag,0));
- message_put_dblword(m,(unsigned long)flist);
+ message_write_oid(m,flist,tag);
}
void message_write_string_table(message_t m,StringTable *items,int tag)
@@ -265,7 +270,7 @@ void message_write_float(message_t m,float f,int tag)
void message_read_widget(message_t message,Widget *w,int tag,int data)
{
- *w = (Widget)message_get_dblword(message);
+ message_read_oid(message,(void*)w,tag,data);
}
void message_read_widget_class(message_t message,WidgetClass *c,
@@ -340,7 +345,7 @@ void message_read_xm_string(message_t message,XmString *xs,int tag,int data)
register_garbage(xmstring,GarbageXmString);
}
else
- *xs = (XmString)message_get_dblword(message);
+ message_read_oid(message,(void*)xs,tag,data);
}
/* used to be int *val here, but many places pass address of Boolean into
@@ -371,9 +376,15 @@ void message_read_xid(message_t message,XID *id,int tag,int data)
*id = message_get_dblword(message);
}
+void message_read_oid(message_t message,caddr_t *obj,int tag,int data)
+{
+ int oid = message_get_dblword(message);
+ *obj = find_object(oid);
+}
+
void message_read_atom(message_t message,Atom *a,int tag,int data)
{
- *a = message_get_dblword(message);
+ message_read_oid(message,(void*)a,tag,data);
}
void message_read_enum(message_t message,int *enumval,int tag,int data)
@@ -456,18 +467,18 @@ void message_read_int_list(message_t message,IntList *list,int tag,int length)
void message_read_translation_table(message_t m,XtTranslations *t,
int tag,int data)
{
- *t = (XtTranslations)message_get_dblword(m);
+ message_read_oid(m,(void*)t,tag,data);
}
void message_read_accelerator_table(message_t m,XtAccelerators *a,
int tag,int data)
{
- *a = (XtAccelerators)message_get_dblword(m);
+ message_read_oid(m,(void*)a,tag,data);
}
void message_read_font_list(message_t m,XmFontList *flist,int tag,int data)
{
- *flist = (XmFontList)message_get_dblword(m);
+ message_read_oid(m,(void*)flist,tag,data);
}
void message_read_string_table(message_t m,StringTable *items,int tag,int len)
diff --git a/src/motif/server/oblist.c b/src/motif/server/oblist.c
new file mode 100644
index 0000000..ddd1f3e
--- /dev/null
+++ b/src/motif/server/oblist.c
@@ -0,0 +1,117 @@
+#include <stdio.h>
+#include <X11/Intrinsic.h>
+
+#include "global.h"
+#include "oblist.h"
+
+/* OID generation. */
+static unsigned int current_oid;
+
+static void init_oids()
+{
+ current_oid = (unsigned int)0;
+}
+
+static unsigned int next_oid()
+{
+ if (current_oid == 0xffffffff)
+ fatal_error("next_oid: ran out of oids"); /* This should be smarter.*/
+ return (++current_oid);
+}
+
+/* For expediency of implementation, the table of pointer-to-OID
+ associations will be a doubly-linked list. */
+typedef struct oblist oblist_t;
+
+struct oblist {
+ oblist_t *next;
+ oblist_t *prev;
+ void *obj;
+ int oid;
+};
+
+static oblist_t *oblist = NULL;
+
+static oblist_t *find_node_if(int(*fn)(oblist_t*,void*), void *datum)
+{
+ oblist_t *ret = NULL;
+ oblist_t *node = oblist;
+ while (node != NULL) {
+ if (fn(node, datum)==1) {
+ ret = node;
+ break;
+ }
+ node = node->next;
+ }
+ return ret;
+}
+
+static int obj_eql(oblist_t *node, void *obj) {
+ return (node->obj == obj);
+}
+
+static int id_eql(oblist_t *node, void *oidp) {
+ return (node->oid == *(int*)oidp);
+}
+
+void *find_object(unsigned int oid)
+{
+ oblist_t *node = find_node_if(&id_eql, &oid);
+ if (node != NULL)
+ return node->obj;
+ else
+ return NULL;
+}
+
+unsigned int intern_object(void *obj)
+{
+ oblist_t *node = find_node_if(&obj_eql, obj);
+
+ if (node != NULL)
+ return node->oid;
+
+ if (oblist == NULL)
+ init_oids();
+
+ if ((node = (void*)XtCalloc(1, sizeof(oblist_t))) == NULL)
+ fatal_error("intern_object: out of memory");
+
+ node->next = oblist;
+ node->prev = NULL;
+ if (node->next) node->next->prev = node;
+ node->obj = obj;
+ node->oid = next_oid();
+ oblist = node;
+ return node->oid;
+}
+
+static int unintern_if(int(*fn)(oblist_t*,void*), void *datum)
+{
+ oblist_t *node;
+
+ node = find_node_if(fn,datum);
+ if (node == NULL)
+ return 0;
+
+ if (node == oblist) oblist = node->next;
+ if (node->prev) (node->prev)->next = node->next;
+ if (node->next) (node->next)->prev = node->prev;
+
+ XtFree((char*)node);
+ return 1;
+}
+
+
+void unintern_object(void * obj)
+{
+ if (unintern_if(&obj_eql, obj)==0) {
+ if( global_will_trace ) {
+ printf("unintern_object: couldn't unintern %p\n",obj);
+ fflush(stdout);}
+ }
+}
+
+void maybe_unintern_object(void * obj)
+{
+ unintern_if(&obj_eql, obj);
+}
diff --git a/src/motif/server/oblist.h b/src/motif/server/oblist.h
new file mode 100644
index 0000000..7c6b16e
--- /dev/null
+++ b/src/motif/server/oblist.h
@@ -0,0 +1,6 @@
+extern unsigned int intern_object(void *);
+extern void *find_object(unsigned int);
+extern void unintern_object(void *);
+extern void unintern_object(void *);
+extern void maybe_unintern_object(void *);
+
diff --git a/src/motif/server/requests.c b/src/motif/server/requests.c
index f8aa1fa..2694f02 100644
--- a/src/motif/server/requests.c
+++ b/src/motif/server/requests.c
@@ -21,6 +21,7 @@
#include "types.h"
#include "functions.h"
#include "tables.h"
+#include "oblist.h"
typedef void (*request_f)(message_t);
Boolean must_confirm = False;
@@ -60,11 +61,13 @@ void cleanup_garbage()
garbage_list = NULL;
while( current ) {
- if( current->kind == GarbageXmString )
+ if( current->kind == GarbageXmString ) {
+ maybe_unintern_object(current->junk);
XmStringFree( (XmString)current->junk );
- else
+ } else {
+ maybe_unintern_object(current->junk);
XtFree( current->junk );
-
+ }
doomed = current;
current = current->next;
XtFree( (char *)doomed );
diff --git a/src/motif/server/tables.c b/src/motif/server/tables.c
index 8220ef5..1fa5dc7 100644
--- a/src/motif/server/tables.c
+++ b/src/motif/server/tables.c
@@ -20,6 +20,7 @@
#include "global.h"
#include "datatrans.h"
#include "tables.h"
+#include "oblist.h"
extern WidgetClass overrideShellWidgetClass,transientShellWidgetClass,
topLevelShellWidgetClass,applicationShellWidgetClass;
@@ -190,7 +191,9 @@ void record_class_resources(WidgetClass class,class_resources *r)
r->resource_count = resource_count;
r->constraint_count = constraint_count;
+ maybe_unintern_object(resource_list);
XtFree( (char *)resource_list );
+ maybe_unintern_object(resource_list);
XtFree( (char *)constraint_list );
}
diff --git a/src/motif/server/xmstring.c b/src/motif/server/xmstring.c
index a0eb697..93133fe 100644
--- a/src/motif/server/xmstring.c
+++ b/src/motif/server/xmstring.c
@@ -18,7 +18,7 @@
#include "types.h"
#include "tables.h"
#include "requests.h"
-
+#include "oblist.h"
/* Functions for building XmFontLists */
@@ -61,6 +61,7 @@ void RXmFontListFree(message_t message)
XmFontList flist;
toolkit_read_value(message,&flist,XmRFontList);
+ unintern_object(flist);
XmFontListFree(flist);
}
@@ -189,6 +190,7 @@ void RXmStringFree(message_t message)
XmString s;
toolkit_read_value(message,&s,XmRXmString);
+ unintern_object(s);
XmStringFree(s);
}
-----------------------------------------------------------------------
hooks/post-receive
--
CMU Common Lisp