Changes in uspace/srv/hid/compositor/compositor.c [8e4a408:071fefec] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/compositor/compositor.c
r8e4a408 r071fefec 55 55 #include <async.h> 56 56 #include <loc.h> 57 #include <devman.h> 57 58 58 59 #include <event.h> 60 #include <graph_iface.h> 59 61 #include <io/keycode.h> 60 62 #include <io/mode.h> … … 1147 1149 } 1148 1150 1149 static async_sess_t *vsl_connect( service_id_t sid,const char *svc)1151 static async_sess_t *vsl_connect(const char *svc) 1150 1152 { 1151 1153 int rc; 1152 1154 async_sess_t *sess; 1153 1154 sess = loc_service_connect(EXCHANGE_SERIALIZE, sid, 0); 1155 if (sess == NULL) { 1156 printf("%s: Unable to connect to visualizer %s\n", NAME, svc); 1155 service_id_t dsid; 1156 devman_handle_t handle; 1157 1158 rc = loc_service_get_id(svc, &dsid, 0); 1159 if (rc != EOK) { 1157 1160 return NULL; 1158 1161 } 1159 1162 1163 rc = devman_fun_sid_to_handle(dsid, &handle); 1164 if (rc == EOK) { 1165 sess = devman_device_connect(EXCHANGE_SERIALIZE, handle, 0); 1166 if (sess == NULL) { 1167 printf("%s: Unable to connect to visualizer %s\n", NAME, svc); 1168 return NULL; 1169 } 1170 rc = graph_dev_connect(sess); 1171 if (rc != EOK) { 1172 return NULL; 1173 } 1174 } else if (rc == ENOENT) { 1175 sess = loc_service_connect(EXCHANGE_SERIALIZE, dsid, 0); 1176 if (sess == NULL) { 1177 printf("%s: Unable to connect to visualizer %s\n", NAME, svc); 1178 return NULL; 1179 } 1180 } else { 1181 return NULL; 1182 } 1183 1160 1184 async_exch_t *exch = async_exchange_begin(sess); 1161 rc = async_connect_to_me(exch, sid, 0, 0, vsl_notifications, NULL);1185 rc = async_connect_to_me(exch, dsid, 0, 0, vsl_notifications, NULL); 1162 1186 async_exchange_end(exch); 1163 1187 … … 1172 1196 } 1173 1197 1174 static viewport_t *viewport_create( service_id_t sid)1198 static viewport_t *viewport_create(const char *vsl_name) 1175 1199 { 1176 1200 int rc; 1177 char *vsl_name = NULL; 1178 viewport_t *vp = NULL; 1179 bool claimed = false; 1180 1181 rc = loc_service_get_name(sid, &vsl_name); 1182 if (rc != EOK) 1183 goto error; 1184 1185 vp = (viewport_t *) calloc(1, sizeof(viewport_t)); 1186 if (!vp) 1187 goto error; 1201 1202 viewport_t *vp = (viewport_t *) malloc(sizeof(viewport_t)); 1203 if (!vp) { 1204 return NULL; 1205 } 1188 1206 1189 1207 link_initialize(&vp->link); … … 1192 1210 1193 1211 /* Establish output bidirectional connection. */ 1194 vp->dsid = sid; 1195 vp->sess = vsl_connect(sid, vsl_name); 1196 if (vp->sess == NULL) 1197 goto error; 1212 vp->sess = vsl_connect(vsl_name); 1213 rc = loc_service_get_id(vsl_name, &vp->dsid, 0); 1214 if (vp->sess == NULL || rc != EOK) { 1215 free(vp); 1216 return NULL; 1217 } 1198 1218 1199 1219 /* Claim the given visualizer. */ 1200 1220 rc = visualizer_claim(vp->sess, 0); 1201 1221 if (rc != EOK) { 1222 async_hangup(vp->sess); 1223 free(vp); 1202 1224 printf("%s: Unable to claim visualizer (%s)\n", NAME, str_error(rc)); 1203 goto error; 1204 } 1205 1206 claimed = true; 1225 return NULL; 1226 } 1207 1227 1208 1228 /* Retrieve the default mode. */ 1209 1229 rc = visualizer_get_default_mode(vp->sess, &vp->mode); 1210 1230 if (rc != EOK) { 1231 visualizer_yield(vp->sess); 1232 async_hangup(vp->sess); 1233 free(vp); 1211 1234 printf("%s: Unable to retrieve mode (%s)\n", NAME, str_error(rc)); 1212 goto error;1235 return NULL; 1213 1236 } 1214 1237 … … 1217 1240 NULL, SURFACE_FLAG_SHARED); 1218 1241 if (vp->surface == NULL) { 1242 visualizer_yield(vp->sess); 1243 async_hangup(vp->sess); 1244 free(vp); 1219 1245 printf("%s: Unable to create surface (%s)\n", NAME, str_error(rc)); 1220 goto error;1246 return NULL; 1221 1247 } 1222 1248 … … 1225 1251 vp->mode.index, vp->mode.version, surface_direct_access(vp->surface)); 1226 1252 if (rc != EOK) { 1253 visualizer_yield(vp->sess); 1254 surface_destroy(vp->surface); 1255 async_hangup(vp->sess); 1256 free(vp); 1227 1257 printf("%s: Unable to set mode (%s)\n", NAME, str_error(rc)); 1228 goto error;1258 return NULL; 1229 1259 } 1230 1260 1231 1261 return vp; 1232 error:1233 if (claimed)1234 visualizer_yield(vp->sess);1235 if (vp->sess != NULL)1236 async_hangup(vp->sess);1237 free(vp);1238 free(vsl_name);1239 return NULL;1240 1262 } 1241 1263 … … 2168 2190 continue; 2169 2191 2170 viewport_t *vp = viewport_create(svcs[i]); 2171 if (vp != NULL) 2172 list_append(&vp->link, &viewport_list); 2192 char *svc_name; 2193 rc = loc_service_get_name(svcs[i], &svc_name); 2194 if (rc == EOK) { 2195 viewport_t *vp = viewport_create(svc_name); 2196 if (vp != NULL) { 2197 list_append(&vp->link, &viewport_list); 2198 } 2199 } 2173 2200 } 2174 2201 fibril_mutex_unlock(&viewport_list_mtx);
Note:
See TracChangeset
for help on using the changeset viewer.