diff options
-rw-r--r-- | drm-lease-manager/lease-manager.c | 33 | ||||
-rw-r--r-- | drm-lease-manager/lease-manager.h | 1 | ||||
-rw-r--r-- | drm-lease-manager/lease-server.c | 2 | ||||
-rw-r--r-- | drm-lease-manager/lease-server.h | 1 | ||||
-rw-r--r-- | drm-lease-manager/main.c | 15 |
5 files changed, 40 insertions, 12 deletions
diff --git a/drm-lease-manager/lease-manager.c b/drm-lease-manager/lease-manager.c index 5d79b8d..cfb1ab5 100644 --- a/drm-lease-manager/lease-manager.c +++ b/drm-lease-manager/lease-manager.c @@ -331,6 +331,7 @@ static struct lease *lease_create(struct lm *lm, drmModeConnectorPtr connector) lease->object_ids[lease->nobject_ids++] = connector->connector_id; lease->is_granted = false; + lease->lease_fd = -1; return lease; @@ -417,7 +418,9 @@ void lm_destroy(struct lm *lm) assert(lm); for (int i = 0; i < lm->nleases; i++) { - lm_lease_revoke(lm, (struct lease_handle *)lm->leases[i]); + struct lease_handle *lease_handle = &lm->leases[i]->base; + lm_lease_revoke(lm, lease_handle); + lm_lease_close(lease_handle); lease_free(lm->leases[i]); } @@ -448,17 +451,24 @@ int lm_lease_grant(struct lm *lm, struct lease_handle *handle) return -1; } - lease->lease_fd = + int lease_fd = drmModeCreateLease(lm->drm_fd, lease->object_ids, lease->nobject_ids, 0, &lease->lessee_id); - if (lease->lease_fd < 0) { + if (lease_fd < 0) { ERROR_LOG("drmModeCreateLease failed on lease %s: %s\n", lease->base.name, strerror(errno)); return -1; } lease->is_granted = true; - return lease->lease_fd; + + int old_lease_fd = lease->lease_fd; + lease->lease_fd = lease_fd; + + if (old_lease_fd >= 0) + close_after_lease_transition(lease, old_lease_fd); + + return lease_fd; } int lm_lease_transfer(struct lm *lm, struct lease_handle *handle) @@ -470,15 +480,12 @@ int lm_lease_transfer(struct lm *lm, struct lease_handle *handle) if (!lease->is_granted) return -1; - int old_lease_fd = dup(lease->lease_fd); - lm_lease_revoke(lm, handle); if (lm_lease_grant(lm, handle) < 0) { - close(old_lease_fd); + lm_lease_close(handle); return -1; } - close_after_lease_transition(lease, old_lease_fd); return lease->lease_fd; } @@ -494,6 +501,14 @@ void lm_lease_revoke(struct lm *lm, struct lease_handle *handle) drmModeRevokeLease(lm->drm_fd, lease->lessee_id); cancel_lease_transition_thread(lease); - close(lease->lease_fd); lease->is_granted = false; } + +void lm_lease_close(struct lease_handle *handle) +{ + assert(handle); + + struct lease *lease = (struct lease *)handle; + close(lease->lease_fd); + lease->lease_fd = -1; +} diff --git a/drm-lease-manager/lease-manager.h b/drm-lease-manager/lease-manager.h index 581e05c..55bf81e 100644 --- a/drm-lease-manager/lease-manager.h +++ b/drm-lease-manager/lease-manager.h @@ -27,4 +27,5 @@ int lm_get_lease_handles(struct lm *lm, struct lease_handle ***lease_handles); int lm_lease_grant(struct lm *lm, struct lease_handle *lease_handle); int lm_lease_transfer(struct lm *lm, struct lease_handle *lease_handle); void lm_lease_revoke(struct lm *lm, struct lease_handle *lease_handle); +void lm_lease_close(struct lease_handle *lease_handle); #endif diff --git a/drm-lease-manager/lease-server.c b/drm-lease-manager/lease-server.c index c81d363..a7e3190 100644 --- a/drm-lease-manager/lease-server.c +++ b/drm-lease-manager/lease-server.c @@ -329,7 +329,7 @@ bool ls_get_request(struct ls *ls, struct ls_req *req) request = parse_client_request(sock); if (request < 0 && (ev.events & POLLHUP)) - request = LS_REQ_RELEASE_LEASE; + request = LS_REQ_CLIENT_DISCONNECT; struct ls_client *client = sock->client; struct ls_server *server = client->serv; diff --git a/drm-lease-manager/lease-server.h b/drm-lease-manager/lease-server.h index 1aaad30..823d340 100644 --- a/drm-lease-manager/lease-server.h +++ b/drm-lease-manager/lease-server.h @@ -24,6 +24,7 @@ struct ls_client; enum ls_req_type { LS_REQ_GET_LEASE, LS_REQ_RELEASE_LEASE, + LS_REQ_CLIENT_DISCONNECT, }; struct ls_req { diff --git a/drm-lease-manager/main.c b/drm-lease-manager/main.c index 78ff0df..2927253 100644 --- a/drm-lease-manager/main.c +++ b/drm-lease-manager/main.c @@ -28,15 +28,17 @@ static void usage(const char *progname) "Options:\n" "-h, --help \tPrint this help\n" "-v, --verbose \tEnable verbose debug messages\n" - "-t, --lease-transfer \tAllow lease transfter to new clients\n", + "-t, --lease-transfer \tAllow lease transfter to new clients\n" + "-k, --keep-on-crash \tDon't close lease on client crash\n", progname); } -const char *opts = "vth"; +const char *opts = "vtkh"; const struct option options[] = { {"help", no_argument, NULL, 'h'}, {"verbose", no_argument, NULL, 'v'}, {"lease-transfer", no_argument, NULL, 't'}, + {"keep-on-crash", no_argument, NULL, 'k'}, {NULL, 0, NULL, 0}, }; @@ -46,6 +48,7 @@ int main(int argc, char **argv) bool debug_log = false; bool can_transfer_leases = false; + bool keep_on_crash = false; int c; while ((c = getopt_long(argc, argv, opts, options, NULL)) != -1) { @@ -57,6 +60,9 @@ int main(int argc, char **argv) case 't': can_transfer_leases = true; break; + case 'k': + keep_on_crash = true; + break; case 'h': ret = EXIT_SUCCESS; /* fall through */ @@ -122,9 +128,14 @@ int main(int argc, char **argv) break; } case LS_REQ_RELEASE_LEASE: + case LS_REQ_CLIENT_DISCONNECT: ls_disconnect_client(ls, req.client); req.lease_handle->user_data = NULL; lm_lease_revoke(lm, req.lease_handle); + + if (!keep_on_crash || req.type == LS_REQ_RELEASE_LEASE) + lm_lease_close(req.lease_handle); + break; default: ERROR_LOG("Internal error: Invalid lease request\n"); |